From 536720febfd132a41887226b5ec3150442a31fc8 Mon Sep 17 00:00:00 2001 From: wzgaoyn Date: Tue, 18 Mar 2025 21:22:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 62 + README.md | 19 + db/2023-08-28商品库存警告字段为空更新.sql | 2 + db/2023-09-18 退款订单新增字段.sql | 157 + ...-09-25 dubbo和spring cloud名命空间隔离.sql | 13 + db/2023-10-30 虚拟核销记录.sql | 21 + db/2023-11-13 整合leaf模块.sql | 22184 ++++++++++++++++ ...23-11-20 拼团订单搬迁到mongodb(看注释).sql | 1248 + db/2023-11-27-文件上传优化.sql | 22 + db/2023-12-04 优惠券纯redis改造.sql | 197 + db/2023-12-18 去除dubbo默认异常处理过滤器.sql | 49 + ...01-08 1.升级shardingSphere(看注释!!).sql | 3928 +++ ...024-01-08 2.库存和组合商品修改(看注释).sql | 393 + db/2024-01-08 3.库存和组合商品修改(大sql).sql | 2007 ++ db/2024-01-15 分库分表改为默认单库50表.sql | 1876 ++ db/stock-vue3更新.sql | 199 + es/2023-10-16-订单退款平台介入字段.md | 40 + es/2023-12-18-商品名称模糊搜索字段.md | 15 + pom.xml | 482 + system-test/pom.xml | 98 + .../cloud/systemtest/api/amount/AddrApi.java | 51 + .../systemtest/api/amount/GiveawayApi.java | 58 + .../cloud/systemtest/api/amount/PayApi.java | 46 + .../systemtest/api/amount/ProductApi.java | 118 + .../systemtest/api/login/MemberShipApi.java | 22 + .../systemtest/api/login/UserLoginApi.java | 18 + .../systemtest/api/marketing/ComboApi.java | 58 + .../systemtest/api/marketing/DiscountApi.java | 113 + .../systemtest/api/marketing/GiveawayApi.java | 57 + .../systemtest/api/marketing/GroupApi.java | 171 + .../systemtest/api/marketing/LiveApi.java | 100 + .../systemtest/api/order/MyOrderApi.java | 71 + .../cloud/systemtest/api/order/OrderApi.java | 97 + .../systemtest/api/order/OrderRefundApi.java | 40 + .../systemtest/api/order/SettlementApi.java | 22 + .../systemtest/api/order/ShopCartApi.java | 17 + .../systemtest/api/order/StationApi.java | 55 + .../api/platform/PlatformTransportApi.java | 25 + .../api/platform/PlatformWalletApi.java | 41 + .../api/platform/ScoreProductApi.java | 36 + .../systemtest/api/platform/UserLevelApi.java | 28 + .../api/platform/UserRightsApi.java | 27 + .../systemtest/api/store/SameCityApi.java | 22 + .../systemtest/api/store/ShopNoticeApi.java | 19 + .../systemtest/api/store/ShopWalletApi.java | 53 + .../api/supplier/SupplierOrderApi.java | 35 + .../api/supplier/SupplierProductApi.java | 89 + .../amount/OfflineHandleEventDtoData.java | 30 + .../data/amount/PreSaleSpuData.java | 118 + .../systemtest/data/marketing/CouponData.java | 69 + .../systemtest/data/marketing/LiveData.java | 79 + .../data/marketing/SeckillData.java | 56 + .../data/order/OrderAdminDtoData.java | 45 + .../systemtest/data/order/OrderDtoData.java | 174 + .../order/OrderRefundDeliveryDtoData.java | 21 + .../data/order/OrderSelfStationDtoData.java | 15 + .../data/order/ShopOrderRefundDtoData.java | 76 + .../systemtest/data/order/SpuCommDtoData.java | 20 + .../data/order/SubmitOrderDtoData.java | 85 + .../systemtest/data/order/WalletAssert.java | 133 + .../platform/DeliveryScoreOrderDtoData.java | 63 + .../data/platform/UserLevelDtoData.java | 31 + .../data/platform/UserRightsDtoData.java | 54 + .../data/store/SameCityDtoData.java | 58 + .../data/store/ShopStationDtoData.java | 28 + .../data/store/SpuPageSearchDtoData.java | 19 + .../supplier/SupplierOrderRefundDtoData.java | 57 + .../data/supplier/SupplierProductData.java | 122 + .../supplier/SupplierRefundAddrDtoData.java | 24 + .../systemtest/test/amount/FreightTest.java | 199 + .../test/amount/MemberAmountTest.java | 89 + .../systemtest/test/marketing/ComboTest.java | 97 + .../systemtest/test/marketing/CouponTest.java | 493 + .../test/marketing/DistributionProdTest.java | 137 + .../test/marketing/GiveawayTest.java | 213 + .../systemtest/test/marketing/GroupTest.java | 293 + .../systemtest/test/marketing/LiveTest.java | 56 + .../test/marketing/OrderRefund.java | 72 + .../test/order/SupplierOrderTest.java | 882 + .../test/order/TransFeeFreesOrderTest.java | 277 + .../test/order/VirtualOrderTest.java | 338 + .../test/store/ConsignmentManagementTest.java | 89 + .../systemtest/test/store/ProductTest.java | 157 + system-test/src/main/resources/Marketing.xml | 83 + .../src/main/resources/ProductTest.xml | 40 + .../src/main/resources/SupplierOrderTest.xml | 47 + tmerclub-admin/Dockerfile | 13 + tmerclub-admin/pom.xml | 101 + .../tmerclub/cloud/config/RocketMqConfig.java | 74 + .../cloud/multishop/constant/HomeStatus.java | 45 + .../multishop/constant/HotSearchType.java | 47 + .../cloud/multishop/constant/IsDefault.java | 45 + .../constant/ShopWalletAmountType.java | 73 + .../multishop/constant/ShopWalletIoType.java | 64 + .../controller/admin/IndexImgController.java | 107 + .../controller/admin/NoticeController.java | 144 + .../admin/ShopCompanyController.java | 117 + .../admin/ShopDetailController.java | 41 + .../ShopOfflineHandleEventController.java | 109 + .../admin/ShopRenovationUpDelController.java | 121 + .../admin/ShopTemplateController.java | 124 + .../admin/ShopWithdrawCashController.java | 61 + .../controller/app/IndexImgController.java | 51 + .../controller/app/NoticeController.java | 107 + .../multishop/ApplyShopUserController.java | 78 + .../multishop/ShopApplyController.java | 92 + .../multishop/ShopCompanyController.java | 155 + .../multishop/ShopUserController.java | 197 + .../platform/CompanyAuditingController.java | 68 + .../platform/ShopCompanyController.java | 84 + .../supplier/ApplyShopUserController.java | 73 + .../multishop/dto/AllinpayRechargeDTO.java | 43 + .../cloud/multishop/dto/IndexImgDTO.java | 119 + .../cloud/multishop/dto/NoticeDTO.java | 258 + .../cloud/multishop/dto/ShopAuditingDTO.java | 140 + .../cloud/multishop/dto/ShopCompanyDTO.java | 223 + .../cloud/multishop/dto/ShopDetailDTO.java | 314 + .../multishop/dto/ShopRechargeInfoDTO.java | 44 + .../multishop/dto/ShopSigningInfoDTO.java | 84 + .../cloud/multishop/dto/ShopUserDTO.java | 180 + .../multishop/dto/ShopUserRegisterDTO.java | 82 + .../cloud/multishop/dto/ShopWalletDTO.java | 152 + .../multishop/dto/UsernameAndPasswordDTO.java | 113 + .../feign/IndexImgFeignController.java | 22 + .../feign/ShopDetailFeignController.java | 143 + .../feign/ShopRefundAddrController.java | 44 + .../ShopSubstituteSalesFeignController.java | 64 + .../feign/ShopWalletLogFeignController.java | 59 + .../WalletLogOperationFeignController.java | 107 + .../listener/OpenAllinpayShopConsumer.java | 39 + .../OrderPreSaleSettlementShopConsumer.java | 37 + .../OrderReceiptShopByAllinpayConsumer.java | 47 + .../listener/RechargeNotifyConsumer.java | 43 + .../mapper/CompanyAuditingMapper.java | 73 + .../multishop/mapper/HotSearchMapper.java | 83 + .../multishop/mapper/IndexImgMapper.java | 95 + .../multishop/mapper/ShopAuditingMapper.java | 84 + .../multishop/mapper/ShopBankCardMapper.java | 91 + .../mapper/ShopCollectionMapper.java | 69 + .../multishop/mapper/ShopExtensionMapper.java | 43 + .../mapper/ShopRefundAddrMapper.java | 78 + .../multishop/mapper/ShopWalletMapper.java | 151 + .../cloud/multishop/model/HotSearch.java | 132 + .../cloud/multishop/model/ShopBankCard.java | 200 + .../cloud/multishop/model/ShopCompany.java | 278 + .../cloud/multishop/model/ShopRefundAddr.java | 244 + .../cloud/multishop/model/ShopRenovation.java | 118 + .../multishop/model/ShopSubstituteSales.java | 144 + .../cloud/multishop/model/ShopTemplate.java | 132 + .../cloud/multishop/model/ShopUser.java | 118 + .../cloud/multishop/model/ShopWalletLog.java | 214 + .../multishop/model/ShopWithdrawCash.java | 255 + .../multishop/service/IndexImgService.java | 84 + .../multishop/service/ShopApplyService.java | 23 + .../service/ShopAuditingService.java | 83 + .../service/ShopRechargeService.java | 41 + .../service/ShopRenovationService.java | 81 + .../service/ShopTemplateService.java | 63 + .../service/ShopWalletLogService.java | 162 + .../service/impl/IndexImgServiceImpl.java | 109 + .../service/impl/NoticeServiceImpl.java | 161 + .../service/impl/ShopAllinpayServiceImpl.java | 63 + .../service/impl/ShopApplyServiceImpl.java | 85 + .../service/impl/ShopDetailServiceImpl.java | 1188 + .../impl/ShopExtensionServiceImpl.java | 41 + .../impl/ShopRenovationServiceImpl.java | 129 + .../impl/ShopSubstituteSalesServiceImpl.java | 89 + .../service/impl/ShopTemplateServiceImpl.java | 66 + .../impl/ShopUserAccountServiceImpl.java | 95 + .../impl/UserCollectionShopServiceImpl.java | 143 + .../cloud/multishop/vo/IndexImgVO.java | 131 + .../tmerclub/cloud/multishop/vo/NoticeVO.java | 248 + .../multishop/vo/ShopAuditingInfoVO.java | 189 + .../cloud/multishop/vo/ShopAuditingVO.java | 119 + .../multishop/vo/ShopCompanyAuditingVO.java | 181 + .../cloud/multishop/vo/ShopCompanyVO.java | 262 + .../cloud/multishop/vo/ShopExtensionVO.java | 81 + .../cloud/multishop/vo/ShopTemplateVO.java | 118 + .../cloud/multishop/vo/ShopUserSimpleVO.java | 120 + .../cloud/multishop/vo/ShopUserVO.java | 192 + .../cloud/multishop/vo/ShopWalletVO.java | 149 + .../multishop/vo/ShopWithdrawCashVO.java | 274 + .../controller/PublicBankController.java | 61 + .../controller/SysConfigController.java | 74 + .../controller/SysUserAccountController.java | 108 + .../controller/WebConfigController.java | 55 + .../OfflineHandleEventController.java | 50 + .../DistributionConfigController.java | 105 + .../platform/GrowthConfigController.java | 66 + .../platform/SysAccessKeyController.java | 99 + .../platform/SysConfigController.java | 45 + .../cloud/platform/dto/ChangeAccountDTO.java | 106 + .../cloud/platform/dto/GrowthConfigDTO.java | 65 + .../dto/OfflineHandleEventItemDTO.java | 103 + .../cloud/platform/dto/ScoreConfigDTO.java | 182 + .../platform/dto/ScoreExpireConfigDTO.java | 56 + .../cloud/platform/dto/SysAccessKeyDTO.java | 146 + .../cloud/platform/dto/SysUserDTO.java | 117 + .../platform/feign/ConfigFeignController.java | 52 + .../OfflineHandleEventFeignController.java | 87 + .../feign/SysAccessKeyFeignController.java | 34 + .../mapper/OfflineHandleEventMapper.java | 107 + .../cloud/platform/mapper/SysUserMapper.java | 95 + .../platform/mapper/WebConfigMapper.java | 78 + .../model/OfflineHandleEventItem.java | 117 + .../cloud/platform/model/SysAccessMenu.java | 64 + .../model/SysAccessMenuPermission.java | 65 + .../cloud/platform/model/WebConfig.java | 381 + .../service/OfflineHandleEventService.java | 106 + .../platform/service/SysConfigService.java | 76 + .../service/SysUserAccountService.java | 43 + .../platform/service/SysUserService.java | 77 + .../OfflineHandleEventItemServiceImpl.java | 65 + .../service/impl/SysAccessKeyServiceImpl.java | 166 + .../service/impl/SysConfigServiceImpl.java | 281 + .../service/impl/SysUserServiceImpl.java | 155 + .../service/impl/WebConfigServiceImpl.java | 88 + .../platform/vo/DistributionConfigVO.java | 229 + .../vo/DistributionRecruitConfigVO.java | 81 + .../platform/vo/ScoreExpireConfigVO.java | 56 + .../cloud/platform/vo/SysConfigVO.java | 79 + .../cloud/platform/vo/SysUserSimpleVO.java | 95 + .../cloud/platform/vo/WebConfigVO.java | 346 + .../supplier/constant/HotSearchType.java | 47 + .../cloud/supplier/constant/IsDefault.java | 45 + .../constant/SupplierWalletChangeReason.java | 104 + .../constant/SupplierWalletIoType.java | 64 + .../admin/SupplierCompanyController.java | 117 + .../ShopPurchaseAmountLogController.java | 71 + .../multishop/SupplierDetailController.java | 49 + .../platform/CompanyAuditingController.java | 75 + .../platform/SupplierBankCardController.java | 88 + .../platform/SupplierCompanyController.java | 84 + .../platform/SupplierDetailController.java | 191 + .../supplier/CompanyAuditingController.java | 69 + .../supplier/SupplierApplyController.java | 87 + .../supplier/SupplierBankCardController.java | 155 + .../supplier/SupplierDetailController.java | 167 + .../SupplierPurchaseAmountLogController.java | 71 + .../SupplierRefundAddrController.java | 106 + .../supplier/SupplierUserController.java | 185 + .../SupplierWithdrawCashController.java | 89 + .../dto/AllinpaySupplierWithdrawCashDTO.java | 77 + .../supplier/dto/AuditingSupplierInfoDTO.java | 132 + .../supplier/dto/SupplierBankCardDTO.java | 175 + .../supplier/dto/SupplierCreateInfoDTO.java | 116 + .../supplier/dto/SupplierExtensionDTO.java | 66 + .../cloud/supplier/dto/SupplierUserDTO.java | 182 + .../cloud/supplier/dto/SupplierWalletDTO.java | 115 + .../supplier/dto/SupplierWalletLogDTO.java | 211 + .../feign/SupplierDetailFeignController.java | 126 + .../SupplierRefundAddrFeignController.java | 44 + .../feign/SupplierUserFeignController.java | 42 + .../feign/SupplierWalletFeignController.java | 35 + ...lierWalletLogOperationFeignController.java | 60 + .../SupplierWithdrawCashFeignController.java | 32 + .../listener/OrderNotifySupplierConsumer.java | 52 + ...OrderRefundSettlementSupplierConsumer.java | 37 + .../listener/OrderRefundSupplierConsumer.java | 51 + .../mapper/SupplierCompanyMapper.java | 107 + .../supplier/mapper/SupplierDetailMapper.java | 290 + .../supplier/mapper/SupplierUserMapper.java | 87 + .../cloud/supplier/model/SupplierDetail.java | 344 + .../cloud/supplier/model/SupplierUser.java | 118 + .../cloud/supplier/model/SupplierWallet.java | 146 + .../supplier/model/SupplierWalletLog.java | 255 + .../supplier/model/SupplierWithdrawCash.java | 257 + .../mongo/MongoPurchaseAmountLogBO.java | 140 + .../service/PurchaseAmountLogService.java | 63 + .../service/SupplierApplyService.java | 23 + .../service/SupplierAuditingService.java | 83 + .../SupplierCompanyAuditingService.java | 92 + .../service/SupplierCompanyService.java | 136 + .../service/SupplierDetailService.java | 278 + .../service/SupplierRefundAddrService.java | 76 + .../service/SupplierUserAccountService.java | 43 + .../supplier/service/SupplierUserService.java | 131 + .../service/SupplierWalletLogService.java | 98 + .../service/SupplierWalletService.java | 91 + .../impl/SupplierAuditingServiceImpl.java | 79 + .../impl/SupplierDetailServiceImpl.java | 1096 + .../impl/SupplierUserAccountServiceImpl.java | 95 + .../service/impl/SupplierUserServiceImpl.java | 299 + .../impl/SupplierWalletLogServiceImpl.java | 370 + .../impl/SupplierWithdrawCashServiceImpl.java | 543 + .../vo/PurchaseAmountLogShopExcelVO.java | 137 + .../cloud/supplier/vo/SupplierAuditingVO.java | 117 + .../cloud/supplier/vo/SupplierBankCardVO.java | 142 + .../vo/SupplierCompanyAuditingVO.java | 182 + .../cloud/supplier/vo/SupplierCompanyVO.java | 264 + .../cloud/supplier/vo/SupplierDetailVO.java | 297 + .../supplier/vo/SupplierRefundAddrVO.java | 214 + .../supplier/vo/SupplierStatusInfoVO.java | 102 + .../supplier/vo/SupplierUserSimpleVO.java | 119 + .../supplier/vo/SupplierWithdrawCashVO.java | 238 + .../vo/mongo/MongoPurchaseAmountLogVO.java | 155 + .../vo/mongo/MongoSupplierWalletLogVO.java | 46 + .../src/main/resources/bootstrap.yml | 29 + .../mapper/CompanyAuditingMapper.xml | 81 + .../mapper/OfflineHandleEventMapper.xml | 112 + .../resources/mapper/PublicBankMapper.xml | 56 + .../resources/mapper/ShopAuditingMapper.xml | 94 + .../resources/mapper/ShopExtensionMapper.xml | 36 + .../mapper/ShopSubstituteSalesMapper.xml | 66 + .../mapper/ShopWithdrawCashMapper.xml | 182 + .../mapper/SupplierBankCardMapper.xml | 106 + .../mapper/SupplierCompanyAuditingMapper.xml | 97 + .../mapper/SupplierCompanyMapper.xml | 190 + .../mapper/SupplierRefundAddrMapper.xml | 109 + .../resources/mapper/SupplierUserMapper.xml | 75 + .../resources/mapper/SupplierWalletMapper.xml | 143 + .../main/resources/mapper/WebConfigMapper.xml | 136 + tmerclub-api/tmerclub-api-admin/pom.xml | 28 + .../cloud/api/multishop/bo/ShopSimpleBO.java | 102 + .../feign/ShopDetailFeignClient.java | 140 + .../feign/ShopRefundAddrFeignClient.java | 37 + .../feign/ShopSubstituteSalesFeignClient.java | 48 + .../feign/WalletLogOperationFeignClient.java | 26 + .../api/multishop/vo/AllinpayRechargeVO.java | 52 + .../api/multishop/vo/ShopBankCardVO.java | 173 + .../constant/OfflineHandleEventStatus.java | 58 + .../platform/constant/WithdrawFrequency.java | 41 + .../platform/dto/OfflineHandleEventDTO.java | 167 + .../api/platform/feign/ConfigFeignClient.java | 43 + .../platform/vo/DistributionConfigApiVO.java | 227 + .../platform/vo/DistributionConfigSpuVO.java | 126 + .../platform/vo/OfflineHandleEventItemVO.java | 105 + .../cloud/api/platform/vo/SysUserVO.java | 165 + .../api/supplier/constant/SupplierStatus.java | 86 + .../feign/SupplierUserFeignClient.java | 37 + .../feign/SupplierWalletFeignClient.java | 26 + .../SupplierWithdrawCashFeignClient.java | 31 + .../api/supplier/vo/SupplierApiDetailVO.java | 431 + .../supplier/vo/SupplierApiRefundAddrVO.java | 214 + tmerclub-api/tmerclub-api-auth/pom.xml | 23 + .../cloud/api/auth/bo/LoginInfoBO.java | 42 + .../tmerclub/cloud/api/auth/bo/UidInfoBO.java | 150 + .../cloud/api/auth/constant/SysTypeEnum.java | 64 + .../cloud/api/auth/dto/AuthAccountDTO.java | 190 + .../cloud/api/auth/dto/SysAccessKeyDTO.java | 89 + .../auth/dto/UserRegisterExtensionDTO.java | 246 + .../api/auth/feign/AuthSocialFeignClient.java | 69 + .../api/auth/feign/TokenFeignClient.java | 53 + .../cloud/api/auth/vo/AuthSocialVO.java | 170 + .../cloud/api/auth/vo/TokenInfoVO.java | 56 + .../cloud/api/rbac/dto/UserRoleDTO.java | 77 + .../api/rbac/feign/PermissionFeignClient.java | 45 + .../api/biz/feign/AttachFileFeignClient.java | 33 + .../cloud/api/biz/vo/ResourcesInfoVO.java | 53 + .../cloud/api/flow/feign/FlowFeignClient.java | 33 + .../cloud/api/flow/vo/UserAnalysisVO.java | 225 + tmerclub-api/tmerclub-api-group/pom.xml | 28 + .../api/group/bo/GroupOrderNotifyBO.java | 69 + .../api/group/feign/GroupFeignClient.java | 67 + .../cloud/api/group/vo/GroupActivityVO.java | 264 + .../cloud/api/combo/vo/ChooseComboItemVo.java | 116 + .../api/coupon/constant/CouponProdType.java | 50 + .../cloud/api/coupon/constant/CouponType.java | 53 + .../cloud/api/coupon/dto/BindCouponDTO.java | 55 + .../cloud/api/coupon/dto/ChooseCouponDTO.java | 76 + .../cloud/api/coupon/dto/LockCouponDTO.java | 82 + .../coupon/dto/PlatformChooseCouponDTO.java | 77 + .../api/coupon/dto/ReceiveCouponDTO.java | 77 + .../coupon/feign/CouponOrderFeignClient.java | 41 + .../cloud/api/coupon/vo/CouponDataVO.java | 300 + .../cloud/api/coupon/vo/CouponUserApiVO.java | 70 + .../api/discount/constant/DiscountRule.java | 58 + .../discount/feign/DiscountFeignClient.java | 56 + .../cloud/api/discount/vo/DiscountSumVO.java | 63 + .../bo/DistributionNotifyOrderAndShopBO.java | 58 + .../distribution/bo/DistributionSpuBO.java | 187 + .../bo/DistributionUserUpdateBO.java | 83 + .../vo/DistributionUserIncomeApiVO.java | 236 + .../cloud/api/live/feign/LiveFeignClient.java | 25 + .../api/delivery/dto/DeliveryOrderDTO.java | 229 + .../api/delivery/dto/StationSalesDTO.java | 180 + .../api/delivery/feign/AreaFeignClient.java | 36 + .../delivery/feign/DeliveryFeignClient.java | 72 + .../delivery/feign/SameCityFeignClient.java | 26 + .../api/delivery/vo/DeliveryOrderFeignVO.java | 190 + .../delivery/vo/DeliveryOrderItemFeignVO.java | 116 + .../cloud/api/delivery/vo/SameCityVO.java | 334 + .../cloud/api/delivery/vo/StationVO.java | 310 + .../cloud/api/order/bo/EsAllotOrderBO.java | 240 + .../cloud/api/order/bo/EsOrderInvoiceBO.java | 198 + .../api/order/bo/EsOrderRefundItemBO.java | 394 + .../api/order/bo/EsPurchaseOrderItemBO.java | 299 + .../api/order/constant/BuyerReasonType.java | 106 + .../cloud/api/order/constant/OrderStatus.java | 119 + .../api/order/constant/TimeTypeEnum.java | 64 + .../cloud/api/order/dto/FlowOrderItemDTO.java | 74 + .../cloud/api/order/dto/QueryOrderDTO.java | 55 + .../order/feign/AllotOrderFeignClient.java | 23 + .../api/order/feign/OrderCommFeignClient.java | 74 + .../api/order/feign/OrderFeignClient.java | 548 + .../order/feign/OrderInvoiceFeignClient.java | 37 + .../order/feign/OrderRefundFeignClient.java | 141 + .../feign/OrderSelfStationFeignClient.java | 29 + .../order/feign/PurchaseOrderFeignClient.java | 53 + .../order/manager/ConfirmOrderManager.java | 936 + .../api/order/manager/SubmitOrderManager.java | 971 + .../cloud/api/order/vo/CustomerRetainVO.java | 206 + .../cloud/api/order/vo/FlowOrderItemVO.java | 73 + .../cloud/api/order/vo/FlowOrderVO.java | 92 + .../cloud/api/order/vo/GroupInfoVO.java | 44 + .../cloud/api/order/vo/OrderPayInfoVO.java | 176 + .../api/order/vo/OrderProdEffectRespVO.java | 156 + .../api/order/vo/OrderRefundSimpleVO.java | 53 + .../api/order/vo/OrderSettlementSimpleVO.java | 66 + .../api/order/vo/PageShopAccountOrderVO.java | 65 + .../api/order/vo/PurchaseOrderAddrVO.java | 166 + .../order/vo/ShopAccountOrderDetailVO.java | 136 + .../cloud/api/order/vo/ShopAmountVO.java | 54 + .../cloud/api/order/vo/SumAmountVO.java | 65 + tmerclub-api/tmerclub-api-payment/pom.xml | 23 + .../member/resp/CompanyBasicInfo.java | 251 + .../allinpay/member/resp/CompanyInfo.java | 104 + .../resp/IdCardCollectByFileUploadResp.java | 58 + .../member/resp/IdCardCollectResp.java | 44 + .../allinpay/order/resp/DepositApplyResp.java | 103 + .../allinpay/order/resp/PayByBackSmsResp.java | 81 + .../allinpay/order/resp/QueryBalanceResp.java | 41 + .../order/resp/WithdrawApplyResp.java | 48 + .../payment/dto/BindCompanyAccountDTO.java | 105 + .../api/payment/dto/OrderPayInfoDTO.java | 62 + .../api/payment/dto/UpdateCompanyInfoDTO.java | 110 + .../api/payment/feign/PaymentFeignClient.java | 88 + .../cloud/api/payment/vo/AccountDetailVO.java | 125 + .../api/payment/vo/ShopAccountDetailVO.java | 112 + tmerclub-api/tmerclub-api-product/pom.xml | 38 + .../cloud/api/product/bo/SkuStockLockBO.java | 97 + .../cloud/api/product/bo/SpuSimpleBO.java | 138 + .../cloud/api/product/dto/BrandShopDTO.java | 205 + .../api/product/dto/CategoryShopDTO.java | 80 + .../cloud/api/product/dto/SpuUpdateDTO.java | 182 + .../cloud/api/product/dto/WarehouseDTO.java | 265 + .../product/feign/BrandShopFeignClient.java | 31 + .../product/feign/CategoryFeignClient.java | 38 + .../product/feign/GiveawayFeignClient.java | 21 + .../product/feign/ShopCartFeignClient.java | 107 + .../api/product/feign/SkuFeignClient.java | 119 + .../product/feign/SkuStockFeignClient.java | 91 + .../feign/SpuBrowseLogFeignClient.java | 30 + .../api/product/feign/SpuCommFeignClient.java | 38 + .../product/feign/StockPointFeignClient.java | 36 + .../api/product/manager/ShopCartAdapter.java | 126 + .../api/product/util/ProductLangUtil.java | 352 + tmerclub-api/tmerclub-api-search/pom.xml | 34 + .../constant/EsRenovationProductSortEnum.java | 68 + .../cloud/api/dto/PurchaseOrderUpdateDTO.java | 61 + .../cloud/api/feign/EsOrderFeignClient.java | 43 + .../SearchOrderRefundTaskFeignClient.java | 44 + .../api/feign/SearchOrderTaskFeignClient.java | 50 + .../feign/SearchPurchaseOrderFeignClient.java | 37 + .../cloud/api/feign/SearchSpuFeignClient.java | 109 + .../api/seckill/dto/SecKillRefundDTO.java | 68 + .../api/seckill/feign/SeckillFeignClient.java | 96 + tmerclub-api/tmerclub-api-user/pom.xml | 38 + .../cloud/api/user/bo/BalanceRefundBO.java | 97 + .../cloud/api/user/bo/RechargeNotifyBO.java | 68 + .../api/user/bo/UserOrderStatisticBO.java | 151 + .../api/user/bo/UserOrderStatisticListBO.java | 77 + .../cloud/api/user/bo/UserScoreBO.java | 89 + .../cloud/api/user/dto/MemberReqDTO.java | 74 + .../cloud/api/user/dto/UserScoreLockDTO.java | 79 + .../api/user/feign/PopupFeignClient.java | 61 + .../api/user/feign/UserAddrFeignClient.java | 37 + .../user/feign/UserBalanceLogFeignClient.java | 115 + .../UserLevelAndScoreOrderFeignClient.java | 46 + .../user/feign/UserLevelLogFeignClient.java | 62 + .../api/user/vo/FinanceDetailExcelVO.java | 234 + .../cloud/api/user/vo/FinanceDetailVO.java | 203 + .../api/user/vo/MemberContributeValueVO.java | 155 + .../cloud/api/user/vo/MemberDealRespVO.java | 77 + .../cloud/api/user/vo/MemberDealTreadVO.java | 131 + .../cloud/api/user/vo/MemberTrendRespVO.java | 76 + .../tmerclub/cloud/api/user/vo/UserApiVO.java | 277 + .../cloud/api/user/vo/UserManagerVO.java | 495 + .../cloud/api/user/vo/UserTagApiVO.java | 79 + tmerclub-auth/pom.xml | 86 + .../com/tmerclub/cloud/AuthApplication.java | 29 + .../adapter/CaptchaCacheServiceRedisImpl.java | 47 + .../cloud/auth/config/CaptchaConfig.java | 78 + .../cloud/auth/config/RocketMqConfig.java | 39 + .../auth/constant/AuthAccountStatusEnum.java | 45 + .../controller/JsapiSignatureController.java | 48 + .../auth/controller/LoginController.java | 324 + .../controller/StationLoginController.java | 91 + .../auth/controller/TokenController.java | 53 + .../auth/controller/WxMnpController.java | 40 + .../cloud/auth/dto/BindSocialDTO.java | 70 + .../auth/dto/CaptchaAuthenticationDTO.java | 44 + .../auth/feign/AccountFeignController.java | 527 + .../cloud/auth/manager/PasswordManager.java | 57 + .../cloud/auth/mapper/AuthAccountMapper.java | 240 + .../cloud/auth/mapper/AuthSocialMapper.java | 104 + .../cloud/auth/model/AuthAccount.java | 200 + .../tmerclub/cloud/auth/model/AuthSocial.java | 158 + .../cloud/auth/service/AuthSocialService.java | 58 + .../service/impl/AuthAccountServiceImpl.java | 178 + .../service/impl/AuthSocialServiceImpl.java | 81 + .../cloud/constant/DistributedIdKey.java | 24 + .../controller/MenuPermissionController.java | 112 + .../cloud/rbac/controller/RoleController.java | 112 + .../com/tmerclub/cloud/rbac/dto/MenuDTO.java | 194 + .../rbac/dto/MenuWithPermissionIdDTO.java | 56 + .../com/tmerclub/cloud/rbac/dto/RoleDTO.java | 92 + .../rbac/feign/PermissionFeignController.java | 97 + .../rbac/mapper/MenuPermissionMapper.java | 113 + .../cloud/rbac/mapper/RoleMenuMapper.java | 41 + .../cloud/rbac/mapper/UserRoleMapper.java | 59 + .../tmerclub/cloud/rbac/model/RoleMenu.java | 87 + .../cloud/rbac/service/MenuService.java | 81 + .../cloud/rbac/service/RoleService.java | 83 + .../rbac/service/impl/RoleServiceImpl.java | 134 + .../cloud/rbac/vo/MenuPermissionVO.java | 127 + .../tmerclub/cloud/rbac/vo/MenuSimpleVO.java | 80 + .../com/tmerclub/cloud/rbac/vo/MenuVO.java | 223 + .../com/tmerclub/cloud/rbac/vo/RoleVO.java | 130 + .../com/tmerclub/cloud/rbac/vo/RouteVO.java | 174 + ...m.anji.captcha.service.CaptchaCacheService | 1 + .../src/main/resources/captcha/original/2.png | Bin 0 -> 43926 bytes .../src/main/resources/captcha/original/3.png | Bin 0 -> 41195 bytes .../src/main/resources/captcha/original/6.png | Bin 0 -> 59340 bytes .../main/resources/captcha/slidingBlock/2.png | Bin 0 -> 21367 bytes .../main/resources/captcha/slidingBlock/3.png | Bin 0 -> 21660 bytes tmerclub-auth/src/main/resources/logback.xml | 44 + .../resources/mapper/AuthSocialMapper.xml | 100 + .../src/main/resources/mapper/RoleMapper.xml | 63 + tmerclub-biz/Dockerfile | 13 + .../cloud/biz/config/AwsS3Config.java | 215 + .../tmerclub/cloud/biz/config/WxConfig.java | 70 + .../cloud/biz/constant/NotifyType.java | 55 + .../admin/AttachFileController.java | 103 + .../controller/admin/NotifyLogController.java | 112 + .../controller/app/AttachFileController.java | 44 + .../app/NotifyTemplateRemindController.java | 67 + .../multishop/AttachFileController.java | 80 + .../controller/multishop/SmsController.java | 104 + .../platform/NotifyLogController.java | 55 + .../supplier/AttachFileController.java | 112 + .../tmerclub/cloud/biz/dto/AttachFileDTO.java | 150 + .../tmerclub/cloud/biz/dto/NotifyLogDTO.java | 221 + .../cloud/biz/dto/NotifyTemplateDTO.java | 156 + .../cloud/biz/dto/NotifyTemplateTagDTO.java | 67 + .../cloud/biz/dto/QrcodeTicketDTO.java | 104 + ...ndOrderToPurchaseNotifyToShopConsumer.java | 25 + .../cloud/biz/mapper/AttachFileMapper.java | 123 + .../mapper/NotifyTemplateRemindMapper.java | 72 + .../cloud/biz/mapper/QrcodeTicketMapper.java | 64 + .../tmerclub/cloud/biz/model/AttachFile.java | 157 + .../cloud/biz/model/AttachFileGroup.java | 113 + .../cloud/biz/model/NotifyTemplate.java | 154 + .../cloud/biz/model/NotifyTemplateRemind.java | 102 + .../cloud/biz/model/QrcodeTicket.java | 118 + .../cloud/biz/service/AttachFileService.java | 110 + .../service/NotifyTemplateRemindService.java | 68 + .../biz/service/NotifyTemplateService.java | 83 + .../biz/service/NotifyTemplateTagService.java | 107 + .../service/impl/AttachFileServiceImpl.java | 196 + .../service/impl/NotifyLogServiceImpl.java | 122 + .../impl/NotifyTemplateServiceImpl.java | 80 + .../impl/NotifyTemplateShopServiceImpl.java | 57 + .../service/impl/QrcodeTicketServiceImpl.java | 64 + .../service/impl/SendMessageServiceImpl.java | 558 + .../biz/service/impl/SmsLogServiceImpl.java | 251 + .../cloud/biz/vo/AttachFileGroupVO.java | 91 + .../cloud/biz/vo/NotifyTemplateVO.java | 193 + .../cloud/biz/vo/SmsCodeTemplateVO.java | 55 + tmerclub-biz/src/main/resources/logback.xml | 44 + .../resources/mapper/AttachFileMapper.xml | 104 + .../main/resources/mapper/NotifyLogMapper.xml | 145 + .../mapper/NotifyTemplateTagMapper.xml | 89 + .../mapper/NoyifyTemplateRemindMapper.xml | 61 + .../common/cache/adapter/CacheTtlAdapter.java | 30 + .../cloud/common/cache/bo/AofRedisBO.java | 55 + .../common/cache/bo/CacheNameWithTtlBO.java | 53 + .../common/cache/bo/MultiDecrementBO.java | 192 + .../cloud/common/cache/bo/MultiRedisBO.java | 56 + .../common/cache/config/AofRedisConfig.java | 75 + .../common/cache/constant/BizCacheNames.java | 28 + .../cache/constant/ConfigCacheNames.java | 32 + .../cache/constant/CouponCacheNames.java | 42 + .../cache/constant/DiscountCacheNames.java | 30 + .../common/cache/constant/FlowCacheNames.java | 68 + .../common/cache/constant/LuaOperateEnum.java | 87 + .../cache/constant/OauthCacheNames.java | 52 + .../cache/constant/PlatformCacheNames.java | 35 + .../cache/constant/ProductCacheNames.java | 176 + .../common/cache/constant/UserCacheNames.java | 93 + .../common/cache/enums/MultiStockEnum.java | 28 + .../lua/multistock/DecrementStock.lua | 65 + .../resources/lua/multistock/ReturnStock.lua | 57 + .../lua/multistock/SeckillSkuStock.lua | 32 + .../lua/multistock/SeckillSkuStockMerge.lua | 24 + .../coupon/DecrementCouponStock.lua | 40 + .../multistock/coupon/ReturnCouponStock.lua | 32 + .../main/resources/lua/product/SkuStock.lua | 226 + .../product/allot/AllotReduceLockStock.lua | 60 + .../lua/product/order/OrderMakerUseStock.lua | 139 + .../lua/product/order/OrderStock.lua | 145 + .../purchase/PurchaseReduceLuckStock.lua | 60 + tmerclub-common/tmerclub-common-core/pom.xml | 111 + .../tmerclub/cloud/common/bean/Alipay.java | 118 + .../tmerclub/cloud/common/bean/Allinpay.java | 154 + .../tmerclub/cloud/common/bean/BmapPoint.java | 57 + .../tmerclub/cloud/common/bean/Domain.java | 45 + .../tmerclub/cloud/common/bean/QuickBird.java | 55 + .../cloud/common/bean/SensitiveWord.java | 36 + .../cloud/common/bean/SwitchBaseModel.java | 27 + .../cloud/common/bean/UploadFile.java | 105 + .../com/tmerclub/cloud/common/bean/WxApp.java | 28 + .../tmerclub/cloud/common/bean/WxMiniApp.java | 57 + .../com/tmerclub/cloud/common/bean/WxPay.java | 164 + .../common/config/RestTemplateConfig.java | 30 + .../common/constant/AllinpayConstant.java | 45 + .../common/constant/AllinpayPayStatus.java | 50 + .../cloud/common/constant/AutoCheckEnum.java | 45 + .../constant/CompanyInfoProcessStatus.java | 37 + .../common/constant/DistributedIdKey.java | 0 .../common/constant/DistributionAudit.java | 54 + .../cloud/common/constant/ExcelConstant.java | 16 + .../cloud/common/constant/JumpType.java | 47 + .../cloud/common/constant/PayType.java | 140 + .../cloud/common/constant/PicType.java | 50 + .../common/constant/RetainedDateType.java | 65 + .../constant/SeckillOrderCacheConstant.java | 15 + .../cloud/common/constant/SendTypeEnum.java | 230 + .../cloud/common/constant/StatusEnum.java | 89 + .../common/constant/StorageTypeEnum.java | 40 + .../cloud/common/constant/UserAdminType.java | 52 + .../tmerclub/cloud/common/dto/BaseDTO.java | 61 + .../common/dubbo/DevProximityLoadBalance.java | 43 + .../common/handler/ExcelMergeHandler.java | 116 + .../cloud/common/handler/HttpHandler.java | 87 + .../common/handler/SensitiveHandler.java | 172 + .../cloud/common/i18n/I18nMessage.java | 69 + .../cloud/common/i18n/LanguageEnum.java | 87 + .../common/i18n/LuckLocaleChangeFilter.java | 70 + .../i18n/LuckLocaleChangeInterceptor.java | 53 + .../cloud/common/util/AnalysisUtil.java | 184 + .../com/tmerclub/cloud/common/util/Arith.java | 171 + .../tmerclub/cloud/common/util/BeanUtil.java | 28 + .../tmerclub/cloud/common/util/CharUtil.java | 29 + .../tmerclub/cloud/common/util/ExcelUtil.java | 212 + .../tmerclub/cloud/common/util/IpHelper.java | 78 + .../tmerclub/cloud/common/util/LangUtil.java | 59 + .../tmerclub/cloud/common/util/MapUtil.java | 78 + .../tmerclub/cloud/common/util/PriceUtil.java | 134 + .../cloud/common/util/PrincipalUtil.java | 186 + .../common/vo/ShopSubstituteSalesVO.java | 127 + .../cloud/common/wrapper/RequestWrapper.java | 96 + .../org.apache.dubbo.rpc.cluster.LoadBalance | 1 + .../tmerclub-common-database/pom.xml | 37 + .../common/database/config/MybatisConfig.java | 24 + tmerclub-common/tmerclub-common-leaf/pom.xml | 21 + .../cloud/common/leaf/common/Status.java | 27 + .../common/leaf/exception/NoKeyException.java | 21 + .../common/leaf/manager/SegmentManager.java | 247 + .../common/leaf/segment/SegmentIDGenImpl.java | 309 + .../common/leaf/segment/dao/IDAllocDao.java | 51 + .../common/leaf/segment/model/LeafAlloc.java | 65 + .../leaf/segment/model/SegmentBuffer.java | 166 + .../common/leaf/service/SegmentService.java | 30 + .../cloud/common/leaf/util/NumberUtil.java | 70 + .../common/mongodb/bo/order/MongoOrderBO.java | 1131 + .../bo/order/MongoOrderVirtualInfoBO.java | 115 + .../common/mongodb/util/MongoPageUtil.java | 48 + .../cloud/common/order/bo/DeliveryModeBO.java | 76 + .../cloud/common/order/bo/EsOrderBO.java | 1145 + .../cloud/common/order/bo/OrderStatusBO.java | 237 + .../cloud/common/order/bo/PayRefundBO.java | 152 + .../common/order/bo/RefundStockOperateBO.java | 62 + .../common/order/constant/OrderCloseType.java | 53 + .../common/order/constant/PayStatus.java | 66 + .../constant/ReturnProcessStatusEnum.java | 83 + .../constant/ShopCartItemDiscountType.java | 41 + .../common/order/constant/StockModeEnum.java | 38 + .../common/order/dto/AllotOrderSearchDTO.java | 96 + .../cloud/common/order/dto/AreaDTO.java | 92 + .../cloud/common/order/dto/DvyTypeDTO.java | 87 + .../cloud/common/order/dto/OrderDTO.java | 143 + .../order/dto/OrderInvoiceSearchDTO.java | 210 + .../order/dto/OrderRefundSearchDTO.java | 388 + .../cloud/common/order/dto/OrderShopDTO.java | 58 + .../order/dto/OrderSubmitShopCartItemDTO.java | 62 + .../common/order/dto/OrderVirtualInfoDTO.java | 127 + .../common/order/dto/VirtualRemarkDTO.java | 88 + .../feign/OrderShopDetailFeignClient.java | 30 + .../common/order/util/OrderLangUtil.java | 164 + .../cloud/common/order/vo/AreaVO.java | 119 + .../cloud/common/order/vo/CouponOrderVO.java | 252 + .../common/order/vo/DiscountOrderVO.java | 216 + .../common/order/vo/EsAllotOrderItemVO.java | 109 + .../common/order/vo/EsOrderRefundItemVO.java | 273 + .../common/order/vo/EsOrderVirtualInfoVO.java | 115 + .../cloud/common/order/vo/OrderCountVO.java | 136 + .../cloud/common/order/vo/OrderItemVO.java | 916 + .../cloud/common/order/vo/OrderSpuLangVO.java | 54 + .../common/order/vo/OrderStationSpuDTO.java | 68 + .../common/order/vo/RefundOrderItemVO.java | 286 + .../order/vo/ShopCartItemDiscountVO.java | 105 + .../common/order/vo/ShopCartOrderVO.java | 516 + .../cloud/common/order/vo/ShopCartVO.java | 212 + .../common/order/vo/ShopCityStatusVO.java | 51 + .../cloud/common/order/vo/TransfeeFreeVO.java | 105 + .../cloud/common/order/vo/TransfeeVO.java | 117 + .../common/order/vo/UserOrderStatisticVO.java | 153 + .../common/order/vo/VirtualRemarkVO.java | 88 + .../cloud/common/product/bo/EsAttrBO.java | 110 + .../cloud/common/product/bo/EsBrandBO.java | 83 + .../cloud/common/product/bo/EsCategoryBO.java | 68 + .../common/product/bo/EsDeliveryModeBO.java | 69 + .../cloud/common/product/bo/EsProductBO.java | 937 + .../common/product/constant/ComboSpuType.java | 36 + .../common/product/constant/ComboStatus.java | 42 + .../constant/CommissionSpuOffType.java | 41 + .../common/product/constant/ContentValue.java | 38 + .../common/product/constant/IsCommission.java | 36 + .../common/product/constant/IsSynUpdate.java | 37 + .../common/product/constant/PreSaleType.java | 33 + .../product/constant/SalesPriceType.java | 37 + .../common/product/constant/SalesType.java | 37 + .../common/product/constant/SearchType.java | 40 + .../product/constant/SkuChoiceStatus.java | 34 + .../common/product/constant/SpuType.java | 73 + .../product/constant/StockBillType.java | 131 + .../product/constant/StockPointType.java | 35 + .../common/product/constant/StockType.java | 56 + .../product/constant/SupplierSpuType.java | 38 + .../product/constant/TakeStockBillStatus.java | 66 + .../constant/TakeStockExceptionEnum.java | 55 + .../cloud/common/product/dto/AttrLangDTO.java | 79 + .../common/product/dto/AttrValueLangDTO.java | 67 + .../product/dto/CartComboMatchSpuDTO.java | 78 + .../common/product/dto/ComboOrderDTO.java | 127 + .../common/product/dto/ProductSearchDTO.java | 942 + .../product/dto/ProductSearchLimitDTO.java | 97 + .../cloud/common/product/dto/SkuLangDTO.java | 88 + .../product/dto/SpuSkuAttrValueLangDTO.java | 80 + .../common/product/dto/StockPointSkuDTO.java | 329 + .../common/product/dto/TackStockDTO.java | 115 + .../common/product/vo/AttrCategoryVO.java | 70 + .../cloud/common/product/vo/AttrVO.java | 153 + .../cloud/common/product/vo/AttrValueVO.java | 80 + .../cloud/common/product/vo/BrandVO.java | 202 + .../common/product/vo/CategoryLangVO.java | 67 + .../cloud/common/product/vo/ComboOrderVO.java | 130 + .../common/product/vo/GiveawaySpuVO.java | 254 + .../cloud/common/product/vo/GiveawayVO.java | 229 + .../common/product/vo/GroupActivitySpuVO.java | 114 + .../cloud/common/product/vo/SkuAddrVO.java | 115 + .../cloud/common/product/vo/SkuComboVO.java | 157 + .../cloud/common/product/vo/SkuLangVO.java | 91 + .../cloud/common/product/vo/SkuVO.java | 405 + .../common/product/vo/SpuActivityAppVO.java | 80 + .../cloud/common/product/vo/SpuAndSkuVO.java | 77 + .../common/product/vo/SpuAttrValueLangVO.java | 79 + .../common/product/vo/SpuCouponAppVO.java | 103 + .../common/product/vo/SpuSkuAttrValueVO.java | 155 + .../cloud/common/product/vo/SpuVO.java | 1084 + .../common/product/vo/StockBillLogVO.java | 288 + .../common/product/vo/StockPointSkuVO.java | 157 + .../common/product/vo/app/BrandAppVO.java | 109 + .../common/product/vo/app/CategoryAppVO.java | 190 + .../cloud/common/product/vo/app/SkuAppVO.java | 236 + .../product/vo/search/AttrValueSearchVO.java | 53 + .../product/vo/search/CategorySearchVO.java | 55 + .../product/vo/search/DistributionInfoVO.java | 101 + .../product/vo/search/ProductSearchVO.java | 103 + .../product/vo/search/ShopInfoSearchVO.java | 101 + .../tmerclub-common-rocketmq/pom.xml | 29 + .../rocketmq/config/RocketMqAdapter.java | 59 + .../rocketmq/config/RocketMqConstant.java | 534 + .../tmerclub-common-security/pom.xml | 58 + .../cloud/common/security/PmsContext.java | 38 + .../security/adapter/AuthConfigAdapter.java | 88 + .../common/security/bo/SignResponse.java | 92 + .../cloud/common/security/bo/TokenInfoBO.java | 70 + .../security/config/PasswordConfig.java | 29 + .../security/config/SensitiveWordConfig.java | 45 + .../common/security/filter/AuthFilter.java | 330 + .../filter/dubbo/DubboExceptionFilter.java | 94 + .../dubbo/com.alibaba.dubbo.rpc.Filter | 4 + .../tmerclub-common-sharding-proxy/pom.xml | 98 + .../proxy/ShardingAlgorithmHelper.java | 51 + tmerclub-flow/pom.xml | 98 + .../com/tmerclub/cloud/flow/bo/FlowSpuBO.java | 368 + .../tmerclub/cloud/flow/bo/FlowSpuUserBO.java | 222 + .../cloud/flow/bo/FlowSystemUserBO.java | 171 + .../tmerclub/cloud/flow/bo/FlowUserBO.java | 177 + .../cloud/flow/bo/FlowUserOperationBO.java | 280 + .../cloud/flow/bo/FlowUserRetainBO.java | 180 + .../cloud/flow/config/Ip2RegionConfig.java | 46 + .../cloud/flow/constant/FlowLogPageEnum.java | 101 + .../cloud/flow/constant/FlowUserTypeEnum.java | 41 + .../cloud/flow/constant/FlowVisitEnum.java | 63 + .../cloud/flow/constant/FormItemEnum.java | 167 + .../cloud/flow/constant/SystemTypeEnum.java | 65 + .../admin/ProductAnalyseController.java | 53 + .../controller/app/FlowLogController.java | 105 + .../controller/multishop/FormController.java | 125 + .../platform/FlowAnalysisController.java | 113 + .../platform/ProductAnalyseController.java | 81 + .../platform/UserVisitAnalysisController.java | 58 + .../supplier/ProductAnalyseController.java | 62 + .../cloud/flow/dto/FlowAnalysisDTO.java | 113 + .../cloud/flow/dto/ProductAnalyseDTO.java | 175 + .../cloud/flow/dto/SingleProdTrendDTO.java | 75 + .../flow/dto/UserVisitProdAnalysisDTO.java | 80 + .../cloud/flow/mapper/FormMapper.java | 55 + .../cloud/flow/model/ProductAnalyse.java | 174 + .../cloud/flow/model/UserAnalysis.java | 217 + .../flow/service/CustomerAnalysisService.java | 75 + .../cloud/flow/service/FormService.java | 103 + .../flow/service/ProductAnalyseService.java | 80 + .../SystemUserAnalyseMongoService.java | 33 + .../flow/service/UserAnalyseMongoService.java | 232 + .../impl/CustomerAnalysisServiceImpl.java | 648 + .../flow/service/impl/FlowServiceImpl.java | 364 + .../impl/FlowUserAnalysisServiceImpl.java | 540 + .../impl/FlowUserMongoServiceImpl.java | 67 + .../flow/service/impl/FormServiceImpl.java | 495 + .../impl/ProductAnalyseServiceImpl.java | 437 + .../impl/SystemAnalyseMongoServiceImpl.java | 574 + .../SystemUserAnalyseMongoServiceImpl.java | 123 + .../impl/UserAnalyseMongoServiceImpl.java | 1076 + .../tmerclub/cloud/flow/task/FlowTask.java | 42 + .../cloud/flow/util/FlowArithUtil.java | 130 + .../tmerclub/cloud/flow/util/FlowUtil.java | 268 + .../flow/vo/FlowAnalysisDataExcelVO.java | 117 + .../flow/vo/FlowProdEffectDataExcelVO.java | 261 + .../cloud/flow/vo/FlowProdEffectRespVO.java | 100 + .../cloud/flow/vo/FlowSourDataExcelVO.java | 105 + .../cloud/flow/vo/FlowTrendExcelVO.java | 141 + .../tmerclub/cloud/flow/vo/FormItemVO.java | 55 + .../cloud/flow/vo/ProductAnalyseVO.java | 176 + .../cloud/flow/vo/ProductFlowInfoVO.java | 125 + .../cloud/flow/vo/UserAnalysisVO.java | 237 + .../src/main/resources/bootstrap.yml | 28 + tmerclub-flow/src/main/resources/logback.xml | 44 + .../src/main/resources/mapper/FormMapper.xml | 95 + .../cloud/gateway/dev/DevWebFluxContext.java | 37 + .../src/main/resources/bootstrap.yml | 20 + .../src/main/resources/logback.xml | 44 + tmerclub-group/Dockerfile | 13 + .../cloud/group/GroupApplication.java | 27 + .../cloud/group/bo/GroupOpenNotifyBO.java | 51 + .../group/bo/mongo/MongoGroupTeamBO.java | 187 + .../cloud/group/config/RocketMqConfig.java | 86 + .../cloud/group/config/XxlJobConfig.java | 67 + .../constant/AppGroupActivityStatus.java | 55 + .../constant/GroupActivityStatusEnum.java | 71 + .../cloud/group/constant/TeamStatusEnum.java | 49 + .../controller/app/GroupTeamController.java | 114 + .../cloud/group/dto/GroupActivityDTO.java | 261 + .../cloud/group/dto/GroupOrderDTO.java | 46 + .../tmerclub/cloud/group/dto/GroupSpuDTO.java | 115 + .../cloud/group/dto/GroupTeamDTO.java | 152 + .../group/feign/GroupFeignController.java | 95 + .../listener/GroupOrderCreateConsumer.java | 37 + .../GroupOrderCreateTransactionListener.java | 67 + .../listener/GroupOrderSaveGroupConsumer.java | 55 + .../GroupOrderSaveTeamGroupConsumer.java | 42 + ...derUnSuccessRefundTransactionListener.java | 46 + .../listener/OrderNotifyGroupConsumer.java | 51 + .../group/mapper/GroupActivityMapper.java | 132 + .../cloud/group/mapper/GroupOrderMapper.java | 32 + .../cloud/group/mapper/GroupSkuMapper.java | 100 + .../cloud/group/mapper/GroupTeamMapper.java | 32 + .../cloud/group/model/GroupActivity.java | 259 + .../tmerclub/cloud/group/model/GroupSku.java | 102 + .../tmerclub/cloud/group/model/GroupTeam.java | 174 + .../service/impl/GroupSkuServiceImpl.java | 100 + .../service/impl/GroupTeamServiceImpl.java | 205 + .../tmerclub/cloud/group/vo/GroupSkuVO.java | 116 + .../tmerclub/cloud/group/vo/GroupSpuVO.java | 118 + .../group/vo/app/AppGroupActivityVO.java | 273 + .../cloud/group/vo/app/AppGroupSkuVO.java | 176 + .../main/resources/mapper/GroupTeamMapper.xml | 30 + tmerclub-im/Dockerfile | 13 + .../cloud/im/config/DubboBeanConfig.java | 44 + .../tmerclub/cloud/im/constants/Admin.java | 19 + .../tmerclub/cloud/im/constants/MsgCode.java | 82 + .../tmerclub/cloud/im/constants/WhoSend.java | 21 + .../multishop/ImMsgBizSkillsController.java | 79 + .../platform/ImMsgBizSkillsController.java | 79 + .../im/feign/ImMsgBizUserFeignController.java | 32 + .../cloud/im/mapper/ImMsgBizUserMapper.java | 90 + .../cloud/im/model/ImMsgBizSkills.java | 118 + .../ImMsgBizEmployeeRecentService.java | 88 + .../im/service/ImMsgBizSkillsService.java | 68 + .../service/ImMsgBizUserHistoryService.java | 246 + .../impl/ImMsgBizSkillsServiceImpl.java | 85 + .../impl/ImMsgBizUserHistoryServiceImpl.java | 397 + .../service/impl/ImMsgBizUserServiceImpl.java | 106 + .../platform/SysOnlineWebSocketServer.java | 204 + .../socket/platform/SysWebSocketServer.java | 371 + .../cloud/im/vo/ImMsgBizSkillsVO.java | 106 + tmerclub-im/src/main/resources/bootstrap.yml | 28 + tmerclub-im/src/main/resources/logback.xml | 44 + .../mapper/ImMsgBizEmployeeRecentMapper.xml | 70 + .../resources/mapper/ImMsgBizSkillsMapper.xml | 75 + .../resources/mapper/ImMsgBizUserMapper.xml | 95 + tmerclub-marketing/Dockerfile | 13 + .../tmerclub/cloud/MarketingApplication.java | 41 + .../combo/bo/ComboSpuCountChangeNotifyBO.java | 68 + .../cloud/combo/constant/ComboStatus.java | 48 + .../combo/feign/ComboFeignController.java | 60 + .../combo/feign/ComboSpuFeignController.java | 35 + .../cloud/combo/listener/ComboListener.java | 43 + .../ComboOrderPaySucceedListener.java | 36 + .../combo/listener/ComboSpuSkuListener.java | 41 + .../cloud/combo/mapper/ComboMapper.java | 151 + .../cloud/combo/model/ComboOrder.java | 146 + .../tmerclub/cloud/combo/model/ComboSpu.java | 173 + .../cloud/combo/model/ComboSpuSku.java | 74 + .../combo/service/ComboSpuSkuService.java | 112 + .../service/impl/ComboOrderServiceImpl.java | 70 + .../combo/service/impl/ComboServiceImpl.java | 903 + .../service/impl/ComboSpuSkuServiceImpl.java | 149 + .../tmerclub/cloud/combo/task/ComboTask.java | 44 + .../tmerclub/cloud/combo/vo/ComboSpuVO.java | 194 + .../tmerclub/cloud/config/XxlJobConfig.java | 67 + .../cloud/coupon/constant/CouponConstant.java | 28 + .../cloud/coupon/constant/CouponStatus.java | 44 + .../cloud/coupon/constant/GetWay.java | 39 + .../coupon/constant/SuitableProdType.java | 40 + .../controller/admin/CouponController.java | 210 + .../controller/app/CouponController.java | 145 + .../controller/app/MyCouponController.java | 80 + .../controller/platform/CouponController.java | 48 + .../tmerclub/cloud/coupon/dto/CouponDTO.java | 342 + .../cloud/coupon/dto/CouponUserDTO.java | 140 + .../feign/CouponOrderFeignController.java | 98 + .../coupon/listener/CouponUnlockConsumer.java | 39 + .../coupon/manager/CouponStockManager.java | 235 + .../coupon/mapper/CouponGiveLogMapper.java | 68 + .../tmerclub/cloud/coupon/model/Coupon.java | 340 + .../cloud/coupon/model/CouponSpu.java | 74 + .../cloud/coupon/service/CouponService.java | 255 + .../coupon/service/CouponUserService.java | 241 + .../service/impl/CouponLockServiceImpl.java | 171 + .../service/impl/CouponServiceImpl.java | 892 + .../service/impl/CouponSpuServiceImpl.java | 92 + .../service/impl/CouponUserServiceImpl.java | 887 + .../cloud/coupon/task/CouponTask.java | 135 + .../cloud/coupon/util/ChooseCouponHelper.java | 345 + .../cloud/coupon/vo/CouponUserVO.java | 143 + .../vo/mongo/MongoCouponUserCountVO.java | 151 + .../controller/app/SpuDiscountController.java | 57 + .../cloud/discount/dto/DiscountDTO.java | 245 + .../cloud/discount/dto/DiscountItemDTO.java | 79 + .../feign/DiscountFeignController.java | 186 + .../manager/DiscountConfirmOrderManager.java | 459 + .../discount/manager/DiscountManager.java | 320 + .../discount/mapper/DiscountItemMapper.java | 44 + .../discount/mapper/DiscountSpuMapper.java | 67 + .../cloud/discount/model/Discount.java | 243 + .../cloud/discount/model/DiscountItem.java | 90 + .../discount/service/DiscountSpuService.java | 28 + .../constant/BindInvalidReasonEnum.java | 55 + .../distribution/constant/DUserType.java | 45 + .../constant/DistributionAuditStateEnum.java | 57 + .../constant/DistributionAuditingState.java | 57 + .../DistributionUserIncomeStateEnum.java | 65 + .../DistributionWalletBillTypeEnum.java | 37 + .../DistributionWithdrawCashStateEnum.java | 59 + .../constant/EnterprisePayStatus.java | 52 + .../constant/IncomeStateEnum.java | 49 + .../distribution/constant/ParentAwardSet.java | 46 + .../app/DistributionSpuController.java | 48 + .../app/DistributionUserBindController.java | 101 + .../app/DistributionUserController.java | 102 + .../app/DistributionUserIncomeController.java | 84 + .../app/DistributionUserWalletController.java | 85 + .../multishop/DistributionSpuController.java | 102 + .../DistributionAuditingController.java | 96 + .../DistributionUserWalletController.java | 69 + .../dto/AppDistributionWithdrawCashDTO.java | 50 + .../distribution/dto/DistributionSpuDTO.java | 151 + .../dto/DistributionSpuLogDTO.java | 90 + .../distribution/dto/DistributionUserDTO.java | 280 + .../dto/DistributionUserWalletBillDTO.java | 199 + .../distribution/dto/EnterprisePayDTO.java | 151 + ...DistributionUserIncomeFeignController.java | 36 + .../OrderNotifyDistributionConsumer.java | 46 + .../mapper/DistributionSpuBindMapper.java | 68 + .../mapper/DistributionUserBanMapper.java | 66 + .../mapper/DistributionUserBindMapper.java | 106 + .../mapper/DistributionUserIncomeMapper.java | 188 + .../mapper/EnterprisePayMapper.java | 99 + .../model/DistributionSpuLog.java | 104 + .../model/DistributionUserBan.java | 118 + .../model/DistributionUserWallet.java | 146 + .../distribution/model/EnterprisePay.java | 174 + .../service/DistributionMsgService.java | 79 + .../service/DistributionRefundService.java | 26 + .../service/DistributionSpuBindService.java | 56 + .../service/DistributionSpuLogService.java | 56 + .../service/DistributionUserBanService.java | 59 + .../service/DistributionUserBindService.java | 87 + .../DistributionUserIncomeService.java | 170 + .../service/DistributionUserService.java | 150 + .../service/EnterprisePayService.java | 94 + .../impl/DistributionAuditingServiceImpl.java | 201 + .../impl/DistributionOrderServiceImpl.java | 581 + .../impl/DistributionRefundServiceImpl.java | 122 + .../impl/DistributionSpuBindServiceImpl.java | 57 + .../impl/DistributionSpuLogServiceImpl.java | 57 + .../DistributionUserIncomeServiceImpl.java | 510 + ...DistributionUserWalletBillServiceImpl.java | 97 + .../DistributionUserWalletServiceImpl.java | 172 + .../DistributionCommissionSettlementTask.java | 47 + .../distribution/task/EnterprisePayTask.java | 100 + .../vo/AppDistributionWithdrawCashLogVO.java | 58 + .../vo/AppDistributionWithdrawCashVO.java | 153 + .../vo/DistributionAwardDataVO.java | 68 + .../distribution/vo/DistributionSpuLogVO.java | 93 + .../vo/DistributionUserAchievementDataVO.java | 149 + .../vo/DistributionUserAchievementVO.java | 173 + .../vo/DistributionUserBanVO.java | 141 + .../vo/DistributionUserBindVO.java | 165 + .../vo/DistributionUserIncomeVO.java | 248 + .../vo/DistributionUserSimpleInfoVO.java | 94 + .../vo/DistributionUserWalletInfoVO.java | 82 + .../vo/DistributionWithdrawCashVO.java | 154 + .../cloud/live/constant/LiveConstant.java | 34 + .../cloud/live/constant/PlayBackType.java | 47 + .../cloud/live/dto/LiveMessageDTO.java | 89 + .../cloud/live/mapper/LiveRoomProdMapper.java | 72 + .../cloud/live/model/LiveRoomProd.java | 85 + .../service/impl/LiveRoomProdServiceImpl.java | 164 + .../live/socket/LiveUserWebSocketServer.java | 280 + .../tmerclub/cloud/live/util/AliLiveUtil.java | 99 + .../tmerclub/cloud/live/vo/LiveMsgItemVO.java | 161 + .../src/main/resources/logback.xml | 44 + .../main/resources/mapper/CouponMapper.xml | 468 + .../resources/mapper/DiscountProdMapper.xml | 48 + .../mapper/DistributionAuditingMapper.xml | 138 + .../mapper/DistributionSpuBindMapper.xml | 58 + .../mapper/DistributionSpuLogMapper.xml | 50 + .../mapper/DistributionSpuMapper.xml | 114 + .../mapper/DistributionUserBanMapper.xml | 111 + .../mapper/DistributionUserBindMapper.xml | 132 + .../mapper/DistributionUserIncomeMapper.xml | 374 + .../mapper/DistributionUserMapper.xml | 377 + .../DistributionUserWalletBillMapper.xml | 143 + .../mapper/DistributionUserWalletMapper.xml | 137 + .../resources/mapper/EnterprisePayMapper.xml | 91 + .../main/resources/mapper/LiveRoomMapper.xml | 237 + .../tmerclub/cloud/config/XxlJobConfig.java | 67 + .../cloud/constant/DistributedIdKey.java | 139 + .../cloud/delivery/bo/DeliveryAliInfoBO.java | 126 + .../delivery/bo/DeliveryAliItemInfoBO.java | 54 + .../cloud/delivery/bo/StationOrderBO.java | 59 + .../constant/DeliveryCompanyType.java | 183 + .../admin/OrderDeliveryController.java | 61 + .../controller/admin/TransportController.java | 116 + .../controller/app/AreaController.java | 51 + .../controller/app/MyDeliveryController.java | 62 + .../controller/app/TransfeeController.java | 77 + .../app/TransfeeFreeController.java | 33 + .../controller/app/TransportController.java | 33 + .../controller/platform/AreaController.java | 89 + .../platform/StationController.java | 163 + .../supplier/OrderDeliveryController.java | 61 + .../supplier/TransportController.java | 108 + .../cloud/delivery/dto/TranscityFreeDTO.java | 67 + .../cloud/delivery/dto/TransfeeDTO.java | 117 + .../delivery/feign/AreaFeignController.java | 49 + .../feign/SameCityFeignController.java | 37 + .../feign/StationFeignController.java | 43 + .../mapper/DeliveryCompanyMapper.java | 88 + .../mapper/DeliveryOrderItemMapper.java | 77 + .../delivery/mapper/DeliveryOrderMapper.java | 73 + .../delivery/mapper/OutletConfigMapper.java | 88 + .../cloud/delivery/mapper/StationMapper.java | 115 + .../delivery/mapper/TranscityMapper.java | 69 + .../cloud/delivery/model/DeliveryOrder.java | 215 + .../delivery/model/DeliveryOrderItem.java | 130 + .../cloud/delivery/model/Transcity.java | 76 + .../cloud/delivery/model/Transfee.java | 118 + .../cloud/delivery/model/Transport.java | 132 + .../service/DeliveryOrderService.java | 115 + .../delivery/service/OutletConfigService.java | 84 + .../delivery/service/PrinterService.java | 82 + .../delivery/service/SameCityService.java | 61 + .../delivery/service/StationService.java | 143 + .../service/TranscityFreeService.java | 57 + .../delivery/service/TransfeeFreeService.java | 39 + .../impl/DeliveryOrderItemServiceImpl.java | 50 + .../service/impl/PrinterServiceImpl.java | 114 + .../service/impl/StationServiceImpl.java | 527 + .../service/impl/TransportServiceImpl.java | 263 + .../cloud/delivery/vo/DeliveryCompanyVO.java | 118 + .../delivery/vo/DeliveryOrderItemVO.java | 94 + .../cloud/delivery/vo/OutletConfigAddrVO.java | 60 + .../cloud/delivery/vo/OutletConfigInfoVO.java | 86 + .../cloud/delivery/vo/TranscityFreeVO.java | 70 + .../cloud/delivery/vo/TranscityVO.java | 69 + .../cloud/order/bo/OrderVirtualInfoLogBO.java | 139 + .../order/bo/SubmitOrderPayAmountInfoBO.java | 211 + .../order/bo/mongo/MongoAllotOrderBO.java | 257 + .../bo/mongo/MongoOrderVirtualInfoLogBO.java | 128 + .../order/bo/mongo/MongoPurchaseOrderBO.java | 418 + .../bo/mongo/MongoPurchaseOrderItemBO.java | 283 + .../cloud/order/constant/Constant.java | 20 + .../cloud/order/constant/FinanceBizType.java | 62 + .../constant/InterventionRefundType.java | 50 + .../order/constant/OrderExportError.java | 84 + .../constant/PlatformInterventionStatus.java | 62 + .../order/constant/PurchasesStatusEnum.java | 104 + .../cloud/order/constant/RefundApplyType.java | 46 + .../constant/RefundInterventionType.java | 71 + .../cloud/order/constant/RefundStsType.java | 48 + .../cloud/order/constant/RefundType.java | 46 + .../order/constant/SupplierHandleStatus.java | 54 + .../controller/admin/OrderItemController.java | 40 + .../order/controller/app/OrderController.java | 470 + .../app/OrderInvoiceController.java | 123 + .../OrderRefundInterventionController.java | 55 + .../multishop/OrderRefundController.java | 274 + .../multishop/OrderSelfStationController.java | 77 + .../multishop/PurchaseOrderController.java | 264 + .../controller/platform/OrderController.java | 215 + .../platform/OrderFinanceController.java | 47 + .../platform/OrderStatisticsController.java | 92 + .../supplier/OrderInvoiceController.java | 67 + .../supplier/OrderRefundController.java | 201 + .../OrderRefundInterventionController.java | 51 + .../supplier/PurchaseOrderController.java | 197 + .../cloud/order/dto/AllotOrderItemDTO.java | 158 + .../cloud/order/dto/OrderRefundAddrDTO.java | 211 + .../order/dto/OrderRefundInterventionDTO.java | 166 + .../order/dto/app/OrderRefundDeliveryDTO.java | 124 + .../order/dto/app/OrderRefundPageDTO.java | 200 + .../order/dto/multishop/OrderItemDTO.java | 56 + .../order/dto/multishop/OrderRefundDTO.java | 198 + .../feign/AllotOrderFeignController.java | 28 + .../order/feign/OrderAddrFeignController.java | 34 + .../order/feign/OrderFeignController.java | 564 + .../feign/OrderInvoiceFeignController.java | 44 + .../feign/PurchaseOrderFeignController.java | 58 + .../listener/GroupOrderSuccessConsumer.java | 81 + .../order/listener/OrderCancelConsumer.java | 46 + .../order/listener/OrderExcelListener.java | 103 + .../listener/OrderPurchaseFinishConsumer.java | 53 + .../OrderReceiptTransactionListener.java | 76 + .../RefundIntervertionCanalConsumer.java | 55 + .../listener/SeckillOrderCreateConsumer.java | 59 + ...LogPurchaseStorageTransactionListener.java | 83 + .../order/manager/MongoOrderManager.java | 2423 ++ .../manager/MongoOrderRefundManager.java | 877 + .../cloud/order/mapper/AllotOrderMapper.java | 33 + .../order/mapper/OrderItemLangMapper.java | 92 + .../cloud/order/mapper/OrderItemMapper.java | 264 + .../cloud/order/mapper/OrderMapper.java | 395 + .../order/mapper/OrderPreSaleInfoMapper.java | 64 + .../mapper/OrderRefundInterventionMapper.java | 59 + .../mapper/OrderRefundSettlementMapper.java | 77 + .../order/mapper/OrderReturnReasonMapper.java | 57 + .../order/mapper/OrderVirtualInfoMapper.java | 131 + .../order/mapper/PurchaseOrderItemMapper.java | 108 + .../order/mapper/PurchaseOrderLangMapper.java | 31 + .../order/mapper/PurchaseOrderMapper.java | 96 + .../cloud/order/model/AllotOrder.java | 237 + .../com/tmerclub/cloud/order/model/Order.java | 872 + .../cloud/order/model/OrderInvoice.java | 223 + .../cloud/order/model/OrderItemLang.java | 116 + .../cloud/order/model/OrderPreSaleInfo.java | 226 + .../cloud/order/model/OrderRefundAddr.java | 244 + .../cloud/order/model/OrderSelfStation.java | 186 + .../cloud/order/model/PurchaseOrder.java | 269 + .../cloud/order/model/PurchaseOrderItem.java | 238 + .../order/service/AllotOrderService.java | 101 + .../cloud/order/service/OrderAddrService.java | 64 + .../order/service/OrderAllinpayService.java | 18 + .../order/service/OrderAnalysisService.java | 39 + .../order/service/OrderInvoiceService.java | 85 + .../order/service/OrderItemLangService.java | 76 + .../cloud/order/service/OrderItemService.java | 261 + .../service/OrderPreSaleInfoService.java | 63 + .../OrderRefundInterventionService.java | 27 + .../service/OrderRefundSettlementService.java | 57 + .../cloud/order/service/OrderService.java | 348 + .../service/PurchaseOrderAddrService.java | 48 + .../service/PurchaseOrderExcelService.java | 70 + .../order/service/PurchaseOrderService.java | 125 + .../service/impl/OrderAddrServiceImpl.java | 63 + .../impl/OrderAllinpayServiceImpl.java | 44 + .../impl/OrderAnalysisServiceImpl.java | 119 + .../OrderRefundInterventionServiceImpl.java | 69 + .../impl/OrderSettlementServiceImpl.java | 71 + .../impl/OrderVirtualInfoLogServiceImpl.java | 77 + .../impl/PurchaseOrderItemServiceImpl.java | 101 + .../impl/PurchaseOrderLangServiceImpl.java | 51 + .../SupplierOrderStatisticsServiceImpl.java | 334 + .../cloud/order/task/OrderRefundTask.java | 121 + .../tmerclub/cloud/order/task/OrderTask.java | 125 + .../cloud/order/vo/AllotOrderItemVO.java | 156 + .../cloud/order/vo/AllotSpuImportVO.java | 45 + .../order/vo/AllotSpuInboundExcelVO.java | 128 + .../cloud/order/vo/ChooseComboItemVo.java | 117 + .../tmerclub/cloud/order/vo/HotProductVO.java | 95 + .../tmerclub/cloud/order/vo/MyOrderVO.java | 226 + .../cloud/order/vo/OrderAndPreSaleVO.java | 521 + .../cloud/order/vo/OrderDetailVO.java | 89 + .../cloud/order/vo/OrderInvoiceVO.java | 260 + .../order/vo/OrderItemWithAddressVO.java | 58 + .../cloud/order/vo/OrderPayInfoVO.java | 179 + .../cloud/order/vo/OrderRefundAddrVO.java | 214 + .../order/vo/OrderRefundInterventionVO.java | 114 + .../order/vo/OrderRefundSettlementVO.java | 166 + .../cloud/order/vo/OrderRefundVO.java | 913 + .../cloud/order/vo/OrderSettlementVO.java | 131 + .../tmerclub/cloud/order/vo/OrderShopVO.java | 638 + .../cloud/order/vo/PurchaseOrderExcelVO.java | 242 + .../order/vo/PurchaseOrderItemLangVO.java | 80 + .../cloud/order/vo/PurchaseOrderItemVO.java | 306 + .../cloud/order/vo/PurchaseOrderVO.java | 356 + .../cloud/order/vo/ScoreOrderExcelVO.java | 326 + .../vo/mongo/MongoAccountOrderDetailVO.java | 93 + .../MongoAccountOrderRefundDetailVO.java | 93 + .../MongoFinanceOrderRefundDetailVO.java | 218 + .../order/vo/mongo/MongoOrderPayInfoVO.java | 178 + .../mongo/MongoOrderRefundStatisticsVO.java | 350 + .../order/vo/mongo/MongoSpuSoldNumRankVO.java | 54 + .../resources/mapper/AllotOrderMapper.xml | 78 + .../src/main/resources/mapper/AreaMapper.xml | 93 + .../main/resources/mapper/OrderAddrMapper.xml | 79 + .../resources/mapper/OrderItemLangMapper.xml | 87 + .../main/resources/mapper/OrderItemMapper.xml | 532 + .../mapper/OrderRefundAddrMapper.xml | 87 + .../mapper/OrderRefundInterventionMapper.xml | 56 + .../resources/mapper/OrderRefundMapper.xml | 634 + .../mapper/OrderReturnReasonMapper.xml | 49 + .../mapper/OrderSettlementMapper.xml | 132 + .../mapper/PurchaseOrderItemLangMapper.xml | 49 + .../mapper/PurchaseOrderItemMapper.xml | 120 + .../resources/mapper/PurchaseOrderMapper.xml | 349 + .../main/resources/mapper/SameCityMapper.xml | 125 + .../main/resources/mapper/StationMapper.xml | 228 + .../main/resources/mapper/TransfeeMapper.xml | 65 + .../main/resources/mapper/TransportMapper.xml | 160 + tmerclub-payment/Dockerfile | 13 + .../cloud/payment/PaymentApplication.java | 29 + .../cloud/payment/allinpay/AbstractReq.java | 35 + .../cloud/payment/allinpay/OpenClient.java | 265 + .../allinpay/bean/AsynNotiyRequest.java | 114 + .../cloud/payment/allinpay/bean/CustReq.java | 71 + .../payment/allinpay/bean/OpException.java | 20 + .../payment/allinpay/bean/OpenConfig.java | 148 + .../payment/allinpay/bean/OpenRequest.java | 120 + .../allinpay/member/constant/AuditStatus.java | 34 + .../allinpay/member/req/ApplyBindAcct.java | 71 + .../member/req/BankCardChangeBindPhone.java | 135 + .../allinpay/member/req/BindBankCard.java | 84 + .../member/req/BindCompanyAccount.java | 118 + .../allinpay/member/req/GetMemberInfo.java | 24 + .../allinpay/member/req/IdCardCollect.java | 89 + .../member/req/IdCardCollectByFileUpload.java | 134 + .../allinpay/member/req/LockMember.java | 27 + .../allinpay/member/req/SetCompanyInfo.java | 59 + .../allinpay/member/req/SetRealName.java | 85 + .../allinpay/member/req/UnlockMember.java | 27 + .../allinpay/member/req/UpdatePayPwd.java | 106 + .../member/req/UpdatePhoneByPayPwd.java | 145 + .../allinpay/member/resp/AllinpayResp.java | 172 + .../allinpay/member/resp/BankCardBin.java | 20 + .../resp/BankCardChangeBindPhoneResp.java | 87 + .../member/resp/BindBankCardResp.java | 50 + .../allinpay/member/resp/CardBinInfo.java | 118 + .../allinpay/member/resp/CreateMemResp.java | 39 + .../allinpay/member/resp/FileUploadResp.java | 72 + .../member/resp/IdCardCollectResultResp.java | 58 + .../payment/allinpay/member/resp/Result.java | 30 + .../member/resp/SignAcctProtocolResp.java | 72 + .../allinpay/member/resp/UserBaseInfo.java | 85 + .../allinpay/member/resp/UserInfo.java | 256 + .../VerifyBankCardChangeBindPhoneResp.java | 57 + .../order/req/ApplicationCollection.java | 320 + .../order/req/ApplicationTransfer.java | 120 + .../allinpay/order/req/ConsumeApply.java | 275 + .../allinpay/order/req/DepositApply.java | 170 + .../allinpay/order/req/FreezeMoney.java | 65 + .../allinpay/order/req/GetOrderDetail.java | 42 + .../allinpay/order/req/PayByBackSmsReq.java | 103 + .../payment/allinpay/order/req/PayMethod.java | 168 + .../allinpay/order/req/QueryInExpDetail.java | 106 + .../req/QueryOrderSplitRuleListDetail.java | 44 + .../payment/allinpay/order/req/Refund.java | 175 + .../allinpay/order/req/ResendPaySmsReq.java | 43 + .../allinpay/order/req/UnfreezeMoney.java | 65 + .../allinpay/order/req/WithdrawApplyReq.java | 206 + .../allinpay/order/resp/AgentPayResp.java | 101 + .../order/resp/ApplicationTransferResp.java | 47 + .../order/resp/GetOrderStatusResp.java | 99 + .../allinpay/order/resp/InExpDetail.java | 108 + .../allinpay/order/resp/OrderDetailResp.java | 29 + .../allinpay/order/resp/PayByPwdResp.java | 76 + .../order/resp/QueryInExpDetailResp.java | 57 + .../resp/QueryReserveFundBalanceResp.java | 69 + .../allinpay/order/resp/RefundResp.java | 55 + .../allinpay/order/resp/ResendPaySmsResp.java | 56 + .../service/AllinpayMemberService.java | 279 + .../payment/allinpay/util/OpTrustManager.java | 59 + .../payment/allinpay/util/OpenUtils.java | 41 + .../payment/allinpay/util/SecretUtils.java | 321 + .../cloud/payment/allinpay/util/Sm2Utils.java | 72 + .../cloud/payment/allinpay/util/Sm4.java | 151 + .../cloud/payment/bo/PayInfoResultBO.java | 164 + .../cloud/payment/bo/RefundInfoBO.java | 166 + .../cloud/payment/bo/RefundInfoResultBO.java | 97 + .../cloud/payment/config/WxConfig.java | 116 + .../constant/VerificationCodeType.java | 27 + .../controller/AllinpayNoticeController.java | 293 + .../controller/PayNoticeController.java | 129 + .../app/AllinpayMemberController.java | 295 + .../app/AllinpayOrderController.java | 91 + .../multishop/AllinpayCompanyController.java | 225 + .../multishop/AllinpayOrderController.java | 91 + .../multishop/RechargePayController.java | 108 + .../platform/AccountDetailController.java | 109 + .../controller/user/PayController.java | 126 + .../user/RechargePayController.java | 101 + .../cloud/payment/dto/BasePayInfoDTO.java | 92 + .../cloud/payment/dto/IdCardCollectDTO.java | 71 + .../cloud/payment/dto/PayByBackSmsDTO.java | 44 + .../cloud/payment/dto/PayByPwdDTO.java | 68 + .../cloud/payment/dto/PayInfoDTO.java | 47 + .../cloud/payment/dto/SetPayPwdDTO.java | 91 + .../payment/dto/SetRealNameBySmsCodeDTO.java | 44 + .../feign/AllinpayFeignController.java | 379 + .../payment/listener/BalancePayConsumer.java | 63 + .../listener/OpenAllinpayOrderConsumer.java | 76 + .../listener/OrderRefundPaymentConsumer.java | 45 + .../payment/manager/AllinpayManager.java | 454 + .../cloud/payment/manager/PayManager.java | 769 + .../payment/manager/PayNoticeManager.java | 362 + .../payment/mapper/RefundInfoMapper.java | 96 + .../tmerclub/cloud/payment/model/PayInfo.java | 297 + .../cloud/payment/model/RefundInfo.java | 173 + .../payment/service/AllinpayService.java | 264 + .../cloud/payment/service/PayInfoService.java | 248 + .../impl/AllinpayCompanyServiceImpl.java | 393 + .../service/impl/PayInfoServiceImpl.java | 854 + .../service/impl/RefundInfoServiceImpl.java | 440 + .../cloud/payment/vo/PayInfoExcelVO.java | 186 + .../tmerclub/cloud/payment/vo/PayInfoVO.java | 176 + .../src/main/resources/bootstrap.yml | 28 + .../src/main/resources/logback.xml | 44 + .../resources/mapper/RefundInfoMapper.xml | 99 + tmerclub-product/Dockerfile | 13 + tmerclub-product/pom.xml | 97 + .../cloud/product/ProductApplication.java | 27 + .../cloud/product/bo/CategoryRateBO.java | 49 + .../cloud/product/bo/CategoryShopRateBO.java | 60 + .../cloud/product/bo/NeedZoneSkuInfoBO.java | 54 + .../cloud/product/bo/SkuWithStockBO.java | 91 + .../cloud/product/bo/SkuZoneInfoBO.java | 62 + .../product/bo/mongo/MongoSpuBrowseLogBO.java | 142 + .../product/bo/mongo/MongoStockBillLogBO.java | 329 + .../bo/mongo/MongoStockBillLogItemBO.java | 148 + .../product/constant/DistributedIdKey.java | 61 + .../product/constant/SkuZoneConstant.java | 46 + .../product/constant/WriteOfNumEnum.java | 48 + .../controller/admin/SpuController.java | 735 + .../admin/StockChangeReasonController.java | 107 + .../app/SpuBrowseLogController.java | 98 + .../controller/app/SpuCommController.java | 101 + .../multishop/CategoryController.java | 119 + .../multishop/GiveawayController.java | 87 + .../multishop/GiveawaySpuController.java | 60 + .../StockChangeReasonLangController.java | 76 + .../multishop/StockPointSkuController.java | 96 + .../multishop/TakeStockController.java | 129 + .../multishop/TakeStockSpuController.java | 147 + .../controller/platform/BrandController.java | 169 + .../controller/platform/SpuController.java | 103 + .../controller/platform/SpuTagController.java | 167 + .../controller/supplier/BrandController.java | 104 + .../supplier/SpuCommController.java | 60 + .../controller/supplier/SpuController.java | 470 + .../supplier/SpuPriceLogController.java | 79 + .../supplier/SpuStatisticsController.java | 33 + .../cloud/product/dto/AttrCategoryDTO.java | 67 + .../cloud/product/dto/BrandLangDTO.java | 79 + .../cloud/product/dto/CategoryLangDTO.java | 67 + .../cloud/product/dto/GiveawayDTO.java | 217 + .../cloud/product/dto/GiveawaySpuDTO.java | 199 + .../cloud/product/dto/SpuBrowseLogDTO.java | 105 + .../cloud/product/dto/SpuDetailDTO.java | 55 + .../cloud/product/dto/SpuExtensionDTO.java | 140 + .../tmerclub/cloud/product/dto/SpuTagDTO.java | 190 + .../cloud/product/dto/StockBillLogDTO.java | 377 + .../dto/StockChangeReasonStatusDTO.java | 78 + .../cloud/product/dto/TakeStockDTO.java | 207 + .../dto/shopcart/AddShopCartItemsDTO.java | 42 + .../dto/shopcart/CheckShopCartItemDTO.java | 56 + .../product/feign/BrandFeignController.java | 39 + .../feign/BrandShopFeignController.java | 36 + .../feign/CategoryShopFeignController.java | 125 + .../feign/GiveawayFeignController.java | 38 + .../product/feign/SkuFeignController.java | 156 + .../feign/SpuBrowseLogLogFeignController.java | 34 + .../product/feign/SpuCommFeignController.java | 36 + .../feign/TakeStockFeignController.java | 27 + .../feign/WarehouseFeignController.java | 105 + .../listener/OrderNotifyStockConsumer.java | 52 + .../product/listener/SpuExcelListener.java | 95 + .../listener/StockBillLogConsumer.java | 45 + .../product/listener/StockUnlockConsumer.java | 40 + .../SupplierSpuUpdateNotifyConsumer.java | 73 + .../listener/TakeStockSpuExcelListener.java | 92 + .../product/mapper/AttrCategoryMapper.java | 57 + .../cloud/product/mapper/BrandShopMapper.java | 127 + .../product/mapper/CategoryShopMapper.java | 146 + .../cloud/product/mapper/GiveawayMapper.java | 131 + .../product/mapper/ShopCartItemMapper.java | 237 + .../cloud/product/mapper/SkuComboMapper.java | 109 + .../cloud/product/mapper/SkuLangMapper.java | 69 + .../cloud/product/mapper/SkuMapper.java | 338 + .../mapper/SpuAttrValueLangMapper.java | 56 + .../mapper/SpuConsignmentChangeMapper.java | 77 + .../cloud/product/mapper/SpuMapper.java | 652 + .../product/mapper/SpuPriceLogMapper.java | 70 + .../mapper/SpuSkuAttrValueLangMapper.java | 68 + .../mapper/SpuSupplierChangeLogMapper.java | 77 + .../cloud/product/mapper/SpuTagMapper.java | 86 + .../product/mapper/StockBillLogMapper.java | 15 + .../mapper/StockChangeReasonLangMapper.java | 69 + .../product/mapper/StockPointSkuMapper.java | 124 + .../cloud/product/mapper/TakeStockMapper.java | 86 + .../product/mapper/WarehouseAreaMapper.java | 69 + .../cloud/product/mapper/WarehouseMapper.java | 124 + .../cloud/product/model/AttrValueLang.java | 74 + .../tmerclub/cloud/product/model/Brand.java | 185 + .../cloud/product/model/Category.java | 202 + .../cloud/product/model/CategoryBrand.java | 76 + .../cloud/product/model/CategoryShop.java | 116 + .../cloud/product/model/Giveaway.java | 146 + .../cloud/product/model/GiveawaySpu.java | 130 + .../cloud/product/model/SkuCombo.java | 85 + .../cloud/product/model/SkuStockLock.java | 144 + .../cloud/product/model/SkuStockZone.java | 114 + .../cloud/product/model/SpuAttrValueLang.java | 102 + .../cloud/product/model/SpuBrowseLog.java | 118 + .../cloud/product/model/SpuCollection.java | 76 + .../tmerclub/cloud/product/model/SpuComm.java | 289 + .../cloud/product/model/SpuDetail.java | 76 + .../cloud/product/model/SpuSkuAttrValue.java | 160 + .../product/model/SpuSupplierChangeLog.java | 90 + .../model/StockChangeReasonStatus.java | 88 + .../cloud/product/model/TakeStock.java | 170 + .../product/service/AttrCategoryService.java | 45 + .../cloud/product/service/AttrService.java | 96 + .../product/service/AttrValueLangService.java | 77 + .../product/service/BrandLangService.java | 87 + .../product/service/CategoryBrandService.java | 87 + .../product/service/CategoryLangService.java | 76 + .../product/service/GiveawayService.java | 136 + .../product/service/GiveawaySpuService.java | 119 + .../product/service/SkuComboService.java | 90 + .../cloud/product/service/SkuLangService.java | 65 + .../cloud/product/service/SkuService.java | 381 + .../product/service/SkuStockLockService.java | 89 + .../product/service/SkuStockService.java | 163 + .../product/service/SpuBrowseLogService.java | 75 + .../product/service/SpuCollectionService.java | 107 + .../cloud/product/service/SpuCommService.java | 144 + .../product/service/SpuExcelService.java | 71 + .../cloud/product/service/SpuLangService.java | 65 + .../product/service/SpuOfflineService.java | 53 + .../product/service/SpuPriceLogService.java | 59 + .../service/SpuSkuAttrValueLangService.java | 57 + .../product/service/SpuStockService.java | 29 + .../service/StockBillLogItemService.java | 62 + .../product/service/StockPointSkuService.java | 156 + .../SupplierSpuUpdateLaterOperateService.java | 124 + .../product/service/TakeStockService.java | 105 + .../product/service/TakeStockSpuService.java | 101 + .../product/service/WarehouseService.java | 145 + .../service/impl/AttrLangServiceImpl.java | 97 + .../service/impl/AttrValueServiceImpl.java | 262 + .../service/impl/BrandLangServiceImpl.java | 134 + .../service/impl/BrandShopServiceImpl.java | 282 + .../impl/CategoryBrandServiceImpl.java | 199 + .../impl/ImportSupplierSpuServiceImpl.java | 311 + .../service/impl/ShopCartServiceImpl.java | 352 + .../service/impl/SkuComboServiceImpl.java | 84 + .../product/service/impl/SkuServiceImpl.java | 1609 ++ .../service/impl/SkuStockServiceImpl.java | 807 + .../service/impl/SpuCommServiceImpl.java | 745 + .../impl/SpuConsignmentChangeServiceImpl.java | 80 + .../service/impl/SpuDetailServiceImpl.java | 88 + .../service/impl/SpuExcelServiceImpl.java | 1283 + .../service/impl/SpuExtensionServiceImpl.java | 86 + .../service/impl/SpuLangServiceImpl.java | 99 + .../service/impl/SpuOfflineServiceImpl.java | 209 + .../service/impl/SpuPriceLogServiceImpl.java | 59 + .../product/service/impl/SpuServiceImpl.java | 2850 ++ .../impl/SpuSkuAttrValueServiceImpl.java | 157 + .../service/impl/SpuTagServiceImpl.java | 141 + .../impl/StockBillLogItemServiceImpl.java | 489 + .../StockChangeReasonStatusServiceImpl.java | 62 + .../impl/StockPointSkuServiceImpl.java | 283 + ...plierSpuUpdateLaterOperateServiceImpl.java | 528 + .../impl/WarehouseAreaServiceImpl.java | 77 + .../cloud/product/util/StockUtil.java | 121 + .../product/vo/CategoryPlatformExcelVO.java | 178 + .../cloud/product/vo/PlatformSpuExcelVO.java | 518 + .../cloud/product/vo/ShopCartAmountVO.java | 77 + .../cloud/product/vo/SkuStockZoneVO.java | 94 + .../cloud/product/vo/SpuCollectionVO.java | 70 + .../product/vo/SpuConsignmentChangeVO.java | 142 + .../tmerclub/cloud/product/vo/SpuCountVO.java | 93 + .../tmerclub/cloud/product/vo/SpuExcelVO.java | 587 + .../cloud/product/vo/SpuPriceLogVO.java | 152 + .../cloud/product/vo/SpuTagReferenceVO.java | 114 + .../tmerclub/cloud/product/vo/SpuTagVO.java | 177 + .../product/vo/StockBillInLogExcelVO.java | 288 + .../product/vo/StockBillLogItemExcelVO.java | 253 + .../cloud/product/vo/StockBillLogItemVO.java | 212 + .../cloud/product/vo/StockBillLogVO.java | 227 + .../product/vo/StockBillOutLogExcelVO.java | 288 + .../product/vo/StockChangeReasonLangVO.java | 79 + .../product/vo/StockChangeReasonStatusVO.java | 79 + .../cloud/product/vo/SupplierProdExcelVO.java | 421 + .../cloud/product/vo/TakeStockSpuExcelVO.java | 74 + .../product/vo/TakeStockSpuImportVO.java | 44 + .../cloud/product/vo/TakeStockSpuVO.java | 188 + .../cloud/product/vo/WarehouseAreaVO.java | 65 + .../product/vo/mongo/MongoSpuBrowseLogVO.java | 47 + .../vo/mongo/MongoStockBillLogItemVO.java | 284 + .../src/main/resources/bootstrap.yml | 34 + .../resources/mapper/AttrCategoryMapper.xml | 41 + .../resources/mapper/AttrValueLangMapper.xml | 57 + .../main/resources/mapper/AttrValueMapper.xml | 35 + .../main/resources/mapper/BrandLangMapper.xml | 78 + .../src/main/resources/mapper/BrandMapper.xml | 301 + .../main/resources/mapper/BrandShopMapper.xml | 120 + .../resources/mapper/CategoryBrandMapper.xml | 68 + .../main/resources/mapper/CategoryMapper.xml | 281 + .../resources/mapper/ShopCartItemMapper.xml | 418 + .../mapper/SpuAttrValueLangMapper.xml | 47 + .../resources/mapper/SpuAttrValueMapper.xml | 96 + .../main/resources/mapper/SpuLangMapper.xml | 55 + .../resources/mapper/SpuPriceLogMapper.xml | 112 + .../mapper/SpuSkuAttrValueLangMapper.xml | 49 + .../mapper/SpuSkuAttrValueMapper.xml | 49 + .../mapper/SpuSupplierChangeLogMapper.xml | 81 + .../main/resources/mapper/SpuTagMapper.xml | 126 + .../mapper/SpuTagReferenceMapper.xml | 165 + .../mapper/StockChangeReasonLangMapper.xml | 63 + .../mapper/StockChangeReasonMapper.xml | 104 + .../mapper/StockChangeReasonStatusMapper.xml | 48 + .../resources/mapper/StockPointSkuMapper.xml | 138 + .../main/resources/mapper/TakeStockMapper.xml | 187 + .../resources/mapper/TakeStockSpuMapper.xml | 110 + .../cloud/search/SearchApplication.java | 31 + .../com/tmerclub/cloud/search/bo/BrandBO.java | 90 + .../tmerclub/cloud/search/bo/CategoryBO.java | 188 + .../cloud/search/bo/DistributionInfoBO.java | 130 + .../com/tmerclub/cloud/search/bo/OrderBO.java | 610 + .../cloud/search/bo/OrderInvoiceBO.java | 218 + .../cloud/search/bo/OrderRefundBO.java | 607 + .../com/tmerclub/cloud/search/bo/SkuBO.java | 247 + .../cloud/search/bo/SkuStockZoneBO.java | 108 + .../cloud/search/bo/SpuExtensionBO.java | 132 + .../builder/ProductSearchRequestBuilder.java | 893 + .../builder/ProductSearchResponseBuilder.java | 305 + .../cloud/search/canal/CanalGlue.java | 16 + .../cloud/search/canal/DefaultCanalGlue.java | 26 + .../canal/LuckCanalBinLogEventParser.java | 97 + .../LuckCanalBinlogEventProcessorFactory.java | 48 + .../search/canal/annotation/CanalField.java | 43 + .../search/canal/annotation/CanalModel.java | 35 + .../search/canal/common/BinLogEventType.java | 72 + .../canal/common/FieldNamingPolicy.java | 65 + .../search/canal/model/DefaultModelTable.java | 59 + .../cloud/search/canal/model/ModelTable.java | 32 + ...BaseParameterizedTypeReferenceSupport.java | 63 + .../adapter/FastJsonSourceAdapter.java | 37 + .../parser/BasePrimaryKeyTupleFunction.java | 18 + .../parser/BigIntPrimaryKeyTupleFunction.java | 32 + .../canal/support/parser/ColumnMetadata.java | 40 + .../parser/DefaultCanalBinLogEventParser.java | 76 + .../parser/ModelTableMetadataManager.java | 18 + .../converter/BaseCanalFieldConverter.java | 77 + .../converter/BigIntCanalFieldConverter.java | 27 + .../converter/CanalFieldConvertInput.java | 89 + .../converter/IntCanalFieldConverter.java | 27 + .../converter/NullCanalFieldConverter.java | 27 + .../TimestampCanalFieldConverter0.java | 28 + .../converter/TinyIntCanalFieldConverter.java | 27 + .../converter/VarcharCanalFieldConverter.java | 27 + .../CanalBinlogEventProcessorFactory.java | 28 + .../search/canal/util/CollectionUtils.java | 25 + .../search/canal/util/ReflectionUtils.java | 97 + .../cloud/search/config/RocketMqConfig.java | 67 + .../cloud/search/constant/EsConstant.java | 215 + .../search/constant/EsProductSortEnum.java | 178 + .../search/constant/EsSupplierSpuStatus.java | 43 + .../admin/OrderRefundSearchController.java | 77 + .../app/ProductSearchController.java | 159 + .../multishop/AllotOrderSearchController.java | 39 + .../WalletLogOperationController.java | 193 + .../supplier/AllotOrderSearchController.java | 39 + .../supplier/OrderSearchController.java | 69 + .../supplier/ProductSearchController.java | 157 + .../PurchaseOrderSearchController.java | 67 + .../search/feign/EsOrderFeignController.java | 113 + .../SearchOrderRefundFeignController.java | 37 + .../SearchOrderRefundTaskFeignController.java | 274 + .../SearchPurchaseOrderFeignController.java | 49 + .../listener/AllotOrderCanalListener.java | 52 + ...nalBinlogEventThrowExceptionProcessor.java | 30 + .../search/listener/BaseCanalListener.java | 72 + .../listener/OrderRefundCanalListener.java | 75 + .../listener/PurchaseOrderCanalListener.java | 75 + .../listener/ShopDetailCanalListener.java | 60 + .../search/listener/SkuCanalListener.java | 73 + .../manager/AllotOrderSearchManager.java | 217 + .../manager/OrderRefundSearchManager.java | 526 + .../search/manager/OrderSearchManager.java | 1005 + .../search/manager/ProductOperateManager.java | 63 + .../search/manager/ProductSearchManager.java | 657 + .../manager/PurchaseOrderSearchManager.java | 366 + .../src/main/resources/bootstrap.yml | 28 + tmerclub-seckill/Dockerfile | 13 + .../cloud/seckill/SeckillApplication.java | 29 + .../cloud/seckill/config/RedisConfig.java | 9 + .../cloud/seckill/config/RocketMqConfig.java | 58 + .../seckill/constant/DistributedIdKey.java | 25 + .../seckill/constant/SeckillConstant.java | 34 + .../constant/SuitableProdTypeEnum.java | 40 + .../controller/admin/SeckillController.java | 278 + .../app/SeckillCategoryController.java | 49 + .../platform/SeckillTimeController.java | 60 + .../cloud/seckill/dto/SeckillCategoryDTO.java | 80 + .../seckill/dto/app/SeckillOrderDTO.java | 59 + .../seckill/feign/SeckillFeignController.java | 188 + .../listener/OrderNotifySeckillConsumer.java | 49 + .../seckill/manager/SeckillCacheManager.java | 91 + .../cloud/seckill/mapper/SeckillMapper.java | 198 + .../cloud/seckill/model/SeckillCategory.java | 77 + .../cloud/seckill/model/SeckillSku.java | 115 + .../service/SeckillCategoryService.java | 69 + .../seckill/service/SeckillOrderService.java | 47 + .../cloud/seckill/service/SeckillService.java | 227 + .../seckill/service/SeckillSkuService.java | 131 + .../service/impl/SeckillOrderServiceImpl.java | 204 + .../service/impl/SeckillServiceImpl.java | 676 + .../cloud/seckill/vo/AppSeckillSpuVO.java | 167 + .../cloud/seckill/vo/AppSeckillVO.java | 69 + .../cloud/seckill/vo/SeckillAdminVO.java | 129 + .../cloud/seckill/vo/SeckillConfigVO.java | 58 + .../tmerclub/cloud/seckill/vo/SeckillVO.java | 276 + .../src/main/resources/bootstrap.yml | 28 + .../mapper/SeckillCategoryMapper.xml | 74 + .../resources/mapper/SeckillSkuMapper.xml | 109 + tmerclub-user/Dockerfile | 13 + .../cloud/user/bo/CategoryLinkBO.java | 54 + .../user/bo/mongo/MongoUserBalanceLogBO.java | 212 + .../user/bo/mongo/MongoUserScoreLogBO.java | 137 + .../cloud/user/config/RocketMqConfig.java | 91 + .../config/ThreadPoolConfigProperties.java | 61 + .../cloud/user/config/XxlJobConfig.java | 67 + .../cloud/user/constant/DistributedIdKey.java | 31 + .../cloud/user/constant/FreeFeeTypeEnum.java | 38 + .../user/constant/GrowthLogSourceEnum.java | 51 + .../cloud/user/constant/OrderSortEnum.java | 128 + .../user/constant/PopupPageTypeEnum.java | 63 + .../user/constant/PopupUserTypeEnum.java | 58 + .../user/constant/RecruitStatusEnum.java | 39 + .../cloud/user/constant/RightsTypeEnum.java | 58 + .../cloud/user/constant/ScoreIoTypeEnum.java | 49 + .../cloud/user/constant/ScoreLogTypeEnum.java | 95 + .../cloud/user/constant/SexTypeEnum.java | 54 + .../cloud/user/constant/TagTypeEnum.java | 53 + .../cloud/user/constant/UserStatusEnum.java | 56 + .../app/ThirdApiAbutmentController.java | 85 + .../app/UserBalancePayController.java | 78 + .../user/controller/app/UserController.java | 201 + .../app/UserExtensionController.java | 59 + .../app/UserRechargeController.java | 106 + .../app/UserRegisterController.java | 79 + .../controller/app/UserScoreController.java | 213 + .../platform/CostPerPopupController.java | 167 + .../platform/UserRechargeController.java | 106 + .../platform/UserRightsController.java | 107 + .../platform/UserTagController.java | 149 + .../platform/UserTagUserController.java | 47 + .../user/converter/UserStatusConverter.java | 49 + .../cloud/user/dto/CostPerPopupDTO.java | 228 + .../cloud/user/dto/RechargeCouponDTO.java | 297 + .../tmerclub/cloud/user/dto/ScoreDataDto.java | 220 + .../cloud/user/dto/ShopCustomerDTO.java | 199 + .../cloud/user/dto/ShopCustomerExcelDTO.java | 87 + .../tmerclub/cloud/user/dto/UserAddrDTO.java | 199 + .../tmerclub/cloud/user/dto/UserAdminDTO.java | 126 + .../user/dto/UserBalanceRechargeOrderDTO.java | 54 + .../com/tmerclub/cloud/user/dto/UserDTO.java | 157 + .../tmerclub/cloud/user/dto/UserExcelDTO.java | 215 + .../cloud/user/dto/UserExtensionDTO.java | 176 + .../cloud/user/dto/UserGrowthLogDTO.java | 103 + .../tmerclub/cloud/user/dto/UserLevelDTO.java | 144 + .../cloud/user/dto/UserLevelLogDTO.java | 243 + .../user/dto/UserLevelRechargeOrderDTO.java | 54 + .../cloud/user/dto/UserLevelRightsDTO.java | 67 + .../cloud/user/dto/UserRechargeCouponDTO.java | 67 + .../cloud/user/dto/UserRechargeDTO.java | 140 + .../cloud/user/dto/UserRightsCouponDTO.java | 67 + .../cloud/user/dto/UserRightsDTO.java | 200 + .../tmerclub/cloud/user/dto/UserTagDTO.java | 536 + .../cloud/user/dto/UserTagUserDTO.java | 67 + .../cloud/user/dto/UserWithDrawDTO.java | 82 + .../user/feign/PopupFeignController.java | 67 + .../user/feign/UserAddrFeignController.java | 48 + .../feign/UserConsigneeFeignController.java | 45 + .../feign/UserExtensionFeignController.java | 41 + .../cloud/user/feign/UserFeignController.java | 233 + .../feign/UserLevelLogFeignController.java | 70 + .../feign/UserScoreLockFeignController.java | 36 + .../user/feign/UserTagFeignController.java | 51 + .../listener/AddUserBalanceLogConsumer.java | 40 + .../listener/AddUserScoreLogConsumer.java | 41 + .../AllinpayBalancePaySuccessConsumer.java | 59 + .../OrderRefundSuccessGrowthConsumer.java | 53 + .../user/listener/UserExcelListener.java | 103 + .../user/listener/UserGrowthConsumer.java | 34 + .../user/listener/UserRegisterConsumer.java | 59 + .../cloud/user/mapper/CostPerPopupMapper.java | 121 + .../cloud/user/mapper/ShopCustomerMapper.java | 55 + .../user/mapper/UserBalanceLogMapper.java | 32 + .../user/mapper/UserConsigneeMapper.java | 52 + .../user/mapper/UserExtensionMapper.java | 258 + .../cloud/user/mapper/UserMapper.java | 272 + .../cloud/user/mapper/UserRechargeMapper.java | 72 + .../user/mapper/UserRightsCouponMapper.java | 80 + .../user/mapper/UserScoreLockMapper.java | 98 + .../cloud/user/mapper/UserTagMapper.java | 81 + .../cloud/user/mapper/UserTagUserMapper.java | 116 + .../cloud/user/model/ShopCustomer.java | 172 + .../com/tmerclub/cloud/user/model/User.java | 200 + .../cloud/user/model/UserBalanceLog.java | 202 + .../cloud/user/model/UserConsignee.java | 87 + .../cloud/user/model/UserGrowthLog.java | 118 + .../cloud/user/model/UserLevelLog.java | 241 + .../cloud/user/model/UserRecharge.java | 146 + .../tmerclub/cloud/user/model/UserRights.java | 216 + .../cloud/user/model/UserScoreLock.java | 118 + .../cloud/user/model/UserScoreLog.java | 116 + .../cloud/user/model/UserWithdrawCash.java | 148 + .../user/service/CostPerPopupService.java | 154 + .../user/service/PopupUserLogService.java | 43 + .../user/service/UserConsigneeService.java | 49 + .../user/service/UserGrowthLogService.java | 91 + .../user/service/UserLevelTermService.java | 101 + .../user/service/UserRightsCouponService.java | 56 + .../cloud/user/service/UserRightsService.java | 102 + .../user/service/UserScoreLogService.java | 126 + .../cloud/user/service/UserService.java | 281 + .../user/service/UserTagUserService.java | 118 + .../user/service/UserWithdrawCashService.java | 69 + .../service/impl/CostPerPopupServiceImpl.java | 589 + .../impl/ThirdApiAbutmentServiceImpl.java | 158 + .../impl/UserExtensionServiceImpl.java | 501 + .../service/impl/UserLevelServiceImpl.java | 1617 ++ .../impl/UserScoreLockServiceImpl.java | 355 + .../user/service/impl/UserServiceImpl.java | 732 + .../service/impl/UserTagUserServiceImpl.java | 169 + .../impl/UserWithdrawCashServiceImpl.java | 215 + .../cloud/user/task/AllinpayTask.java | 61 + .../tmerclub/cloud/user/task/PopupTask.java | 50 + .../tmerclub/cloud/user/task/ScoreTask.java | 109 + .../cloud/user/vo/CostPerPopupVO.java | 200 + .../tmerclub/cloud/user/vo/PopupRelateVO.java | 114 + .../cloud/user/vo/ScoreCompleteConfigVO.java | 143 + .../tmerclub/cloud/user/vo/ScoreDataVO.java | 247 + .../cloud/user/vo/ShopCustomerExcelVO.java | 119 + .../cloud/user/vo/ShopCustomerVO.java | 174 + .../tmerclub/cloud/user/vo/SysConfigVO.java | 78 + .../cloud/user/vo/UserExtensionVO.java | 246 + .../cloud/user/vo/UserLevelLogVO.java | 229 + .../cloud/user/vo/UserLevelTermVO.java | 117 + .../tmerclub/cloud/user/vo/UserLevelVO.java | 225 + .../cloud/user/vo/UserMemberInfoVO.java | 153 + .../cloud/user/vo/UserRightsCouponVO.java | 69 + .../tmerclub/cloud/user/vo/UserRightsVO.java | 240 + .../cloud/user/vo/UserScoreLogVO.java | 188 + .../cloud/user/vo/UserSimpleInfoVO.java | 53 + .../tmerclub/cloud/user/vo/UserTagUserVO.java | 69 + .../com/tmerclub/cloud/user/vo/UserTagVO.java | 371 + .../cloud/user/vo/UserWithdrawCashVO.java | 93 + .../vo/mongo/MongoBalanceUserPayInfoVO.java | 178 + .../vo/mongo/MongoScoreUserManagerVO.java | 45 + tmerclub-user/src/main/resources/logback.xml | 44 + .../resources/mapper/CostPerPopupMapper.xml | 189 + .../resources/mapper/PopupRelateMapper.xml | 37 + .../resources/mapper/ShopCustomerMapper.xml | 53 + .../resources/mapper/UserBalanceLogMapper.xml | 28 + .../resources/mapper/UserExtensionMapper.xml | 453 + .../resources/mapper/UserGrowthLogMapper.xml | 85 + .../main/resources/mapper/UserLevelMapper.xml | 235 + .../mapper/UserRechargeCouponMapper.xml | 74 + .../resources/mapper/UserRechargeMapper.xml | 87 + .../mapper/UserRightsCouponMapper.xml | 57 + .../resources/mapper/UserRightsMapper.xml | 135 + .../mapper/UserScoreGetLogMapper.xml | 181 + .../resources/mapper/UserScoreLogMapper.xml | 24 + .../resources/mapper/UserTagUserMapper.xml | 81 + 1813 files changed, 276615 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 db/2023-08-28商品库存警告字段为空更新.sql create mode 100644 db/2023-09-18 退款订单新增字段.sql create mode 100644 db/2023-09-25 dubbo和spring cloud名命空间隔离.sql create mode 100644 db/2023-10-30 虚拟核销记录.sql create mode 100644 db/2023-11-13 整合leaf模块.sql create mode 100644 db/2023-11-20 拼团订单搬迁到mongodb(看注释).sql create mode 100644 db/2023-11-27-文件上传优化.sql create mode 100644 db/2023-12-04 优惠券纯redis改造.sql create mode 100644 db/2023-12-18 去除dubbo默认异常处理过滤器.sql create mode 100644 db/2024-01-08 1.升级shardingSphere(看注释!!).sql create mode 100644 db/2024-01-08 2.库存和组合商品修改(看注释).sql create mode 100644 db/2024-01-08 3.库存和组合商品修改(大sql).sql create mode 100644 db/2024-01-15 分库分表改为默认单库50表.sql create mode 100644 db/stock-vue3更新.sql create mode 100644 es/2023-10-16-订单退款平台介入字段.md create mode 100644 es/2023-12-18-商品名称模糊搜索字段.md create mode 100644 pom.xml create mode 100644 system-test/pom.xml create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/AddrApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/GiveawayApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/PayApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/ProductApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/MemberShipApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/UserLoginApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/ComboApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/DiscountApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/GiveawayApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/GroupApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/LiveApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/MyOrderApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/OrderApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/OrderRefundApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/SettlementApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/ShopCartApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/StationApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/PlatformTransportApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/PlatformWalletApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/ScoreProductApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/UserLevelApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/UserRightsApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/SameCityApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopNoticeApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopWalletApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierOrderApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierProductApi.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/OfflineHandleEventDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/PreSaleSpuData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/CouponData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/LiveData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/SeckillData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderAdminDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderRefundDeliveryDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderSelfStationDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/ShopOrderRefundDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/SpuCommDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/SubmitOrderDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/WalletAssert.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/DeliveryScoreOrderDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/UserLevelDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/UserRightsDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/SameCityDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/ShopStationDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/SpuPageSearchDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/supplier/SupplierOrderRefundDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/supplier/SupplierProductData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/data/supplier/SupplierRefundAddrDtoData.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/amount/FreightTest.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/amount/MemberAmountTest.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/ComboTest.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/CouponTest.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/DistributionProdTest.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/GiveawayTest.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/GroupTest.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/LiveTest.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/OrderRefund.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/SupplierOrderTest.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/TransFeeFreesOrderTest.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/VirtualOrderTest.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/store/ConsignmentManagementTest.java create mode 100644 system-test/src/main/java/com/mall4j/cloud/systemtest/test/store/ProductTest.java create mode 100644 system-test/src/main/resources/Marketing.xml create mode 100644 system-test/src/main/resources/ProductTest.xml create mode 100644 system-test/src/main/resources/SupplierOrderTest.xml create mode 100644 tmerclub-admin/Dockerfile create mode 100644 tmerclub-admin/pom.xml create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/config/RocketMqConfig.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/HomeStatus.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/HotSearchType.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/IsDefault.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWalletAmountType.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWalletIoType.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/IndexImgController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/NoticeController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopCompanyController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopDetailController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopOfflineHandleEventController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopRenovationUpDelController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopTemplateController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopWithdrawCashController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/IndexImgController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/NoticeController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ApplyShopUserController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopApplyController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopCompanyController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopUserController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/CompanyAuditingController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopCompanyController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/supplier/ApplyShopUserController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/AllinpayRechargeDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/IndexImgDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/NoticeDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopAuditingDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopCompanyDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopDetailDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopRechargeInfoDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopSigningInfoDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopUserDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopUserRegisterDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWalletDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/UsernameAndPasswordDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/IndexImgFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopDetailFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopRefundAddrController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopSubstituteSalesFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopWalletLogFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/WalletLogOperationFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OpenAllinpayShopConsumer.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderPreSaleSettlementShopConsumer.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderReceiptShopByAllinpayConsumer.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/RechargeNotifyConsumer.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/CompanyAuditingMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/HotSearchMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/IndexImgMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopAuditingMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopBankCardMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopCollectionMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopExtensionMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopRefundAddrMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopWalletMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/HotSearch.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopBankCard.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopCompany.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopRefundAddr.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopRenovation.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopSubstituteSales.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopTemplate.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopUser.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopWalletLog.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopWithdrawCash.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/IndexImgService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopApplyService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopAuditingService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopRechargeService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopRenovationService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopTemplateService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopWalletLogService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/IndexImgServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/NoticeServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopAllinpayServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopApplyServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopDetailServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopExtensionServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopRenovationServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopSubstituteSalesServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopTemplateServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopUserAccountServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/UserCollectionShopServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/IndexImgVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/NoticeVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopAuditingInfoVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopAuditingVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopCompanyAuditingVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopCompanyVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopExtensionVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopTemplateVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopUserSimpleVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopUserVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWalletVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWithdrawCashVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/PublicBankController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/SysConfigController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/SysUserAccountController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/WebConfigController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/multishop/OfflineHandleEventController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/DistributionConfigController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/GrowthConfigController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/SysAccessKeyController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/SysConfigController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/ChangeAccountDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/GrowthConfigDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/OfflineHandleEventItemDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/ScoreConfigDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/ScoreExpireConfigDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/SysAccessKeyDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/SysUserDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/ConfigFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/OfflineHandleEventFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/SysAccessKeyFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/OfflineHandleEventMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysUserMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/WebConfigMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/OfflineHandleEventItem.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysAccessMenu.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysAccessMenuPermission.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/WebConfig.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/OfflineHandleEventService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysConfigService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysUserAccountService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysUserService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/OfflineHandleEventItemServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysAccessKeyServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysConfigServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysUserServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/WebConfigServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/DistributionConfigVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/DistributionRecruitConfigVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/ScoreExpireConfigVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/SysConfigVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/SysUserSimpleVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/WebConfigVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/HotSearchType.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/IsDefault.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWalletChangeReason.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWalletIoType.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/admin/SupplierCompanyController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/multishop/ShopPurchaseAmountLogController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/multishop/SupplierDetailController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/CompanyAuditingController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierBankCardController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierCompanyController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierDetailController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/CompanyAuditingController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierApplyController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierBankCardController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierDetailController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierPurchaseAmountLogController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierRefundAddrController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierUserController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierWithdrawCashController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/AllinpaySupplierWithdrawCashDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/AuditingSupplierInfoDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierBankCardDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierCreateInfoDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierExtensionDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierUserDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWalletDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWalletLogDTO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierDetailFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierRefundAddrFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierUserFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierWalletFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierWalletLogOperationFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierWithdrawCashFeignController.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OrderNotifySupplierConsumer.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OrderRefundSettlementSupplierConsumer.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OrderRefundSupplierConsumer.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierCompanyMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierDetailMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierUserMapper.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierDetail.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierUser.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierWallet.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierWalletLog.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierWithdrawCash.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mongo/MongoPurchaseAmountLogBO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/PurchaseAmountLogService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierApplyService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierAuditingService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierCompanyAuditingService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierCompanyService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierDetailService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierRefundAddrService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierUserAccountService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierUserService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierWalletLogService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierWalletService.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierAuditingServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierDetailServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierUserAccountServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierUserServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierWalletLogServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierWithdrawCashServiceImpl.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/PurchaseAmountLogShopExcelVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierAuditingVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierBankCardVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierCompanyAuditingVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierCompanyVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierDetailVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierRefundAddrVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierStatusInfoVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierUserSimpleVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierWithdrawCashVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/mongo/MongoPurchaseAmountLogVO.java create mode 100644 tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/mongo/MongoSupplierWalletLogVO.java create mode 100644 tmerclub-admin/src/main/resources/bootstrap.yml create mode 100644 tmerclub-admin/src/main/resources/mapper/CompanyAuditingMapper.xml create mode 100644 tmerclub-admin/src/main/resources/mapper/OfflineHandleEventMapper.xml create mode 100644 tmerclub-admin/src/main/resources/mapper/PublicBankMapper.xml create mode 100644 tmerclub-admin/src/main/resources/mapper/ShopAuditingMapper.xml create mode 100644 tmerclub-admin/src/main/resources/mapper/ShopExtensionMapper.xml create mode 100644 tmerclub-admin/src/main/resources/mapper/ShopSubstituteSalesMapper.xml create mode 100644 tmerclub-admin/src/main/resources/mapper/ShopWithdrawCashMapper.xml create mode 100644 tmerclub-admin/src/main/resources/mapper/SupplierBankCardMapper.xml create mode 100644 tmerclub-admin/src/main/resources/mapper/SupplierCompanyAuditingMapper.xml create mode 100644 tmerclub-admin/src/main/resources/mapper/SupplierCompanyMapper.xml create mode 100644 tmerclub-admin/src/main/resources/mapper/SupplierRefundAddrMapper.xml create mode 100644 tmerclub-admin/src/main/resources/mapper/SupplierUserMapper.xml create mode 100644 tmerclub-admin/src/main/resources/mapper/SupplierWalletMapper.xml create mode 100644 tmerclub-admin/src/main/resources/mapper/WebConfigMapper.xml create mode 100644 tmerclub-api/tmerclub-api-admin/pom.xml create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/bo/ShopSimpleBO.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopDetailFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopRefundAddrFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopSubstituteSalesFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/WalletLogOperationFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/AllinpayRechargeVO.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopBankCardVO.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/constant/OfflineHandleEventStatus.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/constant/WithdrawFrequency.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/dto/OfflineHandleEventDTO.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/feign/ConfigFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/DistributionConfigApiVO.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/DistributionConfigSpuVO.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/OfflineHandleEventItemVO.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/SysUserVO.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/constant/SupplierStatus.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierUserFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierWalletFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierWithdrawCashFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierApiDetailVO.java create mode 100644 tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierApiRefundAddrVO.java create mode 100644 tmerclub-api/tmerclub-api-auth/pom.xml create mode 100644 tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/bo/LoginInfoBO.java create mode 100644 tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/bo/UidInfoBO.java create mode 100644 tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/constant/SysTypeEnum.java create mode 100644 tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/AuthAccountDTO.java create mode 100644 tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/SysAccessKeyDTO.java create mode 100644 tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/UserRegisterExtensionDTO.java create mode 100644 tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/AuthSocialFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/TokenFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/vo/AuthSocialVO.java create mode 100644 tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/vo/TokenInfoVO.java create mode 100644 tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/dto/UserRoleDTO.java create mode 100644 tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/feign/PermissionFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-biz/src/main/java/com/tmerclub/cloud/api/biz/feign/AttachFileFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-biz/src/main/java/com/tmerclub/cloud/api/biz/vo/ResourcesInfoVO.java create mode 100644 tmerclub-api/tmerclub-api-flow/src/main/java/com/tmerclub/cloud/api/flow/feign/FlowFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-flow/src/main/java/com/tmerclub/cloud/api/flow/vo/UserAnalysisVO.java create mode 100644 tmerclub-api/tmerclub-api-group/pom.xml create mode 100644 tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/bo/GroupOrderNotifyBO.java create mode 100644 tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/feign/GroupFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/vo/GroupActivityVO.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/vo/ChooseComboItemVo.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/CouponProdType.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/CouponType.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/BindCouponDTO.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/ChooseCouponDTO.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/LockCouponDTO.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/PlatformChooseCouponDTO.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/ReceiveCouponDTO.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/feign/CouponOrderFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/vo/CouponDataVO.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/vo/CouponUserApiVO.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/constant/DiscountRule.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/feign/DiscountFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/vo/DiscountSumVO.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/bo/DistributionNotifyOrderAndShopBO.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/bo/DistributionSpuBO.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/bo/DistributionUserUpdateBO.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/vo/DistributionUserIncomeApiVO.java create mode 100644 tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/live/feign/LiveFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/DeliveryOrderDTO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/StationSalesDTO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/AreaFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/DeliveryFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/SameCityFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryOrderFeignVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryOrderItemFeignVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/SameCityVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/StationVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsAllotOrderBO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsOrderInvoiceBO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsOrderRefundItemBO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsPurchaseOrderItemBO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/BuyerReasonType.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/OrderStatus.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/TimeTypeEnum.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/FlowOrderItemDTO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/QueryOrderDTO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/AllotOrderFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderCommFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderInvoiceFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderRefundFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderSelfStationFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/PurchaseOrderFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/manager/ConfirmOrderManager.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/manager/SubmitOrderManager.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/CustomerRetainVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/FlowOrderItemVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/FlowOrderVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/GroupInfoVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderPayInfoVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderProdEffectRespVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundSimpleVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderSettlementSimpleVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/PageShopAccountOrderVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/PurchaseOrderAddrVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/ShopAccountOrderDetailVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/ShopAmountVO.java create mode 100644 tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/SumAmountVO.java create mode 100644 tmerclub-api/tmerclub-api-payment/pom.xml create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/CompanyBasicInfo.java create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/CompanyInfo.java create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/IdCardCollectByFileUploadResp.java create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/IdCardCollectResp.java create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/DepositApplyResp.java create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/PayByBackSmsResp.java create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/QueryBalanceResp.java create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/WithdrawApplyResp.java create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/BindCompanyAccountDTO.java create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/OrderPayInfoDTO.java create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/UpdateCompanyInfoDTO.java create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/feign/PaymentFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/AccountDetailVO.java create mode 100644 tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/ShopAccountDetailVO.java create mode 100644 tmerclub-api/tmerclub-api-product/pom.xml create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/SkuStockLockBO.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/SpuSimpleBO.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/BrandShopDTO.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/CategoryShopDTO.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/SpuUpdateDTO.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/WarehouseDTO.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/BrandShopFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/CategoryFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/GiveawayFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/ShopCartFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuStockFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SpuBrowseLogFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SpuCommFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/StockPointFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/manager/ShopCartAdapter.java create mode 100644 tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/util/ProductLangUtil.java create mode 100644 tmerclub-api/tmerclub-api-search/pom.xml create mode 100644 tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/constant/EsRenovationProductSortEnum.java create mode 100644 tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/dto/PurchaseOrderUpdateDTO.java create mode 100644 tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/EsOrderFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderRefundTaskFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderTaskFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchPurchaseOrderFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchSpuFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-seckill/src/main/java/com/tmerclub/cloud/api/seckill/dto/SecKillRefundDTO.java create mode 100644 tmerclub-api/tmerclub-api-seckill/src/main/java/com/tmerclub/cloud/api/seckill/feign/SeckillFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-user/pom.xml create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/BalanceRefundBO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/RechargeNotifyBO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserOrderStatisticBO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserOrderStatisticListBO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserScoreBO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/MemberReqDTO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/UserScoreLockDTO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/PopupFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserAddrFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserBalanceLogFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserLevelAndScoreOrderFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserLevelLogFeignClient.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/FinanceDetailExcelVO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/FinanceDetailVO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberContributeValueVO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberDealRespVO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberDealTreadVO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberTrendRespVO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserApiVO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserManagerVO.java create mode 100644 tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserTagApiVO.java create mode 100644 tmerclub-auth/pom.xml create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/AuthApplication.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/adapter/CaptchaCacheServiceRedisImpl.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/config/CaptchaConfig.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/config/RocketMqConfig.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/constant/AuthAccountStatusEnum.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/JsapiSignatureController.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/LoginController.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/StationLoginController.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/TokenController.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/WxMnpController.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/BindSocialDTO.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/CaptchaAuthenticationDTO.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/feign/AccountFeignController.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/manager/PasswordManager.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/mapper/AuthAccountMapper.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/mapper/AuthSocialMapper.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/model/AuthAccount.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/model/AuthSocial.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/AuthSocialService.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/impl/AuthAccountServiceImpl.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/impl/AuthSocialServiceImpl.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/controller/MenuPermissionController.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/controller/RoleController.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/MenuDTO.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/MenuWithPermissionIdDTO.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/RoleDTO.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/feign/PermissionFeignController.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/MenuPermissionMapper.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/RoleMenuMapper.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/UserRoleMapper.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/RoleMenu.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/MenuService.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/RoleService.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/impl/RoleServiceImpl.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuPermissionVO.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuSimpleVO.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuVO.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/RoleVO.java create mode 100644 tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/RouteVO.java create mode 100644 tmerclub-auth/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService create mode 100644 tmerclub-auth/src/main/resources/captcha/original/2.png create mode 100644 tmerclub-auth/src/main/resources/captcha/original/3.png create mode 100644 tmerclub-auth/src/main/resources/captcha/original/6.png create mode 100644 tmerclub-auth/src/main/resources/captcha/slidingBlock/2.png create mode 100644 tmerclub-auth/src/main/resources/captcha/slidingBlock/3.png create mode 100644 tmerclub-auth/src/main/resources/logback.xml create mode 100644 tmerclub-auth/src/main/resources/mapper/AuthSocialMapper.xml create mode 100644 tmerclub-auth/src/main/resources/mapper/RoleMapper.xml create mode 100644 tmerclub-biz/Dockerfile create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/config/AwsS3Config.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/config/WxConfig.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/constant/NotifyType.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/AttachFileController.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/NotifyLogController.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/AttachFileController.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/NotifyTemplateRemindController.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/multishop/AttachFileController.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/multishop/SmsController.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/platform/NotifyLogController.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/supplier/AttachFileController.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/AttachFileDTO.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyLogDTO.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyTemplateDTO.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyTemplateTagDTO.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/QrcodeTicketDTO.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendOrderToPurchaseNotifyToShopConsumer.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/AttachFileMapper.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyTemplateRemindMapper.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/QrcodeTicketMapper.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/AttachFile.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/AttachFileGroup.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplate.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplateRemind.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/QrcodeTicket.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/AttachFileService.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateRemindService.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateService.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateTagService.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/AttachFileServiceImpl.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyLogServiceImpl.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateServiceImpl.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateShopServiceImpl.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/QrcodeTicketServiceImpl.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/SendMessageServiceImpl.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/SmsLogServiceImpl.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/AttachFileGroupVO.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyTemplateVO.java create mode 100644 tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/SmsCodeTemplateVO.java create mode 100644 tmerclub-biz/src/main/resources/logback.xml create mode 100644 tmerclub-biz/src/main/resources/mapper/AttachFileMapper.xml create mode 100644 tmerclub-biz/src/main/resources/mapper/NotifyLogMapper.xml create mode 100644 tmerclub-biz/src/main/resources/mapper/NotifyTemplateTagMapper.xml create mode 100644 tmerclub-biz/src/main/resources/mapper/NoyifyTemplateRemindMapper.xml create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/adapter/CacheTtlAdapter.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/AofRedisBO.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/CacheNameWithTtlBO.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/MultiDecrementBO.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/MultiRedisBO.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/config/AofRedisConfig.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/BizCacheNames.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/ConfigCacheNames.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/CouponCacheNames.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/DiscountCacheNames.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/FlowCacheNames.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/LuaOperateEnum.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/OauthCacheNames.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/PlatformCacheNames.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/ProductCacheNames.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/UserCacheNames.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/enums/MultiStockEnum.java create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/DecrementStock.lua create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/ReturnStock.lua create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/SeckillSkuStock.lua create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/SeckillSkuStockMerge.lua create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/coupon/DecrementCouponStock.lua create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/coupon/ReturnCouponStock.lua create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/SkuStock.lua create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/allot/AllotReduceLockStock.lua create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/order/OrderMakerUseStock.lua create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/order/OrderStock.lua create mode 100644 tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/purchase/PurchaseReduceLuckStock.lua create mode 100644 tmerclub-common/tmerclub-common-core/pom.xml create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Alipay.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Allinpay.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/BmapPoint.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Domain.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/QuickBird.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/SensitiveWord.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/SwitchBaseModel.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/UploadFile.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxApp.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxMiniApp.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxPay.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/config/RestTemplateConfig.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayConstant.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayPayStatus.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AutoCheckEnum.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/CompanyInfoProcessStatus.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/DistributedIdKey.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/DistributionAudit.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/ExcelConstant.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/JumpType.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/PayType.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/PicType.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/RetainedDateType.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SeckillOrderCacheConstant.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SendTypeEnum.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/StatusEnum.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/StorageTypeEnum.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/UserAdminType.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/dto/BaseDTO.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/dubbo/DevProximityLoadBalance.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/ExcelMergeHandler.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/HttpHandler.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/SensitiveHandler.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/I18nMessage.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/LanguageEnum.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/LuckLocaleChangeFilter.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/LuckLocaleChangeInterceptor.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/AnalysisUtil.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/Arith.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/BeanUtil.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/CharUtil.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/ExcelUtil.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/IpHelper.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/LangUtil.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/MapUtil.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/PriceUtil.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/PrincipalUtil.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/vo/ShopSubstituteSalesVO.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/wrapper/RequestWrapper.java create mode 100644 tmerclub-common/tmerclub-common-core/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance create mode 100644 tmerclub-common/tmerclub-common-database/pom.xml create mode 100644 tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/config/MybatisConfig.java create mode 100644 tmerclub-common/tmerclub-common-leaf/pom.xml create mode 100644 tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/common/Status.java create mode 100644 tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/exception/NoKeyException.java create mode 100644 tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/manager/SegmentManager.java create mode 100644 tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/SegmentIDGenImpl.java create mode 100644 tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/dao/IDAllocDao.java create mode 100644 tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/model/LeafAlloc.java create mode 100644 tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/model/SegmentBuffer.java create mode 100644 tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/service/SegmentService.java create mode 100644 tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/util/NumberUtil.java create mode 100644 tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/bo/order/MongoOrderBO.java create mode 100644 tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/bo/order/MongoOrderVirtualInfoBO.java create mode 100644 tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/util/MongoPageUtil.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/DeliveryModeBO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/EsOrderBO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/OrderStatusBO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/PayRefundBO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/RefundStockOperateBO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/OrderCloseType.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/PayStatus.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/ReturnProcessStatusEnum.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/ShopCartItemDiscountType.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/StockModeEnum.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/AllotOrderSearchDTO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/AreaDTO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/DvyTypeDTO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderDTO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderInvoiceSearchDTO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderRefundSearchDTO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderShopDTO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderSubmitShopCartItemDTO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderVirtualInfoDTO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/VirtualRemarkDTO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/feign/OrderShopDetailFeignClient.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/util/OrderLangUtil.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/AreaVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/CouponOrderVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/DiscountOrderVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsAllotOrderItemVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderRefundItemVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderVirtualInfoVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderCountVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderItemVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderSpuLangVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderStationSpuDTO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/RefundOrderItemVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartItemDiscountVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartOrderVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCityStatusVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/TransfeeFreeVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/TransfeeVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/UserOrderStatisticVO.java create mode 100644 tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/VirtualRemarkVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsAttrBO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsBrandBO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsCategoryBO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsDeliveryModeBO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsProductBO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ComboSpuType.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ComboStatus.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/CommissionSpuOffType.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ContentValue.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/IsCommission.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/IsSynUpdate.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/PreSaleType.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SalesPriceType.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SalesType.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SearchType.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SkuChoiceStatus.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SpuType.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockBillType.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockPointType.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockType.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SupplierSpuType.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/TakeStockBillStatus.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/TakeStockExceptionEnum.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/AttrLangDTO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/AttrValueLangDTO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/CartComboMatchSpuDTO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ComboOrderDTO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ProductSearchDTO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ProductSearchLimitDTO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SkuLangDTO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuSkuAttrValueLangDTO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/StockPointSkuDTO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/TackStockDTO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrCategoryVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrValueVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/BrandVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/CategoryLangVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ComboOrderVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/GiveawaySpuVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/GiveawayVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/GroupActivitySpuVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuAddrVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuComboVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuLangVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuActivityAppVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuAndSkuVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuAttrValueLangVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuCouponAppVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuSkuAttrValueVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockBillLogVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockPointSkuVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/BrandAppVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/CategoryAppVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/SkuAppVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/AttrValueSearchVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/CategorySearchVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/DistributionInfoVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/ProductSearchVO.java create mode 100644 tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/ShopInfoSearchVO.java create mode 100644 tmerclub-common/tmerclub-common-rocketmq/pom.xml create mode 100644 tmerclub-common/tmerclub-common-rocketmq/src/main/java/com/tmerclub/cloud/common/rocketmq/config/RocketMqAdapter.java create mode 100644 tmerclub-common/tmerclub-common-rocketmq/src/main/java/com/tmerclub/cloud/common/rocketmq/config/RocketMqConstant.java create mode 100644 tmerclub-common/tmerclub-common-security/pom.xml create mode 100644 tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/PmsContext.java create mode 100644 tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/adapter/AuthConfigAdapter.java create mode 100644 tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/bo/SignResponse.java create mode 100644 tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/bo/TokenInfoBO.java create mode 100644 tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/config/PasswordConfig.java create mode 100644 tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/config/SensitiveWordConfig.java create mode 100644 tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/AuthFilter.java create mode 100644 tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/dubbo/DubboExceptionFilter.java create mode 100644 tmerclub-common/tmerclub-common-security/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter create mode 100644 tmerclub-common/tmerclub-common-sharding-proxy/pom.xml create mode 100644 tmerclub-common/tmerclub-common-sharding-proxy/src/main/java/com/tmerclub/cloud/common/sharding/proxy/ShardingAlgorithmHelper.java create mode 100644 tmerclub-flow/pom.xml create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSpuBO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSpuUserBO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSystemUserBO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserBO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserOperationBO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserRetainBO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/config/Ip2RegionConfig.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowLogPageEnum.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowUserTypeEnum.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowVisitEnum.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FormItemEnum.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/SystemTypeEnum.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/admin/ProductAnalyseController.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/app/FlowLogController.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/multishop/FormController.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/FlowAnalysisController.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/ProductAnalyseController.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/UserVisitAnalysisController.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/supplier/ProductAnalyseController.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/FlowAnalysisDTO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/ProductAnalyseDTO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/SingleProdTrendDTO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/UserVisitProdAnalysisDTO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/mapper/FormMapper.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/ProductAnalyse.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/UserAnalysis.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/CustomerAnalysisService.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/FormService.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/ProductAnalyseService.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/SystemUserAnalyseMongoService.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/UserAnalyseMongoService.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/CustomerAnalysisServiceImpl.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FlowServiceImpl.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FlowUserAnalysisServiceImpl.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FlowUserMongoServiceImpl.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FormServiceImpl.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/ProductAnalyseServiceImpl.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/SystemAnalyseMongoServiceImpl.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/SystemUserAnalyseMongoServiceImpl.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/UserAnalyseMongoServiceImpl.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/task/FlowTask.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/util/FlowArithUtil.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/util/FlowUtil.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowAnalysisDataExcelVO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowProdEffectDataExcelVO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowProdEffectRespVO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowSourDataExcelVO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowTrendExcelVO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FormItemVO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ProductAnalyseVO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ProductFlowInfoVO.java create mode 100644 tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/UserAnalysisVO.java create mode 100644 tmerclub-flow/src/main/resources/bootstrap.yml create mode 100644 tmerclub-flow/src/main/resources/logback.xml create mode 100644 tmerclub-flow/src/main/resources/mapper/FormMapper.xml create mode 100644 tmerclub-gateway/src/main/java/com/tmerclub/cloud/gateway/dev/DevWebFluxContext.java create mode 100644 tmerclub-gateway/src/main/resources/bootstrap.yml create mode 100644 tmerclub-gateway/src/main/resources/logback.xml create mode 100644 tmerclub-group/Dockerfile create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/GroupApplication.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/GroupOpenNotifyBO.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/mongo/MongoGroupTeamBO.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/config/RocketMqConfig.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/config/XxlJobConfig.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/AppGroupActivityStatus.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/GroupActivityStatusEnum.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/TeamStatusEnum.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/controller/app/GroupTeamController.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupActivityDTO.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupOrderDTO.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupSpuDTO.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupTeamDTO.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/feign/GroupFeignController.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCreateConsumer.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCreateTransactionListener.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSaveGroupConsumer.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSaveTeamGroupConsumer.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderUnSuccessRefundTransactionListener.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/OrderNotifyGroupConsumer.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupActivityMapper.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupOrderMapper.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupSkuMapper.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupTeamMapper.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupActivity.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupSku.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupTeam.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupSkuServiceImpl.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupTeamServiceImpl.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupSkuVO.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupSpuVO.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupActivityVO.java create mode 100644 tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupSkuVO.java create mode 100644 tmerclub-group/src/main/resources/mapper/GroupTeamMapper.xml create mode 100644 tmerclub-im/Dockerfile create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/config/DubboBeanConfig.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/Admin.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/MsgCode.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/WhoSend.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/multishop/ImMsgBizSkillsController.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/platform/ImMsgBizSkillsController.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/feign/ImMsgBizUserFeignController.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/mapper/ImMsgBizUserMapper.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/model/ImMsgBizSkills.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizEmployeeRecentService.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizSkillsService.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizUserHistoryService.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizSkillsServiceImpl.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizUserHistoryServiceImpl.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizUserServiceImpl.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/platform/SysOnlineWebSocketServer.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/platform/SysWebSocketServer.java create mode 100644 tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/ImMsgBizSkillsVO.java create mode 100644 tmerclub-im/src/main/resources/bootstrap.yml create mode 100644 tmerclub-im/src/main/resources/logback.xml create mode 100644 tmerclub-im/src/main/resources/mapper/ImMsgBizEmployeeRecentMapper.xml create mode 100644 tmerclub-im/src/main/resources/mapper/ImMsgBizSkillsMapper.xml create mode 100644 tmerclub-im/src/main/resources/mapper/ImMsgBizUserMapper.xml create mode 100644 tmerclub-marketing/Dockerfile create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/MarketingApplication.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/bo/ComboSpuCountChangeNotifyBO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/constant/ComboStatus.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/feign/ComboFeignController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/feign/ComboSpuFeignController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboListener.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboOrderPaySucceedListener.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboSpuSkuListener.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/mapper/ComboMapper.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/ComboOrder.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/ComboSpu.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/ComboSpuSku.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/ComboSpuSkuService.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboOrderServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboSpuSkuServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/task/ComboTask.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/vo/ComboSpuVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/XxlJobConfig.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/CouponConstant.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/CouponStatus.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/GetWay.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/SuitableProdType.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/admin/CouponController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/app/CouponController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/app/MyCouponController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/platform/CouponController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/dto/CouponDTO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/dto/CouponUserDTO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/feign/CouponOrderFeignController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/CouponUnlockConsumer.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/manager/CouponStockManager.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponGiveLogMapper.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/Coupon.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/CouponSpu.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponService.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponUserService.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponLockServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponSpuServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponUserServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/task/CouponTask.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/util/ChooseCouponHelper.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/CouponUserVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/mongo/MongoCouponUserCountVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/controller/app/SpuDiscountController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/dto/DiscountDTO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/dto/DiscountItemDTO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/feign/DiscountFeignController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/manager/DiscountConfirmOrderManager.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/manager/DiscountManager.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/mapper/DiscountItemMapper.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/mapper/DiscountSpuMapper.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/model/Discount.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/model/DiscountItem.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/service/DiscountSpuService.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/BindInvalidReasonEnum.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DUserType.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionAuditStateEnum.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionAuditingState.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionUserIncomeStateEnum.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionWalletBillTypeEnum.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionWithdrawCashStateEnum.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/EnterprisePayStatus.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/IncomeStateEnum.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/ParentAwardSet.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionSpuController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserBindController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserIncomeController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserWalletController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/multishop/DistributionSpuController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionAuditingController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserWalletController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/AppDistributionWithdrawCashDTO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionSpuDTO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionSpuLogDTO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserDTO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserWalletBillDTO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/EnterprisePayDTO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/feign/DistributionUserIncomeFeignController.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/listener/OrderNotifyDistributionConsumer.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionSpuBindMapper.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserBanMapper.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserBindMapper.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserIncomeMapper.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/EnterprisePayMapper.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionSpuLog.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserBan.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserWallet.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/EnterprisePay.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionMsgService.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionRefundService.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionSpuBindService.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionSpuLogService.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserBanService.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserBindService.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserIncomeService.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserService.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/EnterprisePayService.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionAuditingServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionOrderServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionRefundServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionSpuBindServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionSpuLogServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserIncomeServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserWalletBillServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserWalletServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/task/DistributionCommissionSettlementTask.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/task/EnterprisePayTask.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/AppDistributionWithdrawCashLogVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/AppDistributionWithdrawCashVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionAwardDataVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionSpuLogVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserAchievementDataVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserAchievementVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserBanVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserBindVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserIncomeVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserSimpleInfoVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserWalletInfoVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionWithdrawCashVO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/LiveConstant.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/PlayBackType.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/dto/LiveMessageDTO.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/mapper/LiveRoomProdMapper.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/model/LiveRoomProd.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/service/impl/LiveRoomProdServiceImpl.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/socket/LiveUserWebSocketServer.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/util/AliLiveUtil.java create mode 100644 tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/vo/LiveMsgItemVO.java create mode 100644 tmerclub-marketing/src/main/resources/logback.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/CouponMapper.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/DiscountProdMapper.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/DistributionAuditingMapper.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/DistributionSpuBindMapper.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/DistributionSpuLogMapper.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/DistributionSpuMapper.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/DistributionUserBanMapper.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/DistributionUserBindMapper.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/DistributionUserIncomeMapper.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/DistributionUserMapper.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/DistributionUserWalletBillMapper.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/DistributionUserWalletMapper.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/EnterprisePayMapper.xml create mode 100644 tmerclub-marketing/src/main/resources/mapper/LiveRoomMapper.xml create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/config/XxlJobConfig.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryAliInfoBO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryAliItemInfoBO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/StationOrderBO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/constant/DeliveryCompanyType.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/OrderDeliveryController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/TransportController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/AreaController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/MyDeliveryController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TransfeeController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TransfeeFreeController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TransportController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/platform/AreaController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/platform/StationController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/OrderDeliveryController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/TransportController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TranscityFreeDTO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TransfeeDTO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/AreaFeignController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/SameCityFeignController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/StationFeignController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/DeliveryCompanyMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/DeliveryOrderItemMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/DeliveryOrderMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/OutletConfigMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/StationMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TranscityMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/DeliveryOrder.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/DeliveryOrderItem.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Transcity.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Transfee.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Transport.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/DeliveryOrderService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/OutletConfigService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/PrinterService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/SameCityService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/StationService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TranscityFreeService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TransfeeFreeService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/DeliveryOrderItemServiceImpl.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/PrinterServiceImpl.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/StationServiceImpl.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TransportServiceImpl.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/DeliveryCompanyVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/DeliveryOrderItemVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/OutletConfigAddrVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/OutletConfigInfoVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/TranscityFreeVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/TranscityVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/OrderVirtualInfoLogBO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/SubmitOrderPayAmountInfoBO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoAllotOrderBO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoOrderVirtualInfoLogBO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoPurchaseOrderBO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoPurchaseOrderItemBO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/Constant.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/FinanceBizType.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/InterventionRefundType.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/OrderExportError.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/PlatformInterventionStatus.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/PurchasesStatusEnum.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundApplyType.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundInterventionType.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundStsType.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundType.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/SupplierHandleStatus.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/admin/OrderItemController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderInvoiceController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderRefundInterventionController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderRefundController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderSelfStationController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/PurchaseOrderController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderFinanceController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderStatisticsController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderInvoiceController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderRefundController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderRefundInterventionController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/PurchaseOrderController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/AllotOrderItemDTO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderRefundAddrDTO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderRefundInterventionDTO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/app/OrderRefundDeliveryDTO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/app/OrderRefundPageDTO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderItemDTO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderRefundDTO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/AllotOrderFeignController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderAddrFeignController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderFeignController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderInvoiceFeignController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/PurchaseOrderFeignController.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/GroupOrderSuccessConsumer.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderCancelConsumer.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderExcelListener.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderPurchaseFinishConsumer.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderReceiptTransactionListener.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/RefundIntervertionCanalConsumer.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/SeckillOrderCreateConsumer.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/StockBillLogPurchaseStorageTransactionListener.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoOrderManager.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoOrderRefundManager.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/AllotOrderMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderItemLangMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderItemMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderPreSaleInfoMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundInterventionMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundSettlementMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderReturnReasonMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderVirtualInfoMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderItemMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderLangMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderMapper.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/AllotOrder.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/Order.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderInvoice.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderItemLang.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderPreSaleInfo.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderRefundAddr.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderSelfStation.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrder.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrderItem.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/AllotOrderService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderAddrService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderAllinpayService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderAnalysisService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderInvoiceService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderItemLangService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderItemService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderPreSaleInfoService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundInterventionService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundSettlementService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderAddrService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderExcelService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderService.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderAddrServiceImpl.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderAllinpayServiceImpl.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderAnalysisServiceImpl.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderRefundInterventionServiceImpl.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderSettlementServiceImpl.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderVirtualInfoLogServiceImpl.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderItemServiceImpl.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderLangServiceImpl.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/SupplierOrderStatisticsServiceImpl.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/task/OrderRefundTask.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/task/OrderTask.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotOrderItemVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuImportVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuInboundExcelVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/ChooseComboItemVo.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/HotProductVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/MyOrderVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderAndPreSaleVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderDetailVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderInvoiceVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderItemWithAddressVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderPayInfoVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundAddrVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundInterventionVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundSettlementVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderSettlementVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderShopVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderExcelVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderItemLangVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderItemVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/ScoreOrderExcelVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoAccountOrderDetailVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoAccountOrderRefundDetailVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoFinanceOrderRefundDetailVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderPayInfoVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderRefundStatisticsVO.java create mode 100644 tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoSpuSoldNumRankVO.java create mode 100644 tmerclub-order/src/main/resources/mapper/AllotOrderMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/AreaMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/OrderAddrMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/OrderItemLangMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/OrderItemMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/OrderRefundAddrMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/OrderRefundInterventionMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/OrderRefundMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/OrderReturnReasonMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/OrderSettlementMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/PurchaseOrderItemLangMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/PurchaseOrderItemMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/PurchaseOrderMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/SameCityMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/StationMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/TransfeeMapper.xml create mode 100644 tmerclub-order/src/main/resources/mapper/TransportMapper.xml create mode 100644 tmerclub-payment/Dockerfile create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/PaymentApplication.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/AbstractReq.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/OpenClient.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/AsynNotiyRequest.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/CustReq.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpException.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenConfig.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenRequest.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/AuditStatus.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/ApplyBindAcct.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BankCardChangeBindPhone.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BindBankCard.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BindCompanyAccount.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/GetMemberInfo.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/IdCardCollect.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/IdCardCollectByFileUpload.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/LockMember.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SetCompanyInfo.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SetRealName.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UnlockMember.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UpdatePayPwd.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UpdatePhoneByPayPwd.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/AllinpayResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BankCardBin.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BankCardChangeBindPhoneResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BindBankCardResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/CardBinInfo.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/CreateMemResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/FileUploadResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/IdCardCollectResultResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/Result.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/SignAcctProtocolResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/UserBaseInfo.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/UserInfo.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/VerifyBankCardChangeBindPhoneResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ApplicationCollection.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ApplicationTransfer.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ConsumeApply.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/DepositApply.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/FreezeMoney.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/GetOrderDetail.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayByBackSmsReq.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayMethod.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryInExpDetail.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryOrderSplitRuleListDetail.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/Refund.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ResendPaySmsReq.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/UnfreezeMoney.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/WithdrawApplyReq.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/AgentPayResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ApplicationTransferResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/GetOrderStatusResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/InExpDetail.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/OrderDetailResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/PayByPwdResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/QueryInExpDetailResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/QueryReserveFundBalanceResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/RefundResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ResendPaySmsResp.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/service/AllinpayMemberService.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/OpTrustManager.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/OpenUtils.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/SecretUtils.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Sm2Utils.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Sm4.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/PayInfoResultBO.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/RefundInfoBO.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/RefundInfoResultBO.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/config/WxConfig.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/VerificationCodeType.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/AllinpayNoticeController.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/PayNoticeController.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/app/AllinpayMemberController.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/app/AllinpayOrderController.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/multishop/AllinpayCompanyController.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/multishop/AllinpayOrderController.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/multishop/RechargePayController.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/platform/AccountDetailController.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/user/PayController.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/user/RechargePayController.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/BasePayInfoDTO.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/IdCardCollectDTO.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayByBackSmsDTO.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayByPwdDTO.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayInfoDTO.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SetPayPwdDTO.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SetRealNameBySmsCodeDTO.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/feign/AllinpayFeignController.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/BalancePayConsumer.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/OpenAllinpayOrderConsumer.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/OrderRefundPaymentConsumer.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/manager/AllinpayManager.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/manager/PayManager.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/manager/PayNoticeManager.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/mapper/RefundInfoMapper.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/model/PayInfo.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/model/RefundInfo.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/AllinpayService.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/PayInfoService.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/AllinpayCompanyServiceImpl.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/PayInfoServiceImpl.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/RefundInfoServiceImpl.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/PayInfoExcelVO.java create mode 100644 tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/PayInfoVO.java create mode 100644 tmerclub-payment/src/main/resources/bootstrap.yml create mode 100644 tmerclub-payment/src/main/resources/logback.xml create mode 100644 tmerclub-payment/src/main/resources/mapper/RefundInfoMapper.xml create mode 100644 tmerclub-product/Dockerfile create mode 100644 tmerclub-product/pom.xml create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/ProductApplication.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/CategoryRateBO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/CategoryShopRateBO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/NeedZoneSkuInfoBO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/SkuWithStockBO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/SkuZoneInfoBO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoSpuBrowseLogBO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoStockBillLogBO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoStockBillLogItemBO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/DistributedIdKey.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/SkuZoneConstant.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/WriteOfNumEnum.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/SpuController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/StockChangeReasonController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuBrowseLogController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuCommController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/CategoryController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/GiveawayController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/GiveawaySpuController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockChangeReasonLangController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockPointSkuController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/TakeStockController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/TakeStockSpuController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/BrandController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuTagController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/BrandController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuCommController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuPriceLogController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuStatisticsController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/AttrCategoryDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/BrandLangDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/CategoryLangDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/GiveawayDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/GiveawaySpuDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuBrowseLogDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuDetailDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuExtensionDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuTagDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockBillLogDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockChangeReasonStatusDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/TakeStockDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/AddShopCartItemsDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/CheckShopCartItemDTO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/BrandFeignController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/BrandShopFeignController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/CategoryShopFeignController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/GiveawayFeignController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SkuFeignController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SpuBrowseLogLogFeignController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SpuCommFeignController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/TakeStockFeignController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/WarehouseFeignController.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/OrderNotifyStockConsumer.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/SpuExcelListener.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockBillLogConsumer.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockUnlockConsumer.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/SupplierSpuUpdateNotifyConsumer.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/TakeStockSpuExcelListener.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrCategoryMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/BrandShopMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/CategoryShopMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/GiveawayMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/ShopCartItemMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SkuComboMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SkuLangMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SkuMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuAttrValueLangMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuConsignmentChangeMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuPriceLogMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuSkuAttrValueLangMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuSupplierChangeLogMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuTagMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockBillLogMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockChangeReasonLangMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockPointSkuMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/TakeStockMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/WarehouseAreaMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/WarehouseMapper.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/AttrValueLang.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Brand.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Category.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/CategoryBrand.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/CategoryShop.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Giveaway.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/GiveawaySpu.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuCombo.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuStockLock.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuStockZone.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuAttrValueLang.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuBrowseLog.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuCollection.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuComm.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuDetail.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuSkuAttrValue.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuSupplierChangeLog.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockChangeReasonStatus.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/TakeStock.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrCategoryService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrValueLangService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/BrandLangService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryBrandService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryLangService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/GiveawayService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/GiveawaySpuService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuComboService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuLangService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuStockLockService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuStockService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuBrowseLogService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuCollectionService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuCommService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuExcelService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuLangService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuOfflineService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuPriceLogService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuSkuAttrValueLangService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuStockService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockBillLogItemService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockPointSkuService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SupplierSpuUpdateLaterOperateService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/TakeStockService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/TakeStockSpuService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/WarehouseService.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrLangServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrValueServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/BrandLangServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/BrandShopServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/CategoryBrandServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ImportSupplierSpuServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ShopCartServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuComboServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuStockServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuCommServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuConsignmentChangeServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuDetailServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuExcelServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuExtensionServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuLangServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuOfflineServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuPriceLogServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuSkuAttrValueServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuTagServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockBillLogItemServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockChangeReasonStatusServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockPointSkuServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SupplierSpuUpdateLaterOperateServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/WarehouseAreaServiceImpl.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/util/StockUtil.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryPlatformExcelVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/PlatformSpuExcelVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/ShopCartAmountVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SkuStockZoneVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCollectionVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuConsignmentChangeVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCountVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuExcelVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuPriceLogVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuTagReferenceVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuTagVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillInLogExcelVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemExcelVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillOutLogExcelVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockChangeReasonLangVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockChangeReasonStatusVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SupplierProdExcelVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockSpuExcelVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockSpuImportVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockSpuVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/WarehouseAreaVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoSpuBrowseLogVO.java create mode 100644 tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoStockBillLogItemVO.java create mode 100644 tmerclub-product/src/main/resources/bootstrap.yml create mode 100644 tmerclub-product/src/main/resources/mapper/AttrCategoryMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/AttrValueLangMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/AttrValueMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/BrandLangMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/BrandMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/BrandShopMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/CategoryBrandMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/CategoryMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/ShopCartItemMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/SpuAttrValueLangMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/SpuAttrValueMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/SpuLangMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/SpuPriceLogMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/SpuSkuAttrValueLangMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/SpuSkuAttrValueMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/SpuSupplierChangeLogMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/SpuTagMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/SpuTagReferenceMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/StockChangeReasonLangMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/StockChangeReasonMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/StockChangeReasonStatusMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/StockPointSkuMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/TakeStockMapper.xml create mode 100644 tmerclub-product/src/main/resources/mapper/TakeStockSpuMapper.xml create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/SearchApplication.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/BrandBO.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/CategoryBO.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/DistributionInfoBO.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/OrderBO.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/OrderInvoiceBO.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/OrderRefundBO.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SkuBO.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SkuStockZoneBO.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SpuExtensionBO.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/ProductSearchRequestBuilder.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/ProductSearchResponseBuilder.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/CanalGlue.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/DefaultCanalGlue.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/LuckCanalBinLogEventParser.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/LuckCanalBinlogEventProcessorFactory.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/annotation/CanalField.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/annotation/CanalModel.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/BinLogEventType.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/FieldNamingPolicy.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/DefaultModelTable.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/ModelTable.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/BaseParameterizedTypeReferenceSupport.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/adapter/FastJsonSourceAdapter.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BasePrimaryKeyTupleFunction.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BigIntPrimaryKeyTupleFunction.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ColumnMetadata.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/DefaultCanalBinLogEventParser.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ModelTableMetadataManager.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/BaseCanalFieldConverter.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/BigIntCanalFieldConverter.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/CanalFieldConvertInput.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/IntCanalFieldConverter.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/NullCanalFieldConverter.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TimestampCanalFieldConverter0.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TinyIntCanalFieldConverter.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/VarcharCanalFieldConverter.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/processor/CanalBinlogEventProcessorFactory.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/CollectionUtils.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/ReflectionUtils.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/config/RocketMqConfig.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsConstant.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsProductSortEnum.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsSupplierSpuStatus.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/admin/OrderRefundSearchController.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/app/ProductSearchController.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/multishop/AllotOrderSearchController.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/platform/WalletLogOperationController.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/AllotOrderSearchController.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/OrderSearchController.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/ProductSearchController.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/PurchaseOrderSearchController.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/EsOrderFeignController.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderRefundFeignController.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderRefundTaskFeignController.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchPurchaseOrderFeignController.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/AllotOrderCanalListener.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/BaseCanalBinlogEventThrowExceptionProcessor.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/BaseCanalListener.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/OrderRefundCanalListener.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/PurchaseOrderCanalListener.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/ShopDetailCanalListener.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/SkuCanalListener.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/AllotOrderSearchManager.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderRefundSearchManager.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderSearchManager.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/ProductOperateManager.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/ProductSearchManager.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/PurchaseOrderSearchManager.java create mode 100644 tmerclub-search/src/main/resources/bootstrap.yml create mode 100644 tmerclub-seckill/Dockerfile create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/SeckillApplication.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/RedisConfig.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/RocketMqConfig.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/DistributedIdKey.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/SeckillConstant.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/SuitableProdTypeEnum.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/admin/SeckillController.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/app/SeckillCategoryController.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/platform/SeckillTimeController.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillCategoryDTO.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/app/SeckillOrderDTO.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/feign/SeckillFeignController.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/listener/OrderNotifySeckillConsumer.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/manager/SeckillCacheManager.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/mapper/SeckillMapper.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillCategory.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillSku.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillCategoryService.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillOrderService.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillService.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillSkuService.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillOrderServiceImpl.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillServiceImpl.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/AppSeckillSpuVO.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/AppSeckillVO.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillAdminVO.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillConfigVO.java create mode 100644 tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillVO.java create mode 100644 tmerclub-seckill/src/main/resources/bootstrap.yml create mode 100644 tmerclub-seckill/src/main/resources/mapper/SeckillCategoryMapper.xml create mode 100644 tmerclub-seckill/src/main/resources/mapper/SeckillSkuMapper.xml create mode 100644 tmerclub-user/Dockerfile create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/CategoryLinkBO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/mongo/MongoUserBalanceLogBO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/mongo/MongoUserScoreLogBO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/RocketMqConfig.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/ThreadPoolConfigProperties.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/XxlJobConfig.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/DistributedIdKey.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/FreeFeeTypeEnum.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/GrowthLogSourceEnum.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/OrderSortEnum.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PopupPageTypeEnum.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PopupUserTypeEnum.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RecruitStatusEnum.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RightsTypeEnum.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/ScoreIoTypeEnum.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/ScoreLogTypeEnum.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/SexTypeEnum.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/TagTypeEnum.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/UserStatusEnum.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/ThirdApiAbutmentController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserBalancePayController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserExtensionController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserRechargeController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserRegisterController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserScoreController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/CostPerPopupController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserRechargeController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserRightsController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserTagController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserTagUserController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/converter/UserStatusConverter.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/CostPerPopupDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/RechargeCouponDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/ScoreDataDto.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/ShopCustomerDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/ShopCustomerExcelDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserAddrDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserAdminDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserBalanceRechargeOrderDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserExcelDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserExtensionDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserGrowthLogDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelLogDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelRechargeOrderDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelRightsDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRechargeCouponDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRechargeDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRightsCouponDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRightsDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserTagDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserTagUserDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserWithDrawDTO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/PopupFeignController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserAddrFeignController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserConsigneeFeignController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserExtensionFeignController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserFeignController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserLevelLogFeignController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserScoreLockFeignController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserTagFeignController.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/AddUserBalanceLogConsumer.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/AddUserScoreLogConsumer.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/AllinpayBalancePaySuccessConsumer.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/OrderRefundSuccessGrowthConsumer.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserExcelListener.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserGrowthConsumer.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserRegisterConsumer.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/CostPerPopupMapper.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/ShopCustomerMapper.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserBalanceLogMapper.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserConsigneeMapper.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserExtensionMapper.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserMapper.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRechargeMapper.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRightsCouponMapper.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserScoreLockMapper.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserTagMapper.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserTagUserMapper.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/ShopCustomer.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/User.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserBalanceLog.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserConsignee.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserGrowthLog.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserLevelLog.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRecharge.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRights.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserScoreLock.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserScoreLog.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserWithdrawCash.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/CostPerPopupService.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/PopupUserLogService.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserConsigneeService.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserGrowthLogService.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserLevelTermService.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRightsCouponService.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRightsService.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserScoreLogService.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserService.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserTagUserService.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserWithdrawCashService.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/CostPerPopupServiceImpl.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/ThirdApiAbutmentServiceImpl.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserExtensionServiceImpl.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserLevelServiceImpl.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserScoreLockServiceImpl.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserServiceImpl.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserTagUserServiceImpl.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserWithdrawCashServiceImpl.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/task/AllinpayTask.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/task/PopupTask.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/task/ScoreTask.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/CostPerPopupVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/PopupRelateVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ScoreCompleteConfigVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ScoreDataVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ShopCustomerExcelVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ShopCustomerVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/SysConfigVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserExtensionVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelLogVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelTermVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserMemberInfoVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRightsCouponVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRightsVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserScoreLogVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserSimpleInfoVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserTagUserVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserTagVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserWithdrawCashVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoBalanceUserPayInfoVO.java create mode 100644 tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoScoreUserManagerVO.java create mode 100644 tmerclub-user/src/main/resources/logback.xml create mode 100644 tmerclub-user/src/main/resources/mapper/CostPerPopupMapper.xml create mode 100644 tmerclub-user/src/main/resources/mapper/PopupRelateMapper.xml create mode 100644 tmerclub-user/src/main/resources/mapper/ShopCustomerMapper.xml create mode 100644 tmerclub-user/src/main/resources/mapper/UserBalanceLogMapper.xml create mode 100644 tmerclub-user/src/main/resources/mapper/UserExtensionMapper.xml create mode 100644 tmerclub-user/src/main/resources/mapper/UserGrowthLogMapper.xml create mode 100644 tmerclub-user/src/main/resources/mapper/UserLevelMapper.xml create mode 100644 tmerclub-user/src/main/resources/mapper/UserRechargeCouponMapper.xml create mode 100644 tmerclub-user/src/main/resources/mapper/UserRechargeMapper.xml create mode 100644 tmerclub-user/src/main/resources/mapper/UserRightsCouponMapper.xml create mode 100644 tmerclub-user/src/main/resources/mapper/UserRightsMapper.xml create mode 100644 tmerclub-user/src/main/resources/mapper/UserScoreGetLogMapper.xml create mode 100644 tmerclub-user/src/main/resources/mapper/UserScoreLogMapper.xml create mode 100644 tmerclub-user/src/main/resources/mapper/UserTagUserMapper.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d416ccc --- /dev/null +++ b/.gitignore @@ -0,0 +1,62 @@ +### gradle ### +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +### STS ### +.settings/ +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +*.lock +rebel.xml + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +### maven ### +target/ +*.war +*.ear +*.zip +*.tar +*.tar.gz + +### logs #### +/logs/ +*.log + +### temp ignore ### +*.cache +*.diff +*.patch +*.tmp +*.java~ +*.properties~ +*.xml~ + +### system ignore ### +.DS_Store +Thumbs.db +Servers +.metadata +upload +gen_code + +### node ### +node_modules diff --git a/README.md b/README.md new file mode 100644 index 0000000..d6739f5 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +## 协议和授权 + +`mall4cloud` 并非一个开源软件,作者保留全部的权利。 擅自窃用,即属严重侵权行为,与盗窃无异。产生的一切任何后果责任由侵权者自负。 + +## 商业使用 + +本项目并非一个开源项目,**广州市蓝海创新科技有限公司** 拥该项目的100%版权。 + +商用请联系 **广州市蓝海创新科技有限公司** 获取授权,否则产生的一切任何后果责任由侵权者自负。 + +## 🚫禁止 + +将本项目的部分或全部代码和资源进行任何形式的再发行(上传GitHub、Gitee等任何公开发行的地方) + +## 侵权处理 + +- 支付人民币最低 `100万` 到 `侵权数量*商业版售价*10倍` 不等的侵权费用(含我方法律援助费用),本团队已完全委托律师事务所 司法保护 + +- 个人行为将直接收集材料邮寄贵司侵权律师函,若出现司法诉讼将直接影响当事人征信档案等特此说明 \ No newline at end of file diff --git a/db/2023-08-28商品库存警告字段为空更新.sql b/db/2023-08-28商品库存警告字段为空更新.sql new file mode 100644 index 0000000..27a1685 --- /dev/null +++ b/db/2023-08-28商品库存警告字段为空更新.sql @@ -0,0 +1,2 @@ +UPDATE sku SET stock_warning = 0 WHERE stock_warning IS NULL; +UPDATE `spu` SET update_time = NOW(); diff --git a/db/2023-09-18 退款订单新增字段.sql b/db/2023-09-18 退款订单新增字段.sql new file mode 100644 index 0000000..558db76 --- /dev/null +++ b/db/2023-09-18 退款订单新增字段.sql @@ -0,0 +1,157 @@ +# 退款单新增商家备注字段 +USE mall4cloud_order_0; +DELIMITER // +DROP PROCEDURE IF EXISTS updateRefundColumn // +CREATE PROCEDURE updateRefundColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 32 DO + SET @add_column = CONCAT( 'ALTER TABLE order_refund_', i, " ADD COLUMN `shop_seller_msg` varchar(300) NULL COMMENT '商家备注(移交供应商处理时保存)' AFTER `seller_msg`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateRefundColumn() // +DROP PROCEDURE updateRefundColumn // +DELIMITER; + +USE mall4cloud_order_1; +DELIMITER // +DROP PROCEDURE IF EXISTS updateRefundColumn // +CREATE PROCEDURE updateRefundColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 32 DO + SET @add_column = CONCAT( 'ALTER TABLE order_refund_', i, " ADD COLUMN `shop_seller_msg` varchar(300) NULL COMMENT '商家备注(移交供应商处理时保存)' AFTER `seller_msg`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateRefundColumn() // +DROP PROCEDURE updateRefundColumn // +DELIMITER; + +USE mall4cloud_order_2; +DELIMITER // +DROP PROCEDURE IF EXISTS updateRefundColumn // +CREATE PROCEDURE updateRefundColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 32 DO + SET @add_column = CONCAT( 'ALTER TABLE order_refund_', i, " ADD COLUMN `shop_seller_msg` varchar(300) NULL COMMENT '商家备注(移交供应商处理时保存)' AFTER `seller_msg`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateRefundColumn() // +DROP PROCEDURE updateRefundColumn // +DELIMITER; + +USE mall4cloud_order_3; +DELIMITER // +DROP PROCEDURE IF EXISTS updateRefundColumn // +CREATE PROCEDURE updateRefundColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 32 DO + SET @add_column = CONCAT( 'ALTER TABLE order_refund_', i, " ADD COLUMN `shop_seller_msg` varchar(300) NULL COMMENT '商家备注(移交供应商处理时保存)' AFTER `seller_msg`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateRefundColumn() // +DROP PROCEDURE updateRefundColumn // +DELIMITER; + +USE mall4cloud_order_4; +DELIMITER // +DROP PROCEDURE IF EXISTS updateRefundColumn // +CREATE PROCEDURE updateRefundColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 32 DO + SET @add_column = CONCAT( 'ALTER TABLE order_refund_', i, " ADD COLUMN `shop_seller_msg` varchar(300) NULL COMMENT '商家备注(移交供应商处理时保存)' AFTER `seller_msg`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateRefundColumn() // +DROP PROCEDURE updateRefundColumn // +DELIMITER; + +USE mall4cloud_order_5; +DELIMITER // +DROP PROCEDURE IF EXISTS updateRefundColumn // +CREATE PROCEDURE updateRefundColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 32 DO + SET @add_column = CONCAT( 'ALTER TABLE order_refund_', i, " ADD COLUMN `shop_seller_msg` varchar(300) NULL COMMENT '商家备注(移交供应商处理时保存)' AFTER `seller_msg`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateRefundColumn() // +DROP PROCEDURE updateRefundColumn // +DELIMITER; + +USE mall4cloud_order_6; +DELIMITER // +DROP PROCEDURE IF EXISTS updateRefundColumn // +CREATE PROCEDURE updateRefundColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 32 DO + SET @add_column = CONCAT( 'ALTER TABLE order_refund_', i, " ADD COLUMN `shop_seller_msg` varchar(300) NULL COMMENT '商家备注(移交供应商处理时保存)' AFTER `seller_msg`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateRefundColumn() // +DROP PROCEDURE updateRefundColumn // +DELIMITER; + +USE mall4cloud_order_7; +DELIMITER // +DROP PROCEDURE IF EXISTS updateRefundColumn // +CREATE PROCEDURE updateRefundColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 32 DO + SET @add_column = CONCAT( 'ALTER TABLE order_refund_', i, " ADD COLUMN `shop_seller_msg` varchar(300) NULL COMMENT '商家备注(移交供应商处理时保存)' AFTER `seller_msg`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateRefundColumn() // +DROP PROCEDURE updateRefundColumn // +DELIMITER; + + +# 添加小程序发货定时任务 +USE `mall4cloud_job`; +INSERT INTO `xxl_job_info`(`job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, + `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, + `executor_handler`, `executor_param`, `executor_block_strategy`, + `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, + `glue_remark`, `glue_updatetime`, `child_jobid`, `trigger_status`, + `trigger_last_time`, `trigger_next_time`) +VALUES (2, '小程序发货虚拟订单和自提订单定时任务', '2023-09-15 13:53:42', '2023-09-15 13:53:42', 'admin', '', + 'CRON', '0 0/1 * * * ?', 'DO_NOTHING', 'FIRST', 'wxAppShipment', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', + 'GLUE代码初始化', '2023-09-15 13:53:42', '', 0, 0, 0); diff --git a/db/2023-09-25 dubbo和spring cloud名命空间隔离.sql b/db/2023-09-25 dubbo和spring cloud名命空间隔离.sql new file mode 100644 index 0000000..8268912 --- /dev/null +++ b/db/2023-09-25 dubbo和spring cloud名命空间隔离.sql @@ -0,0 +1,13 @@ +USE `mall4cloud_nacos`; +UPDATE config_info +SET content= REPLACE(content, + 'parameters:\n namespace: ${spring.cloud.nacos.discovery.namespace}\n', + 'parameters:\n namespace: ${spring.cloud.nacos.discovery.namespace}-dubbo\n') +WHERE data_id = 'application.yml'; + +USE `mall4cloud_nacos`; +UPDATE config_info +SET content= REPLACE(content, + 'provider-namespace: ${spring.cloud.nacos.discovery.namespace}\n', + 'provider-namespace: ${spring.cloud.nacos.discovery.namespace}-dubbo\n') +WHERE data_id = 'application.yml'; \ No newline at end of file diff --git a/db/2023-10-30 虚拟核销记录.sql b/db/2023-10-30 虚拟核销记录.sql new file mode 100644 index 0000000..d6b16f3 --- /dev/null +++ b/db/2023-10-30 虚拟核销记录.sql @@ -0,0 +1,21 @@ +USE `mall4cloud_leaf`; +INSERT INTO leaf_alloc ( biz_tag, max_id, step, update_time, description, random_step ) + VALUE ( 'mall4cloud-order-virtual-info-log', 1, 1000, NOW(), 'mall4cloud虚拟订单核销记录', 10 ); + +USE `mall4cloud_product`; +# 商品添加固定运费字段 +ALTER TABLE `spu` + ADD COLUMN `delivery_amount` bigint(0) NULL COMMENT '运费固定金额' AFTER `delivery_template_id`; + + +# 电子面单菜单修改 +# 发货管理菜单改名电子面单,平台端位置移至会员菜单,供应商/商家端位置移至订单菜单 +update menu set name = '电子面单' ,title = '电子面单',parent_id = 147 +where name = '发货管理' and biz_type = 1; + +update menu set name = '电子面单' ,title = '电子面单',parent_id = 632 +where name = '发货管理' and biz_type = 2; + +update menu set name = '电子面单' ,title = '电子面单',parent_id = 448 +where name = '发货管理' and biz_type = 3; + diff --git a/db/2023-11-13 整合leaf模块.sql b/db/2023-11-13 整合leaf模块.sql new file mode 100644 index 0000000..5f2cffd --- /dev/null +++ b/db/2023-11-13 整合leaf模块.sql @@ -0,0 +1,22184 @@ +USE `mall4cloud_admin`; +DROP TABLE IF EXISTS `leaf_alloc`; +CREATE TABLE `leaf_alloc` ( + `biz_tag` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '区分业务', + `max_id` bigint unsigned NOT NULL DEFAULT '1' COMMENT '该biz_tag目前所被分配的ID号段的最大值', + `step` int NOT NULL COMMENT '每次分配的号段长度', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + PRIMARY KEY (`biz_tag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +insert into `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) values +('mall4cloud-authorization','1000000000000','1000','sys_access_key表的id'), +('mall4cloud-multishop-user','1000000000000','1000','shop_user表的id'), +('mall4cloud-platform-user','1000000000000','1000','sys_user表的id'), +('mall4cloud-purchase-amount-log','1000000000000','1000','采购金额日志id'), +('mall4cloud-shop-wallet-log','1000000000000','1000','MongoDB中shopWalletLog表的钱包日志id'), +('mall4cloud-supplier-user','1000000000000','1000','supplier_user表的id'); + + + + +USE `mall4cloud_auth`; +DROP TABLE IF EXISTS `leaf_alloc`; +CREATE TABLE `leaf_alloc` ( + `biz_tag` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '区分业务', + `max_id` bigint unsigned NOT NULL DEFAULT '1' COMMENT '该biz_tag目前所被分配的ID号段的最大值', + `step` int NOT NULL COMMENT '每次分配的号段长度', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + PRIMARY KEY (`biz_tag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +insert into `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) values +('mall4cloud-auth-account','1000000000000','1000','mall4cloud-multishop数据库中auth_account这张表的uid'); + + + + +USE `mall4cloud_flow`; +DROP TABLE IF EXISTS `leaf_alloc`; +CREATE TABLE `leaf_alloc` ( + `biz_tag` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '区分业务', + `max_id` bigint unsigned NOT NULL DEFAULT '1' COMMENT '该biz_tag目前所被分配的ID号段的最大值', + `step` int NOT NULL COMMENT '每次分配的号段长度', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + PRIMARY KEY (`biz_tag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +insert into `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) values +('mall4cloud-flow-user-id','1000000000000','1000','用户操作编号'); + + + + +USE `mall4cloud_group`; +DROP TABLE IF EXISTS `leaf_alloc`; +CREATE TABLE `leaf_alloc` ( + `biz_tag` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '区分业务', + `max_id` bigint unsigned NOT NULL DEFAULT '1' COMMENT '该biz_tag目前所被分配的ID号段的最大值', + `step` int NOT NULL COMMENT '每次分配的号段长度', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + PRIMARY KEY (`biz_tag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +insert into `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) values +('mall4cloud-order-000','1','1000','订单id'), +('mall4cloud-order-001','1','1000','订单id'), +('mall4cloud-order-002','1','1000','订单id'), +('mall4cloud-order-003','1','1000','订单id'), +('mall4cloud-order-004','1','1000','订单id'), +('mall4cloud-order-005','1','1000','订单id'), +('mall4cloud-order-006','1','1000','订单id'), +('mall4cloud-order-007','1','1000','订单id'), +('mall4cloud-order-008','1','1000','订单id'), +('mall4cloud-order-009','1','1000','订单id'), +('mall4cloud-order-010','1','1000','订单id'), +('mall4cloud-order-011','1','1000','订单id'), +('mall4cloud-order-012','1','1000','订单id'), +('mall4cloud-order-013','1','1000','订单id'), +('mall4cloud-order-014','1','1000','订单id'), +('mall4cloud-order-015','1','1000','订单id'), +('mall4cloud-order-016','1','1000','订单id'), +('mall4cloud-order-017','1','1000','订单id'), +('mall4cloud-order-018','1','1000','订单id'), +('mall4cloud-order-019','1','1000','订单id'), +('mall4cloud-order-020','1','1000','订单id'), +('mall4cloud-order-021','1','1000','订单id'), +('mall4cloud-order-022','1','1000','订单id'), +('mall4cloud-order-023','1','1000','订单id'), +('mall4cloud-order-024','1','1000','订单id'), +('mall4cloud-order-025','1','1000','订单id'), +('mall4cloud-order-026','1','1000','订单id'), +('mall4cloud-order-027','1','1000','订单id'), +('mall4cloud-order-028','1','1000','订单id'), +('mall4cloud-order-029','1','1000','订单id'), +('mall4cloud-order-030','1','1000','订单id'), +('mall4cloud-order-031','1','1000','订单id'), +('mall4cloud-order-032','1','1000','订单id'), +('mall4cloud-order-033','1','1000','订单id'), +('mall4cloud-order-034','1','1000','订单id'), +('mall4cloud-order-035','1','1000','订单id'), +('mall4cloud-order-036','1','1000','订单id'), +('mall4cloud-order-037','1','1000','订单id'), +('mall4cloud-order-038','1','1000','订单id'), +('mall4cloud-order-039','1','1000','订单id'), +('mall4cloud-order-040','1','1000','订单id'), +('mall4cloud-order-041','1','1000','订单id'), +('mall4cloud-order-042','1','1000','订单id'), +('mall4cloud-order-043','1','1000','订单id'), +('mall4cloud-order-044','1','1000','订单id'), +('mall4cloud-order-045','1','1000','订单id'), +('mall4cloud-order-046','1','1000','订单id'), +('mall4cloud-order-047','1','1000','订单id'), +('mall4cloud-order-048','1','1000','订单id'), +('mall4cloud-order-049','1','1000','订单id'), +('mall4cloud-order-050','1','1000','订单id'), +('mall4cloud-order-051','1','1000','订单id'), +('mall4cloud-order-052','1','1000','订单id'), +('mall4cloud-order-053','1','1000','订单id'), +('mall4cloud-order-054','1','1000','订单id'), +('mall4cloud-order-055','1','1000','订单id'), +('mall4cloud-order-056','1','1000','订单id'), +('mall4cloud-order-057','1','1000','订单id'), +('mall4cloud-order-058','1','1000','订单id'), +('mall4cloud-order-059','1','1000','订单id'), +('mall4cloud-order-060','1','1000','订单id'), +('mall4cloud-order-061','1','1000','订单id'), +('mall4cloud-order-062','1','1000','订单id'), +('mall4cloud-order-063','1','1000','订单id'), +('mall4cloud-order-064','1','1000','订单id'), +('mall4cloud-order-065','1','1000','订单id'), +('mall4cloud-order-066','1','1000','订单id'), +('mall4cloud-order-067','1','1000','订单id'), +('mall4cloud-order-068','1','1000','订单id'), +('mall4cloud-order-069','1','1000','订单id'), +('mall4cloud-order-070','1','1000','订单id'), +('mall4cloud-order-071','1','1000','订单id'), +('mall4cloud-order-072','1','1000','订单id'), +('mall4cloud-order-073','1','1000','订单id'), +('mall4cloud-order-074','1','1000','订单id'), +('mall4cloud-order-075','1','1000','订单id'), +('mall4cloud-order-076','1','1000','订单id'), +('mall4cloud-order-077','1','1000','订单id'), +('mall4cloud-order-078','1','1000','订单id'), +('mall4cloud-order-079','1','1000','订单id'), +('mall4cloud-order-080','1','1000','订单id'), +('mall4cloud-order-081','1','1000','订单id'), +('mall4cloud-order-082','1','1000','订单id'), +('mall4cloud-order-083','1','1000','订单id'), +('mall4cloud-order-084','1','1000','订单id'), +('mall4cloud-order-085','1','1000','订单id'), +('mall4cloud-order-086','1','1000','订单id'), +('mall4cloud-order-087','1','1000','订单id'), +('mall4cloud-order-088','1','1000','订单id'), +('mall4cloud-order-089','1','1000','订单id'), +('mall4cloud-order-090','1','1000','订单id'), +('mall4cloud-order-091','1','1000','订单id'), +('mall4cloud-order-092','1','1000','订单id'), +('mall4cloud-order-093','1','1000','订单id'), +('mall4cloud-order-094','1','1000','订单id'), +('mall4cloud-order-095','1','1000','订单id'), +('mall4cloud-order-096','1','1000','订单id'), +('mall4cloud-order-097','1','1000','订单id'), +('mall4cloud-order-098','1','1000','订单id'), +('mall4cloud-order-099','1','1000','订单id'), +('mall4cloud-order-100','1','1000','订单id'), +('mall4cloud-order-101','1','1000','订单id'), +('mall4cloud-order-102','1','1000','订单id'), +('mall4cloud-order-103','1','1000','订单id'), +('mall4cloud-order-104','1','1000','订单id'), +('mall4cloud-order-105','1','1000','订单id'), +('mall4cloud-order-106','1','1000','订单id'), +('mall4cloud-order-107','1','1000','订单id'), +('mall4cloud-order-108','1','1000','订单id'), +('mall4cloud-order-109','1','1000','订单id'), +('mall4cloud-order-110','1','1000','订单id'), +('mall4cloud-order-111','1','1000','订单id'), +('mall4cloud-order-112','1','1000','订单id'), +('mall4cloud-order-113','1','1000','订单id'), +('mall4cloud-order-114','1','1000','订单id'), +('mall4cloud-order-115','1','1000','订单id'), +('mall4cloud-order-116','1','1000','订单id'), +('mall4cloud-order-117','1','1000','订单id'), +('mall4cloud-order-118','1','1000','订单id'), +('mall4cloud-order-119','1','1000','订单id'), +('mall4cloud-order-120','1','1000','订单id'), +('mall4cloud-order-121','1','1000','订单id'), +('mall4cloud-order-122','1','1000','订单id'), +('mall4cloud-order-123','1','1000','订单id'), +('mall4cloud-order-124','1','1000','订单id'), +('mall4cloud-order-125','1','1000','订单id'), +('mall4cloud-order-126','1','1000','订单id'), +('mall4cloud-order-127','1','1000','订单id'), +('mall4cloud-order-128','1','1000','订单id'), +('mall4cloud-order-129','1','1000','订单id'), +('mall4cloud-order-130','1','1000','订单id'), +('mall4cloud-order-131','1','1000','订单id'), +('mall4cloud-order-132','1','1000','订单id'), +('mall4cloud-order-133','1','1000','订单id'), +('mall4cloud-order-134','1','1000','订单id'), +('mall4cloud-order-135','1','1000','订单id'), +('mall4cloud-order-136','1','1000','订单id'), +('mall4cloud-order-137','1','1000','订单id'), +('mall4cloud-order-138','1','1000','订单id'), +('mall4cloud-order-139','1','1000','订单id'), +('mall4cloud-order-140','1','1000','订单id'), +('mall4cloud-order-141','1','1000','订单id'), +('mall4cloud-order-142','1','1000','订单id'), +('mall4cloud-order-143','1','1000','订单id'), +('mall4cloud-order-144','1','1000','订单id'), +('mall4cloud-order-145','1','1000','订单id'), +('mall4cloud-order-146','1','1000','订单id'), +('mall4cloud-order-147','1','1000','订单id'), +('mall4cloud-order-148','1','1000','订单id'), +('mall4cloud-order-149','1','1000','订单id'), +('mall4cloud-order-150','1','1000','订单id'), +('mall4cloud-order-151','1','1000','订单id'), +('mall4cloud-order-152','1','1000','订单id'), +('mall4cloud-order-153','1','1000','订单id'), +('mall4cloud-order-154','1','1000','订单id'), +('mall4cloud-order-155','1','1000','订单id'), +('mall4cloud-order-156','1','1000','订单id'), +('mall4cloud-order-157','1','1000','订单id'), +('mall4cloud-order-158','1','1000','订单id'), +('mall4cloud-order-159','1','1000','订单id'), +('mall4cloud-order-160','1','1000','订单id'), +('mall4cloud-order-161','1','1000','订单id'), +('mall4cloud-order-162','1','1000','订单id'), +('mall4cloud-order-163','1','1000','订单id'), +('mall4cloud-order-164','1','1000','订单id'), +('mall4cloud-order-165','1','1000','订单id'), +('mall4cloud-order-166','1','1000','订单id'), +('mall4cloud-order-167','1','1000','订单id'), +('mall4cloud-order-168','1','1000','订单id'), +('mall4cloud-order-169','1','1000','订单id'), +('mall4cloud-order-170','1','1000','订单id'), +('mall4cloud-order-171','1','1000','订单id'), +('mall4cloud-order-172','1','1000','订单id'), +('mall4cloud-order-173','1','1000','订单id'), +('mall4cloud-order-174','1','1000','订单id'), +('mall4cloud-order-175','1','1000','订单id'), +('mall4cloud-order-176','1','1000','订单id'), +('mall4cloud-order-177','1','1000','订单id'), +('mall4cloud-order-178','1','1000','订单id'), +('mall4cloud-order-179','1','1000','订单id'), +('mall4cloud-order-180','1','1000','订单id'), +('mall4cloud-order-181','1','1000','订单id'), +('mall4cloud-order-182','1','1000','订单id'), +('mall4cloud-order-183','1','1000','订单id'), +('mall4cloud-order-184','1','1000','订单id'), +('mall4cloud-order-185','1','1000','订单id'), +('mall4cloud-order-186','1','1000','订单id'), +('mall4cloud-order-187','1','1000','订单id'), +('mall4cloud-order-188','1','1000','订单id'), +('mall4cloud-order-189','1','1000','订单id'), +('mall4cloud-order-190','1','1000','订单id'), +('mall4cloud-order-191','1','1000','订单id'), +('mall4cloud-order-192','1','1000','订单id'), +('mall4cloud-order-193','1','1000','订单id'), +('mall4cloud-order-194','1','1000','订单id'), +('mall4cloud-order-195','1','1000','订单id'), +('mall4cloud-order-196','1','1000','订单id'), +('mall4cloud-order-197','1','1000','订单id'), +('mall4cloud-order-198','1','1000','订单id'), +('mall4cloud-order-199','1','1000','订单id'), +('mall4cloud-order-200','1','1000','订单id'), +('mall4cloud-order-201','1','1000','订单id'), +('mall4cloud-order-202','1','1000','订单id'), +('mall4cloud-order-203','1','1000','订单id'), +('mall4cloud-order-204','1','1000','订单id'), +('mall4cloud-order-205','1','1000','订单id'), +('mall4cloud-order-206','1','1000','订单id'), +('mall4cloud-order-207','1','1000','订单id'), +('mall4cloud-order-208','1','1000','订单id'), +('mall4cloud-order-209','1','1000','订单id'), +('mall4cloud-order-210','1','1000','订单id'), +('mall4cloud-order-211','1','1000','订单id'), +('mall4cloud-order-212','1','1000','订单id'), +('mall4cloud-order-213','1','1000','订单id'), +('mall4cloud-order-214','1','1000','订单id'), +('mall4cloud-order-215','1','1000','订单id'), +('mall4cloud-order-216','1','1000','订单id'), +('mall4cloud-order-217','1','1000','订单id'), +('mall4cloud-order-218','1','1000','订单id'), +('mall4cloud-order-219','1','1000','订单id'), +('mall4cloud-order-220','1','1000','订单id'), +('mall4cloud-order-221','1','1000','订单id'), +('mall4cloud-order-222','1','1000','订单id'), +('mall4cloud-order-223','1','1000','订单id'), +('mall4cloud-order-224','1','1000','订单id'), +('mall4cloud-order-225','1','1000','订单id'), +('mall4cloud-order-226','1','1000','订单id'), +('mall4cloud-order-227','1','1000','订单id'), +('mall4cloud-order-228','1','1000','订单id'), +('mall4cloud-order-229','1','1000','订单id'), +('mall4cloud-order-230','1','1000','订单id'), +('mall4cloud-order-231','1','1000','订单id'), +('mall4cloud-order-232','1','1000','订单id'), +('mall4cloud-order-233','1','1000','订单id'), +('mall4cloud-order-234','1','1000','订单id'), +('mall4cloud-order-235','1','1000','订单id'), +('mall4cloud-order-236','1','1000','订单id'), +('mall4cloud-order-237','1','1000','订单id'), +('mall4cloud-order-238','1','1000','订单id'), +('mall4cloud-order-239','1','1000','订单id'), +('mall4cloud-order-240','1','1000','订单id'), +('mall4cloud-order-241','1','1000','订单id'), +('mall4cloud-order-242','1','1000','订单id'), +('mall4cloud-order-243','1','1000','订单id'), +('mall4cloud-order-244','1','1000','订单id'), +('mall4cloud-order-245','1','1000','订单id'), +('mall4cloud-order-246','1','1000','订单id'), +('mall4cloud-order-247','1','1000','订单id'), +('mall4cloud-order-248','1','1000','订单id'), +('mall4cloud-order-249','1','1000','订单id'), +('mall4cloud-order-250','1','1000','订单id'), +('mall4cloud-order-251','1','1000','订单id'), +('mall4cloud-order-252','1','1000','订单id'), +('mall4cloud-order-253','1','1000','订单id'), +('mall4cloud-order-254','1','1000','订单id'), +('mall4cloud-order-255','1','1000','订单id'), +('mall4cloud-order-256','1','1000','订单id'), +('mall4cloud-order-257','1','1000','订单id'), +('mall4cloud-order-258','1','1000','订单id'), +('mall4cloud-order-259','1','1000','订单id'), +('mall4cloud-order-260','1','1000','订单id'), +('mall4cloud-order-261','1','1000','订单id'), +('mall4cloud-order-262','1','1000','订单id'), +('mall4cloud-order-263','1','1000','订单id'), +('mall4cloud-order-264','1','1000','订单id'), +('mall4cloud-order-265','1','1000','订单id'), +('mall4cloud-order-266','1','1000','订单id'), +('mall4cloud-order-267','1','1000','订单id'), +('mall4cloud-order-268','1','1000','订单id'), +('mall4cloud-order-269','1','1000','订单id'), +('mall4cloud-order-270','1','1000','订单id'), +('mall4cloud-order-271','1','1000','订单id'), +('mall4cloud-order-272','1','1000','订单id'), +('mall4cloud-order-273','1','1000','订单id'), +('mall4cloud-order-274','1','1000','订单id'), +('mall4cloud-order-275','1','1000','订单id'), +('mall4cloud-order-276','1','1000','订单id'), +('mall4cloud-order-277','1','1000','订单id'), +('mall4cloud-order-278','1','1000','订单id'), +('mall4cloud-order-279','1','1000','订单id'), +('mall4cloud-order-280','1','1000','订单id'), +('mall4cloud-order-281','1','1000','订单id'), +('mall4cloud-order-282','1','1000','订单id'), +('mall4cloud-order-283','1','1000','订单id'), +('mall4cloud-order-284','1','1000','订单id'), +('mall4cloud-order-285','1','1000','订单id'), +('mall4cloud-order-286','1','1000','订单id'), +('mall4cloud-order-287','1','1000','订单id'), +('mall4cloud-order-288','1','1000','订单id'), +('mall4cloud-order-289','1','1000','订单id'), +('mall4cloud-order-290','1','1000','订单id'), +('mall4cloud-order-291','1','1000','订单id'), +('mall4cloud-order-292','1','1000','订单id'), +('mall4cloud-order-293','1','1000','订单id'), +('mall4cloud-order-294','1','1000','订单id'), +('mall4cloud-order-295','1','1000','订单id'), +('mall4cloud-order-296','1','1000','订单id'), +('mall4cloud-order-297','1','1000','订单id'), +('mall4cloud-order-298','1','1000','订单id'), +('mall4cloud-order-299','1','1000','订单id'), +('mall4cloud-order-300','1','1000','订单id'), +('mall4cloud-order-301','1','1000','订单id'), +('mall4cloud-order-302','1','1000','订单id'), +('mall4cloud-order-303','1','1000','订单id'), +('mall4cloud-order-304','1','1000','订单id'), +('mall4cloud-order-305','1','1000','订单id'), +('mall4cloud-order-306','1','1000','订单id'), +('mall4cloud-order-307','1','1000','订单id'), +('mall4cloud-order-308','1','1000','订单id'), +('mall4cloud-order-309','1','1000','订单id'), +('mall4cloud-order-310','1','1000','订单id'), +('mall4cloud-order-311','1','1000','订单id'), +('mall4cloud-order-312','1','1000','订单id'), +('mall4cloud-order-313','1','1000','订单id'), +('mall4cloud-order-314','1','1000','订单id'), +('mall4cloud-order-315','1','1000','订单id'), +('mall4cloud-order-316','1','1000','订单id'), +('mall4cloud-order-317','1','1000','订单id'), +('mall4cloud-order-318','1','1000','订单id'), +('mall4cloud-order-319','1','1000','订单id'), +('mall4cloud-order-320','1','1000','订单id'), +('mall4cloud-order-321','1','1000','订单id'), +('mall4cloud-order-322','1','1000','订单id'), +('mall4cloud-order-323','1','1000','订单id'), +('mall4cloud-order-324','1','1000','订单id'), +('mall4cloud-order-325','1','1000','订单id'), +('mall4cloud-order-326','1','1000','订单id'), +('mall4cloud-order-327','1','1000','订单id'), +('mall4cloud-order-328','1','1000','订单id'), +('mall4cloud-order-329','1','1000','订单id'), +('mall4cloud-order-330','1','1000','订单id'), +('mall4cloud-order-331','1','1000','订单id'), +('mall4cloud-order-332','1','1000','订单id'), +('mall4cloud-order-333','1','1000','订单id'), +('mall4cloud-order-334','1','1000','订单id'), +('mall4cloud-order-335','1','1000','订单id'), +('mall4cloud-order-336','1','1000','订单id'), +('mall4cloud-order-337','1','1000','订单id'), +('mall4cloud-order-338','1','1000','订单id'), +('mall4cloud-order-339','1','1000','订单id'), +('mall4cloud-order-340','1','1000','订单id'), +('mall4cloud-order-341','1','1000','订单id'), +('mall4cloud-order-342','1','1000','订单id'), +('mall4cloud-order-343','1','1000','订单id'), +('mall4cloud-order-344','1','1000','订单id'), +('mall4cloud-order-345','1','1000','订单id'), +('mall4cloud-order-346','1','1000','订单id'), +('mall4cloud-order-347','1','1000','订单id'), +('mall4cloud-order-348','1','1000','订单id'), +('mall4cloud-order-349','1','1000','订单id'), +('mall4cloud-order-350','1','1000','订单id'), +('mall4cloud-order-351','1','1000','订单id'), +('mall4cloud-order-352','1','1000','订单id'), +('mall4cloud-order-353','1','1000','订单id'), +('mall4cloud-order-354','1','1000','订单id'), +('mall4cloud-order-355','1','1000','订单id'), +('mall4cloud-order-356','1','1000','订单id'), +('mall4cloud-order-357','1','1000','订单id'), +('mall4cloud-order-358','1','1000','订单id'), +('mall4cloud-order-359','1','1000','订单id'), +('mall4cloud-order-360','1','1000','订单id'), +('mall4cloud-order-361','1','1000','订单id'), +('mall4cloud-order-362','1','1000','订单id'), +('mall4cloud-order-363','1','1000','订单id'), +('mall4cloud-order-364','1','1000','订单id'), +('mall4cloud-order-365','1','1000','订单id'), +('mall4cloud-order-366','1','1000','订单id'), +('mall4cloud-order-367','1','1000','订单id'), +('mall4cloud-order-368','1','1000','订单id'), +('mall4cloud-order-369','1','1000','订单id'), +('mall4cloud-order-370','1','1000','订单id'), +('mall4cloud-order-371','1','1000','订单id'), +('mall4cloud-order-372','1','1000','订单id'), +('mall4cloud-order-373','1','1000','订单id'), +('mall4cloud-order-374','1','1000','订单id'), +('mall4cloud-order-375','1','1000','订单id'), +('mall4cloud-order-376','1','1000','订单id'), +('mall4cloud-order-377','1','1000','订单id'), +('mall4cloud-order-378','1','1000','订单id'), +('mall4cloud-order-379','1','1000','订单id'), +('mall4cloud-order-380','1','1000','订单id'), +('mall4cloud-order-381','1','1000','订单id'), +('mall4cloud-order-382','1','1000','订单id'), +('mall4cloud-order-383','1','1000','订单id'), +('mall4cloud-order-384','1','1000','订单id'), +('mall4cloud-order-385','1','1000','订单id'), +('mall4cloud-order-386','1','1000','订单id'), +('mall4cloud-order-387','1','1000','订单id'), +('mall4cloud-order-388','1','1000','订单id'), +('mall4cloud-order-389','1','1000','订单id'), +('mall4cloud-order-390','1','1000','订单id'), +('mall4cloud-order-391','1','1000','订单id'), +('mall4cloud-order-392','1','1000','订单id'), +('mall4cloud-order-393','1','1000','订单id'), +('mall4cloud-order-394','1','1000','订单id'), +('mall4cloud-order-395','1','1000','订单id'), +('mall4cloud-order-396','1','1000','订单id'), +('mall4cloud-order-397','1','1000','订单id'), +('mall4cloud-order-398','1','1000','订单id'), +('mall4cloud-order-399','1','1000','订单id'), +('mall4cloud-order-400','1','1000','订单id'), +('mall4cloud-order-401','1','1000','订单id'), +('mall4cloud-order-402','1','1000','订单id'), +('mall4cloud-order-403','1','1000','订单id'), +('mall4cloud-order-404','1','1000','订单id'), +('mall4cloud-order-405','1','1000','订单id'), +('mall4cloud-order-406','1','1000','订单id'), +('mall4cloud-order-407','1','1000','订单id'), +('mall4cloud-order-408','1','1000','订单id'), +('mall4cloud-order-409','1','1000','订单id'), +('mall4cloud-order-410','1','1000','订单id'), +('mall4cloud-order-411','1','1000','订单id'), +('mall4cloud-order-412','1','1000','订单id'), +('mall4cloud-order-413','1','1000','订单id'), +('mall4cloud-order-414','1','1000','订单id'), +('mall4cloud-order-415','1','1000','订单id'), +('mall4cloud-order-416','1','1000','订单id'), +('mall4cloud-order-417','1','1000','订单id'), +('mall4cloud-order-418','1','1000','订单id'), +('mall4cloud-order-419','1','1000','订单id'), +('mall4cloud-order-420','1','1000','订单id'), +('mall4cloud-order-421','1','1000','订单id'), +('mall4cloud-order-422','1','1000','订单id'), +('mall4cloud-order-423','1','1000','订单id'), +('mall4cloud-order-424','1','1000','订单id'), +('mall4cloud-order-425','1','1000','订单id'), +('mall4cloud-order-426','1','1000','订单id'), +('mall4cloud-order-427','1','1000','订单id'), +('mall4cloud-order-428','1','1000','订单id'), +('mall4cloud-order-429','1','1000','订单id'), +('mall4cloud-order-430','1','1000','订单id'), +('mall4cloud-order-431','1','1000','订单id'), +('mall4cloud-order-432','1','1000','订单id'), +('mall4cloud-order-433','1','1000','订单id'), +('mall4cloud-order-434','1','1000','订单id'), +('mall4cloud-order-435','1','1000','订单id'), +('mall4cloud-order-436','1','1000','订单id'), +('mall4cloud-order-437','1','1000','订单id'), +('mall4cloud-order-438','1','1000','订单id'), +('mall4cloud-order-439','1','1000','订单id'), +('mall4cloud-order-440','1','1000','订单id'), +('mall4cloud-order-441','1','1000','订单id'), +('mall4cloud-order-442','1','1000','订单id'), +('mall4cloud-order-443','1','1000','订单id'), +('mall4cloud-order-444','1','1000','订单id'), +('mall4cloud-order-445','1','1000','订单id'), +('mall4cloud-order-446','1','1000','订单id'), +('mall4cloud-order-447','1','1000','订单id'), +('mall4cloud-order-448','1','1000','订单id'), +('mall4cloud-order-449','1','1000','订单id'), +('mall4cloud-order-450','1','1000','订单id'), +('mall4cloud-order-451','1','1000','订单id'), +('mall4cloud-order-452','1','1000','订单id'), +('mall4cloud-order-453','1','1000','订单id'), +('mall4cloud-order-454','1','1000','订单id'), +('mall4cloud-order-455','1','1000','订单id'), +('mall4cloud-order-456','1','1000','订单id'), +('mall4cloud-order-457','1','1000','订单id'), +('mall4cloud-order-458','1','1000','订单id'), +('mall4cloud-order-459','1','1000','订单id'), +('mall4cloud-order-460','1','1000','订单id'), +('mall4cloud-order-461','1','1000','订单id'), +('mall4cloud-order-462','1','1000','订单id'), +('mall4cloud-order-463','1','1000','订单id'), +('mall4cloud-order-464','1','1000','订单id'), +('mall4cloud-order-465','1','1000','订单id'), +('mall4cloud-order-466','1','1000','订单id'), +('mall4cloud-order-467','1','1000','订单id'), +('mall4cloud-order-468','1','1000','订单id'), +('mall4cloud-order-469','1','1000','订单id'), +('mall4cloud-order-470','1','1000','订单id'), +('mall4cloud-order-471','1','1000','订单id'), +('mall4cloud-order-472','1','1000','订单id'), +('mall4cloud-order-473','1','1000','订单id'), +('mall4cloud-order-474','1','1000','订单id'), +('mall4cloud-order-475','1','1000','订单id'), +('mall4cloud-order-476','1','1000','订单id'), +('mall4cloud-order-477','1','1000','订单id'), +('mall4cloud-order-478','1','1000','订单id'), +('mall4cloud-order-479','1','1000','订单id'), +('mall4cloud-order-480','1','1000','订单id'), +('mall4cloud-order-481','1','1000','订单id'), +('mall4cloud-order-482','1','1000','订单id'), +('mall4cloud-order-483','1','1000','订单id'), +('mall4cloud-order-484','1','1000','订单id'), +('mall4cloud-order-485','1','1000','订单id'), +('mall4cloud-order-486','1','1000','订单id'), +('mall4cloud-order-487','1','1000','订单id'), +('mall4cloud-order-488','1','1000','订单id'), +('mall4cloud-order-489','1','1000','订单id'), +('mall4cloud-order-490','1','1000','订单id'), +('mall4cloud-order-491','1','1000','订单id'), +('mall4cloud-order-492','1','1000','订单id'), +('mall4cloud-order-493','1','1000','订单id'), +('mall4cloud-order-494','1','1000','订单id'), +('mall4cloud-order-495','1','1000','订单id'), +('mall4cloud-order-496','1','1000','订单id'), +('mall4cloud-order-497','1','1000','订单id'), +('mall4cloud-order-498','1','1000','订单id'), +('mall4cloud-order-499','1','1000','订单id'), +('mall4cloud-order-500','1','1000','订单id'), +('mall4cloud-order-501','1','1000','订单id'), +('mall4cloud-order-502','1','1000','订单id'), +('mall4cloud-order-503','1','1000','订单id'), +('mall4cloud-order-504','1','1000','订单id'), +('mall4cloud-order-505','1','1000','订单id'), +('mall4cloud-order-506','1','1000','订单id'), +('mall4cloud-order-507','1','1000','订单id'), +('mall4cloud-order-508','1','1000','订单id'), +('mall4cloud-order-509','1','1000','订单id'), +('mall4cloud-order-510','1','1000','订单id'), +('mall4cloud-order-511','1','1000','订单id'), +('mall4cloud-order-512','1','1000','订单id'), +('mall4cloud-order-513','1','1000','订单id'), +('mall4cloud-order-514','1','1000','订单id'), +('mall4cloud-order-515','1','1000','订单id'), +('mall4cloud-order-516','1','1000','订单id'), +('mall4cloud-order-517','1','1000','订单id'), +('mall4cloud-order-518','1','1000','订单id'), +('mall4cloud-order-519','1','1000','订单id'), +('mall4cloud-order-520','1','1000','订单id'), +('mall4cloud-order-521','1','1000','订单id'), +('mall4cloud-order-522','1','1000','订单id'), +('mall4cloud-order-523','1','1000','订单id'), +('mall4cloud-order-524','1','1000','订单id'), +('mall4cloud-order-525','1','1000','订单id'), +('mall4cloud-order-526','1','1000','订单id'), +('mall4cloud-order-527','1','1000','订单id'), +('mall4cloud-order-528','1','1000','订单id'), +('mall4cloud-order-529','1','1000','订单id'), +('mall4cloud-order-530','1','1000','订单id'), +('mall4cloud-order-531','1','1000','订单id'), +('mall4cloud-order-532','1','1000','订单id'), +('mall4cloud-order-533','1','1000','订单id'), +('mall4cloud-order-534','1','1000','订单id'), +('mall4cloud-order-535','1','1000','订单id'), +('mall4cloud-order-536','1','1000','订单id'), +('mall4cloud-order-537','1','1000','订单id'), +('mall4cloud-order-538','1','1000','订单id'), +('mall4cloud-order-539','1','1000','订单id'), +('mall4cloud-order-540','1','1000','订单id'), +('mall4cloud-order-541','1','1000','订单id'), +('mall4cloud-order-542','1','1000','订单id'), +('mall4cloud-order-543','1','1000','订单id'), +('mall4cloud-order-544','1','1000','订单id'), +('mall4cloud-order-545','1','1000','订单id'), +('mall4cloud-order-546','1','1000','订单id'), +('mall4cloud-order-547','1','1000','订单id'), +('mall4cloud-order-548','1','1000','订单id'), +('mall4cloud-order-549','1','1000','订单id'), +('mall4cloud-order-550','1','1000','订单id'), +('mall4cloud-order-551','1','1000','订单id'), +('mall4cloud-order-552','1','1000','订单id'), +('mall4cloud-order-553','1','1000','订单id'), +('mall4cloud-order-554','1','1000','订单id'), +('mall4cloud-order-555','1','1000','订单id'), +('mall4cloud-order-556','1','1000','订单id'), +('mall4cloud-order-557','1','1000','订单id'), +('mall4cloud-order-558','1','1000','订单id'), +('mall4cloud-order-559','1','1000','订单id'), +('mall4cloud-order-560','1','1000','订单id'), +('mall4cloud-order-561','1','1000','订单id'), +('mall4cloud-order-562','1','1000','订单id'), +('mall4cloud-order-563','1','1000','订单id'), +('mall4cloud-order-564','1','1000','订单id'), +('mall4cloud-order-565','1','1000','订单id'), +('mall4cloud-order-566','1','1000','订单id'), +('mall4cloud-order-567','1','1000','订单id'), +('mall4cloud-order-568','1','1000','订单id'), +('mall4cloud-order-569','1','1000','订单id'), +('mall4cloud-order-570','1','1000','订单id'), +('mall4cloud-order-571','1','1000','订单id'), +('mall4cloud-order-572','1','1000','订单id'), +('mall4cloud-order-573','1','1000','订单id'), +('mall4cloud-order-574','1','1000','订单id'), +('mall4cloud-order-575','1','1000','订单id'), +('mall4cloud-order-576','1','1000','订单id'), +('mall4cloud-order-577','1','1000','订单id'), +('mall4cloud-order-578','1','1000','订单id'), +('mall4cloud-order-579','1','1000','订单id'), +('mall4cloud-order-580','1','1000','订单id'), +('mall4cloud-order-581','1','1000','订单id'), +('mall4cloud-order-582','1','1000','订单id'), +('mall4cloud-order-583','1','1000','订单id'), +('mall4cloud-order-584','1','1000','订单id'), +('mall4cloud-order-585','1','1000','订单id'), +('mall4cloud-order-586','1','1000','订单id'), +('mall4cloud-order-587','1','1000','订单id'), +('mall4cloud-order-588','1','1000','订单id'), +('mall4cloud-order-589','1','1000','订单id'), +('mall4cloud-order-590','1','1000','订单id'), +('mall4cloud-order-591','1','1000','订单id'), +('mall4cloud-order-592','1','1000','订单id'), +('mall4cloud-order-593','1','1000','订单id'), +('mall4cloud-order-594','1','1000','订单id'), +('mall4cloud-order-595','1','1000','订单id'), +('mall4cloud-order-596','1','1000','订单id'), +('mall4cloud-order-597','1','1000','订单id'), +('mall4cloud-order-598','1','1000','订单id'), +('mall4cloud-order-599','1','1000','订单id'), +('mall4cloud-order-600','1','1000','订单id'), +('mall4cloud-order-601','1','1000','订单id'), +('mall4cloud-order-602','1','1000','订单id'), +('mall4cloud-order-603','1','1000','订单id'), +('mall4cloud-order-604','1','1000','订单id'), +('mall4cloud-order-605','1','1000','订单id'), +('mall4cloud-order-606','1','1000','订单id'), +('mall4cloud-order-607','1','1000','订单id'), +('mall4cloud-order-608','1','1000','订单id'), +('mall4cloud-order-609','1','1000','订单id'), +('mall4cloud-order-610','1','1000','订单id'), +('mall4cloud-order-611','1','1000','订单id'), +('mall4cloud-order-612','1','1000','订单id'), +('mall4cloud-order-613','1','1000','订单id'), +('mall4cloud-order-614','1','1000','订单id'), +('mall4cloud-order-615','1','1000','订单id'), +('mall4cloud-order-616','1','1000','订单id'), +('mall4cloud-order-617','1','1000','订单id'), +('mall4cloud-order-618','1','1000','订单id'), +('mall4cloud-order-619','1','1000','订单id'), +('mall4cloud-order-620','1','1000','订单id'), +('mall4cloud-order-621','1','1000','订单id'), +('mall4cloud-order-622','1','1000','订单id'), +('mall4cloud-order-623','1','1000','订单id'), +('mall4cloud-order-624','1','1000','订单id'), +('mall4cloud-order-625','1','1000','订单id'), +('mall4cloud-order-626','1','1000','订单id'), +('mall4cloud-order-627','1','1000','订单id'), +('mall4cloud-order-628','1','1000','订单id'), +('mall4cloud-order-629','1','1000','订单id'), +('mall4cloud-order-630','1','1000','订单id'), +('mall4cloud-order-631','1','1000','订单id'), +('mall4cloud-order-632','1','1000','订单id'), +('mall4cloud-order-633','1','1000','订单id'), +('mall4cloud-order-634','1','1000','订单id'), +('mall4cloud-order-635','1','1000','订单id'), +('mall4cloud-order-636','1','1000','订单id'), +('mall4cloud-order-637','1','1000','订单id'), +('mall4cloud-order-638','1','1000','订单id'), +('mall4cloud-order-639','1','1000','订单id'), +('mall4cloud-order-640','1','1000','订单id'), +('mall4cloud-order-641','1','1000','订单id'), +('mall4cloud-order-642','1','1000','订单id'), +('mall4cloud-order-643','1','1000','订单id'), +('mall4cloud-order-644','1','1000','订单id'), +('mall4cloud-order-645','1','1000','订单id'), +('mall4cloud-order-646','1','1000','订单id'), +('mall4cloud-order-647','1','1000','订单id'), +('mall4cloud-order-648','1','1000','订单id'), +('mall4cloud-order-649','1','1000','订单id'), +('mall4cloud-order-650','1','1000','订单id'), +('mall4cloud-order-651','1','1000','订单id'), +('mall4cloud-order-652','1','1000','订单id'), +('mall4cloud-order-653','1','1000','订单id'), +('mall4cloud-order-654','1','1000','订单id'), +('mall4cloud-order-655','1','1000','订单id'), +('mall4cloud-order-656','1','1000','订单id'), +('mall4cloud-order-657','1','1000','订单id'), +('mall4cloud-order-658','1','1000','订单id'), +('mall4cloud-order-659','1','1000','订单id'), +('mall4cloud-order-660','1','1000','订单id'), +('mall4cloud-order-661','1','1000','订单id'), +('mall4cloud-order-662','1','1000','订单id'), +('mall4cloud-order-663','1','1000','订单id'), +('mall4cloud-order-664','1','1000','订单id'), +('mall4cloud-order-665','1','1000','订单id'), +('mall4cloud-order-666','1','1000','订单id'), +('mall4cloud-order-667','1','1000','订单id'), +('mall4cloud-order-668','1','1000','订单id'), +('mall4cloud-order-669','1','1000','订单id'), +('mall4cloud-order-670','1','1000','订单id'), +('mall4cloud-order-671','1','1000','订单id'), +('mall4cloud-order-672','1','1000','订单id'), +('mall4cloud-order-673','1','1000','订单id'), +('mall4cloud-order-674','1','1000','订单id'), +('mall4cloud-order-675','1','1000','订单id'), +('mall4cloud-order-676','1','1000','订单id'), +('mall4cloud-order-677','1','1000','订单id'), +('mall4cloud-order-678','1','1000','订单id'), +('mall4cloud-order-679','1','1000','订单id'), +('mall4cloud-order-680','1','1000','订单id'), +('mall4cloud-order-681','1','1000','订单id'), +('mall4cloud-order-682','1','1000','订单id'), +('mall4cloud-order-683','1','1000','订单id'), +('mall4cloud-order-684','1','1000','订单id'), +('mall4cloud-order-685','1','1000','订单id'), +('mall4cloud-order-686','1','1000','订单id'), +('mall4cloud-order-687','1','1000','订单id'), +('mall4cloud-order-688','1','1000','订单id'), +('mall4cloud-order-689','1','1000','订单id'), +('mall4cloud-order-690','1','1000','订单id'), +('mall4cloud-order-691','1','1000','订单id'), +('mall4cloud-order-692','1','1000','订单id'), +('mall4cloud-order-693','1','1000','订单id'), +('mall4cloud-order-694','1','1000','订单id'), +('mall4cloud-order-695','1','1000','订单id'), +('mall4cloud-order-696','1','1000','订单id'), +('mall4cloud-order-697','1','1000','订单id'), +('mall4cloud-order-698','1','1000','订单id'), +('mall4cloud-order-699','1','1000','订单id'), +('mall4cloud-order-700','1','1000','订单id'), +('mall4cloud-order-701','1','1000','订单id'), +('mall4cloud-order-702','1','1000','订单id'), +('mall4cloud-order-703','1','1000','订单id'), +('mall4cloud-order-704','1','1000','订单id'), +('mall4cloud-order-705','1','1000','订单id'), +('mall4cloud-order-706','1','1000','订单id'), +('mall4cloud-order-707','1','1000','订单id'), +('mall4cloud-order-708','1','1000','订单id'), +('mall4cloud-order-709','1','1000','订单id'), +('mall4cloud-order-710','1','1000','订单id'), +('mall4cloud-order-711','1','1000','订单id'), +('mall4cloud-order-712','1','1000','订单id'), +('mall4cloud-order-713','1','1000','订单id'), +('mall4cloud-order-714','1','1000','订单id'), +('mall4cloud-order-715','1','1000','订单id'), +('mall4cloud-order-716','1','1000','订单id'), +('mall4cloud-order-717','1','1000','订单id'), +('mall4cloud-order-718','1','1000','订单id'), +('mall4cloud-order-719','1','1000','订单id'), +('mall4cloud-order-720','1','1000','订单id'), +('mall4cloud-order-721','1','1000','订单id'), +('mall4cloud-order-722','1','1000','订单id'), +('mall4cloud-order-723','1','1000','订单id'), +('mall4cloud-order-724','1','1000','订单id'), +('mall4cloud-order-725','1','1000','订单id'), +('mall4cloud-order-726','1','1000','订单id'), +('mall4cloud-order-727','1','1000','订单id'), +('mall4cloud-order-728','1','1000','订单id'), +('mall4cloud-order-729','1','1000','订单id'), +('mall4cloud-order-730','1','1000','订单id'), +('mall4cloud-order-731','1','1000','订单id'), +('mall4cloud-order-732','1','1000','订单id'), +('mall4cloud-order-733','1','1000','订单id'), +('mall4cloud-order-734','1','1000','订单id'), +('mall4cloud-order-735','1','1000','订单id'), +('mall4cloud-order-736','1','1000','订单id'), +('mall4cloud-order-737','1','1000','订单id'), +('mall4cloud-order-738','1','1000','订单id'), +('mall4cloud-order-739','1','1000','订单id'), +('mall4cloud-order-740','1','1000','订单id'), +('mall4cloud-order-741','1','1000','订单id'), +('mall4cloud-order-742','1','1000','订单id'), +('mall4cloud-order-743','1','1000','订单id'), +('mall4cloud-order-744','1','1000','订单id'), +('mall4cloud-order-745','1','1000','订单id'), +('mall4cloud-order-746','1','1000','订单id'), +('mall4cloud-order-747','1','1000','订单id'), +('mall4cloud-order-748','1','1000','订单id'), +('mall4cloud-order-749','1','1000','订单id'), +('mall4cloud-order-750','1','1000','订单id'), +('mall4cloud-order-751','1','1000','订单id'), +('mall4cloud-order-752','1','1000','订单id'), +('mall4cloud-order-753','1','1000','订单id'), +('mall4cloud-order-754','1','1000','订单id'), +('mall4cloud-order-755','1','1000','订单id'), +('mall4cloud-order-756','1','1000','订单id'), +('mall4cloud-order-757','1','1000','订单id'), +('mall4cloud-order-758','1','1000','订单id'), +('mall4cloud-order-759','1','1000','订单id'), +('mall4cloud-order-760','1','1000','订单id'), +('mall4cloud-order-761','1','1000','订单id'), +('mall4cloud-order-762','1','1000','订单id'), +('mall4cloud-order-763','1','1000','订单id'), +('mall4cloud-order-764','1','1000','订单id'), +('mall4cloud-order-765','1','1000','订单id'), +('mall4cloud-order-766','1','1000','订单id'), +('mall4cloud-order-767','1','1000','订单id'), +('mall4cloud-order-768','1','1000','订单id'), +('mall4cloud-order-769','1','1000','订单id'), +('mall4cloud-order-770','1','1000','订单id'), +('mall4cloud-order-771','1','1000','订单id'), +('mall4cloud-order-772','1','1000','订单id'), +('mall4cloud-order-773','1','1000','订单id'), +('mall4cloud-order-774','1','1000','订单id'), +('mall4cloud-order-775','1','1000','订单id'), +('mall4cloud-order-776','1','1000','订单id'), +('mall4cloud-order-777','1','1000','订单id'), +('mall4cloud-order-778','1','1000','订单id'), +('mall4cloud-order-779','1','1000','订单id'), +('mall4cloud-order-780','1','1000','订单id'), +('mall4cloud-order-781','1','1000','订单id'), +('mall4cloud-order-782','1','1000','订单id'), +('mall4cloud-order-783','1','1000','订单id'), +('mall4cloud-order-784','1','1000','订单id'), +('mall4cloud-order-785','1','1000','订单id'), +('mall4cloud-order-786','1','1000','订单id'), +('mall4cloud-order-787','1','1000','订单id'), +('mall4cloud-order-788','1','1000','订单id'), +('mall4cloud-order-789','1','1000','订单id'), +('mall4cloud-order-790','1','1000','订单id'), +('mall4cloud-order-791','1','1000','订单id'), +('mall4cloud-order-792','1','1000','订单id'), +('mall4cloud-order-793','1','1000','订单id'), +('mall4cloud-order-794','1','1000','订单id'), +('mall4cloud-order-795','1','1000','订单id'), +('mall4cloud-order-796','1','1000','订单id'), +('mall4cloud-order-797','1','1000','订单id'), +('mall4cloud-order-798','1','1000','订单id'), +('mall4cloud-order-799','1','1000','订单id'), +('mall4cloud-order-800','1','1000','订单id'), +('mall4cloud-order-801','1','1000','订单id'), +('mall4cloud-order-802','1','1000','订单id'), +('mall4cloud-order-803','1','1000','订单id'), +('mall4cloud-order-804','1','1000','订单id'), +('mall4cloud-order-805','1','1000','订单id'), +('mall4cloud-order-806','1','1000','订单id'), +('mall4cloud-order-807','1','1000','订单id'), +('mall4cloud-order-808','1','1000','订单id'), +('mall4cloud-order-809','1','1000','订单id'), +('mall4cloud-order-810','1','1000','订单id'), +('mall4cloud-order-811','1','1000','订单id'), +('mall4cloud-order-812','1','1000','订单id'), +('mall4cloud-order-813','1','1000','订单id'), +('mall4cloud-order-814','1','1000','订单id'), +('mall4cloud-order-815','1','1000','订单id'), +('mall4cloud-order-816','1','1000','订单id'), +('mall4cloud-order-817','1','1000','订单id'), +('mall4cloud-order-818','1','1000','订单id'), +('mall4cloud-order-819','1','1000','订单id'), +('mall4cloud-order-820','1','1000','订单id'), +('mall4cloud-order-821','1','1000','订单id'), +('mall4cloud-order-822','1','1000','订单id'), +('mall4cloud-order-823','1','1000','订单id'), +('mall4cloud-order-824','1','1000','订单id'), +('mall4cloud-order-825','1','1000','订单id'), +('mall4cloud-order-826','1','1000','订单id'), +('mall4cloud-order-827','1','1000','订单id'), +('mall4cloud-order-828','1','1000','订单id'), +('mall4cloud-order-829','1','1000','订单id'), +('mall4cloud-order-830','1','1000','订单id'), +('mall4cloud-order-831','1','1000','订单id'), +('mall4cloud-order-832','1','1000','订单id'), +('mall4cloud-order-833','1','1000','订单id'), +('mall4cloud-order-834','1','1000','订单id'), +('mall4cloud-order-835','1','1000','订单id'), +('mall4cloud-order-836','1','1000','订单id'), +('mall4cloud-order-837','1','1000','订单id'), +('mall4cloud-order-838','1','1000','订单id'), +('mall4cloud-order-839','1','1000','订单id'), +('mall4cloud-order-840','1','1000','订单id'), +('mall4cloud-order-841','1','1000','订单id'), +('mall4cloud-order-842','1','1000','订单id'), +('mall4cloud-order-843','1','1000','订单id'), +('mall4cloud-order-844','1','1000','订单id'), +('mall4cloud-order-845','1','1000','订单id'), +('mall4cloud-order-846','1','1000','订单id'), +('mall4cloud-order-847','1','1000','订单id'), +('mall4cloud-order-848','1','1000','订单id'), +('mall4cloud-order-849','1','1000','订单id'), +('mall4cloud-order-850','1','1000','订单id'), +('mall4cloud-order-851','1','1000','订单id'), +('mall4cloud-order-852','1','1000','订单id'), +('mall4cloud-order-853','1','1000','订单id'), +('mall4cloud-order-854','1','1000','订单id'), +('mall4cloud-order-855','1','1000','订单id'), +('mall4cloud-order-856','1','1000','订单id'), +('mall4cloud-order-857','1','1000','订单id'), +('mall4cloud-order-858','1','1000','订单id'), +('mall4cloud-order-859','1','1000','订单id'), +('mall4cloud-order-860','1','1000','订单id'), +('mall4cloud-order-861','1','1000','订单id'), +('mall4cloud-order-862','1','1000','订单id'), +('mall4cloud-order-863','1','1000','订单id'), +('mall4cloud-order-864','1','1000','订单id'), +('mall4cloud-order-865','1','1000','订单id'), +('mall4cloud-order-866','1','1000','订单id'), +('mall4cloud-order-867','1','1000','订单id'), +('mall4cloud-order-868','1','1000','订单id'), +('mall4cloud-order-869','1','1000','订单id'), +('mall4cloud-order-870','1','1000','订单id'), +('mall4cloud-order-871','1','1000','订单id'), +('mall4cloud-order-872','1','1000','订单id'), +('mall4cloud-order-873','1','1000','订单id'), +('mall4cloud-order-874','1','1000','订单id'), +('mall4cloud-order-875','1','1000','订单id'), +('mall4cloud-order-876','1','1000','订单id'), +('mall4cloud-order-877','1','1000','订单id'), +('mall4cloud-order-878','1','1000','订单id'), +('mall4cloud-order-879','1','1000','订单id'), +('mall4cloud-order-880','1','1000','订单id'), +('mall4cloud-order-881','1','1000','订单id'), +('mall4cloud-order-882','1','1000','订单id'), +('mall4cloud-order-883','1','1000','订单id'), +('mall4cloud-order-884','1','1000','订单id'), +('mall4cloud-order-885','1','1000','订单id'), +('mall4cloud-order-886','1','1000','订单id'), +('mall4cloud-order-887','1','1000','订单id'), +('mall4cloud-order-888','1','1000','订单id'), +('mall4cloud-order-889','1','1000','订单id'), +('mall4cloud-order-890','1','1000','订单id'), +('mall4cloud-order-891','1','1000','订单id'), +('mall4cloud-order-892','1','1000','订单id'), +('mall4cloud-order-893','1','1000','订单id'), +('mall4cloud-order-894','1','1000','订单id'), +('mall4cloud-order-895','1','1000','订单id'), +('mall4cloud-order-896','1','1000','订单id'), +('mall4cloud-order-897','1','1000','订单id'), +('mall4cloud-order-898','1','1000','订单id'), +('mall4cloud-order-899','1','1000','订单id'), +('mall4cloud-order-900','1','1000','订单id'), +('mall4cloud-order-901','1','1000','订单id'), +('mall4cloud-order-902','1','1000','订单id'), +('mall4cloud-order-903','1','1000','订单id'), +('mall4cloud-order-904','1','1000','订单id'), +('mall4cloud-order-905','1','1000','订单id'), +('mall4cloud-order-906','1','1000','订单id'), +('mall4cloud-order-907','1','1000','订单id'), +('mall4cloud-order-908','1','1000','订单id'), +('mall4cloud-order-909','1','1000','订单id'), +('mall4cloud-order-910','1','1000','订单id'), +('mall4cloud-order-911','1','1000','订单id'), +('mall4cloud-order-912','1','1000','订单id'), +('mall4cloud-order-913','1','1000','订单id'), +('mall4cloud-order-914','1','1000','订单id'), +('mall4cloud-order-915','1','1000','订单id'), +('mall4cloud-order-916','1','1000','订单id'), +('mall4cloud-order-917','1','1000','订单id'), +('mall4cloud-order-918','1','1000','订单id'), +('mall4cloud-order-919','1','1000','订单id'), +('mall4cloud-order-920','1','1000','订单id'), +('mall4cloud-order-921','1','1000','订单id'), +('mall4cloud-order-922','1','1000','订单id'), +('mall4cloud-order-923','1','1000','订单id'), +('mall4cloud-order-924','1','1000','订单id'), +('mall4cloud-order-925','1','1000','订单id'), +('mall4cloud-order-926','1','1000','订单id'), +('mall4cloud-order-927','1','1000','订单id'), +('mall4cloud-order-928','1','1000','订单id'), +('mall4cloud-order-929','1','1000','订单id'), +('mall4cloud-order-930','1','1000','订单id'), +('mall4cloud-order-931','1','1000','订单id'), +('mall4cloud-order-932','1','1000','订单id'), +('mall4cloud-order-933','1','1000','订单id'), +('mall4cloud-order-934','1','1000','订单id'), +('mall4cloud-order-935','1','1000','订单id'), +('mall4cloud-order-936','1','1000','订单id'), +('mall4cloud-order-937','1','1000','订单id'), +('mall4cloud-order-938','1','1000','订单id'), +('mall4cloud-order-939','1','1000','订单id'), +('mall4cloud-order-940','1','1000','订单id'), +('mall4cloud-order-941','1','1000','订单id'), +('mall4cloud-order-942','1','1000','订单id'), +('mall4cloud-order-943','1','1000','订单id'), +('mall4cloud-order-944','1','1000','订单id'), +('mall4cloud-order-945','1','1000','订单id'), +('mall4cloud-order-946','1','1000','订单id'), +('mall4cloud-order-947','1','1000','订单id'), +('mall4cloud-order-948','1','1000','订单id'), +('mall4cloud-order-949','1','1000','订单id'), +('mall4cloud-order-950','1','1000','订单id'), +('mall4cloud-order-951','1','1000','订单id'), +('mall4cloud-order-952','1','1000','订单id'), +('mall4cloud-order-953','1','1000','订单id'), +('mall4cloud-order-954','1','1000','订单id'), +('mall4cloud-order-955','1','1000','订单id'), +('mall4cloud-order-956','1','1000','订单id'), +('mall4cloud-order-957','1','1000','订单id'), +('mall4cloud-order-958','1','1000','订单id'), +('mall4cloud-order-959','1','1000','订单id'), +('mall4cloud-order-960','1','1000','订单id'), +('mall4cloud-order-961','1','1000','订单id'), +('mall4cloud-order-962','1','1000','订单id'), +('mall4cloud-order-963','1','1000','订单id'), +('mall4cloud-order-964','1','1000','订单id'), +('mall4cloud-order-965','1','1000','订单id'), +('mall4cloud-order-966','1','1000','订单id'), +('mall4cloud-order-967','1','1000','订单id'), +('mall4cloud-order-968','1','1000','订单id'), +('mall4cloud-order-969','1','1000','订单id'), +('mall4cloud-order-970','1','1000','订单id'), +('mall4cloud-order-971','1','1000','订单id'), +('mall4cloud-order-972','1','1000','订单id'), +('mall4cloud-order-973','1','1000','订单id'), +('mall4cloud-order-974','1','1000','订单id'), +('mall4cloud-order-975','1','1000','订单id'), +('mall4cloud-order-976','1','1000','订单id'), +('mall4cloud-order-977','1','1000','订单id'), +('mall4cloud-order-978','1','1000','订单id'), +('mall4cloud-order-979','1','1000','订单id'), +('mall4cloud-order-980','1','1000','订单id'), +('mall4cloud-order-981','1','1000','订单id'), +('mall4cloud-order-982','1','1000','订单id'), +('mall4cloud-order-983','1','1000','订单id'), +('mall4cloud-order-984','1','1000','订单id'), +('mall4cloud-order-985','1','1000','订单id'), +('mall4cloud-order-986','1','1000','订单id'), +('mall4cloud-order-987','1','1000','订单id'), +('mall4cloud-order-988','1','1000','订单id'), +('mall4cloud-order-989','1','1000','订单id'), +('mall4cloud-order-990','1','1000','订单id'), +('mall4cloud-order-991','1','1000','订单id'), +('mall4cloud-order-992','1','1000','订单id'), +('mall4cloud-order-993','1','1000','订单id'), +('mall4cloud-order-994','1','1000','订单id'), +('mall4cloud-order-995','1','1000','订单id'), +('mall4cloud-order-996','1','1000','订单id'), +('mall4cloud-order-997','1','1000','订单id'), +('mall4cloud-order-998','1','1000','订单id'), +('mall4cloud-order-999','1','1000','订单id'), +('mall4cloud-group-team-000','1','1000','团购队伍id'), +('mall4cloud-group-team-001','1','1000','团购队伍id'), +('mall4cloud-group-team-002','1','1000','团购队伍id'), +('mall4cloud-group-team-003','1','1000','团购队伍id'), +('mall4cloud-group-team-004','1','1000','团购队伍id'), +('mall4cloud-group-team-005','1','1000','团购队伍id'), +('mall4cloud-group-team-006','1','1000','团购队伍id'), +('mall4cloud-group-team-007','1','1000','团购队伍id'), +('mall4cloud-group-team-008','1','1000','团购队伍id'), +('mall4cloud-group-team-009','1','1000','团购队伍id'), +('mall4cloud-group-team-010','1','1000','团购队伍id'), +('mall4cloud-group-team-011','1','1000','团购队伍id'), +('mall4cloud-group-team-012','1','1000','团购队伍id'), +('mall4cloud-group-team-013','1','1000','团购队伍id'), +('mall4cloud-group-team-014','1','1000','团购队伍id'), +('mall4cloud-group-team-015','1','1000','团购队伍id'), +('mall4cloud-group-team-016','1','1000','团购队伍id'), +('mall4cloud-group-team-017','1','1000','团购队伍id'), +('mall4cloud-group-team-018','1','1000','团购队伍id'), +('mall4cloud-group-team-019','1','1000','团购队伍id'), +('mall4cloud-group-team-020','1','1000','团购队伍id'), +('mall4cloud-group-team-021','1','1000','团购队伍id'), +('mall4cloud-group-team-022','1','1000','团购队伍id'), +('mall4cloud-group-team-023','1','1000','团购队伍id'), +('mall4cloud-group-team-024','1','1000','团购队伍id'), +('mall4cloud-group-team-025','1','1000','团购队伍id'), +('mall4cloud-group-team-026','1','1000','团购队伍id'), +('mall4cloud-group-team-027','1','1000','团购队伍id'), +('mall4cloud-group-team-028','1','1000','团购队伍id'), +('mall4cloud-group-team-029','1','1000','团购队伍id'), +('mall4cloud-group-team-030','1','1000','团购队伍id'), +('mall4cloud-group-team-031','1','1000','团购队伍id'), +('mall4cloud-group-team-032','1','1000','团购队伍id'), +('mall4cloud-group-team-033','1','1000','团购队伍id'), +('mall4cloud-group-team-034','1','1000','团购队伍id'), +('mall4cloud-group-team-035','1','1000','团购队伍id'), +('mall4cloud-group-team-036','1','1000','团购队伍id'), +('mall4cloud-group-team-037','1','1000','团购队伍id'), +('mall4cloud-group-team-038','1','1000','团购队伍id'), +('mall4cloud-group-team-039','1','1000','团购队伍id'), +('mall4cloud-group-team-040','1','1000','团购队伍id'), +('mall4cloud-group-team-041','1','1000','团购队伍id'), +('mall4cloud-group-team-042','1','1000','团购队伍id'), +('mall4cloud-group-team-043','1','1000','团购队伍id'), +('mall4cloud-group-team-044','1','1000','团购队伍id'), +('mall4cloud-group-team-045','1','1000','团购队伍id'), +('mall4cloud-group-team-046','1','1000','团购队伍id'), +('mall4cloud-group-team-047','1','1000','团购队伍id'), +('mall4cloud-group-team-048','1','1000','团购队伍id'), +('mall4cloud-group-team-049','1','1000','团购队伍id'), +('mall4cloud-group-team-050','1','1000','团购队伍id'), +('mall4cloud-group-team-051','1','1000','团购队伍id'), +('mall4cloud-group-team-052','1','1000','团购队伍id'), +('mall4cloud-group-team-053','1','1000','团购队伍id'), +('mall4cloud-group-team-054','1','1000','团购队伍id'), +('mall4cloud-group-team-055','1','1000','团购队伍id'), +('mall4cloud-group-team-056','1','1000','团购队伍id'), +('mall4cloud-group-team-057','1','1000','团购队伍id'), +('mall4cloud-group-team-058','1','1000','团购队伍id'), +('mall4cloud-group-team-059','1','1000','团购队伍id'), +('mall4cloud-group-team-060','1','1000','团购队伍id'), +('mall4cloud-group-team-061','1','1000','团购队伍id'), +('mall4cloud-group-team-062','1','1000','团购队伍id'), +('mall4cloud-group-team-063','1','1000','团购队伍id'), +('mall4cloud-group-team-064','1','1000','团购队伍id'), +('mall4cloud-group-team-065','1','1000','团购队伍id'), +('mall4cloud-group-team-066','1','1000','团购队伍id'), +('mall4cloud-group-team-067','1','1000','团购队伍id'), +('mall4cloud-group-team-068','1','1000','团购队伍id'), +('mall4cloud-group-team-069','1','1000','团购队伍id'), +('mall4cloud-group-team-070','1','1000','团购队伍id'), +('mall4cloud-group-team-071','1','1000','团购队伍id'), +('mall4cloud-group-team-072','1','1000','团购队伍id'), +('mall4cloud-group-team-073','1','1000','团购队伍id'), +('mall4cloud-group-team-074','1','1000','团购队伍id'), +('mall4cloud-group-team-075','1','1000','团购队伍id'), +('mall4cloud-group-team-076','1','1000','团购队伍id'), +('mall4cloud-group-team-077','1','1000','团购队伍id'), +('mall4cloud-group-team-078','1','1000','团购队伍id'), +('mall4cloud-group-team-079','1','1000','团购队伍id'), +('mall4cloud-group-team-080','1','1000','团购队伍id'), +('mall4cloud-group-team-081','1','1000','团购队伍id'), +('mall4cloud-group-team-082','1','1000','团购队伍id'), +('mall4cloud-group-team-083','1','1000','团购队伍id'), +('mall4cloud-group-team-084','1','1000','团购队伍id'), +('mall4cloud-group-team-085','1','1000','团购队伍id'), +('mall4cloud-group-team-086','1','1000','团购队伍id'), +('mall4cloud-group-team-087','1','1000','团购队伍id'), +('mall4cloud-group-team-088','1','1000','团购队伍id'), +('mall4cloud-group-team-089','1','1000','团购队伍id'), +('mall4cloud-group-team-090','1','1000','团购队伍id'), +('mall4cloud-group-team-091','1','1000','团购队伍id'), +('mall4cloud-group-team-092','1','1000','团购队伍id'), +('mall4cloud-group-team-093','1','1000','团购队伍id'), +('mall4cloud-group-team-094','1','1000','团购队伍id'), +('mall4cloud-group-team-095','1','1000','团购队伍id'), +('mall4cloud-group-team-096','1','1000','团购队伍id'), +('mall4cloud-group-team-097','1','1000','团购队伍id'), +('mall4cloud-group-team-098','1','1000','团购队伍id'), +('mall4cloud-group-team-099','1','1000','团购队伍id'), +('mall4cloud-group-team-100','1','1000','团购队伍id'), +('mall4cloud-group-team-101','1','1000','团购队伍id'), +('mall4cloud-group-team-102','1','1000','团购队伍id'), +('mall4cloud-group-team-103','1','1000','团购队伍id'), +('mall4cloud-group-team-104','1','1000','团购队伍id'), +('mall4cloud-group-team-105','1','1000','团购队伍id'), +('mall4cloud-group-team-106','1','1000','团购队伍id'), +('mall4cloud-group-team-107','1','1000','团购队伍id'), +('mall4cloud-group-team-108','1','1000','团购队伍id'), +('mall4cloud-group-team-109','1','1000','团购队伍id'), +('mall4cloud-group-team-110','1','1000','团购队伍id'), +('mall4cloud-group-team-111','1','1000','团购队伍id'), +('mall4cloud-group-team-112','1','1000','团购队伍id'), +('mall4cloud-group-team-113','1','1000','团购队伍id'), +('mall4cloud-group-team-114','1','1000','团购队伍id'), +('mall4cloud-group-team-115','1','1000','团购队伍id'), +('mall4cloud-group-team-116','1','1000','团购队伍id'), +('mall4cloud-group-team-117','1','1000','团购队伍id'), +('mall4cloud-group-team-118','1','1000','团购队伍id'), +('mall4cloud-group-team-119','1','1000','团购队伍id'), +('mall4cloud-group-team-120','1','1000','团购队伍id'), +('mall4cloud-group-team-121','1','1000','团购队伍id'), +('mall4cloud-group-team-122','1','1000','团购队伍id'), +('mall4cloud-group-team-123','1','1000','团购队伍id'), +('mall4cloud-group-team-124','1','1000','团购队伍id'), +('mall4cloud-group-team-125','1','1000','团购队伍id'), +('mall4cloud-group-team-126','1','1000','团购队伍id'), +('mall4cloud-group-team-127','1','1000','团购队伍id'), +('mall4cloud-group-team-128','1','1000','团购队伍id'), +('mall4cloud-group-team-129','1','1000','团购队伍id'), +('mall4cloud-group-team-130','1','1000','团购队伍id'), +('mall4cloud-group-team-131','1','1000','团购队伍id'), +('mall4cloud-group-team-132','1','1000','团购队伍id'), +('mall4cloud-group-team-133','1','1000','团购队伍id'), +('mall4cloud-group-team-134','1','1000','团购队伍id'), +('mall4cloud-group-team-135','1','1000','团购队伍id'), +('mall4cloud-group-team-136','1','1000','团购队伍id'), +('mall4cloud-group-team-137','1','1000','团购队伍id'), +('mall4cloud-group-team-138','1','1000','团购队伍id'), +('mall4cloud-group-team-139','1','1000','团购队伍id'), +('mall4cloud-group-team-140','1','1000','团购队伍id'), +('mall4cloud-group-team-141','1','1000','团购队伍id'), +('mall4cloud-group-team-142','1','1000','团购队伍id'), +('mall4cloud-group-team-143','1','1000','团购队伍id'), +('mall4cloud-group-team-144','1','1000','团购队伍id'), +('mall4cloud-group-team-145','1','1000','团购队伍id'), +('mall4cloud-group-team-146','1','1000','团购队伍id'), +('mall4cloud-group-team-147','1','1000','团购队伍id'), +('mall4cloud-group-team-148','1','1000','团购队伍id'), +('mall4cloud-group-team-149','1','1000','团购队伍id'), +('mall4cloud-group-team-150','1','1000','团购队伍id'), +('mall4cloud-group-team-151','1','1000','团购队伍id'), +('mall4cloud-group-team-152','1','1000','团购队伍id'), +('mall4cloud-group-team-153','1','1000','团购队伍id'), +('mall4cloud-group-team-154','1','1000','团购队伍id'), +('mall4cloud-group-team-155','1','1000','团购队伍id'), +('mall4cloud-group-team-156','1','1000','团购队伍id'), +('mall4cloud-group-team-157','1','1000','团购队伍id'), +('mall4cloud-group-team-158','1','1000','团购队伍id'), +('mall4cloud-group-team-159','1','1000','团购队伍id'), +('mall4cloud-group-team-160','1','1000','团购队伍id'), +('mall4cloud-group-team-161','1','1000','团购队伍id'), +('mall4cloud-group-team-162','1','1000','团购队伍id'), +('mall4cloud-group-team-163','1','1000','团购队伍id'), +('mall4cloud-group-team-164','1','1000','团购队伍id'), +('mall4cloud-group-team-165','1','1000','团购队伍id'), +('mall4cloud-group-team-166','1','1000','团购队伍id'), +('mall4cloud-group-team-167','1','1000','团购队伍id'), +('mall4cloud-group-team-168','1','1000','团购队伍id'), +('mall4cloud-group-team-169','1','1000','团购队伍id'), +('mall4cloud-group-team-170','1','1000','团购队伍id'), +('mall4cloud-group-team-171','1','1000','团购队伍id'), +('mall4cloud-group-team-172','1','1000','团购队伍id'), +('mall4cloud-group-team-173','1','1000','团购队伍id'), +('mall4cloud-group-team-174','1','1000','团购队伍id'), +('mall4cloud-group-team-175','1','1000','团购队伍id'), +('mall4cloud-group-team-176','1','1000','团购队伍id'), +('mall4cloud-group-team-177','1','1000','团购队伍id'), +('mall4cloud-group-team-178','1','1000','团购队伍id'), +('mall4cloud-group-team-179','1','1000','团购队伍id'), +('mall4cloud-group-team-180','1','1000','团购队伍id'), +('mall4cloud-group-team-181','1','1000','团购队伍id'), +('mall4cloud-group-team-182','1','1000','团购队伍id'), +('mall4cloud-group-team-183','1','1000','团购队伍id'), +('mall4cloud-group-team-184','1','1000','团购队伍id'), +('mall4cloud-group-team-185','1','1000','团购队伍id'), +('mall4cloud-group-team-186','1','1000','团购队伍id'), +('mall4cloud-group-team-187','1','1000','团购队伍id'), +('mall4cloud-group-team-188','1','1000','团购队伍id'), +('mall4cloud-group-team-189','1','1000','团购队伍id'), +('mall4cloud-group-team-190','1','1000','团购队伍id'), +('mall4cloud-group-team-191','1','1000','团购队伍id'), +('mall4cloud-group-team-192','1','1000','团购队伍id'), +('mall4cloud-group-team-193','1','1000','团购队伍id'), +('mall4cloud-group-team-194','1','1000','团购队伍id'), +('mall4cloud-group-team-195','1','1000','团购队伍id'), +('mall4cloud-group-team-196','1','1000','团购队伍id'), +('mall4cloud-group-team-197','1','1000','团购队伍id'), +('mall4cloud-group-team-198','1','1000','团购队伍id'), +('mall4cloud-group-team-199','1','1000','团购队伍id'), +('mall4cloud-group-team-200','1','1000','团购队伍id'), +('mall4cloud-group-team-201','1','1000','团购队伍id'), +('mall4cloud-group-team-202','1','1000','团购队伍id'), +('mall4cloud-group-team-203','1','1000','团购队伍id'), +('mall4cloud-group-team-204','1','1000','团购队伍id'), +('mall4cloud-group-team-205','1','1000','团购队伍id'), +('mall4cloud-group-team-206','1','1000','团购队伍id'), +('mall4cloud-group-team-207','1','1000','团购队伍id'), +('mall4cloud-group-team-208','1','1000','团购队伍id'), +('mall4cloud-group-team-209','1','1000','团购队伍id'), +('mall4cloud-group-team-210','1','1000','团购队伍id'), +('mall4cloud-group-team-211','1','1000','团购队伍id'), +('mall4cloud-group-team-212','1','1000','团购队伍id'), +('mall4cloud-group-team-213','1','1000','团购队伍id'), +('mall4cloud-group-team-214','1','1000','团购队伍id'), +('mall4cloud-group-team-215','1','1000','团购队伍id'), +('mall4cloud-group-team-216','1','1000','团购队伍id'), +('mall4cloud-group-team-217','1','1000','团购队伍id'), +('mall4cloud-group-team-218','1','1000','团购队伍id'), +('mall4cloud-group-team-219','1','1000','团购队伍id'), +('mall4cloud-group-team-220','1','1000','团购队伍id'), +('mall4cloud-group-team-221','1','1000','团购队伍id'), +('mall4cloud-group-team-222','1','1000','团购队伍id'), +('mall4cloud-group-team-223','1','1000','团购队伍id'), +('mall4cloud-group-team-224','1','1000','团购队伍id'), +('mall4cloud-group-team-225','1','1000','团购队伍id'), +('mall4cloud-group-team-226','1','1000','团购队伍id'), +('mall4cloud-group-team-227','1','1000','团购队伍id'), +('mall4cloud-group-team-228','1','1000','团购队伍id'), +('mall4cloud-group-team-229','1','1000','团购队伍id'), +('mall4cloud-group-team-230','1','1000','团购队伍id'), +('mall4cloud-group-team-231','1','1000','团购队伍id'), +('mall4cloud-group-team-232','1','1000','团购队伍id'), +('mall4cloud-group-team-233','1','1000','团购队伍id'), +('mall4cloud-group-team-234','1','1000','团购队伍id'), +('mall4cloud-group-team-235','1','1000','团购队伍id'), +('mall4cloud-group-team-236','1','1000','团购队伍id'), +('mall4cloud-group-team-237','1','1000','团购队伍id'), +('mall4cloud-group-team-238','1','1000','团购队伍id'), +('mall4cloud-group-team-239','1','1000','团购队伍id'), +('mall4cloud-group-team-240','1','1000','团购队伍id'), +('mall4cloud-group-team-241','1','1000','团购队伍id'), +('mall4cloud-group-team-242','1','1000','团购队伍id'), +('mall4cloud-group-team-243','1','1000','团购队伍id'), +('mall4cloud-group-team-244','1','1000','团购队伍id'), +('mall4cloud-group-team-245','1','1000','团购队伍id'), +('mall4cloud-group-team-246','1','1000','团购队伍id'), +('mall4cloud-group-team-247','1','1000','团购队伍id'), +('mall4cloud-group-team-248','1','1000','团购队伍id'), +('mall4cloud-group-team-249','1','1000','团购队伍id'), +('mall4cloud-group-team-250','1','1000','团购队伍id'), +('mall4cloud-group-team-251','1','1000','团购队伍id'), +('mall4cloud-group-team-252','1','1000','团购队伍id'), +('mall4cloud-group-team-253','1','1000','团购队伍id'), +('mall4cloud-group-team-254','1','1000','团购队伍id'), +('mall4cloud-group-team-255','1','1000','团购队伍id'), +('mall4cloud-group-team-256','1','1000','团购队伍id'), +('mall4cloud-group-team-257','1','1000','团购队伍id'), +('mall4cloud-group-team-258','1','1000','团购队伍id'), +('mall4cloud-group-team-259','1','1000','团购队伍id'), +('mall4cloud-group-team-260','1','1000','团购队伍id'), +('mall4cloud-group-team-261','1','1000','团购队伍id'), +('mall4cloud-group-team-262','1','1000','团购队伍id'), +('mall4cloud-group-team-263','1','1000','团购队伍id'), +('mall4cloud-group-team-264','1','1000','团购队伍id'), +('mall4cloud-group-team-265','1','1000','团购队伍id'), +('mall4cloud-group-team-266','1','1000','团购队伍id'), +('mall4cloud-group-team-267','1','1000','团购队伍id'), +('mall4cloud-group-team-268','1','1000','团购队伍id'), +('mall4cloud-group-team-269','1','1000','团购队伍id'), +('mall4cloud-group-team-270','1','1000','团购队伍id'), +('mall4cloud-group-team-271','1','1000','团购队伍id'), +('mall4cloud-group-team-272','1','1000','团购队伍id'), +('mall4cloud-group-team-273','1','1000','团购队伍id'), +('mall4cloud-group-team-274','1','1000','团购队伍id'), +('mall4cloud-group-team-275','1','1000','团购队伍id'), +('mall4cloud-group-team-276','1','1000','团购队伍id'), +('mall4cloud-group-team-277','1','1000','团购队伍id'), +('mall4cloud-group-team-278','1','1000','团购队伍id'), +('mall4cloud-group-team-279','1','1000','团购队伍id'), +('mall4cloud-group-team-280','1','1000','团购队伍id'), +('mall4cloud-group-team-281','1','1000','团购队伍id'), +('mall4cloud-group-team-282','1','1000','团购队伍id'), +('mall4cloud-group-team-283','1','1000','团购队伍id'), +('mall4cloud-group-team-284','1','1000','团购队伍id'), +('mall4cloud-group-team-285','1','1000','团购队伍id'), +('mall4cloud-group-team-286','1','1000','团购队伍id'), +('mall4cloud-group-team-287','1','1000','团购队伍id'), +('mall4cloud-group-team-288','1','1000','团购队伍id'), +('mall4cloud-group-team-289','1','1000','团购队伍id'), +('mall4cloud-group-team-290','1','1000','团购队伍id'), +('mall4cloud-group-team-291','1','1000','团购队伍id'), +('mall4cloud-group-team-292','1','1000','团购队伍id'), +('mall4cloud-group-team-293','1','1000','团购队伍id'), +('mall4cloud-group-team-294','1','1000','团购队伍id'), +('mall4cloud-group-team-295','1','1000','团购队伍id'), +('mall4cloud-group-team-296','1','1000','团购队伍id'), +('mall4cloud-group-team-297','1','1000','团购队伍id'), +('mall4cloud-group-team-298','1','1000','团购队伍id'), +('mall4cloud-group-team-299','1','1000','团购队伍id'), +('mall4cloud-group-team-300','1','1000','团购队伍id'), +('mall4cloud-group-team-301','1','1000','团购队伍id'), +('mall4cloud-group-team-302','1','1000','团购队伍id'), +('mall4cloud-group-team-303','1','1000','团购队伍id'), +('mall4cloud-group-team-304','1','1000','团购队伍id'), +('mall4cloud-group-team-305','1','1000','团购队伍id'), +('mall4cloud-group-team-306','1','1000','团购队伍id'), +('mall4cloud-group-team-307','1','1000','团购队伍id'), +('mall4cloud-group-team-308','1','1000','团购队伍id'), +('mall4cloud-group-team-309','1','1000','团购队伍id'), +('mall4cloud-group-team-310','1','1000','团购队伍id'), +('mall4cloud-group-team-311','1','1000','团购队伍id'), +('mall4cloud-group-team-312','1','1000','团购队伍id'), +('mall4cloud-group-team-313','1','1000','团购队伍id'), +('mall4cloud-group-team-314','1','1000','团购队伍id'), +('mall4cloud-group-team-315','1','1000','团购队伍id'), +('mall4cloud-group-team-316','1','1000','团购队伍id'), +('mall4cloud-group-team-317','1','1000','团购队伍id'), +('mall4cloud-group-team-318','1','1000','团购队伍id'), +('mall4cloud-group-team-319','1','1000','团购队伍id'), +('mall4cloud-group-team-320','1','1000','团购队伍id'), +('mall4cloud-group-team-321','1','1000','团购队伍id'), +('mall4cloud-group-team-322','1','1000','团购队伍id'), +('mall4cloud-group-team-323','1','1000','团购队伍id'), +('mall4cloud-group-team-324','1','1000','团购队伍id'), +('mall4cloud-group-team-325','1','1000','团购队伍id'), +('mall4cloud-group-team-326','1','1000','团购队伍id'), +('mall4cloud-group-team-327','1','1000','团购队伍id'), +('mall4cloud-group-team-328','1','1000','团购队伍id'), +('mall4cloud-group-team-329','1','1000','团购队伍id'), +('mall4cloud-group-team-330','1','1000','团购队伍id'), +('mall4cloud-group-team-331','1','1000','团购队伍id'), +('mall4cloud-group-team-332','1','1000','团购队伍id'), +('mall4cloud-group-team-333','1','1000','团购队伍id'), +('mall4cloud-group-team-334','1','1000','团购队伍id'), +('mall4cloud-group-team-335','1','1000','团购队伍id'), +('mall4cloud-group-team-336','1','1000','团购队伍id'), +('mall4cloud-group-team-337','1','1000','团购队伍id'), +('mall4cloud-group-team-338','1','1000','团购队伍id'), +('mall4cloud-group-team-339','1','1000','团购队伍id'), +('mall4cloud-group-team-340','1','1000','团购队伍id'), +('mall4cloud-group-team-341','1','1000','团购队伍id'), +('mall4cloud-group-team-342','1','1000','团购队伍id'), +('mall4cloud-group-team-343','1','1000','团购队伍id'), +('mall4cloud-group-team-344','1','1000','团购队伍id'), +('mall4cloud-group-team-345','1','1000','团购队伍id'), +('mall4cloud-group-team-346','1','1000','团购队伍id'), +('mall4cloud-group-team-347','1','1000','团购队伍id'), +('mall4cloud-group-team-348','1','1000','团购队伍id'), +('mall4cloud-group-team-349','1','1000','团购队伍id'), +('mall4cloud-group-team-350','1','1000','团购队伍id'), +('mall4cloud-group-team-351','1','1000','团购队伍id'), +('mall4cloud-group-team-352','1','1000','团购队伍id'), +('mall4cloud-group-team-353','1','1000','团购队伍id'), +('mall4cloud-group-team-354','1','1000','团购队伍id'), +('mall4cloud-group-team-355','1','1000','团购队伍id'), +('mall4cloud-group-team-356','1','1000','团购队伍id'), +('mall4cloud-group-team-357','1','1000','团购队伍id'), +('mall4cloud-group-team-358','1','1000','团购队伍id'), +('mall4cloud-group-team-359','1','1000','团购队伍id'), +('mall4cloud-group-team-360','1','1000','团购队伍id'), +('mall4cloud-group-team-361','1','1000','团购队伍id'), +('mall4cloud-group-team-362','1','1000','团购队伍id'), +('mall4cloud-group-team-363','1','1000','团购队伍id'), +('mall4cloud-group-team-364','1','1000','团购队伍id'), +('mall4cloud-group-team-365','1','1000','团购队伍id'), +('mall4cloud-group-team-366','1','1000','团购队伍id'), +('mall4cloud-group-team-367','1','1000','团购队伍id'), +('mall4cloud-group-team-368','1','1000','团购队伍id'), +('mall4cloud-group-team-369','1','1000','团购队伍id'), +('mall4cloud-group-team-370','1','1000','团购队伍id'), +('mall4cloud-group-team-371','1','1000','团购队伍id'), +('mall4cloud-group-team-372','1','1000','团购队伍id'), +('mall4cloud-group-team-373','1','1000','团购队伍id'), +('mall4cloud-group-team-374','1','1000','团购队伍id'), +('mall4cloud-group-team-375','1','1000','团购队伍id'), +('mall4cloud-group-team-376','1','1000','团购队伍id'), +('mall4cloud-group-team-377','1','1000','团购队伍id'), +('mall4cloud-group-team-378','1','1000','团购队伍id'), +('mall4cloud-group-team-379','1','1000','团购队伍id'), +('mall4cloud-group-team-380','1','1000','团购队伍id'), +('mall4cloud-group-team-381','1','1000','团购队伍id'), +('mall4cloud-group-team-382','1','1000','团购队伍id'), +('mall4cloud-group-team-383','1','1000','团购队伍id'), +('mall4cloud-group-team-384','1','1000','团购队伍id'), +('mall4cloud-group-team-385','1','1000','团购队伍id'), +('mall4cloud-group-team-386','1','1000','团购队伍id'), +('mall4cloud-group-team-387','1','1000','团购队伍id'), +('mall4cloud-group-team-388','1','1000','团购队伍id'), +('mall4cloud-group-team-389','1','1000','团购队伍id'), +('mall4cloud-group-team-390','1','1000','团购队伍id'), +('mall4cloud-group-team-391','1','1000','团购队伍id'), +('mall4cloud-group-team-392','1','1000','团购队伍id'), +('mall4cloud-group-team-393','1','1000','团购队伍id'), +('mall4cloud-group-team-394','1','1000','团购队伍id'), +('mall4cloud-group-team-395','1','1000','团购队伍id'), +('mall4cloud-group-team-396','1','1000','团购队伍id'), +('mall4cloud-group-team-397','1','1000','团购队伍id'), +('mall4cloud-group-team-398','1','1000','团购队伍id'), +('mall4cloud-group-team-399','1','1000','团购队伍id'), +('mall4cloud-group-team-400','1','1000','团购队伍id'), +('mall4cloud-group-team-401','1','1000','团购队伍id'), +('mall4cloud-group-team-402','1','1000','团购队伍id'), +('mall4cloud-group-team-403','1','1000','团购队伍id'), +('mall4cloud-group-team-404','1','1000','团购队伍id'), +('mall4cloud-group-team-405','1','1000','团购队伍id'), +('mall4cloud-group-team-406','1','1000','团购队伍id'), +('mall4cloud-group-team-407','1','1000','团购队伍id'), +('mall4cloud-group-team-408','1','1000','团购队伍id'), +('mall4cloud-group-team-409','1','1000','团购队伍id'), +('mall4cloud-group-team-410','1','1000','团购队伍id'), +('mall4cloud-group-team-411','1','1000','团购队伍id'), +('mall4cloud-group-team-412','1','1000','团购队伍id'), +('mall4cloud-group-team-413','1','1000','团购队伍id'), +('mall4cloud-group-team-414','1','1000','团购队伍id'), +('mall4cloud-group-team-415','1','1000','团购队伍id'), +('mall4cloud-group-team-416','1','1000','团购队伍id'), +('mall4cloud-group-team-417','1','1000','团购队伍id'), +('mall4cloud-group-team-418','1','1000','团购队伍id'), +('mall4cloud-group-team-419','1','1000','团购队伍id'), +('mall4cloud-group-team-420','1','1000','团购队伍id'), +('mall4cloud-group-team-421','1','1000','团购队伍id'), +('mall4cloud-group-team-422','1','1000','团购队伍id'), +('mall4cloud-group-team-423','1','1000','团购队伍id'), +('mall4cloud-group-team-424','1','1000','团购队伍id'), +('mall4cloud-group-team-425','1','1000','团购队伍id'), +('mall4cloud-group-team-426','1','1000','团购队伍id'), +('mall4cloud-group-team-427','1','1000','团购队伍id'), +('mall4cloud-group-team-428','1','1000','团购队伍id'), +('mall4cloud-group-team-429','1','1000','团购队伍id'), +('mall4cloud-group-team-430','1','1000','团购队伍id'), +('mall4cloud-group-team-431','1','1000','团购队伍id'), +('mall4cloud-group-team-432','1','1000','团购队伍id'), +('mall4cloud-group-team-433','1','1000','团购队伍id'), +('mall4cloud-group-team-434','1','1000','团购队伍id'), +('mall4cloud-group-team-435','1','1000','团购队伍id'), +('mall4cloud-group-team-436','1','1000','团购队伍id'), +('mall4cloud-group-team-437','1','1000','团购队伍id'), +('mall4cloud-group-team-438','1','1000','团购队伍id'), +('mall4cloud-group-team-439','1','1000','团购队伍id'), +('mall4cloud-group-team-440','1','1000','团购队伍id'), +('mall4cloud-group-team-441','1','1000','团购队伍id'), +('mall4cloud-group-team-442','1','1000','团购队伍id'), +('mall4cloud-group-team-443','1','1000','团购队伍id'), +('mall4cloud-group-team-444','1','1000','团购队伍id'), +('mall4cloud-group-team-445','1','1000','团购队伍id'), +('mall4cloud-group-team-446','1','1000','团购队伍id'), +('mall4cloud-group-team-447','1','1000','团购队伍id'), +('mall4cloud-group-team-448','1','1000','团购队伍id'), +('mall4cloud-group-team-449','1','1000','团购队伍id'), +('mall4cloud-group-team-450','1','1000','团购队伍id'), +('mall4cloud-group-team-451','1','1000','团购队伍id'), +('mall4cloud-group-team-452','1','1000','团购队伍id'), +('mall4cloud-group-team-453','1','1000','团购队伍id'), +('mall4cloud-group-team-454','1','1000','团购队伍id'), +('mall4cloud-group-team-455','1','1000','团购队伍id'), +('mall4cloud-group-team-456','1','1000','团购队伍id'), +('mall4cloud-group-team-457','1','1000','团购队伍id'), +('mall4cloud-group-team-458','1','1000','团购队伍id'), +('mall4cloud-group-team-459','1','1000','团购队伍id'), +('mall4cloud-group-team-460','1','1000','团购队伍id'), +('mall4cloud-group-team-461','1','1000','团购队伍id'), +('mall4cloud-group-team-462','1','1000','团购队伍id'), +('mall4cloud-group-team-463','1','1000','团购队伍id'), +('mall4cloud-group-team-464','1','1000','团购队伍id'), +('mall4cloud-group-team-465','1','1000','团购队伍id'), +('mall4cloud-group-team-466','1','1000','团购队伍id'), +('mall4cloud-group-team-467','1','1000','团购队伍id'), +('mall4cloud-group-team-468','1','1000','团购队伍id'), +('mall4cloud-group-team-469','1','1000','团购队伍id'), +('mall4cloud-group-team-470','1','1000','团购队伍id'), +('mall4cloud-group-team-471','1','1000','团购队伍id'), +('mall4cloud-group-team-472','1','1000','团购队伍id'), +('mall4cloud-group-team-473','1','1000','团购队伍id'), +('mall4cloud-group-team-474','1','1000','团购队伍id'), +('mall4cloud-group-team-475','1','1000','团购队伍id'), +('mall4cloud-group-team-476','1','1000','团购队伍id'), +('mall4cloud-group-team-477','1','1000','团购队伍id'), +('mall4cloud-group-team-478','1','1000','团购队伍id'), +('mall4cloud-group-team-479','1','1000','团购队伍id'), +('mall4cloud-group-team-480','1','1000','团购队伍id'), +('mall4cloud-group-team-481','1','1000','团购队伍id'), +('mall4cloud-group-team-482','1','1000','团购队伍id'), +('mall4cloud-group-team-483','1','1000','团购队伍id'), +('mall4cloud-group-team-484','1','1000','团购队伍id'), +('mall4cloud-group-team-485','1','1000','团购队伍id'), +('mall4cloud-group-team-486','1','1000','团购队伍id'), +('mall4cloud-group-team-487','1','1000','团购队伍id'), +('mall4cloud-group-team-488','1','1000','团购队伍id'), +('mall4cloud-group-team-489','1','1000','团购队伍id'), +('mall4cloud-group-team-490','1','1000','团购队伍id'), +('mall4cloud-group-team-491','1','1000','团购队伍id'), +('mall4cloud-group-team-492','1','1000','团购队伍id'), +('mall4cloud-group-team-493','1','1000','团购队伍id'), +('mall4cloud-group-team-494','1','1000','团购队伍id'), +('mall4cloud-group-team-495','1','1000','团购队伍id'), +('mall4cloud-group-team-496','1','1000','团购队伍id'), +('mall4cloud-group-team-497','1','1000','团购队伍id'), +('mall4cloud-group-team-498','1','1000','团购队伍id'), +('mall4cloud-group-team-499','1','1000','团购队伍id'), +('mall4cloud-group-team-500','1','1000','团购队伍id'), +('mall4cloud-group-team-501','1','1000','团购队伍id'), +('mall4cloud-group-team-502','1','1000','团购队伍id'), +('mall4cloud-group-team-503','1','1000','团购队伍id'), +('mall4cloud-group-team-504','1','1000','团购队伍id'), +('mall4cloud-group-team-505','1','1000','团购队伍id'), +('mall4cloud-group-team-506','1','1000','团购队伍id'), +('mall4cloud-group-team-507','1','1000','团购队伍id'), +('mall4cloud-group-team-508','1','1000','团购队伍id'), +('mall4cloud-group-team-509','1','1000','团购队伍id'), +('mall4cloud-group-team-510','1','1000','团购队伍id'), +('mall4cloud-group-team-511','1','1000','团购队伍id'), +('mall4cloud-group-team-512','1','1000','团购队伍id'), +('mall4cloud-group-team-513','1','1000','团购队伍id'), +('mall4cloud-group-team-514','1','1000','团购队伍id'), +('mall4cloud-group-team-515','1','1000','团购队伍id'), +('mall4cloud-group-team-516','1','1000','团购队伍id'), +('mall4cloud-group-team-517','1','1000','团购队伍id'), +('mall4cloud-group-team-518','1','1000','团购队伍id'), +('mall4cloud-group-team-519','1','1000','团购队伍id'), +('mall4cloud-group-team-520','1','1000','团购队伍id'), +('mall4cloud-group-team-521','1','1000','团购队伍id'), +('mall4cloud-group-team-522','1','1000','团购队伍id'), +('mall4cloud-group-team-523','1','1000','团购队伍id'), +('mall4cloud-group-team-524','1','1000','团购队伍id'), +('mall4cloud-group-team-525','1','1000','团购队伍id'), +('mall4cloud-group-team-526','1','1000','团购队伍id'), +('mall4cloud-group-team-527','1','1000','团购队伍id'), +('mall4cloud-group-team-528','1','1000','团购队伍id'), +('mall4cloud-group-team-529','1','1000','团购队伍id'), +('mall4cloud-group-team-530','1','1000','团购队伍id'), +('mall4cloud-group-team-531','1','1000','团购队伍id'), +('mall4cloud-group-team-532','1','1000','团购队伍id'), +('mall4cloud-group-team-533','1','1000','团购队伍id'), +('mall4cloud-group-team-534','1','1000','团购队伍id'), +('mall4cloud-group-team-535','1','1000','团购队伍id'), +('mall4cloud-group-team-536','1','1000','团购队伍id'), +('mall4cloud-group-team-537','1','1000','团购队伍id'), +('mall4cloud-group-team-538','1','1000','团购队伍id'), +('mall4cloud-group-team-539','1','1000','团购队伍id'), +('mall4cloud-group-team-540','1','1000','团购队伍id'), +('mall4cloud-group-team-541','1','1000','团购队伍id'), +('mall4cloud-group-team-542','1','1000','团购队伍id'), +('mall4cloud-group-team-543','1','1000','团购队伍id'), +('mall4cloud-group-team-544','1','1000','团购队伍id'), +('mall4cloud-group-team-545','1','1000','团购队伍id'), +('mall4cloud-group-team-546','1','1000','团购队伍id'), +('mall4cloud-group-team-547','1','1000','团购队伍id'), +('mall4cloud-group-team-548','1','1000','团购队伍id'), +('mall4cloud-group-team-549','1','1000','团购队伍id'), +('mall4cloud-group-team-550','1','1000','团购队伍id'), +('mall4cloud-group-team-551','1','1000','团购队伍id'), +('mall4cloud-group-team-552','1','1000','团购队伍id'), +('mall4cloud-group-team-553','1','1000','团购队伍id'), +('mall4cloud-group-team-554','1','1000','团购队伍id'), +('mall4cloud-group-team-555','1','1000','团购队伍id'), +('mall4cloud-group-team-556','1','1000','团购队伍id'), +('mall4cloud-group-team-557','1','1000','团购队伍id'), +('mall4cloud-group-team-558','1','1000','团购队伍id'), +('mall4cloud-group-team-559','1','1000','团购队伍id'), +('mall4cloud-group-team-560','1','1000','团购队伍id'), +('mall4cloud-group-team-561','1','1000','团购队伍id'), +('mall4cloud-group-team-562','1','1000','团购队伍id'), +('mall4cloud-group-team-563','1','1000','团购队伍id'), +('mall4cloud-group-team-564','1','1000','团购队伍id'), +('mall4cloud-group-team-565','1','1000','团购队伍id'), +('mall4cloud-group-team-566','1','1000','团购队伍id'), +('mall4cloud-group-team-567','1','1000','团购队伍id'), +('mall4cloud-group-team-568','1','1000','团购队伍id'), +('mall4cloud-group-team-569','1','1000','团购队伍id'), +('mall4cloud-group-team-570','1','1000','团购队伍id'), +('mall4cloud-group-team-571','1','1000','团购队伍id'), +('mall4cloud-group-team-572','1','1000','团购队伍id'), +('mall4cloud-group-team-573','1','1000','团购队伍id'), +('mall4cloud-group-team-574','1','1000','团购队伍id'), +('mall4cloud-group-team-575','1','1000','团购队伍id'), +('mall4cloud-group-team-576','1','1000','团购队伍id'), +('mall4cloud-group-team-577','1','1000','团购队伍id'), +('mall4cloud-group-team-578','1','1000','团购队伍id'), +('mall4cloud-group-team-579','1','1000','团购队伍id'), +('mall4cloud-group-team-580','1','1000','团购队伍id'), +('mall4cloud-group-team-581','1','1000','团购队伍id'), +('mall4cloud-group-team-582','1','1000','团购队伍id'), +('mall4cloud-group-team-583','1','1000','团购队伍id'), +('mall4cloud-group-team-584','1','1000','团购队伍id'), +('mall4cloud-group-team-585','1','1000','团购队伍id'), +('mall4cloud-group-team-586','1','1000','团购队伍id'), +('mall4cloud-group-team-587','1','1000','团购队伍id'), +('mall4cloud-group-team-588','1','1000','团购队伍id'), +('mall4cloud-group-team-589','1','1000','团购队伍id'), +('mall4cloud-group-team-590','1','1000','团购队伍id'), +('mall4cloud-group-team-591','1','1000','团购队伍id'), +('mall4cloud-group-team-592','1','1000','团购队伍id'), +('mall4cloud-group-team-593','1','1000','团购队伍id'), +('mall4cloud-group-team-594','1','1000','团购队伍id'), +('mall4cloud-group-team-595','1','1000','团购队伍id'), +('mall4cloud-group-team-596','1','1000','团购队伍id'), +('mall4cloud-group-team-597','1','1000','团购队伍id'), +('mall4cloud-group-team-598','1','1000','团购队伍id'), +('mall4cloud-group-team-599','1','1000','团购队伍id'), +('mall4cloud-group-team-600','1','1000','团购队伍id'), +('mall4cloud-group-team-601','1','1000','团购队伍id'), +('mall4cloud-group-team-602','1','1000','团购队伍id'), +('mall4cloud-group-team-603','1','1000','团购队伍id'), +('mall4cloud-group-team-604','1','1000','团购队伍id'), +('mall4cloud-group-team-605','1','1000','团购队伍id'), +('mall4cloud-group-team-606','1','1000','团购队伍id'), +('mall4cloud-group-team-607','1','1000','团购队伍id'), +('mall4cloud-group-team-608','1','1000','团购队伍id'), +('mall4cloud-group-team-609','1','1000','团购队伍id'), +('mall4cloud-group-team-610','1','1000','团购队伍id'), +('mall4cloud-group-team-611','1','1000','团购队伍id'), +('mall4cloud-group-team-612','1','1000','团购队伍id'), +('mall4cloud-group-team-613','1','1000','团购队伍id'), +('mall4cloud-group-team-614','1','1000','团购队伍id'), +('mall4cloud-group-team-615','1','1000','团购队伍id'), +('mall4cloud-group-team-616','1','1000','团购队伍id'), +('mall4cloud-group-team-617','1','1000','团购队伍id'), +('mall4cloud-group-team-618','1','1000','团购队伍id'), +('mall4cloud-group-team-619','1','1000','团购队伍id'), +('mall4cloud-group-team-620','1','1000','团购队伍id'), +('mall4cloud-group-team-621','1','1000','团购队伍id'), +('mall4cloud-group-team-622','1','1000','团购队伍id'), +('mall4cloud-group-team-623','1','1000','团购队伍id'), +('mall4cloud-group-team-624','1','1000','团购队伍id'), +('mall4cloud-group-team-625','1','1000','团购队伍id'), +('mall4cloud-group-team-626','1','1000','团购队伍id'), +('mall4cloud-group-team-627','1','1000','团购队伍id'), +('mall4cloud-group-team-628','1','1000','团购队伍id'), +('mall4cloud-group-team-629','1','1000','团购队伍id'), +('mall4cloud-group-team-630','1','1000','团购队伍id'), +('mall4cloud-group-team-631','1','1000','团购队伍id'), +('mall4cloud-group-team-632','1','1000','团购队伍id'), +('mall4cloud-group-team-633','1','1000','团购队伍id'), +('mall4cloud-group-team-634','1','1000','团购队伍id'), +('mall4cloud-group-team-635','1','1000','团购队伍id'), +('mall4cloud-group-team-636','1','1000','团购队伍id'), +('mall4cloud-group-team-637','1','1000','团购队伍id'), +('mall4cloud-group-team-638','1','1000','团购队伍id'), +('mall4cloud-group-team-639','1','1000','团购队伍id'), +('mall4cloud-group-team-640','1','1000','团购队伍id'), +('mall4cloud-group-team-641','1','1000','团购队伍id'), +('mall4cloud-group-team-642','1','1000','团购队伍id'), +('mall4cloud-group-team-643','1','1000','团购队伍id'), +('mall4cloud-group-team-644','1','1000','团购队伍id'), +('mall4cloud-group-team-645','1','1000','团购队伍id'), +('mall4cloud-group-team-646','1','1000','团购队伍id'), +('mall4cloud-group-team-647','1','1000','团购队伍id'), +('mall4cloud-group-team-648','1','1000','团购队伍id'), +('mall4cloud-group-team-649','1','1000','团购队伍id'), +('mall4cloud-group-team-650','1','1000','团购队伍id'), +('mall4cloud-group-team-651','1','1000','团购队伍id'), +('mall4cloud-group-team-652','1','1000','团购队伍id'), +('mall4cloud-group-team-653','1','1000','团购队伍id'), +('mall4cloud-group-team-654','1','1000','团购队伍id'), +('mall4cloud-group-team-655','1','1000','团购队伍id'), +('mall4cloud-group-team-656','1','1000','团购队伍id'), +('mall4cloud-group-team-657','1','1000','团购队伍id'), +('mall4cloud-group-team-658','1','1000','团购队伍id'), +('mall4cloud-group-team-659','1','1000','团购队伍id'), +('mall4cloud-group-team-660','1','1000','团购队伍id'), +('mall4cloud-group-team-661','1','1000','团购队伍id'), +('mall4cloud-group-team-662','1','1000','团购队伍id'), +('mall4cloud-group-team-663','1','1000','团购队伍id'), +('mall4cloud-group-team-664','1','1000','团购队伍id'), +('mall4cloud-group-team-665','1','1000','团购队伍id'), +('mall4cloud-group-team-666','1','1000','团购队伍id'), +('mall4cloud-group-team-667','1','1000','团购队伍id'), +('mall4cloud-group-team-668','1','1000','团购队伍id'), +('mall4cloud-group-team-669','1','1000','团购队伍id'), +('mall4cloud-group-team-670','1','1000','团购队伍id'), +('mall4cloud-group-team-671','1','1000','团购队伍id'), +('mall4cloud-group-team-672','1','1000','团购队伍id'), +('mall4cloud-group-team-673','1','1000','团购队伍id'), +('mall4cloud-group-team-674','1','1000','团购队伍id'), +('mall4cloud-group-team-675','1','1000','团购队伍id'), +('mall4cloud-group-team-676','1','1000','团购队伍id'), +('mall4cloud-group-team-677','1','1000','团购队伍id'), +('mall4cloud-group-team-678','1','1000','团购队伍id'), +('mall4cloud-group-team-679','1','1000','团购队伍id'), +('mall4cloud-group-team-680','1','1000','团购队伍id'), +('mall4cloud-group-team-681','1','1000','团购队伍id'), +('mall4cloud-group-team-682','1','1000','团购队伍id'), +('mall4cloud-group-team-683','1','1000','团购队伍id'), +('mall4cloud-group-team-684','1','1000','团购队伍id'), +('mall4cloud-group-team-685','1','1000','团购队伍id'), +('mall4cloud-group-team-686','1','1000','团购队伍id'), +('mall4cloud-group-team-687','1','1000','团购队伍id'), +('mall4cloud-group-team-688','1','1000','团购队伍id'), +('mall4cloud-group-team-689','1','1000','团购队伍id'), +('mall4cloud-group-team-690','1','1000','团购队伍id'), +('mall4cloud-group-team-691','1','1000','团购队伍id'), +('mall4cloud-group-team-692','1','1000','团购队伍id'), +('mall4cloud-group-team-693','1','1000','团购队伍id'), +('mall4cloud-group-team-694','1','1000','团购队伍id'), +('mall4cloud-group-team-695','1','1000','团购队伍id'), +('mall4cloud-group-team-696','1','1000','团购队伍id'), +('mall4cloud-group-team-697','1','1000','团购队伍id'), +('mall4cloud-group-team-698','1','1000','团购队伍id'), +('mall4cloud-group-team-699','1','1000','团购队伍id'), +('mall4cloud-group-team-700','1','1000','团购队伍id'), +('mall4cloud-group-team-701','1','1000','团购队伍id'), +('mall4cloud-group-team-702','1','1000','团购队伍id'), +('mall4cloud-group-team-703','1','1000','团购队伍id'), +('mall4cloud-group-team-704','1','1000','团购队伍id'), +('mall4cloud-group-team-705','1','1000','团购队伍id'), +('mall4cloud-group-team-706','1','1000','团购队伍id'), +('mall4cloud-group-team-707','1','1000','团购队伍id'), +('mall4cloud-group-team-708','1','1000','团购队伍id'), +('mall4cloud-group-team-709','1','1000','团购队伍id'), +('mall4cloud-group-team-710','1','1000','团购队伍id'), +('mall4cloud-group-team-711','1','1000','团购队伍id'), +('mall4cloud-group-team-712','1','1000','团购队伍id'), +('mall4cloud-group-team-713','1','1000','团购队伍id'), +('mall4cloud-group-team-714','1','1000','团购队伍id'), +('mall4cloud-group-team-715','1','1000','团购队伍id'), +('mall4cloud-group-team-716','1','1000','团购队伍id'), +('mall4cloud-group-team-717','1','1000','团购队伍id'), +('mall4cloud-group-team-718','1','1000','团购队伍id'), +('mall4cloud-group-team-719','1','1000','团购队伍id'), +('mall4cloud-group-team-720','1','1000','团购队伍id'), +('mall4cloud-group-team-721','1','1000','团购队伍id'), +('mall4cloud-group-team-722','1','1000','团购队伍id'), +('mall4cloud-group-team-723','1','1000','团购队伍id'), +('mall4cloud-group-team-724','1','1000','团购队伍id'), +('mall4cloud-group-team-725','1','1000','团购队伍id'), +('mall4cloud-group-team-726','1','1000','团购队伍id'), +('mall4cloud-group-team-727','1','1000','团购队伍id'), +('mall4cloud-group-team-728','1','1000','团购队伍id'), +('mall4cloud-group-team-729','1','1000','团购队伍id'), +('mall4cloud-group-team-730','1','1000','团购队伍id'), +('mall4cloud-group-team-731','1','1000','团购队伍id'), +('mall4cloud-group-team-732','1','1000','团购队伍id'), +('mall4cloud-group-team-733','1','1000','团购队伍id'), +('mall4cloud-group-team-734','1','1000','团购队伍id'), +('mall4cloud-group-team-735','1','1000','团购队伍id'), +('mall4cloud-group-team-736','1','1000','团购队伍id'), +('mall4cloud-group-team-737','1','1000','团购队伍id'), +('mall4cloud-group-team-738','1','1000','团购队伍id'), +('mall4cloud-group-team-739','1','1000','团购队伍id'), +('mall4cloud-group-team-740','1','1000','团购队伍id'), +('mall4cloud-group-team-741','1','1000','团购队伍id'), +('mall4cloud-group-team-742','1','1000','团购队伍id'), +('mall4cloud-group-team-743','1','1000','团购队伍id'), +('mall4cloud-group-team-744','1','1000','团购队伍id'), +('mall4cloud-group-team-745','1','1000','团购队伍id'), +('mall4cloud-group-team-746','1','1000','团购队伍id'), +('mall4cloud-group-team-747','1','1000','团购队伍id'), +('mall4cloud-group-team-748','1','1000','团购队伍id'), +('mall4cloud-group-team-749','1','1000','团购队伍id'), +('mall4cloud-group-team-750','1','1000','团购队伍id'), +('mall4cloud-group-team-751','1','1000','团购队伍id'), +('mall4cloud-group-team-752','1','1000','团购队伍id'), +('mall4cloud-group-team-753','1','1000','团购队伍id'), +('mall4cloud-group-team-754','1','1000','团购队伍id'), +('mall4cloud-group-team-755','1','1000','团购队伍id'), +('mall4cloud-group-team-756','1','1000','团购队伍id'), +('mall4cloud-group-team-757','1','1000','团购队伍id'), +('mall4cloud-group-team-758','1','1000','团购队伍id'), +('mall4cloud-group-team-759','1','1000','团购队伍id'), +('mall4cloud-group-team-760','1','1000','团购队伍id'), +('mall4cloud-group-team-761','1','1000','团购队伍id'), +('mall4cloud-group-team-762','1','1000','团购队伍id'), +('mall4cloud-group-team-763','1','1000','团购队伍id'), +('mall4cloud-group-team-764','1','1000','团购队伍id'), +('mall4cloud-group-team-765','1','1000','团购队伍id'), +('mall4cloud-group-team-766','1','1000','团购队伍id'), +('mall4cloud-group-team-767','1','1000','团购队伍id'), +('mall4cloud-group-team-768','1','1000','团购队伍id'), +('mall4cloud-group-team-769','1','1000','团购队伍id'), +('mall4cloud-group-team-770','1','1000','团购队伍id'), +('mall4cloud-group-team-771','1','1000','团购队伍id'), +('mall4cloud-group-team-772','1','1000','团购队伍id'), +('mall4cloud-group-team-773','1','1000','团购队伍id'), +('mall4cloud-group-team-774','1','1000','团购队伍id'), +('mall4cloud-group-team-775','1','1000','团购队伍id'), +('mall4cloud-group-team-776','1','1000','团购队伍id'), +('mall4cloud-group-team-777','1','1000','团购队伍id'), +('mall4cloud-group-team-778','1','1000','团购队伍id'), +('mall4cloud-group-team-779','1','1000','团购队伍id'), +('mall4cloud-group-team-780','1','1000','团购队伍id'), +('mall4cloud-group-team-781','1','1000','团购队伍id'), +('mall4cloud-group-team-782','1','1000','团购队伍id'), +('mall4cloud-group-team-783','1','1000','团购队伍id'), +('mall4cloud-group-team-784','1','1000','团购队伍id'), +('mall4cloud-group-team-785','1','1000','团购队伍id'), +('mall4cloud-group-team-786','1','1000','团购队伍id'), +('mall4cloud-group-team-787','1','1000','团购队伍id'), +('mall4cloud-group-team-788','1','1000','团购队伍id'), +('mall4cloud-group-team-789','1','1000','团购队伍id'), +('mall4cloud-group-team-790','1','1000','团购队伍id'), +('mall4cloud-group-team-791','1','1000','团购队伍id'), +('mall4cloud-group-team-792','1','1000','团购队伍id'), +('mall4cloud-group-team-793','1','1000','团购队伍id'), +('mall4cloud-group-team-794','1','1000','团购队伍id'), +('mall4cloud-group-team-795','1','1000','团购队伍id'), +('mall4cloud-group-team-796','1','1000','团购队伍id'), +('mall4cloud-group-team-797','1','1000','团购队伍id'), +('mall4cloud-group-team-798','1','1000','团购队伍id'), +('mall4cloud-group-team-799','1','1000','团购队伍id'), +('mall4cloud-group-team-800','1','1000','团购队伍id'), +('mall4cloud-group-team-801','1','1000','团购队伍id'), +('mall4cloud-group-team-802','1','1000','团购队伍id'), +('mall4cloud-group-team-803','1','1000','团购队伍id'), +('mall4cloud-group-team-804','1','1000','团购队伍id'), +('mall4cloud-group-team-805','1','1000','团购队伍id'), +('mall4cloud-group-team-806','1','1000','团购队伍id'), +('mall4cloud-group-team-807','1','1000','团购队伍id'), +('mall4cloud-group-team-808','1','1000','团购队伍id'), +('mall4cloud-group-team-809','1','1000','团购队伍id'), +('mall4cloud-group-team-810','1','1000','团购队伍id'), +('mall4cloud-group-team-811','1','1000','团购队伍id'), +('mall4cloud-group-team-812','1','1000','团购队伍id'), +('mall4cloud-group-team-813','1','1000','团购队伍id'), +('mall4cloud-group-team-814','1','1000','团购队伍id'), +('mall4cloud-group-team-815','1','1000','团购队伍id'), +('mall4cloud-group-team-816','1','1000','团购队伍id'), +('mall4cloud-group-team-817','1','1000','团购队伍id'), +('mall4cloud-group-team-818','1','1000','团购队伍id'), +('mall4cloud-group-team-819','1','1000','团购队伍id'), +('mall4cloud-group-team-820','1','1000','团购队伍id'), +('mall4cloud-group-team-821','1','1000','团购队伍id'), +('mall4cloud-group-team-822','1','1000','团购队伍id'), +('mall4cloud-group-team-823','1','1000','团购队伍id'), +('mall4cloud-group-team-824','1','1000','团购队伍id'), +('mall4cloud-group-team-825','1','1000','团购队伍id'), +('mall4cloud-group-team-826','1','1000','团购队伍id'), +('mall4cloud-group-team-827','1','1000','团购队伍id'), +('mall4cloud-group-team-828','1','1000','团购队伍id'), +('mall4cloud-group-team-829','1','1000','团购队伍id'), +('mall4cloud-group-team-830','1','1000','团购队伍id'), +('mall4cloud-group-team-831','1','1000','团购队伍id'), +('mall4cloud-group-team-832','1','1000','团购队伍id'), +('mall4cloud-group-team-833','1','1000','团购队伍id'), +('mall4cloud-group-team-834','1','1000','团购队伍id'), +('mall4cloud-group-team-835','1','1000','团购队伍id'), +('mall4cloud-group-team-836','1','1000','团购队伍id'), +('mall4cloud-group-team-837','1','1000','团购队伍id'), +('mall4cloud-group-team-838','1','1000','团购队伍id'), +('mall4cloud-group-team-839','1','1000','团购队伍id'), +('mall4cloud-group-team-840','1','1000','团购队伍id'), +('mall4cloud-group-team-841','1','1000','团购队伍id'), +('mall4cloud-group-team-842','1','1000','团购队伍id'), +('mall4cloud-group-team-843','1','1000','团购队伍id'), +('mall4cloud-group-team-844','1','1000','团购队伍id'), +('mall4cloud-group-team-845','1','1000','团购队伍id'), +('mall4cloud-group-team-846','1','1000','团购队伍id'), +('mall4cloud-group-team-847','1','1000','团购队伍id'), +('mall4cloud-group-team-848','1','1000','团购队伍id'), +('mall4cloud-group-team-849','1','1000','团购队伍id'), +('mall4cloud-group-team-850','1','1000','团购队伍id'), +('mall4cloud-group-team-851','1','1000','团购队伍id'), +('mall4cloud-group-team-852','1','1000','团购队伍id'), +('mall4cloud-group-team-853','1','1000','团购队伍id'), +('mall4cloud-group-team-854','1','1000','团购队伍id'), +('mall4cloud-group-team-855','1','1000','团购队伍id'), +('mall4cloud-group-team-856','1','1000','团购队伍id'), +('mall4cloud-group-team-857','1','1000','团购队伍id'), +('mall4cloud-group-team-858','1','1000','团购队伍id'), +('mall4cloud-group-team-859','1','1000','团购队伍id'), +('mall4cloud-group-team-860','1','1000','团购队伍id'), +('mall4cloud-group-team-861','1','1000','团购队伍id'), +('mall4cloud-group-team-862','1','1000','团购队伍id'), +('mall4cloud-group-team-863','1','1000','团购队伍id'), +('mall4cloud-group-team-864','1','1000','团购队伍id'), +('mall4cloud-group-team-865','1','1000','团购队伍id'), +('mall4cloud-group-team-866','1','1000','团购队伍id'), +('mall4cloud-group-team-867','1','1000','团购队伍id'), +('mall4cloud-group-team-868','1','1000','团购队伍id'), +('mall4cloud-group-team-869','1','1000','团购队伍id'), +('mall4cloud-group-team-870','1','1000','团购队伍id'), +('mall4cloud-group-team-871','1','1000','团购队伍id'), +('mall4cloud-group-team-872','1','1000','团购队伍id'), +('mall4cloud-group-team-873','1','1000','团购队伍id'), +('mall4cloud-group-team-874','1','1000','团购队伍id'), +('mall4cloud-group-team-875','1','1000','团购队伍id'), +('mall4cloud-group-team-876','1','1000','团购队伍id'), +('mall4cloud-group-team-877','1','1000','团购队伍id'), +('mall4cloud-group-team-878','1','1000','团购队伍id'), +('mall4cloud-group-team-879','1','1000','团购队伍id'), +('mall4cloud-group-team-880','1','1000','团购队伍id'), +('mall4cloud-group-team-881','1','1000','团购队伍id'), +('mall4cloud-group-team-882','1','1000','团购队伍id'), +('mall4cloud-group-team-883','1','1000','团购队伍id'), +('mall4cloud-group-team-884','1','1000','团购队伍id'), +('mall4cloud-group-team-885','1','1000','团购队伍id'), +('mall4cloud-group-team-886','1','1000','团购队伍id'), +('mall4cloud-group-team-887','1','1000','团购队伍id'), +('mall4cloud-group-team-888','1','1000','团购队伍id'), +('mall4cloud-group-team-889','1','1000','团购队伍id'), +('mall4cloud-group-team-890','1','1000','团购队伍id'), +('mall4cloud-group-team-891','1','1000','团购队伍id'), +('mall4cloud-group-team-892','1','1000','团购队伍id'), +('mall4cloud-group-team-893','1','1000','团购队伍id'), +('mall4cloud-group-team-894','1','1000','团购队伍id'), +('mall4cloud-group-team-895','1','1000','团购队伍id'), +('mall4cloud-group-team-896','1','1000','团购队伍id'), +('mall4cloud-group-team-897','1','1000','团购队伍id'), +('mall4cloud-group-team-898','1','1000','团购队伍id'), +('mall4cloud-group-team-899','1','1000','团购队伍id'), +('mall4cloud-group-team-900','1','1000','团购队伍id'), +('mall4cloud-group-team-901','1','1000','团购队伍id'), +('mall4cloud-group-team-902','1','1000','团购队伍id'), +('mall4cloud-group-team-903','1','1000','团购队伍id'), +('mall4cloud-group-team-904','1','1000','团购队伍id'), +('mall4cloud-group-team-905','1','1000','团购队伍id'), +('mall4cloud-group-team-906','1','1000','团购队伍id'), +('mall4cloud-group-team-907','1','1000','团购队伍id'), +('mall4cloud-group-team-908','1','1000','团购队伍id'), +('mall4cloud-group-team-909','1','1000','团购队伍id'), +('mall4cloud-group-team-910','1','1000','团购队伍id'), +('mall4cloud-group-team-911','1','1000','团购队伍id'), +('mall4cloud-group-team-912','1','1000','团购队伍id'), +('mall4cloud-group-team-913','1','1000','团购队伍id'), +('mall4cloud-group-team-914','1','1000','团购队伍id'), +('mall4cloud-group-team-915','1','1000','团购队伍id'), +('mall4cloud-group-team-916','1','1000','团购队伍id'), +('mall4cloud-group-team-917','1','1000','团购队伍id'), +('mall4cloud-group-team-918','1','1000','团购队伍id'), +('mall4cloud-group-team-919','1','1000','团购队伍id'), +('mall4cloud-group-team-920','1','1000','团购队伍id'), +('mall4cloud-group-team-921','1','1000','团购队伍id'), +('mall4cloud-group-team-922','1','1000','团购队伍id'), +('mall4cloud-group-team-923','1','1000','团购队伍id'), +('mall4cloud-group-team-924','1','1000','团购队伍id'), +('mall4cloud-group-team-925','1','1000','团购队伍id'), +('mall4cloud-group-team-926','1','1000','团购队伍id'), +('mall4cloud-group-team-927','1','1000','团购队伍id'), +('mall4cloud-group-team-928','1','1000','团购队伍id'), +('mall4cloud-group-team-929','1','1000','团购队伍id'), +('mall4cloud-group-team-930','1','1000','团购队伍id'), +('mall4cloud-group-team-931','1','1000','团购队伍id'), +('mall4cloud-group-team-932','1','1000','团购队伍id'), +('mall4cloud-group-team-933','1','1000','团购队伍id'), +('mall4cloud-group-team-934','1','1000','团购队伍id'), +('mall4cloud-group-team-935','1','1000','团购队伍id'), +('mall4cloud-group-team-936','1','1000','团购队伍id'), +('mall4cloud-group-team-937','1','1000','团购队伍id'), +('mall4cloud-group-team-938','1','1000','团购队伍id'), +('mall4cloud-group-team-939','1','1000','团购队伍id'), +('mall4cloud-group-team-940','1','1000','团购队伍id'), +('mall4cloud-group-team-941','1','1000','团购队伍id'), +('mall4cloud-group-team-942','1','1000','团购队伍id'), +('mall4cloud-group-team-943','1','1000','团购队伍id'), +('mall4cloud-group-team-944','1','1000','团购队伍id'), +('mall4cloud-group-team-945','1','1000','团购队伍id'), +('mall4cloud-group-team-946','1','1000','团购队伍id'), +('mall4cloud-group-team-947','1','1000','团购队伍id'), +('mall4cloud-group-team-948','1','1000','团购队伍id'), +('mall4cloud-group-team-949','1','1000','团购队伍id'), +('mall4cloud-group-team-950','1','1000','团购队伍id'), +('mall4cloud-group-team-951','1','1000','团购队伍id'), +('mall4cloud-group-team-952','1','1000','团购队伍id'), +('mall4cloud-group-team-953','1','1000','团购队伍id'), +('mall4cloud-group-team-954','1','1000','团购队伍id'), +('mall4cloud-group-team-955','1','1000','团购队伍id'), +('mall4cloud-group-team-956','1','1000','团购队伍id'), +('mall4cloud-group-team-957','1','1000','团购队伍id'), +('mall4cloud-group-team-958','1','1000','团购队伍id'), +('mall4cloud-group-team-959','1','1000','团购队伍id'), +('mall4cloud-group-team-960','1','1000','团购队伍id'), +('mall4cloud-group-team-961','1','1000','团购队伍id'), +('mall4cloud-group-team-962','1','1000','团购队伍id'), +('mall4cloud-group-team-963','1','1000','团购队伍id'), +('mall4cloud-group-team-964','1','1000','团购队伍id'), +('mall4cloud-group-team-965','1','1000','团购队伍id'), +('mall4cloud-group-team-966','1','1000','团购队伍id'), +('mall4cloud-group-team-967','1','1000','团购队伍id'), +('mall4cloud-group-team-968','1','1000','团购队伍id'), +('mall4cloud-group-team-969','1','1000','团购队伍id'), +('mall4cloud-group-team-970','1','1000','团购队伍id'), +('mall4cloud-group-team-971','1','1000','团购队伍id'), +('mall4cloud-group-team-972','1','1000','团购队伍id'), +('mall4cloud-group-team-973','1','1000','团购队伍id'), +('mall4cloud-group-team-974','1','1000','团购队伍id'), +('mall4cloud-group-team-975','1','1000','团购队伍id'), +('mall4cloud-group-team-976','1','1000','团购队伍id'), +('mall4cloud-group-team-977','1','1000','团购队伍id'), +('mall4cloud-group-team-978','1','1000','团购队伍id'), +('mall4cloud-group-team-979','1','1000','团购队伍id'), +('mall4cloud-group-team-980','1','1000','团购队伍id'), +('mall4cloud-group-team-981','1','1000','团购队伍id'), +('mall4cloud-group-team-982','1','1000','团购队伍id'), +('mall4cloud-group-team-983','1','1000','团购队伍id'), +('mall4cloud-group-team-984','1','1000','团购队伍id'), +('mall4cloud-group-team-985','1','1000','团购队伍id'), +('mall4cloud-group-team-986','1','1000','团购队伍id'), +('mall4cloud-group-team-987','1','1000','团购队伍id'), +('mall4cloud-group-team-988','1','1000','团购队伍id'), +('mall4cloud-group-team-989','1','1000','团购队伍id'), +('mall4cloud-group-team-990','1','1000','团购队伍id'), +('mall4cloud-group-team-991','1','1000','团购队伍id'), +('mall4cloud-group-team-992','1','1000','团购队伍id'), +('mall4cloud-group-team-993','1','1000','团购队伍id'), +('mall4cloud-group-team-994','1','1000','团购队伍id'), +('mall4cloud-group-team-995','1','1000','团购队伍id'), +('mall4cloud-group-team-996','1','1000','团购队伍id'), +('mall4cloud-group-team-997','1','1000','团购队伍id'), +('mall4cloud-group-team-998','1','1000','团购队伍id'), +('mall4cloud-group-team-999','1','1000','团购队伍id'), +('mall4cloud-group-order-000','1','1000','团购订单号'), +('mall4cloud-group-order-001','1','1000','团购订单号'), +('mall4cloud-group-order-002','1','1000','团购订单号'), +('mall4cloud-group-order-003','1','1000','团购订单号'), +('mall4cloud-group-order-004','1','1000','团购订单号'), +('mall4cloud-group-order-005','1','1000','团购订单号'), +('mall4cloud-group-order-006','1','1000','团购订单号'), +('mall4cloud-group-order-007','1','1000','团购订单号'), +('mall4cloud-group-order-008','1','1000','团购订单号'), +('mall4cloud-group-order-009','1','1000','团购订单号'), +('mall4cloud-group-order-010','1','1000','团购订单号'), +('mall4cloud-group-order-011','1','1000','团购订单号'), +('mall4cloud-group-order-012','1','1000','团购订单号'), +('mall4cloud-group-order-013','1','1000','团购订单号'), +('mall4cloud-group-order-014','1','1000','团购订单号'), +('mall4cloud-group-order-015','1','1000','团购订单号'), +('mall4cloud-group-order-016','1','1000','团购订单号'), +('mall4cloud-group-order-017','1','1000','团购订单号'), +('mall4cloud-group-order-018','1','1000','团购订单号'), +('mall4cloud-group-order-019','1','1000','团购订单号'), +('mall4cloud-group-order-020','1','1000','团购订单号'), +('mall4cloud-group-order-021','1','1000','团购订单号'), +('mall4cloud-group-order-022','1','1000','团购订单号'), +('mall4cloud-group-order-023','1','1000','团购订单号'), +('mall4cloud-group-order-024','1','1000','团购订单号'), +('mall4cloud-group-order-025','1','1000','团购订单号'), +('mall4cloud-group-order-026','1','1000','团购订单号'), +('mall4cloud-group-order-027','1','1000','团购订单号'), +('mall4cloud-group-order-028','1','1000','团购订单号'), +('mall4cloud-group-order-029','1','1000','团购订单号'), +('mall4cloud-group-order-030','1','1000','团购订单号'), +('mall4cloud-group-order-031','1','1000','团购订单号'), +('mall4cloud-group-order-032','1','1000','团购订单号'), +('mall4cloud-group-order-033','1','1000','团购订单号'), +('mall4cloud-group-order-034','1','1000','团购订单号'), +('mall4cloud-group-order-035','1','1000','团购订单号'), +('mall4cloud-group-order-036','1','1000','团购订单号'), +('mall4cloud-group-order-037','1','1000','团购订单号'), +('mall4cloud-group-order-038','1','1000','团购订单号'), +('mall4cloud-group-order-039','1','1000','团购订单号'), +('mall4cloud-group-order-040','1','1000','团购订单号'), +('mall4cloud-group-order-041','1','1000','团购订单号'), +('mall4cloud-group-order-042','1','1000','团购订单号'), +('mall4cloud-group-order-043','1','1000','团购订单号'), +('mall4cloud-group-order-044','1','1000','团购订单号'), +('mall4cloud-group-order-045','1','1000','团购订单号'), +('mall4cloud-group-order-046','1','1000','团购订单号'), +('mall4cloud-group-order-047','1','1000','团购订单号'), +('mall4cloud-group-order-048','1','1000','团购订单号'), +('mall4cloud-group-order-049','1','1000','团购订单号'), +('mall4cloud-group-order-050','1','1000','团购订单号'), +('mall4cloud-group-order-051','1','1000','团购订单号'), +('mall4cloud-group-order-052','1','1000','团购订单号'), +('mall4cloud-group-order-053','1','1000','团购订单号'), +('mall4cloud-group-order-054','1','1000','团购订单号'), +('mall4cloud-group-order-055','1','1000','团购订单号'), +('mall4cloud-group-order-056','1','1000','团购订单号'), +('mall4cloud-group-order-057','1','1000','团购订单号'), +('mall4cloud-group-order-058','1','1000','团购订单号'), +('mall4cloud-group-order-059','1','1000','团购订单号'), +('mall4cloud-group-order-060','1','1000','团购订单号'), +('mall4cloud-group-order-061','1','1000','团购订单号'), +('mall4cloud-group-order-062','1','1000','团购订单号'), +('mall4cloud-group-order-063','1','1000','团购订单号'), +('mall4cloud-group-order-064','1','1000','团购订单号'), +('mall4cloud-group-order-065','1','1000','团购订单号'), +('mall4cloud-group-order-066','1','1000','团购订单号'), +('mall4cloud-group-order-067','1','1000','团购订单号'), +('mall4cloud-group-order-068','1','1000','团购订单号'), +('mall4cloud-group-order-069','1','1000','团购订单号'), +('mall4cloud-group-order-070','1','1000','团购订单号'), +('mall4cloud-group-order-071','1','1000','团购订单号'), +('mall4cloud-group-order-072','1','1000','团购订单号'), +('mall4cloud-group-order-073','1','1000','团购订单号'), +('mall4cloud-group-order-074','1','1000','团购订单号'), +('mall4cloud-group-order-075','1','1000','团购订单号'), +('mall4cloud-group-order-076','1','1000','团购订单号'), +('mall4cloud-group-order-077','1','1000','团购订单号'), +('mall4cloud-group-order-078','1','1000','团购订单号'), +('mall4cloud-group-order-079','1','1000','团购订单号'), +('mall4cloud-group-order-080','1','1000','团购订单号'), +('mall4cloud-group-order-081','1','1000','团购订单号'), +('mall4cloud-group-order-082','1','1000','团购订单号'), +('mall4cloud-group-order-083','1','1000','团购订单号'), +('mall4cloud-group-order-084','1','1000','团购订单号'), +('mall4cloud-group-order-085','1','1000','团购订单号'), +('mall4cloud-group-order-086','1','1000','团购订单号'), +('mall4cloud-group-order-087','1','1000','团购订单号'), +('mall4cloud-group-order-088','1','1000','团购订单号'), +('mall4cloud-group-order-089','1','1000','团购订单号'), +('mall4cloud-group-order-090','1','1000','团购订单号'), +('mall4cloud-group-order-091','1','1000','团购订单号'), +('mall4cloud-group-order-092','1','1000','团购订单号'), +('mall4cloud-group-order-093','1','1000','团购订单号'), +('mall4cloud-group-order-094','1','1000','团购订单号'), +('mall4cloud-group-order-095','1','1000','团购订单号'), +('mall4cloud-group-order-096','1','1000','团购订单号'), +('mall4cloud-group-order-097','1','1000','团购订单号'), +('mall4cloud-group-order-098','1','1000','团购订单号'), +('mall4cloud-group-order-099','1','1000','团购订单号'), +('mall4cloud-group-order-100','1','1000','团购订单号'), +('mall4cloud-group-order-101','1','1000','团购订单号'), +('mall4cloud-group-order-102','1','1000','团购订单号'), +('mall4cloud-group-order-103','1','1000','团购订单号'), +('mall4cloud-group-order-104','1','1000','团购订单号'), +('mall4cloud-group-order-105','1','1000','团购订单号'), +('mall4cloud-group-order-106','1','1000','团购订单号'), +('mall4cloud-group-order-107','1','1000','团购订单号'), +('mall4cloud-group-order-108','1','1000','团购订单号'), +('mall4cloud-group-order-109','1','1000','团购订单号'), +('mall4cloud-group-order-110','1','1000','团购订单号'), +('mall4cloud-group-order-111','1','1000','团购订单号'), +('mall4cloud-group-order-112','1','1000','团购订单号'), +('mall4cloud-group-order-113','1','1000','团购订单号'), +('mall4cloud-group-order-114','1','1000','团购订单号'), +('mall4cloud-group-order-115','1','1000','团购订单号'), +('mall4cloud-group-order-116','1','1000','团购订单号'), +('mall4cloud-group-order-117','1','1000','团购订单号'), +('mall4cloud-group-order-118','1','1000','团购订单号'), +('mall4cloud-group-order-119','1','1000','团购订单号'), +('mall4cloud-group-order-120','1','1000','团购订单号'), +('mall4cloud-group-order-121','1','1000','团购订单号'), +('mall4cloud-group-order-122','1','1000','团购订单号'), +('mall4cloud-group-order-123','1','1000','团购订单号'), +('mall4cloud-group-order-124','1','1000','团购订单号'), +('mall4cloud-group-order-125','1','1000','团购订单号'), +('mall4cloud-group-order-126','1','1000','团购订单号'), +('mall4cloud-group-order-127','1','1000','团购订单号'), +('mall4cloud-group-order-128','1','1000','团购订单号'), +('mall4cloud-group-order-129','1','1000','团购订单号'), +('mall4cloud-group-order-130','1','1000','团购订单号'), +('mall4cloud-group-order-131','1','1000','团购订单号'), +('mall4cloud-group-order-132','1','1000','团购订单号'), +('mall4cloud-group-order-133','1','1000','团购订单号'), +('mall4cloud-group-order-134','1','1000','团购订单号'), +('mall4cloud-group-order-135','1','1000','团购订单号'), +('mall4cloud-group-order-136','1','1000','团购订单号'), +('mall4cloud-group-order-137','1','1000','团购订单号'), +('mall4cloud-group-order-138','1','1000','团购订单号'), +('mall4cloud-group-order-139','1','1000','团购订单号'), +('mall4cloud-group-order-140','1','1000','团购订单号'), +('mall4cloud-group-order-141','1','1000','团购订单号'), +('mall4cloud-group-order-142','1','1000','团购订单号'), +('mall4cloud-group-order-143','1','1000','团购订单号'), +('mall4cloud-group-order-144','1','1000','团购订单号'), +('mall4cloud-group-order-145','1','1000','团购订单号'), +('mall4cloud-group-order-146','1','1000','团购订单号'), +('mall4cloud-group-order-147','1','1000','团购订单号'), +('mall4cloud-group-order-148','1','1000','团购订单号'), +('mall4cloud-group-order-149','1','1000','团购订单号'), +('mall4cloud-group-order-150','1','1000','团购订单号'), +('mall4cloud-group-order-151','1','1000','团购订单号'), +('mall4cloud-group-order-152','1','1000','团购订单号'), +('mall4cloud-group-order-153','1','1000','团购订单号'), +('mall4cloud-group-order-154','1','1000','团购订单号'), +('mall4cloud-group-order-155','1','1000','团购订单号'), +('mall4cloud-group-order-156','1','1000','团购订单号'), +('mall4cloud-group-order-157','1','1000','团购订单号'), +('mall4cloud-group-order-158','1','1000','团购订单号'), +('mall4cloud-group-order-159','1','1000','团购订单号'), +('mall4cloud-group-order-160','1','1000','团购订单号'), +('mall4cloud-group-order-161','1','1000','团购订单号'), +('mall4cloud-group-order-162','1','1000','团购订单号'), +('mall4cloud-group-order-163','1','1000','团购订单号'), +('mall4cloud-group-order-164','1','1000','团购订单号'), +('mall4cloud-group-order-165','1','1000','团购订单号'), +('mall4cloud-group-order-166','1','1000','团购订单号'), +('mall4cloud-group-order-167','1','1000','团购订单号'), +('mall4cloud-group-order-168','1','1000','团购订单号'), +('mall4cloud-group-order-169','1','1000','团购订单号'), +('mall4cloud-group-order-170','1','1000','团购订单号'), +('mall4cloud-group-order-171','1','1000','团购订单号'), +('mall4cloud-group-order-172','1','1000','团购订单号'), +('mall4cloud-group-order-173','1','1000','团购订单号'), +('mall4cloud-group-order-174','1','1000','团购订单号'), +('mall4cloud-group-order-175','1','1000','团购订单号'), +('mall4cloud-group-order-176','1','1000','团购订单号'), +('mall4cloud-group-order-177','1','1000','团购订单号'), +('mall4cloud-group-order-178','1','1000','团购订单号'), +('mall4cloud-group-order-179','1','1000','团购订单号'), +('mall4cloud-group-order-180','1','1000','团购订单号'), +('mall4cloud-group-order-181','1','1000','团购订单号'), +('mall4cloud-group-order-182','1','1000','团购订单号'), +('mall4cloud-group-order-183','1','1000','团购订单号'), +('mall4cloud-group-order-184','1','1000','团购订单号'), +('mall4cloud-group-order-185','1','1000','团购订单号'), +('mall4cloud-group-order-186','1','1000','团购订单号'), +('mall4cloud-group-order-187','1','1000','团购订单号'), +('mall4cloud-group-order-188','1','1000','团购订单号'), +('mall4cloud-group-order-189','1','1000','团购订单号'), +('mall4cloud-group-order-190','1','1000','团购订单号'), +('mall4cloud-group-order-191','1','1000','团购订单号'), +('mall4cloud-group-order-192','1','1000','团购订单号'), +('mall4cloud-group-order-193','1','1000','团购订单号'), +('mall4cloud-group-order-194','1','1000','团购订单号'), +('mall4cloud-group-order-195','1','1000','团购订单号'), +('mall4cloud-group-order-196','1','1000','团购订单号'), +('mall4cloud-group-order-197','1','1000','团购订单号'), +('mall4cloud-group-order-198','1','1000','团购订单号'), +('mall4cloud-group-order-199','1','1000','团购订单号'), +('mall4cloud-group-order-200','1','1000','团购订单号'), +('mall4cloud-group-order-201','1','1000','团购订单号'), +('mall4cloud-group-order-202','1','1000','团购订单号'), +('mall4cloud-group-order-203','1','1000','团购订单号'), +('mall4cloud-group-order-204','1','1000','团购订单号'), +('mall4cloud-group-order-205','1','1000','团购订单号'), +('mall4cloud-group-order-206','1','1000','团购订单号'), +('mall4cloud-group-order-207','1','1000','团购订单号'), +('mall4cloud-group-order-208','1','1000','团购订单号'), +('mall4cloud-group-order-209','1','1000','团购订单号'), +('mall4cloud-group-order-210','1','1000','团购订单号'), +('mall4cloud-group-order-211','1','1000','团购订单号'), +('mall4cloud-group-order-212','1','1000','团购订单号'), +('mall4cloud-group-order-213','1','1000','团购订单号'), +('mall4cloud-group-order-214','1','1000','团购订单号'), +('mall4cloud-group-order-215','1','1000','团购订单号'), +('mall4cloud-group-order-216','1','1000','团购订单号'), +('mall4cloud-group-order-217','1','1000','团购订单号'), +('mall4cloud-group-order-218','1','1000','团购订单号'), +('mall4cloud-group-order-219','1','1000','团购订单号'), +('mall4cloud-group-order-220','1','1000','团购订单号'), +('mall4cloud-group-order-221','1','1000','团购订单号'), +('mall4cloud-group-order-222','1','1000','团购订单号'), +('mall4cloud-group-order-223','1','1000','团购订单号'), +('mall4cloud-group-order-224','1','1000','团购订单号'), +('mall4cloud-group-order-225','1','1000','团购订单号'), +('mall4cloud-group-order-226','1','1000','团购订单号'), +('mall4cloud-group-order-227','1','1000','团购订单号'), +('mall4cloud-group-order-228','1','1000','团购订单号'), +('mall4cloud-group-order-229','1','1000','团购订单号'), +('mall4cloud-group-order-230','1','1000','团购订单号'), +('mall4cloud-group-order-231','1','1000','团购订单号'), +('mall4cloud-group-order-232','1','1000','团购订单号'), +('mall4cloud-group-order-233','1','1000','团购订单号'), +('mall4cloud-group-order-234','1','1000','团购订单号'), +('mall4cloud-group-order-235','1','1000','团购订单号'), +('mall4cloud-group-order-236','1','1000','团购订单号'), +('mall4cloud-group-order-237','1','1000','团购订单号'), +('mall4cloud-group-order-238','1','1000','团购订单号'), +('mall4cloud-group-order-239','1','1000','团购订单号'), +('mall4cloud-group-order-240','1','1000','团购订单号'), +('mall4cloud-group-order-241','1','1000','团购订单号'), +('mall4cloud-group-order-242','1','1000','团购订单号'), +('mall4cloud-group-order-243','1','1000','团购订单号'), +('mall4cloud-group-order-244','1','1000','团购订单号'), +('mall4cloud-group-order-245','1','1000','团购订单号'), +('mall4cloud-group-order-246','1','1000','团购订单号'), +('mall4cloud-group-order-247','1','1000','团购订单号'), +('mall4cloud-group-order-248','1','1000','团购订单号'), +('mall4cloud-group-order-249','1','1000','团购订单号'), +('mall4cloud-group-order-250','1','1000','团购订单号'), +('mall4cloud-group-order-251','1','1000','团购订单号'), +('mall4cloud-group-order-252','1','1000','团购订单号'), +('mall4cloud-group-order-253','1','1000','团购订单号'), +('mall4cloud-group-order-254','1','1000','团购订单号'), +('mall4cloud-group-order-255','1','1000','团购订单号'), +('mall4cloud-group-order-256','1','1000','团购订单号'), +('mall4cloud-group-order-257','1','1000','团购订单号'), +('mall4cloud-group-order-258','1','1000','团购订单号'), +('mall4cloud-group-order-259','1','1000','团购订单号'), +('mall4cloud-group-order-260','1','1000','团购订单号'), +('mall4cloud-group-order-261','1','1000','团购订单号'), +('mall4cloud-group-order-262','1','1000','团购订单号'), +('mall4cloud-group-order-263','1','1000','团购订单号'), +('mall4cloud-group-order-264','1','1000','团购订单号'), +('mall4cloud-group-order-265','1','1000','团购订单号'), +('mall4cloud-group-order-266','1','1000','团购订单号'), +('mall4cloud-group-order-267','1','1000','团购订单号'), +('mall4cloud-group-order-268','1','1000','团购订单号'), +('mall4cloud-group-order-269','1','1000','团购订单号'), +('mall4cloud-group-order-270','1','1000','团购订单号'), +('mall4cloud-group-order-271','1','1000','团购订单号'), +('mall4cloud-group-order-272','1','1000','团购订单号'), +('mall4cloud-group-order-273','1','1000','团购订单号'), +('mall4cloud-group-order-274','1','1000','团购订单号'), +('mall4cloud-group-order-275','1','1000','团购订单号'), +('mall4cloud-group-order-276','1','1000','团购订单号'), +('mall4cloud-group-order-277','1','1000','团购订单号'), +('mall4cloud-group-order-278','1','1000','团购订单号'), +('mall4cloud-group-order-279','1','1000','团购订单号'), +('mall4cloud-group-order-280','1','1000','团购订单号'), +('mall4cloud-group-order-281','1','1000','团购订单号'), +('mall4cloud-group-order-282','1','1000','团购订单号'), +('mall4cloud-group-order-283','1','1000','团购订单号'), +('mall4cloud-group-order-284','1','1000','团购订单号'), +('mall4cloud-group-order-285','1','1000','团购订单号'), +('mall4cloud-group-order-286','1','1000','团购订单号'), +('mall4cloud-group-order-287','1','1000','团购订单号'), +('mall4cloud-group-order-288','1','1000','团购订单号'), +('mall4cloud-group-order-289','1','1000','团购订单号'), +('mall4cloud-group-order-290','1','1000','团购订单号'), +('mall4cloud-group-order-291','1','1000','团购订单号'), +('mall4cloud-group-order-292','1','1000','团购订单号'), +('mall4cloud-group-order-293','1','1000','团购订单号'), +('mall4cloud-group-order-294','1','1000','团购订单号'), +('mall4cloud-group-order-295','1','1000','团购订单号'), +('mall4cloud-group-order-296','1','1000','团购订单号'), +('mall4cloud-group-order-297','1','1000','团购订单号'), +('mall4cloud-group-order-298','1','1000','团购订单号'), +('mall4cloud-group-order-299','1','1000','团购订单号'), +('mall4cloud-group-order-300','1','1000','团购订单号'), +('mall4cloud-group-order-301','1','1000','团购订单号'), +('mall4cloud-group-order-302','1','1000','团购订单号'), +('mall4cloud-group-order-303','1','1000','团购订单号'), +('mall4cloud-group-order-304','1','1000','团购订单号'), +('mall4cloud-group-order-305','1','1000','团购订单号'), +('mall4cloud-group-order-306','1','1000','团购订单号'), +('mall4cloud-group-order-307','1','1000','团购订单号'), +('mall4cloud-group-order-308','1','1000','团购订单号'), +('mall4cloud-group-order-309','1','1000','团购订单号'), +('mall4cloud-group-order-310','1','1000','团购订单号'), +('mall4cloud-group-order-311','1','1000','团购订单号'), +('mall4cloud-group-order-312','1','1000','团购订单号'), +('mall4cloud-group-order-313','1','1000','团购订单号'), +('mall4cloud-group-order-314','1','1000','团购订单号'), +('mall4cloud-group-order-315','1','1000','团购订单号'), +('mall4cloud-group-order-316','1','1000','团购订单号'), +('mall4cloud-group-order-317','1','1000','团购订单号'), +('mall4cloud-group-order-318','1','1000','团购订单号'), +('mall4cloud-group-order-319','1','1000','团购订单号'), +('mall4cloud-group-order-320','1','1000','团购订单号'), +('mall4cloud-group-order-321','1','1000','团购订单号'), +('mall4cloud-group-order-322','1','1000','团购订单号'), +('mall4cloud-group-order-323','1','1000','团购订单号'), +('mall4cloud-group-order-324','1','1000','团购订单号'), +('mall4cloud-group-order-325','1','1000','团购订单号'), +('mall4cloud-group-order-326','1','1000','团购订单号'), +('mall4cloud-group-order-327','1','1000','团购订单号'), +('mall4cloud-group-order-328','1','1000','团购订单号'), +('mall4cloud-group-order-329','1','1000','团购订单号'), +('mall4cloud-group-order-330','1','1000','团购订单号'), +('mall4cloud-group-order-331','1','1000','团购订单号'), +('mall4cloud-group-order-332','1','1000','团购订单号'), +('mall4cloud-group-order-333','1','1000','团购订单号'), +('mall4cloud-group-order-334','1','1000','团购订单号'), +('mall4cloud-group-order-335','1','1000','团购订单号'), +('mall4cloud-group-order-336','1','1000','团购订单号'), +('mall4cloud-group-order-337','1','1000','团购订单号'), +('mall4cloud-group-order-338','1','1000','团购订单号'), +('mall4cloud-group-order-339','1','1000','团购订单号'), +('mall4cloud-group-order-340','1','1000','团购订单号'), +('mall4cloud-group-order-341','1','1000','团购订单号'), +('mall4cloud-group-order-342','1','1000','团购订单号'), +('mall4cloud-group-order-343','1','1000','团购订单号'), +('mall4cloud-group-order-344','1','1000','团购订单号'), +('mall4cloud-group-order-345','1','1000','团购订单号'), +('mall4cloud-group-order-346','1','1000','团购订单号'), +('mall4cloud-group-order-347','1','1000','团购订单号'), +('mall4cloud-group-order-348','1','1000','团购订单号'), +('mall4cloud-group-order-349','1','1000','团购订单号'), +('mall4cloud-group-order-350','1','1000','团购订单号'), +('mall4cloud-group-order-351','1','1000','团购订单号'), +('mall4cloud-group-order-352','1','1000','团购订单号'), +('mall4cloud-group-order-353','1','1000','团购订单号'), +('mall4cloud-group-order-354','1','1000','团购订单号'), +('mall4cloud-group-order-355','1','1000','团购订单号'), +('mall4cloud-group-order-356','1','1000','团购订单号'), +('mall4cloud-group-order-357','1','1000','团购订单号'), +('mall4cloud-group-order-358','1','1000','团购订单号'), +('mall4cloud-group-order-359','1','1000','团购订单号'), +('mall4cloud-group-order-360','1','1000','团购订单号'), +('mall4cloud-group-order-361','1','1000','团购订单号'), +('mall4cloud-group-order-362','1','1000','团购订单号'), +('mall4cloud-group-order-363','1','1000','团购订单号'), +('mall4cloud-group-order-364','1','1000','团购订单号'), +('mall4cloud-group-order-365','1','1000','团购订单号'), +('mall4cloud-group-order-366','1','1000','团购订单号'), +('mall4cloud-group-order-367','1','1000','团购订单号'), +('mall4cloud-group-order-368','1','1000','团购订单号'), +('mall4cloud-group-order-369','1','1000','团购订单号'), +('mall4cloud-group-order-370','1','1000','团购订单号'), +('mall4cloud-group-order-371','1','1000','团购订单号'), +('mall4cloud-group-order-372','1','1000','团购订单号'), +('mall4cloud-group-order-373','1','1000','团购订单号'), +('mall4cloud-group-order-374','1','1000','团购订单号'), +('mall4cloud-group-order-375','1','1000','团购订单号'), +('mall4cloud-group-order-376','1','1000','团购订单号'), +('mall4cloud-group-order-377','1','1000','团购订单号'), +('mall4cloud-group-order-378','1','1000','团购订单号'), +('mall4cloud-group-order-379','1','1000','团购订单号'), +('mall4cloud-group-order-380','1','1000','团购订单号'), +('mall4cloud-group-order-381','1','1000','团购订单号'), +('mall4cloud-group-order-382','1','1000','团购订单号'), +('mall4cloud-group-order-383','1','1000','团购订单号'), +('mall4cloud-group-order-384','1','1000','团购订单号'), +('mall4cloud-group-order-385','1','1000','团购订单号'), +('mall4cloud-group-order-386','1','1000','团购订单号'), +('mall4cloud-group-order-387','1','1000','团购订单号'), +('mall4cloud-group-order-388','1','1000','团购订单号'), +('mall4cloud-group-order-389','1','1000','团购订单号'), +('mall4cloud-group-order-390','1','1000','团购订单号'), +('mall4cloud-group-order-391','1','1000','团购订单号'), +('mall4cloud-group-order-392','1','1000','团购订单号'), +('mall4cloud-group-order-393','1','1000','团购订单号'), +('mall4cloud-group-order-394','1','1000','团购订单号'), +('mall4cloud-group-order-395','1','1000','团购订单号'), +('mall4cloud-group-order-396','1','1000','团购订单号'), +('mall4cloud-group-order-397','1','1000','团购订单号'), +('mall4cloud-group-order-398','1','1000','团购订单号'), +('mall4cloud-group-order-399','1','1000','团购订单号'), +('mall4cloud-group-order-400','1','1000','团购订单号'), +('mall4cloud-group-order-401','1','1000','团购订单号'), +('mall4cloud-group-order-402','1','1000','团购订单号'), +('mall4cloud-group-order-403','1','1000','团购订单号'), +('mall4cloud-group-order-404','1','1000','团购订单号'), +('mall4cloud-group-order-405','1','1000','团购订单号'), +('mall4cloud-group-order-406','1','1000','团购订单号'), +('mall4cloud-group-order-407','1','1000','团购订单号'), +('mall4cloud-group-order-408','1','1000','团购订单号'), +('mall4cloud-group-order-409','1','1000','团购订单号'), +('mall4cloud-group-order-410','1','1000','团购订单号'), +('mall4cloud-group-order-411','1','1000','团购订单号'), +('mall4cloud-group-order-412','1','1000','团购订单号'), +('mall4cloud-group-order-413','1','1000','团购订单号'), +('mall4cloud-group-order-414','1','1000','团购订单号'), +('mall4cloud-group-order-415','1','1000','团购订单号'), +('mall4cloud-group-order-416','1','1000','团购订单号'), +('mall4cloud-group-order-417','1','1000','团购订单号'), +('mall4cloud-group-order-418','1','1000','团购订单号'), +('mall4cloud-group-order-419','1','1000','团购订单号'), +('mall4cloud-group-order-420','1','1000','团购订单号'), +('mall4cloud-group-order-421','1','1000','团购订单号'), +('mall4cloud-group-order-422','1','1000','团购订单号'), +('mall4cloud-group-order-423','1','1000','团购订单号'), +('mall4cloud-group-order-424','1','1000','团购订单号'), +('mall4cloud-group-order-425','1','1000','团购订单号'), +('mall4cloud-group-order-426','1','1000','团购订单号'), +('mall4cloud-group-order-427','1','1000','团购订单号'), +('mall4cloud-group-order-428','1','1000','团购订单号'), +('mall4cloud-group-order-429','1','1000','团购订单号'), +('mall4cloud-group-order-430','1','1000','团购订单号'), +('mall4cloud-group-order-431','1','1000','团购订单号'), +('mall4cloud-group-order-432','1','1000','团购订单号'), +('mall4cloud-group-order-433','1','1000','团购订单号'), +('mall4cloud-group-order-434','1','1000','团购订单号'), +('mall4cloud-group-order-435','1','1000','团购订单号'), +('mall4cloud-group-order-436','1','1000','团购订单号'), +('mall4cloud-group-order-437','1','1000','团购订单号'), +('mall4cloud-group-order-438','1','1000','团购订单号'), +('mall4cloud-group-order-439','1','1000','团购订单号'), +('mall4cloud-group-order-440','1','1000','团购订单号'), +('mall4cloud-group-order-441','1','1000','团购订单号'), +('mall4cloud-group-order-442','1','1000','团购订单号'), +('mall4cloud-group-order-443','1','1000','团购订单号'), +('mall4cloud-group-order-444','1','1000','团购订单号'), +('mall4cloud-group-order-445','1','1000','团购订单号'), +('mall4cloud-group-order-446','1','1000','团购订单号'), +('mall4cloud-group-order-447','1','1000','团购订单号'), +('mall4cloud-group-order-448','1','1000','团购订单号'), +('mall4cloud-group-order-449','1','1000','团购订单号'), +('mall4cloud-group-order-450','1','1000','团购订单号'), +('mall4cloud-group-order-451','1','1000','团购订单号'), +('mall4cloud-group-order-452','1','1000','团购订单号'), +('mall4cloud-group-order-453','1','1000','团购订单号'), +('mall4cloud-group-order-454','1','1000','团购订单号'), +('mall4cloud-group-order-455','1','1000','团购订单号'), +('mall4cloud-group-order-456','1','1000','团购订单号'), +('mall4cloud-group-order-457','1','1000','团购订单号'), +('mall4cloud-group-order-458','1','1000','团购订单号'), +('mall4cloud-group-order-459','1','1000','团购订单号'), +('mall4cloud-group-order-460','1','1000','团购订单号'), +('mall4cloud-group-order-461','1','1000','团购订单号'), +('mall4cloud-group-order-462','1','1000','团购订单号'), +('mall4cloud-group-order-463','1','1000','团购订单号'), +('mall4cloud-group-order-464','1','1000','团购订单号'), +('mall4cloud-group-order-465','1','1000','团购订单号'), +('mall4cloud-group-order-466','1','1000','团购订单号'), +('mall4cloud-group-order-467','1','1000','团购订单号'), +('mall4cloud-group-order-468','1','1000','团购订单号'), +('mall4cloud-group-order-469','1','1000','团购订单号'), +('mall4cloud-group-order-470','1','1000','团购订单号'), +('mall4cloud-group-order-471','1','1000','团购订单号'), +('mall4cloud-group-order-472','1','1000','团购订单号'), +('mall4cloud-group-order-473','1','1000','团购订单号'), +('mall4cloud-group-order-474','1','1000','团购订单号'), +('mall4cloud-group-order-475','1','1000','团购订单号'), +('mall4cloud-group-order-476','1','1000','团购订单号'), +('mall4cloud-group-order-477','1','1000','团购订单号'), +('mall4cloud-group-order-478','1','1000','团购订单号'), +('mall4cloud-group-order-479','1','1000','团购订单号'), +('mall4cloud-group-order-480','1','1000','团购订单号'), +('mall4cloud-group-order-481','1','1000','团购订单号'), +('mall4cloud-group-order-482','1','1000','团购订单号'), +('mall4cloud-group-order-483','1','1000','团购订单号'), +('mall4cloud-group-order-484','1','1000','团购订单号'), +('mall4cloud-group-order-485','1','1000','团购订单号'), +('mall4cloud-group-order-486','1','1000','团购订单号'), +('mall4cloud-group-order-487','1','1000','团购订单号'), +('mall4cloud-group-order-488','1','1000','团购订单号'), +('mall4cloud-group-order-489','1','1000','团购订单号'), +('mall4cloud-group-order-490','1','1000','团购订单号'), +('mall4cloud-group-order-491','1','1000','团购订单号'), +('mall4cloud-group-order-492','1','1000','团购订单号'), +('mall4cloud-group-order-493','1','1000','团购订单号'), +('mall4cloud-group-order-494','1','1000','团购订单号'), +('mall4cloud-group-order-495','1','1000','团购订单号'), +('mall4cloud-group-order-496','1','1000','团购订单号'), +('mall4cloud-group-order-497','1','1000','团购订单号'), +('mall4cloud-group-order-498','1','1000','团购订单号'), +('mall4cloud-group-order-499','1','1000','团购订单号'), +('mall4cloud-group-order-500','1','1000','团购订单号'), +('mall4cloud-group-order-501','1','1000','团购订单号'), +('mall4cloud-group-order-502','1','1000','团购订单号'), +('mall4cloud-group-order-503','1','1000','团购订单号'), +('mall4cloud-group-order-504','1','1000','团购订单号'), +('mall4cloud-group-order-505','1','1000','团购订单号'), +('mall4cloud-group-order-506','1','1000','团购订单号'), +('mall4cloud-group-order-507','1','1000','团购订单号'), +('mall4cloud-group-order-508','1','1000','团购订单号'), +('mall4cloud-group-order-509','1','1000','团购订单号'), +('mall4cloud-group-order-510','1','1000','团购订单号'), +('mall4cloud-group-order-511','1','1000','团购订单号'), +('mall4cloud-group-order-512','1','1000','团购订单号'), +('mall4cloud-group-order-513','1','1000','团购订单号'), +('mall4cloud-group-order-514','1','1000','团购订单号'), +('mall4cloud-group-order-515','1','1000','团购订单号'), +('mall4cloud-group-order-516','1','1000','团购订单号'), +('mall4cloud-group-order-517','1','1000','团购订单号'), +('mall4cloud-group-order-518','1','1000','团购订单号'), +('mall4cloud-group-order-519','1','1000','团购订单号'), +('mall4cloud-group-order-520','1','1000','团购订单号'), +('mall4cloud-group-order-521','1','1000','团购订单号'), +('mall4cloud-group-order-522','1','1000','团购订单号'), +('mall4cloud-group-order-523','1','1000','团购订单号'), +('mall4cloud-group-order-524','1','1000','团购订单号'), +('mall4cloud-group-order-525','1','1000','团购订单号'), +('mall4cloud-group-order-526','1','1000','团购订单号'), +('mall4cloud-group-order-527','1','1000','团购订单号'), +('mall4cloud-group-order-528','1','1000','团购订单号'), +('mall4cloud-group-order-529','1','1000','团购订单号'), +('mall4cloud-group-order-530','1','1000','团购订单号'), +('mall4cloud-group-order-531','1','1000','团购订单号'), +('mall4cloud-group-order-532','1','1000','团购订单号'), +('mall4cloud-group-order-533','1','1000','团购订单号'), +('mall4cloud-group-order-534','1','1000','团购订单号'), +('mall4cloud-group-order-535','1','1000','团购订单号'), +('mall4cloud-group-order-536','1','1000','团购订单号'), +('mall4cloud-group-order-537','1','1000','团购订单号'), +('mall4cloud-group-order-538','1','1000','团购订单号'), +('mall4cloud-group-order-539','1','1000','团购订单号'), +('mall4cloud-group-order-540','1','1000','团购订单号'), +('mall4cloud-group-order-541','1','1000','团购订单号'), +('mall4cloud-group-order-542','1','1000','团购订单号'), +('mall4cloud-group-order-543','1','1000','团购订单号'), +('mall4cloud-group-order-544','1','1000','团购订单号'), +('mall4cloud-group-order-545','1','1000','团购订单号'), +('mall4cloud-group-order-546','1','1000','团购订单号'), +('mall4cloud-group-order-547','1','1000','团购订单号'), +('mall4cloud-group-order-548','1','1000','团购订单号'), +('mall4cloud-group-order-549','1','1000','团购订单号'), +('mall4cloud-group-order-550','1','1000','团购订单号'), +('mall4cloud-group-order-551','1','1000','团购订单号'), +('mall4cloud-group-order-552','1','1000','团购订单号'), +('mall4cloud-group-order-553','1','1000','团购订单号'), +('mall4cloud-group-order-554','1','1000','团购订单号'), +('mall4cloud-group-order-555','1','1000','团购订单号'), +('mall4cloud-group-order-556','1','1000','团购订单号'), +('mall4cloud-group-order-557','1','1000','团购订单号'), +('mall4cloud-group-order-558','1','1000','团购订单号'), +('mall4cloud-group-order-559','1','1000','团购订单号'), +('mall4cloud-group-order-560','1','1000','团购订单号'), +('mall4cloud-group-order-561','1','1000','团购订单号'), +('mall4cloud-group-order-562','1','1000','团购订单号'), +('mall4cloud-group-order-563','1','1000','团购订单号'), +('mall4cloud-group-order-564','1','1000','团购订单号'), +('mall4cloud-group-order-565','1','1000','团购订单号'), +('mall4cloud-group-order-566','1','1000','团购订单号'), +('mall4cloud-group-order-567','1','1000','团购订单号'), +('mall4cloud-group-order-568','1','1000','团购订单号'), +('mall4cloud-group-order-569','1','1000','团购订单号'), +('mall4cloud-group-order-570','1','1000','团购订单号'), +('mall4cloud-group-order-571','1','1000','团购订单号'), +('mall4cloud-group-order-572','1','1000','团购订单号'), +('mall4cloud-group-order-573','1','1000','团购订单号'), +('mall4cloud-group-order-574','1','1000','团购订单号'), +('mall4cloud-group-order-575','1','1000','团购订单号'), +('mall4cloud-group-order-576','1','1000','团购订单号'), +('mall4cloud-group-order-577','1','1000','团购订单号'), +('mall4cloud-group-order-578','1','1000','团购订单号'), +('mall4cloud-group-order-579','1','1000','团购订单号'), +('mall4cloud-group-order-580','1','1000','团购订单号'), +('mall4cloud-group-order-581','1','1000','团购订单号'), +('mall4cloud-group-order-582','1','1000','团购订单号'), +('mall4cloud-group-order-583','1','1000','团购订单号'), +('mall4cloud-group-order-584','1','1000','团购订单号'), +('mall4cloud-group-order-585','1','1000','团购订单号'), +('mall4cloud-group-order-586','1','1000','团购订单号'), +('mall4cloud-group-order-587','1','1000','团购订单号'), +('mall4cloud-group-order-588','1','1000','团购订单号'), +('mall4cloud-group-order-589','1','1000','团购订单号'), +('mall4cloud-group-order-590','1','1000','团购订单号'), +('mall4cloud-group-order-591','1','1000','团购订单号'), +('mall4cloud-group-order-592','1','1000','团购订单号'), +('mall4cloud-group-order-593','1','1000','团购订单号'), +('mall4cloud-group-order-594','1','1000','团购订单号'), +('mall4cloud-group-order-595','1','1000','团购订单号'), +('mall4cloud-group-order-596','1','1000','团购订单号'), +('mall4cloud-group-order-597','1','1000','团购订单号'), +('mall4cloud-group-order-598','1','1000','团购订单号'), +('mall4cloud-group-order-599','1','1000','团购订单号'), +('mall4cloud-group-order-600','1','1000','团购订单号'), +('mall4cloud-group-order-601','1','1000','团购订单号'), +('mall4cloud-group-order-602','1','1000','团购订单号'), +('mall4cloud-group-order-603','1','1000','团购订单号'), +('mall4cloud-group-order-604','1','1000','团购订单号'), +('mall4cloud-group-order-605','1','1000','团购订单号'), +('mall4cloud-group-order-606','1','1000','团购订单号'), +('mall4cloud-group-order-607','1','1000','团购订单号'), +('mall4cloud-group-order-608','1','1000','团购订单号'), +('mall4cloud-group-order-609','1','1000','团购订单号'), +('mall4cloud-group-order-610','1','1000','团购订单号'), +('mall4cloud-group-order-611','1','1000','团购订单号'), +('mall4cloud-group-order-612','1','1000','团购订单号'), +('mall4cloud-group-order-613','1','1000','团购订单号'), +('mall4cloud-group-order-614','1','1000','团购订单号'), +('mall4cloud-group-order-615','1','1000','团购订单号'), +('mall4cloud-group-order-616','1','1000','团购订单号'), +('mall4cloud-group-order-617','1','1000','团购订单号'), +('mall4cloud-group-order-618','1','1000','团购订单号'), +('mall4cloud-group-order-619','1','1000','团购订单号'), +('mall4cloud-group-order-620','1','1000','团购订单号'), +('mall4cloud-group-order-621','1','1000','团购订单号'), +('mall4cloud-group-order-622','1','1000','团购订单号'), +('mall4cloud-group-order-623','1','1000','团购订单号'), +('mall4cloud-group-order-624','1','1000','团购订单号'), +('mall4cloud-group-order-625','1','1000','团购订单号'), +('mall4cloud-group-order-626','1','1000','团购订单号'), +('mall4cloud-group-order-627','1','1000','团购订单号'), +('mall4cloud-group-order-628','1','1000','团购订单号'), +('mall4cloud-group-order-629','1','1000','团购订单号'), +('mall4cloud-group-order-630','1','1000','团购订单号'), +('mall4cloud-group-order-631','1','1000','团购订单号'), +('mall4cloud-group-order-632','1','1000','团购订单号'), +('mall4cloud-group-order-633','1','1000','团购订单号'), +('mall4cloud-group-order-634','1','1000','团购订单号'), +('mall4cloud-group-order-635','1','1000','团购订单号'), +('mall4cloud-group-order-636','1','1000','团购订单号'), +('mall4cloud-group-order-637','1','1000','团购订单号'), +('mall4cloud-group-order-638','1','1000','团购订单号'), +('mall4cloud-group-order-639','1','1000','团购订单号'), +('mall4cloud-group-order-640','1','1000','团购订单号'), +('mall4cloud-group-order-641','1','1000','团购订单号'), +('mall4cloud-group-order-642','1','1000','团购订单号'), +('mall4cloud-group-order-643','1','1000','团购订单号'), +('mall4cloud-group-order-644','1','1000','团购订单号'), +('mall4cloud-group-order-645','1','1000','团购订单号'), +('mall4cloud-group-order-646','1','1000','团购订单号'), +('mall4cloud-group-order-647','1','1000','团购订单号'), +('mall4cloud-group-order-648','1','1000','团购订单号'), +('mall4cloud-group-order-649','1','1000','团购订单号'), +('mall4cloud-group-order-650','1','1000','团购订单号'), +('mall4cloud-group-order-651','1','1000','团购订单号'), +('mall4cloud-group-order-652','1','1000','团购订单号'), +('mall4cloud-group-order-653','1','1000','团购订单号'), +('mall4cloud-group-order-654','1','1000','团购订单号'), +('mall4cloud-group-order-655','1','1000','团购订单号'), +('mall4cloud-group-order-656','1','1000','团购订单号'), +('mall4cloud-group-order-657','1','1000','团购订单号'), +('mall4cloud-group-order-658','1','1000','团购订单号'), +('mall4cloud-group-order-659','1','1000','团购订单号'), +('mall4cloud-group-order-660','1','1000','团购订单号'), +('mall4cloud-group-order-661','1','1000','团购订单号'), +('mall4cloud-group-order-662','1','1000','团购订单号'), +('mall4cloud-group-order-663','1','1000','团购订单号'), +('mall4cloud-group-order-664','1','1000','团购订单号'), +('mall4cloud-group-order-665','1','1000','团购订单号'), +('mall4cloud-group-order-666','1','1000','团购订单号'), +('mall4cloud-group-order-667','1','1000','团购订单号'), +('mall4cloud-group-order-668','1','1000','团购订单号'), +('mall4cloud-group-order-669','1','1000','团购订单号'), +('mall4cloud-group-order-670','1','1000','团购订单号'), +('mall4cloud-group-order-671','1','1000','团购订单号'), +('mall4cloud-group-order-672','1','1000','团购订单号'), +('mall4cloud-group-order-673','1','1000','团购订单号'), +('mall4cloud-group-order-674','1','1000','团购订单号'), +('mall4cloud-group-order-675','1','1000','团购订单号'), +('mall4cloud-group-order-676','1','1000','团购订单号'), +('mall4cloud-group-order-677','1','1000','团购订单号'), +('mall4cloud-group-order-678','1','1000','团购订单号'), +('mall4cloud-group-order-679','1','1000','团购订单号'), +('mall4cloud-group-order-680','1','1000','团购订单号'), +('mall4cloud-group-order-681','1','1000','团购订单号'), +('mall4cloud-group-order-682','1','1000','团购订单号'), +('mall4cloud-group-order-683','1','1000','团购订单号'), +('mall4cloud-group-order-684','1','1000','团购订单号'), +('mall4cloud-group-order-685','1','1000','团购订单号'), +('mall4cloud-group-order-686','1','1000','团购订单号'), +('mall4cloud-group-order-687','1','1000','团购订单号'), +('mall4cloud-group-order-688','1','1000','团购订单号'), +('mall4cloud-group-order-689','1','1000','团购订单号'), +('mall4cloud-group-order-690','1','1000','团购订单号'), +('mall4cloud-group-order-691','1','1000','团购订单号'), +('mall4cloud-group-order-692','1','1000','团购订单号'), +('mall4cloud-group-order-693','1','1000','团购订单号'), +('mall4cloud-group-order-694','1','1000','团购订单号'), +('mall4cloud-group-order-695','1','1000','团购订单号'), +('mall4cloud-group-order-696','1','1000','团购订单号'), +('mall4cloud-group-order-697','1','1000','团购订单号'), +('mall4cloud-group-order-698','1','1000','团购订单号'), +('mall4cloud-group-order-699','1','1000','团购订单号'), +('mall4cloud-group-order-700','1','1000','团购订单号'), +('mall4cloud-group-order-701','1','1000','团购订单号'), +('mall4cloud-group-order-702','1','1000','团购订单号'), +('mall4cloud-group-order-703','1','1000','团购订单号'), +('mall4cloud-group-order-704','1','1000','团购订单号'), +('mall4cloud-group-order-705','1','1000','团购订单号'), +('mall4cloud-group-order-706','1','1000','团购订单号'), +('mall4cloud-group-order-707','1','1000','团购订单号'), +('mall4cloud-group-order-708','1','1000','团购订单号'), +('mall4cloud-group-order-709','1','1000','团购订单号'), +('mall4cloud-group-order-710','1','1000','团购订单号'), +('mall4cloud-group-order-711','1','1000','团购订单号'), +('mall4cloud-group-order-712','1','1000','团购订单号'), +('mall4cloud-group-order-713','1','1000','团购订单号'), +('mall4cloud-group-order-714','1','1000','团购订单号'), +('mall4cloud-group-order-715','1','1000','团购订单号'), +('mall4cloud-group-order-716','1','1000','团购订单号'), +('mall4cloud-group-order-717','1','1000','团购订单号'), +('mall4cloud-group-order-718','1','1000','团购订单号'), +('mall4cloud-group-order-719','1','1000','团购订单号'), +('mall4cloud-group-order-720','1','1000','团购订单号'), +('mall4cloud-group-order-721','1','1000','团购订单号'), +('mall4cloud-group-order-722','1','1000','团购订单号'), +('mall4cloud-group-order-723','1','1000','团购订单号'), +('mall4cloud-group-order-724','1','1000','团购订单号'), +('mall4cloud-group-order-725','1','1000','团购订单号'), +('mall4cloud-group-order-726','1','1000','团购订单号'), +('mall4cloud-group-order-727','1','1000','团购订单号'), +('mall4cloud-group-order-728','1','1000','团购订单号'), +('mall4cloud-group-order-729','1','1000','团购订单号'), +('mall4cloud-group-order-730','1','1000','团购订单号'), +('mall4cloud-group-order-731','1','1000','团购订单号'), +('mall4cloud-group-order-732','1','1000','团购订单号'), +('mall4cloud-group-order-733','1','1000','团购订单号'), +('mall4cloud-group-order-734','1','1000','团购订单号'), +('mall4cloud-group-order-735','1','1000','团购订单号'), +('mall4cloud-group-order-736','1','1000','团购订单号'), +('mall4cloud-group-order-737','1','1000','团购订单号'), +('mall4cloud-group-order-738','1','1000','团购订单号'), +('mall4cloud-group-order-739','1','1000','团购订单号'), +('mall4cloud-group-order-740','1','1000','团购订单号'), +('mall4cloud-group-order-741','1','1000','团购订单号'), +('mall4cloud-group-order-742','1','1000','团购订单号'), +('mall4cloud-group-order-743','1','1000','团购订单号'), +('mall4cloud-group-order-744','1','1000','团购订单号'), +('mall4cloud-group-order-745','1','1000','团购订单号'), +('mall4cloud-group-order-746','1','1000','团购订单号'), +('mall4cloud-group-order-747','1','1000','团购订单号'), +('mall4cloud-group-order-748','1','1000','团购订单号'), +('mall4cloud-group-order-749','1','1000','团购订单号'), +('mall4cloud-group-order-750','1','1000','团购订单号'), +('mall4cloud-group-order-751','1','1000','团购订单号'), +('mall4cloud-group-order-752','1','1000','团购订单号'), +('mall4cloud-group-order-753','1','1000','团购订单号'), +('mall4cloud-group-order-754','1','1000','团购订单号'), +('mall4cloud-group-order-755','1','1000','团购订单号'), +('mall4cloud-group-order-756','1','1000','团购订单号'), +('mall4cloud-group-order-757','1','1000','团购订单号'), +('mall4cloud-group-order-758','1','1000','团购订单号'), +('mall4cloud-group-order-759','1','1000','团购订单号'), +('mall4cloud-group-order-760','1','1000','团购订单号'), +('mall4cloud-group-order-761','1','1000','团购订单号'), +('mall4cloud-group-order-762','1','1000','团购订单号'), +('mall4cloud-group-order-763','1','1000','团购订单号'), +('mall4cloud-group-order-764','1','1000','团购订单号'), +('mall4cloud-group-order-765','1','1000','团购订单号'), +('mall4cloud-group-order-766','1','1000','团购订单号'), +('mall4cloud-group-order-767','1','1000','团购订单号'), +('mall4cloud-group-order-768','1','1000','团购订单号'), +('mall4cloud-group-order-769','1','1000','团购订单号'), +('mall4cloud-group-order-770','1','1000','团购订单号'), +('mall4cloud-group-order-771','1','1000','团购订单号'), +('mall4cloud-group-order-772','1','1000','团购订单号'), +('mall4cloud-group-order-773','1','1000','团购订单号'), +('mall4cloud-group-order-774','1','1000','团购订单号'), +('mall4cloud-group-order-775','1','1000','团购订单号'), +('mall4cloud-group-order-776','1','1000','团购订单号'), +('mall4cloud-group-order-777','1','1000','团购订单号'), +('mall4cloud-group-order-778','1','1000','团购订单号'), +('mall4cloud-group-order-779','1','1000','团购订单号'), +('mall4cloud-group-order-780','1','1000','团购订单号'), +('mall4cloud-group-order-781','1','1000','团购订单号'), +('mall4cloud-group-order-782','1','1000','团购订单号'), +('mall4cloud-group-order-783','1','1000','团购订单号'), +('mall4cloud-group-order-784','1','1000','团购订单号'), +('mall4cloud-group-order-785','1','1000','团购订单号'), +('mall4cloud-group-order-786','1','1000','团购订单号'), +('mall4cloud-group-order-787','1','1000','团购订单号'), +('mall4cloud-group-order-788','1','1000','团购订单号'), +('mall4cloud-group-order-789','1','1000','团购订单号'), +('mall4cloud-group-order-790','1','1000','团购订单号'), +('mall4cloud-group-order-791','1','1000','团购订单号'), +('mall4cloud-group-order-792','1','1000','团购订单号'), +('mall4cloud-group-order-793','1','1000','团购订单号'), +('mall4cloud-group-order-794','1','1000','团购订单号'), +('mall4cloud-group-order-795','1','1000','团购订单号'), +('mall4cloud-group-order-796','1','1000','团购订单号'), +('mall4cloud-group-order-797','1','1000','团购订单号'), +('mall4cloud-group-order-798','1','1000','团购订单号'), +('mall4cloud-group-order-799','1','1000','团购订单号'), +('mall4cloud-group-order-800','1','1000','团购订单号'), +('mall4cloud-group-order-801','1','1000','团购订单号'), +('mall4cloud-group-order-802','1','1000','团购订单号'), +('mall4cloud-group-order-803','1','1000','团购订单号'), +('mall4cloud-group-order-804','1','1000','团购订单号'), +('mall4cloud-group-order-805','1','1000','团购订单号'), +('mall4cloud-group-order-806','1','1000','团购订单号'), +('mall4cloud-group-order-807','1','1000','团购订单号'), +('mall4cloud-group-order-808','1','1000','团购订单号'), +('mall4cloud-group-order-809','1','1000','团购订单号'), +('mall4cloud-group-order-810','1','1000','团购订单号'), +('mall4cloud-group-order-811','1','1000','团购订单号'), +('mall4cloud-group-order-812','1','1000','团购订单号'), +('mall4cloud-group-order-813','1','1000','团购订单号'), +('mall4cloud-group-order-814','1','1000','团购订单号'), +('mall4cloud-group-order-815','1','1000','团购订单号'), +('mall4cloud-group-order-816','1','1000','团购订单号'), +('mall4cloud-group-order-817','1','1000','团购订单号'), +('mall4cloud-group-order-818','1','1000','团购订单号'), +('mall4cloud-group-order-819','1','1000','团购订单号'), +('mall4cloud-group-order-820','1','1000','团购订单号'), +('mall4cloud-group-order-821','1','1000','团购订单号'), +('mall4cloud-group-order-822','1','1000','团购订单号'), +('mall4cloud-group-order-823','1','1000','团购订单号'), +('mall4cloud-group-order-824','1','1000','团购订单号'), +('mall4cloud-group-order-825','1','1000','团购订单号'), +('mall4cloud-group-order-826','1','1000','团购订单号'), +('mall4cloud-group-order-827','1','1000','团购订单号'), +('mall4cloud-group-order-828','1','1000','团购订单号'), +('mall4cloud-group-order-829','1','1000','团购订单号'), +('mall4cloud-group-order-830','1','1000','团购订单号'), +('mall4cloud-group-order-831','1','1000','团购订单号'), +('mall4cloud-group-order-832','1','1000','团购订单号'), +('mall4cloud-group-order-833','1','1000','团购订单号'), +('mall4cloud-group-order-834','1','1000','团购订单号'), +('mall4cloud-group-order-835','1','1000','团购订单号'), +('mall4cloud-group-order-836','1','1000','团购订单号'), +('mall4cloud-group-order-837','1','1000','团购订单号'), +('mall4cloud-group-order-838','1','1000','团购订单号'), +('mall4cloud-group-order-839','1','1000','团购订单号'), +('mall4cloud-group-order-840','1','1000','团购订单号'), +('mall4cloud-group-order-841','1','1000','团购订单号'), +('mall4cloud-group-order-842','1','1000','团购订单号'), +('mall4cloud-group-order-843','1','1000','团购订单号'), +('mall4cloud-group-order-844','1','1000','团购订单号'), +('mall4cloud-group-order-845','1','1000','团购订单号'), +('mall4cloud-group-order-846','1','1000','团购订单号'), +('mall4cloud-group-order-847','1','1000','团购订单号'), +('mall4cloud-group-order-848','1','1000','团购订单号'), +('mall4cloud-group-order-849','1','1000','团购订单号'), +('mall4cloud-group-order-850','1','1000','团购订单号'), +('mall4cloud-group-order-851','1','1000','团购订单号'), +('mall4cloud-group-order-852','1','1000','团购订单号'), +('mall4cloud-group-order-853','1','1000','团购订单号'), +('mall4cloud-group-order-854','1','1000','团购订单号'), +('mall4cloud-group-order-855','1','1000','团购订单号'), +('mall4cloud-group-order-856','1','1000','团购订单号'), +('mall4cloud-group-order-857','1','1000','团购订单号'), +('mall4cloud-group-order-858','1','1000','团购订单号'), +('mall4cloud-group-order-859','1','1000','团购订单号'), +('mall4cloud-group-order-860','1','1000','团购订单号'), +('mall4cloud-group-order-861','1','1000','团购订单号'), +('mall4cloud-group-order-862','1','1000','团购订单号'), +('mall4cloud-group-order-863','1','1000','团购订单号'), +('mall4cloud-group-order-864','1','1000','团购订单号'), +('mall4cloud-group-order-865','1','1000','团购订单号'), +('mall4cloud-group-order-866','1','1000','团购订单号'), +('mall4cloud-group-order-867','1','1000','团购订单号'), +('mall4cloud-group-order-868','1','1000','团购订单号'), +('mall4cloud-group-order-869','1','1000','团购订单号'), +('mall4cloud-group-order-870','1','1000','团购订单号'), +('mall4cloud-group-order-871','1','1000','团购订单号'), +('mall4cloud-group-order-872','1','1000','团购订单号'), +('mall4cloud-group-order-873','1','1000','团购订单号'), +('mall4cloud-group-order-874','1','1000','团购订单号'), +('mall4cloud-group-order-875','1','1000','团购订单号'), +('mall4cloud-group-order-876','1','1000','团购订单号'), +('mall4cloud-group-order-877','1','1000','团购订单号'), +('mall4cloud-group-order-878','1','1000','团购订单号'), +('mall4cloud-group-order-879','1','1000','团购订单号'), +('mall4cloud-group-order-880','1','1000','团购订单号'), +('mall4cloud-group-order-881','1','1000','团购订单号'), +('mall4cloud-group-order-882','1','1000','团购订单号'), +('mall4cloud-group-order-883','1','1000','团购订单号'), +('mall4cloud-group-order-884','1','1000','团购订单号'), +('mall4cloud-group-order-885','1','1000','团购订单号'), +('mall4cloud-group-order-886','1','1000','团购订单号'), +('mall4cloud-group-order-887','1','1000','团购订单号'), +('mall4cloud-group-order-888','1','1000','团购订单号'), +('mall4cloud-group-order-889','1','1000','团购订单号'), +('mall4cloud-group-order-890','1','1000','团购订单号'), +('mall4cloud-group-order-891','1','1000','团购订单号'), +('mall4cloud-group-order-892','1','1000','团购订单号'), +('mall4cloud-group-order-893','1','1000','团购订单号'), +('mall4cloud-group-order-894','1','1000','团购订单号'), +('mall4cloud-group-order-895','1','1000','团购订单号'), +('mall4cloud-group-order-896','1','1000','团购订单号'), +('mall4cloud-group-order-897','1','1000','团购订单号'), +('mall4cloud-group-order-898','1','1000','团购订单号'), +('mall4cloud-group-order-899','1','1000','团购订单号'), +('mall4cloud-group-order-900','1','1000','团购订单号'), +('mall4cloud-group-order-901','1','1000','团购订单号'), +('mall4cloud-group-order-902','1','1000','团购订单号'), +('mall4cloud-group-order-903','1','1000','团购订单号'), +('mall4cloud-group-order-904','1','1000','团购订单号'), +('mall4cloud-group-order-905','1','1000','团购订单号'), +('mall4cloud-group-order-906','1','1000','团购订单号'), +('mall4cloud-group-order-907','1','1000','团购订单号'), +('mall4cloud-group-order-908','1','1000','团购订单号'), +('mall4cloud-group-order-909','1','1000','团购订单号'), +('mall4cloud-group-order-910','1','1000','团购订单号'), +('mall4cloud-group-order-911','1','1000','团购订单号'), +('mall4cloud-group-order-912','1','1000','团购订单号'), +('mall4cloud-group-order-913','1','1000','团购订单号'), +('mall4cloud-group-order-914','1','1000','团购订单号'), +('mall4cloud-group-order-915','1','1000','团购订单号'), +('mall4cloud-group-order-916','1','1000','团购订单号'), +('mall4cloud-group-order-917','1','1000','团购订单号'), +('mall4cloud-group-order-918','1','1000','团购订单号'), +('mall4cloud-group-order-919','1','1000','团购订单号'), +('mall4cloud-group-order-920','1','1000','团购订单号'), +('mall4cloud-group-order-921','1','1000','团购订单号'), +('mall4cloud-group-order-922','1','1000','团购订单号'), +('mall4cloud-group-order-923','1','1000','团购订单号'), +('mall4cloud-group-order-924','1','1000','团购订单号'), +('mall4cloud-group-order-925','1','1000','团购订单号'), +('mall4cloud-group-order-926','1','1000','团购订单号'), +('mall4cloud-group-order-927','1','1000','团购订单号'), +('mall4cloud-group-order-928','1','1000','团购订单号'), +('mall4cloud-group-order-929','1','1000','团购订单号'), +('mall4cloud-group-order-930','1','1000','团购订单号'), +('mall4cloud-group-order-931','1','1000','团购订单号'), +('mall4cloud-group-order-932','1','1000','团购订单号'), +('mall4cloud-group-order-933','1','1000','团购订单号'), +('mall4cloud-group-order-934','1','1000','团购订单号'), +('mall4cloud-group-order-935','1','1000','团购订单号'), +('mall4cloud-group-order-936','1','1000','团购订单号'), +('mall4cloud-group-order-937','1','1000','团购订单号'), +('mall4cloud-group-order-938','1','1000','团购订单号'), +('mall4cloud-group-order-939','1','1000','团购订单号'), +('mall4cloud-group-order-940','1','1000','团购订单号'), +('mall4cloud-group-order-941','1','1000','团购订单号'), +('mall4cloud-group-order-942','1','1000','团购订单号'), +('mall4cloud-group-order-943','1','1000','团购订单号'), +('mall4cloud-group-order-944','1','1000','团购订单号'), +('mall4cloud-group-order-945','1','1000','团购订单号'), +('mall4cloud-group-order-946','1','1000','团购订单号'), +('mall4cloud-group-order-947','1','1000','团购订单号'), +('mall4cloud-group-order-948','1','1000','团购订单号'), +('mall4cloud-group-order-949','1','1000','团购订单号'), +('mall4cloud-group-order-950','1','1000','团购订单号'), +('mall4cloud-group-order-951','1','1000','团购订单号'), +('mall4cloud-group-order-952','1','1000','团购订单号'), +('mall4cloud-group-order-953','1','1000','团购订单号'), +('mall4cloud-group-order-954','1','1000','团购订单号'), +('mall4cloud-group-order-955','1','1000','团购订单号'), +('mall4cloud-group-order-956','1','1000','团购订单号'), +('mall4cloud-group-order-957','1','1000','团购订单号'), +('mall4cloud-group-order-958','1','1000','团购订单号'), +('mall4cloud-group-order-959','1','1000','团购订单号'), +('mall4cloud-group-order-960','1','1000','团购订单号'), +('mall4cloud-group-order-961','1','1000','团购订单号'), +('mall4cloud-group-order-962','1','1000','团购订单号'), +('mall4cloud-group-order-963','1','1000','团购订单号'), +('mall4cloud-group-order-964','1','1000','团购订单号'), +('mall4cloud-group-order-965','1','1000','团购订单号'), +('mall4cloud-group-order-966','1','1000','团购订单号'), +('mall4cloud-group-order-967','1','1000','团购订单号'), +('mall4cloud-group-order-968','1','1000','团购订单号'), +('mall4cloud-group-order-969','1','1000','团购订单号'), +('mall4cloud-group-order-970','1','1000','团购订单号'), +('mall4cloud-group-order-971','1','1000','团购订单号'), +('mall4cloud-group-order-972','1','1000','团购订单号'), +('mall4cloud-group-order-973','1','1000','团购订单号'), +('mall4cloud-group-order-974','1','1000','团购订单号'), +('mall4cloud-group-order-975','1','1000','团购订单号'), +('mall4cloud-group-order-976','1','1000','团购订单号'), +('mall4cloud-group-order-977','1','1000','团购订单号'), +('mall4cloud-group-order-978','1','1000','团购订单号'), +('mall4cloud-group-order-979','1','1000','团购订单号'), +('mall4cloud-group-order-980','1','1000','团购订单号'), +('mall4cloud-group-order-981','1','1000','团购订单号'), +('mall4cloud-group-order-982','1','1000','团购订单号'), +('mall4cloud-group-order-983','1','1000','团购订单号'), +('mall4cloud-group-order-984','1','1000','团购订单号'), +('mall4cloud-group-order-985','1','1000','团购订单号'), +('mall4cloud-group-order-986','1','1000','团购订单号'), +('mall4cloud-group-order-987','1','1000','团购订单号'), +('mall4cloud-group-order-988','1','1000','团购订单号'), +('mall4cloud-group-order-989','1','1000','团购订单号'), +('mall4cloud-group-order-990','1','1000','团购订单号'), +('mall4cloud-group-order-991','1','1000','团购订单号'), +('mall4cloud-group-order-992','1','1000','团购订单号'), +('mall4cloud-group-order-993','1','1000','团购订单号'), +('mall4cloud-group-order-994','1','1000','团购订单号'), +('mall4cloud-group-order-995','1','1000','团购订单号'), +('mall4cloud-group-order-996','1','1000','团购订单号'), +('mall4cloud-group-order-997','1','1000','团购订单号'), +('mall4cloud-group-order-998','1','1000','团购订单号'), +('mall4cloud-group-order-999','1','1000','团购订单号'), +('mall4cloud-refund-000','1','1000','退款id'), +('mall4cloud-refund-001','1','1000','退款id'), +('mall4cloud-refund-002','1','1000','退款id'), +('mall4cloud-refund-003','1','1000','退款id'), +('mall4cloud-refund-004','1','1000','退款id'), +('mall4cloud-refund-005','1','1000','退款id'), +('mall4cloud-refund-006','1','1000','退款id'), +('mall4cloud-refund-007','1','1000','退款id'), +('mall4cloud-refund-008','1','1000','退款id'), +('mall4cloud-refund-009','1','1000','退款id'), +('mall4cloud-refund-010','1','1000','退款id'), +('mall4cloud-refund-011','1','1000','退款id'), +('mall4cloud-refund-012','1','1000','退款id'), +('mall4cloud-refund-013','1','1000','退款id'), +('mall4cloud-refund-014','1','1000','退款id'), +('mall4cloud-refund-015','1','1000','退款id'), +('mall4cloud-refund-016','1','1000','退款id'), +('mall4cloud-refund-017','1','1000','退款id'), +('mall4cloud-refund-018','1','1000','退款id'), +('mall4cloud-refund-019','1','1000','退款id'), +('mall4cloud-refund-020','1','1000','退款id'), +('mall4cloud-refund-021','1','1000','退款id'), +('mall4cloud-refund-022','1','1000','退款id'), +('mall4cloud-refund-023','1','1000','退款id'), +('mall4cloud-refund-024','1','1000','退款id'), +('mall4cloud-refund-025','1','1000','退款id'), +('mall4cloud-refund-026','1','1000','退款id'), +('mall4cloud-refund-027','1','1000','退款id'), +('mall4cloud-refund-028','1','1000','退款id'), +('mall4cloud-refund-029','1','1000','退款id'), +('mall4cloud-refund-030','1','1000','退款id'), +('mall4cloud-refund-031','1','1000','退款id'), +('mall4cloud-refund-032','1','1000','退款id'), +('mall4cloud-refund-033','1','1000','退款id'), +('mall4cloud-refund-034','1','1000','退款id'), +('mall4cloud-refund-035','1','1000','退款id'), +('mall4cloud-refund-036','1','1000','退款id'), +('mall4cloud-refund-037','1','1000','退款id'), +('mall4cloud-refund-038','1','1000','退款id'), +('mall4cloud-refund-039','1','1000','退款id'), +('mall4cloud-refund-040','1','1000','退款id'), +('mall4cloud-refund-041','1','1000','退款id'), +('mall4cloud-refund-042','1','1000','退款id'), +('mall4cloud-refund-043','1','1000','退款id'), +('mall4cloud-refund-044','1','1000','退款id'), +('mall4cloud-refund-045','1','1000','退款id'), +('mall4cloud-refund-046','1','1000','退款id'), +('mall4cloud-refund-047','1','1000','退款id'), +('mall4cloud-refund-048','1','1000','退款id'), +('mall4cloud-refund-049','1','1000','退款id'), +('mall4cloud-refund-050','1','1000','退款id'), +('mall4cloud-refund-051','1','1000','退款id'), +('mall4cloud-refund-052','1','1000','退款id'), +('mall4cloud-refund-053','1','1000','退款id'), +('mall4cloud-refund-054','1','1000','退款id'), +('mall4cloud-refund-055','1','1000','退款id'), +('mall4cloud-refund-056','1','1000','退款id'), +('mall4cloud-refund-057','1','1000','退款id'), +('mall4cloud-refund-058','1','1000','退款id'), +('mall4cloud-refund-059','1','1000','退款id'), +('mall4cloud-refund-060','1','1000','退款id'), +('mall4cloud-refund-061','1','1000','退款id'), +('mall4cloud-refund-062','1','1000','退款id'), +('mall4cloud-refund-063','1','1000','退款id'), +('mall4cloud-refund-064','1','1000','退款id'), +('mall4cloud-refund-065','1','1000','退款id'), +('mall4cloud-refund-066','1','1000','退款id'), +('mall4cloud-refund-067','1','1000','退款id'), +('mall4cloud-refund-068','1','1000','退款id'), +('mall4cloud-refund-069','1','1000','退款id'), +('mall4cloud-refund-070','1','1000','退款id'), +('mall4cloud-refund-071','1','1000','退款id'), +('mall4cloud-refund-072','1','1000','退款id'), +('mall4cloud-refund-073','1','1000','退款id'), +('mall4cloud-refund-074','1','1000','退款id'), +('mall4cloud-refund-075','1','1000','退款id'), +('mall4cloud-refund-076','1','1000','退款id'), +('mall4cloud-refund-077','1','1000','退款id'), +('mall4cloud-refund-078','1','1000','退款id'), +('mall4cloud-refund-079','1','1000','退款id'), +('mall4cloud-refund-080','1','1000','退款id'), +('mall4cloud-refund-081','1','1000','退款id'), +('mall4cloud-refund-082','1','1000','退款id'), +('mall4cloud-refund-083','1','1000','退款id'), +('mall4cloud-refund-084','1','1000','退款id'), +('mall4cloud-refund-085','1','1000','退款id'), +('mall4cloud-refund-086','1','1000','退款id'), +('mall4cloud-refund-087','1','1000','退款id'), +('mall4cloud-refund-088','1','1000','退款id'), +('mall4cloud-refund-089','1','1000','退款id'), +('mall4cloud-refund-090','1','1000','退款id'), +('mall4cloud-refund-091','1','1000','退款id'), +('mall4cloud-refund-092','1','1000','退款id'), +('mall4cloud-refund-093','1','1000','退款id'), +('mall4cloud-refund-094','1','1000','退款id'), +('mall4cloud-refund-095','1','1000','退款id'), +('mall4cloud-refund-096','1','1000','退款id'), +('mall4cloud-refund-097','1','1000','退款id'), +('mall4cloud-refund-098','1','1000','退款id'), +('mall4cloud-refund-099','1','1000','退款id'), +('mall4cloud-refund-100','1','1000','退款id'), +('mall4cloud-refund-101','1','1000','退款id'), +('mall4cloud-refund-102','1','1000','退款id'), +('mall4cloud-refund-103','1','1000','退款id'), +('mall4cloud-refund-104','1','1000','退款id'), +('mall4cloud-refund-105','1','1000','退款id'), +('mall4cloud-refund-106','1','1000','退款id'), +('mall4cloud-refund-107','1','1000','退款id'), +('mall4cloud-refund-108','1','1000','退款id'), +('mall4cloud-refund-109','1','1000','退款id'), +('mall4cloud-refund-110','1','1000','退款id'), +('mall4cloud-refund-111','1','1000','退款id'), +('mall4cloud-refund-112','1','1000','退款id'), +('mall4cloud-refund-113','1','1000','退款id'), +('mall4cloud-refund-114','1','1000','退款id'), +('mall4cloud-refund-115','1','1000','退款id'), +('mall4cloud-refund-116','1','1000','退款id'), +('mall4cloud-refund-117','1','1000','退款id'), +('mall4cloud-refund-118','1','1000','退款id'), +('mall4cloud-refund-119','1','1000','退款id'), +('mall4cloud-refund-120','1','1000','退款id'), +('mall4cloud-refund-121','1','1000','退款id'), +('mall4cloud-refund-122','1','1000','退款id'), +('mall4cloud-refund-123','1','1000','退款id'), +('mall4cloud-refund-124','1','1000','退款id'), +('mall4cloud-refund-125','1','1000','退款id'), +('mall4cloud-refund-126','1','1000','退款id'), +('mall4cloud-refund-127','1','1000','退款id'), +('mall4cloud-refund-128','1','1000','退款id'), +('mall4cloud-refund-129','1','1000','退款id'), +('mall4cloud-refund-130','1','1000','退款id'), +('mall4cloud-refund-131','1','1000','退款id'), +('mall4cloud-refund-132','1','1000','退款id'), +('mall4cloud-refund-133','1','1000','退款id'), +('mall4cloud-refund-134','1','1000','退款id'), +('mall4cloud-refund-135','1','1000','退款id'), +('mall4cloud-refund-136','1','1000','退款id'), +('mall4cloud-refund-137','1','1000','退款id'), +('mall4cloud-refund-138','1','1000','退款id'), +('mall4cloud-refund-139','1','1000','退款id'), +('mall4cloud-refund-140','1','1000','退款id'), +('mall4cloud-refund-141','1','1000','退款id'), +('mall4cloud-refund-142','1','1000','退款id'), +('mall4cloud-refund-143','1','1000','退款id'), +('mall4cloud-refund-144','1','1000','退款id'), +('mall4cloud-refund-145','1','1000','退款id'), +('mall4cloud-refund-146','1','1000','退款id'), +('mall4cloud-refund-147','1','1000','退款id'), +('mall4cloud-refund-148','1','1000','退款id'), +('mall4cloud-refund-149','1','1000','退款id'), +('mall4cloud-refund-150','1','1000','退款id'), +('mall4cloud-refund-151','1','1000','退款id'), +('mall4cloud-refund-152','1','1000','退款id'), +('mall4cloud-refund-153','1','1000','退款id'), +('mall4cloud-refund-154','1','1000','退款id'), +('mall4cloud-refund-155','1','1000','退款id'), +('mall4cloud-refund-156','1','1000','退款id'), +('mall4cloud-refund-157','1','1000','退款id'), +('mall4cloud-refund-158','1','1000','退款id'), +('mall4cloud-refund-159','1','1000','退款id'), +('mall4cloud-refund-160','1','1000','退款id'), +('mall4cloud-refund-161','1','1000','退款id'), +('mall4cloud-refund-162','1','1000','退款id'), +('mall4cloud-refund-163','1','1000','退款id'), +('mall4cloud-refund-164','1','1000','退款id'), +('mall4cloud-refund-165','1','1000','退款id'), +('mall4cloud-refund-166','1','1000','退款id'), +('mall4cloud-refund-167','1','1000','退款id'), +('mall4cloud-refund-168','1','1000','退款id'), +('mall4cloud-refund-169','1','1000','退款id'), +('mall4cloud-refund-170','1','1000','退款id'), +('mall4cloud-refund-171','1','1000','退款id'), +('mall4cloud-refund-172','1','1000','退款id'), +('mall4cloud-refund-173','1','1000','退款id'), +('mall4cloud-refund-174','1','1000','退款id'), +('mall4cloud-refund-175','1','1000','退款id'), +('mall4cloud-refund-176','1','1000','退款id'), +('mall4cloud-refund-177','1','1000','退款id'), +('mall4cloud-refund-178','1','1000','退款id'), +('mall4cloud-refund-179','1','1000','退款id'), +('mall4cloud-refund-180','1','1000','退款id'), +('mall4cloud-refund-181','1','1000','退款id'), +('mall4cloud-refund-182','1','1000','退款id'), +('mall4cloud-refund-183','1','1000','退款id'), +('mall4cloud-refund-184','1','1000','退款id'), +('mall4cloud-refund-185','1','1000','退款id'), +('mall4cloud-refund-186','1','1000','退款id'), +('mall4cloud-refund-187','1','1000','退款id'), +('mall4cloud-refund-188','1','1000','退款id'), +('mall4cloud-refund-189','1','1000','退款id'), +('mall4cloud-refund-190','1','1000','退款id'), +('mall4cloud-refund-191','1','1000','退款id'), +('mall4cloud-refund-192','1','1000','退款id'), +('mall4cloud-refund-193','1','1000','退款id'), +('mall4cloud-refund-194','1','1000','退款id'), +('mall4cloud-refund-195','1','1000','退款id'), +('mall4cloud-refund-196','1','1000','退款id'), +('mall4cloud-refund-197','1','1000','退款id'), +('mall4cloud-refund-198','1','1000','退款id'), +('mall4cloud-refund-199','1','1000','退款id'), +('mall4cloud-refund-200','1','1000','退款id'), +('mall4cloud-refund-201','1','1000','退款id'), +('mall4cloud-refund-202','1','1000','退款id'), +('mall4cloud-refund-203','1','1000','退款id'), +('mall4cloud-refund-204','1','1000','退款id'), +('mall4cloud-refund-205','1','1000','退款id'), +('mall4cloud-refund-206','1','1000','退款id'), +('mall4cloud-refund-207','1','1000','退款id'), +('mall4cloud-refund-208','1','1000','退款id'), +('mall4cloud-refund-209','1','1000','退款id'), +('mall4cloud-refund-210','1','1000','退款id'), +('mall4cloud-refund-211','1','1000','退款id'), +('mall4cloud-refund-212','1','1000','退款id'), +('mall4cloud-refund-213','1','1000','退款id'), +('mall4cloud-refund-214','1','1000','退款id'), +('mall4cloud-refund-215','1','1000','退款id'), +('mall4cloud-refund-216','1','1000','退款id'), +('mall4cloud-refund-217','1','1000','退款id'), +('mall4cloud-refund-218','1','1000','退款id'), +('mall4cloud-refund-219','1','1000','退款id'), +('mall4cloud-refund-220','1','1000','退款id'), +('mall4cloud-refund-221','1','1000','退款id'), +('mall4cloud-refund-222','1','1000','退款id'), +('mall4cloud-refund-223','1','1000','退款id'), +('mall4cloud-refund-224','1','1000','退款id'), +('mall4cloud-refund-225','1','1000','退款id'), +('mall4cloud-refund-226','1','1000','退款id'), +('mall4cloud-refund-227','1','1000','退款id'), +('mall4cloud-refund-228','1','1000','退款id'), +('mall4cloud-refund-229','1','1000','退款id'), +('mall4cloud-refund-230','1','1000','退款id'), +('mall4cloud-refund-231','1','1000','退款id'), +('mall4cloud-refund-232','1','1000','退款id'), +('mall4cloud-refund-233','1','1000','退款id'), +('mall4cloud-refund-234','1','1000','退款id'), +('mall4cloud-refund-235','1','1000','退款id'), +('mall4cloud-refund-236','1','1000','退款id'), +('mall4cloud-refund-237','1','1000','退款id'), +('mall4cloud-refund-238','1','1000','退款id'), +('mall4cloud-refund-239','1','1000','退款id'), +('mall4cloud-refund-240','1','1000','退款id'), +('mall4cloud-refund-241','1','1000','退款id'), +('mall4cloud-refund-242','1','1000','退款id'), +('mall4cloud-refund-243','1','1000','退款id'), +('mall4cloud-refund-244','1','1000','退款id'), +('mall4cloud-refund-245','1','1000','退款id'), +('mall4cloud-refund-246','1','1000','退款id'), +('mall4cloud-refund-247','1','1000','退款id'), +('mall4cloud-refund-248','1','1000','退款id'), +('mall4cloud-refund-249','1','1000','退款id'), +('mall4cloud-refund-250','1','1000','退款id'), +('mall4cloud-refund-251','1','1000','退款id'), +('mall4cloud-refund-252','1','1000','退款id'), +('mall4cloud-refund-253','1','1000','退款id'), +('mall4cloud-refund-254','1','1000','退款id'), +('mall4cloud-refund-255','1','1000','退款id'), +('mall4cloud-refund-256','1','1000','退款id'), +('mall4cloud-refund-257','1','1000','退款id'), +('mall4cloud-refund-258','1','1000','退款id'), +('mall4cloud-refund-259','1','1000','退款id'), +('mall4cloud-refund-260','1','1000','退款id'), +('mall4cloud-refund-261','1','1000','退款id'), +('mall4cloud-refund-262','1','1000','退款id'), +('mall4cloud-refund-263','1','1000','退款id'), +('mall4cloud-refund-264','1','1000','退款id'), +('mall4cloud-refund-265','1','1000','退款id'), +('mall4cloud-refund-266','1','1000','退款id'), +('mall4cloud-refund-267','1','1000','退款id'), +('mall4cloud-refund-268','1','1000','退款id'), +('mall4cloud-refund-269','1','1000','退款id'), +('mall4cloud-refund-270','1','1000','退款id'), +('mall4cloud-refund-271','1','1000','退款id'), +('mall4cloud-refund-272','1','1000','退款id'), +('mall4cloud-refund-273','1','1000','退款id'), +('mall4cloud-refund-274','1','1000','退款id'), +('mall4cloud-refund-275','1','1000','退款id'), +('mall4cloud-refund-276','1','1000','退款id'), +('mall4cloud-refund-277','1','1000','退款id'), +('mall4cloud-refund-278','1','1000','退款id'), +('mall4cloud-refund-279','1','1000','退款id'), +('mall4cloud-refund-280','1','1000','退款id'), +('mall4cloud-refund-281','1','1000','退款id'), +('mall4cloud-refund-282','1','1000','退款id'), +('mall4cloud-refund-283','1','1000','退款id'), +('mall4cloud-refund-284','1','1000','退款id'), +('mall4cloud-refund-285','1','1000','退款id'), +('mall4cloud-refund-286','1','1000','退款id'), +('mall4cloud-refund-287','1','1000','退款id'), +('mall4cloud-refund-288','1','1000','退款id'), +('mall4cloud-refund-289','1','1000','退款id'), +('mall4cloud-refund-290','1','1000','退款id'), +('mall4cloud-refund-291','1','1000','退款id'), +('mall4cloud-refund-292','1','1000','退款id'), +('mall4cloud-refund-293','1','1000','退款id'), +('mall4cloud-refund-294','1','1000','退款id'), +('mall4cloud-refund-295','1','1000','退款id'), +('mall4cloud-refund-296','1','1000','退款id'), +('mall4cloud-refund-297','1','1000','退款id'), +('mall4cloud-refund-298','1','1000','退款id'), +('mall4cloud-refund-299','1','1000','退款id'), +('mall4cloud-refund-300','1','1000','退款id'), +('mall4cloud-refund-301','1','1000','退款id'), +('mall4cloud-refund-302','1','1000','退款id'), +('mall4cloud-refund-303','1','1000','退款id'), +('mall4cloud-refund-304','1','1000','退款id'), +('mall4cloud-refund-305','1','1000','退款id'), +('mall4cloud-refund-306','1','1000','退款id'), +('mall4cloud-refund-307','1','1000','退款id'), +('mall4cloud-refund-308','1','1000','退款id'), +('mall4cloud-refund-309','1','1000','退款id'), +('mall4cloud-refund-310','1','1000','退款id'), +('mall4cloud-refund-311','1','1000','退款id'), +('mall4cloud-refund-312','1','1000','退款id'), +('mall4cloud-refund-313','1','1000','退款id'), +('mall4cloud-refund-314','1','1000','退款id'), +('mall4cloud-refund-315','1','1000','退款id'), +('mall4cloud-refund-316','1','1000','退款id'), +('mall4cloud-refund-317','1','1000','退款id'), +('mall4cloud-refund-318','1','1000','退款id'), +('mall4cloud-refund-319','1','1000','退款id'), +('mall4cloud-refund-320','1','1000','退款id'), +('mall4cloud-refund-321','1','1000','退款id'), +('mall4cloud-refund-322','1','1000','退款id'), +('mall4cloud-refund-323','1','1000','退款id'), +('mall4cloud-refund-324','1','1000','退款id'), +('mall4cloud-refund-325','1','1000','退款id'), +('mall4cloud-refund-326','1','1000','退款id'), +('mall4cloud-refund-327','1','1000','退款id'), +('mall4cloud-refund-328','1','1000','退款id'), +('mall4cloud-refund-329','1','1000','退款id'), +('mall4cloud-refund-330','1','1000','退款id'), +('mall4cloud-refund-331','1','1000','退款id'), +('mall4cloud-refund-332','1','1000','退款id'), +('mall4cloud-refund-333','1','1000','退款id'), +('mall4cloud-refund-334','1','1000','退款id'), +('mall4cloud-refund-335','1','1000','退款id'), +('mall4cloud-refund-336','1','1000','退款id'), +('mall4cloud-refund-337','1','1000','退款id'), +('mall4cloud-refund-338','1','1000','退款id'), +('mall4cloud-refund-339','1','1000','退款id'), +('mall4cloud-refund-340','1','1000','退款id'), +('mall4cloud-refund-341','1','1000','退款id'), +('mall4cloud-refund-342','1','1000','退款id'), +('mall4cloud-refund-343','1','1000','退款id'), +('mall4cloud-refund-344','1','1000','退款id'), +('mall4cloud-refund-345','1','1000','退款id'), +('mall4cloud-refund-346','1','1000','退款id'), +('mall4cloud-refund-347','1','1000','退款id'), +('mall4cloud-refund-348','1','1000','退款id'), +('mall4cloud-refund-349','1','1000','退款id'), +('mall4cloud-refund-350','1','1000','退款id'), +('mall4cloud-refund-351','1','1000','退款id'), +('mall4cloud-refund-352','1','1000','退款id'), +('mall4cloud-refund-353','1','1000','退款id'), +('mall4cloud-refund-354','1','1000','退款id'), +('mall4cloud-refund-355','1','1000','退款id'), +('mall4cloud-refund-356','1','1000','退款id'), +('mall4cloud-refund-357','1','1000','退款id'), +('mall4cloud-refund-358','1','1000','退款id'), +('mall4cloud-refund-359','1','1000','退款id'), +('mall4cloud-refund-360','1','1000','退款id'), +('mall4cloud-refund-361','1','1000','退款id'), +('mall4cloud-refund-362','1','1000','退款id'), +('mall4cloud-refund-363','1','1000','退款id'), +('mall4cloud-refund-364','1','1000','退款id'), +('mall4cloud-refund-365','1','1000','退款id'), +('mall4cloud-refund-366','1','1000','退款id'), +('mall4cloud-refund-367','1','1000','退款id'), +('mall4cloud-refund-368','1','1000','退款id'), +('mall4cloud-refund-369','1','1000','退款id'), +('mall4cloud-refund-370','1','1000','退款id'), +('mall4cloud-refund-371','1','1000','退款id'), +('mall4cloud-refund-372','1','1000','退款id'), +('mall4cloud-refund-373','1','1000','退款id'), +('mall4cloud-refund-374','1','1000','退款id'), +('mall4cloud-refund-375','1','1000','退款id'), +('mall4cloud-refund-376','1','1000','退款id'), +('mall4cloud-refund-377','1','1000','退款id'), +('mall4cloud-refund-378','1','1000','退款id'), +('mall4cloud-refund-379','1','1000','退款id'), +('mall4cloud-refund-380','1','1000','退款id'), +('mall4cloud-refund-381','1','1000','退款id'), +('mall4cloud-refund-382','1','1000','退款id'), +('mall4cloud-refund-383','1','1000','退款id'), +('mall4cloud-refund-384','1','1000','退款id'), +('mall4cloud-refund-385','1','1000','退款id'), +('mall4cloud-refund-386','1','1000','退款id'), +('mall4cloud-refund-387','1','1000','退款id'), +('mall4cloud-refund-388','1','1000','退款id'), +('mall4cloud-refund-389','1','1000','退款id'), +('mall4cloud-refund-390','1','1000','退款id'), +('mall4cloud-refund-391','1','1000','退款id'), +('mall4cloud-refund-392','1','1000','退款id'), +('mall4cloud-refund-393','1','1000','退款id'), +('mall4cloud-refund-394','1','1000','退款id'), +('mall4cloud-refund-395','1','1000','退款id'), +('mall4cloud-refund-396','1','1000','退款id'), +('mall4cloud-refund-397','1','1000','退款id'), +('mall4cloud-refund-398','1','1000','退款id'), +('mall4cloud-refund-399','1','1000','退款id'), +('mall4cloud-refund-400','1','1000','退款id'), +('mall4cloud-refund-401','1','1000','退款id'), +('mall4cloud-refund-402','1','1000','退款id'), +('mall4cloud-refund-403','1','1000','退款id'), +('mall4cloud-refund-404','1','1000','退款id'), +('mall4cloud-refund-405','1','1000','退款id'), +('mall4cloud-refund-406','1','1000','退款id'), +('mall4cloud-refund-407','1','1000','退款id'), +('mall4cloud-refund-408','1','1000','退款id'), +('mall4cloud-refund-409','1','1000','退款id'), +('mall4cloud-refund-410','1','1000','退款id'), +('mall4cloud-refund-411','1','1000','退款id'), +('mall4cloud-refund-412','1','1000','退款id'), +('mall4cloud-refund-413','1','1000','退款id'), +('mall4cloud-refund-414','1','1000','退款id'), +('mall4cloud-refund-415','1','1000','退款id'), +('mall4cloud-refund-416','1','1000','退款id'), +('mall4cloud-refund-417','1','1000','退款id'), +('mall4cloud-refund-418','1','1000','退款id'), +('mall4cloud-refund-419','1','1000','退款id'), +('mall4cloud-refund-420','1','1000','退款id'), +('mall4cloud-refund-421','1','1000','退款id'), +('mall4cloud-refund-422','1','1000','退款id'), +('mall4cloud-refund-423','1','1000','退款id'), +('mall4cloud-refund-424','1','1000','退款id'), +('mall4cloud-refund-425','1','1000','退款id'), +('mall4cloud-refund-426','1','1000','退款id'), +('mall4cloud-refund-427','1','1000','退款id'), +('mall4cloud-refund-428','1','1000','退款id'), +('mall4cloud-refund-429','1','1000','退款id'), +('mall4cloud-refund-430','1','1000','退款id'), +('mall4cloud-refund-431','1','1000','退款id'), +('mall4cloud-refund-432','1','1000','退款id'), +('mall4cloud-refund-433','1','1000','退款id'), +('mall4cloud-refund-434','1','1000','退款id'), +('mall4cloud-refund-435','1','1000','退款id'), +('mall4cloud-refund-436','1','1000','退款id'), +('mall4cloud-refund-437','1','1000','退款id'), +('mall4cloud-refund-438','1','1000','退款id'), +('mall4cloud-refund-439','1','1000','退款id'), +('mall4cloud-refund-440','1','1000','退款id'), +('mall4cloud-refund-441','1','1000','退款id'), +('mall4cloud-refund-442','1','1000','退款id'), +('mall4cloud-refund-443','1','1000','退款id'), +('mall4cloud-refund-444','1','1000','退款id'), +('mall4cloud-refund-445','1','1000','退款id'), +('mall4cloud-refund-446','1','1000','退款id'), +('mall4cloud-refund-447','1','1000','退款id'), +('mall4cloud-refund-448','1','1000','退款id'), +('mall4cloud-refund-449','1','1000','退款id'), +('mall4cloud-refund-450','1','1000','退款id'), +('mall4cloud-refund-451','1','1000','退款id'), +('mall4cloud-refund-452','1','1000','退款id'), +('mall4cloud-refund-453','1','1000','退款id'), +('mall4cloud-refund-454','1','1000','退款id'), +('mall4cloud-refund-455','1','1000','退款id'), +('mall4cloud-refund-456','1','1000','退款id'), +('mall4cloud-refund-457','1','1000','退款id'), +('mall4cloud-refund-458','1','1000','退款id'), +('mall4cloud-refund-459','1','1000','退款id'), +('mall4cloud-refund-460','1','1000','退款id'), +('mall4cloud-refund-461','1','1000','退款id'), +('mall4cloud-refund-462','1','1000','退款id'), +('mall4cloud-refund-463','1','1000','退款id'), +('mall4cloud-refund-464','1','1000','退款id'), +('mall4cloud-refund-465','1','1000','退款id'), +('mall4cloud-refund-466','1','1000','退款id'), +('mall4cloud-refund-467','1','1000','退款id'), +('mall4cloud-refund-468','1','1000','退款id'), +('mall4cloud-refund-469','1','1000','退款id'), +('mall4cloud-refund-470','1','1000','退款id'), +('mall4cloud-refund-471','1','1000','退款id'), +('mall4cloud-refund-472','1','1000','退款id'), +('mall4cloud-refund-473','1','1000','退款id'), +('mall4cloud-refund-474','1','1000','退款id'), +('mall4cloud-refund-475','1','1000','退款id'), +('mall4cloud-refund-476','1','1000','退款id'), +('mall4cloud-refund-477','1','1000','退款id'), +('mall4cloud-refund-478','1','1000','退款id'), +('mall4cloud-refund-479','1','1000','退款id'), +('mall4cloud-refund-480','1','1000','退款id'), +('mall4cloud-refund-481','1','1000','退款id'), +('mall4cloud-refund-482','1','1000','退款id'), +('mall4cloud-refund-483','1','1000','退款id'), +('mall4cloud-refund-484','1','1000','退款id'), +('mall4cloud-refund-485','1','1000','退款id'), +('mall4cloud-refund-486','1','1000','退款id'), +('mall4cloud-refund-487','1','1000','退款id'), +('mall4cloud-refund-488','1','1000','退款id'), +('mall4cloud-refund-489','1','1000','退款id'), +('mall4cloud-refund-490','1','1000','退款id'), +('mall4cloud-refund-491','1','1000','退款id'), +('mall4cloud-refund-492','1','1000','退款id'), +('mall4cloud-refund-493','1','1000','退款id'), +('mall4cloud-refund-494','1','1000','退款id'), +('mall4cloud-refund-495','1','1000','退款id'), +('mall4cloud-refund-496','1','1000','退款id'), +('mall4cloud-refund-497','1','1000','退款id'), +('mall4cloud-refund-498','1','1000','退款id'), +('mall4cloud-refund-499','1','1000','退款id'), +('mall4cloud-refund-500','1','1000','退款id'), +('mall4cloud-refund-501','1','1000','退款id'), +('mall4cloud-refund-502','1','1000','退款id'), +('mall4cloud-refund-503','1','1000','退款id'), +('mall4cloud-refund-504','1','1000','退款id'), +('mall4cloud-refund-505','1','1000','退款id'), +('mall4cloud-refund-506','1','1000','退款id'), +('mall4cloud-refund-507','1','1000','退款id'), +('mall4cloud-refund-508','1','1000','退款id'), +('mall4cloud-refund-509','1','1000','退款id'), +('mall4cloud-refund-510','1','1000','退款id'), +('mall4cloud-refund-511','1','1000','退款id'), +('mall4cloud-refund-512','1','1000','退款id'), +('mall4cloud-refund-513','1','1000','退款id'), +('mall4cloud-refund-514','1','1000','退款id'), +('mall4cloud-refund-515','1','1000','退款id'), +('mall4cloud-refund-516','1','1000','退款id'), +('mall4cloud-refund-517','1','1000','退款id'), +('mall4cloud-refund-518','1','1000','退款id'), +('mall4cloud-refund-519','1','1000','退款id'), +('mall4cloud-refund-520','1','1000','退款id'), +('mall4cloud-refund-521','1','1000','退款id'), +('mall4cloud-refund-522','1','1000','退款id'), +('mall4cloud-refund-523','1','1000','退款id'), +('mall4cloud-refund-524','1','1000','退款id'), +('mall4cloud-refund-525','1','1000','退款id'), +('mall4cloud-refund-526','1','1000','退款id'), +('mall4cloud-refund-527','1','1000','退款id'), +('mall4cloud-refund-528','1','1000','退款id'), +('mall4cloud-refund-529','1','1000','退款id'), +('mall4cloud-refund-530','1','1000','退款id'), +('mall4cloud-refund-531','1','1000','退款id'), +('mall4cloud-refund-532','1','1000','退款id'), +('mall4cloud-refund-533','1','1000','退款id'), +('mall4cloud-refund-534','1','1000','退款id'), +('mall4cloud-refund-535','1','1000','退款id'), +('mall4cloud-refund-536','1','1000','退款id'), +('mall4cloud-refund-537','1','1000','退款id'), +('mall4cloud-refund-538','1','1000','退款id'), +('mall4cloud-refund-539','1','1000','退款id'), +('mall4cloud-refund-540','1','1000','退款id'), +('mall4cloud-refund-541','1','1000','退款id'), +('mall4cloud-refund-542','1','1000','退款id'), +('mall4cloud-refund-543','1','1000','退款id'), +('mall4cloud-refund-544','1','1000','退款id'), +('mall4cloud-refund-545','1','1000','退款id'), +('mall4cloud-refund-546','1','1000','退款id'), +('mall4cloud-refund-547','1','1000','退款id'), +('mall4cloud-refund-548','1','1000','退款id'), +('mall4cloud-refund-549','1','1000','退款id'), +('mall4cloud-refund-550','1','1000','退款id'), +('mall4cloud-refund-551','1','1000','退款id'), +('mall4cloud-refund-552','1','1000','退款id'), +('mall4cloud-refund-553','1','1000','退款id'), +('mall4cloud-refund-554','1','1000','退款id'), +('mall4cloud-refund-555','1','1000','退款id'), +('mall4cloud-refund-556','1','1000','退款id'), +('mall4cloud-refund-557','1','1000','退款id'), +('mall4cloud-refund-558','1','1000','退款id'), +('mall4cloud-refund-559','1','1000','退款id'), +('mall4cloud-refund-560','1','1000','退款id'), +('mall4cloud-refund-561','1','1000','退款id'), +('mall4cloud-refund-562','1','1000','退款id'), +('mall4cloud-refund-563','1','1000','退款id'), +('mall4cloud-refund-564','1','1000','退款id'), +('mall4cloud-refund-565','1','1000','退款id'), +('mall4cloud-refund-566','1','1000','退款id'), +('mall4cloud-refund-567','1','1000','退款id'), +('mall4cloud-refund-568','1','1000','退款id'), +('mall4cloud-refund-569','1','1000','退款id'), +('mall4cloud-refund-570','1','1000','退款id'), +('mall4cloud-refund-571','1','1000','退款id'), +('mall4cloud-refund-572','1','1000','退款id'), +('mall4cloud-refund-573','1','1000','退款id'), +('mall4cloud-refund-574','1','1000','退款id'), +('mall4cloud-refund-575','1','1000','退款id'), +('mall4cloud-refund-576','1','1000','退款id'), +('mall4cloud-refund-577','1','1000','退款id'), +('mall4cloud-refund-578','1','1000','退款id'), +('mall4cloud-refund-579','1','1000','退款id'), +('mall4cloud-refund-580','1','1000','退款id'), +('mall4cloud-refund-581','1','1000','退款id'), +('mall4cloud-refund-582','1','1000','退款id'), +('mall4cloud-refund-583','1','1000','退款id'), +('mall4cloud-refund-584','1','1000','退款id'), +('mall4cloud-refund-585','1','1000','退款id'), +('mall4cloud-refund-586','1','1000','退款id'), +('mall4cloud-refund-587','1','1000','退款id'), +('mall4cloud-refund-588','1','1000','退款id'), +('mall4cloud-refund-589','1','1000','退款id'), +('mall4cloud-refund-590','1','1000','退款id'), +('mall4cloud-refund-591','1','1000','退款id'), +('mall4cloud-refund-592','1','1000','退款id'), +('mall4cloud-refund-593','1','1000','退款id'), +('mall4cloud-refund-594','1','1000','退款id'), +('mall4cloud-refund-595','1','1000','退款id'), +('mall4cloud-refund-596','1','1000','退款id'), +('mall4cloud-refund-597','1','1000','退款id'), +('mall4cloud-refund-598','1','1000','退款id'), +('mall4cloud-refund-599','1','1000','退款id'), +('mall4cloud-refund-600','1','1000','退款id'), +('mall4cloud-refund-601','1','1000','退款id'), +('mall4cloud-refund-602','1','1000','退款id'), +('mall4cloud-refund-603','1','1000','退款id'), +('mall4cloud-refund-604','1','1000','退款id'), +('mall4cloud-refund-605','1','1000','退款id'), +('mall4cloud-refund-606','1','1000','退款id'), +('mall4cloud-refund-607','1','1000','退款id'), +('mall4cloud-refund-608','1','1000','退款id'), +('mall4cloud-refund-609','1','1000','退款id'), +('mall4cloud-refund-610','1','1000','退款id'), +('mall4cloud-refund-611','1','1000','退款id'), +('mall4cloud-refund-612','1','1000','退款id'), +('mall4cloud-refund-613','1','1000','退款id'), +('mall4cloud-refund-614','1','1000','退款id'), +('mall4cloud-refund-615','1','1000','退款id'), +('mall4cloud-refund-616','1','1000','退款id'), +('mall4cloud-refund-617','1','1000','退款id'), +('mall4cloud-refund-618','1','1000','退款id'), +('mall4cloud-refund-619','1','1000','退款id'), +('mall4cloud-refund-620','1','1000','退款id'), +('mall4cloud-refund-621','1','1000','退款id'), +('mall4cloud-refund-622','1','1000','退款id'), +('mall4cloud-refund-623','1','1000','退款id'), +('mall4cloud-refund-624','1','1000','退款id'), +('mall4cloud-refund-625','1','1000','退款id'), +('mall4cloud-refund-626','1','1000','退款id'), +('mall4cloud-refund-627','1','1000','退款id'), +('mall4cloud-refund-628','1','1000','退款id'), +('mall4cloud-refund-629','1','1000','退款id'), +('mall4cloud-refund-630','1','1000','退款id'), +('mall4cloud-refund-631','1','1000','退款id'), +('mall4cloud-refund-632','1','1000','退款id'), +('mall4cloud-refund-633','1','1000','退款id'), +('mall4cloud-refund-634','1','1000','退款id'), +('mall4cloud-refund-635','1','1000','退款id'), +('mall4cloud-refund-636','1','1000','退款id'), +('mall4cloud-refund-637','1','1000','退款id'), +('mall4cloud-refund-638','1','1000','退款id'), +('mall4cloud-refund-639','1','1000','退款id'), +('mall4cloud-refund-640','1','1000','退款id'), +('mall4cloud-refund-641','1','1000','退款id'), +('mall4cloud-refund-642','1','1000','退款id'), +('mall4cloud-refund-643','1','1000','退款id'), +('mall4cloud-refund-644','1','1000','退款id'), +('mall4cloud-refund-645','1','1000','退款id'), +('mall4cloud-refund-646','1','1000','退款id'), +('mall4cloud-refund-647','1','1000','退款id'), +('mall4cloud-refund-648','1','1000','退款id'), +('mall4cloud-refund-649','1','1000','退款id'), +('mall4cloud-refund-650','1','1000','退款id'), +('mall4cloud-refund-651','1','1000','退款id'), +('mall4cloud-refund-652','1','1000','退款id'), +('mall4cloud-refund-653','1','1000','退款id'), +('mall4cloud-refund-654','1','1000','退款id'), +('mall4cloud-refund-655','1','1000','退款id'), +('mall4cloud-refund-656','1','1000','退款id'), +('mall4cloud-refund-657','1','1000','退款id'), +('mall4cloud-refund-658','1','1000','退款id'), +('mall4cloud-refund-659','1','1000','退款id'), +('mall4cloud-refund-660','1','1000','退款id'), +('mall4cloud-refund-661','1','1000','退款id'), +('mall4cloud-refund-662','1','1000','退款id'), +('mall4cloud-refund-663','1','1000','退款id'), +('mall4cloud-refund-664','1','1000','退款id'), +('mall4cloud-refund-665','1','1000','退款id'), +('mall4cloud-refund-666','1','1000','退款id'), +('mall4cloud-refund-667','1','1000','退款id'), +('mall4cloud-refund-668','1','1000','退款id'), +('mall4cloud-refund-669','1','1000','退款id'), +('mall4cloud-refund-670','1','1000','退款id'), +('mall4cloud-refund-671','1','1000','退款id'), +('mall4cloud-refund-672','1','1000','退款id'), +('mall4cloud-refund-673','1','1000','退款id'), +('mall4cloud-refund-674','1','1000','退款id'), +('mall4cloud-refund-675','1','1000','退款id'), +('mall4cloud-refund-676','1','1000','退款id'), +('mall4cloud-refund-677','1','1000','退款id'), +('mall4cloud-refund-678','1','1000','退款id'), +('mall4cloud-refund-679','1','1000','退款id'), +('mall4cloud-refund-680','1','1000','退款id'), +('mall4cloud-refund-681','1','1000','退款id'), +('mall4cloud-refund-682','1','1000','退款id'), +('mall4cloud-refund-683','1','1000','退款id'), +('mall4cloud-refund-684','1','1000','退款id'), +('mall4cloud-refund-685','1','1000','退款id'), +('mall4cloud-refund-686','1','1000','退款id'), +('mall4cloud-refund-687','1','1000','退款id'), +('mall4cloud-refund-688','1','1000','退款id'), +('mall4cloud-refund-689','1','1000','退款id'), +('mall4cloud-refund-690','1','1000','退款id'), +('mall4cloud-refund-691','1','1000','退款id'), +('mall4cloud-refund-692','1','1000','退款id'), +('mall4cloud-refund-693','1','1000','退款id'), +('mall4cloud-refund-694','1','1000','退款id'), +('mall4cloud-refund-695','1','1000','退款id'), +('mall4cloud-refund-696','1','1000','退款id'), +('mall4cloud-refund-697','1','1000','退款id'), +('mall4cloud-refund-698','1','1000','退款id'), +('mall4cloud-refund-699','1','1000','退款id'), +('mall4cloud-refund-700','1','1000','退款id'), +('mall4cloud-refund-701','1','1000','退款id'), +('mall4cloud-refund-702','1','1000','退款id'), +('mall4cloud-refund-703','1','1000','退款id'), +('mall4cloud-refund-704','1','1000','退款id'), +('mall4cloud-refund-705','1','1000','退款id'), +('mall4cloud-refund-706','1','1000','退款id'), +('mall4cloud-refund-707','1','1000','退款id'), +('mall4cloud-refund-708','1','1000','退款id'), +('mall4cloud-refund-709','1','1000','退款id'), +('mall4cloud-refund-710','1','1000','退款id'), +('mall4cloud-refund-711','1','1000','退款id'), +('mall4cloud-refund-712','1','1000','退款id'), +('mall4cloud-refund-713','1','1000','退款id'), +('mall4cloud-refund-714','1','1000','退款id'), +('mall4cloud-refund-715','1','1000','退款id'), +('mall4cloud-refund-716','1','1000','退款id'), +('mall4cloud-refund-717','1','1000','退款id'), +('mall4cloud-refund-718','1','1000','退款id'), +('mall4cloud-refund-719','1','1000','退款id'), +('mall4cloud-refund-720','1','1000','退款id'), +('mall4cloud-refund-721','1','1000','退款id'), +('mall4cloud-refund-722','1','1000','退款id'), +('mall4cloud-refund-723','1','1000','退款id'), +('mall4cloud-refund-724','1','1000','退款id'), +('mall4cloud-refund-725','1','1000','退款id'), +('mall4cloud-refund-726','1','1000','退款id'), +('mall4cloud-refund-727','1','1000','退款id'), +('mall4cloud-refund-728','1','1000','退款id'), +('mall4cloud-refund-729','1','1000','退款id'), +('mall4cloud-refund-730','1','1000','退款id'), +('mall4cloud-refund-731','1','1000','退款id'), +('mall4cloud-refund-732','1','1000','退款id'), +('mall4cloud-refund-733','1','1000','退款id'), +('mall4cloud-refund-734','1','1000','退款id'), +('mall4cloud-refund-735','1','1000','退款id'), +('mall4cloud-refund-736','1','1000','退款id'), +('mall4cloud-refund-737','1','1000','退款id'), +('mall4cloud-refund-738','1','1000','退款id'), +('mall4cloud-refund-739','1','1000','退款id'), +('mall4cloud-refund-740','1','1000','退款id'), +('mall4cloud-refund-741','1','1000','退款id'), +('mall4cloud-refund-742','1','1000','退款id'), +('mall4cloud-refund-743','1','1000','退款id'), +('mall4cloud-refund-744','1','1000','退款id'), +('mall4cloud-refund-745','1','1000','退款id'), +('mall4cloud-refund-746','1','1000','退款id'), +('mall4cloud-refund-747','1','1000','退款id'), +('mall4cloud-refund-748','1','1000','退款id'), +('mall4cloud-refund-749','1','1000','退款id'), +('mall4cloud-refund-750','1','1000','退款id'), +('mall4cloud-refund-751','1','1000','退款id'), +('mall4cloud-refund-752','1','1000','退款id'), +('mall4cloud-refund-753','1','1000','退款id'), +('mall4cloud-refund-754','1','1000','退款id'), +('mall4cloud-refund-755','1','1000','退款id'), +('mall4cloud-refund-756','1','1000','退款id'), +('mall4cloud-refund-757','1','1000','退款id'), +('mall4cloud-refund-758','1','1000','退款id'), +('mall4cloud-refund-759','1','1000','退款id'), +('mall4cloud-refund-760','1','1000','退款id'), +('mall4cloud-refund-761','1','1000','退款id'), +('mall4cloud-refund-762','1','1000','退款id'), +('mall4cloud-refund-763','1','1000','退款id'), +('mall4cloud-refund-764','1','1000','退款id'), +('mall4cloud-refund-765','1','1000','退款id'), +('mall4cloud-refund-766','1','1000','退款id'), +('mall4cloud-refund-767','1','1000','退款id'), +('mall4cloud-refund-768','1','1000','退款id'), +('mall4cloud-refund-769','1','1000','退款id'), +('mall4cloud-refund-770','1','1000','退款id'), +('mall4cloud-refund-771','1','1000','退款id'), +('mall4cloud-refund-772','1','1000','退款id'), +('mall4cloud-refund-773','1','1000','退款id'), +('mall4cloud-refund-774','1','1000','退款id'), +('mall4cloud-refund-775','1','1000','退款id'), +('mall4cloud-refund-776','1','1000','退款id'), +('mall4cloud-refund-777','1','1000','退款id'), +('mall4cloud-refund-778','1','1000','退款id'), +('mall4cloud-refund-779','1','1000','退款id'), +('mall4cloud-refund-780','1','1000','退款id'), +('mall4cloud-refund-781','1','1000','退款id'), +('mall4cloud-refund-782','1','1000','退款id'), +('mall4cloud-refund-783','1','1000','退款id'), +('mall4cloud-refund-784','1','1000','退款id'), +('mall4cloud-refund-785','1','1000','退款id'), +('mall4cloud-refund-786','1','1000','退款id'), +('mall4cloud-refund-787','1','1000','退款id'), +('mall4cloud-refund-788','1','1000','退款id'), +('mall4cloud-refund-789','1','1000','退款id'), +('mall4cloud-refund-790','1','1000','退款id'), +('mall4cloud-refund-791','1','1000','退款id'), +('mall4cloud-refund-792','1','1000','退款id'), +('mall4cloud-refund-793','1','1000','退款id'), +('mall4cloud-refund-794','1','1000','退款id'), +('mall4cloud-refund-795','1','1000','退款id'), +('mall4cloud-refund-796','1','1000','退款id'), +('mall4cloud-refund-797','1','1000','退款id'), +('mall4cloud-refund-798','1','1000','退款id'), +('mall4cloud-refund-799','1','1000','退款id'), +('mall4cloud-refund-800','1','1000','退款id'), +('mall4cloud-refund-801','1','1000','退款id'), +('mall4cloud-refund-802','1','1000','退款id'), +('mall4cloud-refund-803','1','1000','退款id'), +('mall4cloud-refund-804','1','1000','退款id'), +('mall4cloud-refund-805','1','1000','退款id'), +('mall4cloud-refund-806','1','1000','退款id'), +('mall4cloud-refund-807','1','1000','退款id'), +('mall4cloud-refund-808','1','1000','退款id'), +('mall4cloud-refund-809','1','1000','退款id'), +('mall4cloud-refund-810','1','1000','退款id'), +('mall4cloud-refund-811','1','1000','退款id'), +('mall4cloud-refund-812','1','1000','退款id'), +('mall4cloud-refund-813','1','1000','退款id'), +('mall4cloud-refund-814','1','1000','退款id'), +('mall4cloud-refund-815','1','1000','退款id'), +('mall4cloud-refund-816','1','1000','退款id'), +('mall4cloud-refund-817','1','1000','退款id'), +('mall4cloud-refund-818','1','1000','退款id'), +('mall4cloud-refund-819','1','1000','退款id'), +('mall4cloud-refund-820','1','1000','退款id'), +('mall4cloud-refund-821','1','1000','退款id'), +('mall4cloud-refund-822','1','1000','退款id'), +('mall4cloud-refund-823','1','1000','退款id'), +('mall4cloud-refund-824','1','1000','退款id'), +('mall4cloud-refund-825','1','1000','退款id'), +('mall4cloud-refund-826','1','1000','退款id'), +('mall4cloud-refund-827','1','1000','退款id'), +('mall4cloud-refund-828','1','1000','退款id'), +('mall4cloud-refund-829','1','1000','退款id'), +('mall4cloud-refund-830','1','1000','退款id'), +('mall4cloud-refund-831','1','1000','退款id'), +('mall4cloud-refund-832','1','1000','退款id'), +('mall4cloud-refund-833','1','1000','退款id'), +('mall4cloud-refund-834','1','1000','退款id'), +('mall4cloud-refund-835','1','1000','退款id'), +('mall4cloud-refund-836','1','1000','退款id'), +('mall4cloud-refund-837','1','1000','退款id'), +('mall4cloud-refund-838','1','1000','退款id'), +('mall4cloud-refund-839','1','1000','退款id'), +('mall4cloud-refund-840','1','1000','退款id'), +('mall4cloud-refund-841','1','1000','退款id'), +('mall4cloud-refund-842','1','1000','退款id'), +('mall4cloud-refund-843','1','1000','退款id'), +('mall4cloud-refund-844','1','1000','退款id'), +('mall4cloud-refund-845','1','1000','退款id'), +('mall4cloud-refund-846','1','1000','退款id'), +('mall4cloud-refund-847','1','1000','退款id'), +('mall4cloud-refund-848','1','1000','退款id'), +('mall4cloud-refund-849','1','1000','退款id'), +('mall4cloud-refund-850','1','1000','退款id'), +('mall4cloud-refund-851','1','1000','退款id'), +('mall4cloud-refund-852','1','1000','退款id'), +('mall4cloud-refund-853','1','1000','退款id'), +('mall4cloud-refund-854','1','1000','退款id'), +('mall4cloud-refund-855','1','1000','退款id'), +('mall4cloud-refund-856','1','1000','退款id'), +('mall4cloud-refund-857','1','1000','退款id'), +('mall4cloud-refund-858','1','1000','退款id'), +('mall4cloud-refund-859','1','1000','退款id'), +('mall4cloud-refund-860','1','1000','退款id'), +('mall4cloud-refund-861','1','1000','退款id'), +('mall4cloud-refund-862','1','1000','退款id'), +('mall4cloud-refund-863','1','1000','退款id'), +('mall4cloud-refund-864','1','1000','退款id'), +('mall4cloud-refund-865','1','1000','退款id'), +('mall4cloud-refund-866','1','1000','退款id'), +('mall4cloud-refund-867','1','1000','退款id'), +('mall4cloud-refund-868','1','1000','退款id'), +('mall4cloud-refund-869','1','1000','退款id'), +('mall4cloud-refund-870','1','1000','退款id'), +('mall4cloud-refund-871','1','1000','退款id'), +('mall4cloud-refund-872','1','1000','退款id'), +('mall4cloud-refund-873','1','1000','退款id'), +('mall4cloud-refund-874','1','1000','退款id'), +('mall4cloud-refund-875','1','1000','退款id'), +('mall4cloud-refund-876','1','1000','退款id'), +('mall4cloud-refund-877','1','1000','退款id'), +('mall4cloud-refund-878','1','1000','退款id'), +('mall4cloud-refund-879','1','1000','退款id'), +('mall4cloud-refund-880','1','1000','退款id'), +('mall4cloud-refund-881','1','1000','退款id'), +('mall4cloud-refund-882','1','1000','退款id'), +('mall4cloud-refund-883','1','1000','退款id'), +('mall4cloud-refund-884','1','1000','退款id'), +('mall4cloud-refund-885','1','1000','退款id'), +('mall4cloud-refund-886','1','1000','退款id'), +('mall4cloud-refund-887','1','1000','退款id'), +('mall4cloud-refund-888','1','1000','退款id'), +('mall4cloud-refund-889','1','1000','退款id'), +('mall4cloud-refund-890','1','1000','退款id'), +('mall4cloud-refund-891','1','1000','退款id'), +('mall4cloud-refund-892','1','1000','退款id'), +('mall4cloud-refund-893','1','1000','退款id'), +('mall4cloud-refund-894','1','1000','退款id'), +('mall4cloud-refund-895','1','1000','退款id'), +('mall4cloud-refund-896','1','1000','退款id'), +('mall4cloud-refund-897','1','1000','退款id'), +('mall4cloud-refund-898','1','1000','退款id'), +('mall4cloud-refund-899','1','1000','退款id'), +('mall4cloud-refund-900','1','1000','退款id'), +('mall4cloud-refund-901','1','1000','退款id'), +('mall4cloud-refund-902','1','1000','退款id'), +('mall4cloud-refund-903','1','1000','退款id'), +('mall4cloud-refund-904','1','1000','退款id'), +('mall4cloud-refund-905','1','1000','退款id'), +('mall4cloud-refund-906','1','1000','退款id'), +('mall4cloud-refund-907','1','1000','退款id'), +('mall4cloud-refund-908','1','1000','退款id'), +('mall4cloud-refund-909','1','1000','退款id'), +('mall4cloud-refund-910','1','1000','退款id'), +('mall4cloud-refund-911','1','1000','退款id'), +('mall4cloud-refund-912','1','1000','退款id'), +('mall4cloud-refund-913','1','1000','退款id'), +('mall4cloud-refund-914','1','1000','退款id'), +('mall4cloud-refund-915','1','1000','退款id'), +('mall4cloud-refund-916','1','1000','退款id'), +('mall4cloud-refund-917','1','1000','退款id'), +('mall4cloud-refund-918','1','1000','退款id'), +('mall4cloud-refund-919','1','1000','退款id'), +('mall4cloud-refund-920','1','1000','退款id'), +('mall4cloud-refund-921','1','1000','退款id'), +('mall4cloud-refund-922','1','1000','退款id'), +('mall4cloud-refund-923','1','1000','退款id'), +('mall4cloud-refund-924','1','1000','退款id'), +('mall4cloud-refund-925','1','1000','退款id'), +('mall4cloud-refund-926','1','1000','退款id'), +('mall4cloud-refund-927','1','1000','退款id'), +('mall4cloud-refund-928','1','1000','退款id'), +('mall4cloud-refund-929','1','1000','退款id'), +('mall4cloud-refund-930','1','1000','退款id'), +('mall4cloud-refund-931','1','1000','退款id'), +('mall4cloud-refund-932','1','1000','退款id'), +('mall4cloud-refund-933','1','1000','退款id'), +('mall4cloud-refund-934','1','1000','退款id'), +('mall4cloud-refund-935','1','1000','退款id'), +('mall4cloud-refund-936','1','1000','退款id'), +('mall4cloud-refund-937','1','1000','退款id'), +('mall4cloud-refund-938','1','1000','退款id'), +('mall4cloud-refund-939','1','1000','退款id'), +('mall4cloud-refund-940','1','1000','退款id'), +('mall4cloud-refund-941','1','1000','退款id'), +('mall4cloud-refund-942','1','1000','退款id'), +('mall4cloud-refund-943','1','1000','退款id'), +('mall4cloud-refund-944','1','1000','退款id'), +('mall4cloud-refund-945','1','1000','退款id'), +('mall4cloud-refund-946','1','1000','退款id'), +('mall4cloud-refund-947','1','1000','退款id'), +('mall4cloud-refund-948','1','1000','退款id'), +('mall4cloud-refund-949','1','1000','退款id'), +('mall4cloud-refund-950','1','1000','退款id'), +('mall4cloud-refund-951','1','1000','退款id'), +('mall4cloud-refund-952','1','1000','退款id'), +('mall4cloud-refund-953','1','1000','退款id'), +('mall4cloud-refund-954','1','1000','退款id'), +('mall4cloud-refund-955','1','1000','退款id'), +('mall4cloud-refund-956','1','1000','退款id'), +('mall4cloud-refund-957','1','1000','退款id'), +('mall4cloud-refund-958','1','1000','退款id'), +('mall4cloud-refund-959','1','1000','退款id'), +('mall4cloud-refund-960','1','1000','退款id'), +('mall4cloud-refund-961','1','1000','退款id'), +('mall4cloud-refund-962','1','1000','退款id'), +('mall4cloud-refund-963','1','1000','退款id'), +('mall4cloud-refund-964','1','1000','退款id'), +('mall4cloud-refund-965','1','1000','退款id'), +('mall4cloud-refund-966','1','1000','退款id'), +('mall4cloud-refund-967','1','1000','退款id'), +('mall4cloud-refund-968','1','1000','退款id'), +('mall4cloud-refund-969','1','1000','退款id'), +('mall4cloud-refund-970','1','1000','退款id'), +('mall4cloud-refund-971','1','1000','退款id'), +('mall4cloud-refund-972','1','1000','退款id'), +('mall4cloud-refund-973','1','1000','退款id'), +('mall4cloud-refund-974','1','1000','退款id'), +('mall4cloud-refund-975','1','1000','退款id'), +('mall4cloud-refund-976','1','1000','退款id'), +('mall4cloud-refund-977','1','1000','退款id'), +('mall4cloud-refund-978','1','1000','退款id'), +('mall4cloud-refund-979','1','1000','退款id'), +('mall4cloud-refund-980','1','1000','退款id'), +('mall4cloud-refund-981','1','1000','退款id'), +('mall4cloud-refund-982','1','1000','退款id'), +('mall4cloud-refund-983','1','1000','退款id'), +('mall4cloud-refund-984','1','1000','退款id'), +('mall4cloud-refund-985','1','1000','退款id'), +('mall4cloud-refund-986','1','1000','退款id'), +('mall4cloud-refund-987','1','1000','退款id'), +('mall4cloud-refund-988','1','1000','退款id'), +('mall4cloud-refund-989','1','1000','退款id'), +('mall4cloud-refund-990','1','1000','退款id'), +('mall4cloud-refund-991','1','1000','退款id'), +('mall4cloud-refund-992','1','1000','退款id'), +('mall4cloud-refund-993','1','1000','退款id'), +('mall4cloud-refund-994','1','1000','退款id'), +('mall4cloud-refund-995','1','1000','退款id'), +('mall4cloud-refund-996','1','1000','退款id'), +('mall4cloud-refund-997','1','1000','退款id'), +('mall4cloud-refund-998','1','1000','退款id'), +('mall4cloud-refund-999','1','1000','退款id'); + + + +CREATE DATABASE IF NOT EXISTS mall4cloud_payment DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +USE `mall4cloud_payment`; +DROP TABLE IF EXISTS `leaf_alloc`; +CREATE TABLE `leaf_alloc` ( + `biz_tag` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '区分业务', + `max_id` bigint unsigned NOT NULL DEFAULT '1' COMMENT '该biz_tag目前所被分配的ID号段的最大值', + `step` int NOT NULL COMMENT '每次分配的号段长度', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + PRIMARY KEY (`biz_tag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +INSERT INTO `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) VALUES +('mall4cloud-pay-000','1','1000','支付单号'), +('mall4cloud-pay-001','1','1000','支付单号'), +('mall4cloud-pay-002','1','1000','支付单号'), +('mall4cloud-pay-003','1','1000','支付单号'), +('mall4cloud-pay-004','1','1000','支付单号'), +('mall4cloud-pay-005','1','1000','支付单号'), +('mall4cloud-pay-006','1','1000','支付单号'), +('mall4cloud-pay-007','1','1000','支付单号'), +('mall4cloud-pay-008','1','1000','支付单号'), +('mall4cloud-pay-009','1','1000','支付单号'), +('mall4cloud-pay-010','1','1000','支付单号'), +('mall4cloud-pay-011','1','1000','支付单号'), +('mall4cloud-pay-012','1','1000','支付单号'), +('mall4cloud-pay-013','1','1000','支付单号'), +('mall4cloud-pay-014','1','1000','支付单号'), +('mall4cloud-pay-015','1','1000','支付单号'), +('mall4cloud-pay-016','1','1000','支付单号'), +('mall4cloud-pay-017','1','1000','支付单号'), +('mall4cloud-pay-018','1','1000','支付单号'), +('mall4cloud-pay-019','1','1000','支付单号'), +('mall4cloud-pay-020','1','1000','支付单号'), +('mall4cloud-pay-021','1','1000','支付单号'), +('mall4cloud-pay-022','1','1000','支付单号'), +('mall4cloud-pay-023','1','1000','支付单号'), +('mall4cloud-pay-024','1','1000','支付单号'), +('mall4cloud-pay-025','1','1000','支付单号'), +('mall4cloud-pay-026','1','1000','支付单号'), +('mall4cloud-pay-027','1','1000','支付单号'), +('mall4cloud-pay-028','1','1000','支付单号'), +('mall4cloud-pay-029','1','1000','支付单号'), +('mall4cloud-pay-030','1','1000','支付单号'), +('mall4cloud-pay-031','1','1000','支付单号'), +('mall4cloud-pay-032','1','1000','支付单号'), +('mall4cloud-pay-033','1','1000','支付单号'), +('mall4cloud-pay-034','1','1000','支付单号'), +('mall4cloud-pay-035','1','1000','支付单号'), +('mall4cloud-pay-036','1','1000','支付单号'), +('mall4cloud-pay-037','1','1000','支付单号'), +('mall4cloud-pay-038','1','1000','支付单号'), +('mall4cloud-pay-039','1','1000','支付单号'), +('mall4cloud-pay-040','1','1000','支付单号'), +('mall4cloud-pay-041','1','1000','支付单号'), +('mall4cloud-pay-042','1','1000','支付单号'), +('mall4cloud-pay-043','1','1000','支付单号'), +('mall4cloud-pay-044','1','1000','支付单号'), +('mall4cloud-pay-045','1','1000','支付单号'), +('mall4cloud-pay-046','1','1000','支付单号'), +('mall4cloud-pay-047','1','1000','支付单号'), +('mall4cloud-pay-048','1','1000','支付单号'), +('mall4cloud-pay-049','1','1000','支付单号'), +('mall4cloud-pay-050','1','1000','支付单号'), +('mall4cloud-pay-051','1','1000','支付单号'), +('mall4cloud-pay-052','1','1000','支付单号'), +('mall4cloud-pay-053','1','1000','支付单号'), +('mall4cloud-pay-054','1','1000','支付单号'), +('mall4cloud-pay-055','1','1000','支付单号'), +('mall4cloud-pay-056','1','1000','支付单号'), +('mall4cloud-pay-057','1','1000','支付单号'), +('mall4cloud-pay-058','1','1000','支付单号'), +('mall4cloud-pay-059','1','1000','支付单号'), +('mall4cloud-pay-060','1','1000','支付单号'), +('mall4cloud-pay-061','1','1000','支付单号'), +('mall4cloud-pay-062','1','1000','支付单号'), +('mall4cloud-pay-063','1','1000','支付单号'), +('mall4cloud-pay-064','1','1000','支付单号'), +('mall4cloud-pay-065','1','1000','支付单号'), +('mall4cloud-pay-066','1','1000','支付单号'), +('mall4cloud-pay-067','1','1000','支付单号'), +('mall4cloud-pay-068','1','1000','支付单号'), +('mall4cloud-pay-069','1','1000','支付单号'), +('mall4cloud-pay-070','1','1000','支付单号'), +('mall4cloud-pay-071','1','1000','支付单号'), +('mall4cloud-pay-072','1','1000','支付单号'), +('mall4cloud-pay-073','1','1000','支付单号'), +('mall4cloud-pay-074','1','1000','支付单号'), +('mall4cloud-pay-075','1','1000','支付单号'), +('mall4cloud-pay-076','1','1000','支付单号'), +('mall4cloud-pay-077','1','1000','支付单号'), +('mall4cloud-pay-078','1','1000','支付单号'), +('mall4cloud-pay-079','1','1000','支付单号'), +('mall4cloud-pay-080','1','1000','支付单号'), +('mall4cloud-pay-081','1','1000','支付单号'), +('mall4cloud-pay-082','1','1000','支付单号'), +('mall4cloud-pay-083','1','1000','支付单号'), +('mall4cloud-pay-084','1','1000','支付单号'), +('mall4cloud-pay-085','1','1000','支付单号'), +('mall4cloud-pay-086','1','1000','支付单号'), +('mall4cloud-pay-087','1','1000','支付单号'), +('mall4cloud-pay-088','1','1000','支付单号'), +('mall4cloud-pay-089','1','1000','支付单号'), +('mall4cloud-pay-090','1','1000','支付单号'), +('mall4cloud-pay-091','1','1000','支付单号'), +('mall4cloud-pay-092','1','1000','支付单号'), +('mall4cloud-pay-093','1','1000','支付单号'), +('mall4cloud-pay-094','1','1000','支付单号'), +('mall4cloud-pay-095','1','1000','支付单号'), +('mall4cloud-pay-096','1','1000','支付单号'), +('mall4cloud-pay-097','1','1000','支付单号'), +('mall4cloud-pay-098','1','1000','支付单号'), +('mall4cloud-pay-099','1','1000','支付单号'), +('mall4cloud-pay-100','1','1000','支付单号'), +('mall4cloud-pay-101','1','1000','支付单号'), +('mall4cloud-pay-102','1','1000','支付单号'), +('mall4cloud-pay-103','1','1000','支付单号'), +('mall4cloud-pay-104','1','1000','支付单号'), +('mall4cloud-pay-105','1','1000','支付单号'), +('mall4cloud-pay-106','1','1000','支付单号'), +('mall4cloud-pay-107','1','1000','支付单号'), +('mall4cloud-pay-108','1','1000','支付单号'), +('mall4cloud-pay-109','1','1000','支付单号'), +('mall4cloud-pay-110','1','1000','支付单号'), +('mall4cloud-pay-111','1','1000','支付单号'), +('mall4cloud-pay-112','1','1000','支付单号'), +('mall4cloud-pay-113','1','1000','支付单号'), +('mall4cloud-pay-114','1','1000','支付单号'), +('mall4cloud-pay-115','1','1000','支付单号'), +('mall4cloud-pay-116','1','1000','支付单号'), +('mall4cloud-pay-117','1','1000','支付单号'), +('mall4cloud-pay-118','1','1000','支付单号'), +('mall4cloud-pay-119','1','1000','支付单号'), +('mall4cloud-pay-120','1','1000','支付单号'), +('mall4cloud-pay-121','1','1000','支付单号'), +('mall4cloud-pay-122','1','1000','支付单号'), +('mall4cloud-pay-123','1','1000','支付单号'), +('mall4cloud-pay-124','1','1000','支付单号'), +('mall4cloud-pay-125','1','1000','支付单号'), +('mall4cloud-pay-126','1','1000','支付单号'), +('mall4cloud-pay-127','1','1000','支付单号'), +('mall4cloud-pay-128','1','1000','支付单号'), +('mall4cloud-pay-129','1','1000','支付单号'), +('mall4cloud-pay-130','1','1000','支付单号'), +('mall4cloud-pay-131','1','1000','支付单号'), +('mall4cloud-pay-132','1','1000','支付单号'), +('mall4cloud-pay-133','1','1000','支付单号'), +('mall4cloud-pay-134','1','1000','支付单号'), +('mall4cloud-pay-135','1','1000','支付单号'), +('mall4cloud-pay-136','1','1000','支付单号'), +('mall4cloud-pay-137','1','1000','支付单号'), +('mall4cloud-pay-138','1','1000','支付单号'), +('mall4cloud-pay-139','1','1000','支付单号'), +('mall4cloud-pay-140','1','1000','支付单号'), +('mall4cloud-pay-141','1','1000','支付单号'), +('mall4cloud-pay-142','1','1000','支付单号'), +('mall4cloud-pay-143','1','1000','支付单号'), +('mall4cloud-pay-144','1','1000','支付单号'), +('mall4cloud-pay-145','1','1000','支付单号'), +('mall4cloud-pay-146','1','1000','支付单号'), +('mall4cloud-pay-147','1','1000','支付单号'), +('mall4cloud-pay-148','1','1000','支付单号'), +('mall4cloud-pay-149','1','1000','支付单号'), +('mall4cloud-pay-150','1','1000','支付单号'), +('mall4cloud-pay-151','1','1000','支付单号'), +('mall4cloud-pay-152','1','1000','支付单号'), +('mall4cloud-pay-153','1','1000','支付单号'), +('mall4cloud-pay-154','1','1000','支付单号'), +('mall4cloud-pay-155','1','1000','支付单号'), +('mall4cloud-pay-156','1','1000','支付单号'), +('mall4cloud-pay-157','1','1000','支付单号'), +('mall4cloud-pay-158','1','1000','支付单号'), +('mall4cloud-pay-159','1','1000','支付单号'), +('mall4cloud-pay-160','1','1000','支付单号'), +('mall4cloud-pay-161','1','1000','支付单号'), +('mall4cloud-pay-162','1','1000','支付单号'), +('mall4cloud-pay-163','1','1000','支付单号'), +('mall4cloud-pay-164','1','1000','支付单号'), +('mall4cloud-pay-165','1','1000','支付单号'), +('mall4cloud-pay-166','1','1000','支付单号'), +('mall4cloud-pay-167','1','1000','支付单号'), +('mall4cloud-pay-168','1','1000','支付单号'), +('mall4cloud-pay-169','1','1000','支付单号'), +('mall4cloud-pay-170','1','1000','支付单号'), +('mall4cloud-pay-171','1','1000','支付单号'), +('mall4cloud-pay-172','1','1000','支付单号'), +('mall4cloud-pay-173','1','1000','支付单号'), +('mall4cloud-pay-174','1','1000','支付单号'), +('mall4cloud-pay-175','1','1000','支付单号'), +('mall4cloud-pay-176','1','1000','支付单号'), +('mall4cloud-pay-177','1','1000','支付单号'), +('mall4cloud-pay-178','1','1000','支付单号'), +('mall4cloud-pay-179','1','1000','支付单号'), +('mall4cloud-pay-180','1','1000','支付单号'), +('mall4cloud-pay-181','1','1000','支付单号'), +('mall4cloud-pay-182','1','1000','支付单号'), +('mall4cloud-pay-183','1','1000','支付单号'), +('mall4cloud-pay-184','1','1000','支付单号'), +('mall4cloud-pay-185','1','1000','支付单号'), +('mall4cloud-pay-186','1','1000','支付单号'), +('mall4cloud-pay-187','1','1000','支付单号'), +('mall4cloud-pay-188','1','1000','支付单号'), +('mall4cloud-pay-189','1','1000','支付单号'), +('mall4cloud-pay-190','1','1000','支付单号'), +('mall4cloud-pay-191','1','1000','支付单号'), +('mall4cloud-pay-192','1','1000','支付单号'), +('mall4cloud-pay-193','1','1000','支付单号'), +('mall4cloud-pay-194','1','1000','支付单号'), +('mall4cloud-pay-195','1','1000','支付单号'), +('mall4cloud-pay-196','1','1000','支付单号'), +('mall4cloud-pay-197','1','1000','支付单号'), +('mall4cloud-pay-198','1','1000','支付单号'), +('mall4cloud-pay-199','1','1000','支付单号'), +('mall4cloud-pay-200','1','1000','支付单号'), +('mall4cloud-pay-201','1','1000','支付单号'), +('mall4cloud-pay-202','1','1000','支付单号'), +('mall4cloud-pay-203','1','1000','支付单号'), +('mall4cloud-pay-204','1','1000','支付单号'), +('mall4cloud-pay-205','1','1000','支付单号'), +('mall4cloud-pay-206','1','1000','支付单号'), +('mall4cloud-pay-207','1','1000','支付单号'), +('mall4cloud-pay-208','1','1000','支付单号'), +('mall4cloud-pay-209','1','1000','支付单号'), +('mall4cloud-pay-210','1','1000','支付单号'), +('mall4cloud-pay-211','1','1000','支付单号'), +('mall4cloud-pay-212','1','1000','支付单号'), +('mall4cloud-pay-213','1','1000','支付单号'), +('mall4cloud-pay-214','1','1000','支付单号'), +('mall4cloud-pay-215','1','1000','支付单号'), +('mall4cloud-pay-216','1','1000','支付单号'), +('mall4cloud-pay-217','1','1000','支付单号'), +('mall4cloud-pay-218','1','1000','支付单号'), +('mall4cloud-pay-219','1','1000','支付单号'), +('mall4cloud-pay-220','1','1000','支付单号'), +('mall4cloud-pay-221','1','1000','支付单号'), +('mall4cloud-pay-222','1','1000','支付单号'), +('mall4cloud-pay-223','1','1000','支付单号'), +('mall4cloud-pay-224','1','1000','支付单号'), +('mall4cloud-pay-225','1','1000','支付单号'), +('mall4cloud-pay-226','1','1000','支付单号'), +('mall4cloud-pay-227','1','1000','支付单号'), +('mall4cloud-pay-228','1','1000','支付单号'), +('mall4cloud-pay-229','1','1000','支付单号'), +('mall4cloud-pay-230','1','1000','支付单号'), +('mall4cloud-pay-231','1','1000','支付单号'), +('mall4cloud-pay-232','1','1000','支付单号'), +('mall4cloud-pay-233','1','1000','支付单号'), +('mall4cloud-pay-234','1','1000','支付单号'), +('mall4cloud-pay-235','1','1000','支付单号'), +('mall4cloud-pay-236','1','1000','支付单号'), +('mall4cloud-pay-237','1','1000','支付单号'), +('mall4cloud-pay-238','1','1000','支付单号'), +('mall4cloud-pay-239','1','1000','支付单号'), +('mall4cloud-pay-240','1','1000','支付单号'), +('mall4cloud-pay-241','1','1000','支付单号'), +('mall4cloud-pay-242','1','1000','支付单号'), +('mall4cloud-pay-243','1','1000','支付单号'), +('mall4cloud-pay-244','1','1000','支付单号'), +('mall4cloud-pay-245','1','1000','支付单号'), +('mall4cloud-pay-246','1','1000','支付单号'), +('mall4cloud-pay-247','1','1000','支付单号'), +('mall4cloud-pay-248','1','1000','支付单号'), +('mall4cloud-pay-249','1','1000','支付单号'), +('mall4cloud-pay-250','1','1000','支付单号'), +('mall4cloud-pay-251','1','1000','支付单号'), +('mall4cloud-pay-252','1','1000','支付单号'), +('mall4cloud-pay-253','1','1000','支付单号'), +('mall4cloud-pay-254','1','1000','支付单号'), +('mall4cloud-pay-255','1','1000','支付单号'), +('mall4cloud-pay-256','1','1000','支付单号'), +('mall4cloud-pay-257','1','1000','支付单号'), +('mall4cloud-pay-258','1','1000','支付单号'), +('mall4cloud-pay-259','1','1000','支付单号'), +('mall4cloud-pay-260','1','1000','支付单号'), +('mall4cloud-pay-261','1','1000','支付单号'), +('mall4cloud-pay-262','1','1000','支付单号'), +('mall4cloud-pay-263','1','1000','支付单号'), +('mall4cloud-pay-264','1','1000','支付单号'), +('mall4cloud-pay-265','1','1000','支付单号'), +('mall4cloud-pay-266','1','1000','支付单号'), +('mall4cloud-pay-267','1','1000','支付单号'), +('mall4cloud-pay-268','1','1000','支付单号'), +('mall4cloud-pay-269','1','1000','支付单号'), +('mall4cloud-pay-270','1','1000','支付单号'), +('mall4cloud-pay-271','1','1000','支付单号'), +('mall4cloud-pay-272','1','1000','支付单号'), +('mall4cloud-pay-273','1','1000','支付单号'), +('mall4cloud-pay-274','1','1000','支付单号'), +('mall4cloud-pay-275','1','1000','支付单号'), +('mall4cloud-pay-276','1','1000','支付单号'), +('mall4cloud-pay-277','1','1000','支付单号'), +('mall4cloud-pay-278','1','1000','支付单号'), +('mall4cloud-pay-279','1','1000','支付单号'), +('mall4cloud-pay-280','1','1000','支付单号'), +('mall4cloud-pay-281','1','1000','支付单号'), +('mall4cloud-pay-282','1','1000','支付单号'), +('mall4cloud-pay-283','1','1000','支付单号'), +('mall4cloud-pay-284','1','1000','支付单号'), +('mall4cloud-pay-285','1','1000','支付单号'), +('mall4cloud-pay-286','1','1000','支付单号'), +('mall4cloud-pay-287','1','1000','支付单号'), +('mall4cloud-pay-288','1','1000','支付单号'), +('mall4cloud-pay-289','1','1000','支付单号'), +('mall4cloud-pay-290','1','1000','支付单号'), +('mall4cloud-pay-291','1','1000','支付单号'), +('mall4cloud-pay-292','1','1000','支付单号'), +('mall4cloud-pay-293','1','1000','支付单号'), +('mall4cloud-pay-294','1','1000','支付单号'), +('mall4cloud-pay-295','1','1000','支付单号'), +('mall4cloud-pay-296','1','1000','支付单号'), +('mall4cloud-pay-297','1','1000','支付单号'), +('mall4cloud-pay-298','1','1000','支付单号'), +('mall4cloud-pay-299','1','1000','支付单号'), +('mall4cloud-pay-300','1','1000','支付单号'), +('mall4cloud-pay-301','1','1000','支付单号'), +('mall4cloud-pay-302','1','1000','支付单号'), +('mall4cloud-pay-303','1','1000','支付单号'), +('mall4cloud-pay-304','1','1000','支付单号'), +('mall4cloud-pay-305','1','1000','支付单号'), +('mall4cloud-pay-306','1','1000','支付单号'), +('mall4cloud-pay-307','1','1000','支付单号'), +('mall4cloud-pay-308','1','1000','支付单号'), +('mall4cloud-pay-309','1','1000','支付单号'), +('mall4cloud-pay-310','1','1000','支付单号'), +('mall4cloud-pay-311','1','1000','支付单号'), +('mall4cloud-pay-312','1','1000','支付单号'), +('mall4cloud-pay-313','1','1000','支付单号'), +('mall4cloud-pay-314','1','1000','支付单号'), +('mall4cloud-pay-315','1','1000','支付单号'), +('mall4cloud-pay-316','1','1000','支付单号'), +('mall4cloud-pay-317','1','1000','支付单号'), +('mall4cloud-pay-318','1','1000','支付单号'), +('mall4cloud-pay-319','1','1000','支付单号'), +('mall4cloud-pay-320','1','1000','支付单号'), +('mall4cloud-pay-321','1','1000','支付单号'), +('mall4cloud-pay-322','1','1000','支付单号'), +('mall4cloud-pay-323','1','1000','支付单号'), +('mall4cloud-pay-324','1','1000','支付单号'), +('mall4cloud-pay-325','1','1000','支付单号'), +('mall4cloud-pay-326','1','1000','支付单号'), +('mall4cloud-pay-327','1','1000','支付单号'), +('mall4cloud-pay-328','1','1000','支付单号'), +('mall4cloud-pay-329','1','1000','支付单号'), +('mall4cloud-pay-330','1','1000','支付单号'), +('mall4cloud-pay-331','1','1000','支付单号'), +('mall4cloud-pay-332','1','1000','支付单号'), +('mall4cloud-pay-333','1','1000','支付单号'), +('mall4cloud-pay-334','1','1000','支付单号'), +('mall4cloud-pay-335','1','1000','支付单号'), +('mall4cloud-pay-336','1','1000','支付单号'), +('mall4cloud-pay-337','1','1000','支付单号'), +('mall4cloud-pay-338','1','1000','支付单号'), +('mall4cloud-pay-339','1','1000','支付单号'), +('mall4cloud-pay-340','1','1000','支付单号'), +('mall4cloud-pay-341','1','1000','支付单号'), +('mall4cloud-pay-342','1','1000','支付单号'), +('mall4cloud-pay-343','1','1000','支付单号'), +('mall4cloud-pay-344','1','1000','支付单号'), +('mall4cloud-pay-345','1','1000','支付单号'), +('mall4cloud-pay-346','1','1000','支付单号'), +('mall4cloud-pay-347','1','1000','支付单号'), +('mall4cloud-pay-348','1','1000','支付单号'), +('mall4cloud-pay-349','1','1000','支付单号'), +('mall4cloud-pay-350','1','1000','支付单号'), +('mall4cloud-pay-351','1','1000','支付单号'), +('mall4cloud-pay-352','1','1000','支付单号'), +('mall4cloud-pay-353','1','1000','支付单号'), +('mall4cloud-pay-354','1','1000','支付单号'), +('mall4cloud-pay-355','1','1000','支付单号'), +('mall4cloud-pay-356','1','1000','支付单号'), +('mall4cloud-pay-357','1','1000','支付单号'), +('mall4cloud-pay-358','1','1000','支付单号'), +('mall4cloud-pay-359','1','1000','支付单号'), +('mall4cloud-pay-360','1','1000','支付单号'), +('mall4cloud-pay-361','1','1000','支付单号'), +('mall4cloud-pay-362','1','1000','支付单号'), +('mall4cloud-pay-363','1','1000','支付单号'), +('mall4cloud-pay-364','1','1000','支付单号'), +('mall4cloud-pay-365','1','1000','支付单号'), +('mall4cloud-pay-366','1','1000','支付单号'), +('mall4cloud-pay-367','1','1000','支付单号'), +('mall4cloud-pay-368','1','1000','支付单号'), +('mall4cloud-pay-369','1','1000','支付单号'), +('mall4cloud-pay-370','1','1000','支付单号'), +('mall4cloud-pay-371','1','1000','支付单号'), +('mall4cloud-pay-372','1','1000','支付单号'), +('mall4cloud-pay-373','1','1000','支付单号'), +('mall4cloud-pay-374','1','1000','支付单号'), +('mall4cloud-pay-375','1','1000','支付单号'), +('mall4cloud-pay-376','1','1000','支付单号'), +('mall4cloud-pay-377','1','1000','支付单号'), +('mall4cloud-pay-378','1','1000','支付单号'), +('mall4cloud-pay-379','1','1000','支付单号'), +('mall4cloud-pay-380','1','1000','支付单号'), +('mall4cloud-pay-381','1','1000','支付单号'), +('mall4cloud-pay-382','1','1000','支付单号'), +('mall4cloud-pay-383','1','1000','支付单号'), +('mall4cloud-pay-384','1','1000','支付单号'), +('mall4cloud-pay-385','1','1000','支付单号'), +('mall4cloud-pay-386','1','1000','支付单号'), +('mall4cloud-pay-387','1','1000','支付单号'), +('mall4cloud-pay-388','1','1000','支付单号'), +('mall4cloud-pay-389','1','1000','支付单号'), +('mall4cloud-pay-390','1','1000','支付单号'), +('mall4cloud-pay-391','1','1000','支付单号'), +('mall4cloud-pay-392','1','1000','支付单号'), +('mall4cloud-pay-393','1','1000','支付单号'), +('mall4cloud-pay-394','1','1000','支付单号'), +('mall4cloud-pay-395','1','1000','支付单号'), +('mall4cloud-pay-396','1','1000','支付单号'), +('mall4cloud-pay-397','1','1000','支付单号'), +('mall4cloud-pay-398','1','1000','支付单号'), +('mall4cloud-pay-399','1','1000','支付单号'), +('mall4cloud-pay-400','1','1000','支付单号'), +('mall4cloud-pay-401','1','1000','支付单号'), +('mall4cloud-pay-402','1','1000','支付单号'), +('mall4cloud-pay-403','1','1000','支付单号'), +('mall4cloud-pay-404','1','1000','支付单号'), +('mall4cloud-pay-405','1','1000','支付单号'), +('mall4cloud-pay-406','1','1000','支付单号'), +('mall4cloud-pay-407','1','1000','支付单号'), +('mall4cloud-pay-408','1','1000','支付单号'), +('mall4cloud-pay-409','1','1000','支付单号'), +('mall4cloud-pay-410','1','1000','支付单号'), +('mall4cloud-pay-411','1','1000','支付单号'), +('mall4cloud-pay-412','1','1000','支付单号'), +('mall4cloud-pay-413','1','1000','支付单号'), +('mall4cloud-pay-414','1','1000','支付单号'), +('mall4cloud-pay-415','1','1000','支付单号'), +('mall4cloud-pay-416','1','1000','支付单号'), +('mall4cloud-pay-417','1','1000','支付单号'), +('mall4cloud-pay-418','1','1000','支付单号'), +('mall4cloud-pay-419','1','1000','支付单号'), +('mall4cloud-pay-420','1','1000','支付单号'), +('mall4cloud-pay-421','1','1000','支付单号'), +('mall4cloud-pay-422','1','1000','支付单号'), +('mall4cloud-pay-423','1','1000','支付单号'), +('mall4cloud-pay-424','1','1000','支付单号'), +('mall4cloud-pay-425','1','1000','支付单号'), +('mall4cloud-pay-426','1','1000','支付单号'), +('mall4cloud-pay-427','1','1000','支付单号'), +('mall4cloud-pay-428','1','1000','支付单号'), +('mall4cloud-pay-429','1','1000','支付单号'), +('mall4cloud-pay-430','1','1000','支付单号'), +('mall4cloud-pay-431','1','1000','支付单号'), +('mall4cloud-pay-432','1','1000','支付单号'), +('mall4cloud-pay-433','1','1000','支付单号'), +('mall4cloud-pay-434','1','1000','支付单号'), +('mall4cloud-pay-435','1','1000','支付单号'), +('mall4cloud-pay-436','1','1000','支付单号'), +('mall4cloud-pay-437','1','1000','支付单号'), +('mall4cloud-pay-438','1','1000','支付单号'), +('mall4cloud-pay-439','1','1000','支付单号'), +('mall4cloud-pay-440','1','1000','支付单号'), +('mall4cloud-pay-441','1','1000','支付单号'), +('mall4cloud-pay-442','1','1000','支付单号'), +('mall4cloud-pay-443','1','1000','支付单号'), +('mall4cloud-pay-444','1','1000','支付单号'), +('mall4cloud-pay-445','1','1000','支付单号'), +('mall4cloud-pay-446','1','1000','支付单号'), +('mall4cloud-pay-447','1','1000','支付单号'), +('mall4cloud-pay-448','1','1000','支付单号'), +('mall4cloud-pay-449','1','1000','支付单号'), +('mall4cloud-pay-450','1','1000','支付单号'), +('mall4cloud-pay-451','1','1000','支付单号'), +('mall4cloud-pay-452','1','1000','支付单号'), +('mall4cloud-pay-453','1','1000','支付单号'), +('mall4cloud-pay-454','1','1000','支付单号'), +('mall4cloud-pay-455','1','1000','支付单号'), +('mall4cloud-pay-456','1','1000','支付单号'), +('mall4cloud-pay-457','1','1000','支付单号'), +('mall4cloud-pay-458','1','1000','支付单号'), +('mall4cloud-pay-459','1','1000','支付单号'), +('mall4cloud-pay-460','1','1000','支付单号'), +('mall4cloud-pay-461','1','1000','支付单号'), +('mall4cloud-pay-462','1','1000','支付单号'), +('mall4cloud-pay-463','1','1000','支付单号'), +('mall4cloud-pay-464','1','1000','支付单号'), +('mall4cloud-pay-465','1','1000','支付单号'), +('mall4cloud-pay-466','1','1000','支付单号'), +('mall4cloud-pay-467','1','1000','支付单号'), +('mall4cloud-pay-468','1','1000','支付单号'), +('mall4cloud-pay-469','1','1000','支付单号'), +('mall4cloud-pay-470','1','1000','支付单号'), +('mall4cloud-pay-471','1','1000','支付单号'), +('mall4cloud-pay-472','1','1000','支付单号'), +('mall4cloud-pay-473','1','1000','支付单号'), +('mall4cloud-pay-474','1','1000','支付单号'), +('mall4cloud-pay-475','1','1000','支付单号'), +('mall4cloud-pay-476','1','1000','支付单号'), +('mall4cloud-pay-477','1','1000','支付单号'), +('mall4cloud-pay-478','1','1000','支付单号'), +('mall4cloud-pay-479','1','1000','支付单号'), +('mall4cloud-pay-480','1','1000','支付单号'), +('mall4cloud-pay-481','1','1000','支付单号'), +('mall4cloud-pay-482','1','1000','支付单号'), +('mall4cloud-pay-483','1','1000','支付单号'), +('mall4cloud-pay-484','1','1000','支付单号'), +('mall4cloud-pay-485','1','1000','支付单号'), +('mall4cloud-pay-486','1','1000','支付单号'), +('mall4cloud-pay-487','1','1000','支付单号'), +('mall4cloud-pay-488','1','1000','支付单号'), +('mall4cloud-pay-489','1','1000','支付单号'), +('mall4cloud-pay-490','1','1000','支付单号'), +('mall4cloud-pay-491','1','1000','支付单号'), +('mall4cloud-pay-492','1','1000','支付单号'), +('mall4cloud-pay-493','1','1000','支付单号'), +('mall4cloud-pay-494','1','1000','支付单号'), +('mall4cloud-pay-495','1','1000','支付单号'), +('mall4cloud-pay-496','1','1000','支付单号'), +('mall4cloud-pay-497','1','1000','支付单号'), +('mall4cloud-pay-498','1','1000','支付单号'), +('mall4cloud-pay-499','1','1000','支付单号'), +('mall4cloud-pay-500','1','1000','支付单号'), +('mall4cloud-pay-501','1','1000','支付单号'), +('mall4cloud-pay-502','1','1000','支付单号'), +('mall4cloud-pay-503','1','1000','支付单号'), +('mall4cloud-pay-504','1','1000','支付单号'), +('mall4cloud-pay-505','1','1000','支付单号'), +('mall4cloud-pay-506','1','1000','支付单号'), +('mall4cloud-pay-507','1','1000','支付单号'), +('mall4cloud-pay-508','1','1000','支付单号'), +('mall4cloud-pay-509','1','1000','支付单号'), +('mall4cloud-pay-510','1','1000','支付单号'), +('mall4cloud-pay-511','1','1000','支付单号'), +('mall4cloud-pay-512','1','1000','支付单号'), +('mall4cloud-pay-513','1','1000','支付单号'), +('mall4cloud-pay-514','1','1000','支付单号'), +('mall4cloud-pay-515','1','1000','支付单号'), +('mall4cloud-pay-516','1','1000','支付单号'), +('mall4cloud-pay-517','1','1000','支付单号'), +('mall4cloud-pay-518','1','1000','支付单号'), +('mall4cloud-pay-519','1','1000','支付单号'), +('mall4cloud-pay-520','1','1000','支付单号'), +('mall4cloud-pay-521','1','1000','支付单号'), +('mall4cloud-pay-522','1','1000','支付单号'), +('mall4cloud-pay-523','1','1000','支付单号'), +('mall4cloud-pay-524','1','1000','支付单号'), +('mall4cloud-pay-525','1','1000','支付单号'), +('mall4cloud-pay-526','1','1000','支付单号'), +('mall4cloud-pay-527','1','1000','支付单号'), +('mall4cloud-pay-528','1','1000','支付单号'), +('mall4cloud-pay-529','1','1000','支付单号'), +('mall4cloud-pay-530','1','1000','支付单号'), +('mall4cloud-pay-531','1','1000','支付单号'), +('mall4cloud-pay-532','1','1000','支付单号'), +('mall4cloud-pay-533','1','1000','支付单号'), +('mall4cloud-pay-534','1','1000','支付单号'), +('mall4cloud-pay-535','1','1000','支付单号'), +('mall4cloud-pay-536','1','1000','支付单号'), +('mall4cloud-pay-537','1','1000','支付单号'), +('mall4cloud-pay-538','1','1000','支付单号'), +('mall4cloud-pay-539','1','1000','支付单号'), +('mall4cloud-pay-540','1','1000','支付单号'), +('mall4cloud-pay-541','1','1000','支付单号'), +('mall4cloud-pay-542','1','1000','支付单号'), +('mall4cloud-pay-543','1','1000','支付单号'), +('mall4cloud-pay-544','1','1000','支付单号'), +('mall4cloud-pay-545','1','1000','支付单号'), +('mall4cloud-pay-546','1','1000','支付单号'), +('mall4cloud-pay-547','1','1000','支付单号'), +('mall4cloud-pay-548','1','1000','支付单号'), +('mall4cloud-pay-549','1','1000','支付单号'), +('mall4cloud-pay-550','1','1000','支付单号'), +('mall4cloud-pay-551','1','1000','支付单号'), +('mall4cloud-pay-552','1','1000','支付单号'), +('mall4cloud-pay-553','1','1000','支付单号'), +('mall4cloud-pay-554','1','1000','支付单号'), +('mall4cloud-pay-555','1','1000','支付单号'), +('mall4cloud-pay-556','1','1000','支付单号'), +('mall4cloud-pay-557','1','1000','支付单号'), +('mall4cloud-pay-558','1','1000','支付单号'), +('mall4cloud-pay-559','1','1000','支付单号'), +('mall4cloud-pay-560','1','1000','支付单号'), +('mall4cloud-pay-561','1','1000','支付单号'), +('mall4cloud-pay-562','1','1000','支付单号'), +('mall4cloud-pay-563','1','1000','支付单号'), +('mall4cloud-pay-564','1','1000','支付单号'), +('mall4cloud-pay-565','1','1000','支付单号'), +('mall4cloud-pay-566','1','1000','支付单号'), +('mall4cloud-pay-567','1','1000','支付单号'), +('mall4cloud-pay-568','1','1000','支付单号'), +('mall4cloud-pay-569','1','1000','支付单号'), +('mall4cloud-pay-570','1','1000','支付单号'), +('mall4cloud-pay-571','1','1000','支付单号'), +('mall4cloud-pay-572','1','1000','支付单号'), +('mall4cloud-pay-573','1','1000','支付单号'), +('mall4cloud-pay-574','1','1000','支付单号'), +('mall4cloud-pay-575','1','1000','支付单号'), +('mall4cloud-pay-576','1','1000','支付单号'), +('mall4cloud-pay-577','1','1000','支付单号'), +('mall4cloud-pay-578','1','1000','支付单号'), +('mall4cloud-pay-579','1','1000','支付单号'), +('mall4cloud-pay-580','1','1000','支付单号'), +('mall4cloud-pay-581','1','1000','支付单号'), +('mall4cloud-pay-582','1','1000','支付单号'), +('mall4cloud-pay-583','1','1000','支付单号'), +('mall4cloud-pay-584','1','1000','支付单号'), +('mall4cloud-pay-585','1','1000','支付单号'), +('mall4cloud-pay-586','1','1000','支付单号'), +('mall4cloud-pay-587','1','1000','支付单号'), +('mall4cloud-pay-588','1','1000','支付单号'), +('mall4cloud-pay-589','1','1000','支付单号'), +('mall4cloud-pay-590','1','1000','支付单号'), +('mall4cloud-pay-591','1','1000','支付单号'), +('mall4cloud-pay-592','1','1000','支付单号'), +('mall4cloud-pay-593','1','1000','支付单号'), +('mall4cloud-pay-594','1','1000','支付单号'), +('mall4cloud-pay-595','1','1000','支付单号'), +('mall4cloud-pay-596','1','1000','支付单号'), +('mall4cloud-pay-597','1','1000','支付单号'), +('mall4cloud-pay-598','1','1000','支付单号'), +('mall4cloud-pay-599','1','1000','支付单号'), +('mall4cloud-pay-600','1','1000','支付单号'), +('mall4cloud-pay-601','1','1000','支付单号'), +('mall4cloud-pay-602','1','1000','支付单号'), +('mall4cloud-pay-603','1','1000','支付单号'), +('mall4cloud-pay-604','1','1000','支付单号'), +('mall4cloud-pay-605','1','1000','支付单号'), +('mall4cloud-pay-606','1','1000','支付单号'), +('mall4cloud-pay-607','1','1000','支付单号'), +('mall4cloud-pay-608','1','1000','支付单号'), +('mall4cloud-pay-609','1','1000','支付单号'), +('mall4cloud-pay-610','1','1000','支付单号'), +('mall4cloud-pay-611','1','1000','支付单号'), +('mall4cloud-pay-612','1','1000','支付单号'), +('mall4cloud-pay-613','1','1000','支付单号'), +('mall4cloud-pay-614','1','1000','支付单号'), +('mall4cloud-pay-615','1','1000','支付单号'), +('mall4cloud-pay-616','1','1000','支付单号'), +('mall4cloud-pay-617','1','1000','支付单号'), +('mall4cloud-pay-618','1','1000','支付单号'), +('mall4cloud-pay-619','1','1000','支付单号'), +('mall4cloud-pay-620','1','1000','支付单号'), +('mall4cloud-pay-621','1','1000','支付单号'), +('mall4cloud-pay-622','1','1000','支付单号'), +('mall4cloud-pay-623','1','1000','支付单号'), +('mall4cloud-pay-624','1','1000','支付单号'), +('mall4cloud-pay-625','1','1000','支付单号'), +('mall4cloud-pay-626','1','1000','支付单号'), +('mall4cloud-pay-627','1','1000','支付单号'), +('mall4cloud-pay-628','1','1000','支付单号'), +('mall4cloud-pay-629','1','1000','支付单号'), +('mall4cloud-pay-630','1','1000','支付单号'), +('mall4cloud-pay-631','1','1000','支付单号'), +('mall4cloud-pay-632','1','1000','支付单号'), +('mall4cloud-pay-633','1','1000','支付单号'), +('mall4cloud-pay-634','1','1000','支付单号'), +('mall4cloud-pay-635','1','1000','支付单号'), +('mall4cloud-pay-636','1','1000','支付单号'), +('mall4cloud-pay-637','1','1000','支付单号'), +('mall4cloud-pay-638','1','1000','支付单号'), +('mall4cloud-pay-639','1','1000','支付单号'), +('mall4cloud-pay-640','1','1000','支付单号'), +('mall4cloud-pay-641','1','1000','支付单号'), +('mall4cloud-pay-642','1','1000','支付单号'), +('mall4cloud-pay-643','1','1000','支付单号'), +('mall4cloud-pay-644','1','1000','支付单号'), +('mall4cloud-pay-645','1','1000','支付单号'), +('mall4cloud-pay-646','1','1000','支付单号'), +('mall4cloud-pay-647','1','1000','支付单号'), +('mall4cloud-pay-648','1','1000','支付单号'), +('mall4cloud-pay-649','1','1000','支付单号'), +('mall4cloud-pay-650','1','1000','支付单号'), +('mall4cloud-pay-651','1','1000','支付单号'), +('mall4cloud-pay-652','1','1000','支付单号'), +('mall4cloud-pay-653','1','1000','支付单号'), +('mall4cloud-pay-654','1','1000','支付单号'), +('mall4cloud-pay-655','1','1000','支付单号'), +('mall4cloud-pay-656','1','1000','支付单号'), +('mall4cloud-pay-657','1','1000','支付单号'), +('mall4cloud-pay-658','1','1000','支付单号'), +('mall4cloud-pay-659','1','1000','支付单号'), +('mall4cloud-pay-660','1','1000','支付单号'), +('mall4cloud-pay-661','1','1000','支付单号'), +('mall4cloud-pay-662','1','1000','支付单号'), +('mall4cloud-pay-663','1','1000','支付单号'), +('mall4cloud-pay-664','1','1000','支付单号'), +('mall4cloud-pay-665','1','1000','支付单号'), +('mall4cloud-pay-666','1','1000','支付单号'), +('mall4cloud-pay-667','1','1000','支付单号'), +('mall4cloud-pay-668','1','1000','支付单号'), +('mall4cloud-pay-669','1','1000','支付单号'), +('mall4cloud-pay-670','1','1000','支付单号'), +('mall4cloud-pay-671','1','1000','支付单号'), +('mall4cloud-pay-672','1','1000','支付单号'), +('mall4cloud-pay-673','1','1000','支付单号'), +('mall4cloud-pay-674','1','1000','支付单号'), +('mall4cloud-pay-675','1','1000','支付单号'), +('mall4cloud-pay-676','1','1000','支付单号'), +('mall4cloud-pay-677','1','1000','支付单号'), +('mall4cloud-pay-678','1','1000','支付单号'), +('mall4cloud-pay-679','1','1000','支付单号'), +('mall4cloud-pay-680','1','1000','支付单号'), +('mall4cloud-pay-681','1','1000','支付单号'), +('mall4cloud-pay-682','1','1000','支付单号'), +('mall4cloud-pay-683','1','1000','支付单号'), +('mall4cloud-pay-684','1','1000','支付单号'), +('mall4cloud-pay-685','1','1000','支付单号'), +('mall4cloud-pay-686','1','1000','支付单号'), +('mall4cloud-pay-687','1','1000','支付单号'), +('mall4cloud-pay-688','1','1000','支付单号'), +('mall4cloud-pay-689','1','1000','支付单号'), +('mall4cloud-pay-690','1','1000','支付单号'), +('mall4cloud-pay-691','1','1000','支付单号'), +('mall4cloud-pay-692','1','1000','支付单号'), +('mall4cloud-pay-693','1','1000','支付单号'), +('mall4cloud-pay-694','1','1000','支付单号'), +('mall4cloud-pay-695','1','1000','支付单号'), +('mall4cloud-pay-696','1','1000','支付单号'), +('mall4cloud-pay-697','1','1000','支付单号'), +('mall4cloud-pay-698','1','1000','支付单号'), +('mall4cloud-pay-699','1','1000','支付单号'), +('mall4cloud-pay-700','1','1000','支付单号'), +('mall4cloud-pay-701','1','1000','支付单号'), +('mall4cloud-pay-702','1','1000','支付单号'), +('mall4cloud-pay-703','1','1000','支付单号'), +('mall4cloud-pay-704','1','1000','支付单号'), +('mall4cloud-pay-705','1','1000','支付单号'), +('mall4cloud-pay-706','1','1000','支付单号'), +('mall4cloud-pay-707','1','1000','支付单号'), +('mall4cloud-pay-708','1','1000','支付单号'), +('mall4cloud-pay-709','1','1000','支付单号'), +('mall4cloud-pay-710','1','1000','支付单号'), +('mall4cloud-pay-711','1','1000','支付单号'), +('mall4cloud-pay-712','1','1000','支付单号'), +('mall4cloud-pay-713','1','1000','支付单号'), +('mall4cloud-pay-714','1','1000','支付单号'), +('mall4cloud-pay-715','1','1000','支付单号'), +('mall4cloud-pay-716','1','1000','支付单号'), +('mall4cloud-pay-717','1','1000','支付单号'), +('mall4cloud-pay-718','1','1000','支付单号'), +('mall4cloud-pay-719','1','1000','支付单号'), +('mall4cloud-pay-720','1','1000','支付单号'), +('mall4cloud-pay-721','1','1000','支付单号'), +('mall4cloud-pay-722','1','1000','支付单号'), +('mall4cloud-pay-723','1','1000','支付单号'), +('mall4cloud-pay-724','1','1000','支付单号'), +('mall4cloud-pay-725','1','1000','支付单号'), +('mall4cloud-pay-726','1','1000','支付单号'), +('mall4cloud-pay-727','1','1000','支付单号'), +('mall4cloud-pay-728','1','1000','支付单号'), +('mall4cloud-pay-729','1','1000','支付单号'), +('mall4cloud-pay-730','1','1000','支付单号'), +('mall4cloud-pay-731','1','1000','支付单号'), +('mall4cloud-pay-732','1','1000','支付单号'), +('mall4cloud-pay-733','1','1000','支付单号'), +('mall4cloud-pay-734','1','1000','支付单号'), +('mall4cloud-pay-735','1','1000','支付单号'), +('mall4cloud-pay-736','1','1000','支付单号'), +('mall4cloud-pay-737','1','1000','支付单号'), +('mall4cloud-pay-738','1','1000','支付单号'), +('mall4cloud-pay-739','1','1000','支付单号'), +('mall4cloud-pay-740','1','1000','支付单号'), +('mall4cloud-pay-741','1','1000','支付单号'), +('mall4cloud-pay-742','1','1000','支付单号'), +('mall4cloud-pay-743','1','1000','支付单号'), +('mall4cloud-pay-744','1','1000','支付单号'), +('mall4cloud-pay-745','1','1000','支付单号'), +('mall4cloud-pay-746','1','1000','支付单号'), +('mall4cloud-pay-747','1','1000','支付单号'), +('mall4cloud-pay-748','1','1000','支付单号'), +('mall4cloud-pay-749','1','1000','支付单号'), +('mall4cloud-pay-750','1','1000','支付单号'), +('mall4cloud-pay-751','1','1000','支付单号'), +('mall4cloud-pay-752','1','1000','支付单号'), +('mall4cloud-pay-753','1','1000','支付单号'), +('mall4cloud-pay-754','1','1000','支付单号'), +('mall4cloud-pay-755','1','1000','支付单号'), +('mall4cloud-pay-756','1','1000','支付单号'), +('mall4cloud-pay-757','1','1000','支付单号'), +('mall4cloud-pay-758','1','1000','支付单号'), +('mall4cloud-pay-759','1','1000','支付单号'), +('mall4cloud-pay-760','1','1000','支付单号'), +('mall4cloud-pay-761','1','1000','支付单号'), +('mall4cloud-pay-762','1','1000','支付单号'), +('mall4cloud-pay-763','1','1000','支付单号'), +('mall4cloud-pay-764','1','1000','支付单号'), +('mall4cloud-pay-765','1','1000','支付单号'), +('mall4cloud-pay-766','1','1000','支付单号'), +('mall4cloud-pay-767','1','1000','支付单号'), +('mall4cloud-pay-768','1','1000','支付单号'), +('mall4cloud-pay-769','1','1000','支付单号'), +('mall4cloud-pay-770','1','1000','支付单号'), +('mall4cloud-pay-771','1','1000','支付单号'), +('mall4cloud-pay-772','1','1000','支付单号'), +('mall4cloud-pay-773','1','1000','支付单号'), +('mall4cloud-pay-774','1','1000','支付单号'), +('mall4cloud-pay-775','1','1000','支付单号'), +('mall4cloud-pay-776','1','1000','支付单号'), +('mall4cloud-pay-777','1','1000','支付单号'), +('mall4cloud-pay-778','1','1000','支付单号'), +('mall4cloud-pay-779','1','1000','支付单号'), +('mall4cloud-pay-780','1','1000','支付单号'), +('mall4cloud-pay-781','1','1000','支付单号'), +('mall4cloud-pay-782','1','1000','支付单号'), +('mall4cloud-pay-783','1','1000','支付单号'), +('mall4cloud-pay-784','1','1000','支付单号'), +('mall4cloud-pay-785','1','1000','支付单号'), +('mall4cloud-pay-786','1','1000','支付单号'), +('mall4cloud-pay-787','1','1000','支付单号'), +('mall4cloud-pay-788','1','1000','支付单号'), +('mall4cloud-pay-789','1','1000','支付单号'), +('mall4cloud-pay-790','1','1000','支付单号'), +('mall4cloud-pay-791','1','1000','支付单号'), +('mall4cloud-pay-792','1','1000','支付单号'), +('mall4cloud-pay-793','1','1000','支付单号'), +('mall4cloud-pay-794','1','1000','支付单号'), +('mall4cloud-pay-795','1','1000','支付单号'), +('mall4cloud-pay-796','1','1000','支付单号'), +('mall4cloud-pay-797','1','1000','支付单号'), +('mall4cloud-pay-798','1','1000','支付单号'), +('mall4cloud-pay-799','1','1000','支付单号'), +('mall4cloud-pay-800','1','1000','支付单号'), +('mall4cloud-pay-801','1','1000','支付单号'), +('mall4cloud-pay-802','1','1000','支付单号'), +('mall4cloud-pay-803','1','1000','支付单号'), +('mall4cloud-pay-804','1','1000','支付单号'), +('mall4cloud-pay-805','1','1000','支付单号'), +('mall4cloud-pay-806','1','1000','支付单号'), +('mall4cloud-pay-807','1','1000','支付单号'), +('mall4cloud-pay-808','1','1000','支付单号'), +('mall4cloud-pay-809','1','1000','支付单号'), +('mall4cloud-pay-810','1','1000','支付单号'), +('mall4cloud-pay-811','1','1000','支付单号'), +('mall4cloud-pay-812','1','1000','支付单号'), +('mall4cloud-pay-813','1','1000','支付单号'), +('mall4cloud-pay-814','1','1000','支付单号'), +('mall4cloud-pay-815','1','1000','支付单号'), +('mall4cloud-pay-816','1','1000','支付单号'), +('mall4cloud-pay-817','1','1000','支付单号'), +('mall4cloud-pay-818','1','1000','支付单号'), +('mall4cloud-pay-819','1','1000','支付单号'), +('mall4cloud-pay-820','1','1000','支付单号'), +('mall4cloud-pay-821','1','1000','支付单号'), +('mall4cloud-pay-822','1','1000','支付单号'), +('mall4cloud-pay-823','1','1000','支付单号'), +('mall4cloud-pay-824','1','1000','支付单号'), +('mall4cloud-pay-825','1','1000','支付单号'), +('mall4cloud-pay-826','1','1000','支付单号'), +('mall4cloud-pay-827','1','1000','支付单号'), +('mall4cloud-pay-828','1','1000','支付单号'), +('mall4cloud-pay-829','1','1000','支付单号'), +('mall4cloud-pay-830','1','1000','支付单号'), +('mall4cloud-pay-831','1','1000','支付单号'), +('mall4cloud-pay-832','1','1000','支付单号'), +('mall4cloud-pay-833','1','1000','支付单号'), +('mall4cloud-pay-834','1','1000','支付单号'), +('mall4cloud-pay-835','1','1000','支付单号'), +('mall4cloud-pay-836','1','1000','支付单号'), +('mall4cloud-pay-837','1','1000','支付单号'), +('mall4cloud-pay-838','1','1000','支付单号'), +('mall4cloud-pay-839','1','1000','支付单号'), +('mall4cloud-pay-840','1','1000','支付单号'), +('mall4cloud-pay-841','1','1000','支付单号'), +('mall4cloud-pay-842','1','1000','支付单号'), +('mall4cloud-pay-843','1','1000','支付单号'), +('mall4cloud-pay-844','1','1000','支付单号'), +('mall4cloud-pay-845','1','1000','支付单号'), +('mall4cloud-pay-846','1','1000','支付单号'), +('mall4cloud-pay-847','1','1000','支付单号'), +('mall4cloud-pay-848','1','1000','支付单号'), +('mall4cloud-pay-849','1','1000','支付单号'), +('mall4cloud-pay-850','1','1000','支付单号'), +('mall4cloud-pay-851','1','1000','支付单号'), +('mall4cloud-pay-852','1','1000','支付单号'), +('mall4cloud-pay-853','1','1000','支付单号'), +('mall4cloud-pay-854','1','1000','支付单号'), +('mall4cloud-pay-855','1','1000','支付单号'), +('mall4cloud-pay-856','1','1000','支付单号'), +('mall4cloud-pay-857','1','1000','支付单号'), +('mall4cloud-pay-858','1','1000','支付单号'), +('mall4cloud-pay-859','1','1000','支付单号'), +('mall4cloud-pay-860','1','1000','支付单号'), +('mall4cloud-pay-861','1','1000','支付单号'), +('mall4cloud-pay-862','1','1000','支付单号'), +('mall4cloud-pay-863','1','1000','支付单号'), +('mall4cloud-pay-864','1','1000','支付单号'), +('mall4cloud-pay-865','1','1000','支付单号'), +('mall4cloud-pay-866','1','1000','支付单号'), +('mall4cloud-pay-867','1','1000','支付单号'), +('mall4cloud-pay-868','1','1000','支付单号'), +('mall4cloud-pay-869','1','1000','支付单号'), +('mall4cloud-pay-870','1','1000','支付单号'), +('mall4cloud-pay-871','1','1000','支付单号'), +('mall4cloud-pay-872','1','1000','支付单号'), +('mall4cloud-pay-873','1','1000','支付单号'), +('mall4cloud-pay-874','1','1000','支付单号'), +('mall4cloud-pay-875','1','1000','支付单号'), +('mall4cloud-pay-876','1','1000','支付单号'), +('mall4cloud-pay-877','1','1000','支付单号'), +('mall4cloud-pay-878','1','1000','支付单号'), +('mall4cloud-pay-879','1','1000','支付单号'), +('mall4cloud-pay-880','1','1000','支付单号'), +('mall4cloud-pay-881','1','1000','支付单号'), +('mall4cloud-pay-882','1','1000','支付单号'), +('mall4cloud-pay-883','1','1000','支付单号'), +('mall4cloud-pay-884','1','1000','支付单号'), +('mall4cloud-pay-885','1','1000','支付单号'), +('mall4cloud-pay-886','1','1000','支付单号'), +('mall4cloud-pay-887','1','1000','支付单号'), +('mall4cloud-pay-888','1','1000','支付单号'), +('mall4cloud-pay-889','1','1000','支付单号'), +('mall4cloud-pay-890','1','1000','支付单号'), +('mall4cloud-pay-891','1','1000','支付单号'), +('mall4cloud-pay-892','1','1000','支付单号'), +('mall4cloud-pay-893','1','1000','支付单号'), +('mall4cloud-pay-894','1','1000','支付单号'), +('mall4cloud-pay-895','1','1000','支付单号'), +('mall4cloud-pay-896','1','1000','支付单号'), +('mall4cloud-pay-897','1','1000','支付单号'), +('mall4cloud-pay-898','1','1000','支付单号'), +('mall4cloud-pay-899','1','1000','支付单号'), +('mall4cloud-pay-900','1','1000','支付单号'), +('mall4cloud-pay-901','1','1000','支付单号'), +('mall4cloud-pay-902','1','1000','支付单号'), +('mall4cloud-pay-903','1','1000','支付单号'), +('mall4cloud-pay-904','1','1000','支付单号'), +('mall4cloud-pay-905','1','1000','支付单号'), +('mall4cloud-pay-906','1','1000','支付单号'), +('mall4cloud-pay-907','1','1000','支付单号'), +('mall4cloud-pay-908','1','1000','支付单号'), +('mall4cloud-pay-909','1','1000','支付单号'), +('mall4cloud-pay-910','1','1000','支付单号'), +('mall4cloud-pay-911','1','1000','支付单号'), +('mall4cloud-pay-912','1','1000','支付单号'), +('mall4cloud-pay-913','1','1000','支付单号'), +('mall4cloud-pay-914','1','1000','支付单号'), +('mall4cloud-pay-915','1','1000','支付单号'), +('mall4cloud-pay-916','1','1000','支付单号'), +('mall4cloud-pay-917','1','1000','支付单号'), +('mall4cloud-pay-918','1','1000','支付单号'), +('mall4cloud-pay-919','1','1000','支付单号'), +('mall4cloud-pay-920','1','1000','支付单号'), +('mall4cloud-pay-921','1','1000','支付单号'), +('mall4cloud-pay-922','1','1000','支付单号'), +('mall4cloud-pay-923','1','1000','支付单号'), +('mall4cloud-pay-924','1','1000','支付单号'), +('mall4cloud-pay-925','1','1000','支付单号'), +('mall4cloud-pay-926','1','1000','支付单号'), +('mall4cloud-pay-927','1','1000','支付单号'), +('mall4cloud-pay-928','1','1000','支付单号'), +('mall4cloud-pay-929','1','1000','支付单号'), +('mall4cloud-pay-930','1','1000','支付单号'), +('mall4cloud-pay-931','1','1000','支付单号'), +('mall4cloud-pay-932','1','1000','支付单号'), +('mall4cloud-pay-933','1','1000','支付单号'), +('mall4cloud-pay-934','1','1000','支付单号'), +('mall4cloud-pay-935','1','1000','支付单号'), +('mall4cloud-pay-936','1','1000','支付单号'), +('mall4cloud-pay-937','1','1000','支付单号'), +('mall4cloud-pay-938','1','1000','支付单号'), +('mall4cloud-pay-939','1','1000','支付单号'), +('mall4cloud-pay-940','1','1000','支付单号'), +('mall4cloud-pay-941','1','1000','支付单号'), +('mall4cloud-pay-942','1','1000','支付单号'), +('mall4cloud-pay-943','1','1000','支付单号'), +('mall4cloud-pay-944','1','1000','支付单号'), +('mall4cloud-pay-945','1','1000','支付单号'), +('mall4cloud-pay-946','1','1000','支付单号'), +('mall4cloud-pay-947','1','1000','支付单号'), +('mall4cloud-pay-948','1','1000','支付单号'), +('mall4cloud-pay-949','1','1000','支付单号'), +('mall4cloud-pay-950','1','1000','支付单号'), +('mall4cloud-pay-951','1','1000','支付单号'), +('mall4cloud-pay-952','1','1000','支付单号'), +('mall4cloud-pay-953','1','1000','支付单号'), +('mall4cloud-pay-954','1','1000','支付单号'), +('mall4cloud-pay-955','1','1000','支付单号'), +('mall4cloud-pay-956','1','1000','支付单号'), +('mall4cloud-pay-957','1','1000','支付单号'), +('mall4cloud-pay-958','1','1000','支付单号'), +('mall4cloud-pay-959','1','1000','支付单号'), +('mall4cloud-pay-960','1','1000','支付单号'), +('mall4cloud-pay-961','1','1000','支付单号'), +('mall4cloud-pay-962','1','1000','支付单号'), +('mall4cloud-pay-963','1','1000','支付单号'), +('mall4cloud-pay-964','1','1000','支付单号'), +('mall4cloud-pay-965','1','1000','支付单号'), +('mall4cloud-pay-966','1','1000','支付单号'), +('mall4cloud-pay-967','1','1000','支付单号'), +('mall4cloud-pay-968','1','1000','支付单号'), +('mall4cloud-pay-969','1','1000','支付单号'), +('mall4cloud-pay-970','1','1000','支付单号'), +('mall4cloud-pay-971','1','1000','支付单号'), +('mall4cloud-pay-972','1','1000','支付单号'), +('mall4cloud-pay-973','1','1000','支付单号'), +('mall4cloud-pay-974','1','1000','支付单号'), +('mall4cloud-pay-975','1','1000','支付单号'), +('mall4cloud-pay-976','1','1000','支付单号'), +('mall4cloud-pay-977','1','1000','支付单号'), +('mall4cloud-pay-978','1','1000','支付单号'), +('mall4cloud-pay-979','1','1000','支付单号'), +('mall4cloud-pay-980','1','1000','支付单号'), +('mall4cloud-pay-981','1','1000','支付单号'), +('mall4cloud-pay-982','1','1000','支付单号'), +('mall4cloud-pay-983','1','1000','支付单号'), +('mall4cloud-pay-984','1','1000','支付单号'), +('mall4cloud-pay-985','1','1000','支付单号'), +('mall4cloud-pay-986','1','1000','支付单号'), +('mall4cloud-pay-987','1','1000','支付单号'), +('mall4cloud-pay-988','1','1000','支付单号'), +('mall4cloud-pay-989','1','1000','支付单号'), +('mall4cloud-pay-990','1','1000','支付单号'), +('mall4cloud-pay-991','1','1000','支付单号'), +('mall4cloud-pay-992','1','1000','支付单号'), +('mall4cloud-pay-993','1','1000','支付单号'), +('mall4cloud-pay-994','1','1000','支付单号'), +('mall4cloud-pay-995','1','1000','支付单号'), +('mall4cloud-pay-996','1','1000','支付单号'), +('mall4cloud-pay-997','1','1000','支付单号'), +('mall4cloud-pay-998','1','1000','支付单号'), +('mall4cloud-pay-999','1','1000','支付单号'), +('mall4cloud-refund-000','1','1000','退款id'), +('mall4cloud-refund-001','1','1000','退款id'), +('mall4cloud-refund-002','1','1000','退款id'), +('mall4cloud-refund-003','1','1000','退款id'), +('mall4cloud-refund-004','1','1000','退款id'), +('mall4cloud-refund-005','1','1000','退款id'), +('mall4cloud-refund-006','1','1000','退款id'), +('mall4cloud-refund-007','1','1000','退款id'), +('mall4cloud-refund-008','1','1000','退款id'), +('mall4cloud-refund-009','1','1000','退款id'), +('mall4cloud-refund-010','1','1000','退款id'), +('mall4cloud-refund-011','1','1000','退款id'), +('mall4cloud-refund-012','1','1000','退款id'), +('mall4cloud-refund-013','1','1000','退款id'), +('mall4cloud-refund-014','1','1000','退款id'), +('mall4cloud-refund-015','1','1000','退款id'), +('mall4cloud-refund-016','1','1000','退款id'), +('mall4cloud-refund-017','1','1000','退款id'), +('mall4cloud-refund-018','1','1000','退款id'), +('mall4cloud-refund-019','1','1000','退款id'), +('mall4cloud-refund-020','1','1000','退款id'), +('mall4cloud-refund-021','1','1000','退款id'), +('mall4cloud-refund-022','1','1000','退款id'), +('mall4cloud-refund-023','1','1000','退款id'), +('mall4cloud-refund-024','1','1000','退款id'), +('mall4cloud-refund-025','1','1000','退款id'), +('mall4cloud-refund-026','1','1000','退款id'), +('mall4cloud-refund-027','1','1000','退款id'), +('mall4cloud-refund-028','1','1000','退款id'), +('mall4cloud-refund-029','1','1000','退款id'), +('mall4cloud-refund-030','1','1000','退款id'), +('mall4cloud-refund-031','1','1000','退款id'), +('mall4cloud-refund-032','1','1000','退款id'), +('mall4cloud-refund-033','1','1000','退款id'), +('mall4cloud-refund-034','1','1000','退款id'), +('mall4cloud-refund-035','1','1000','退款id'), +('mall4cloud-refund-036','1','1000','退款id'), +('mall4cloud-refund-037','1','1000','退款id'), +('mall4cloud-refund-038','1','1000','退款id'), +('mall4cloud-refund-039','1','1000','退款id'), +('mall4cloud-refund-040','1','1000','退款id'), +('mall4cloud-refund-041','1','1000','退款id'), +('mall4cloud-refund-042','1','1000','退款id'), +('mall4cloud-refund-043','1','1000','退款id'), +('mall4cloud-refund-044','1','1000','退款id'), +('mall4cloud-refund-045','1','1000','退款id'), +('mall4cloud-refund-046','1','1000','退款id'), +('mall4cloud-refund-047','1','1000','退款id'), +('mall4cloud-refund-048','1','1000','退款id'), +('mall4cloud-refund-049','1','1000','退款id'), +('mall4cloud-refund-050','1','1000','退款id'), +('mall4cloud-refund-051','1','1000','退款id'), +('mall4cloud-refund-052','1','1000','退款id'), +('mall4cloud-refund-053','1','1000','退款id'), +('mall4cloud-refund-054','1','1000','退款id'), +('mall4cloud-refund-055','1','1000','退款id'), +('mall4cloud-refund-056','1','1000','退款id'), +('mall4cloud-refund-057','1','1000','退款id'), +('mall4cloud-refund-058','1','1000','退款id'), +('mall4cloud-refund-059','1','1000','退款id'), +('mall4cloud-refund-060','1','1000','退款id'), +('mall4cloud-refund-061','1','1000','退款id'), +('mall4cloud-refund-062','1','1000','退款id'), +('mall4cloud-refund-063','1','1000','退款id'), +('mall4cloud-refund-064','1','1000','退款id'), +('mall4cloud-refund-065','1','1000','退款id'), +('mall4cloud-refund-066','1','1000','退款id'), +('mall4cloud-refund-067','1','1000','退款id'), +('mall4cloud-refund-068','1','1000','退款id'), +('mall4cloud-refund-069','1','1000','退款id'), +('mall4cloud-refund-070','1','1000','退款id'), +('mall4cloud-refund-071','1','1000','退款id'), +('mall4cloud-refund-072','1','1000','退款id'), +('mall4cloud-refund-073','1','1000','退款id'), +('mall4cloud-refund-074','1','1000','退款id'), +('mall4cloud-refund-075','1','1000','退款id'), +('mall4cloud-refund-076','1','1000','退款id'), +('mall4cloud-refund-077','1','1000','退款id'), +('mall4cloud-refund-078','1','1000','退款id'), +('mall4cloud-refund-079','1','1000','退款id'), +('mall4cloud-refund-080','1','1000','退款id'), +('mall4cloud-refund-081','1','1000','退款id'), +('mall4cloud-refund-082','1','1000','退款id'), +('mall4cloud-refund-083','1','1000','退款id'), +('mall4cloud-refund-084','1','1000','退款id'), +('mall4cloud-refund-085','1','1000','退款id'), +('mall4cloud-refund-086','1','1000','退款id'), +('mall4cloud-refund-087','1','1000','退款id'), +('mall4cloud-refund-088','1','1000','退款id'), +('mall4cloud-refund-089','1','1000','退款id'), +('mall4cloud-refund-090','1','1000','退款id'), +('mall4cloud-refund-091','1','1000','退款id'), +('mall4cloud-refund-092','1','1000','退款id'), +('mall4cloud-refund-093','1','1000','退款id'), +('mall4cloud-refund-094','1','1000','退款id'), +('mall4cloud-refund-095','1','1000','退款id'), +('mall4cloud-refund-096','1','1000','退款id'), +('mall4cloud-refund-097','1','1000','退款id'), +('mall4cloud-refund-098','1','1000','退款id'), +('mall4cloud-refund-099','1','1000','退款id'), +('mall4cloud-refund-100','1','1000','退款id'), +('mall4cloud-refund-101','1','1000','退款id'), +('mall4cloud-refund-102','1','1000','退款id'), +('mall4cloud-refund-103','1','1000','退款id'), +('mall4cloud-refund-104','1','1000','退款id'), +('mall4cloud-refund-105','1','1000','退款id'), +('mall4cloud-refund-106','1','1000','退款id'), +('mall4cloud-refund-107','1','1000','退款id'), +('mall4cloud-refund-108','1','1000','退款id'), +('mall4cloud-refund-109','1','1000','退款id'), +('mall4cloud-refund-110','1','1000','退款id'), +('mall4cloud-refund-111','1','1000','退款id'), +('mall4cloud-refund-112','1','1000','退款id'), +('mall4cloud-refund-113','1','1000','退款id'), +('mall4cloud-refund-114','1','1000','退款id'), +('mall4cloud-refund-115','1','1000','退款id'), +('mall4cloud-refund-116','1','1000','退款id'), +('mall4cloud-refund-117','1','1000','退款id'), +('mall4cloud-refund-118','1','1000','退款id'), +('mall4cloud-refund-119','1','1000','退款id'), +('mall4cloud-refund-120','1','1000','退款id'), +('mall4cloud-refund-121','1','1000','退款id'), +('mall4cloud-refund-122','1','1000','退款id'), +('mall4cloud-refund-123','1','1000','退款id'), +('mall4cloud-refund-124','1','1000','退款id'), +('mall4cloud-refund-125','1','1000','退款id'), +('mall4cloud-refund-126','1','1000','退款id'), +('mall4cloud-refund-127','1','1000','退款id'), +('mall4cloud-refund-128','1','1000','退款id'), +('mall4cloud-refund-129','1','1000','退款id'), +('mall4cloud-refund-130','1','1000','退款id'), +('mall4cloud-refund-131','1','1000','退款id'), +('mall4cloud-refund-132','1','1000','退款id'), +('mall4cloud-refund-133','1','1000','退款id'), +('mall4cloud-refund-134','1','1000','退款id'), +('mall4cloud-refund-135','1','1000','退款id'), +('mall4cloud-refund-136','1','1000','退款id'), +('mall4cloud-refund-137','1','1000','退款id'), +('mall4cloud-refund-138','1','1000','退款id'), +('mall4cloud-refund-139','1','1000','退款id'), +('mall4cloud-refund-140','1','1000','退款id'), +('mall4cloud-refund-141','1','1000','退款id'), +('mall4cloud-refund-142','1','1000','退款id'), +('mall4cloud-refund-143','1','1000','退款id'), +('mall4cloud-refund-144','1','1000','退款id'), +('mall4cloud-refund-145','1','1000','退款id'), +('mall4cloud-refund-146','1','1000','退款id'), +('mall4cloud-refund-147','1','1000','退款id'), +('mall4cloud-refund-148','1','1000','退款id'), +('mall4cloud-refund-149','1','1000','退款id'), +('mall4cloud-refund-150','1','1000','退款id'), +('mall4cloud-refund-151','1','1000','退款id'), +('mall4cloud-refund-152','1','1000','退款id'), +('mall4cloud-refund-153','1','1000','退款id'), +('mall4cloud-refund-154','1','1000','退款id'), +('mall4cloud-refund-155','1','1000','退款id'), +('mall4cloud-refund-156','1','1000','退款id'), +('mall4cloud-refund-157','1','1000','退款id'), +('mall4cloud-refund-158','1','1000','退款id'), +('mall4cloud-refund-159','1','1000','退款id'), +('mall4cloud-refund-160','1','1000','退款id'), +('mall4cloud-refund-161','1','1000','退款id'), +('mall4cloud-refund-162','1','1000','退款id'), +('mall4cloud-refund-163','1','1000','退款id'), +('mall4cloud-refund-164','1','1000','退款id'), +('mall4cloud-refund-165','1','1000','退款id'), +('mall4cloud-refund-166','1','1000','退款id'), +('mall4cloud-refund-167','1','1000','退款id'), +('mall4cloud-refund-168','1','1000','退款id'), +('mall4cloud-refund-169','1','1000','退款id'), +('mall4cloud-refund-170','1','1000','退款id'), +('mall4cloud-refund-171','1','1000','退款id'), +('mall4cloud-refund-172','1','1000','退款id'), +('mall4cloud-refund-173','1','1000','退款id'), +('mall4cloud-refund-174','1','1000','退款id'), +('mall4cloud-refund-175','1','1000','退款id'), +('mall4cloud-refund-176','1','1000','退款id'), +('mall4cloud-refund-177','1','1000','退款id'), +('mall4cloud-refund-178','1','1000','退款id'), +('mall4cloud-refund-179','1','1000','退款id'), +('mall4cloud-refund-180','1','1000','退款id'), +('mall4cloud-refund-181','1','1000','退款id'), +('mall4cloud-refund-182','1','1000','退款id'), +('mall4cloud-refund-183','1','1000','退款id'), +('mall4cloud-refund-184','1','1000','退款id'), +('mall4cloud-refund-185','1','1000','退款id'), +('mall4cloud-refund-186','1','1000','退款id'), +('mall4cloud-refund-187','1','1000','退款id'), +('mall4cloud-refund-188','1','1000','退款id'), +('mall4cloud-refund-189','1','1000','退款id'), +('mall4cloud-refund-190','1','1000','退款id'), +('mall4cloud-refund-191','1','1000','退款id'), +('mall4cloud-refund-192','1','1000','退款id'), +('mall4cloud-refund-193','1','1000','退款id'), +('mall4cloud-refund-194','1','1000','退款id'), +('mall4cloud-refund-195','1','1000','退款id'), +('mall4cloud-refund-196','1','1000','退款id'), +('mall4cloud-refund-197','1','1000','退款id'), +('mall4cloud-refund-198','1','1000','退款id'), +('mall4cloud-refund-199','1','1000','退款id'), +('mall4cloud-refund-200','1','1000','退款id'), +('mall4cloud-refund-201','1','1000','退款id'), +('mall4cloud-refund-202','1','1000','退款id'), +('mall4cloud-refund-203','1','1000','退款id'), +('mall4cloud-refund-204','1','1000','退款id'), +('mall4cloud-refund-205','1','1000','退款id'), +('mall4cloud-refund-206','1','1000','退款id'), +('mall4cloud-refund-207','1','1000','退款id'), +('mall4cloud-refund-208','1','1000','退款id'), +('mall4cloud-refund-209','1','1000','退款id'), +('mall4cloud-refund-210','1','1000','退款id'), +('mall4cloud-refund-211','1','1000','退款id'), +('mall4cloud-refund-212','1','1000','退款id'), +('mall4cloud-refund-213','1','1000','退款id'), +('mall4cloud-refund-214','1','1000','退款id'), +('mall4cloud-refund-215','1','1000','退款id'), +('mall4cloud-refund-216','1','1000','退款id'), +('mall4cloud-refund-217','1','1000','退款id'), +('mall4cloud-refund-218','1','1000','退款id'), +('mall4cloud-refund-219','1','1000','退款id'), +('mall4cloud-refund-220','1','1000','退款id'), +('mall4cloud-refund-221','1','1000','退款id'), +('mall4cloud-refund-222','1','1000','退款id'), +('mall4cloud-refund-223','1','1000','退款id'), +('mall4cloud-refund-224','1','1000','退款id'), +('mall4cloud-refund-225','1','1000','退款id'), +('mall4cloud-refund-226','1','1000','退款id'), +('mall4cloud-refund-227','1','1000','退款id'), +('mall4cloud-refund-228','1','1000','退款id'), +('mall4cloud-refund-229','1','1000','退款id'), +('mall4cloud-refund-230','1','1000','退款id'), +('mall4cloud-refund-231','1','1000','退款id'), +('mall4cloud-refund-232','1','1000','退款id'), +('mall4cloud-refund-233','1','1000','退款id'), +('mall4cloud-refund-234','1','1000','退款id'), +('mall4cloud-refund-235','1','1000','退款id'), +('mall4cloud-refund-236','1','1000','退款id'), +('mall4cloud-refund-237','1','1000','退款id'), +('mall4cloud-refund-238','1','1000','退款id'), +('mall4cloud-refund-239','1','1000','退款id'), +('mall4cloud-refund-240','1','1000','退款id'), +('mall4cloud-refund-241','1','1000','退款id'), +('mall4cloud-refund-242','1','1000','退款id'), +('mall4cloud-refund-243','1','1000','退款id'), +('mall4cloud-refund-244','1','1000','退款id'), +('mall4cloud-refund-245','1','1000','退款id'), +('mall4cloud-refund-246','1','1000','退款id'), +('mall4cloud-refund-247','1','1000','退款id'), +('mall4cloud-refund-248','1','1000','退款id'), +('mall4cloud-refund-249','1','1000','退款id'), +('mall4cloud-refund-250','1','1000','退款id'), +('mall4cloud-refund-251','1','1000','退款id'), +('mall4cloud-refund-252','1','1000','退款id'), +('mall4cloud-refund-253','1','1000','退款id'), +('mall4cloud-refund-254','1','1000','退款id'), +('mall4cloud-refund-255','1','1000','退款id'), +('mall4cloud-refund-256','1','1000','退款id'), +('mall4cloud-refund-257','1','1000','退款id'), +('mall4cloud-refund-258','1','1000','退款id'), +('mall4cloud-refund-259','1','1000','退款id'), +('mall4cloud-refund-260','1','1000','退款id'), +('mall4cloud-refund-261','1','1000','退款id'), +('mall4cloud-refund-262','1','1000','退款id'), +('mall4cloud-refund-263','1','1000','退款id'), +('mall4cloud-refund-264','1','1000','退款id'), +('mall4cloud-refund-265','1','1000','退款id'), +('mall4cloud-refund-266','1','1000','退款id'), +('mall4cloud-refund-267','1','1000','退款id'), +('mall4cloud-refund-268','1','1000','退款id'), +('mall4cloud-refund-269','1','1000','退款id'), +('mall4cloud-refund-270','1','1000','退款id'), +('mall4cloud-refund-271','1','1000','退款id'), +('mall4cloud-refund-272','1','1000','退款id'), +('mall4cloud-refund-273','1','1000','退款id'), +('mall4cloud-refund-274','1','1000','退款id'), +('mall4cloud-refund-275','1','1000','退款id'), +('mall4cloud-refund-276','1','1000','退款id'), +('mall4cloud-refund-277','1','1000','退款id'), +('mall4cloud-refund-278','1','1000','退款id'), +('mall4cloud-refund-279','1','1000','退款id'), +('mall4cloud-refund-280','1','1000','退款id'), +('mall4cloud-refund-281','1','1000','退款id'), +('mall4cloud-refund-282','1','1000','退款id'), +('mall4cloud-refund-283','1','1000','退款id'), +('mall4cloud-refund-284','1','1000','退款id'), +('mall4cloud-refund-285','1','1000','退款id'), +('mall4cloud-refund-286','1','1000','退款id'), +('mall4cloud-refund-287','1','1000','退款id'), +('mall4cloud-refund-288','1','1000','退款id'), +('mall4cloud-refund-289','1','1000','退款id'), +('mall4cloud-refund-290','1','1000','退款id'), +('mall4cloud-refund-291','1','1000','退款id'), +('mall4cloud-refund-292','1','1000','退款id'), +('mall4cloud-refund-293','1','1000','退款id'), +('mall4cloud-refund-294','1','1000','退款id'), +('mall4cloud-refund-295','1','1000','退款id'), +('mall4cloud-refund-296','1','1000','退款id'), +('mall4cloud-refund-297','1','1000','退款id'), +('mall4cloud-refund-298','1','1000','退款id'), +('mall4cloud-refund-299','1','1000','退款id'), +('mall4cloud-refund-300','1','1000','退款id'), +('mall4cloud-refund-301','1','1000','退款id'), +('mall4cloud-refund-302','1','1000','退款id'), +('mall4cloud-refund-303','1','1000','退款id'), +('mall4cloud-refund-304','1','1000','退款id'), +('mall4cloud-refund-305','1','1000','退款id'), +('mall4cloud-refund-306','1','1000','退款id'), +('mall4cloud-refund-307','1','1000','退款id'), +('mall4cloud-refund-308','1','1000','退款id'), +('mall4cloud-refund-309','1','1000','退款id'), +('mall4cloud-refund-310','1','1000','退款id'), +('mall4cloud-refund-311','1','1000','退款id'), +('mall4cloud-refund-312','1','1000','退款id'), +('mall4cloud-refund-313','1','1000','退款id'), +('mall4cloud-refund-314','1','1000','退款id'), +('mall4cloud-refund-315','1','1000','退款id'), +('mall4cloud-refund-316','1','1000','退款id'), +('mall4cloud-refund-317','1','1000','退款id'), +('mall4cloud-refund-318','1','1000','退款id'), +('mall4cloud-refund-319','1','1000','退款id'), +('mall4cloud-refund-320','1','1000','退款id'), +('mall4cloud-refund-321','1','1000','退款id'), +('mall4cloud-refund-322','1','1000','退款id'), +('mall4cloud-refund-323','1','1000','退款id'), +('mall4cloud-refund-324','1','1000','退款id'), +('mall4cloud-refund-325','1','1000','退款id'), +('mall4cloud-refund-326','1','1000','退款id'), +('mall4cloud-refund-327','1','1000','退款id'), +('mall4cloud-refund-328','1','1000','退款id'), +('mall4cloud-refund-329','1','1000','退款id'), +('mall4cloud-refund-330','1','1000','退款id'), +('mall4cloud-refund-331','1','1000','退款id'), +('mall4cloud-refund-332','1','1000','退款id'), +('mall4cloud-refund-333','1','1000','退款id'), +('mall4cloud-refund-334','1','1000','退款id'), +('mall4cloud-refund-335','1','1000','退款id'), +('mall4cloud-refund-336','1','1000','退款id'), +('mall4cloud-refund-337','1','1000','退款id'), +('mall4cloud-refund-338','1','1000','退款id'), +('mall4cloud-refund-339','1','1000','退款id'), +('mall4cloud-refund-340','1','1000','退款id'), +('mall4cloud-refund-341','1','1000','退款id'), +('mall4cloud-refund-342','1','1000','退款id'), +('mall4cloud-refund-343','1','1000','退款id'), +('mall4cloud-refund-344','1','1000','退款id'), +('mall4cloud-refund-345','1','1000','退款id'), +('mall4cloud-refund-346','1','1000','退款id'), +('mall4cloud-refund-347','1','1000','退款id'), +('mall4cloud-refund-348','1','1000','退款id'), +('mall4cloud-refund-349','1','1000','退款id'), +('mall4cloud-refund-350','1','1000','退款id'), +('mall4cloud-refund-351','1','1000','退款id'), +('mall4cloud-refund-352','1','1000','退款id'), +('mall4cloud-refund-353','1','1000','退款id'), +('mall4cloud-refund-354','1','1000','退款id'), +('mall4cloud-refund-355','1','1000','退款id'), +('mall4cloud-refund-356','1','1000','退款id'), +('mall4cloud-refund-357','1','1000','退款id'), +('mall4cloud-refund-358','1','1000','退款id'), +('mall4cloud-refund-359','1','1000','退款id'), +('mall4cloud-refund-360','1','1000','退款id'), +('mall4cloud-refund-361','1','1000','退款id'), +('mall4cloud-refund-362','1','1000','退款id'), +('mall4cloud-refund-363','1','1000','退款id'), +('mall4cloud-refund-364','1','1000','退款id'), +('mall4cloud-refund-365','1','1000','退款id'), +('mall4cloud-refund-366','1','1000','退款id'), +('mall4cloud-refund-367','1','1000','退款id'), +('mall4cloud-refund-368','1','1000','退款id'), +('mall4cloud-refund-369','1','1000','退款id'), +('mall4cloud-refund-370','1','1000','退款id'), +('mall4cloud-refund-371','1','1000','退款id'), +('mall4cloud-refund-372','1','1000','退款id'), +('mall4cloud-refund-373','1','1000','退款id'), +('mall4cloud-refund-374','1','1000','退款id'), +('mall4cloud-refund-375','1','1000','退款id'), +('mall4cloud-refund-376','1','1000','退款id'), +('mall4cloud-refund-377','1','1000','退款id'), +('mall4cloud-refund-378','1','1000','退款id'), +('mall4cloud-refund-379','1','1000','退款id'), +('mall4cloud-refund-380','1','1000','退款id'), +('mall4cloud-refund-381','1','1000','退款id'), +('mall4cloud-refund-382','1','1000','退款id'), +('mall4cloud-refund-383','1','1000','退款id'), +('mall4cloud-refund-384','1','1000','退款id'), +('mall4cloud-refund-385','1','1000','退款id'), +('mall4cloud-refund-386','1','1000','退款id'), +('mall4cloud-refund-387','1','1000','退款id'), +('mall4cloud-refund-388','1','1000','退款id'), +('mall4cloud-refund-389','1','1000','退款id'), +('mall4cloud-refund-390','1','1000','退款id'), +('mall4cloud-refund-391','1','1000','退款id'), +('mall4cloud-refund-392','1','1000','退款id'), +('mall4cloud-refund-393','1','1000','退款id'), +('mall4cloud-refund-394','1','1000','退款id'), +('mall4cloud-refund-395','1','1000','退款id'), +('mall4cloud-refund-396','1','1000','退款id'), +('mall4cloud-refund-397','1','1000','退款id'), +('mall4cloud-refund-398','1','1000','退款id'), +('mall4cloud-refund-399','1','1000','退款id'), +('mall4cloud-refund-400','1','1000','退款id'), +('mall4cloud-refund-401','1','1000','退款id'), +('mall4cloud-refund-402','1','1000','退款id'), +('mall4cloud-refund-403','1','1000','退款id'), +('mall4cloud-refund-404','1','1000','退款id'), +('mall4cloud-refund-405','1','1000','退款id'), +('mall4cloud-refund-406','1','1000','退款id'), +('mall4cloud-refund-407','1','1000','退款id'), +('mall4cloud-refund-408','1','1000','退款id'), +('mall4cloud-refund-409','1','1000','退款id'), +('mall4cloud-refund-410','1','1000','退款id'), +('mall4cloud-refund-411','1','1000','退款id'), +('mall4cloud-refund-412','1','1000','退款id'), +('mall4cloud-refund-413','1','1000','退款id'), +('mall4cloud-refund-414','1','1000','退款id'), +('mall4cloud-refund-415','1','1000','退款id'), +('mall4cloud-refund-416','1','1000','退款id'), +('mall4cloud-refund-417','1','1000','退款id'), +('mall4cloud-refund-418','1','1000','退款id'), +('mall4cloud-refund-419','1','1000','退款id'), +('mall4cloud-refund-420','1','1000','退款id'), +('mall4cloud-refund-421','1','1000','退款id'), +('mall4cloud-refund-422','1','1000','退款id'), +('mall4cloud-refund-423','1','1000','退款id'), +('mall4cloud-refund-424','1','1000','退款id'), +('mall4cloud-refund-425','1','1000','退款id'), +('mall4cloud-refund-426','1','1000','退款id'), +('mall4cloud-refund-427','1','1000','退款id'), +('mall4cloud-refund-428','1','1000','退款id'), +('mall4cloud-refund-429','1','1000','退款id'), +('mall4cloud-refund-430','1','1000','退款id'), +('mall4cloud-refund-431','1','1000','退款id'), +('mall4cloud-refund-432','1','1000','退款id'), +('mall4cloud-refund-433','1','1000','退款id'), +('mall4cloud-refund-434','1','1000','退款id'), +('mall4cloud-refund-435','1','1000','退款id'), +('mall4cloud-refund-436','1','1000','退款id'), +('mall4cloud-refund-437','1','1000','退款id'), +('mall4cloud-refund-438','1','1000','退款id'), +('mall4cloud-refund-439','1','1000','退款id'), +('mall4cloud-refund-440','1','1000','退款id'), +('mall4cloud-refund-441','1','1000','退款id'), +('mall4cloud-refund-442','1','1000','退款id'), +('mall4cloud-refund-443','1','1000','退款id'), +('mall4cloud-refund-444','1','1000','退款id'), +('mall4cloud-refund-445','1','1000','退款id'), +('mall4cloud-refund-446','1','1000','退款id'), +('mall4cloud-refund-447','1','1000','退款id'), +('mall4cloud-refund-448','1','1000','退款id'), +('mall4cloud-refund-449','1','1000','退款id'), +('mall4cloud-refund-450','1','1000','退款id'), +('mall4cloud-refund-451','1','1000','退款id'), +('mall4cloud-refund-452','1','1000','退款id'), +('mall4cloud-refund-453','1','1000','退款id'), +('mall4cloud-refund-454','1','1000','退款id'), +('mall4cloud-refund-455','1','1000','退款id'), +('mall4cloud-refund-456','1','1000','退款id'), +('mall4cloud-refund-457','1','1000','退款id'), +('mall4cloud-refund-458','1','1000','退款id'), +('mall4cloud-refund-459','1','1000','退款id'), +('mall4cloud-refund-460','1','1000','退款id'), +('mall4cloud-refund-461','1','1000','退款id'), +('mall4cloud-refund-462','1','1000','退款id'), +('mall4cloud-refund-463','1','1000','退款id'), +('mall4cloud-refund-464','1','1000','退款id'), +('mall4cloud-refund-465','1','1000','退款id'), +('mall4cloud-refund-466','1','1000','退款id'), +('mall4cloud-refund-467','1','1000','退款id'), +('mall4cloud-refund-468','1','1000','退款id'), +('mall4cloud-refund-469','1','1000','退款id'), +('mall4cloud-refund-470','1','1000','退款id'), +('mall4cloud-refund-471','1','1000','退款id'), +('mall4cloud-refund-472','1','1000','退款id'), +('mall4cloud-refund-473','1','1000','退款id'), +('mall4cloud-refund-474','1','1000','退款id'), +('mall4cloud-refund-475','1','1000','退款id'), +('mall4cloud-refund-476','1','1000','退款id'), +('mall4cloud-refund-477','1','1000','退款id'), +('mall4cloud-refund-478','1','1000','退款id'), +('mall4cloud-refund-479','1','1000','退款id'), +('mall4cloud-refund-480','1','1000','退款id'), +('mall4cloud-refund-481','1','1000','退款id'), +('mall4cloud-refund-482','1','1000','退款id'), +('mall4cloud-refund-483','1','1000','退款id'), +('mall4cloud-refund-484','1','1000','退款id'), +('mall4cloud-refund-485','1','1000','退款id'), +('mall4cloud-refund-486','1','1000','退款id'), +('mall4cloud-refund-487','1','1000','退款id'), +('mall4cloud-refund-488','1','1000','退款id'), +('mall4cloud-refund-489','1','1000','退款id'), +('mall4cloud-refund-490','1','1000','退款id'), +('mall4cloud-refund-491','1','1000','退款id'), +('mall4cloud-refund-492','1','1000','退款id'), +('mall4cloud-refund-493','1','1000','退款id'), +('mall4cloud-refund-494','1','1000','退款id'), +('mall4cloud-refund-495','1','1000','退款id'), +('mall4cloud-refund-496','1','1000','退款id'), +('mall4cloud-refund-497','1','1000','退款id'), +('mall4cloud-refund-498','1','1000','退款id'), +('mall4cloud-refund-499','1','1000','退款id'), +('mall4cloud-refund-500','1','1000','退款id'), +('mall4cloud-refund-501','1','1000','退款id'), +('mall4cloud-refund-502','1','1000','退款id'), +('mall4cloud-refund-503','1','1000','退款id'), +('mall4cloud-refund-504','1','1000','退款id'), +('mall4cloud-refund-505','1','1000','退款id'), +('mall4cloud-refund-506','1','1000','退款id'), +('mall4cloud-refund-507','1','1000','退款id'), +('mall4cloud-refund-508','1','1000','退款id'), +('mall4cloud-refund-509','1','1000','退款id'), +('mall4cloud-refund-510','1','1000','退款id'), +('mall4cloud-refund-511','1','1000','退款id'), +('mall4cloud-refund-512','1','1000','退款id'), +('mall4cloud-refund-513','1','1000','退款id'), +('mall4cloud-refund-514','1','1000','退款id'), +('mall4cloud-refund-515','1','1000','退款id'), +('mall4cloud-refund-516','1','1000','退款id'), +('mall4cloud-refund-517','1','1000','退款id'), +('mall4cloud-refund-518','1','1000','退款id'), +('mall4cloud-refund-519','1','1000','退款id'), +('mall4cloud-refund-520','1','1000','退款id'), +('mall4cloud-refund-521','1','1000','退款id'), +('mall4cloud-refund-522','1','1000','退款id'), +('mall4cloud-refund-523','1','1000','退款id'), +('mall4cloud-refund-524','1','1000','退款id'), +('mall4cloud-refund-525','1','1000','退款id'), +('mall4cloud-refund-526','1','1000','退款id'), +('mall4cloud-refund-527','1','1000','退款id'), +('mall4cloud-refund-528','1','1000','退款id'), +('mall4cloud-refund-529','1','1000','退款id'), +('mall4cloud-refund-530','1','1000','退款id'), +('mall4cloud-refund-531','1','1000','退款id'), +('mall4cloud-refund-532','1','1000','退款id'), +('mall4cloud-refund-533','1','1000','退款id'), +('mall4cloud-refund-534','1','1000','退款id'), +('mall4cloud-refund-535','1','1000','退款id'), +('mall4cloud-refund-536','1','1000','退款id'), +('mall4cloud-refund-537','1','1000','退款id'), +('mall4cloud-refund-538','1','1000','退款id'), +('mall4cloud-refund-539','1','1000','退款id'), +('mall4cloud-refund-540','1','1000','退款id'), +('mall4cloud-refund-541','1','1000','退款id'), +('mall4cloud-refund-542','1','1000','退款id'), +('mall4cloud-refund-543','1','1000','退款id'), +('mall4cloud-refund-544','1','1000','退款id'), +('mall4cloud-refund-545','1','1000','退款id'), +('mall4cloud-refund-546','1','1000','退款id'), +('mall4cloud-refund-547','1','1000','退款id'), +('mall4cloud-refund-548','1','1000','退款id'), +('mall4cloud-refund-549','1','1000','退款id'), +('mall4cloud-refund-550','1','1000','退款id'), +('mall4cloud-refund-551','1','1000','退款id'), +('mall4cloud-refund-552','1','1000','退款id'), +('mall4cloud-refund-553','1','1000','退款id'), +('mall4cloud-refund-554','1','1000','退款id'), +('mall4cloud-refund-555','1','1000','退款id'), +('mall4cloud-refund-556','1','1000','退款id'), +('mall4cloud-refund-557','1','1000','退款id'), +('mall4cloud-refund-558','1','1000','退款id'), +('mall4cloud-refund-559','1','1000','退款id'), +('mall4cloud-refund-560','1','1000','退款id'), +('mall4cloud-refund-561','1','1000','退款id'), +('mall4cloud-refund-562','1','1000','退款id'), +('mall4cloud-refund-563','1','1000','退款id'), +('mall4cloud-refund-564','1','1000','退款id'), +('mall4cloud-refund-565','1','1000','退款id'), +('mall4cloud-refund-566','1','1000','退款id'), +('mall4cloud-refund-567','1','1000','退款id'), +('mall4cloud-refund-568','1','1000','退款id'), +('mall4cloud-refund-569','1','1000','退款id'), +('mall4cloud-refund-570','1','1000','退款id'), +('mall4cloud-refund-571','1','1000','退款id'), +('mall4cloud-refund-572','1','1000','退款id'), +('mall4cloud-refund-573','1','1000','退款id'), +('mall4cloud-refund-574','1','1000','退款id'), +('mall4cloud-refund-575','1','1000','退款id'), +('mall4cloud-refund-576','1','1000','退款id'), +('mall4cloud-refund-577','1','1000','退款id'), +('mall4cloud-refund-578','1','1000','退款id'), +('mall4cloud-refund-579','1','1000','退款id'), +('mall4cloud-refund-580','1','1000','退款id'), +('mall4cloud-refund-581','1','1000','退款id'), +('mall4cloud-refund-582','1','1000','退款id'), +('mall4cloud-refund-583','1','1000','退款id'), +('mall4cloud-refund-584','1','1000','退款id'), +('mall4cloud-refund-585','1','1000','退款id'), +('mall4cloud-refund-586','1','1000','退款id'), +('mall4cloud-refund-587','1','1000','退款id'), +('mall4cloud-refund-588','1','1000','退款id'), +('mall4cloud-refund-589','1','1000','退款id'), +('mall4cloud-refund-590','1','1000','退款id'), +('mall4cloud-refund-591','1','1000','退款id'), +('mall4cloud-refund-592','1','1000','退款id'), +('mall4cloud-refund-593','1','1000','退款id'), +('mall4cloud-refund-594','1','1000','退款id'), +('mall4cloud-refund-595','1','1000','退款id'), +('mall4cloud-refund-596','1','1000','退款id'), +('mall4cloud-refund-597','1','1000','退款id'), +('mall4cloud-refund-598','1','1000','退款id'), +('mall4cloud-refund-599','1','1000','退款id'), +('mall4cloud-refund-600','1','1000','退款id'), +('mall4cloud-refund-601','1','1000','退款id'), +('mall4cloud-refund-602','1','1000','退款id'), +('mall4cloud-refund-603','1','1000','退款id'), +('mall4cloud-refund-604','1','1000','退款id'), +('mall4cloud-refund-605','1','1000','退款id'), +('mall4cloud-refund-606','1','1000','退款id'), +('mall4cloud-refund-607','1','1000','退款id'), +('mall4cloud-refund-608','1','1000','退款id'), +('mall4cloud-refund-609','1','1000','退款id'), +('mall4cloud-refund-610','1','1000','退款id'), +('mall4cloud-refund-611','1','1000','退款id'), +('mall4cloud-refund-612','1','1000','退款id'), +('mall4cloud-refund-613','1','1000','退款id'), +('mall4cloud-refund-614','1','1000','退款id'), +('mall4cloud-refund-615','1','1000','退款id'), +('mall4cloud-refund-616','1','1000','退款id'), +('mall4cloud-refund-617','1','1000','退款id'), +('mall4cloud-refund-618','1','1000','退款id'), +('mall4cloud-refund-619','1','1000','退款id'), +('mall4cloud-refund-620','1','1000','退款id'), +('mall4cloud-refund-621','1','1000','退款id'), +('mall4cloud-refund-622','1','1000','退款id'), +('mall4cloud-refund-623','1','1000','退款id'), +('mall4cloud-refund-624','1','1000','退款id'), +('mall4cloud-refund-625','1','1000','退款id'), +('mall4cloud-refund-626','1','1000','退款id'), +('mall4cloud-refund-627','1','1000','退款id'), +('mall4cloud-refund-628','1','1000','退款id'), +('mall4cloud-refund-629','1','1000','退款id'), +('mall4cloud-refund-630','1','1000','退款id'), +('mall4cloud-refund-631','1','1000','退款id'), +('mall4cloud-refund-632','1','1000','退款id'), +('mall4cloud-refund-633','1','1000','退款id'), +('mall4cloud-refund-634','1','1000','退款id'), +('mall4cloud-refund-635','1','1000','退款id'), +('mall4cloud-refund-636','1','1000','退款id'), +('mall4cloud-refund-637','1','1000','退款id'), +('mall4cloud-refund-638','1','1000','退款id'), +('mall4cloud-refund-639','1','1000','退款id'), +('mall4cloud-refund-640','1','1000','退款id'), +('mall4cloud-refund-641','1','1000','退款id'), +('mall4cloud-refund-642','1','1000','退款id'), +('mall4cloud-refund-643','1','1000','退款id'), +('mall4cloud-refund-644','1','1000','退款id'), +('mall4cloud-refund-645','1','1000','退款id'), +('mall4cloud-refund-646','1','1000','退款id'), +('mall4cloud-refund-647','1','1000','退款id'), +('mall4cloud-refund-648','1','1000','退款id'), +('mall4cloud-refund-649','1','1000','退款id'), +('mall4cloud-refund-650','1','1000','退款id'), +('mall4cloud-refund-651','1','1000','退款id'), +('mall4cloud-refund-652','1','1000','退款id'), +('mall4cloud-refund-653','1','1000','退款id'), +('mall4cloud-refund-654','1','1000','退款id'), +('mall4cloud-refund-655','1','1000','退款id'), +('mall4cloud-refund-656','1','1000','退款id'), +('mall4cloud-refund-657','1','1000','退款id'), +('mall4cloud-refund-658','1','1000','退款id'), +('mall4cloud-refund-659','1','1000','退款id'), +('mall4cloud-refund-660','1','1000','退款id'), +('mall4cloud-refund-661','1','1000','退款id'), +('mall4cloud-refund-662','1','1000','退款id'), +('mall4cloud-refund-663','1','1000','退款id'), +('mall4cloud-refund-664','1','1000','退款id'), +('mall4cloud-refund-665','1','1000','退款id'), +('mall4cloud-refund-666','1','1000','退款id'), +('mall4cloud-refund-667','1','1000','退款id'), +('mall4cloud-refund-668','1','1000','退款id'), +('mall4cloud-refund-669','1','1000','退款id'), +('mall4cloud-refund-670','1','1000','退款id'), +('mall4cloud-refund-671','1','1000','退款id'), +('mall4cloud-refund-672','1','1000','退款id'), +('mall4cloud-refund-673','1','1000','退款id'), +('mall4cloud-refund-674','1','1000','退款id'), +('mall4cloud-refund-675','1','1000','退款id'), +('mall4cloud-refund-676','1','1000','退款id'), +('mall4cloud-refund-677','1','1000','退款id'), +('mall4cloud-refund-678','1','1000','退款id'), +('mall4cloud-refund-679','1','1000','退款id'), +('mall4cloud-refund-680','1','1000','退款id'), +('mall4cloud-refund-681','1','1000','退款id'), +('mall4cloud-refund-682','1','1000','退款id'), +('mall4cloud-refund-683','1','1000','退款id'), +('mall4cloud-refund-684','1','1000','退款id'), +('mall4cloud-refund-685','1','1000','退款id'), +('mall4cloud-refund-686','1','1000','退款id'), +('mall4cloud-refund-687','1','1000','退款id'), +('mall4cloud-refund-688','1','1000','退款id'), +('mall4cloud-refund-689','1','1000','退款id'), +('mall4cloud-refund-690','1','1000','退款id'), +('mall4cloud-refund-691','1','1000','退款id'), +('mall4cloud-refund-692','1','1000','退款id'), +('mall4cloud-refund-693','1','1000','退款id'), +('mall4cloud-refund-694','1','1000','退款id'), +('mall4cloud-refund-695','1','1000','退款id'), +('mall4cloud-refund-696','1','1000','退款id'), +('mall4cloud-refund-697','1','1000','退款id'), +('mall4cloud-refund-698','1','1000','退款id'), +('mall4cloud-refund-699','1','1000','退款id'), +('mall4cloud-refund-700','1','1000','退款id'), +('mall4cloud-refund-701','1','1000','退款id'), +('mall4cloud-refund-702','1','1000','退款id'), +('mall4cloud-refund-703','1','1000','退款id'), +('mall4cloud-refund-704','1','1000','退款id'), +('mall4cloud-refund-705','1','1000','退款id'), +('mall4cloud-refund-706','1','1000','退款id'), +('mall4cloud-refund-707','1','1000','退款id'), +('mall4cloud-refund-708','1','1000','退款id'), +('mall4cloud-refund-709','1','1000','退款id'), +('mall4cloud-refund-710','1','1000','退款id'), +('mall4cloud-refund-711','1','1000','退款id'), +('mall4cloud-refund-712','1','1000','退款id'), +('mall4cloud-refund-713','1','1000','退款id'), +('mall4cloud-refund-714','1','1000','退款id'), +('mall4cloud-refund-715','1','1000','退款id'), +('mall4cloud-refund-716','1','1000','退款id'), +('mall4cloud-refund-717','1','1000','退款id'), +('mall4cloud-refund-718','1','1000','退款id'), +('mall4cloud-refund-719','1','1000','退款id'), +('mall4cloud-refund-720','1','1000','退款id'), +('mall4cloud-refund-721','1','1000','退款id'), +('mall4cloud-refund-722','1','1000','退款id'), +('mall4cloud-refund-723','1','1000','退款id'), +('mall4cloud-refund-724','1','1000','退款id'), +('mall4cloud-refund-725','1','1000','退款id'), +('mall4cloud-refund-726','1','1000','退款id'), +('mall4cloud-refund-727','1','1000','退款id'), +('mall4cloud-refund-728','1','1000','退款id'), +('mall4cloud-refund-729','1','1000','退款id'), +('mall4cloud-refund-730','1','1000','退款id'), +('mall4cloud-refund-731','1','1000','退款id'), +('mall4cloud-refund-732','1','1000','退款id'), +('mall4cloud-refund-733','1','1000','退款id'), +('mall4cloud-refund-734','1','1000','退款id'), +('mall4cloud-refund-735','1','1000','退款id'), +('mall4cloud-refund-736','1','1000','退款id'), +('mall4cloud-refund-737','1','1000','退款id'), +('mall4cloud-refund-738','1','1000','退款id'), +('mall4cloud-refund-739','1','1000','退款id'), +('mall4cloud-refund-740','1','1000','退款id'), +('mall4cloud-refund-741','1','1000','退款id'), +('mall4cloud-refund-742','1','1000','退款id'), +('mall4cloud-refund-743','1','1000','退款id'), +('mall4cloud-refund-744','1','1000','退款id'), +('mall4cloud-refund-745','1','1000','退款id'), +('mall4cloud-refund-746','1','1000','退款id'), +('mall4cloud-refund-747','1','1000','退款id'), +('mall4cloud-refund-748','1','1000','退款id'), +('mall4cloud-refund-749','1','1000','退款id'), +('mall4cloud-refund-750','1','1000','退款id'), +('mall4cloud-refund-751','1','1000','退款id'), +('mall4cloud-refund-752','1','1000','退款id'), +('mall4cloud-refund-753','1','1000','退款id'), +('mall4cloud-refund-754','1','1000','退款id'), +('mall4cloud-refund-755','1','1000','退款id'), +('mall4cloud-refund-756','1','1000','退款id'), +('mall4cloud-refund-757','1','1000','退款id'), +('mall4cloud-refund-758','1','1000','退款id'), +('mall4cloud-refund-759','1','1000','退款id'), +('mall4cloud-refund-760','1','1000','退款id'), +('mall4cloud-refund-761','1','1000','退款id'), +('mall4cloud-refund-762','1','1000','退款id'), +('mall4cloud-refund-763','1','1000','退款id'), +('mall4cloud-refund-764','1','1000','退款id'), +('mall4cloud-refund-765','1','1000','退款id'), +('mall4cloud-refund-766','1','1000','退款id'), +('mall4cloud-refund-767','1','1000','退款id'), +('mall4cloud-refund-768','1','1000','退款id'), +('mall4cloud-refund-769','1','1000','退款id'), +('mall4cloud-refund-770','1','1000','退款id'), +('mall4cloud-refund-771','1','1000','退款id'), +('mall4cloud-refund-772','1','1000','退款id'), +('mall4cloud-refund-773','1','1000','退款id'), +('mall4cloud-refund-774','1','1000','退款id'), +('mall4cloud-refund-775','1','1000','退款id'), +('mall4cloud-refund-776','1','1000','退款id'), +('mall4cloud-refund-777','1','1000','退款id'), +('mall4cloud-refund-778','1','1000','退款id'), +('mall4cloud-refund-779','1','1000','退款id'), +('mall4cloud-refund-780','1','1000','退款id'), +('mall4cloud-refund-781','1','1000','退款id'), +('mall4cloud-refund-782','1','1000','退款id'), +('mall4cloud-refund-783','1','1000','退款id'), +('mall4cloud-refund-784','1','1000','退款id'), +('mall4cloud-refund-785','1','1000','退款id'), +('mall4cloud-refund-786','1','1000','退款id'), +('mall4cloud-refund-787','1','1000','退款id'), +('mall4cloud-refund-788','1','1000','退款id'), +('mall4cloud-refund-789','1','1000','退款id'), +('mall4cloud-refund-790','1','1000','退款id'), +('mall4cloud-refund-791','1','1000','退款id'), +('mall4cloud-refund-792','1','1000','退款id'), +('mall4cloud-refund-793','1','1000','退款id'), +('mall4cloud-refund-794','1','1000','退款id'), +('mall4cloud-refund-795','1','1000','退款id'), +('mall4cloud-refund-796','1','1000','退款id'), +('mall4cloud-refund-797','1','1000','退款id'), +('mall4cloud-refund-798','1','1000','退款id'), +('mall4cloud-refund-799','1','1000','退款id'), +('mall4cloud-refund-800','1','1000','退款id'), +('mall4cloud-refund-801','1','1000','退款id'), +('mall4cloud-refund-802','1','1000','退款id'), +('mall4cloud-refund-803','1','1000','退款id'), +('mall4cloud-refund-804','1','1000','退款id'), +('mall4cloud-refund-805','1','1000','退款id'), +('mall4cloud-refund-806','1','1000','退款id'), +('mall4cloud-refund-807','1','1000','退款id'), +('mall4cloud-refund-808','1','1000','退款id'), +('mall4cloud-refund-809','1','1000','退款id'), +('mall4cloud-refund-810','1','1000','退款id'), +('mall4cloud-refund-811','1','1000','退款id'), +('mall4cloud-refund-812','1','1000','退款id'), +('mall4cloud-refund-813','1','1000','退款id'), +('mall4cloud-refund-814','1','1000','退款id'), +('mall4cloud-refund-815','1','1000','退款id'), +('mall4cloud-refund-816','1','1000','退款id'), +('mall4cloud-refund-817','1','1000','退款id'), +('mall4cloud-refund-818','1','1000','退款id'), +('mall4cloud-refund-819','1','1000','退款id'), +('mall4cloud-refund-820','1','1000','退款id'), +('mall4cloud-refund-821','1','1000','退款id'), +('mall4cloud-refund-822','1','1000','退款id'), +('mall4cloud-refund-823','1','1000','退款id'), +('mall4cloud-refund-824','1','1000','退款id'), +('mall4cloud-refund-825','1','1000','退款id'), +('mall4cloud-refund-826','1','1000','退款id'), +('mall4cloud-refund-827','1','1000','退款id'), +('mall4cloud-refund-828','1','1000','退款id'), +('mall4cloud-refund-829','1','1000','退款id'), +('mall4cloud-refund-830','1','1000','退款id'), +('mall4cloud-refund-831','1','1000','退款id'), +('mall4cloud-refund-832','1','1000','退款id'), +('mall4cloud-refund-833','1','1000','退款id'), +('mall4cloud-refund-834','1','1000','退款id'), +('mall4cloud-refund-835','1','1000','退款id'), +('mall4cloud-refund-836','1','1000','退款id'), +('mall4cloud-refund-837','1','1000','退款id'), +('mall4cloud-refund-838','1','1000','退款id'), +('mall4cloud-refund-839','1','1000','退款id'), +('mall4cloud-refund-840','1','1000','退款id'), +('mall4cloud-refund-841','1','1000','退款id'), +('mall4cloud-refund-842','1','1000','退款id'), +('mall4cloud-refund-843','1','1000','退款id'), +('mall4cloud-refund-844','1','1000','退款id'), +('mall4cloud-refund-845','1','1000','退款id'), +('mall4cloud-refund-846','1','1000','退款id'), +('mall4cloud-refund-847','1','1000','退款id'), +('mall4cloud-refund-848','1','1000','退款id'), +('mall4cloud-refund-849','1','1000','退款id'), +('mall4cloud-refund-850','1','1000','退款id'), +('mall4cloud-refund-851','1','1000','退款id'), +('mall4cloud-refund-852','1','1000','退款id'), +('mall4cloud-refund-853','1','1000','退款id'), +('mall4cloud-refund-854','1','1000','退款id'), +('mall4cloud-refund-855','1','1000','退款id'), +('mall4cloud-refund-856','1','1000','退款id'), +('mall4cloud-refund-857','1','1000','退款id'), +('mall4cloud-refund-858','1','1000','退款id'), +('mall4cloud-refund-859','1','1000','退款id'), +('mall4cloud-refund-860','1','1000','退款id'), +('mall4cloud-refund-861','1','1000','退款id'), +('mall4cloud-refund-862','1','1000','退款id'), +('mall4cloud-refund-863','1','1000','退款id'), +('mall4cloud-refund-864','1','1000','退款id'), +('mall4cloud-refund-865','1','1000','退款id'), +('mall4cloud-refund-866','1','1000','退款id'), +('mall4cloud-refund-867','1','1000','退款id'), +('mall4cloud-refund-868','1','1000','退款id'), +('mall4cloud-refund-869','1','1000','退款id'), +('mall4cloud-refund-870','1','1000','退款id'), +('mall4cloud-refund-871','1','1000','退款id'), +('mall4cloud-refund-872','1','1000','退款id'), +('mall4cloud-refund-873','1','1000','退款id'), +('mall4cloud-refund-874','1','1000','退款id'), +('mall4cloud-refund-875','1','1000','退款id'), +('mall4cloud-refund-876','1','1000','退款id'), +('mall4cloud-refund-877','1','1000','退款id'), +('mall4cloud-refund-878','1','1000','退款id'), +('mall4cloud-refund-879','1','1000','退款id'), +('mall4cloud-refund-880','1','1000','退款id'), +('mall4cloud-refund-881','1','1000','退款id'), +('mall4cloud-refund-882','1','1000','退款id'), +('mall4cloud-refund-883','1','1000','退款id'), +('mall4cloud-refund-884','1','1000','退款id'), +('mall4cloud-refund-885','1','1000','退款id'), +('mall4cloud-refund-886','1','1000','退款id'), +('mall4cloud-refund-887','1','1000','退款id'), +('mall4cloud-refund-888','1','1000','退款id'), +('mall4cloud-refund-889','1','1000','退款id'), +('mall4cloud-refund-890','1','1000','退款id'), +('mall4cloud-refund-891','1','1000','退款id'), +('mall4cloud-refund-892','1','1000','退款id'), +('mall4cloud-refund-893','1','1000','退款id'), +('mall4cloud-refund-894','1','1000','退款id'), +('mall4cloud-refund-895','1','1000','退款id'), +('mall4cloud-refund-896','1','1000','退款id'), +('mall4cloud-refund-897','1','1000','退款id'), +('mall4cloud-refund-898','1','1000','退款id'), +('mall4cloud-refund-899','1','1000','退款id'), +('mall4cloud-refund-900','1','1000','退款id'), +('mall4cloud-refund-901','1','1000','退款id'), +('mall4cloud-refund-902','1','1000','退款id'), +('mall4cloud-refund-903','1','1000','退款id'), +('mall4cloud-refund-904','1','1000','退款id'), +('mall4cloud-refund-905','1','1000','退款id'), +('mall4cloud-refund-906','1','1000','退款id'), +('mall4cloud-refund-907','1','1000','退款id'), +('mall4cloud-refund-908','1','1000','退款id'), +('mall4cloud-refund-909','1','1000','退款id'), +('mall4cloud-refund-910','1','1000','退款id'), +('mall4cloud-refund-911','1','1000','退款id'), +('mall4cloud-refund-912','1','1000','退款id'), +('mall4cloud-refund-913','1','1000','退款id'), +('mall4cloud-refund-914','1','1000','退款id'), +('mall4cloud-refund-915','1','1000','退款id'), +('mall4cloud-refund-916','1','1000','退款id'), +('mall4cloud-refund-917','1','1000','退款id'), +('mall4cloud-refund-918','1','1000','退款id'), +('mall4cloud-refund-919','1','1000','退款id'), +('mall4cloud-refund-920','1','1000','退款id'), +('mall4cloud-refund-921','1','1000','退款id'), +('mall4cloud-refund-922','1','1000','退款id'), +('mall4cloud-refund-923','1','1000','退款id'), +('mall4cloud-refund-924','1','1000','退款id'), +('mall4cloud-refund-925','1','1000','退款id'), +('mall4cloud-refund-926','1','1000','退款id'), +('mall4cloud-refund-927','1','1000','退款id'), +('mall4cloud-refund-928','1','1000','退款id'), +('mall4cloud-refund-929','1','1000','退款id'), +('mall4cloud-refund-930','1','1000','退款id'), +('mall4cloud-refund-931','1','1000','退款id'), +('mall4cloud-refund-932','1','1000','退款id'), +('mall4cloud-refund-933','1','1000','退款id'), +('mall4cloud-refund-934','1','1000','退款id'), +('mall4cloud-refund-935','1','1000','退款id'), +('mall4cloud-refund-936','1','1000','退款id'), +('mall4cloud-refund-937','1','1000','退款id'), +('mall4cloud-refund-938','1','1000','退款id'), +('mall4cloud-refund-939','1','1000','退款id'), +('mall4cloud-refund-940','1','1000','退款id'), +('mall4cloud-refund-941','1','1000','退款id'), +('mall4cloud-refund-942','1','1000','退款id'), +('mall4cloud-refund-943','1','1000','退款id'), +('mall4cloud-refund-944','1','1000','退款id'), +('mall4cloud-refund-945','1','1000','退款id'), +('mall4cloud-refund-946','1','1000','退款id'), +('mall4cloud-refund-947','1','1000','退款id'), +('mall4cloud-refund-948','1','1000','退款id'), +('mall4cloud-refund-949','1','1000','退款id'), +('mall4cloud-refund-950','1','1000','退款id'), +('mall4cloud-refund-951','1','1000','退款id'), +('mall4cloud-refund-952','1','1000','退款id'), +('mall4cloud-refund-953','1','1000','退款id'), +('mall4cloud-refund-954','1','1000','退款id'), +('mall4cloud-refund-955','1','1000','退款id'), +('mall4cloud-refund-956','1','1000','退款id'), +('mall4cloud-refund-957','1','1000','退款id'), +('mall4cloud-refund-958','1','1000','退款id'), +('mall4cloud-refund-959','1','1000','退款id'), +('mall4cloud-refund-960','1','1000','退款id'), +('mall4cloud-refund-961','1','1000','退款id'), +('mall4cloud-refund-962','1','1000','退款id'), +('mall4cloud-refund-963','1','1000','退款id'), +('mall4cloud-refund-964','1','1000','退款id'), +('mall4cloud-refund-965','1','1000','退款id'), +('mall4cloud-refund-966','1','1000','退款id'), +('mall4cloud-refund-967','1','1000','退款id'), +('mall4cloud-refund-968','1','1000','退款id'), +('mall4cloud-refund-969','1','1000','退款id'), +('mall4cloud-refund-970','1','1000','退款id'), +('mall4cloud-refund-971','1','1000','退款id'), +('mall4cloud-refund-972','1','1000','退款id'), +('mall4cloud-refund-973','1','1000','退款id'), +('mall4cloud-refund-974','1','1000','退款id'), +('mall4cloud-refund-975','1','1000','退款id'), +('mall4cloud-refund-976','1','1000','退款id'), +('mall4cloud-refund-977','1','1000','退款id'), +('mall4cloud-refund-978','1','1000','退款id'), +('mall4cloud-refund-979','1','1000','退款id'), +('mall4cloud-refund-980','1','1000','退款id'), +('mall4cloud-refund-981','1','1000','退款id'), +('mall4cloud-refund-982','1','1000','退款id'), +('mall4cloud-refund-983','1','1000','退款id'), +('mall4cloud-refund-984','1','1000','退款id'), +('mall4cloud-refund-985','1','1000','退款id'), +('mall4cloud-refund-986','1','1000','退款id'), +('mall4cloud-refund-987','1','1000','退款id'), +('mall4cloud-refund-988','1','1000','退款id'), +('mall4cloud-refund-989','1','1000','退款id'), +('mall4cloud-refund-990','1','1000','退款id'), +('mall4cloud-refund-991','1','1000','退款id'), +('mall4cloud-refund-992','1','1000','退款id'), +('mall4cloud-refund-993','1','1000','退款id'), +('mall4cloud-refund-994','1','1000','退款id'), +('mall4cloud-refund-995','1','1000','退款id'), +('mall4cloud-refund-996','1','1000','退款id'), +('mall4cloud-refund-997','1','1000','退款id'), +('mall4cloud-refund-998','1','1000','退款id'), +('mall4cloud-refund-999','1','1000','退款id'), +('mall4cloud-withdraw-cash-000','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-001','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-002','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-003','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-004','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-005','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-006','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-007','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-008','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-009','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-010','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-011','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-012','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-013','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-014','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-015','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-016','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-017','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-018','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-019','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-020','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-021','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-022','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-023','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-024','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-025','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-026','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-027','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-028','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-029','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-030','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-031','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-032','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-033','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-034','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-035','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-036','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-037','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-038','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-039','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-040','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-041','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-042','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-043','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-044','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-045','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-046','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-047','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-048','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-049','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-050','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-051','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-052','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-053','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-054','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-055','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-056','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-057','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-058','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-059','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-060','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-061','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-062','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-063','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-064','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-065','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-066','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-067','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-068','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-069','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-070','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-071','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-072','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-073','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-074','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-075','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-076','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-077','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-078','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-079','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-080','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-081','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-082','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-083','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-084','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-085','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-086','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-087','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-088','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-089','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-090','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-091','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-092','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-093','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-094','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-095','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-096','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-097','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-098','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-099','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-100','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-101','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-102','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-103','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-104','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-105','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-106','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-107','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-108','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-109','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-110','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-111','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-112','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-113','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-114','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-115','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-116','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-117','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-118','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-119','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-120','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-121','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-122','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-123','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-124','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-125','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-126','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-127','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-128','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-129','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-130','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-131','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-132','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-133','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-134','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-135','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-136','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-137','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-138','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-139','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-140','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-141','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-142','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-143','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-144','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-145','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-146','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-147','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-148','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-149','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-150','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-151','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-152','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-153','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-154','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-155','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-156','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-157','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-158','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-159','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-160','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-161','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-162','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-163','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-164','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-165','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-166','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-167','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-168','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-169','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-170','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-171','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-172','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-173','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-174','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-175','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-176','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-177','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-178','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-179','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-180','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-181','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-182','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-183','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-184','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-185','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-186','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-187','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-188','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-189','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-190','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-191','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-192','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-193','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-194','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-195','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-196','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-197','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-198','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-199','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-200','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-201','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-202','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-203','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-204','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-205','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-206','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-207','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-208','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-209','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-210','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-211','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-212','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-213','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-214','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-215','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-216','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-217','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-218','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-219','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-220','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-221','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-222','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-223','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-224','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-225','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-226','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-227','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-228','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-229','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-230','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-231','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-232','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-233','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-234','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-235','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-236','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-237','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-238','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-239','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-240','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-241','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-242','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-243','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-244','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-245','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-246','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-247','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-248','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-249','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-250','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-251','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-252','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-253','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-254','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-255','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-256','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-257','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-258','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-259','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-260','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-261','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-262','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-263','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-264','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-265','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-266','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-267','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-268','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-269','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-270','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-271','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-272','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-273','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-274','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-275','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-276','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-277','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-278','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-279','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-280','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-281','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-282','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-283','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-284','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-285','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-286','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-287','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-288','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-289','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-290','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-291','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-292','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-293','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-294','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-295','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-296','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-297','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-298','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-299','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-300','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-301','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-302','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-303','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-304','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-305','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-306','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-307','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-308','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-309','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-310','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-311','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-312','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-313','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-314','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-315','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-316','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-317','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-318','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-319','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-320','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-321','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-322','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-323','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-324','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-325','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-326','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-327','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-328','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-329','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-330','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-331','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-332','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-333','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-334','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-335','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-336','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-337','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-338','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-339','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-340','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-341','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-342','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-343','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-344','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-345','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-346','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-347','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-348','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-349','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-350','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-351','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-352','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-353','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-354','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-355','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-356','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-357','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-358','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-359','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-360','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-361','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-362','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-363','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-364','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-365','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-366','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-367','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-368','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-369','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-370','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-371','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-372','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-373','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-374','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-375','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-376','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-377','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-378','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-379','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-380','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-381','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-382','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-383','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-384','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-385','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-386','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-387','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-388','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-389','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-390','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-391','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-392','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-393','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-394','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-395','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-396','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-397','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-398','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-399','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-400','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-401','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-402','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-403','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-404','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-405','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-406','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-407','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-408','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-409','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-410','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-411','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-412','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-413','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-414','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-415','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-416','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-417','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-418','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-419','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-420','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-421','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-422','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-423','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-424','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-425','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-426','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-427','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-428','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-429','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-430','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-431','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-432','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-433','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-434','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-435','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-436','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-437','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-438','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-439','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-440','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-441','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-442','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-443','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-444','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-445','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-446','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-447','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-448','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-449','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-450','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-451','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-452','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-453','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-454','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-455','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-456','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-457','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-458','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-459','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-460','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-461','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-462','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-463','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-464','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-465','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-466','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-467','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-468','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-469','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-470','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-471','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-472','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-473','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-474','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-475','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-476','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-477','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-478','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-479','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-480','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-481','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-482','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-483','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-484','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-485','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-486','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-487','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-488','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-489','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-490','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-491','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-492','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-493','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-494','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-495','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-496','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-497','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-498','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-499','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-500','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-501','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-502','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-503','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-504','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-505','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-506','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-507','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-508','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-509','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-510','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-511','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-512','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-513','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-514','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-515','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-516','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-517','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-518','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-519','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-520','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-521','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-522','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-523','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-524','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-525','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-526','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-527','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-528','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-529','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-530','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-531','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-532','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-533','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-534','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-535','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-536','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-537','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-538','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-539','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-540','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-541','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-542','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-543','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-544','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-545','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-546','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-547','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-548','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-549','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-550','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-551','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-552','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-553','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-554','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-555','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-556','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-557','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-558','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-559','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-560','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-561','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-562','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-563','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-564','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-565','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-566','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-567','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-568','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-569','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-570','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-571','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-572','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-573','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-574','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-575','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-576','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-577','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-578','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-579','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-580','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-581','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-582','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-583','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-584','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-585','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-586','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-587','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-588','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-589','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-590','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-591','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-592','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-593','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-594','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-595','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-596','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-597','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-598','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-599','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-600','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-601','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-602','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-603','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-604','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-605','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-606','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-607','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-608','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-609','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-610','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-611','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-612','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-613','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-614','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-615','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-616','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-617','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-618','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-619','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-620','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-621','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-622','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-623','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-624','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-625','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-626','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-627','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-628','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-629','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-630','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-631','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-632','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-633','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-634','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-635','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-636','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-637','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-638','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-639','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-640','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-641','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-642','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-643','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-644','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-645','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-646','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-647','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-648','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-649','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-650','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-651','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-652','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-653','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-654','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-655','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-656','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-657','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-658','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-659','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-660','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-661','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-662','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-663','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-664','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-665','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-666','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-667','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-668','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-669','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-670','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-671','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-672','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-673','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-674','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-675','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-676','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-677','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-678','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-679','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-680','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-681','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-682','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-683','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-684','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-685','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-686','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-687','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-688','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-689','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-690','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-691','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-692','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-693','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-694','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-695','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-696','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-697','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-698','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-699','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-700','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-701','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-702','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-703','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-704','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-705','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-706','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-707','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-708','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-709','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-710','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-711','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-712','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-713','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-714','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-715','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-716','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-717','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-718','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-719','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-720','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-721','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-722','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-723','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-724','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-725','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-726','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-727','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-728','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-729','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-730','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-731','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-732','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-733','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-734','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-735','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-736','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-737','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-738','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-739','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-740','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-741','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-742','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-743','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-744','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-745','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-746','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-747','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-748','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-749','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-750','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-751','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-752','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-753','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-754','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-755','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-756','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-757','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-758','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-759','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-760','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-761','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-762','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-763','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-764','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-765','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-766','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-767','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-768','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-769','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-770','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-771','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-772','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-773','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-774','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-775','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-776','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-777','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-778','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-779','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-780','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-781','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-782','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-783','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-784','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-785','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-786','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-787','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-788','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-789','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-790','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-791','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-792','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-793','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-794','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-795','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-796','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-797','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-798','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-799','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-800','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-801','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-802','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-803','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-804','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-805','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-806','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-807','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-808','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-809','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-810','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-811','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-812','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-813','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-814','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-815','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-816','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-817','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-818','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-819','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-820','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-821','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-822','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-823','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-824','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-825','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-826','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-827','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-828','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-829','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-830','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-831','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-832','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-833','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-834','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-835','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-836','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-837','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-838','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-839','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-840','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-841','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-842','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-843','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-844','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-845','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-846','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-847','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-848','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-849','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-850','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-851','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-852','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-853','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-854','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-855','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-856','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-857','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-858','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-859','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-860','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-861','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-862','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-863','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-864','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-865','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-866','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-867','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-868','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-869','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-870','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-871','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-872','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-873','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-874','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-875','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-876','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-877','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-878','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-879','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-880','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-881','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-882','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-883','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-884','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-885','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-886','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-887','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-888','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-889','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-890','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-891','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-892','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-893','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-894','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-895','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-896','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-897','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-898','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-899','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-900','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-901','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-902','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-903','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-904','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-905','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-906','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-907','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-908','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-909','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-910','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-911','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-912','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-913','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-914','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-915','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-916','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-917','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-918','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-919','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-920','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-921','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-922','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-923','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-924','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-925','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-926','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-927','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-928','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-929','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-930','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-931','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-932','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-933','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-934','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-935','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-936','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-937','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-938','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-939','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-940','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-941','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-942','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-943','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-944','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-945','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-946','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-947','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-948','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-949','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-950','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-951','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-952','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-953','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-954','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-955','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-956','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-957','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-958','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-959','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-960','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-961','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-962','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-963','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-964','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-965','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-966','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-967','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-968','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-969','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-970','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-971','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-972','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-973','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-974','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-975','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-976','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-977','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-978','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-979','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-980','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-981','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-982','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-983','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-984','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-985','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-986','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-987','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-988','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-989','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-990','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-991','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-992','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-993','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-994','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-995','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-996','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-997','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-998','1','1000','通联提现单号'), +('mall4cloud-withdraw-cash-999','1','1000','通联提现单号'), +('mall4cloud-alllinpay-update-company-sn','1000000000000','1000','更新企业信息的商户唯一流水号'), +('mall4cloud-file-upload','1000000000000','1000','通联文件上传单号'); + + + +USE `mall4cloud_marketing`; +DROP TABLE IF EXISTS `leaf_alloc`; +CREATE TABLE `leaf_alloc` ( + `biz_tag` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '区分业务', + `max_id` bigint unsigned NOT NULL DEFAULT '1' COMMENT '该biz_tag目前所被分配的ID号段的最大值', + `step` int NOT NULL COMMENT '每次分配的号段长度', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + PRIMARY KEY (`biz_tag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +insert into `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) values +('mall4cloud-distribution-user','1000000000000','1000','distribution_user表的distribution_user_id'), +('mall4cloud-distribution-withdraw-order','1000000000000','1000','distribution_withdraw_cash表的merchant_order_id'), +('mall4cloud-live-room-user','1000000000000','1000','直播用户id'); + + + +USE `mall4cloud_order`; +DROP TABLE IF EXISTS `leaf_alloc`; +CREATE TABLE `leaf_alloc` ( + `biz_tag` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '区分业务', + `max_id` bigint unsigned NOT NULL DEFAULT '1' COMMENT '该biz_tag目前所被分配的ID号段的最大值', + `step` int NOT NULL COMMENT '每次分配的号段长度', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + PRIMARY KEY (`biz_tag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +insert into `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) values +('mall4cloud-delivery-order-000','1','1000','订单物流id'), +('mall4cloud-delivery-order-001','1','1000','订单物流id'), +('mall4cloud-delivery-order-002','1','1000','订单物流id'), +('mall4cloud-delivery-order-003','1','1000','订单物流id'), +('mall4cloud-delivery-order-004','1','1000','订单物流id'), +('mall4cloud-delivery-order-005','1','1000','订单物流id'), +('mall4cloud-delivery-order-006','1','1000','订单物流id'), +('mall4cloud-delivery-order-007','1','1000','订单物流id'), +('mall4cloud-delivery-order-008','1','1000','订单物流id'), +('mall4cloud-delivery-order-009','1','1000','订单物流id'), +('mall4cloud-delivery-order-010','1','1000','订单物流id'), +('mall4cloud-delivery-order-011','1','1000','订单物流id'), +('mall4cloud-delivery-order-012','1','1000','订单物流id'), +('mall4cloud-delivery-order-013','1','1000','订单物流id'), +('mall4cloud-delivery-order-014','1','1000','订单物流id'), +('mall4cloud-delivery-order-015','1','1000','订单物流id'), +('mall4cloud-delivery-order-016','1','1000','订单物流id'), +('mall4cloud-delivery-order-017','1','1000','订单物流id'), +('mall4cloud-delivery-order-018','1','1000','订单物流id'), +('mall4cloud-delivery-order-019','1','1000','订单物流id'), +('mall4cloud-delivery-order-020','1','1000','订单物流id'), +('mall4cloud-delivery-order-021','1','1000','订单物流id'), +('mall4cloud-delivery-order-022','1','1000','订单物流id'), +('mall4cloud-delivery-order-023','1','1000','订单物流id'), +('mall4cloud-delivery-order-024','1','1000','订单物流id'), +('mall4cloud-delivery-order-025','1','1000','订单物流id'), +('mall4cloud-delivery-order-026','1','1000','订单物流id'), +('mall4cloud-delivery-order-027','1','1000','订单物流id'), +('mall4cloud-delivery-order-028','1','1000','订单物流id'), +('mall4cloud-delivery-order-029','1','1000','订单物流id'), +('mall4cloud-delivery-order-030','1','1000','订单物流id'), +('mall4cloud-delivery-order-031','1','1000','订单物流id'), +('mall4cloud-delivery-order-032','1','1000','订单物流id'), +('mall4cloud-delivery-order-033','1','1000','订单物流id'), +('mall4cloud-delivery-order-034','1','1000','订单物流id'), +('mall4cloud-delivery-order-035','1','1000','订单物流id'), +('mall4cloud-delivery-order-036','1','1000','订单物流id'), +('mall4cloud-delivery-order-037','1','1000','订单物流id'), +('mall4cloud-delivery-order-038','1','1000','订单物流id'), +('mall4cloud-delivery-order-039','1','1000','订单物流id'), +('mall4cloud-delivery-order-040','1','1000','订单物流id'), +('mall4cloud-delivery-order-041','1','1000','订单物流id'), +('mall4cloud-delivery-order-042','1','1000','订单物流id'), +('mall4cloud-delivery-order-043','1','1000','订单物流id'), +('mall4cloud-delivery-order-044','1','1000','订单物流id'), +('mall4cloud-delivery-order-045','1','1000','订单物流id'), +('mall4cloud-delivery-order-046','1','1000','订单物流id'), +('mall4cloud-delivery-order-047','1','1000','订单物流id'), +('mall4cloud-delivery-order-048','1','1000','订单物流id'), +('mall4cloud-delivery-order-049','1','1000','订单物流id'), +('mall4cloud-delivery-order-050','1','1000','订单物流id'), +('mall4cloud-delivery-order-051','1','1000','订单物流id'), +('mall4cloud-delivery-order-052','1','1000','订单物流id'), +('mall4cloud-delivery-order-053','1','1000','订单物流id'), +('mall4cloud-delivery-order-054','1','1000','订单物流id'), +('mall4cloud-delivery-order-055','1','1000','订单物流id'), +('mall4cloud-delivery-order-056','1','1000','订单物流id'), +('mall4cloud-delivery-order-057','1','1000','订单物流id'), +('mall4cloud-delivery-order-058','1','1000','订单物流id'), +('mall4cloud-delivery-order-059','1','1000','订单物流id'), +('mall4cloud-delivery-order-060','1','1000','订单物流id'), +('mall4cloud-delivery-order-061','1','1000','订单物流id'), +('mall4cloud-delivery-order-062','1','1000','订单物流id'), +('mall4cloud-delivery-order-063','1','1000','订单物流id'), +('mall4cloud-delivery-order-064','1','1000','订单物流id'), +('mall4cloud-delivery-order-065','1','1000','订单物流id'), +('mall4cloud-delivery-order-066','1','1000','订单物流id'), +('mall4cloud-delivery-order-067','1','1000','订单物流id'), +('mall4cloud-delivery-order-068','1','1000','订单物流id'), +('mall4cloud-delivery-order-069','1','1000','订单物流id'), +('mall4cloud-delivery-order-070','1','1000','订单物流id'), +('mall4cloud-delivery-order-071','1','1000','订单物流id'), +('mall4cloud-delivery-order-072','1','1000','订单物流id'), +('mall4cloud-delivery-order-073','1','1000','订单物流id'), +('mall4cloud-delivery-order-074','1','1000','订单物流id'), +('mall4cloud-delivery-order-075','1','1000','订单物流id'), +('mall4cloud-delivery-order-076','1','1000','订单物流id'), +('mall4cloud-delivery-order-077','1','1000','订单物流id'), +('mall4cloud-delivery-order-078','1','1000','订单物流id'), +('mall4cloud-delivery-order-079','1','1000','订单物流id'), +('mall4cloud-delivery-order-080','1','1000','订单物流id'), +('mall4cloud-delivery-order-081','1','1000','订单物流id'), +('mall4cloud-delivery-order-082','1','1000','订单物流id'), +('mall4cloud-delivery-order-083','1','1000','订单物流id'), +('mall4cloud-delivery-order-084','1','1000','订单物流id'), +('mall4cloud-delivery-order-085','1','1000','订单物流id'), +('mall4cloud-delivery-order-086','1','1000','订单物流id'), +('mall4cloud-delivery-order-087','1','1000','订单物流id'), +('mall4cloud-delivery-order-088','1','1000','订单物流id'), +('mall4cloud-delivery-order-089','1','1000','订单物流id'), +('mall4cloud-delivery-order-090','1','1000','订单物流id'), +('mall4cloud-delivery-order-091','1','1000','订单物流id'), +('mall4cloud-delivery-order-092','1','1000','订单物流id'), +('mall4cloud-delivery-order-093','1','1000','订单物流id'), +('mall4cloud-delivery-order-094','1','1000','订单物流id'), +('mall4cloud-delivery-order-095','1','1000','订单物流id'), +('mall4cloud-delivery-order-096','1','1000','订单物流id'), +('mall4cloud-delivery-order-097','1','1000','订单物流id'), +('mall4cloud-delivery-order-098','1','1000','订单物流id'), +('mall4cloud-delivery-order-099','1','1000','订单物流id'), +('mall4cloud-delivery-order-100','1','1000','订单物流id'), +('mall4cloud-delivery-order-101','1','1000','订单物流id'), +('mall4cloud-delivery-order-102','1','1000','订单物流id'), +('mall4cloud-delivery-order-103','1','1000','订单物流id'), +('mall4cloud-delivery-order-104','1','1000','订单物流id'), +('mall4cloud-delivery-order-105','1','1000','订单物流id'), +('mall4cloud-delivery-order-106','1','1000','订单物流id'), +('mall4cloud-delivery-order-107','1','1000','订单物流id'), +('mall4cloud-delivery-order-108','1','1000','订单物流id'), +('mall4cloud-delivery-order-109','1','1000','订单物流id'), +('mall4cloud-delivery-order-110','1','1000','订单物流id'), +('mall4cloud-delivery-order-111','1','1000','订单物流id'), +('mall4cloud-delivery-order-112','1','1000','订单物流id'), +('mall4cloud-delivery-order-113','1','1000','订单物流id'), +('mall4cloud-delivery-order-114','1','1000','订单物流id'), +('mall4cloud-delivery-order-115','1','1000','订单物流id'), +('mall4cloud-delivery-order-116','1','1000','订单物流id'), +('mall4cloud-delivery-order-117','1','1000','订单物流id'), +('mall4cloud-delivery-order-118','1','1000','订单物流id'), +('mall4cloud-delivery-order-119','1','1000','订单物流id'), +('mall4cloud-delivery-order-120','1','1000','订单物流id'), +('mall4cloud-delivery-order-121','1','1000','订单物流id'), +('mall4cloud-delivery-order-122','1','1000','订单物流id'), +('mall4cloud-delivery-order-123','1','1000','订单物流id'), +('mall4cloud-delivery-order-124','1','1000','订单物流id'), +('mall4cloud-delivery-order-125','1','1000','订单物流id'), +('mall4cloud-delivery-order-126','1','1000','订单物流id'), +('mall4cloud-delivery-order-127','1','1000','订单物流id'), +('mall4cloud-delivery-order-128','1','1000','订单物流id'), +('mall4cloud-delivery-order-129','1','1000','订单物流id'), +('mall4cloud-delivery-order-130','1','1000','订单物流id'), +('mall4cloud-delivery-order-131','1','1000','订单物流id'), +('mall4cloud-delivery-order-132','1','1000','订单物流id'), +('mall4cloud-delivery-order-133','1','1000','订单物流id'), +('mall4cloud-delivery-order-134','1','1000','订单物流id'), +('mall4cloud-delivery-order-135','1','1000','订单物流id'), +('mall4cloud-delivery-order-136','1','1000','订单物流id'), +('mall4cloud-delivery-order-137','1','1000','订单物流id'), +('mall4cloud-delivery-order-138','1','1000','订单物流id'), +('mall4cloud-delivery-order-139','1','1000','订单物流id'), +('mall4cloud-delivery-order-140','1','1000','订单物流id'), +('mall4cloud-delivery-order-141','1','1000','订单物流id'), +('mall4cloud-delivery-order-142','1','1000','订单物流id'), +('mall4cloud-delivery-order-143','1','1000','订单物流id'), +('mall4cloud-delivery-order-144','1','1000','订单物流id'), +('mall4cloud-delivery-order-145','1','1000','订单物流id'), +('mall4cloud-delivery-order-146','1','1000','订单物流id'), +('mall4cloud-delivery-order-147','1','1000','订单物流id'), +('mall4cloud-delivery-order-148','1','1000','订单物流id'), +('mall4cloud-delivery-order-149','1','1000','订单物流id'), +('mall4cloud-delivery-order-150','1','1000','订单物流id'), +('mall4cloud-delivery-order-151','1','1000','订单物流id'), +('mall4cloud-delivery-order-152','1','1000','订单物流id'), +('mall4cloud-delivery-order-153','1','1000','订单物流id'), +('mall4cloud-delivery-order-154','1','1000','订单物流id'), +('mall4cloud-delivery-order-155','1','1000','订单物流id'), +('mall4cloud-delivery-order-156','1','1000','订单物流id'), +('mall4cloud-delivery-order-157','1','1000','订单物流id'), +('mall4cloud-delivery-order-158','1','1000','订单物流id'), +('mall4cloud-delivery-order-159','1','1000','订单物流id'), +('mall4cloud-delivery-order-160','1','1000','订单物流id'), +('mall4cloud-delivery-order-161','1','1000','订单物流id'), +('mall4cloud-delivery-order-162','1','1000','订单物流id'), +('mall4cloud-delivery-order-163','1','1000','订单物流id'), +('mall4cloud-delivery-order-164','1','1000','订单物流id'), +('mall4cloud-delivery-order-165','1','1000','订单物流id'), +('mall4cloud-delivery-order-166','1','1000','订单物流id'), +('mall4cloud-delivery-order-167','1','1000','订单物流id'), +('mall4cloud-delivery-order-168','1','1000','订单物流id'), +('mall4cloud-delivery-order-169','1','1000','订单物流id'), +('mall4cloud-delivery-order-170','1','1000','订单物流id'), +('mall4cloud-delivery-order-171','1','1000','订单物流id'), +('mall4cloud-delivery-order-172','1','1000','订单物流id'), +('mall4cloud-delivery-order-173','1','1000','订单物流id'), +('mall4cloud-delivery-order-174','1','1000','订单物流id'), +('mall4cloud-delivery-order-175','1','1000','订单物流id'), +('mall4cloud-delivery-order-176','1','1000','订单物流id'), +('mall4cloud-delivery-order-177','1','1000','订单物流id'), +('mall4cloud-delivery-order-178','1','1000','订单物流id'), +('mall4cloud-delivery-order-179','1','1000','订单物流id'), +('mall4cloud-delivery-order-180','1','1000','订单物流id'), +('mall4cloud-delivery-order-181','1','1000','订单物流id'), +('mall4cloud-delivery-order-182','1','1000','订单物流id'), +('mall4cloud-delivery-order-183','1','1000','订单物流id'), +('mall4cloud-delivery-order-184','1','1000','订单物流id'), +('mall4cloud-delivery-order-185','1','1000','订单物流id'), +('mall4cloud-delivery-order-186','1','1000','订单物流id'), +('mall4cloud-delivery-order-187','1','1000','订单物流id'), +('mall4cloud-delivery-order-188','1','1000','订单物流id'), +('mall4cloud-delivery-order-189','1','1000','订单物流id'), +('mall4cloud-delivery-order-190','1','1000','订单物流id'), +('mall4cloud-delivery-order-191','1','1000','订单物流id'), +('mall4cloud-delivery-order-192','1','1000','订单物流id'), +('mall4cloud-delivery-order-193','1','1000','订单物流id'), +('mall4cloud-delivery-order-194','1','1000','订单物流id'), +('mall4cloud-delivery-order-195','1','1000','订单物流id'), +('mall4cloud-delivery-order-196','1','1000','订单物流id'), +('mall4cloud-delivery-order-197','1','1000','订单物流id'), +('mall4cloud-delivery-order-198','1','1000','订单物流id'), +('mall4cloud-delivery-order-199','1','1000','订单物流id'), +('mall4cloud-delivery-order-200','1','1000','订单物流id'), +('mall4cloud-delivery-order-201','1','1000','订单物流id'), +('mall4cloud-delivery-order-202','1','1000','订单物流id'), +('mall4cloud-delivery-order-203','1','1000','订单物流id'), +('mall4cloud-delivery-order-204','1','1000','订单物流id'), +('mall4cloud-delivery-order-205','1','1000','订单物流id'), +('mall4cloud-delivery-order-206','1','1000','订单物流id'), +('mall4cloud-delivery-order-207','1','1000','订单物流id'), +('mall4cloud-delivery-order-208','1','1000','订单物流id'), +('mall4cloud-delivery-order-209','1','1000','订单物流id'), +('mall4cloud-delivery-order-210','1','1000','订单物流id'), +('mall4cloud-delivery-order-211','1','1000','订单物流id'), +('mall4cloud-delivery-order-212','1','1000','订单物流id'), +('mall4cloud-delivery-order-213','1','1000','订单物流id'), +('mall4cloud-delivery-order-214','1','1000','订单物流id'), +('mall4cloud-delivery-order-215','1','1000','订单物流id'), +('mall4cloud-delivery-order-216','1','1000','订单物流id'), +('mall4cloud-delivery-order-217','1','1000','订单物流id'), +('mall4cloud-delivery-order-218','1','1000','订单物流id'), +('mall4cloud-delivery-order-219','1','1000','订单物流id'), +('mall4cloud-delivery-order-220','1','1000','订单物流id'), +('mall4cloud-delivery-order-221','1','1000','订单物流id'), +('mall4cloud-delivery-order-222','1','1000','订单物流id'), +('mall4cloud-delivery-order-223','1','1000','订单物流id'), +('mall4cloud-delivery-order-224','1','1000','订单物流id'), +('mall4cloud-delivery-order-225','1','1000','订单物流id'), +('mall4cloud-delivery-order-226','1','1000','订单物流id'), +('mall4cloud-delivery-order-227','1','1000','订单物流id'), +('mall4cloud-delivery-order-228','1','1000','订单物流id'), +('mall4cloud-delivery-order-229','1','1000','订单物流id'), +('mall4cloud-delivery-order-230','1','1000','订单物流id'), +('mall4cloud-delivery-order-231','1','1000','订单物流id'), +('mall4cloud-delivery-order-232','1','1000','订单物流id'), +('mall4cloud-delivery-order-233','1','1000','订单物流id'), +('mall4cloud-delivery-order-234','1','1000','订单物流id'), +('mall4cloud-delivery-order-235','1','1000','订单物流id'), +('mall4cloud-delivery-order-236','1','1000','订单物流id'), +('mall4cloud-delivery-order-237','1','1000','订单物流id'), +('mall4cloud-delivery-order-238','1','1000','订单物流id'), +('mall4cloud-delivery-order-239','1','1000','订单物流id'), +('mall4cloud-delivery-order-240','1','1000','订单物流id'), +('mall4cloud-delivery-order-241','1','1000','订单物流id'), +('mall4cloud-delivery-order-242','1','1000','订单物流id'), +('mall4cloud-delivery-order-243','1','1000','订单物流id'), +('mall4cloud-delivery-order-244','1','1000','订单物流id'), +('mall4cloud-delivery-order-245','1','1000','订单物流id'), +('mall4cloud-delivery-order-246','1','1000','订单物流id'), +('mall4cloud-delivery-order-247','1','1000','订单物流id'), +('mall4cloud-delivery-order-248','1','1000','订单物流id'), +('mall4cloud-delivery-order-249','1','1000','订单物流id'), +('mall4cloud-delivery-order-250','1','1000','订单物流id'), +('mall4cloud-delivery-order-251','1','1000','订单物流id'), +('mall4cloud-delivery-order-252','1','1000','订单物流id'), +('mall4cloud-delivery-order-253','1','1000','订单物流id'), +('mall4cloud-delivery-order-254','1','1000','订单物流id'), +('mall4cloud-delivery-order-255','1','1000','订单物流id'), +('mall4cloud-delivery-order-256','1','1000','订单物流id'), +('mall4cloud-delivery-order-257','1','1000','订单物流id'), +('mall4cloud-delivery-order-258','1','1000','订单物流id'), +('mall4cloud-delivery-order-259','1','1000','订单物流id'), +('mall4cloud-delivery-order-260','1','1000','订单物流id'), +('mall4cloud-delivery-order-261','1','1000','订单物流id'), +('mall4cloud-delivery-order-262','1','1000','订单物流id'), +('mall4cloud-delivery-order-263','1','1000','订单物流id'), +('mall4cloud-delivery-order-264','1','1000','订单物流id'), +('mall4cloud-delivery-order-265','1','1000','订单物流id'), +('mall4cloud-delivery-order-266','1','1000','订单物流id'), +('mall4cloud-delivery-order-267','1','1000','订单物流id'), +('mall4cloud-delivery-order-268','1','1000','订单物流id'), +('mall4cloud-delivery-order-269','1','1000','订单物流id'), +('mall4cloud-delivery-order-270','1','1000','订单物流id'), +('mall4cloud-delivery-order-271','1','1000','订单物流id'), +('mall4cloud-delivery-order-272','1','1000','订单物流id'), +('mall4cloud-delivery-order-273','1','1000','订单物流id'), +('mall4cloud-delivery-order-274','1','1000','订单物流id'), +('mall4cloud-delivery-order-275','1','1000','订单物流id'), +('mall4cloud-delivery-order-276','1','1000','订单物流id'), +('mall4cloud-delivery-order-277','1','1000','订单物流id'), +('mall4cloud-delivery-order-278','1','1000','订单物流id'), +('mall4cloud-delivery-order-279','1','1000','订单物流id'), +('mall4cloud-delivery-order-280','1','1000','订单物流id'), +('mall4cloud-delivery-order-281','1','1000','订单物流id'), +('mall4cloud-delivery-order-282','1','1000','订单物流id'), +('mall4cloud-delivery-order-283','1','1000','订单物流id'), +('mall4cloud-delivery-order-284','1','1000','订单物流id'), +('mall4cloud-delivery-order-285','1','1000','订单物流id'), +('mall4cloud-delivery-order-286','1','1000','订单物流id'), +('mall4cloud-delivery-order-287','1','1000','订单物流id'), +('mall4cloud-delivery-order-288','1','1000','订单物流id'), +('mall4cloud-delivery-order-289','1','1000','订单物流id'), +('mall4cloud-delivery-order-290','1','1000','订单物流id'), +('mall4cloud-delivery-order-291','1','1000','订单物流id'), +('mall4cloud-delivery-order-292','1','1000','订单物流id'), +('mall4cloud-delivery-order-293','1','1000','订单物流id'), +('mall4cloud-delivery-order-294','1','1000','订单物流id'), +('mall4cloud-delivery-order-295','1','1000','订单物流id'), +('mall4cloud-delivery-order-296','1','1000','订单物流id'), +('mall4cloud-delivery-order-297','1','1000','订单物流id'), +('mall4cloud-delivery-order-298','1','1000','订单物流id'), +('mall4cloud-delivery-order-299','1','1000','订单物流id'), +('mall4cloud-delivery-order-300','1','1000','订单物流id'), +('mall4cloud-delivery-order-301','1','1000','订单物流id'), +('mall4cloud-delivery-order-302','1','1000','订单物流id'), +('mall4cloud-delivery-order-303','1','1000','订单物流id'), +('mall4cloud-delivery-order-304','1','1000','订单物流id'), +('mall4cloud-delivery-order-305','1','1000','订单物流id'), +('mall4cloud-delivery-order-306','1','1000','订单物流id'), +('mall4cloud-delivery-order-307','1','1000','订单物流id'), +('mall4cloud-delivery-order-308','1','1000','订单物流id'), +('mall4cloud-delivery-order-309','1','1000','订单物流id'), +('mall4cloud-delivery-order-310','1','1000','订单物流id'), +('mall4cloud-delivery-order-311','1','1000','订单物流id'), +('mall4cloud-delivery-order-312','1','1000','订单物流id'), +('mall4cloud-delivery-order-313','1','1000','订单物流id'), +('mall4cloud-delivery-order-314','1','1000','订单物流id'), +('mall4cloud-delivery-order-315','1','1000','订单物流id'), +('mall4cloud-delivery-order-316','1','1000','订单物流id'), +('mall4cloud-delivery-order-317','1','1000','订单物流id'), +('mall4cloud-delivery-order-318','1','1000','订单物流id'), +('mall4cloud-delivery-order-319','1','1000','订单物流id'), +('mall4cloud-delivery-order-320','1','1000','订单物流id'), +('mall4cloud-delivery-order-321','1','1000','订单物流id'), +('mall4cloud-delivery-order-322','1','1000','订单物流id'), +('mall4cloud-delivery-order-323','1','1000','订单物流id'), +('mall4cloud-delivery-order-324','1','1000','订单物流id'), +('mall4cloud-delivery-order-325','1','1000','订单物流id'), +('mall4cloud-delivery-order-326','1','1000','订单物流id'), +('mall4cloud-delivery-order-327','1','1000','订单物流id'), +('mall4cloud-delivery-order-328','1','1000','订单物流id'), +('mall4cloud-delivery-order-329','1','1000','订单物流id'), +('mall4cloud-delivery-order-330','1','1000','订单物流id'), +('mall4cloud-delivery-order-331','1','1000','订单物流id'), +('mall4cloud-delivery-order-332','1','1000','订单物流id'), +('mall4cloud-delivery-order-333','1','1000','订单物流id'), +('mall4cloud-delivery-order-334','1','1000','订单物流id'), +('mall4cloud-delivery-order-335','1','1000','订单物流id'), +('mall4cloud-delivery-order-336','1','1000','订单物流id'), +('mall4cloud-delivery-order-337','1','1000','订单物流id'), +('mall4cloud-delivery-order-338','1','1000','订单物流id'), +('mall4cloud-delivery-order-339','1','1000','订单物流id'), +('mall4cloud-delivery-order-340','1','1000','订单物流id'), +('mall4cloud-delivery-order-341','1','1000','订单物流id'), +('mall4cloud-delivery-order-342','1','1000','订单物流id'), +('mall4cloud-delivery-order-343','1','1000','订单物流id'), +('mall4cloud-delivery-order-344','1','1000','订单物流id'), +('mall4cloud-delivery-order-345','1','1000','订单物流id'), +('mall4cloud-delivery-order-346','1','1000','订单物流id'), +('mall4cloud-delivery-order-347','1','1000','订单物流id'), +('mall4cloud-delivery-order-348','1','1000','订单物流id'), +('mall4cloud-delivery-order-349','1','1000','订单物流id'), +('mall4cloud-delivery-order-350','1','1000','订单物流id'), +('mall4cloud-delivery-order-351','1','1000','订单物流id'), +('mall4cloud-delivery-order-352','1','1000','订单物流id'), +('mall4cloud-delivery-order-353','1','1000','订单物流id'), +('mall4cloud-delivery-order-354','1','1000','订单物流id'), +('mall4cloud-delivery-order-355','1','1000','订单物流id'), +('mall4cloud-delivery-order-356','1','1000','订单物流id'), +('mall4cloud-delivery-order-357','1','1000','订单物流id'), +('mall4cloud-delivery-order-358','1','1000','订单物流id'), +('mall4cloud-delivery-order-359','1','1000','订单物流id'), +('mall4cloud-delivery-order-360','1','1000','订单物流id'), +('mall4cloud-delivery-order-361','1','1000','订单物流id'), +('mall4cloud-delivery-order-362','1','1000','订单物流id'), +('mall4cloud-delivery-order-363','1','1000','订单物流id'), +('mall4cloud-delivery-order-364','1','1000','订单物流id'), +('mall4cloud-delivery-order-365','1','1000','订单物流id'), +('mall4cloud-delivery-order-366','1','1000','订单物流id'), +('mall4cloud-delivery-order-367','1','1000','订单物流id'), +('mall4cloud-delivery-order-368','1','1000','订单物流id'), +('mall4cloud-delivery-order-369','1','1000','订单物流id'), +('mall4cloud-delivery-order-370','1','1000','订单物流id'), +('mall4cloud-delivery-order-371','1','1000','订单物流id'), +('mall4cloud-delivery-order-372','1','1000','订单物流id'), +('mall4cloud-delivery-order-373','1','1000','订单物流id'), +('mall4cloud-delivery-order-374','1','1000','订单物流id'), +('mall4cloud-delivery-order-375','1','1000','订单物流id'), +('mall4cloud-delivery-order-376','1','1000','订单物流id'), +('mall4cloud-delivery-order-377','1','1000','订单物流id'), +('mall4cloud-delivery-order-378','1','1000','订单物流id'), +('mall4cloud-delivery-order-379','1','1000','订单物流id'), +('mall4cloud-delivery-order-380','1','1000','订单物流id'), +('mall4cloud-delivery-order-381','1','1000','订单物流id'), +('mall4cloud-delivery-order-382','1','1000','订单物流id'), +('mall4cloud-delivery-order-383','1','1000','订单物流id'), +('mall4cloud-delivery-order-384','1','1000','订单物流id'), +('mall4cloud-delivery-order-385','1','1000','订单物流id'), +('mall4cloud-delivery-order-386','1','1000','订单物流id'), +('mall4cloud-delivery-order-387','1','1000','订单物流id'), +('mall4cloud-delivery-order-388','1','1000','订单物流id'), +('mall4cloud-delivery-order-389','1','1000','订单物流id'), +('mall4cloud-delivery-order-390','1','1000','订单物流id'), +('mall4cloud-delivery-order-391','1','1000','订单物流id'), +('mall4cloud-delivery-order-392','1','1000','订单物流id'), +('mall4cloud-delivery-order-393','1','1000','订单物流id'), +('mall4cloud-delivery-order-394','1','1000','订单物流id'), +('mall4cloud-delivery-order-395','1','1000','订单物流id'), +('mall4cloud-delivery-order-396','1','1000','订单物流id'), +('mall4cloud-delivery-order-397','1','1000','订单物流id'), +('mall4cloud-delivery-order-398','1','1000','订单物流id'), +('mall4cloud-delivery-order-399','1','1000','订单物流id'), +('mall4cloud-delivery-order-400','1','1000','订单物流id'), +('mall4cloud-delivery-order-401','1','1000','订单物流id'), +('mall4cloud-delivery-order-402','1','1000','订单物流id'), +('mall4cloud-delivery-order-403','1','1000','订单物流id'), +('mall4cloud-delivery-order-404','1','1000','订单物流id'), +('mall4cloud-delivery-order-405','1','1000','订单物流id'), +('mall4cloud-delivery-order-406','1','1000','订单物流id'), +('mall4cloud-delivery-order-407','1','1000','订单物流id'), +('mall4cloud-delivery-order-408','1','1000','订单物流id'), +('mall4cloud-delivery-order-409','1','1000','订单物流id'), +('mall4cloud-delivery-order-410','1','1000','订单物流id'), +('mall4cloud-delivery-order-411','1','1000','订单物流id'), +('mall4cloud-delivery-order-412','1','1000','订单物流id'), +('mall4cloud-delivery-order-413','1','1000','订单物流id'), +('mall4cloud-delivery-order-414','1','1000','订单物流id'), +('mall4cloud-delivery-order-415','1','1000','订单物流id'), +('mall4cloud-delivery-order-416','1','1000','订单物流id'), +('mall4cloud-delivery-order-417','1','1000','订单物流id'), +('mall4cloud-delivery-order-418','1','1000','订单物流id'), +('mall4cloud-delivery-order-419','1','1000','订单物流id'), +('mall4cloud-delivery-order-420','1','1000','订单物流id'), +('mall4cloud-delivery-order-421','1','1000','订单物流id'), +('mall4cloud-delivery-order-422','1','1000','订单物流id'), +('mall4cloud-delivery-order-423','1','1000','订单物流id'), +('mall4cloud-delivery-order-424','1','1000','订单物流id'), +('mall4cloud-delivery-order-425','1','1000','订单物流id'), +('mall4cloud-delivery-order-426','1','1000','订单物流id'), +('mall4cloud-delivery-order-427','1','1000','订单物流id'), +('mall4cloud-delivery-order-428','1','1000','订单物流id'), +('mall4cloud-delivery-order-429','1','1000','订单物流id'), +('mall4cloud-delivery-order-430','1','1000','订单物流id'), +('mall4cloud-delivery-order-431','1','1000','订单物流id'), +('mall4cloud-delivery-order-432','1','1000','订单物流id'), +('mall4cloud-delivery-order-433','1','1000','订单物流id'), +('mall4cloud-delivery-order-434','1','1000','订单物流id'), +('mall4cloud-delivery-order-435','1','1000','订单物流id'), +('mall4cloud-delivery-order-436','1','1000','订单物流id'), +('mall4cloud-delivery-order-437','1','1000','订单物流id'), +('mall4cloud-delivery-order-438','1','1000','订单物流id'), +('mall4cloud-delivery-order-439','1','1000','订单物流id'), +('mall4cloud-delivery-order-440','1','1000','订单物流id'), +('mall4cloud-delivery-order-441','1','1000','订单物流id'), +('mall4cloud-delivery-order-442','1','1000','订单物流id'), +('mall4cloud-delivery-order-443','1','1000','订单物流id'), +('mall4cloud-delivery-order-444','1','1000','订单物流id'), +('mall4cloud-delivery-order-445','1','1000','订单物流id'), +('mall4cloud-delivery-order-446','1','1000','订单物流id'), +('mall4cloud-delivery-order-447','1','1000','订单物流id'), +('mall4cloud-delivery-order-448','1','1000','订单物流id'), +('mall4cloud-delivery-order-449','1','1000','订单物流id'), +('mall4cloud-delivery-order-450','1','1000','订单物流id'), +('mall4cloud-delivery-order-451','1','1000','订单物流id'), +('mall4cloud-delivery-order-452','1','1000','订单物流id'), +('mall4cloud-delivery-order-453','1','1000','订单物流id'), +('mall4cloud-delivery-order-454','1','1000','订单物流id'), +('mall4cloud-delivery-order-455','1','1000','订单物流id'), +('mall4cloud-delivery-order-456','1','1000','订单物流id'), +('mall4cloud-delivery-order-457','1','1000','订单物流id'), +('mall4cloud-delivery-order-458','1','1000','订单物流id'), +('mall4cloud-delivery-order-459','1','1000','订单物流id'), +('mall4cloud-delivery-order-460','1','1000','订单物流id'), +('mall4cloud-delivery-order-461','1','1000','订单物流id'), +('mall4cloud-delivery-order-462','1','1000','订单物流id'), +('mall4cloud-delivery-order-463','1','1000','订单物流id'), +('mall4cloud-delivery-order-464','1','1000','订单物流id'), +('mall4cloud-delivery-order-465','1','1000','订单物流id'), +('mall4cloud-delivery-order-466','1','1000','订单物流id'), +('mall4cloud-delivery-order-467','1','1000','订单物流id'), +('mall4cloud-delivery-order-468','1','1000','订单物流id'), +('mall4cloud-delivery-order-469','1','1000','订单物流id'), +('mall4cloud-delivery-order-470','1','1000','订单物流id'), +('mall4cloud-delivery-order-471','1','1000','订单物流id'), +('mall4cloud-delivery-order-472','1','1000','订单物流id'), +('mall4cloud-delivery-order-473','1','1000','订单物流id'), +('mall4cloud-delivery-order-474','1','1000','订单物流id'), +('mall4cloud-delivery-order-475','1','1000','订单物流id'), +('mall4cloud-delivery-order-476','1','1000','订单物流id'), +('mall4cloud-delivery-order-477','1','1000','订单物流id'), +('mall4cloud-delivery-order-478','1','1000','订单物流id'), +('mall4cloud-delivery-order-479','1','1000','订单物流id'), +('mall4cloud-delivery-order-480','1','1000','订单物流id'), +('mall4cloud-delivery-order-481','1','1000','订单物流id'), +('mall4cloud-delivery-order-482','1','1000','订单物流id'), +('mall4cloud-delivery-order-483','1','1000','订单物流id'), +('mall4cloud-delivery-order-484','1','1000','订单物流id'), +('mall4cloud-delivery-order-485','1','1000','订单物流id'), +('mall4cloud-delivery-order-486','1','1000','订单物流id'), +('mall4cloud-delivery-order-487','1','1000','订单物流id'), +('mall4cloud-delivery-order-488','1','1000','订单物流id'), +('mall4cloud-delivery-order-489','1','1000','订单物流id'), +('mall4cloud-delivery-order-490','1','1000','订单物流id'), +('mall4cloud-delivery-order-491','1','1000','订单物流id'), +('mall4cloud-delivery-order-492','1','1000','订单物流id'), +('mall4cloud-delivery-order-493','1','1000','订单物流id'), +('mall4cloud-delivery-order-494','1','1000','订单物流id'), +('mall4cloud-delivery-order-495','1','1000','订单物流id'), +('mall4cloud-delivery-order-496','1','1000','订单物流id'), +('mall4cloud-delivery-order-497','1','1000','订单物流id'), +('mall4cloud-delivery-order-498','1','1000','订单物流id'), +('mall4cloud-delivery-order-499','1','1000','订单物流id'), +('mall4cloud-delivery-order-500','1','1000','订单物流id'), +('mall4cloud-delivery-order-501','1','1000','订单物流id'), +('mall4cloud-delivery-order-502','1','1000','订单物流id'), +('mall4cloud-delivery-order-503','1','1000','订单物流id'), +('mall4cloud-delivery-order-504','1','1000','订单物流id'), +('mall4cloud-delivery-order-505','1','1000','订单物流id'), +('mall4cloud-delivery-order-506','1','1000','订单物流id'), +('mall4cloud-delivery-order-507','1','1000','订单物流id'), +('mall4cloud-delivery-order-508','1','1000','订单物流id'), +('mall4cloud-delivery-order-509','1','1000','订单物流id'), +('mall4cloud-delivery-order-510','1','1000','订单物流id'), +('mall4cloud-delivery-order-511','1','1000','订单物流id'), +('mall4cloud-delivery-order-512','1','1000','订单物流id'), +('mall4cloud-delivery-order-513','1','1000','订单物流id'), +('mall4cloud-delivery-order-514','1','1000','订单物流id'), +('mall4cloud-delivery-order-515','1','1000','订单物流id'), +('mall4cloud-delivery-order-516','1','1000','订单物流id'), +('mall4cloud-delivery-order-517','1','1000','订单物流id'), +('mall4cloud-delivery-order-518','1','1000','订单物流id'), +('mall4cloud-delivery-order-519','1','1000','订单物流id'), +('mall4cloud-delivery-order-520','1','1000','订单物流id'), +('mall4cloud-delivery-order-521','1','1000','订单物流id'), +('mall4cloud-delivery-order-522','1','1000','订单物流id'), +('mall4cloud-delivery-order-523','1','1000','订单物流id'), +('mall4cloud-delivery-order-524','1','1000','订单物流id'), +('mall4cloud-delivery-order-525','1','1000','订单物流id'), +('mall4cloud-delivery-order-526','1','1000','订单物流id'), +('mall4cloud-delivery-order-527','1','1000','订单物流id'), +('mall4cloud-delivery-order-528','1','1000','订单物流id'), +('mall4cloud-delivery-order-529','1','1000','订单物流id'), +('mall4cloud-delivery-order-530','1','1000','订单物流id'), +('mall4cloud-delivery-order-531','1','1000','订单物流id'), +('mall4cloud-delivery-order-532','1','1000','订单物流id'), +('mall4cloud-delivery-order-533','1','1000','订单物流id'), +('mall4cloud-delivery-order-534','1','1000','订单物流id'), +('mall4cloud-delivery-order-535','1','1000','订单物流id'), +('mall4cloud-delivery-order-536','1','1000','订单物流id'), +('mall4cloud-delivery-order-537','1','1000','订单物流id'), +('mall4cloud-delivery-order-538','1','1000','订单物流id'), +('mall4cloud-delivery-order-539','1','1000','订单物流id'), +('mall4cloud-delivery-order-540','1','1000','订单物流id'), +('mall4cloud-delivery-order-541','1','1000','订单物流id'), +('mall4cloud-delivery-order-542','1','1000','订单物流id'), +('mall4cloud-delivery-order-543','1','1000','订单物流id'), +('mall4cloud-delivery-order-544','1','1000','订单物流id'), +('mall4cloud-delivery-order-545','1','1000','订单物流id'), +('mall4cloud-delivery-order-546','1','1000','订单物流id'), +('mall4cloud-delivery-order-547','1','1000','订单物流id'), +('mall4cloud-delivery-order-548','1','1000','订单物流id'), +('mall4cloud-delivery-order-549','1','1000','订单物流id'), +('mall4cloud-delivery-order-550','1','1000','订单物流id'), +('mall4cloud-delivery-order-551','1','1000','订单物流id'), +('mall4cloud-delivery-order-552','1','1000','订单物流id'), +('mall4cloud-delivery-order-553','1','1000','订单物流id'), +('mall4cloud-delivery-order-554','1','1000','订单物流id'), +('mall4cloud-delivery-order-555','1','1000','订单物流id'), +('mall4cloud-delivery-order-556','1','1000','订单物流id'), +('mall4cloud-delivery-order-557','1','1000','订单物流id'), +('mall4cloud-delivery-order-558','1','1000','订单物流id'), +('mall4cloud-delivery-order-559','1','1000','订单物流id'), +('mall4cloud-delivery-order-560','1','1000','订单物流id'), +('mall4cloud-delivery-order-561','1','1000','订单物流id'), +('mall4cloud-delivery-order-562','1','1000','订单物流id'), +('mall4cloud-delivery-order-563','1','1000','订单物流id'), +('mall4cloud-delivery-order-564','1','1000','订单物流id'), +('mall4cloud-delivery-order-565','1','1000','订单物流id'), +('mall4cloud-delivery-order-566','1','1000','订单物流id'), +('mall4cloud-delivery-order-567','1','1000','订单物流id'), +('mall4cloud-delivery-order-568','1','1000','订单物流id'), +('mall4cloud-delivery-order-569','1','1000','订单物流id'), +('mall4cloud-delivery-order-570','1','1000','订单物流id'), +('mall4cloud-delivery-order-571','1','1000','订单物流id'), +('mall4cloud-delivery-order-572','1','1000','订单物流id'), +('mall4cloud-delivery-order-573','1','1000','订单物流id'), +('mall4cloud-delivery-order-574','1','1000','订单物流id'), +('mall4cloud-delivery-order-575','1','1000','订单物流id'), +('mall4cloud-delivery-order-576','1','1000','订单物流id'), +('mall4cloud-delivery-order-577','1','1000','订单物流id'), +('mall4cloud-delivery-order-578','1','1000','订单物流id'), +('mall4cloud-delivery-order-579','1','1000','订单物流id'), +('mall4cloud-delivery-order-580','1','1000','订单物流id'), +('mall4cloud-delivery-order-581','1','1000','订单物流id'), +('mall4cloud-delivery-order-582','1','1000','订单物流id'), +('mall4cloud-delivery-order-583','1','1000','订单物流id'), +('mall4cloud-delivery-order-584','1','1000','订单物流id'), +('mall4cloud-delivery-order-585','1','1000','订单物流id'), +('mall4cloud-delivery-order-586','1','1000','订单物流id'), +('mall4cloud-delivery-order-587','1','1000','订单物流id'), +('mall4cloud-delivery-order-588','1','1000','订单物流id'), +('mall4cloud-delivery-order-589','1','1000','订单物流id'), +('mall4cloud-delivery-order-590','1','1000','订单物流id'), +('mall4cloud-delivery-order-591','1','1000','订单物流id'), +('mall4cloud-delivery-order-592','1','1000','订单物流id'), +('mall4cloud-delivery-order-593','1','1000','订单物流id'), +('mall4cloud-delivery-order-594','1','1000','订单物流id'), +('mall4cloud-delivery-order-595','1','1000','订单物流id'), +('mall4cloud-delivery-order-596','1','1000','订单物流id'), +('mall4cloud-delivery-order-597','1','1000','订单物流id'), +('mall4cloud-delivery-order-598','1','1000','订单物流id'), +('mall4cloud-delivery-order-599','1','1000','订单物流id'), +('mall4cloud-delivery-order-600','1','1000','订单物流id'), +('mall4cloud-delivery-order-601','1','1000','订单物流id'), +('mall4cloud-delivery-order-602','1','1000','订单物流id'), +('mall4cloud-delivery-order-603','1','1000','订单物流id'), +('mall4cloud-delivery-order-604','1','1000','订单物流id'), +('mall4cloud-delivery-order-605','1','1000','订单物流id'), +('mall4cloud-delivery-order-606','1','1000','订单物流id'), +('mall4cloud-delivery-order-607','1','1000','订单物流id'), +('mall4cloud-delivery-order-608','1','1000','订单物流id'), +('mall4cloud-delivery-order-609','1','1000','订单物流id'), +('mall4cloud-delivery-order-610','1','1000','订单物流id'), +('mall4cloud-delivery-order-611','1','1000','订单物流id'), +('mall4cloud-delivery-order-612','1','1000','订单物流id'), +('mall4cloud-delivery-order-613','1','1000','订单物流id'), +('mall4cloud-delivery-order-614','1','1000','订单物流id'), +('mall4cloud-delivery-order-615','1','1000','订单物流id'), +('mall4cloud-delivery-order-616','1','1000','订单物流id'), +('mall4cloud-delivery-order-617','1','1000','订单物流id'), +('mall4cloud-delivery-order-618','1','1000','订单物流id'), +('mall4cloud-delivery-order-619','1','1000','订单物流id'), +('mall4cloud-delivery-order-620','1','1000','订单物流id'), +('mall4cloud-delivery-order-621','1','1000','订单物流id'), +('mall4cloud-delivery-order-622','1','1000','订单物流id'), +('mall4cloud-delivery-order-623','1','1000','订单物流id'), +('mall4cloud-delivery-order-624','1','1000','订单物流id'), +('mall4cloud-delivery-order-625','1','1000','订单物流id'), +('mall4cloud-delivery-order-626','1','1000','订单物流id'), +('mall4cloud-delivery-order-627','1','1000','订单物流id'), +('mall4cloud-delivery-order-628','1','1000','订单物流id'), +('mall4cloud-delivery-order-629','1','1000','订单物流id'), +('mall4cloud-delivery-order-630','1','1000','订单物流id'), +('mall4cloud-delivery-order-631','1','1000','订单物流id'), +('mall4cloud-delivery-order-632','1','1000','订单物流id'), +('mall4cloud-delivery-order-633','1','1000','订单物流id'), +('mall4cloud-delivery-order-634','1','1000','订单物流id'), +('mall4cloud-delivery-order-635','1','1000','订单物流id'), +('mall4cloud-delivery-order-636','1','1000','订单物流id'), +('mall4cloud-delivery-order-637','1','1000','订单物流id'), +('mall4cloud-delivery-order-638','1','1000','订单物流id'), +('mall4cloud-delivery-order-639','1','1000','订单物流id'), +('mall4cloud-delivery-order-640','1','1000','订单物流id'), +('mall4cloud-delivery-order-641','1','1000','订单物流id'), +('mall4cloud-delivery-order-642','1','1000','订单物流id'), +('mall4cloud-delivery-order-643','1','1000','订单物流id'), +('mall4cloud-delivery-order-644','1','1000','订单物流id'), +('mall4cloud-delivery-order-645','1','1000','订单物流id'), +('mall4cloud-delivery-order-646','1','1000','订单物流id'), +('mall4cloud-delivery-order-647','1','1000','订单物流id'), +('mall4cloud-delivery-order-648','1','1000','订单物流id'), +('mall4cloud-delivery-order-649','1','1000','订单物流id'), +('mall4cloud-delivery-order-650','1','1000','订单物流id'), +('mall4cloud-delivery-order-651','1','1000','订单物流id'), +('mall4cloud-delivery-order-652','1','1000','订单物流id'), +('mall4cloud-delivery-order-653','1','1000','订单物流id'), +('mall4cloud-delivery-order-654','1','1000','订单物流id'), +('mall4cloud-delivery-order-655','1','1000','订单物流id'), +('mall4cloud-delivery-order-656','1','1000','订单物流id'), +('mall4cloud-delivery-order-657','1','1000','订单物流id'), +('mall4cloud-delivery-order-658','1','1000','订单物流id'), +('mall4cloud-delivery-order-659','1','1000','订单物流id'), +('mall4cloud-delivery-order-660','1','1000','订单物流id'), +('mall4cloud-delivery-order-661','1','1000','订单物流id'), +('mall4cloud-delivery-order-662','1','1000','订单物流id'), +('mall4cloud-delivery-order-663','1','1000','订单物流id'), +('mall4cloud-delivery-order-664','1','1000','订单物流id'), +('mall4cloud-delivery-order-665','1','1000','订单物流id'), +('mall4cloud-delivery-order-666','1','1000','订单物流id'), +('mall4cloud-delivery-order-667','1','1000','订单物流id'), +('mall4cloud-delivery-order-668','1','1000','订单物流id'), +('mall4cloud-delivery-order-669','1','1000','订单物流id'), +('mall4cloud-delivery-order-670','1','1000','订单物流id'), +('mall4cloud-delivery-order-671','1','1000','订单物流id'), +('mall4cloud-delivery-order-672','1','1000','订单物流id'), +('mall4cloud-delivery-order-673','1','1000','订单物流id'), +('mall4cloud-delivery-order-674','1','1000','订单物流id'), +('mall4cloud-delivery-order-675','1','1000','订单物流id'), +('mall4cloud-delivery-order-676','1','1000','订单物流id'), +('mall4cloud-delivery-order-677','1','1000','订单物流id'), +('mall4cloud-delivery-order-678','1','1000','订单物流id'), +('mall4cloud-delivery-order-679','1','1000','订单物流id'), +('mall4cloud-delivery-order-680','1','1000','订单物流id'), +('mall4cloud-delivery-order-681','1','1000','订单物流id'), +('mall4cloud-delivery-order-682','1','1000','订单物流id'), +('mall4cloud-delivery-order-683','1','1000','订单物流id'), +('mall4cloud-delivery-order-684','1','1000','订单物流id'), +('mall4cloud-delivery-order-685','1','1000','订单物流id'), +('mall4cloud-delivery-order-686','1','1000','订单物流id'), +('mall4cloud-delivery-order-687','1','1000','订单物流id'), +('mall4cloud-delivery-order-688','1','1000','订单物流id'), +('mall4cloud-delivery-order-689','1','1000','订单物流id'), +('mall4cloud-delivery-order-690','1','1000','订单物流id'), +('mall4cloud-delivery-order-691','1','1000','订单物流id'), +('mall4cloud-delivery-order-692','1','1000','订单物流id'), +('mall4cloud-delivery-order-693','1','1000','订单物流id'), +('mall4cloud-delivery-order-694','1','1000','订单物流id'), +('mall4cloud-delivery-order-695','1','1000','订单物流id'), +('mall4cloud-delivery-order-696','1','1000','订单物流id'), +('mall4cloud-delivery-order-697','1','1000','订单物流id'), +('mall4cloud-delivery-order-698','1','1000','订单物流id'), +('mall4cloud-delivery-order-699','1','1000','订单物流id'), +('mall4cloud-delivery-order-700','1','1000','订单物流id'), +('mall4cloud-delivery-order-701','1','1000','订单物流id'), +('mall4cloud-delivery-order-702','1','1000','订单物流id'), +('mall4cloud-delivery-order-703','1','1000','订单物流id'), +('mall4cloud-delivery-order-704','1','1000','订单物流id'), +('mall4cloud-delivery-order-705','1','1000','订单物流id'), +('mall4cloud-delivery-order-706','1','1000','订单物流id'), +('mall4cloud-delivery-order-707','1','1000','订单物流id'), +('mall4cloud-delivery-order-708','1','1000','订单物流id'), +('mall4cloud-delivery-order-709','1','1000','订单物流id'), +('mall4cloud-delivery-order-710','1','1000','订单物流id'), +('mall4cloud-delivery-order-711','1','1000','订单物流id'), +('mall4cloud-delivery-order-712','1','1000','订单物流id'), +('mall4cloud-delivery-order-713','1','1000','订单物流id'), +('mall4cloud-delivery-order-714','1','1000','订单物流id'), +('mall4cloud-delivery-order-715','1','1000','订单物流id'), +('mall4cloud-delivery-order-716','1','1000','订单物流id'), +('mall4cloud-delivery-order-717','1','1000','订单物流id'), +('mall4cloud-delivery-order-718','1','1000','订单物流id'), +('mall4cloud-delivery-order-719','1','1000','订单物流id'), +('mall4cloud-delivery-order-720','1','1000','订单物流id'), +('mall4cloud-delivery-order-721','1','1000','订单物流id'), +('mall4cloud-delivery-order-722','1','1000','订单物流id'), +('mall4cloud-delivery-order-723','1','1000','订单物流id'), +('mall4cloud-delivery-order-724','1','1000','订单物流id'), +('mall4cloud-delivery-order-725','1','1000','订单物流id'), +('mall4cloud-delivery-order-726','1','1000','订单物流id'), +('mall4cloud-delivery-order-727','1','1000','订单物流id'), +('mall4cloud-delivery-order-728','1','1000','订单物流id'), +('mall4cloud-delivery-order-729','1','1000','订单物流id'), +('mall4cloud-delivery-order-730','1','1000','订单物流id'), +('mall4cloud-delivery-order-731','1','1000','订单物流id'), +('mall4cloud-delivery-order-732','1','1000','订单物流id'), +('mall4cloud-delivery-order-733','1','1000','订单物流id'), +('mall4cloud-delivery-order-734','1','1000','订单物流id'), +('mall4cloud-delivery-order-735','1','1000','订单物流id'), +('mall4cloud-delivery-order-736','1','1000','订单物流id'), +('mall4cloud-delivery-order-737','1','1000','订单物流id'), +('mall4cloud-delivery-order-738','1','1000','订单物流id'), +('mall4cloud-delivery-order-739','1','1000','订单物流id'), +('mall4cloud-delivery-order-740','1','1000','订单物流id'), +('mall4cloud-delivery-order-741','1','1000','订单物流id'), +('mall4cloud-delivery-order-742','1','1000','订单物流id'), +('mall4cloud-delivery-order-743','1','1000','订单物流id'), +('mall4cloud-delivery-order-744','1','1000','订单物流id'), +('mall4cloud-delivery-order-745','1','1000','订单物流id'), +('mall4cloud-delivery-order-746','1','1000','订单物流id'), +('mall4cloud-delivery-order-747','1','1000','订单物流id'), +('mall4cloud-delivery-order-748','1','1000','订单物流id'), +('mall4cloud-delivery-order-749','1','1000','订单物流id'), +('mall4cloud-delivery-order-750','1','1000','订单物流id'), +('mall4cloud-delivery-order-751','1','1000','订单物流id'), +('mall4cloud-delivery-order-752','1','1000','订单物流id'), +('mall4cloud-delivery-order-753','1','1000','订单物流id'), +('mall4cloud-delivery-order-754','1','1000','订单物流id'), +('mall4cloud-delivery-order-755','1','1000','订单物流id'), +('mall4cloud-delivery-order-756','1','1000','订单物流id'), +('mall4cloud-delivery-order-757','1','1000','订单物流id'), +('mall4cloud-delivery-order-758','1','1000','订单物流id'), +('mall4cloud-delivery-order-759','1','1000','订单物流id'), +('mall4cloud-delivery-order-760','1','1000','订单物流id'), +('mall4cloud-delivery-order-761','1','1000','订单物流id'), +('mall4cloud-delivery-order-762','1','1000','订单物流id'), +('mall4cloud-delivery-order-763','1','1000','订单物流id'), +('mall4cloud-delivery-order-764','1','1000','订单物流id'), +('mall4cloud-delivery-order-765','1','1000','订单物流id'), +('mall4cloud-delivery-order-766','1','1000','订单物流id'), +('mall4cloud-delivery-order-767','1','1000','订单物流id'), +('mall4cloud-delivery-order-768','1','1000','订单物流id'), +('mall4cloud-delivery-order-769','1','1000','订单物流id'), +('mall4cloud-delivery-order-770','1','1000','订单物流id'), +('mall4cloud-delivery-order-771','1','1000','订单物流id'), +('mall4cloud-delivery-order-772','1','1000','订单物流id'), +('mall4cloud-delivery-order-773','1','1000','订单物流id'), +('mall4cloud-delivery-order-774','1','1000','订单物流id'), +('mall4cloud-delivery-order-775','1','1000','订单物流id'), +('mall4cloud-delivery-order-776','1','1000','订单物流id'), +('mall4cloud-delivery-order-777','1','1000','订单物流id'), +('mall4cloud-delivery-order-778','1','1000','订单物流id'), +('mall4cloud-delivery-order-779','1','1000','订单物流id'), +('mall4cloud-delivery-order-780','1','1000','订单物流id'), +('mall4cloud-delivery-order-781','1','1000','订单物流id'), +('mall4cloud-delivery-order-782','1','1000','订单物流id'), +('mall4cloud-delivery-order-783','1','1000','订单物流id'), +('mall4cloud-delivery-order-784','1','1000','订单物流id'), +('mall4cloud-delivery-order-785','1','1000','订单物流id'), +('mall4cloud-delivery-order-786','1','1000','订单物流id'), +('mall4cloud-delivery-order-787','1','1000','订单物流id'), +('mall4cloud-delivery-order-788','1','1000','订单物流id'), +('mall4cloud-delivery-order-789','1','1000','订单物流id'), +('mall4cloud-delivery-order-790','1','1000','订单物流id'), +('mall4cloud-delivery-order-791','1','1000','订单物流id'), +('mall4cloud-delivery-order-792','1','1000','订单物流id'), +('mall4cloud-delivery-order-793','1','1000','订单物流id'), +('mall4cloud-delivery-order-794','1','1000','订单物流id'), +('mall4cloud-delivery-order-795','1','1000','订单物流id'), +('mall4cloud-delivery-order-796','1','1000','订单物流id'), +('mall4cloud-delivery-order-797','1','1000','订单物流id'), +('mall4cloud-delivery-order-798','1','1000','订单物流id'), +('mall4cloud-delivery-order-799','1','1000','订单物流id'), +('mall4cloud-delivery-order-800','1','1000','订单物流id'), +('mall4cloud-delivery-order-801','1','1000','订单物流id'), +('mall4cloud-delivery-order-802','1','1000','订单物流id'), +('mall4cloud-delivery-order-803','1','1000','订单物流id'), +('mall4cloud-delivery-order-804','1','1000','订单物流id'), +('mall4cloud-delivery-order-805','1','1000','订单物流id'), +('mall4cloud-delivery-order-806','1','1000','订单物流id'), +('mall4cloud-delivery-order-807','1','1000','订单物流id'), +('mall4cloud-delivery-order-808','1','1000','订单物流id'), +('mall4cloud-delivery-order-809','1','1000','订单物流id'), +('mall4cloud-delivery-order-810','1','1000','订单物流id'), +('mall4cloud-delivery-order-811','1','1000','订单物流id'), +('mall4cloud-delivery-order-812','1','1000','订单物流id'), +('mall4cloud-delivery-order-813','1','1000','订单物流id'), +('mall4cloud-delivery-order-814','1','1000','订单物流id'), +('mall4cloud-delivery-order-815','1','1000','订单物流id'), +('mall4cloud-delivery-order-816','1','1000','订单物流id'), +('mall4cloud-delivery-order-817','1','1000','订单物流id'), +('mall4cloud-delivery-order-818','1','1000','订单物流id'), +('mall4cloud-delivery-order-819','1','1000','订单物流id'), +('mall4cloud-delivery-order-820','1','1000','订单物流id'), +('mall4cloud-delivery-order-821','1','1000','订单物流id'), +('mall4cloud-delivery-order-822','1','1000','订单物流id'), +('mall4cloud-delivery-order-823','1','1000','订单物流id'), +('mall4cloud-delivery-order-824','1','1000','订单物流id'), +('mall4cloud-delivery-order-825','1','1000','订单物流id'), +('mall4cloud-delivery-order-826','1','1000','订单物流id'), +('mall4cloud-delivery-order-827','1','1000','订单物流id'), +('mall4cloud-delivery-order-828','1','1000','订单物流id'), +('mall4cloud-delivery-order-829','1','1000','订单物流id'), +('mall4cloud-delivery-order-830','1','1000','订单物流id'), +('mall4cloud-delivery-order-831','1','1000','订单物流id'), +('mall4cloud-delivery-order-832','1','1000','订单物流id'), +('mall4cloud-delivery-order-833','1','1000','订单物流id'), +('mall4cloud-delivery-order-834','1','1000','订单物流id'), +('mall4cloud-delivery-order-835','1','1000','订单物流id'), +('mall4cloud-delivery-order-836','1','1000','订单物流id'), +('mall4cloud-delivery-order-837','1','1000','订单物流id'), +('mall4cloud-delivery-order-838','1','1000','订单物流id'), +('mall4cloud-delivery-order-839','1','1000','订单物流id'), +('mall4cloud-delivery-order-840','1','1000','订单物流id'), +('mall4cloud-delivery-order-841','1','1000','订单物流id'), +('mall4cloud-delivery-order-842','1','1000','订单物流id'), +('mall4cloud-delivery-order-843','1','1000','订单物流id'), +('mall4cloud-delivery-order-844','1','1000','订单物流id'), +('mall4cloud-delivery-order-845','1','1000','订单物流id'), +('mall4cloud-delivery-order-846','1','1000','订单物流id'), +('mall4cloud-delivery-order-847','1','1000','订单物流id'), +('mall4cloud-delivery-order-848','1','1000','订单物流id'), +('mall4cloud-delivery-order-849','1','1000','订单物流id'), +('mall4cloud-delivery-order-850','1','1000','订单物流id'), +('mall4cloud-delivery-order-851','1','1000','订单物流id'), +('mall4cloud-delivery-order-852','1','1000','订单物流id'), +('mall4cloud-delivery-order-853','1','1000','订单物流id'), +('mall4cloud-delivery-order-854','1','1000','订单物流id'), +('mall4cloud-delivery-order-855','1','1000','订单物流id'), +('mall4cloud-delivery-order-856','1','1000','订单物流id'), +('mall4cloud-delivery-order-857','1','1000','订单物流id'), +('mall4cloud-delivery-order-858','1','1000','订单物流id'), +('mall4cloud-delivery-order-859','1','1000','订单物流id'), +('mall4cloud-delivery-order-860','1','1000','订单物流id'), +('mall4cloud-delivery-order-861','1','1000','订单物流id'), +('mall4cloud-delivery-order-862','1','1000','订单物流id'), +('mall4cloud-delivery-order-863','1','1000','订单物流id'), +('mall4cloud-delivery-order-864','1','1000','订单物流id'), +('mall4cloud-delivery-order-865','1','1000','订单物流id'), +('mall4cloud-delivery-order-866','1','1000','订单物流id'), +('mall4cloud-delivery-order-867','1','1000','订单物流id'), +('mall4cloud-delivery-order-868','1','1000','订单物流id'), +('mall4cloud-delivery-order-869','1','1000','订单物流id'), +('mall4cloud-delivery-order-870','1','1000','订单物流id'), +('mall4cloud-delivery-order-871','1','1000','订单物流id'), +('mall4cloud-delivery-order-872','1','1000','订单物流id'), +('mall4cloud-delivery-order-873','1','1000','订单物流id'), +('mall4cloud-delivery-order-874','1','1000','订单物流id'), +('mall4cloud-delivery-order-875','1','1000','订单物流id'), +('mall4cloud-delivery-order-876','1','1000','订单物流id'), +('mall4cloud-delivery-order-877','1','1000','订单物流id'), +('mall4cloud-delivery-order-878','1','1000','订单物流id'), +('mall4cloud-delivery-order-879','1','1000','订单物流id'), +('mall4cloud-delivery-order-880','1','1000','订单物流id'), +('mall4cloud-delivery-order-881','1','1000','订单物流id'), +('mall4cloud-delivery-order-882','1','1000','订单物流id'), +('mall4cloud-delivery-order-883','1','1000','订单物流id'), +('mall4cloud-delivery-order-884','1','1000','订单物流id'), +('mall4cloud-delivery-order-885','1','1000','订单物流id'), +('mall4cloud-delivery-order-886','1','1000','订单物流id'), +('mall4cloud-delivery-order-887','1','1000','订单物流id'), +('mall4cloud-delivery-order-888','1','1000','订单物流id'), +('mall4cloud-delivery-order-889','1','1000','订单物流id'), +('mall4cloud-delivery-order-890','1','1000','订单物流id'), +('mall4cloud-delivery-order-891','1','1000','订单物流id'), +('mall4cloud-delivery-order-892','1','1000','订单物流id'), +('mall4cloud-delivery-order-893','1','1000','订单物流id'), +('mall4cloud-delivery-order-894','1','1000','订单物流id'), +('mall4cloud-delivery-order-895','1','1000','订单物流id'), +('mall4cloud-delivery-order-896','1','1000','订单物流id'), +('mall4cloud-delivery-order-897','1','1000','订单物流id'), +('mall4cloud-delivery-order-898','1','1000','订单物流id'), +('mall4cloud-delivery-order-899','1','1000','订单物流id'), +('mall4cloud-delivery-order-900','1','1000','订单物流id'), +('mall4cloud-delivery-order-901','1','1000','订单物流id'), +('mall4cloud-delivery-order-902','1','1000','订单物流id'), +('mall4cloud-delivery-order-903','1','1000','订单物流id'), +('mall4cloud-delivery-order-904','1','1000','订单物流id'), +('mall4cloud-delivery-order-905','1','1000','订单物流id'), +('mall4cloud-delivery-order-906','1','1000','订单物流id'), +('mall4cloud-delivery-order-907','1','1000','订单物流id'), +('mall4cloud-delivery-order-908','1','1000','订单物流id'), +('mall4cloud-delivery-order-909','1','1000','订单物流id'), +('mall4cloud-delivery-order-910','1','1000','订单物流id'), +('mall4cloud-delivery-order-911','1','1000','订单物流id'), +('mall4cloud-delivery-order-912','1','1000','订单物流id'), +('mall4cloud-delivery-order-913','1','1000','订单物流id'), +('mall4cloud-delivery-order-914','1','1000','订单物流id'), +('mall4cloud-delivery-order-915','1','1000','订单物流id'), +('mall4cloud-delivery-order-916','1','1000','订单物流id'), +('mall4cloud-delivery-order-917','1','1000','订单物流id'), +('mall4cloud-delivery-order-918','1','1000','订单物流id'), +('mall4cloud-delivery-order-919','1','1000','订单物流id'), +('mall4cloud-delivery-order-920','1','1000','订单物流id'), +('mall4cloud-delivery-order-921','1','1000','订单物流id'), +('mall4cloud-delivery-order-922','1','1000','订单物流id'), +('mall4cloud-delivery-order-923','1','1000','订单物流id'), +('mall4cloud-delivery-order-924','1','1000','订单物流id'), +('mall4cloud-delivery-order-925','1','1000','订单物流id'), +('mall4cloud-delivery-order-926','1','1000','订单物流id'), +('mall4cloud-delivery-order-927','1','1000','订单物流id'), +('mall4cloud-delivery-order-928','1','1000','订单物流id'), +('mall4cloud-delivery-order-929','1','1000','订单物流id'), +('mall4cloud-delivery-order-930','1','1000','订单物流id'), +('mall4cloud-delivery-order-931','1','1000','订单物流id'), +('mall4cloud-delivery-order-932','1','1000','订单物流id'), +('mall4cloud-delivery-order-933','1','1000','订单物流id'), +('mall4cloud-delivery-order-934','1','1000','订单物流id'), +('mall4cloud-delivery-order-935','1','1000','订单物流id'), +('mall4cloud-delivery-order-936','1','1000','订单物流id'), +('mall4cloud-delivery-order-937','1','1000','订单物流id'), +('mall4cloud-delivery-order-938','1','1000','订单物流id'), +('mall4cloud-delivery-order-939','1','1000','订单物流id'), +('mall4cloud-delivery-order-940','1','1000','订单物流id'), +('mall4cloud-delivery-order-941','1','1000','订单物流id'), +('mall4cloud-delivery-order-942','1','1000','订单物流id'), +('mall4cloud-delivery-order-943','1','1000','订单物流id'), +('mall4cloud-delivery-order-944','1','1000','订单物流id'), +('mall4cloud-delivery-order-945','1','1000','订单物流id'), +('mall4cloud-delivery-order-946','1','1000','订单物流id'), +('mall4cloud-delivery-order-947','1','1000','订单物流id'), +('mall4cloud-delivery-order-948','1','1000','订单物流id'), +('mall4cloud-delivery-order-949','1','1000','订单物流id'), +('mall4cloud-delivery-order-950','1','1000','订单物流id'), +('mall4cloud-delivery-order-951','1','1000','订单物流id'), +('mall4cloud-delivery-order-952','1','1000','订单物流id'), +('mall4cloud-delivery-order-953','1','1000','订单物流id'), +('mall4cloud-delivery-order-954','1','1000','订单物流id'), +('mall4cloud-delivery-order-955','1','1000','订单物流id'), +('mall4cloud-delivery-order-956','1','1000','订单物流id'), +('mall4cloud-delivery-order-957','1','1000','订单物流id'), +('mall4cloud-delivery-order-958','1','1000','订单物流id'), +('mall4cloud-delivery-order-959','1','1000','订单物流id'), +('mall4cloud-delivery-order-960','1','1000','订单物流id'), +('mall4cloud-delivery-order-961','1','1000','订单物流id'), +('mall4cloud-delivery-order-962','1','1000','订单物流id'), +('mall4cloud-delivery-order-963','1','1000','订单物流id'), +('mall4cloud-delivery-order-964','1','1000','订单物流id'), +('mall4cloud-delivery-order-965','1','1000','订单物流id'), +('mall4cloud-delivery-order-966','1','1000','订单物流id'), +('mall4cloud-delivery-order-967','1','1000','订单物流id'), +('mall4cloud-delivery-order-968','1','1000','订单物流id'), +('mall4cloud-delivery-order-969','1','1000','订单物流id'), +('mall4cloud-delivery-order-970','1','1000','订单物流id'), +('mall4cloud-delivery-order-971','1','1000','订单物流id'), +('mall4cloud-delivery-order-972','1','1000','订单物流id'), +('mall4cloud-delivery-order-973','1','1000','订单物流id'), +('mall4cloud-delivery-order-974','1','1000','订单物流id'), +('mall4cloud-delivery-order-975','1','1000','订单物流id'), +('mall4cloud-delivery-order-976','1','1000','订单物流id'), +('mall4cloud-delivery-order-977','1','1000','订单物流id'), +('mall4cloud-delivery-order-978','1','1000','订单物流id'), +('mall4cloud-delivery-order-979','1','1000','订单物流id'), +('mall4cloud-delivery-order-980','1','1000','订单物流id'), +('mall4cloud-delivery-order-981','1','1000','订单物流id'), +('mall4cloud-delivery-order-982','1','1000','订单物流id'), +('mall4cloud-delivery-order-983','1','1000','订单物流id'), +('mall4cloud-delivery-order-984','1','1000','订单物流id'), +('mall4cloud-delivery-order-985','1','1000','订单物流id'), +('mall4cloud-delivery-order-986','1','1000','订单物流id'), +('mall4cloud-delivery-order-987','1','1000','订单物流id'), +('mall4cloud-delivery-order-988','1','1000','订单物流id'), +('mall4cloud-delivery-order-989','1','1000','订单物流id'), +('mall4cloud-delivery-order-990','1','1000','订单物流id'), +('mall4cloud-delivery-order-991','1','1000','订单物流id'), +('mall4cloud-delivery-order-992','1','1000','订单物流id'), +('mall4cloud-delivery-order-993','1','1000','订单物流id'), +('mall4cloud-delivery-order-994','1','1000','订单物流id'), +('mall4cloud-delivery-order-995','1','1000','订单物流id'), +('mall4cloud-delivery-order-996','1','1000','订单物流id'), +('mall4cloud-delivery-order-997','1','1000','订单物流id'), +('mall4cloud-delivery-order-998','1','1000','订单物流id'), +('mall4cloud-delivery-order-999','1','1000','订单物流id'), +('mall4cloud-delivery-order-item-000','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-001','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-002','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-003','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-004','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-005','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-006','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-007','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-008','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-009','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-010','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-011','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-012','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-013','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-014','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-015','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-016','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-017','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-018','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-019','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-020','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-021','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-022','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-023','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-024','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-025','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-026','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-027','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-028','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-029','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-030','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-031','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-032','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-033','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-034','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-035','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-036','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-037','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-038','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-039','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-040','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-041','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-042','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-043','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-044','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-045','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-046','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-047','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-048','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-049','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-050','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-051','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-052','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-053','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-054','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-055','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-056','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-057','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-058','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-059','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-060','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-061','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-062','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-063','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-064','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-065','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-066','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-067','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-068','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-069','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-070','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-071','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-072','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-073','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-074','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-075','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-076','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-077','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-078','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-079','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-080','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-081','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-082','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-083','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-084','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-085','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-086','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-087','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-088','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-089','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-090','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-091','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-092','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-093','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-094','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-095','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-096','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-097','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-098','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-099','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-100','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-101','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-102','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-103','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-104','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-105','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-106','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-107','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-108','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-109','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-110','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-111','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-112','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-113','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-114','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-115','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-116','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-117','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-118','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-119','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-120','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-121','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-122','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-123','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-124','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-125','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-126','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-127','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-128','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-129','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-130','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-131','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-132','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-133','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-134','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-135','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-136','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-137','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-138','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-139','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-140','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-141','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-142','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-143','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-144','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-145','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-146','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-147','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-148','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-149','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-150','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-151','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-152','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-153','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-154','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-155','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-156','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-157','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-158','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-159','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-160','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-161','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-162','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-163','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-164','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-165','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-166','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-167','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-168','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-169','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-170','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-171','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-172','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-173','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-174','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-175','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-176','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-177','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-178','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-179','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-180','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-181','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-182','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-183','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-184','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-185','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-186','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-187','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-188','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-189','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-190','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-191','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-192','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-193','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-194','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-195','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-196','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-197','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-198','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-199','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-200','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-201','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-202','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-203','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-204','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-205','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-206','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-207','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-208','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-209','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-210','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-211','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-212','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-213','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-214','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-215','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-216','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-217','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-218','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-219','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-220','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-221','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-222','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-223','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-224','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-225','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-226','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-227','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-228','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-229','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-230','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-231','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-232','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-233','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-234','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-235','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-236','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-237','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-238','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-239','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-240','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-241','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-242','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-243','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-244','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-245','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-246','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-247','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-248','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-249','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-250','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-251','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-252','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-253','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-254','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-255','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-256','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-257','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-258','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-259','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-260','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-261','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-262','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-263','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-264','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-265','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-266','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-267','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-268','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-269','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-270','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-271','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-272','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-273','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-274','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-275','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-276','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-277','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-278','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-279','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-280','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-281','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-282','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-283','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-284','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-285','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-286','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-287','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-288','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-289','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-290','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-291','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-292','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-293','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-294','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-295','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-296','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-297','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-298','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-299','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-300','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-301','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-302','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-303','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-304','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-305','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-306','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-307','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-308','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-309','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-310','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-311','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-312','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-313','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-314','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-315','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-316','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-317','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-318','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-319','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-320','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-321','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-322','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-323','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-324','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-325','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-326','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-327','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-328','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-329','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-330','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-331','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-332','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-333','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-334','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-335','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-336','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-337','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-338','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-339','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-340','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-341','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-342','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-343','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-344','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-345','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-346','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-347','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-348','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-349','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-350','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-351','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-352','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-353','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-354','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-355','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-356','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-357','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-358','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-359','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-360','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-361','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-362','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-363','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-364','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-365','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-366','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-367','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-368','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-369','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-370','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-371','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-372','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-373','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-374','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-375','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-376','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-377','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-378','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-379','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-380','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-381','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-382','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-383','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-384','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-385','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-386','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-387','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-388','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-389','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-390','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-391','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-392','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-393','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-394','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-395','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-396','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-397','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-398','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-399','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-400','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-401','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-402','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-403','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-404','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-405','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-406','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-407','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-408','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-409','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-410','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-411','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-412','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-413','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-414','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-415','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-416','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-417','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-418','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-419','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-420','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-421','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-422','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-423','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-424','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-425','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-426','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-427','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-428','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-429','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-430','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-431','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-432','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-433','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-434','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-435','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-436','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-437','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-438','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-439','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-440','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-441','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-442','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-443','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-444','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-445','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-446','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-447','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-448','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-449','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-450','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-451','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-452','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-453','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-454','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-455','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-456','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-457','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-458','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-459','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-460','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-461','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-462','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-463','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-464','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-465','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-466','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-467','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-468','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-469','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-470','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-471','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-472','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-473','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-474','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-475','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-476','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-477','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-478','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-479','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-480','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-481','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-482','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-483','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-484','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-485','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-486','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-487','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-488','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-489','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-490','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-491','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-492','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-493','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-494','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-495','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-496','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-497','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-498','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-499','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-500','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-501','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-502','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-503','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-504','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-505','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-506','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-507','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-508','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-509','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-510','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-511','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-512','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-513','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-514','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-515','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-516','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-517','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-518','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-519','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-520','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-521','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-522','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-523','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-524','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-525','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-526','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-527','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-528','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-529','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-530','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-531','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-532','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-533','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-534','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-535','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-536','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-537','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-538','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-539','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-540','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-541','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-542','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-543','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-544','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-545','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-546','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-547','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-548','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-549','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-550','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-551','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-552','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-553','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-554','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-555','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-556','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-557','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-558','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-559','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-560','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-561','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-562','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-563','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-564','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-565','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-566','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-567','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-568','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-569','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-570','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-571','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-572','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-573','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-574','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-575','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-576','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-577','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-578','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-579','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-580','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-581','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-582','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-583','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-584','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-585','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-586','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-587','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-588','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-589','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-590','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-591','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-592','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-593','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-594','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-595','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-596','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-597','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-598','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-599','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-600','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-601','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-602','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-603','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-604','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-605','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-606','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-607','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-608','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-609','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-610','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-611','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-612','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-613','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-614','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-615','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-616','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-617','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-618','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-619','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-620','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-621','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-622','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-623','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-624','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-625','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-626','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-627','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-628','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-629','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-630','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-631','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-632','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-633','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-634','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-635','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-636','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-637','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-638','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-639','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-640','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-641','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-642','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-643','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-644','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-645','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-646','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-647','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-648','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-649','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-650','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-651','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-652','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-653','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-654','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-655','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-656','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-657','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-658','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-659','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-660','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-661','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-662','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-663','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-664','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-665','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-666','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-667','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-668','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-669','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-670','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-671','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-672','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-673','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-674','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-675','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-676','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-677','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-678','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-679','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-680','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-681','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-682','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-683','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-684','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-685','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-686','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-687','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-688','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-689','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-690','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-691','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-692','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-693','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-694','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-695','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-696','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-697','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-698','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-699','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-700','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-701','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-702','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-703','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-704','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-705','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-706','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-707','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-708','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-709','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-710','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-711','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-712','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-713','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-714','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-715','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-716','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-717','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-718','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-719','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-720','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-721','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-722','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-723','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-724','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-725','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-726','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-727','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-728','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-729','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-730','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-731','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-732','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-733','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-734','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-735','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-736','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-737','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-738','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-739','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-740','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-741','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-742','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-743','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-744','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-745','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-746','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-747','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-748','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-749','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-750','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-751','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-752','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-753','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-754','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-755','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-756','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-757','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-758','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-759','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-760','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-761','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-762','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-763','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-764','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-765','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-766','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-767','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-768','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-769','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-770','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-771','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-772','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-773','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-774','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-775','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-776','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-777','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-778','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-779','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-780','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-781','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-782','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-783','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-784','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-785','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-786','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-787','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-788','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-789','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-790','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-791','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-792','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-793','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-794','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-795','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-796','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-797','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-798','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-799','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-800','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-801','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-802','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-803','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-804','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-805','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-806','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-807','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-808','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-809','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-810','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-811','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-812','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-813','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-814','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-815','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-816','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-817','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-818','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-819','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-820','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-821','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-822','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-823','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-824','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-825','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-826','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-827','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-828','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-829','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-830','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-831','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-832','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-833','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-834','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-835','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-836','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-837','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-838','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-839','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-840','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-841','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-842','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-843','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-844','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-845','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-846','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-847','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-848','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-849','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-850','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-851','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-852','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-853','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-854','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-855','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-856','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-857','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-858','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-859','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-860','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-861','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-862','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-863','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-864','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-865','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-866','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-867','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-868','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-869','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-870','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-871','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-872','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-873','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-874','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-875','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-876','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-877','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-878','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-879','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-880','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-881','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-882','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-883','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-884','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-885','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-886','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-887','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-888','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-889','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-890','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-891','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-892','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-893','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-894','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-895','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-896','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-897','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-898','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-899','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-900','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-901','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-902','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-903','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-904','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-905','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-906','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-907','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-908','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-909','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-910','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-911','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-912','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-913','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-914','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-915','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-916','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-917','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-918','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-919','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-920','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-921','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-922','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-923','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-924','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-925','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-926','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-927','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-928','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-929','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-930','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-931','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-932','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-933','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-934','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-935','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-936','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-937','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-938','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-939','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-940','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-941','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-942','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-943','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-944','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-945','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-946','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-947','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-948','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-949','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-950','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-951','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-952','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-953','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-954','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-955','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-956','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-957','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-958','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-959','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-960','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-961','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-962','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-963','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-964','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-965','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-966','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-967','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-968','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-969','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-970','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-971','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-972','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-973','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-974','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-975','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-976','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-977','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-978','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-979','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-980','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-981','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-982','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-983','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-984','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-985','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-986','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-987','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-988','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-989','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-990','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-991','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-992','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-993','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-994','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-995','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-996','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-997','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-998','1','1000','订单物流项id'), +('mall4cloud-delivery-order-item-999','1','1000','订单物流项id'), +('mall4cloud-order-000','1','1000','订单id'), +('mall4cloud-order-001','1','1000','订单id'), +('mall4cloud-order-002','1','1000','订单id'), +('mall4cloud-order-003','1','1000','订单id'), +('mall4cloud-order-004','1','1000','订单id'), +('mall4cloud-order-005','1','1000','订单id'), +('mall4cloud-order-006','1','1000','订单id'), +('mall4cloud-order-007','1','1000','订单id'), +('mall4cloud-order-008','1','1000','订单id'), +('mall4cloud-order-009','1','1000','订单id'), +('mall4cloud-order-010','1','1000','订单id'), +('mall4cloud-order-011','1','1000','订单id'), +('mall4cloud-order-012','1','1000','订单id'), +('mall4cloud-order-013','1','1000','订单id'), +('mall4cloud-order-014','1','1000','订单id'), +('mall4cloud-order-015','1','1000','订单id'), +('mall4cloud-order-016','1','1000','订单id'), +('mall4cloud-order-017','1','1000','订单id'), +('mall4cloud-order-018','1','1000','订单id'), +('mall4cloud-order-019','1','1000','订单id'), +('mall4cloud-order-020','1','1000','订单id'), +('mall4cloud-order-021','1','1000','订单id'), +('mall4cloud-order-022','1','1000','订单id'), +('mall4cloud-order-023','1','1000','订单id'), +('mall4cloud-order-024','1','1000','订单id'), +('mall4cloud-order-025','1','1000','订单id'), +('mall4cloud-order-026','1','1000','订单id'), +('mall4cloud-order-027','1','1000','订单id'), +('mall4cloud-order-028','1','1000','订单id'), +('mall4cloud-order-029','1','1000','订单id'), +('mall4cloud-order-030','1','1000','订单id'), +('mall4cloud-order-031','1','1000','订单id'), +('mall4cloud-order-032','1','1000','订单id'), +('mall4cloud-order-033','1','1000','订单id'), +('mall4cloud-order-034','1','1000','订单id'), +('mall4cloud-order-035','1','1000','订单id'), +('mall4cloud-order-036','1','1000','订单id'), +('mall4cloud-order-037','1','1000','订单id'), +('mall4cloud-order-038','1','1000','订单id'), +('mall4cloud-order-039','1','1000','订单id'), +('mall4cloud-order-040','1','1000','订单id'), +('mall4cloud-order-041','1','1000','订单id'), +('mall4cloud-order-042','1','1000','订单id'), +('mall4cloud-order-043','1','1000','订单id'), +('mall4cloud-order-044','1','1000','订单id'), +('mall4cloud-order-045','1','1000','订单id'), +('mall4cloud-order-046','1','1000','订单id'), +('mall4cloud-order-047','1','1000','订单id'), +('mall4cloud-order-048','1','1000','订单id'), +('mall4cloud-order-049','1','1000','订单id'), +('mall4cloud-order-050','1','1000','订单id'), +('mall4cloud-order-051','1','1000','订单id'), +('mall4cloud-order-052','1','1000','订单id'), +('mall4cloud-order-053','1','1000','订单id'), +('mall4cloud-order-054','1','1000','订单id'), +('mall4cloud-order-055','1','1000','订单id'), +('mall4cloud-order-056','1','1000','订单id'), +('mall4cloud-order-057','1','1000','订单id'), +('mall4cloud-order-058','1','1000','订单id'), +('mall4cloud-order-059','1','1000','订单id'), +('mall4cloud-order-060','1','1000','订单id'), +('mall4cloud-order-061','1','1000','订单id'), +('mall4cloud-order-062','1','1000','订单id'), +('mall4cloud-order-063','1','1000','订单id'), +('mall4cloud-order-064','1','1000','订单id'), +('mall4cloud-order-065','1','1000','订单id'), +('mall4cloud-order-066','1','1000','订单id'), +('mall4cloud-order-067','1','1000','订单id'), +('mall4cloud-order-068','1','1000','订单id'), +('mall4cloud-order-069','1','1000','订单id'), +('mall4cloud-order-070','1','1000','订单id'), +('mall4cloud-order-071','1','1000','订单id'), +('mall4cloud-order-072','1','1000','订单id'), +('mall4cloud-order-073','1','1000','订单id'), +('mall4cloud-order-074','1','1000','订单id'), +('mall4cloud-order-075','1','1000','订单id'), +('mall4cloud-order-076','1','1000','订单id'), +('mall4cloud-order-077','1','1000','订单id'), +('mall4cloud-order-078','1','1000','订单id'), +('mall4cloud-order-079','1','1000','订单id'), +('mall4cloud-order-080','1','1000','订单id'), +('mall4cloud-order-081','1','1000','订单id'), +('mall4cloud-order-082','1','1000','订单id'), +('mall4cloud-order-083','1','1000','订单id'), +('mall4cloud-order-084','1','1000','订单id'), +('mall4cloud-order-085','1','1000','订单id'), +('mall4cloud-order-086','1','1000','订单id'), +('mall4cloud-order-087','1','1000','订单id'), +('mall4cloud-order-088','1','1000','订单id'), +('mall4cloud-order-089','1','1000','订单id'), +('mall4cloud-order-090','1','1000','订单id'), +('mall4cloud-order-091','1','1000','订单id'), +('mall4cloud-order-092','1','1000','订单id'), +('mall4cloud-order-093','1','1000','订单id'), +('mall4cloud-order-094','1','1000','订单id'), +('mall4cloud-order-095','1','1000','订单id'), +('mall4cloud-order-096','1','1000','订单id'), +('mall4cloud-order-097','1','1000','订单id'), +('mall4cloud-order-098','1','1000','订单id'), +('mall4cloud-order-099','1','1000','订单id'), +('mall4cloud-order-100','1','1000','订单id'), +('mall4cloud-order-101','1','1000','订单id'), +('mall4cloud-order-102','1','1000','订单id'), +('mall4cloud-order-103','1','1000','订单id'), +('mall4cloud-order-104','1','1000','订单id'), +('mall4cloud-order-105','1','1000','订单id'), +('mall4cloud-order-106','1','1000','订单id'), +('mall4cloud-order-107','1','1000','订单id'), +('mall4cloud-order-108','1','1000','订单id'), +('mall4cloud-order-109','1','1000','订单id'), +('mall4cloud-order-110','1','1000','订单id'), +('mall4cloud-order-111','1','1000','订单id'), +('mall4cloud-order-112','1','1000','订单id'), +('mall4cloud-order-113','1','1000','订单id'), +('mall4cloud-order-114','1','1000','订单id'), +('mall4cloud-order-115','1','1000','订单id'), +('mall4cloud-order-116','1','1000','订单id'), +('mall4cloud-order-117','1','1000','订单id'), +('mall4cloud-order-118','1','1000','订单id'), +('mall4cloud-order-119','1','1000','订单id'), +('mall4cloud-order-120','1','1000','订单id'), +('mall4cloud-order-121','1','1000','订单id'), +('mall4cloud-order-122','1','1000','订单id'), +('mall4cloud-order-123','1','1000','订单id'), +('mall4cloud-order-124','1','1000','订单id'), +('mall4cloud-order-125','1','1000','订单id'), +('mall4cloud-order-126','1','1000','订单id'), +('mall4cloud-order-127','1','1000','订单id'), +('mall4cloud-order-128','1','1000','订单id'), +('mall4cloud-order-129','1','1000','订单id'), +('mall4cloud-order-130','1','1000','订单id'), +('mall4cloud-order-131','1','1000','订单id'), +('mall4cloud-order-132','1','1000','订单id'), +('mall4cloud-order-133','1','1000','订单id'), +('mall4cloud-order-134','1','1000','订单id'), +('mall4cloud-order-135','1','1000','订单id'), +('mall4cloud-order-136','1','1000','订单id'), +('mall4cloud-order-137','1','1000','订单id'), +('mall4cloud-order-138','1','1000','订单id'), +('mall4cloud-order-139','1','1000','订单id'), +('mall4cloud-order-140','1','1000','订单id'), +('mall4cloud-order-141','1','1000','订单id'), +('mall4cloud-order-142','1','1000','订单id'), +('mall4cloud-order-143','1','1000','订单id'), +('mall4cloud-order-144','1','1000','订单id'), +('mall4cloud-order-145','1','1000','订单id'), +('mall4cloud-order-146','1','1000','订单id'), +('mall4cloud-order-147','1','1000','订单id'), +('mall4cloud-order-148','1','1000','订单id'), +('mall4cloud-order-149','1','1000','订单id'), +('mall4cloud-order-150','1','1000','订单id'), +('mall4cloud-order-151','1','1000','订单id'), +('mall4cloud-order-152','1','1000','订单id'), +('mall4cloud-order-153','1','1000','订单id'), +('mall4cloud-order-154','1','1000','订单id'), +('mall4cloud-order-155','1','1000','订单id'), +('mall4cloud-order-156','1','1000','订单id'), +('mall4cloud-order-157','1','1000','订单id'), +('mall4cloud-order-158','1','1000','订单id'), +('mall4cloud-order-159','1','1000','订单id'), +('mall4cloud-order-160','1','1000','订单id'), +('mall4cloud-order-161','1','1000','订单id'), +('mall4cloud-order-162','1','1000','订单id'), +('mall4cloud-order-163','1','1000','订单id'), +('mall4cloud-order-164','1','1000','订单id'), +('mall4cloud-order-165','1','1000','订单id'), +('mall4cloud-order-166','1','1000','订单id'), +('mall4cloud-order-167','1','1000','订单id'), +('mall4cloud-order-168','1','1000','订单id'), +('mall4cloud-order-169','1','1000','订单id'), +('mall4cloud-order-170','1','1000','订单id'), +('mall4cloud-order-171','1','1000','订单id'), +('mall4cloud-order-172','1','1000','订单id'), +('mall4cloud-order-173','1','1000','订单id'), +('mall4cloud-order-174','1','1000','订单id'), +('mall4cloud-order-175','1','1000','订单id'), +('mall4cloud-order-176','1','1000','订单id'), +('mall4cloud-order-177','1','1000','订单id'), +('mall4cloud-order-178','1','1000','订单id'), +('mall4cloud-order-179','1','1000','订单id'), +('mall4cloud-order-180','1','1000','订单id'), +('mall4cloud-order-181','1','1000','订单id'), +('mall4cloud-order-182','1','1000','订单id'), +('mall4cloud-order-183','1','1000','订单id'), +('mall4cloud-order-184','1','1000','订单id'), +('mall4cloud-order-185','1','1000','订单id'), +('mall4cloud-order-186','1','1000','订单id'), +('mall4cloud-order-187','1','1000','订单id'), +('mall4cloud-order-188','1','1000','订单id'), +('mall4cloud-order-189','1','1000','订单id'), +('mall4cloud-order-190','1','1000','订单id'), +('mall4cloud-order-191','1','1000','订单id'), +('mall4cloud-order-192','1','1000','订单id'), +('mall4cloud-order-193','1','1000','订单id'), +('mall4cloud-order-194','1','1000','订单id'), +('mall4cloud-order-195','1','1000','订单id'), +('mall4cloud-order-196','1','1000','订单id'), +('mall4cloud-order-197','1','1000','订单id'), +('mall4cloud-order-198','1','1000','订单id'), +('mall4cloud-order-199','1','1000','订单id'), +('mall4cloud-order-200','1','1000','订单id'), +('mall4cloud-order-201','1','1000','订单id'), +('mall4cloud-order-202','1','1000','订单id'), +('mall4cloud-order-203','1','1000','订单id'), +('mall4cloud-order-204','1','1000','订单id'), +('mall4cloud-order-205','1','1000','订单id'), +('mall4cloud-order-206','1','1000','订单id'), +('mall4cloud-order-207','1','1000','订单id'), +('mall4cloud-order-208','1','1000','订单id'), +('mall4cloud-order-209','1','1000','订单id'), +('mall4cloud-order-210','1','1000','订单id'), +('mall4cloud-order-211','1','1000','订单id'), +('mall4cloud-order-212','1','1000','订单id'), +('mall4cloud-order-213','1','1000','订单id'), +('mall4cloud-order-214','1','1000','订单id'), +('mall4cloud-order-215','1','1000','订单id'), +('mall4cloud-order-216','1','1000','订单id'), +('mall4cloud-order-217','1','1000','订单id'), +('mall4cloud-order-218','1','1000','订单id'), +('mall4cloud-order-219','1','1000','订单id'), +('mall4cloud-order-220','1','1000','订单id'), +('mall4cloud-order-221','1','1000','订单id'), +('mall4cloud-order-222','1','1000','订单id'), +('mall4cloud-order-223','1','1000','订单id'), +('mall4cloud-order-224','1','1000','订单id'), +('mall4cloud-order-225','1','1000','订单id'), +('mall4cloud-order-226','1','1000','订单id'), +('mall4cloud-order-227','1','1000','订单id'), +('mall4cloud-order-228','1','1000','订单id'), +('mall4cloud-order-229','1','1000','订单id'), +('mall4cloud-order-230','1','1000','订单id'), +('mall4cloud-order-231','1','1000','订单id'), +('mall4cloud-order-232','1','1000','订单id'), +('mall4cloud-order-233','1','1000','订单id'), +('mall4cloud-order-234','1','1000','订单id'), +('mall4cloud-order-235','1','1000','订单id'), +('mall4cloud-order-236','1','1000','订单id'), +('mall4cloud-order-237','1','1000','订单id'), +('mall4cloud-order-238','1','1000','订单id'), +('mall4cloud-order-239','1','1000','订单id'), +('mall4cloud-order-240','1','1000','订单id'), +('mall4cloud-order-241','1','1000','订单id'), +('mall4cloud-order-242','1','1000','订单id'), +('mall4cloud-order-243','1','1000','订单id'), +('mall4cloud-order-244','1','1000','订单id'), +('mall4cloud-order-245','1','1000','订单id'), +('mall4cloud-order-246','1','1000','订单id'), +('mall4cloud-order-247','1','1000','订单id'), +('mall4cloud-order-248','1','1000','订单id'), +('mall4cloud-order-249','1','1000','订单id'), +('mall4cloud-order-250','1','1000','订单id'), +('mall4cloud-order-251','1','1000','订单id'), +('mall4cloud-order-252','1','1000','订单id'), +('mall4cloud-order-253','1','1000','订单id'), +('mall4cloud-order-254','1','1000','订单id'), +('mall4cloud-order-255','1','1000','订单id'), +('mall4cloud-order-256','1','1000','订单id'), +('mall4cloud-order-257','1','1000','订单id'), +('mall4cloud-order-258','1','1000','订单id'), +('mall4cloud-order-259','1','1000','订单id'), +('mall4cloud-order-260','1','1000','订单id'), +('mall4cloud-order-261','1','1000','订单id'), +('mall4cloud-order-262','1','1000','订单id'), +('mall4cloud-order-263','1','1000','订单id'), +('mall4cloud-order-264','1','1000','订单id'), +('mall4cloud-order-265','1','1000','订单id'), +('mall4cloud-order-266','1','1000','订单id'), +('mall4cloud-order-267','1','1000','订单id'), +('mall4cloud-order-268','1','1000','订单id'), +('mall4cloud-order-269','1','1000','订单id'), +('mall4cloud-order-270','1','1000','订单id'), +('mall4cloud-order-271','1','1000','订单id'), +('mall4cloud-order-272','1','1000','订单id'), +('mall4cloud-order-273','1','1000','订单id'), +('mall4cloud-order-274','1','1000','订单id'), +('mall4cloud-order-275','1','1000','订单id'), +('mall4cloud-order-276','1','1000','订单id'), +('mall4cloud-order-277','1','1000','订单id'), +('mall4cloud-order-278','1','1000','订单id'), +('mall4cloud-order-279','1','1000','订单id'), +('mall4cloud-order-280','1','1000','订单id'), +('mall4cloud-order-281','1','1000','订单id'), +('mall4cloud-order-282','1','1000','订单id'), +('mall4cloud-order-283','1','1000','订单id'), +('mall4cloud-order-284','1','1000','订单id'), +('mall4cloud-order-285','1','1000','订单id'), +('mall4cloud-order-286','1','1000','订单id'), +('mall4cloud-order-287','1','1000','订单id'), +('mall4cloud-order-288','1','1000','订单id'), +('mall4cloud-order-289','1','1000','订单id'), +('mall4cloud-order-290','1','1000','订单id'), +('mall4cloud-order-291','1','1000','订单id'), +('mall4cloud-order-292','1','1000','订单id'), +('mall4cloud-order-293','1','1000','订单id'), +('mall4cloud-order-294','1','1000','订单id'), +('mall4cloud-order-295','1','1000','订单id'), +('mall4cloud-order-296','1','1000','订单id'), +('mall4cloud-order-297','1','1000','订单id'), +('mall4cloud-order-298','1','1000','订单id'), +('mall4cloud-order-299','1','1000','订单id'), +('mall4cloud-order-300','1','1000','订单id'), +('mall4cloud-order-301','1','1000','订单id'), +('mall4cloud-order-302','1','1000','订单id'), +('mall4cloud-order-303','1','1000','订单id'), +('mall4cloud-order-304','1','1000','订单id'), +('mall4cloud-order-305','1','1000','订单id'), +('mall4cloud-order-306','1','1000','订单id'), +('mall4cloud-order-307','1','1000','订单id'), +('mall4cloud-order-308','1','1000','订单id'), +('mall4cloud-order-309','1','1000','订单id'), +('mall4cloud-order-310','1','1000','订单id'), +('mall4cloud-order-311','1','1000','订单id'), +('mall4cloud-order-312','1','1000','订单id'), +('mall4cloud-order-313','1','1000','订单id'), +('mall4cloud-order-314','1','1000','订单id'), +('mall4cloud-order-315','1','1000','订单id'), +('mall4cloud-order-316','1','1000','订单id'), +('mall4cloud-order-317','1','1000','订单id'), +('mall4cloud-order-318','1','1000','订单id'), +('mall4cloud-order-319','1','1000','订单id'), +('mall4cloud-order-320','1','1000','订单id'), +('mall4cloud-order-321','1','1000','订单id'), +('mall4cloud-order-322','1','1000','订单id'), +('mall4cloud-order-323','1','1000','订单id'), +('mall4cloud-order-324','1','1000','订单id'), +('mall4cloud-order-325','1','1000','订单id'), +('mall4cloud-order-326','1','1000','订单id'), +('mall4cloud-order-327','1','1000','订单id'), +('mall4cloud-order-328','1','1000','订单id'), +('mall4cloud-order-329','1','1000','订单id'), +('mall4cloud-order-330','1','1000','订单id'), +('mall4cloud-order-331','1','1000','订单id'), +('mall4cloud-order-332','1','1000','订单id'), +('mall4cloud-order-333','1','1000','订单id'), +('mall4cloud-order-334','1','1000','订单id'), +('mall4cloud-order-335','1','1000','订单id'), +('mall4cloud-order-336','1','1000','订单id'), +('mall4cloud-order-337','1','1000','订单id'), +('mall4cloud-order-338','1','1000','订单id'), +('mall4cloud-order-339','1','1000','订单id'), +('mall4cloud-order-340','1','1000','订单id'), +('mall4cloud-order-341','1','1000','订单id'), +('mall4cloud-order-342','1','1000','订单id'), +('mall4cloud-order-343','1','1000','订单id'), +('mall4cloud-order-344','1','1000','订单id'), +('mall4cloud-order-345','1','1000','订单id'), +('mall4cloud-order-346','1','1000','订单id'), +('mall4cloud-order-347','1','1000','订单id'), +('mall4cloud-order-348','1','1000','订单id'), +('mall4cloud-order-349','1','1000','订单id'), +('mall4cloud-order-350','1','1000','订单id'), +('mall4cloud-order-351','1','1000','订单id'), +('mall4cloud-order-352','1','1000','订单id'), +('mall4cloud-order-353','1','1000','订单id'), +('mall4cloud-order-354','1','1000','订单id'), +('mall4cloud-order-355','1','1000','订单id'), +('mall4cloud-order-356','1','1000','订单id'), +('mall4cloud-order-357','1','1000','订单id'), +('mall4cloud-order-358','1','1000','订单id'), +('mall4cloud-order-359','1','1000','订单id'), +('mall4cloud-order-360','1','1000','订单id'), +('mall4cloud-order-361','1','1000','订单id'), +('mall4cloud-order-362','1','1000','订单id'), +('mall4cloud-order-363','1','1000','订单id'), +('mall4cloud-order-364','1','1000','订单id'), +('mall4cloud-order-365','1','1000','订单id'), +('mall4cloud-order-366','1','1000','订单id'), +('mall4cloud-order-367','1','1000','订单id'), +('mall4cloud-order-368','1','1000','订单id'), +('mall4cloud-order-369','1','1000','订单id'), +('mall4cloud-order-370','1','1000','订单id'), +('mall4cloud-order-371','1','1000','订单id'), +('mall4cloud-order-372','1','1000','订单id'), +('mall4cloud-order-373','1','1000','订单id'), +('mall4cloud-order-374','1','1000','订单id'), +('mall4cloud-order-375','1','1000','订单id'), +('mall4cloud-order-376','1','1000','订单id'), +('mall4cloud-order-377','1','1000','订单id'), +('mall4cloud-order-378','1','1000','订单id'), +('mall4cloud-order-379','1','1000','订单id'), +('mall4cloud-order-380','1','1000','订单id'), +('mall4cloud-order-381','1','1000','订单id'), +('mall4cloud-order-382','1','1000','订单id'), +('mall4cloud-order-383','1','1000','订单id'), +('mall4cloud-order-384','1','1000','订单id'), +('mall4cloud-order-385','1','1000','订单id'), +('mall4cloud-order-386','1','1000','订单id'), +('mall4cloud-order-387','1','1000','订单id'), +('mall4cloud-order-388','1','1000','订单id'), +('mall4cloud-order-389','1','1000','订单id'), +('mall4cloud-order-390','1','1000','订单id'), +('mall4cloud-order-391','1','1000','订单id'), +('mall4cloud-order-392','1','1000','订单id'), +('mall4cloud-order-393','1','1000','订单id'), +('mall4cloud-order-394','1','1000','订单id'), +('mall4cloud-order-395','1','1000','订单id'), +('mall4cloud-order-396','1','1000','订单id'), +('mall4cloud-order-397','1','1000','订单id'), +('mall4cloud-order-398','1','1000','订单id'), +('mall4cloud-order-399','1','1000','订单id'), +('mall4cloud-order-400','1','1000','订单id'), +('mall4cloud-order-401','1','1000','订单id'), +('mall4cloud-order-402','1','1000','订单id'), +('mall4cloud-order-403','1','1000','订单id'), +('mall4cloud-order-404','1','1000','订单id'), +('mall4cloud-order-405','1','1000','订单id'), +('mall4cloud-order-406','1','1000','订单id'), +('mall4cloud-order-407','1','1000','订单id'), +('mall4cloud-order-408','1','1000','订单id'), +('mall4cloud-order-409','1','1000','订单id'), +('mall4cloud-order-410','1','1000','订单id'), +('mall4cloud-order-411','1','1000','订单id'), +('mall4cloud-order-412','1','1000','订单id'), +('mall4cloud-order-413','1','1000','订单id'), +('mall4cloud-order-414','1','1000','订单id'), +('mall4cloud-order-415','1','1000','订单id'), +('mall4cloud-order-416','1','1000','订单id'), +('mall4cloud-order-417','1','1000','订单id'), +('mall4cloud-order-418','1','1000','订单id'), +('mall4cloud-order-419','1','1000','订单id'), +('mall4cloud-order-420','1','1000','订单id'), +('mall4cloud-order-421','1','1000','订单id'), +('mall4cloud-order-422','1','1000','订单id'), +('mall4cloud-order-423','1','1000','订单id'), +('mall4cloud-order-424','1','1000','订单id'), +('mall4cloud-order-425','1','1000','订单id'), +('mall4cloud-order-426','1','1000','订单id'), +('mall4cloud-order-427','1','1000','订单id'), +('mall4cloud-order-428','1','1000','订单id'), +('mall4cloud-order-429','1','1000','订单id'), +('mall4cloud-order-430','1','1000','订单id'), +('mall4cloud-order-431','1','1000','订单id'), +('mall4cloud-order-432','1','1000','订单id'), +('mall4cloud-order-433','1','1000','订单id'), +('mall4cloud-order-434','1','1000','订单id'), +('mall4cloud-order-435','1','1000','订单id'), +('mall4cloud-order-436','1','1000','订单id'), +('mall4cloud-order-437','1','1000','订单id'), +('mall4cloud-order-438','1','1000','订单id'), +('mall4cloud-order-439','1','1000','订单id'), +('mall4cloud-order-440','1','1000','订单id'), +('mall4cloud-order-441','1','1000','订单id'), +('mall4cloud-order-442','1','1000','订单id'), +('mall4cloud-order-443','1','1000','订单id'), +('mall4cloud-order-444','1','1000','订单id'), +('mall4cloud-order-445','1','1000','订单id'), +('mall4cloud-order-446','1','1000','订单id'), +('mall4cloud-order-447','1','1000','订单id'), +('mall4cloud-order-448','1','1000','订单id'), +('mall4cloud-order-449','1','1000','订单id'), +('mall4cloud-order-450','1','1000','订单id'), +('mall4cloud-order-451','1','1000','订单id'), +('mall4cloud-order-452','1','1000','订单id'), +('mall4cloud-order-453','1','1000','订单id'), +('mall4cloud-order-454','1','1000','订单id'), +('mall4cloud-order-455','1','1000','订单id'), +('mall4cloud-order-456','1','1000','订单id'), +('mall4cloud-order-457','1','1000','订单id'), +('mall4cloud-order-458','1','1000','订单id'), +('mall4cloud-order-459','1','1000','订单id'), +('mall4cloud-order-460','1','1000','订单id'), +('mall4cloud-order-461','1','1000','订单id'), +('mall4cloud-order-462','1','1000','订单id'), +('mall4cloud-order-463','1','1000','订单id'), +('mall4cloud-order-464','1','1000','订单id'), +('mall4cloud-order-465','1','1000','订单id'), +('mall4cloud-order-466','1','1000','订单id'), +('mall4cloud-order-467','1','1000','订单id'), +('mall4cloud-order-468','1','1000','订单id'), +('mall4cloud-order-469','1','1000','订单id'), +('mall4cloud-order-470','1','1000','订单id'), +('mall4cloud-order-471','1','1000','订单id'), +('mall4cloud-order-472','1','1000','订单id'), +('mall4cloud-order-473','1','1000','订单id'), +('mall4cloud-order-474','1','1000','订单id'), +('mall4cloud-order-475','1','1000','订单id'), +('mall4cloud-order-476','1','1000','订单id'), +('mall4cloud-order-477','1','1000','订单id'), +('mall4cloud-order-478','1','1000','订单id'), +('mall4cloud-order-479','1','1000','订单id'), +('mall4cloud-order-480','1','1000','订单id'), +('mall4cloud-order-481','1','1000','订单id'), +('mall4cloud-order-482','1','1000','订单id'), +('mall4cloud-order-483','1','1000','订单id'), +('mall4cloud-order-484','1','1000','订单id'), +('mall4cloud-order-485','1','1000','订单id'), +('mall4cloud-order-486','1','1000','订单id'), +('mall4cloud-order-487','1','1000','订单id'), +('mall4cloud-order-488','1','1000','订单id'), +('mall4cloud-order-489','1','1000','订单id'), +('mall4cloud-order-490','1','1000','订单id'), +('mall4cloud-order-491','1','1000','订单id'), +('mall4cloud-order-492','1','1000','订单id'), +('mall4cloud-order-493','1','1000','订单id'), +('mall4cloud-order-494','1','1000','订单id'), +('mall4cloud-order-495','1','1000','订单id'), +('mall4cloud-order-496','1','1000','订单id'), +('mall4cloud-order-497','1','1000','订单id'), +('mall4cloud-order-498','1','1000','订单id'), +('mall4cloud-order-499','1','1000','订单id'), +('mall4cloud-order-500','1','1000','订单id'), +('mall4cloud-order-501','1','1000','订单id'), +('mall4cloud-order-502','1','1000','订单id'), +('mall4cloud-order-503','1','1000','订单id'), +('mall4cloud-order-504','1','1000','订单id'), +('mall4cloud-order-505','1','1000','订单id'), +('mall4cloud-order-506','1','1000','订单id'), +('mall4cloud-order-507','1','1000','订单id'), +('mall4cloud-order-508','1','1000','订单id'), +('mall4cloud-order-509','1','1000','订单id'), +('mall4cloud-order-510','1','1000','订单id'), +('mall4cloud-order-511','1','1000','订单id'), +('mall4cloud-order-512','1','1000','订单id'), +('mall4cloud-order-513','1','1000','订单id'), +('mall4cloud-order-514','1','1000','订单id'), +('mall4cloud-order-515','1','1000','订单id'), +('mall4cloud-order-516','1','1000','订单id'), +('mall4cloud-order-517','1','1000','订单id'), +('mall4cloud-order-518','1','1000','订单id'), +('mall4cloud-order-519','1','1000','订单id'), +('mall4cloud-order-520','1','1000','订单id'), +('mall4cloud-order-521','1','1000','订单id'), +('mall4cloud-order-522','1','1000','订单id'), +('mall4cloud-order-523','1','1000','订单id'), +('mall4cloud-order-524','1','1000','订单id'), +('mall4cloud-order-525','1','1000','订单id'), +('mall4cloud-order-526','1','1000','订单id'), +('mall4cloud-order-527','1','1000','订单id'), +('mall4cloud-order-528','1','1000','订单id'), +('mall4cloud-order-529','1','1000','订单id'), +('mall4cloud-order-530','1','1000','订单id'), +('mall4cloud-order-531','1','1000','订单id'), +('mall4cloud-order-532','1','1000','订单id'), +('mall4cloud-order-533','1','1000','订单id'), +('mall4cloud-order-534','1','1000','订单id'), +('mall4cloud-order-535','1','1000','订单id'), +('mall4cloud-order-536','1','1000','订单id'), +('mall4cloud-order-537','1','1000','订单id'), +('mall4cloud-order-538','1','1000','订单id'), +('mall4cloud-order-539','1','1000','订单id'), +('mall4cloud-order-540','1','1000','订单id'), +('mall4cloud-order-541','1','1000','订单id'), +('mall4cloud-order-542','1','1000','订单id'), +('mall4cloud-order-543','1','1000','订单id'), +('mall4cloud-order-544','1','1000','订单id'), +('mall4cloud-order-545','1','1000','订单id'), +('mall4cloud-order-546','1','1000','订单id'), +('mall4cloud-order-547','1','1000','订单id'), +('mall4cloud-order-548','1','1000','订单id'), +('mall4cloud-order-549','1','1000','订单id'), +('mall4cloud-order-550','1','1000','订单id'), +('mall4cloud-order-551','1','1000','订单id'), +('mall4cloud-order-552','1','1000','订单id'), +('mall4cloud-order-553','1','1000','订单id'), +('mall4cloud-order-554','1','1000','订单id'), +('mall4cloud-order-555','1','1000','订单id'), +('mall4cloud-order-556','1','1000','订单id'), +('mall4cloud-order-557','1','1000','订单id'), +('mall4cloud-order-558','1','1000','订单id'), +('mall4cloud-order-559','1','1000','订单id'), +('mall4cloud-order-560','1','1000','订单id'), +('mall4cloud-order-561','1','1000','订单id'), +('mall4cloud-order-562','1','1000','订单id'), +('mall4cloud-order-563','1','1000','订单id'), +('mall4cloud-order-564','1','1000','订单id'), +('mall4cloud-order-565','1','1000','订单id'), +('mall4cloud-order-566','1','1000','订单id'), +('mall4cloud-order-567','1','1000','订单id'), +('mall4cloud-order-568','1','1000','订单id'), +('mall4cloud-order-569','1','1000','订单id'), +('mall4cloud-order-570','1','1000','订单id'), +('mall4cloud-order-571','1','1000','订单id'), +('mall4cloud-order-572','1','1000','订单id'), +('mall4cloud-order-573','1','1000','订单id'), +('mall4cloud-order-574','1','1000','订单id'), +('mall4cloud-order-575','1','1000','订单id'), +('mall4cloud-order-576','1','1000','订单id'), +('mall4cloud-order-577','1','1000','订单id'), +('mall4cloud-order-578','1','1000','订单id'), +('mall4cloud-order-579','1','1000','订单id'), +('mall4cloud-order-580','1','1000','订单id'), +('mall4cloud-order-581','1','1000','订单id'), +('mall4cloud-order-582','1','1000','订单id'), +('mall4cloud-order-583','1','1000','订单id'), +('mall4cloud-order-584','1','1000','订单id'), +('mall4cloud-order-585','1','1000','订单id'), +('mall4cloud-order-586','1','1000','订单id'), +('mall4cloud-order-587','1','1000','订单id'), +('mall4cloud-order-588','1','1000','订单id'), +('mall4cloud-order-589','1','1000','订单id'), +('mall4cloud-order-590','1','1000','订单id'), +('mall4cloud-order-591','1','1000','订单id'), +('mall4cloud-order-592','1','1000','订单id'), +('mall4cloud-order-593','1','1000','订单id'), +('mall4cloud-order-594','1','1000','订单id'), +('mall4cloud-order-595','1','1000','订单id'), +('mall4cloud-order-596','1','1000','订单id'), +('mall4cloud-order-597','1','1000','订单id'), +('mall4cloud-order-598','1','1000','订单id'), +('mall4cloud-order-599','1','1000','订单id'), +('mall4cloud-order-600','1','1000','订单id'), +('mall4cloud-order-601','1','1000','订单id'), +('mall4cloud-order-602','1','1000','订单id'), +('mall4cloud-order-603','1','1000','订单id'), +('mall4cloud-order-604','1','1000','订单id'), +('mall4cloud-order-605','1','1000','订单id'), +('mall4cloud-order-606','1','1000','订单id'), +('mall4cloud-order-607','1','1000','订单id'), +('mall4cloud-order-608','1','1000','订单id'), +('mall4cloud-order-609','1','1000','订单id'), +('mall4cloud-order-610','1','1000','订单id'), +('mall4cloud-order-611','1','1000','订单id'), +('mall4cloud-order-612','1','1000','订单id'), +('mall4cloud-order-613','1','1000','订单id'), +('mall4cloud-order-614','1','1000','订单id'), +('mall4cloud-order-615','1','1000','订单id'), +('mall4cloud-order-616','1','1000','订单id'), +('mall4cloud-order-617','1','1000','订单id'), +('mall4cloud-order-618','1','1000','订单id'), +('mall4cloud-order-619','1','1000','订单id'), +('mall4cloud-order-620','1','1000','订单id'), +('mall4cloud-order-621','1','1000','订单id'), +('mall4cloud-order-622','1','1000','订单id'), +('mall4cloud-order-623','1','1000','订单id'), +('mall4cloud-order-624','1','1000','订单id'), +('mall4cloud-order-625','1','1000','订单id'), +('mall4cloud-order-626','1','1000','订单id'), +('mall4cloud-order-627','1','1000','订单id'), +('mall4cloud-order-628','1','1000','订单id'), +('mall4cloud-order-629','1','1000','订单id'), +('mall4cloud-order-630','1','1000','订单id'), +('mall4cloud-order-631','1','1000','订单id'), +('mall4cloud-order-632','1','1000','订单id'), +('mall4cloud-order-633','1','1000','订单id'), +('mall4cloud-order-634','1','1000','订单id'), +('mall4cloud-order-635','1','1000','订单id'), +('mall4cloud-order-636','1','1000','订单id'), +('mall4cloud-order-637','1','1000','订单id'), +('mall4cloud-order-638','1','1000','订单id'), +('mall4cloud-order-639','1','1000','订单id'), +('mall4cloud-order-640','1','1000','订单id'), +('mall4cloud-order-641','1','1000','订单id'), +('mall4cloud-order-642','1','1000','订单id'), +('mall4cloud-order-643','1','1000','订单id'), +('mall4cloud-order-644','1','1000','订单id'), +('mall4cloud-order-645','1','1000','订单id'), +('mall4cloud-order-646','1','1000','订单id'), +('mall4cloud-order-647','1','1000','订单id'), +('mall4cloud-order-648','1','1000','订单id'), +('mall4cloud-order-649','1','1000','订单id'), +('mall4cloud-order-650','1','1000','订单id'), +('mall4cloud-order-651','1','1000','订单id'), +('mall4cloud-order-652','1','1000','订单id'), +('mall4cloud-order-653','1','1000','订单id'), +('mall4cloud-order-654','1','1000','订单id'), +('mall4cloud-order-655','1','1000','订单id'), +('mall4cloud-order-656','1','1000','订单id'), +('mall4cloud-order-657','1','1000','订单id'), +('mall4cloud-order-658','1','1000','订单id'), +('mall4cloud-order-659','1','1000','订单id'), +('mall4cloud-order-660','1','1000','订单id'), +('mall4cloud-order-661','1','1000','订单id'), +('mall4cloud-order-662','1','1000','订单id'), +('mall4cloud-order-663','1','1000','订单id'), +('mall4cloud-order-664','1','1000','订单id'), +('mall4cloud-order-665','1','1000','订单id'), +('mall4cloud-order-666','1','1000','订单id'), +('mall4cloud-order-667','1','1000','订单id'), +('mall4cloud-order-668','1','1000','订单id'), +('mall4cloud-order-669','1','1000','订单id'), +('mall4cloud-order-670','1','1000','订单id'), +('mall4cloud-order-671','1','1000','订单id'), +('mall4cloud-order-672','1','1000','订单id'), +('mall4cloud-order-673','1','1000','订单id'), +('mall4cloud-order-674','1','1000','订单id'), +('mall4cloud-order-675','1','1000','订单id'), +('mall4cloud-order-676','1','1000','订单id'), +('mall4cloud-order-677','1','1000','订单id'), +('mall4cloud-order-678','1','1000','订单id'), +('mall4cloud-order-679','1','1000','订单id'), +('mall4cloud-order-680','1','1000','订单id'), +('mall4cloud-order-681','1','1000','订单id'), +('mall4cloud-order-682','1','1000','订单id'), +('mall4cloud-order-683','1','1000','订单id'), +('mall4cloud-order-684','1','1000','订单id'), +('mall4cloud-order-685','1','1000','订单id'), +('mall4cloud-order-686','1','1000','订单id'), +('mall4cloud-order-687','1','1000','订单id'), +('mall4cloud-order-688','1','1000','订单id'), +('mall4cloud-order-689','1','1000','订单id'), +('mall4cloud-order-690','1','1000','订单id'), +('mall4cloud-order-691','1','1000','订单id'), +('mall4cloud-order-692','1','1000','订单id'), +('mall4cloud-order-693','1','1000','订单id'), +('mall4cloud-order-694','1','1000','订单id'), +('mall4cloud-order-695','1','1000','订单id'), +('mall4cloud-order-696','1','1000','订单id'), +('mall4cloud-order-697','1','1000','订单id'), +('mall4cloud-order-698','1','1000','订单id'), +('mall4cloud-order-699','1','1000','订单id'), +('mall4cloud-order-700','1','1000','订单id'), +('mall4cloud-order-701','1','1000','订单id'), +('mall4cloud-order-702','1','1000','订单id'), +('mall4cloud-order-703','1','1000','订单id'), +('mall4cloud-order-704','1','1000','订单id'), +('mall4cloud-order-705','1','1000','订单id'), +('mall4cloud-order-706','1','1000','订单id'), +('mall4cloud-order-707','1','1000','订单id'), +('mall4cloud-order-708','1','1000','订单id'), +('mall4cloud-order-709','1','1000','订单id'), +('mall4cloud-order-710','1','1000','订单id'), +('mall4cloud-order-711','1','1000','订单id'), +('mall4cloud-order-712','1','1000','订单id'), +('mall4cloud-order-713','1','1000','订单id'), +('mall4cloud-order-714','1','1000','订单id'), +('mall4cloud-order-715','1','1000','订单id'), +('mall4cloud-order-716','1','1000','订单id'), +('mall4cloud-order-717','1','1000','订单id'), +('mall4cloud-order-718','1','1000','订单id'), +('mall4cloud-order-719','1','1000','订单id'), +('mall4cloud-order-720','1','1000','订单id'), +('mall4cloud-order-721','1','1000','订单id'), +('mall4cloud-order-722','1','1000','订单id'), +('mall4cloud-order-723','1','1000','订单id'), +('mall4cloud-order-724','1','1000','订单id'), +('mall4cloud-order-725','1','1000','订单id'), +('mall4cloud-order-726','1','1000','订单id'), +('mall4cloud-order-727','1','1000','订单id'), +('mall4cloud-order-728','1','1000','订单id'), +('mall4cloud-order-729','1','1000','订单id'), +('mall4cloud-order-730','1','1000','订单id'), +('mall4cloud-order-731','1','1000','订单id'), +('mall4cloud-order-732','1','1000','订单id'), +('mall4cloud-order-733','1','1000','订单id'), +('mall4cloud-order-734','1','1000','订单id'), +('mall4cloud-order-735','1','1000','订单id'), +('mall4cloud-order-736','1','1000','订单id'), +('mall4cloud-order-737','1','1000','订单id'), +('mall4cloud-order-738','1','1000','订单id'), +('mall4cloud-order-739','1','1000','订单id'), +('mall4cloud-order-740','1','1000','订单id'), +('mall4cloud-order-741','1','1000','订单id'), +('mall4cloud-order-742','1','1000','订单id'), +('mall4cloud-order-743','1','1000','订单id'), +('mall4cloud-order-744','1','1000','订单id'), +('mall4cloud-order-745','1','1000','订单id'), +('mall4cloud-order-746','1','1000','订单id'), +('mall4cloud-order-747','1','1000','订单id'), +('mall4cloud-order-748','1','1000','订单id'), +('mall4cloud-order-749','1','1000','订单id'), +('mall4cloud-order-750','1','1000','订单id'), +('mall4cloud-order-751','1','1000','订单id'), +('mall4cloud-order-752','1','1000','订单id'), +('mall4cloud-order-753','1','1000','订单id'), +('mall4cloud-order-754','1','1000','订单id'), +('mall4cloud-order-755','1','1000','订单id'), +('mall4cloud-order-756','1','1000','订单id'), +('mall4cloud-order-757','1','1000','订单id'), +('mall4cloud-order-758','1','1000','订单id'), +('mall4cloud-order-759','1','1000','订单id'), +('mall4cloud-order-760','1','1000','订单id'), +('mall4cloud-order-761','1','1000','订单id'), +('mall4cloud-order-762','1','1000','订单id'), +('mall4cloud-order-763','1','1000','订单id'), +('mall4cloud-order-764','1','1000','订单id'), +('mall4cloud-order-765','1','1000','订单id'), +('mall4cloud-order-766','1','1000','订单id'), +('mall4cloud-order-767','1','1000','订单id'), +('mall4cloud-order-768','1','1000','订单id'), +('mall4cloud-order-769','1','1000','订单id'), +('mall4cloud-order-770','1','1000','订单id'), +('mall4cloud-order-771','1','1000','订单id'), +('mall4cloud-order-772','1','1000','订单id'), +('mall4cloud-order-773','1','1000','订单id'), +('mall4cloud-order-774','1','1000','订单id'), +('mall4cloud-order-775','1','1000','订单id'), +('mall4cloud-order-776','1','1000','订单id'), +('mall4cloud-order-777','1','1000','订单id'), +('mall4cloud-order-778','1','1000','订单id'), +('mall4cloud-order-779','1','1000','订单id'), +('mall4cloud-order-780','1','1000','订单id'), +('mall4cloud-order-781','1','1000','订单id'), +('mall4cloud-order-782','1','1000','订单id'), +('mall4cloud-order-783','1','1000','订单id'), +('mall4cloud-order-784','1','1000','订单id'), +('mall4cloud-order-785','1','1000','订单id'), +('mall4cloud-order-786','1','1000','订单id'), +('mall4cloud-order-787','1','1000','订单id'), +('mall4cloud-order-788','1','1000','订单id'), +('mall4cloud-order-789','1','1000','订单id'), +('mall4cloud-order-790','1','1000','订单id'), +('mall4cloud-order-791','1','1000','订单id'), +('mall4cloud-order-792','1','1000','订单id'), +('mall4cloud-order-793','1','1000','订单id'), +('mall4cloud-order-794','1','1000','订单id'), +('mall4cloud-order-795','1','1000','订单id'), +('mall4cloud-order-796','1','1000','订单id'), +('mall4cloud-order-797','1','1000','订单id'), +('mall4cloud-order-798','1','1000','订单id'), +('mall4cloud-order-799','1','1000','订单id'), +('mall4cloud-order-800','1','1000','订单id'), +('mall4cloud-order-801','1','1000','订单id'), +('mall4cloud-order-802','1','1000','订单id'), +('mall4cloud-order-803','1','1000','订单id'), +('mall4cloud-order-804','1','1000','订单id'), +('mall4cloud-order-805','1','1000','订单id'), +('mall4cloud-order-806','1','1000','订单id'), +('mall4cloud-order-807','1','1000','订单id'), +('mall4cloud-order-808','1','1000','订单id'), +('mall4cloud-order-809','1','1000','订单id'), +('mall4cloud-order-810','1','1000','订单id'), +('mall4cloud-order-811','1','1000','订单id'), +('mall4cloud-order-812','1','1000','订单id'), +('mall4cloud-order-813','1','1000','订单id'), +('mall4cloud-order-814','1','1000','订单id'), +('mall4cloud-order-815','1','1000','订单id'), +('mall4cloud-order-816','1','1000','订单id'), +('mall4cloud-order-817','1','1000','订单id'), +('mall4cloud-order-818','1','1000','订单id'), +('mall4cloud-order-819','1','1000','订单id'), +('mall4cloud-order-820','1','1000','订单id'), +('mall4cloud-order-821','1','1000','订单id'), +('mall4cloud-order-822','1','1000','订单id'), +('mall4cloud-order-823','1','1000','订单id'), +('mall4cloud-order-824','1','1000','订单id'), +('mall4cloud-order-825','1','1000','订单id'), +('mall4cloud-order-826','1','1000','订单id'), +('mall4cloud-order-827','1','1000','订单id'), +('mall4cloud-order-828','1','1000','订单id'), +('mall4cloud-order-829','1','1000','订单id'), +('mall4cloud-order-830','1','1000','订单id'), +('mall4cloud-order-831','1','1000','订单id'), +('mall4cloud-order-832','1','1000','订单id'), +('mall4cloud-order-833','1','1000','订单id'), +('mall4cloud-order-834','1','1000','订单id'), +('mall4cloud-order-835','1','1000','订单id'), +('mall4cloud-order-836','1','1000','订单id'), +('mall4cloud-order-837','1','1000','订单id'), +('mall4cloud-order-838','1','1000','订单id'), +('mall4cloud-order-839','1','1000','订单id'), +('mall4cloud-order-840','1','1000','订单id'), +('mall4cloud-order-841','1','1000','订单id'), +('mall4cloud-order-842','1','1000','订单id'), +('mall4cloud-order-843','1','1000','订单id'), +('mall4cloud-order-844','1','1000','订单id'), +('mall4cloud-order-845','1','1000','订单id'), +('mall4cloud-order-846','1','1000','订单id'), +('mall4cloud-order-847','1','1000','订单id'), +('mall4cloud-order-848','1','1000','订单id'), +('mall4cloud-order-849','1','1000','订单id'), +('mall4cloud-order-850','1','1000','订单id'), +('mall4cloud-order-851','1','1000','订单id'), +('mall4cloud-order-852','1','1000','订单id'), +('mall4cloud-order-853','1','1000','订单id'), +('mall4cloud-order-854','1','1000','订单id'), +('mall4cloud-order-855','1','1000','订单id'), +('mall4cloud-order-856','1','1000','订单id'), +('mall4cloud-order-857','1','1000','订单id'), +('mall4cloud-order-858','1','1000','订单id'), +('mall4cloud-order-859','1','1000','订单id'), +('mall4cloud-order-860','1','1000','订单id'), +('mall4cloud-order-861','1','1000','订单id'), +('mall4cloud-order-862','1','1000','订单id'), +('mall4cloud-order-863','1','1000','订单id'), +('mall4cloud-order-864','1','1000','订单id'), +('mall4cloud-order-865','1','1000','订单id'), +('mall4cloud-order-866','1','1000','订单id'), +('mall4cloud-order-867','1','1000','订单id'), +('mall4cloud-order-868','1','1000','订单id'), +('mall4cloud-order-869','1','1000','订单id'), +('mall4cloud-order-870','1','1000','订单id'), +('mall4cloud-order-871','1','1000','订单id'), +('mall4cloud-order-872','1','1000','订单id'), +('mall4cloud-order-873','1','1000','订单id'), +('mall4cloud-order-874','1','1000','订单id'), +('mall4cloud-order-875','1','1000','订单id'), +('mall4cloud-order-876','1','1000','订单id'), +('mall4cloud-order-877','1','1000','订单id'), +('mall4cloud-order-878','1','1000','订单id'), +('mall4cloud-order-879','1','1000','订单id'), +('mall4cloud-order-880','1','1000','订单id'), +('mall4cloud-order-881','1','1000','订单id'), +('mall4cloud-order-882','1','1000','订单id'), +('mall4cloud-order-883','1','1000','订单id'), +('mall4cloud-order-884','1','1000','订单id'), +('mall4cloud-order-885','1','1000','订单id'), +('mall4cloud-order-886','1','1000','订单id'), +('mall4cloud-order-887','1','1000','订单id'), +('mall4cloud-order-888','1','1000','订单id'), +('mall4cloud-order-889','1','1000','订单id'), +('mall4cloud-order-890','1','1000','订单id'), +('mall4cloud-order-891','1','1000','订单id'), +('mall4cloud-order-892','1','1000','订单id'), +('mall4cloud-order-893','1','1000','订单id'), +('mall4cloud-order-894','1','1000','订单id'), +('mall4cloud-order-895','1','1000','订单id'), +('mall4cloud-order-896','1','1000','订单id'), +('mall4cloud-order-897','1','1000','订单id'), +('mall4cloud-order-898','1','1000','订单id'), +('mall4cloud-order-899','1','1000','订单id'), +('mall4cloud-order-900','1','1000','订单id'), +('mall4cloud-order-901','1','1000','订单id'), +('mall4cloud-order-902','1','1000','订单id'), +('mall4cloud-order-903','1','1000','订单id'), +('mall4cloud-order-904','1','1000','订单id'), +('mall4cloud-order-905','1','1000','订单id'), +('mall4cloud-order-906','1','1000','订单id'), +('mall4cloud-order-907','1','1000','订单id'), +('mall4cloud-order-908','1','1000','订单id'), +('mall4cloud-order-909','1','1000','订单id'), +('mall4cloud-order-910','1','1000','订单id'), +('mall4cloud-order-911','1','1000','订单id'), +('mall4cloud-order-912','1','1000','订单id'), +('mall4cloud-order-913','1','1000','订单id'), +('mall4cloud-order-914','1','1000','订单id'), +('mall4cloud-order-915','1','1000','订单id'), +('mall4cloud-order-916','1','1000','订单id'), +('mall4cloud-order-917','1','1000','订单id'), +('mall4cloud-order-918','1','1000','订单id'), +('mall4cloud-order-919','1','1000','订单id'), +('mall4cloud-order-920','1','1000','订单id'), +('mall4cloud-order-921','1','1000','订单id'), +('mall4cloud-order-922','1','1000','订单id'), +('mall4cloud-order-923','1','1000','订单id'), +('mall4cloud-order-924','1','1000','订单id'), +('mall4cloud-order-925','1','1000','订单id'), +('mall4cloud-order-926','1','1000','订单id'), +('mall4cloud-order-927','1','1000','订单id'), +('mall4cloud-order-928','1','1000','订单id'), +('mall4cloud-order-929','1','1000','订单id'), +('mall4cloud-order-930','1','1000','订单id'), +('mall4cloud-order-931','1','1000','订单id'), +('mall4cloud-order-932','1','1000','订单id'), +('mall4cloud-order-933','1','1000','订单id'), +('mall4cloud-order-934','1','1000','订单id'), +('mall4cloud-order-935','1','1000','订单id'), +('mall4cloud-order-936','1','1000','订单id'), +('mall4cloud-order-937','1','1000','订单id'), +('mall4cloud-order-938','1','1000','订单id'), +('mall4cloud-order-939','1','1000','订单id'), +('mall4cloud-order-940','1','1000','订单id'), +('mall4cloud-order-941','1','1000','订单id'), +('mall4cloud-order-942','1','1000','订单id'), +('mall4cloud-order-943','1','1000','订单id'), +('mall4cloud-order-944','1','1000','订单id'), +('mall4cloud-order-945','1','1000','订单id'), +('mall4cloud-order-946','1','1000','订单id'), +('mall4cloud-order-947','1','1000','订单id'), +('mall4cloud-order-948','1','1000','订单id'), +('mall4cloud-order-949','1','1000','订单id'), +('mall4cloud-order-950','1','1000','订单id'), +('mall4cloud-order-951','1','1000','订单id'), +('mall4cloud-order-952','1','1000','订单id'), +('mall4cloud-order-953','1','1000','订单id'), +('mall4cloud-order-954','1','1000','订单id'), +('mall4cloud-order-955','1','1000','订单id'), +('mall4cloud-order-956','1','1000','订单id'), +('mall4cloud-order-957','1','1000','订单id'), +('mall4cloud-order-958','1','1000','订单id'), +('mall4cloud-order-959','1','1000','订单id'), +('mall4cloud-order-960','1','1000','订单id'), +('mall4cloud-order-961','1','1000','订单id'), +('mall4cloud-order-962','1','1000','订单id'), +('mall4cloud-order-963','1','1000','订单id'), +('mall4cloud-order-964','1','1000','订单id'), +('mall4cloud-order-965','1','1000','订单id'), +('mall4cloud-order-966','1','1000','订单id'), +('mall4cloud-order-967','1','1000','订单id'), +('mall4cloud-order-968','1','1000','订单id'), +('mall4cloud-order-969','1','1000','订单id'), +('mall4cloud-order-970','1','1000','订单id'), +('mall4cloud-order-971','1','1000','订单id'), +('mall4cloud-order-972','1','1000','订单id'), +('mall4cloud-order-973','1','1000','订单id'), +('mall4cloud-order-974','1','1000','订单id'), +('mall4cloud-order-975','1','1000','订单id'), +('mall4cloud-order-976','1','1000','订单id'), +('mall4cloud-order-977','1','1000','订单id'), +('mall4cloud-order-978','1','1000','订单id'), +('mall4cloud-order-979','1','1000','订单id'), +('mall4cloud-order-980','1','1000','订单id'), +('mall4cloud-order-981','1','1000','订单id'), +('mall4cloud-order-982','1','1000','订单id'), +('mall4cloud-order-983','1','1000','订单id'), +('mall4cloud-order-984','1','1000','订单id'), +('mall4cloud-order-985','1','1000','订单id'), +('mall4cloud-order-986','1','1000','订单id'), +('mall4cloud-order-987','1','1000','订单id'), +('mall4cloud-order-988','1','1000','订单id'), +('mall4cloud-order-989','1','1000','订单id'), +('mall4cloud-order-990','1','1000','订单id'), +('mall4cloud-order-991','1','1000','订单id'), +('mall4cloud-order-992','1','1000','订单id'), +('mall4cloud-order-993','1','1000','订单id'), +('mall4cloud-order-994','1','1000','订单id'), +('mall4cloud-order-995','1','1000','订单id'), +('mall4cloud-order-996','1','1000','订单id'), +('mall4cloud-order-997','1','1000','订单id'), +('mall4cloud-order-998','1','1000','订单id'), +('mall4cloud-order-999','1','1000','订单id'), +('mall4cloud-order-addr-000','1','1000','订单地址id'), +('mall4cloud-order-addr-001','1','1000','订单地址id'), +('mall4cloud-order-addr-002','1','1000','订单地址id'), +('mall4cloud-order-addr-003','1','1000','订单地址id'), +('mall4cloud-order-addr-004','1','1000','订单地址id'), +('mall4cloud-order-addr-005','1','1000','订单地址id'), +('mall4cloud-order-addr-006','1','1000','订单地址id'), +('mall4cloud-order-addr-007','1','1000','订单地址id'), +('mall4cloud-order-addr-008','1','1000','订单地址id'), +('mall4cloud-order-addr-009','1','1000','订单地址id'), +('mall4cloud-order-addr-010','1','1000','订单地址id'), +('mall4cloud-order-addr-011','1','1000','订单地址id'), +('mall4cloud-order-addr-012','1','1000','订单地址id'), +('mall4cloud-order-addr-013','1','1000','订单地址id'), +('mall4cloud-order-addr-014','1','1000','订单地址id'), +('mall4cloud-order-addr-015','1','1000','订单地址id'), +('mall4cloud-order-addr-016','1','1000','订单地址id'), +('mall4cloud-order-addr-017','1','1000','订单地址id'), +('mall4cloud-order-addr-018','1','1000','订单地址id'), +('mall4cloud-order-addr-019','1','1000','订单地址id'), +('mall4cloud-order-addr-020','1','1000','订单地址id'), +('mall4cloud-order-addr-021','1','1000','订单地址id'), +('mall4cloud-order-addr-022','1','1000','订单地址id'), +('mall4cloud-order-addr-023','1','1000','订单地址id'), +('mall4cloud-order-addr-024','1','1000','订单地址id'), +('mall4cloud-order-addr-025','1','1000','订单地址id'), +('mall4cloud-order-addr-026','1','1000','订单地址id'), +('mall4cloud-order-addr-027','1','1000','订单地址id'), +('mall4cloud-order-addr-028','1','1000','订单地址id'), +('mall4cloud-order-addr-029','1','1000','订单地址id'), +('mall4cloud-order-addr-030','1','1000','订单地址id'), +('mall4cloud-order-addr-031','1','1000','订单地址id'), +('mall4cloud-order-addr-032','1','1000','订单地址id'), +('mall4cloud-order-addr-033','1','1000','订单地址id'), +('mall4cloud-order-addr-034','1','1000','订单地址id'), +('mall4cloud-order-addr-035','1','1000','订单地址id'), +('mall4cloud-order-addr-036','1','1000','订单地址id'), +('mall4cloud-order-addr-037','1','1000','订单地址id'), +('mall4cloud-order-addr-038','1','1000','订单地址id'), +('mall4cloud-order-addr-039','1','1000','订单地址id'), +('mall4cloud-order-addr-040','1','1000','订单地址id'), +('mall4cloud-order-addr-041','1','1000','订单地址id'), +('mall4cloud-order-addr-042','1','1000','订单地址id'), +('mall4cloud-order-addr-043','1','1000','订单地址id'), +('mall4cloud-order-addr-044','1','1000','订单地址id'), +('mall4cloud-order-addr-045','1','1000','订单地址id'), +('mall4cloud-order-addr-046','1','1000','订单地址id'), +('mall4cloud-order-addr-047','1','1000','订单地址id'), +('mall4cloud-order-addr-048','1','1000','订单地址id'), +('mall4cloud-order-addr-049','1','1000','订单地址id'), +('mall4cloud-order-addr-050','1','1000','订单地址id'), +('mall4cloud-order-addr-051','1','1000','订单地址id'), +('mall4cloud-order-addr-052','1','1000','订单地址id'), +('mall4cloud-order-addr-053','1','1000','订单地址id'), +('mall4cloud-order-addr-054','1','1000','订单地址id'), +('mall4cloud-order-addr-055','1','1000','订单地址id'), +('mall4cloud-order-addr-056','1','1000','订单地址id'), +('mall4cloud-order-addr-057','1','1000','订单地址id'), +('mall4cloud-order-addr-058','1','1000','订单地址id'), +('mall4cloud-order-addr-059','1','1000','订单地址id'), +('mall4cloud-order-addr-060','1','1000','订单地址id'), +('mall4cloud-order-addr-061','1','1000','订单地址id'), +('mall4cloud-order-addr-062','1','1000','订单地址id'), +('mall4cloud-order-addr-063','1','1000','订单地址id'), +('mall4cloud-order-addr-064','1','1000','订单地址id'), +('mall4cloud-order-addr-065','1','1000','订单地址id'), +('mall4cloud-order-addr-066','1','1000','订单地址id'), +('mall4cloud-order-addr-067','1','1000','订单地址id'), +('mall4cloud-order-addr-068','1','1000','订单地址id'), +('mall4cloud-order-addr-069','1','1000','订单地址id'), +('mall4cloud-order-addr-070','1','1000','订单地址id'), +('mall4cloud-order-addr-071','1','1000','订单地址id'), +('mall4cloud-order-addr-072','1','1000','订单地址id'), +('mall4cloud-order-addr-073','1','1000','订单地址id'), +('mall4cloud-order-addr-074','1','1000','订单地址id'), +('mall4cloud-order-addr-075','1','1000','订单地址id'), +('mall4cloud-order-addr-076','1','1000','订单地址id'), +('mall4cloud-order-addr-077','1','1000','订单地址id'), +('mall4cloud-order-addr-078','1','1000','订单地址id'), +('mall4cloud-order-addr-079','1','1000','订单地址id'), +('mall4cloud-order-addr-080','1','1000','订单地址id'), +('mall4cloud-order-addr-081','1','1000','订单地址id'), +('mall4cloud-order-addr-082','1','1000','订单地址id'), +('mall4cloud-order-addr-083','1','1000','订单地址id'), +('mall4cloud-order-addr-084','1','1000','订单地址id'), +('mall4cloud-order-addr-085','1','1000','订单地址id'), +('mall4cloud-order-addr-086','1','1000','订单地址id'), +('mall4cloud-order-addr-087','1','1000','订单地址id'), +('mall4cloud-order-addr-088','1','1000','订单地址id'), +('mall4cloud-order-addr-089','1','1000','订单地址id'), +('mall4cloud-order-addr-090','1','1000','订单地址id'), +('mall4cloud-order-addr-091','1','1000','订单地址id'), +('mall4cloud-order-addr-092','1','1000','订单地址id'), +('mall4cloud-order-addr-093','1','1000','订单地址id'), +('mall4cloud-order-addr-094','1','1000','订单地址id'), +('mall4cloud-order-addr-095','1','1000','订单地址id'), +('mall4cloud-order-addr-096','1','1000','订单地址id'), +('mall4cloud-order-addr-097','1','1000','订单地址id'), +('mall4cloud-order-addr-098','1','1000','订单地址id'), +('mall4cloud-order-addr-099','1','1000','订单地址id'), +('mall4cloud-order-addr-100','1','1000','订单地址id'), +('mall4cloud-order-addr-101','1','1000','订单地址id'), +('mall4cloud-order-addr-102','1','1000','订单地址id'), +('mall4cloud-order-addr-103','1','1000','订单地址id'), +('mall4cloud-order-addr-104','1','1000','订单地址id'), +('mall4cloud-order-addr-105','1','1000','订单地址id'), +('mall4cloud-order-addr-106','1','1000','订单地址id'), +('mall4cloud-order-addr-107','1','1000','订单地址id'), +('mall4cloud-order-addr-108','1','1000','订单地址id'), +('mall4cloud-order-addr-109','1','1000','订单地址id'), +('mall4cloud-order-addr-110','1','1000','订单地址id'), +('mall4cloud-order-addr-111','1','1000','订单地址id'), +('mall4cloud-order-addr-112','1','1000','订单地址id'), +('mall4cloud-order-addr-113','1','1000','订单地址id'), +('mall4cloud-order-addr-114','1','1000','订单地址id'), +('mall4cloud-order-addr-115','1','1000','订单地址id'), +('mall4cloud-order-addr-116','1','1000','订单地址id'), +('mall4cloud-order-addr-117','1','1000','订单地址id'), +('mall4cloud-order-addr-118','1','1000','订单地址id'), +('mall4cloud-order-addr-119','1','1000','订单地址id'), +('mall4cloud-order-addr-120','1','1000','订单地址id'), +('mall4cloud-order-addr-121','1','1000','订单地址id'), +('mall4cloud-order-addr-122','1','1000','订单地址id'), +('mall4cloud-order-addr-123','1','1000','订单地址id'), +('mall4cloud-order-addr-124','1','1000','订单地址id'), +('mall4cloud-order-addr-125','1','1000','订单地址id'), +('mall4cloud-order-addr-126','1','1000','订单地址id'), +('mall4cloud-order-addr-127','1','1000','订单地址id'), +('mall4cloud-order-addr-128','1','1000','订单地址id'), +('mall4cloud-order-addr-129','1','1000','订单地址id'), +('mall4cloud-order-addr-130','1','1000','订单地址id'), +('mall4cloud-order-addr-131','1','1000','订单地址id'), +('mall4cloud-order-addr-132','1','1000','订单地址id'), +('mall4cloud-order-addr-133','1','1000','订单地址id'), +('mall4cloud-order-addr-134','1','1000','订单地址id'), +('mall4cloud-order-addr-135','1','1000','订单地址id'), +('mall4cloud-order-addr-136','1','1000','订单地址id'), +('mall4cloud-order-addr-137','1','1000','订单地址id'), +('mall4cloud-order-addr-138','1','1000','订单地址id'), +('mall4cloud-order-addr-139','1','1000','订单地址id'), +('mall4cloud-order-addr-140','1','1000','订单地址id'), +('mall4cloud-order-addr-141','1','1000','订单地址id'), +('mall4cloud-order-addr-142','1','1000','订单地址id'), +('mall4cloud-order-addr-143','1','1000','订单地址id'), +('mall4cloud-order-addr-144','1','1000','订单地址id'), +('mall4cloud-order-addr-145','1','1000','订单地址id'), +('mall4cloud-order-addr-146','1','1000','订单地址id'), +('mall4cloud-order-addr-147','1','1000','订单地址id'), +('mall4cloud-order-addr-148','1','1000','订单地址id'), +('mall4cloud-order-addr-149','1','1000','订单地址id'), +('mall4cloud-order-addr-150','1','1000','订单地址id'), +('mall4cloud-order-addr-151','1','1000','订单地址id'), +('mall4cloud-order-addr-152','1','1000','订单地址id'), +('mall4cloud-order-addr-153','1','1000','订单地址id'), +('mall4cloud-order-addr-154','1','1000','订单地址id'), +('mall4cloud-order-addr-155','1','1000','订单地址id'), +('mall4cloud-order-addr-156','1','1000','订单地址id'), +('mall4cloud-order-addr-157','1','1000','订单地址id'), +('mall4cloud-order-addr-158','1','1000','订单地址id'), +('mall4cloud-order-addr-159','1','1000','订单地址id'), +('mall4cloud-order-addr-160','1','1000','订单地址id'), +('mall4cloud-order-addr-161','1','1000','订单地址id'), +('mall4cloud-order-addr-162','1','1000','订单地址id'), +('mall4cloud-order-addr-163','1','1000','订单地址id'), +('mall4cloud-order-addr-164','1','1000','订单地址id'), +('mall4cloud-order-addr-165','1','1000','订单地址id'), +('mall4cloud-order-addr-166','1','1000','订单地址id'), +('mall4cloud-order-addr-167','1','1000','订单地址id'), +('mall4cloud-order-addr-168','1','1000','订单地址id'), +('mall4cloud-order-addr-169','1','1000','订单地址id'), +('mall4cloud-order-addr-170','1','1000','订单地址id'), +('mall4cloud-order-addr-171','1','1000','订单地址id'), +('mall4cloud-order-addr-172','1','1000','订单地址id'), +('mall4cloud-order-addr-173','1','1000','订单地址id'), +('mall4cloud-order-addr-174','1','1000','订单地址id'), +('mall4cloud-order-addr-175','1','1000','订单地址id'), +('mall4cloud-order-addr-176','1','1000','订单地址id'), +('mall4cloud-order-addr-177','1','1000','订单地址id'), +('mall4cloud-order-addr-178','1','1000','订单地址id'), +('mall4cloud-order-addr-179','1','1000','订单地址id'), +('mall4cloud-order-addr-180','1','1000','订单地址id'), +('mall4cloud-order-addr-181','1','1000','订单地址id'), +('mall4cloud-order-addr-182','1','1000','订单地址id'), +('mall4cloud-order-addr-183','1','1000','订单地址id'), +('mall4cloud-order-addr-184','1','1000','订单地址id'), +('mall4cloud-order-addr-185','1','1000','订单地址id'), +('mall4cloud-order-addr-186','1','1000','订单地址id'), +('mall4cloud-order-addr-187','1','1000','订单地址id'), +('mall4cloud-order-addr-188','1','1000','订单地址id'), +('mall4cloud-order-addr-189','1','1000','订单地址id'), +('mall4cloud-order-addr-190','1','1000','订单地址id'), +('mall4cloud-order-addr-191','1','1000','订单地址id'), +('mall4cloud-order-addr-192','1','1000','订单地址id'), +('mall4cloud-order-addr-193','1','1000','订单地址id'), +('mall4cloud-order-addr-194','1','1000','订单地址id'), +('mall4cloud-order-addr-195','1','1000','订单地址id'), +('mall4cloud-order-addr-196','1','1000','订单地址id'), +('mall4cloud-order-addr-197','1','1000','订单地址id'), +('mall4cloud-order-addr-198','1','1000','订单地址id'), +('mall4cloud-order-addr-199','1','1000','订单地址id'), +('mall4cloud-order-addr-200','1','1000','订单地址id'), +('mall4cloud-order-addr-201','1','1000','订单地址id'), +('mall4cloud-order-addr-202','1','1000','订单地址id'), +('mall4cloud-order-addr-203','1','1000','订单地址id'), +('mall4cloud-order-addr-204','1','1000','订单地址id'), +('mall4cloud-order-addr-205','1','1000','订单地址id'), +('mall4cloud-order-addr-206','1','1000','订单地址id'), +('mall4cloud-order-addr-207','1','1000','订单地址id'), +('mall4cloud-order-addr-208','1','1000','订单地址id'), +('mall4cloud-order-addr-209','1','1000','订单地址id'), +('mall4cloud-order-addr-210','1','1000','订单地址id'), +('mall4cloud-order-addr-211','1','1000','订单地址id'), +('mall4cloud-order-addr-212','1','1000','订单地址id'), +('mall4cloud-order-addr-213','1','1000','订单地址id'), +('mall4cloud-order-addr-214','1','1000','订单地址id'), +('mall4cloud-order-addr-215','1','1000','订单地址id'), +('mall4cloud-order-addr-216','1','1000','订单地址id'), +('mall4cloud-order-addr-217','1','1000','订单地址id'), +('mall4cloud-order-addr-218','1','1000','订单地址id'), +('mall4cloud-order-addr-219','1','1000','订单地址id'), +('mall4cloud-order-addr-220','1','1000','订单地址id'), +('mall4cloud-order-addr-221','1','1000','订单地址id'), +('mall4cloud-order-addr-222','1','1000','订单地址id'), +('mall4cloud-order-addr-223','1','1000','订单地址id'), +('mall4cloud-order-addr-224','1','1000','订单地址id'), +('mall4cloud-order-addr-225','1','1000','订单地址id'), +('mall4cloud-order-addr-226','1','1000','订单地址id'), +('mall4cloud-order-addr-227','1','1000','订单地址id'), +('mall4cloud-order-addr-228','1','1000','订单地址id'), +('mall4cloud-order-addr-229','1','1000','订单地址id'), +('mall4cloud-order-addr-230','1','1000','订单地址id'), +('mall4cloud-order-addr-231','1','1000','订单地址id'), +('mall4cloud-order-addr-232','1','1000','订单地址id'), +('mall4cloud-order-addr-233','1','1000','订单地址id'), +('mall4cloud-order-addr-234','1','1000','订单地址id'), +('mall4cloud-order-addr-235','1','1000','订单地址id'), +('mall4cloud-order-addr-236','1','1000','订单地址id'), +('mall4cloud-order-addr-237','1','1000','订单地址id'), +('mall4cloud-order-addr-238','1','1000','订单地址id'), +('mall4cloud-order-addr-239','1','1000','订单地址id'), +('mall4cloud-order-addr-240','1','1000','订单地址id'), +('mall4cloud-order-addr-241','1','1000','订单地址id'), +('mall4cloud-order-addr-242','1','1000','订单地址id'), +('mall4cloud-order-addr-243','1','1000','订单地址id'), +('mall4cloud-order-addr-244','1','1000','订单地址id'), +('mall4cloud-order-addr-245','1','1000','订单地址id'), +('mall4cloud-order-addr-246','1','1000','订单地址id'), +('mall4cloud-order-addr-247','1','1000','订单地址id'), +('mall4cloud-order-addr-248','1','1000','订单地址id'), +('mall4cloud-order-addr-249','1','1000','订单地址id'), +('mall4cloud-order-addr-250','1','1000','订单地址id'), +('mall4cloud-order-addr-251','1','1000','订单地址id'), +('mall4cloud-order-addr-252','1','1000','订单地址id'), +('mall4cloud-order-addr-253','1','1000','订单地址id'), +('mall4cloud-order-addr-254','1','1000','订单地址id'), +('mall4cloud-order-addr-255','1','1000','订单地址id'), +('mall4cloud-order-addr-256','1','1000','订单地址id'), +('mall4cloud-order-addr-257','1','1000','订单地址id'), +('mall4cloud-order-addr-258','1','1000','订单地址id'), +('mall4cloud-order-addr-259','1','1000','订单地址id'), +('mall4cloud-order-addr-260','1','1000','订单地址id'), +('mall4cloud-order-addr-261','1','1000','订单地址id'), +('mall4cloud-order-addr-262','1','1000','订单地址id'), +('mall4cloud-order-addr-263','1','1000','订单地址id'), +('mall4cloud-order-addr-264','1','1000','订单地址id'), +('mall4cloud-order-addr-265','1','1000','订单地址id'), +('mall4cloud-order-addr-266','1','1000','订单地址id'), +('mall4cloud-order-addr-267','1','1000','订单地址id'), +('mall4cloud-order-addr-268','1','1000','订单地址id'), +('mall4cloud-order-addr-269','1','1000','订单地址id'), +('mall4cloud-order-addr-270','1','1000','订单地址id'), +('mall4cloud-order-addr-271','1','1000','订单地址id'), +('mall4cloud-order-addr-272','1','1000','订单地址id'), +('mall4cloud-order-addr-273','1','1000','订单地址id'), +('mall4cloud-order-addr-274','1','1000','订单地址id'), +('mall4cloud-order-addr-275','1','1000','订单地址id'), +('mall4cloud-order-addr-276','1','1000','订单地址id'), +('mall4cloud-order-addr-277','1','1000','订单地址id'), +('mall4cloud-order-addr-278','1','1000','订单地址id'), +('mall4cloud-order-addr-279','1','1000','订单地址id'), +('mall4cloud-order-addr-280','1','1000','订单地址id'), +('mall4cloud-order-addr-281','1','1000','订单地址id'), +('mall4cloud-order-addr-282','1','1000','订单地址id'), +('mall4cloud-order-addr-283','1','1000','订单地址id'), +('mall4cloud-order-addr-284','1','1000','订单地址id'), +('mall4cloud-order-addr-285','1','1000','订单地址id'), +('mall4cloud-order-addr-286','1','1000','订单地址id'), +('mall4cloud-order-addr-287','1','1000','订单地址id'), +('mall4cloud-order-addr-288','1','1000','订单地址id'), +('mall4cloud-order-addr-289','1','1000','订单地址id'), +('mall4cloud-order-addr-290','1','1000','订单地址id'), +('mall4cloud-order-addr-291','1','1000','订单地址id'), +('mall4cloud-order-addr-292','1','1000','订单地址id'), +('mall4cloud-order-addr-293','1','1000','订单地址id'), +('mall4cloud-order-addr-294','1','1000','订单地址id'), +('mall4cloud-order-addr-295','1','1000','订单地址id'), +('mall4cloud-order-addr-296','1','1000','订单地址id'), +('mall4cloud-order-addr-297','1','1000','订单地址id'), +('mall4cloud-order-addr-298','1','1000','订单地址id'), +('mall4cloud-order-addr-299','1','1000','订单地址id'), +('mall4cloud-order-addr-300','1','1000','订单地址id'), +('mall4cloud-order-addr-301','1','1000','订单地址id'), +('mall4cloud-order-addr-302','1','1000','订单地址id'), +('mall4cloud-order-addr-303','1','1000','订单地址id'), +('mall4cloud-order-addr-304','1','1000','订单地址id'), +('mall4cloud-order-addr-305','1','1000','订单地址id'), +('mall4cloud-order-addr-306','1','1000','订单地址id'), +('mall4cloud-order-addr-307','1','1000','订单地址id'), +('mall4cloud-order-addr-308','1','1000','订单地址id'), +('mall4cloud-order-addr-309','1','1000','订单地址id'), +('mall4cloud-order-addr-310','1','1000','订单地址id'), +('mall4cloud-order-addr-311','1','1000','订单地址id'), +('mall4cloud-order-addr-312','1','1000','订单地址id'), +('mall4cloud-order-addr-313','1','1000','订单地址id'), +('mall4cloud-order-addr-314','1','1000','订单地址id'), +('mall4cloud-order-addr-315','1','1000','订单地址id'), +('mall4cloud-order-addr-316','1','1000','订单地址id'), +('mall4cloud-order-addr-317','1','1000','订单地址id'), +('mall4cloud-order-addr-318','1','1000','订单地址id'), +('mall4cloud-order-addr-319','1','1000','订单地址id'), +('mall4cloud-order-addr-320','1','1000','订单地址id'), +('mall4cloud-order-addr-321','1','1000','订单地址id'), +('mall4cloud-order-addr-322','1','1000','订单地址id'), +('mall4cloud-order-addr-323','1','1000','订单地址id'), +('mall4cloud-order-addr-324','1','1000','订单地址id'), +('mall4cloud-order-addr-325','1','1000','订单地址id'), +('mall4cloud-order-addr-326','1','1000','订单地址id'), +('mall4cloud-order-addr-327','1','1000','订单地址id'), +('mall4cloud-order-addr-328','1','1000','订单地址id'), +('mall4cloud-order-addr-329','1','1000','订单地址id'), +('mall4cloud-order-addr-330','1','1000','订单地址id'), +('mall4cloud-order-addr-331','1','1000','订单地址id'), +('mall4cloud-order-addr-332','1','1000','订单地址id'), +('mall4cloud-order-addr-333','1','1000','订单地址id'), +('mall4cloud-order-addr-334','1','1000','订单地址id'), +('mall4cloud-order-addr-335','1','1000','订单地址id'), +('mall4cloud-order-addr-336','1','1000','订单地址id'), +('mall4cloud-order-addr-337','1','1000','订单地址id'), +('mall4cloud-order-addr-338','1','1000','订单地址id'), +('mall4cloud-order-addr-339','1','1000','订单地址id'), +('mall4cloud-order-addr-340','1','1000','订单地址id'), +('mall4cloud-order-addr-341','1','1000','订单地址id'), +('mall4cloud-order-addr-342','1','1000','订单地址id'), +('mall4cloud-order-addr-343','1','1000','订单地址id'), +('mall4cloud-order-addr-344','1','1000','订单地址id'), +('mall4cloud-order-addr-345','1','1000','订单地址id'), +('mall4cloud-order-addr-346','1','1000','订单地址id'), +('mall4cloud-order-addr-347','1','1000','订单地址id'), +('mall4cloud-order-addr-348','1','1000','订单地址id'), +('mall4cloud-order-addr-349','1','1000','订单地址id'), +('mall4cloud-order-addr-350','1','1000','订单地址id'), +('mall4cloud-order-addr-351','1','1000','订单地址id'), +('mall4cloud-order-addr-352','1','1000','订单地址id'), +('mall4cloud-order-addr-353','1','1000','订单地址id'), +('mall4cloud-order-addr-354','1','1000','订单地址id'), +('mall4cloud-order-addr-355','1','1000','订单地址id'), +('mall4cloud-order-addr-356','1','1000','订单地址id'), +('mall4cloud-order-addr-357','1','1000','订单地址id'), +('mall4cloud-order-addr-358','1','1000','订单地址id'), +('mall4cloud-order-addr-359','1','1000','订单地址id'), +('mall4cloud-order-addr-360','1','1000','订单地址id'), +('mall4cloud-order-addr-361','1','1000','订单地址id'), +('mall4cloud-order-addr-362','1','1000','订单地址id'), +('mall4cloud-order-addr-363','1','1000','订单地址id'), +('mall4cloud-order-addr-364','1','1000','订单地址id'), +('mall4cloud-order-addr-365','1','1000','订单地址id'), +('mall4cloud-order-addr-366','1','1000','订单地址id'), +('mall4cloud-order-addr-367','1','1000','订单地址id'), +('mall4cloud-order-addr-368','1','1000','订单地址id'), +('mall4cloud-order-addr-369','1','1000','订单地址id'), +('mall4cloud-order-addr-370','1','1000','订单地址id'), +('mall4cloud-order-addr-371','1','1000','订单地址id'), +('mall4cloud-order-addr-372','1','1000','订单地址id'), +('mall4cloud-order-addr-373','1','1000','订单地址id'), +('mall4cloud-order-addr-374','1','1000','订单地址id'), +('mall4cloud-order-addr-375','1','1000','订单地址id'), +('mall4cloud-order-addr-376','1','1000','订单地址id'), +('mall4cloud-order-addr-377','1','1000','订单地址id'), +('mall4cloud-order-addr-378','1','1000','订单地址id'), +('mall4cloud-order-addr-379','1','1000','订单地址id'), +('mall4cloud-order-addr-380','1','1000','订单地址id'), +('mall4cloud-order-addr-381','1','1000','订单地址id'), +('mall4cloud-order-addr-382','1','1000','订单地址id'), +('mall4cloud-order-addr-383','1','1000','订单地址id'), +('mall4cloud-order-addr-384','1','1000','订单地址id'), +('mall4cloud-order-addr-385','1','1000','订单地址id'), +('mall4cloud-order-addr-386','1','1000','订单地址id'), +('mall4cloud-order-addr-387','1','1000','订单地址id'), +('mall4cloud-order-addr-388','1','1000','订单地址id'), +('mall4cloud-order-addr-389','1','1000','订单地址id'), +('mall4cloud-order-addr-390','1','1000','订单地址id'), +('mall4cloud-order-addr-391','1','1000','订单地址id'), +('mall4cloud-order-addr-392','1','1000','订单地址id'), +('mall4cloud-order-addr-393','1','1000','订单地址id'), +('mall4cloud-order-addr-394','1','1000','订单地址id'), +('mall4cloud-order-addr-395','1','1000','订单地址id'), +('mall4cloud-order-addr-396','1','1000','订单地址id'), +('mall4cloud-order-addr-397','1','1000','订单地址id'), +('mall4cloud-order-addr-398','1','1000','订单地址id'), +('mall4cloud-order-addr-399','1','1000','订单地址id'), +('mall4cloud-order-addr-400','1','1000','订单地址id'), +('mall4cloud-order-addr-401','1','1000','订单地址id'), +('mall4cloud-order-addr-402','1','1000','订单地址id'), +('mall4cloud-order-addr-403','1','1000','订单地址id'), +('mall4cloud-order-addr-404','1','1000','订单地址id'), +('mall4cloud-order-addr-405','1','1000','订单地址id'), +('mall4cloud-order-addr-406','1','1000','订单地址id'), +('mall4cloud-order-addr-407','1','1000','订单地址id'), +('mall4cloud-order-addr-408','1','1000','订单地址id'), +('mall4cloud-order-addr-409','1','1000','订单地址id'), +('mall4cloud-order-addr-410','1','1000','订单地址id'), +('mall4cloud-order-addr-411','1','1000','订单地址id'), +('mall4cloud-order-addr-412','1','1000','订单地址id'), +('mall4cloud-order-addr-413','1','1000','订单地址id'), +('mall4cloud-order-addr-414','1','1000','订单地址id'), +('mall4cloud-order-addr-415','1','1000','订单地址id'), +('mall4cloud-order-addr-416','1','1000','订单地址id'), +('mall4cloud-order-addr-417','1','1000','订单地址id'), +('mall4cloud-order-addr-418','1','1000','订单地址id'), +('mall4cloud-order-addr-419','1','1000','订单地址id'), +('mall4cloud-order-addr-420','1','1000','订单地址id'), +('mall4cloud-order-addr-421','1','1000','订单地址id'), +('mall4cloud-order-addr-422','1','1000','订单地址id'), +('mall4cloud-order-addr-423','1','1000','订单地址id'), +('mall4cloud-order-addr-424','1','1000','订单地址id'), +('mall4cloud-order-addr-425','1','1000','订单地址id'), +('mall4cloud-order-addr-426','1','1000','订单地址id'), +('mall4cloud-order-addr-427','1','1000','订单地址id'), +('mall4cloud-order-addr-428','1','1000','订单地址id'), +('mall4cloud-order-addr-429','1','1000','订单地址id'), +('mall4cloud-order-addr-430','1','1000','订单地址id'), +('mall4cloud-order-addr-431','1','1000','订单地址id'), +('mall4cloud-order-addr-432','1','1000','订单地址id'), +('mall4cloud-order-addr-433','1','1000','订单地址id'), +('mall4cloud-order-addr-434','1','1000','订单地址id'), +('mall4cloud-order-addr-435','1','1000','订单地址id'), +('mall4cloud-order-addr-436','1','1000','订单地址id'), +('mall4cloud-order-addr-437','1','1000','订单地址id'), +('mall4cloud-order-addr-438','1','1000','订单地址id'), +('mall4cloud-order-addr-439','1','1000','订单地址id'), +('mall4cloud-order-addr-440','1','1000','订单地址id'), +('mall4cloud-order-addr-441','1','1000','订单地址id'), +('mall4cloud-order-addr-442','1','1000','订单地址id'), +('mall4cloud-order-addr-443','1','1000','订单地址id'), +('mall4cloud-order-addr-444','1','1000','订单地址id'), +('mall4cloud-order-addr-445','1','1000','订单地址id'), +('mall4cloud-order-addr-446','1','1000','订单地址id'), +('mall4cloud-order-addr-447','1','1000','订单地址id'), +('mall4cloud-order-addr-448','1','1000','订单地址id'), +('mall4cloud-order-addr-449','1','1000','订单地址id'), +('mall4cloud-order-addr-450','1','1000','订单地址id'), +('mall4cloud-order-addr-451','1','1000','订单地址id'), +('mall4cloud-order-addr-452','1','1000','订单地址id'), +('mall4cloud-order-addr-453','1','1000','订单地址id'), +('mall4cloud-order-addr-454','1','1000','订单地址id'), +('mall4cloud-order-addr-455','1','1000','订单地址id'), +('mall4cloud-order-addr-456','1','1000','订单地址id'), +('mall4cloud-order-addr-457','1','1000','订单地址id'), +('mall4cloud-order-addr-458','1','1000','订单地址id'), +('mall4cloud-order-addr-459','1','1000','订单地址id'), +('mall4cloud-order-addr-460','1','1000','订单地址id'), +('mall4cloud-order-addr-461','1','1000','订单地址id'), +('mall4cloud-order-addr-462','1','1000','订单地址id'), +('mall4cloud-order-addr-463','1','1000','订单地址id'), +('mall4cloud-order-addr-464','1','1000','订单地址id'), +('mall4cloud-order-addr-465','1','1000','订单地址id'), +('mall4cloud-order-addr-466','1','1000','订单地址id'), +('mall4cloud-order-addr-467','1','1000','订单地址id'), +('mall4cloud-order-addr-468','1','1000','订单地址id'), +('mall4cloud-order-addr-469','1','1000','订单地址id'), +('mall4cloud-order-addr-470','1','1000','订单地址id'), +('mall4cloud-order-addr-471','1','1000','订单地址id'), +('mall4cloud-order-addr-472','1','1000','订单地址id'), +('mall4cloud-order-addr-473','1','1000','订单地址id'), +('mall4cloud-order-addr-474','1','1000','订单地址id'), +('mall4cloud-order-addr-475','1','1000','订单地址id'), +('mall4cloud-order-addr-476','1','1000','订单地址id'), +('mall4cloud-order-addr-477','1','1000','订单地址id'), +('mall4cloud-order-addr-478','1','1000','订单地址id'), +('mall4cloud-order-addr-479','1','1000','订单地址id'), +('mall4cloud-order-addr-480','1','1000','订单地址id'), +('mall4cloud-order-addr-481','1','1000','订单地址id'), +('mall4cloud-order-addr-482','1','1000','订单地址id'), +('mall4cloud-order-addr-483','1','1000','订单地址id'), +('mall4cloud-order-addr-484','1','1000','订单地址id'), +('mall4cloud-order-addr-485','1','1000','订单地址id'), +('mall4cloud-order-addr-486','1','1000','订单地址id'), +('mall4cloud-order-addr-487','1','1000','订单地址id'), +('mall4cloud-order-addr-488','1','1000','订单地址id'), +('mall4cloud-order-addr-489','1','1000','订单地址id'), +('mall4cloud-order-addr-490','1','1000','订单地址id'), +('mall4cloud-order-addr-491','1','1000','订单地址id'), +('mall4cloud-order-addr-492','1','1000','订单地址id'), +('mall4cloud-order-addr-493','1','1000','订单地址id'), +('mall4cloud-order-addr-494','1','1000','订单地址id'), +('mall4cloud-order-addr-495','1','1000','订单地址id'), +('mall4cloud-order-addr-496','1','1000','订单地址id'), +('mall4cloud-order-addr-497','1','1000','订单地址id'), +('mall4cloud-order-addr-498','1','1000','订单地址id'), +('mall4cloud-order-addr-499','1','1000','订单地址id'), +('mall4cloud-order-addr-500','1','1000','订单地址id'), +('mall4cloud-order-addr-501','1','1000','订单地址id'), +('mall4cloud-order-addr-502','1','1000','订单地址id'), +('mall4cloud-order-addr-503','1','1000','订单地址id'), +('mall4cloud-order-addr-504','1','1000','订单地址id'), +('mall4cloud-order-addr-505','1','1000','订单地址id'), +('mall4cloud-order-addr-506','1','1000','订单地址id'), +('mall4cloud-order-addr-507','1','1000','订单地址id'), +('mall4cloud-order-addr-508','1','1000','订单地址id'), +('mall4cloud-order-addr-509','1','1000','订单地址id'), +('mall4cloud-order-addr-510','1','1000','订单地址id'), +('mall4cloud-order-addr-511','1','1000','订单地址id'), +('mall4cloud-order-addr-512','1','1000','订单地址id'), +('mall4cloud-order-addr-513','1','1000','订单地址id'), +('mall4cloud-order-addr-514','1','1000','订单地址id'), +('mall4cloud-order-addr-515','1','1000','订单地址id'), +('mall4cloud-order-addr-516','1','1000','订单地址id'), +('mall4cloud-order-addr-517','1','1000','订单地址id'), +('mall4cloud-order-addr-518','1','1000','订单地址id'), +('mall4cloud-order-addr-519','1','1000','订单地址id'), +('mall4cloud-order-addr-520','1','1000','订单地址id'), +('mall4cloud-order-addr-521','1','1000','订单地址id'), +('mall4cloud-order-addr-522','1','1000','订单地址id'), +('mall4cloud-order-addr-523','1','1000','订单地址id'), +('mall4cloud-order-addr-524','1','1000','订单地址id'), +('mall4cloud-order-addr-525','1','1000','订单地址id'), +('mall4cloud-order-addr-526','1','1000','订单地址id'), +('mall4cloud-order-addr-527','1','1000','订单地址id'), +('mall4cloud-order-addr-528','1','1000','订单地址id'), +('mall4cloud-order-addr-529','1','1000','订单地址id'), +('mall4cloud-order-addr-530','1','1000','订单地址id'), +('mall4cloud-order-addr-531','1','1000','订单地址id'), +('mall4cloud-order-addr-532','1','1000','订单地址id'), +('mall4cloud-order-addr-533','1','1000','订单地址id'), +('mall4cloud-order-addr-534','1','1000','订单地址id'), +('mall4cloud-order-addr-535','1','1000','订单地址id'), +('mall4cloud-order-addr-536','1','1000','订单地址id'), +('mall4cloud-order-addr-537','1','1000','订单地址id'), +('mall4cloud-order-addr-538','1','1000','订单地址id'), +('mall4cloud-order-addr-539','1','1000','订单地址id'), +('mall4cloud-order-addr-540','1','1000','订单地址id'), +('mall4cloud-order-addr-541','1','1000','订单地址id'), +('mall4cloud-order-addr-542','1','1000','订单地址id'), +('mall4cloud-order-addr-543','1','1000','订单地址id'), +('mall4cloud-order-addr-544','1','1000','订单地址id'), +('mall4cloud-order-addr-545','1','1000','订单地址id'), +('mall4cloud-order-addr-546','1','1000','订单地址id'), +('mall4cloud-order-addr-547','1','1000','订单地址id'), +('mall4cloud-order-addr-548','1','1000','订单地址id'), +('mall4cloud-order-addr-549','1','1000','订单地址id'), +('mall4cloud-order-addr-550','1','1000','订单地址id'), +('mall4cloud-order-addr-551','1','1000','订单地址id'), +('mall4cloud-order-addr-552','1','1000','订单地址id'), +('mall4cloud-order-addr-553','1','1000','订单地址id'), +('mall4cloud-order-addr-554','1','1000','订单地址id'), +('mall4cloud-order-addr-555','1','1000','订单地址id'), +('mall4cloud-order-addr-556','1','1000','订单地址id'), +('mall4cloud-order-addr-557','1','1000','订单地址id'), +('mall4cloud-order-addr-558','1','1000','订单地址id'), +('mall4cloud-order-addr-559','1','1000','订单地址id'), +('mall4cloud-order-addr-560','1','1000','订单地址id'), +('mall4cloud-order-addr-561','1','1000','订单地址id'), +('mall4cloud-order-addr-562','1','1000','订单地址id'), +('mall4cloud-order-addr-563','1','1000','订单地址id'), +('mall4cloud-order-addr-564','1','1000','订单地址id'), +('mall4cloud-order-addr-565','1','1000','订单地址id'), +('mall4cloud-order-addr-566','1','1000','订单地址id'), +('mall4cloud-order-addr-567','1','1000','订单地址id'), +('mall4cloud-order-addr-568','1','1000','订单地址id'), +('mall4cloud-order-addr-569','1','1000','订单地址id'), +('mall4cloud-order-addr-570','1','1000','订单地址id'), +('mall4cloud-order-addr-571','1','1000','订单地址id'), +('mall4cloud-order-addr-572','1','1000','订单地址id'), +('mall4cloud-order-addr-573','1','1000','订单地址id'), +('mall4cloud-order-addr-574','1','1000','订单地址id'), +('mall4cloud-order-addr-575','1','1000','订单地址id'), +('mall4cloud-order-addr-576','1','1000','订单地址id'), +('mall4cloud-order-addr-577','1','1000','订单地址id'), +('mall4cloud-order-addr-578','1','1000','订单地址id'), +('mall4cloud-order-addr-579','1','1000','订单地址id'), +('mall4cloud-order-addr-580','1','1000','订单地址id'), +('mall4cloud-order-addr-581','1','1000','订单地址id'), +('mall4cloud-order-addr-582','1','1000','订单地址id'), +('mall4cloud-order-addr-583','1','1000','订单地址id'), +('mall4cloud-order-addr-584','1','1000','订单地址id'), +('mall4cloud-order-addr-585','1','1000','订单地址id'), +('mall4cloud-order-addr-586','1','1000','订单地址id'), +('mall4cloud-order-addr-587','1','1000','订单地址id'), +('mall4cloud-order-addr-588','1','1000','订单地址id'), +('mall4cloud-order-addr-589','1','1000','订单地址id'), +('mall4cloud-order-addr-590','1','1000','订单地址id'), +('mall4cloud-order-addr-591','1','1000','订单地址id'), +('mall4cloud-order-addr-592','1','1000','订单地址id'), +('mall4cloud-order-addr-593','1','1000','订单地址id'), +('mall4cloud-order-addr-594','1','1000','订单地址id'), +('mall4cloud-order-addr-595','1','1000','订单地址id'), +('mall4cloud-order-addr-596','1','1000','订单地址id'), +('mall4cloud-order-addr-597','1','1000','订单地址id'), +('mall4cloud-order-addr-598','1','1000','订单地址id'), +('mall4cloud-order-addr-599','1','1000','订单地址id'), +('mall4cloud-order-addr-600','1','1000','订单地址id'), +('mall4cloud-order-addr-601','1','1000','订单地址id'), +('mall4cloud-order-addr-602','1','1000','订单地址id'), +('mall4cloud-order-addr-603','1','1000','订单地址id'), +('mall4cloud-order-addr-604','1','1000','订单地址id'), +('mall4cloud-order-addr-605','1','1000','订单地址id'), +('mall4cloud-order-addr-606','1','1000','订单地址id'), +('mall4cloud-order-addr-607','1','1000','订单地址id'), +('mall4cloud-order-addr-608','1','1000','订单地址id'), +('mall4cloud-order-addr-609','1','1000','订单地址id'), +('mall4cloud-order-addr-610','1','1000','订单地址id'), +('mall4cloud-order-addr-611','1','1000','订单地址id'), +('mall4cloud-order-addr-612','1','1000','订单地址id'), +('mall4cloud-order-addr-613','1','1000','订单地址id'), +('mall4cloud-order-addr-614','1','1000','订单地址id'), +('mall4cloud-order-addr-615','1','1000','订单地址id'), +('mall4cloud-order-addr-616','1','1000','订单地址id'), +('mall4cloud-order-addr-617','1','1000','订单地址id'), +('mall4cloud-order-addr-618','1','1000','订单地址id'), +('mall4cloud-order-addr-619','1','1000','订单地址id'), +('mall4cloud-order-addr-620','1','1000','订单地址id'), +('mall4cloud-order-addr-621','1','1000','订单地址id'), +('mall4cloud-order-addr-622','1','1000','订单地址id'), +('mall4cloud-order-addr-623','1','1000','订单地址id'), +('mall4cloud-order-addr-624','1','1000','订单地址id'), +('mall4cloud-order-addr-625','1','1000','订单地址id'), +('mall4cloud-order-addr-626','1','1000','订单地址id'), +('mall4cloud-order-addr-627','1','1000','订单地址id'), +('mall4cloud-order-addr-628','1','1000','订单地址id'), +('mall4cloud-order-addr-629','1','1000','订单地址id'), +('mall4cloud-order-addr-630','1','1000','订单地址id'), +('mall4cloud-order-addr-631','1','1000','订单地址id'), +('mall4cloud-order-addr-632','1','1000','订单地址id'), +('mall4cloud-order-addr-633','1','1000','订单地址id'), +('mall4cloud-order-addr-634','1','1000','订单地址id'), +('mall4cloud-order-addr-635','1','1000','订单地址id'), +('mall4cloud-order-addr-636','1','1000','订单地址id'), +('mall4cloud-order-addr-637','1','1000','订单地址id'), +('mall4cloud-order-addr-638','1','1000','订单地址id'), +('mall4cloud-order-addr-639','1','1000','订单地址id'), +('mall4cloud-order-addr-640','1','1000','订单地址id'), +('mall4cloud-order-addr-641','1','1000','订单地址id'), +('mall4cloud-order-addr-642','1','1000','订单地址id'), +('mall4cloud-order-addr-643','1','1000','订单地址id'), +('mall4cloud-order-addr-644','1','1000','订单地址id'), +('mall4cloud-order-addr-645','1','1000','订单地址id'), +('mall4cloud-order-addr-646','1','1000','订单地址id'), +('mall4cloud-order-addr-647','1','1000','订单地址id'), +('mall4cloud-order-addr-648','1','1000','订单地址id'), +('mall4cloud-order-addr-649','1','1000','订单地址id'), +('mall4cloud-order-addr-650','1','1000','订单地址id'), +('mall4cloud-order-addr-651','1','1000','订单地址id'), +('mall4cloud-order-addr-652','1','1000','订单地址id'), +('mall4cloud-order-addr-653','1','1000','订单地址id'), +('mall4cloud-order-addr-654','1','1000','订单地址id'), +('mall4cloud-order-addr-655','1','1000','订单地址id'), +('mall4cloud-order-addr-656','1','1000','订单地址id'), +('mall4cloud-order-addr-657','1','1000','订单地址id'), +('mall4cloud-order-addr-658','1','1000','订单地址id'), +('mall4cloud-order-addr-659','1','1000','订单地址id'), +('mall4cloud-order-addr-660','1','1000','订单地址id'), +('mall4cloud-order-addr-661','1','1000','订单地址id'), +('mall4cloud-order-addr-662','1','1000','订单地址id'), +('mall4cloud-order-addr-663','1','1000','订单地址id'), +('mall4cloud-order-addr-664','1','1000','订单地址id'), +('mall4cloud-order-addr-665','1','1000','订单地址id'), +('mall4cloud-order-addr-666','1','1000','订单地址id'), +('mall4cloud-order-addr-667','1','1000','订单地址id'), +('mall4cloud-order-addr-668','1','1000','订单地址id'), +('mall4cloud-order-addr-669','1','1000','订单地址id'), +('mall4cloud-order-addr-670','1','1000','订单地址id'), +('mall4cloud-order-addr-671','1','1000','订单地址id'), +('mall4cloud-order-addr-672','1','1000','订单地址id'), +('mall4cloud-order-addr-673','1','1000','订单地址id'), +('mall4cloud-order-addr-674','1','1000','订单地址id'), +('mall4cloud-order-addr-675','1','1000','订单地址id'), +('mall4cloud-order-addr-676','1','1000','订单地址id'), +('mall4cloud-order-addr-677','1','1000','订单地址id'), +('mall4cloud-order-addr-678','1','1000','订单地址id'), +('mall4cloud-order-addr-679','1','1000','订单地址id'), +('mall4cloud-order-addr-680','1','1000','订单地址id'), +('mall4cloud-order-addr-681','1','1000','订单地址id'), +('mall4cloud-order-addr-682','1','1000','订单地址id'), +('mall4cloud-order-addr-683','1','1000','订单地址id'), +('mall4cloud-order-addr-684','1','1000','订单地址id'), +('mall4cloud-order-addr-685','1','1000','订单地址id'), +('mall4cloud-order-addr-686','1','1000','订单地址id'), +('mall4cloud-order-addr-687','1','1000','订单地址id'), +('mall4cloud-order-addr-688','1','1000','订单地址id'), +('mall4cloud-order-addr-689','1','1000','订单地址id'), +('mall4cloud-order-addr-690','1','1000','订单地址id'), +('mall4cloud-order-addr-691','1','1000','订单地址id'), +('mall4cloud-order-addr-692','1','1000','订单地址id'), +('mall4cloud-order-addr-693','1','1000','订单地址id'), +('mall4cloud-order-addr-694','1','1000','订单地址id'), +('mall4cloud-order-addr-695','1','1000','订单地址id'), +('mall4cloud-order-addr-696','1','1000','订单地址id'), +('mall4cloud-order-addr-697','1','1000','订单地址id'), +('mall4cloud-order-addr-698','1','1000','订单地址id'), +('mall4cloud-order-addr-699','1','1000','订单地址id'), +('mall4cloud-order-addr-700','1','1000','订单地址id'), +('mall4cloud-order-addr-701','1','1000','订单地址id'), +('mall4cloud-order-addr-702','1','1000','订单地址id'), +('mall4cloud-order-addr-703','1','1000','订单地址id'), +('mall4cloud-order-addr-704','1','1000','订单地址id'), +('mall4cloud-order-addr-705','1','1000','订单地址id'), +('mall4cloud-order-addr-706','1','1000','订单地址id'), +('mall4cloud-order-addr-707','1','1000','订单地址id'), +('mall4cloud-order-addr-708','1','1000','订单地址id'), +('mall4cloud-order-addr-709','1','1000','订单地址id'), +('mall4cloud-order-addr-710','1','1000','订单地址id'), +('mall4cloud-order-addr-711','1','1000','订单地址id'), +('mall4cloud-order-addr-712','1','1000','订单地址id'), +('mall4cloud-order-addr-713','1','1000','订单地址id'), +('mall4cloud-order-addr-714','1','1000','订单地址id'), +('mall4cloud-order-addr-715','1','1000','订单地址id'), +('mall4cloud-order-addr-716','1','1000','订单地址id'), +('mall4cloud-order-addr-717','1','1000','订单地址id'), +('mall4cloud-order-addr-718','1','1000','订单地址id'), +('mall4cloud-order-addr-719','1','1000','订单地址id'), +('mall4cloud-order-addr-720','1','1000','订单地址id'), +('mall4cloud-order-addr-721','1','1000','订单地址id'), +('mall4cloud-order-addr-722','1','1000','订单地址id'), +('mall4cloud-order-addr-723','1','1000','订单地址id'), +('mall4cloud-order-addr-724','1','1000','订单地址id'), +('mall4cloud-order-addr-725','1','1000','订单地址id'), +('mall4cloud-order-addr-726','1','1000','订单地址id'), +('mall4cloud-order-addr-727','1','1000','订单地址id'), +('mall4cloud-order-addr-728','1','1000','订单地址id'), +('mall4cloud-order-addr-729','1','1000','订单地址id'), +('mall4cloud-order-addr-730','1','1000','订单地址id'), +('mall4cloud-order-addr-731','1','1000','订单地址id'), +('mall4cloud-order-addr-732','1','1000','订单地址id'), +('mall4cloud-order-addr-733','1','1000','订单地址id'), +('mall4cloud-order-addr-734','1','1000','订单地址id'), +('mall4cloud-order-addr-735','1','1000','订单地址id'), +('mall4cloud-order-addr-736','1','1000','订单地址id'), +('mall4cloud-order-addr-737','1','1000','订单地址id'), +('mall4cloud-order-addr-738','1','1000','订单地址id'), +('mall4cloud-order-addr-739','1','1000','订单地址id'), +('mall4cloud-order-addr-740','1','1000','订单地址id'), +('mall4cloud-order-addr-741','1','1000','订单地址id'), +('mall4cloud-order-addr-742','1','1000','订单地址id'), +('mall4cloud-order-addr-743','1','1000','订单地址id'), +('mall4cloud-order-addr-744','1','1000','订单地址id'), +('mall4cloud-order-addr-745','1','1000','订单地址id'), +('mall4cloud-order-addr-746','1','1000','订单地址id'), +('mall4cloud-order-addr-747','1','1000','订单地址id'), +('mall4cloud-order-addr-748','1','1000','订单地址id'), +('mall4cloud-order-addr-749','1','1000','订单地址id'), +('mall4cloud-order-addr-750','1','1000','订单地址id'), +('mall4cloud-order-addr-751','1','1000','订单地址id'), +('mall4cloud-order-addr-752','1','1000','订单地址id'), +('mall4cloud-order-addr-753','1','1000','订单地址id'), +('mall4cloud-order-addr-754','1','1000','订单地址id'), +('mall4cloud-order-addr-755','1','1000','订单地址id'), +('mall4cloud-order-addr-756','1','1000','订单地址id'), +('mall4cloud-order-addr-757','1','1000','订单地址id'), +('mall4cloud-order-addr-758','1','1000','订单地址id'), +('mall4cloud-order-addr-759','1','1000','订单地址id'), +('mall4cloud-order-addr-760','1','1000','订单地址id'), +('mall4cloud-order-addr-761','1','1000','订单地址id'), +('mall4cloud-order-addr-762','1','1000','订单地址id'), +('mall4cloud-order-addr-763','1','1000','订单地址id'), +('mall4cloud-order-addr-764','1','1000','订单地址id'), +('mall4cloud-order-addr-765','1','1000','订单地址id'), +('mall4cloud-order-addr-766','1','1000','订单地址id'), +('mall4cloud-order-addr-767','1','1000','订单地址id'), +('mall4cloud-order-addr-768','1','1000','订单地址id'), +('mall4cloud-order-addr-769','1','1000','订单地址id'), +('mall4cloud-order-addr-770','1','1000','订单地址id'), +('mall4cloud-order-addr-771','1','1000','订单地址id'), +('mall4cloud-order-addr-772','1','1000','订单地址id'), +('mall4cloud-order-addr-773','1','1000','订单地址id'), +('mall4cloud-order-addr-774','1','1000','订单地址id'), +('mall4cloud-order-addr-775','1','1000','订单地址id'), +('mall4cloud-order-addr-776','1','1000','订单地址id'), +('mall4cloud-order-addr-777','1','1000','订单地址id'), +('mall4cloud-order-addr-778','1','1000','订单地址id'), +('mall4cloud-order-addr-779','1','1000','订单地址id'), +('mall4cloud-order-addr-780','1','1000','订单地址id'), +('mall4cloud-order-addr-781','1','1000','订单地址id'), +('mall4cloud-order-addr-782','1','1000','订单地址id'), +('mall4cloud-order-addr-783','1','1000','订单地址id'), +('mall4cloud-order-addr-784','1','1000','订单地址id'), +('mall4cloud-order-addr-785','1','1000','订单地址id'), +('mall4cloud-order-addr-786','1','1000','订单地址id'), +('mall4cloud-order-addr-787','1','1000','订单地址id'), +('mall4cloud-order-addr-788','1','1000','订单地址id'), +('mall4cloud-order-addr-789','1','1000','订单地址id'), +('mall4cloud-order-addr-790','1','1000','订单地址id'), +('mall4cloud-order-addr-791','1','1000','订单地址id'), +('mall4cloud-order-addr-792','1','1000','订单地址id'), +('mall4cloud-order-addr-793','1','1000','订单地址id'), +('mall4cloud-order-addr-794','1','1000','订单地址id'), +('mall4cloud-order-addr-795','1','1000','订单地址id'), +('mall4cloud-order-addr-796','1','1000','订单地址id'), +('mall4cloud-order-addr-797','1','1000','订单地址id'), +('mall4cloud-order-addr-798','1','1000','订单地址id'), +('mall4cloud-order-addr-799','1','1000','订单地址id'), +('mall4cloud-order-addr-800','1','1000','订单地址id'), +('mall4cloud-order-addr-801','1','1000','订单地址id'), +('mall4cloud-order-addr-802','1','1000','订单地址id'), +('mall4cloud-order-addr-803','1','1000','订单地址id'), +('mall4cloud-order-addr-804','1','1000','订单地址id'), +('mall4cloud-order-addr-805','1','1000','订单地址id'), +('mall4cloud-order-addr-806','1','1000','订单地址id'), +('mall4cloud-order-addr-807','1','1000','订单地址id'), +('mall4cloud-order-addr-808','1','1000','订单地址id'), +('mall4cloud-order-addr-809','1','1000','订单地址id'), +('mall4cloud-order-addr-810','1','1000','订单地址id'), +('mall4cloud-order-addr-811','1','1000','订单地址id'), +('mall4cloud-order-addr-812','1','1000','订单地址id'), +('mall4cloud-order-addr-813','1','1000','订单地址id'), +('mall4cloud-order-addr-814','1','1000','订单地址id'), +('mall4cloud-order-addr-815','1','1000','订单地址id'), +('mall4cloud-order-addr-816','1','1000','订单地址id'), +('mall4cloud-order-addr-817','1','1000','订单地址id'), +('mall4cloud-order-addr-818','1','1000','订单地址id'), +('mall4cloud-order-addr-819','1','1000','订单地址id'), +('mall4cloud-order-addr-820','1','1000','订单地址id'), +('mall4cloud-order-addr-821','1','1000','订单地址id'), +('mall4cloud-order-addr-822','1','1000','订单地址id'), +('mall4cloud-order-addr-823','1','1000','订单地址id'), +('mall4cloud-order-addr-824','1','1000','订单地址id'), +('mall4cloud-order-addr-825','1','1000','订单地址id'), +('mall4cloud-order-addr-826','1','1000','订单地址id'), +('mall4cloud-order-addr-827','1','1000','订单地址id'), +('mall4cloud-order-addr-828','1','1000','订单地址id'), +('mall4cloud-order-addr-829','1','1000','订单地址id'), +('mall4cloud-order-addr-830','1','1000','订单地址id'), +('mall4cloud-order-addr-831','1','1000','订单地址id'), +('mall4cloud-order-addr-832','1','1000','订单地址id'), +('mall4cloud-order-addr-833','1','1000','订单地址id'), +('mall4cloud-order-addr-834','1','1000','订单地址id'), +('mall4cloud-order-addr-835','1','1000','订单地址id'), +('mall4cloud-order-addr-836','1','1000','订单地址id'), +('mall4cloud-order-addr-837','1','1000','订单地址id'), +('mall4cloud-order-addr-838','1','1000','订单地址id'), +('mall4cloud-order-addr-839','1','1000','订单地址id'), +('mall4cloud-order-addr-840','1','1000','订单地址id'), +('mall4cloud-order-addr-841','1','1000','订单地址id'), +('mall4cloud-order-addr-842','1','1000','订单地址id'), +('mall4cloud-order-addr-843','1','1000','订单地址id'), +('mall4cloud-order-addr-844','1','1000','订单地址id'), +('mall4cloud-order-addr-845','1','1000','订单地址id'), +('mall4cloud-order-addr-846','1','1000','订单地址id'), +('mall4cloud-order-addr-847','1','1000','订单地址id'), +('mall4cloud-order-addr-848','1','1000','订单地址id'), +('mall4cloud-order-addr-849','1','1000','订单地址id'), +('mall4cloud-order-addr-850','1','1000','订单地址id'), +('mall4cloud-order-addr-851','1','1000','订单地址id'), +('mall4cloud-order-addr-852','1','1000','订单地址id'), +('mall4cloud-order-addr-853','1','1000','订单地址id'), +('mall4cloud-order-addr-854','1','1000','订单地址id'), +('mall4cloud-order-addr-855','1','1000','订单地址id'), +('mall4cloud-order-addr-856','1','1000','订单地址id'), +('mall4cloud-order-addr-857','1','1000','订单地址id'), +('mall4cloud-order-addr-858','1','1000','订单地址id'), +('mall4cloud-order-addr-859','1','1000','订单地址id'), +('mall4cloud-order-addr-860','1','1000','订单地址id'), +('mall4cloud-order-addr-861','1','1000','订单地址id'), +('mall4cloud-order-addr-862','1','1000','订单地址id'), +('mall4cloud-order-addr-863','1','1000','订单地址id'), +('mall4cloud-order-addr-864','1','1000','订单地址id'), +('mall4cloud-order-addr-865','1','1000','订单地址id'), +('mall4cloud-order-addr-866','1','1000','订单地址id'), +('mall4cloud-order-addr-867','1','1000','订单地址id'), +('mall4cloud-order-addr-868','1','1000','订单地址id'), +('mall4cloud-order-addr-869','1','1000','订单地址id'), +('mall4cloud-order-addr-870','1','1000','订单地址id'), +('mall4cloud-order-addr-871','1','1000','订单地址id'), +('mall4cloud-order-addr-872','1','1000','订单地址id'), +('mall4cloud-order-addr-873','1','1000','订单地址id'), +('mall4cloud-order-addr-874','1','1000','订单地址id'), +('mall4cloud-order-addr-875','1','1000','订单地址id'), +('mall4cloud-order-addr-876','1','1000','订单地址id'), +('mall4cloud-order-addr-877','1','1000','订单地址id'), +('mall4cloud-order-addr-878','1','1000','订单地址id'), +('mall4cloud-order-addr-879','1','1000','订单地址id'), +('mall4cloud-order-addr-880','1','1000','订单地址id'), +('mall4cloud-order-addr-881','1','1000','订单地址id'), +('mall4cloud-order-addr-882','1','1000','订单地址id'), +('mall4cloud-order-addr-883','1','1000','订单地址id'), +('mall4cloud-order-addr-884','1','1000','订单地址id'), +('mall4cloud-order-addr-885','1','1000','订单地址id'), +('mall4cloud-order-addr-886','1','1000','订单地址id'), +('mall4cloud-order-addr-887','1','1000','订单地址id'), +('mall4cloud-order-addr-888','1','1000','订单地址id'), +('mall4cloud-order-addr-889','1','1000','订单地址id'), +('mall4cloud-order-addr-890','1','1000','订单地址id'), +('mall4cloud-order-addr-891','1','1000','订单地址id'), +('mall4cloud-order-addr-892','1','1000','订单地址id'), +('mall4cloud-order-addr-893','1','1000','订单地址id'), +('mall4cloud-order-addr-894','1','1000','订单地址id'), +('mall4cloud-order-addr-895','1','1000','订单地址id'), +('mall4cloud-order-addr-896','1','1000','订单地址id'), +('mall4cloud-order-addr-897','1','1000','订单地址id'), +('mall4cloud-order-addr-898','1','1000','订单地址id'), +('mall4cloud-order-addr-899','1','1000','订单地址id'), +('mall4cloud-order-addr-900','1','1000','订单地址id'), +('mall4cloud-order-addr-901','1','1000','订单地址id'), +('mall4cloud-order-addr-902','1','1000','订单地址id'), +('mall4cloud-order-addr-903','1','1000','订单地址id'), +('mall4cloud-order-addr-904','1','1000','订单地址id'), +('mall4cloud-order-addr-905','1','1000','订单地址id'), +('mall4cloud-order-addr-906','1','1000','订单地址id'), +('mall4cloud-order-addr-907','1','1000','订单地址id'), +('mall4cloud-order-addr-908','1','1000','订单地址id'), +('mall4cloud-order-addr-909','1','1000','订单地址id'), +('mall4cloud-order-addr-910','1','1000','订单地址id'), +('mall4cloud-order-addr-911','1','1000','订单地址id'), +('mall4cloud-order-addr-912','1','1000','订单地址id'), +('mall4cloud-order-addr-913','1','1000','订单地址id'), +('mall4cloud-order-addr-914','1','1000','订单地址id'), +('mall4cloud-order-addr-915','1','1000','订单地址id'), +('mall4cloud-order-addr-916','1','1000','订单地址id'), +('mall4cloud-order-addr-917','1','1000','订单地址id'), +('mall4cloud-order-addr-918','1','1000','订单地址id'), +('mall4cloud-order-addr-919','1','1000','订单地址id'), +('mall4cloud-order-addr-920','1','1000','订单地址id'), +('mall4cloud-order-addr-921','1','1000','订单地址id'), +('mall4cloud-order-addr-922','1','1000','订单地址id'), +('mall4cloud-order-addr-923','1','1000','订单地址id'), +('mall4cloud-order-addr-924','1','1000','订单地址id'), +('mall4cloud-order-addr-925','1','1000','订单地址id'), +('mall4cloud-order-addr-926','1','1000','订单地址id'), +('mall4cloud-order-addr-927','1','1000','订单地址id'), +('mall4cloud-order-addr-928','1','1000','订单地址id'), +('mall4cloud-order-addr-929','1','1000','订单地址id'), +('mall4cloud-order-addr-930','1','1000','订单地址id'), +('mall4cloud-order-addr-931','1','1000','订单地址id'), +('mall4cloud-order-addr-932','1','1000','订单地址id'), +('mall4cloud-order-addr-933','1','1000','订单地址id'), +('mall4cloud-order-addr-934','1','1000','订单地址id'), +('mall4cloud-order-addr-935','1','1000','订单地址id'), +('mall4cloud-order-addr-936','1','1000','订单地址id'), +('mall4cloud-order-addr-937','1','1000','订单地址id'), +('mall4cloud-order-addr-938','1','1000','订单地址id'), +('mall4cloud-order-addr-939','1','1000','订单地址id'), +('mall4cloud-order-addr-940','1','1000','订单地址id'), +('mall4cloud-order-addr-941','1','1000','订单地址id'), +('mall4cloud-order-addr-942','1','1000','订单地址id'), +('mall4cloud-order-addr-943','1','1000','订单地址id'), +('mall4cloud-order-addr-944','1','1000','订单地址id'), +('mall4cloud-order-addr-945','1','1000','订单地址id'), +('mall4cloud-order-addr-946','1','1000','订单地址id'), +('mall4cloud-order-addr-947','1','1000','订单地址id'), +('mall4cloud-order-addr-948','1','1000','订单地址id'), +('mall4cloud-order-addr-949','1','1000','订单地址id'), +('mall4cloud-order-addr-950','1','1000','订单地址id'), +('mall4cloud-order-addr-951','1','1000','订单地址id'), +('mall4cloud-order-addr-952','1','1000','订单地址id'), +('mall4cloud-order-addr-953','1','1000','订单地址id'), +('mall4cloud-order-addr-954','1','1000','订单地址id'), +('mall4cloud-order-addr-955','1','1000','订单地址id'), +('mall4cloud-order-addr-956','1','1000','订单地址id'), +('mall4cloud-order-addr-957','1','1000','订单地址id'), +('mall4cloud-order-addr-958','1','1000','订单地址id'), +('mall4cloud-order-addr-959','1','1000','订单地址id'), +('mall4cloud-order-addr-960','1','1000','订单地址id'), +('mall4cloud-order-addr-961','1','1000','订单地址id'), +('mall4cloud-order-addr-962','1','1000','订单地址id'), +('mall4cloud-order-addr-963','1','1000','订单地址id'), +('mall4cloud-order-addr-964','1','1000','订单地址id'), +('mall4cloud-order-addr-965','1','1000','订单地址id'), +('mall4cloud-order-addr-966','1','1000','订单地址id'), +('mall4cloud-order-addr-967','1','1000','订单地址id'), +('mall4cloud-order-addr-968','1','1000','订单地址id'), +('mall4cloud-order-addr-969','1','1000','订单地址id'), +('mall4cloud-order-addr-970','1','1000','订单地址id'), +('mall4cloud-order-addr-971','1','1000','订单地址id'), +('mall4cloud-order-addr-972','1','1000','订单地址id'), +('mall4cloud-order-addr-973','1','1000','订单地址id'), +('mall4cloud-order-addr-974','1','1000','订单地址id'), +('mall4cloud-order-addr-975','1','1000','订单地址id'), +('mall4cloud-order-addr-976','1','1000','订单地址id'), +('mall4cloud-order-addr-977','1','1000','订单地址id'), +('mall4cloud-order-addr-978','1','1000','订单地址id'), +('mall4cloud-order-addr-979','1','1000','订单地址id'), +('mall4cloud-order-addr-980','1','1000','订单地址id'), +('mall4cloud-order-addr-981','1','1000','订单地址id'), +('mall4cloud-order-addr-982','1','1000','订单地址id'), +('mall4cloud-order-addr-983','1','1000','订单地址id'), +('mall4cloud-order-addr-984','1','1000','订单地址id'), +('mall4cloud-order-addr-985','1','1000','订单地址id'), +('mall4cloud-order-addr-986','1','1000','订单地址id'), +('mall4cloud-order-addr-987','1','1000','订单地址id'), +('mall4cloud-order-addr-988','1','1000','订单地址id'), +('mall4cloud-order-addr-989','1','1000','订单地址id'), +('mall4cloud-order-addr-990','1','1000','订单地址id'), +('mall4cloud-order-addr-991','1','1000','订单地址id'), +('mall4cloud-order-addr-992','1','1000','订单地址id'), +('mall4cloud-order-addr-993','1','1000','订单地址id'), +('mall4cloud-order-addr-994','1','1000','订单地址id'), +('mall4cloud-order-addr-995','1','1000','订单地址id'), +('mall4cloud-order-addr-996','1','1000','订单地址id'), +('mall4cloud-order-addr-997','1','1000','订单地址id'), +('mall4cloud-order-addr-998','1','1000','订单地址id'), +('mall4cloud-order-addr-999','1','1000','订单地址id'), +('mall4cloud-order-item-000','1','1000','订单项id'), +('mall4cloud-order-item-001','1','1000','订单项id'), +('mall4cloud-order-item-002','1','1000','订单项id'), +('mall4cloud-order-item-003','1','1000','订单项id'), +('mall4cloud-order-item-004','1','1000','订单项id'), +('mall4cloud-order-item-005','1','1000','订单项id'), +('mall4cloud-order-item-006','1','1000','订单项id'), +('mall4cloud-order-item-007','1','1000','订单项id'), +('mall4cloud-order-item-008','1','1000','订单项id'), +('mall4cloud-order-item-009','1','1000','订单项id'), +('mall4cloud-order-item-010','1','1000','订单项id'), +('mall4cloud-order-item-011','1','1000','订单项id'), +('mall4cloud-order-item-012','1','1000','订单项id'), +('mall4cloud-order-item-013','1','1000','订单项id'), +('mall4cloud-order-item-014','1','1000','订单项id'), +('mall4cloud-order-item-015','1','1000','订单项id'), +('mall4cloud-order-item-016','1','1000','订单项id'), +('mall4cloud-order-item-017','1','1000','订单项id'), +('mall4cloud-order-item-018','1','1000','订单项id'), +('mall4cloud-order-item-019','1','1000','订单项id'), +('mall4cloud-order-item-020','1','1000','订单项id'), +('mall4cloud-order-item-021','1','1000','订单项id'), +('mall4cloud-order-item-022','1','1000','订单项id'), +('mall4cloud-order-item-023','1','1000','订单项id'), +('mall4cloud-order-item-024','1','1000','订单项id'), +('mall4cloud-order-item-025','1','1000','订单项id'), +('mall4cloud-order-item-026','1','1000','订单项id'), +('mall4cloud-order-item-027','1','1000','订单项id'), +('mall4cloud-order-item-028','1','1000','订单项id'), +('mall4cloud-order-item-029','1','1000','订单项id'), +('mall4cloud-order-item-030','1','1000','订单项id'), +('mall4cloud-order-item-031','1','1000','订单项id'), +('mall4cloud-order-item-032','1','1000','订单项id'), +('mall4cloud-order-item-033','1','1000','订单项id'), +('mall4cloud-order-item-034','1','1000','订单项id'), +('mall4cloud-order-item-035','1','1000','订单项id'), +('mall4cloud-order-item-036','1','1000','订单项id'), +('mall4cloud-order-item-037','1','1000','订单项id'), +('mall4cloud-order-item-038','1','1000','订单项id'), +('mall4cloud-order-item-039','1','1000','订单项id'), +('mall4cloud-order-item-040','1','1000','订单项id'), +('mall4cloud-order-item-041','1','1000','订单项id'), +('mall4cloud-order-item-042','1','1000','订单项id'), +('mall4cloud-order-item-043','1','1000','订单项id'), +('mall4cloud-order-item-044','1','1000','订单项id'), +('mall4cloud-order-item-045','1','1000','订单项id'), +('mall4cloud-order-item-046','1','1000','订单项id'), +('mall4cloud-order-item-047','1','1000','订单项id'), +('mall4cloud-order-item-048','1','1000','订单项id'), +('mall4cloud-order-item-049','1','1000','订单项id'), +('mall4cloud-order-item-050','1','1000','订单项id'), +('mall4cloud-order-item-051','1','1000','订单项id'), +('mall4cloud-order-item-052','1','1000','订单项id'), +('mall4cloud-order-item-053','1','1000','订单项id'), +('mall4cloud-order-item-054','1','1000','订单项id'), +('mall4cloud-order-item-055','1','1000','订单项id'), +('mall4cloud-order-item-056','1','1000','订单项id'), +('mall4cloud-order-item-057','1','1000','订单项id'), +('mall4cloud-order-item-058','1','1000','订单项id'), +('mall4cloud-order-item-059','1','1000','订单项id'), +('mall4cloud-order-item-060','1','1000','订单项id'), +('mall4cloud-order-item-061','1','1000','订单项id'), +('mall4cloud-order-item-062','1','1000','订单项id'), +('mall4cloud-order-item-063','1','1000','订单项id'), +('mall4cloud-order-item-064','1','1000','订单项id'), +('mall4cloud-order-item-065','1','1000','订单项id'), +('mall4cloud-order-item-066','1','1000','订单项id'), +('mall4cloud-order-item-067','1','1000','订单项id'), +('mall4cloud-order-item-068','1','1000','订单项id'), +('mall4cloud-order-item-069','1','1000','订单项id'), +('mall4cloud-order-item-070','1','1000','订单项id'), +('mall4cloud-order-item-071','1','1000','订单项id'), +('mall4cloud-order-item-072','1','1000','订单项id'), +('mall4cloud-order-item-073','1','1000','订单项id'), +('mall4cloud-order-item-074','1','1000','订单项id'), +('mall4cloud-order-item-075','1','1000','订单项id'), +('mall4cloud-order-item-076','1','1000','订单项id'), +('mall4cloud-order-item-077','1','1000','订单项id'), +('mall4cloud-order-item-078','1','1000','订单项id'), +('mall4cloud-order-item-079','1','1000','订单项id'), +('mall4cloud-order-item-080','1','1000','订单项id'), +('mall4cloud-order-item-081','1','1000','订单项id'), +('mall4cloud-order-item-082','1','1000','订单项id'), +('mall4cloud-order-item-083','1','1000','订单项id'), +('mall4cloud-order-item-084','1','1000','订单项id'), +('mall4cloud-order-item-085','1','1000','订单项id'), +('mall4cloud-order-item-086','1','1000','订单项id'), +('mall4cloud-order-item-087','1','1000','订单项id'), +('mall4cloud-order-item-088','1','1000','订单项id'), +('mall4cloud-order-item-089','1','1000','订单项id'), +('mall4cloud-order-item-090','1','1000','订单项id'), +('mall4cloud-order-item-091','1','1000','订单项id'), +('mall4cloud-order-item-092','1','1000','订单项id'), +('mall4cloud-order-item-093','1','1000','订单项id'), +('mall4cloud-order-item-094','1','1000','订单项id'), +('mall4cloud-order-item-095','1','1000','订单项id'), +('mall4cloud-order-item-096','1','1000','订单项id'), +('mall4cloud-order-item-097','1','1000','订单项id'), +('mall4cloud-order-item-098','1','1000','订单项id'), +('mall4cloud-order-item-099','1','1000','订单项id'), +('mall4cloud-order-item-100','1','1000','订单项id'), +('mall4cloud-order-item-101','1','1000','订单项id'), +('mall4cloud-order-item-102','1','1000','订单项id'), +('mall4cloud-order-item-103','1','1000','订单项id'), +('mall4cloud-order-item-104','1','1000','订单项id'), +('mall4cloud-order-item-105','1','1000','订单项id'), +('mall4cloud-order-item-106','1','1000','订单项id'), +('mall4cloud-order-item-107','1','1000','订单项id'), +('mall4cloud-order-item-108','1','1000','订单项id'), +('mall4cloud-order-item-109','1','1000','订单项id'), +('mall4cloud-order-item-110','1','1000','订单项id'), +('mall4cloud-order-item-111','1','1000','订单项id'), +('mall4cloud-order-item-112','1','1000','订单项id'), +('mall4cloud-order-item-113','1','1000','订单项id'), +('mall4cloud-order-item-114','1','1000','订单项id'), +('mall4cloud-order-item-115','1','1000','订单项id'), +('mall4cloud-order-item-116','1','1000','订单项id'), +('mall4cloud-order-item-117','1','1000','订单项id'), +('mall4cloud-order-item-118','1','1000','订单项id'), +('mall4cloud-order-item-119','1','1000','订单项id'), +('mall4cloud-order-item-120','1','1000','订单项id'), +('mall4cloud-order-item-121','1','1000','订单项id'), +('mall4cloud-order-item-122','1','1000','订单项id'), +('mall4cloud-order-item-123','1','1000','订单项id'), +('mall4cloud-order-item-124','1','1000','订单项id'), +('mall4cloud-order-item-125','1','1000','订单项id'), +('mall4cloud-order-item-126','1','1000','订单项id'), +('mall4cloud-order-item-127','1','1000','订单项id'), +('mall4cloud-order-item-128','1','1000','订单项id'), +('mall4cloud-order-item-129','1','1000','订单项id'), +('mall4cloud-order-item-130','1','1000','订单项id'), +('mall4cloud-order-item-131','1','1000','订单项id'), +('mall4cloud-order-item-132','1','1000','订单项id'), +('mall4cloud-order-item-133','1','1000','订单项id'), +('mall4cloud-order-item-134','1','1000','订单项id'), +('mall4cloud-order-item-135','1','1000','订单项id'), +('mall4cloud-order-item-136','1','1000','订单项id'), +('mall4cloud-order-item-137','1','1000','订单项id'), +('mall4cloud-order-item-138','1','1000','订单项id'), +('mall4cloud-order-item-139','1','1000','订单项id'), +('mall4cloud-order-item-140','1','1000','订单项id'), +('mall4cloud-order-item-141','1','1000','订单项id'), +('mall4cloud-order-item-142','1','1000','订单项id'), +('mall4cloud-order-item-143','1','1000','订单项id'), +('mall4cloud-order-item-144','1','1000','订单项id'), +('mall4cloud-order-item-145','1','1000','订单项id'), +('mall4cloud-order-item-146','1','1000','订单项id'), +('mall4cloud-order-item-147','1','1000','订单项id'), +('mall4cloud-order-item-148','1','1000','订单项id'), +('mall4cloud-order-item-149','1','1000','订单项id'), +('mall4cloud-order-item-150','1','1000','订单项id'), +('mall4cloud-order-item-151','1','1000','订单项id'), +('mall4cloud-order-item-152','1','1000','订单项id'), +('mall4cloud-order-item-153','1','1000','订单项id'), +('mall4cloud-order-item-154','1','1000','订单项id'), +('mall4cloud-order-item-155','1','1000','订单项id'), +('mall4cloud-order-item-156','1','1000','订单项id'), +('mall4cloud-order-item-157','1','1000','订单项id'), +('mall4cloud-order-item-158','1','1000','订单项id'), +('mall4cloud-order-item-159','1','1000','订单项id'), +('mall4cloud-order-item-160','1','1000','订单项id'), +('mall4cloud-order-item-161','1','1000','订单项id'), +('mall4cloud-order-item-162','1','1000','订单项id'), +('mall4cloud-order-item-163','1','1000','订单项id'), +('mall4cloud-order-item-164','1','1000','订单项id'), +('mall4cloud-order-item-165','1','1000','订单项id'), +('mall4cloud-order-item-166','1','1000','订单项id'), +('mall4cloud-order-item-167','1','1000','订单项id'), +('mall4cloud-order-item-168','1','1000','订单项id'), +('mall4cloud-order-item-169','1','1000','订单项id'), +('mall4cloud-order-item-170','1','1000','订单项id'), +('mall4cloud-order-item-171','1','1000','订单项id'), +('mall4cloud-order-item-172','1','1000','订单项id'), +('mall4cloud-order-item-173','1','1000','订单项id'), +('mall4cloud-order-item-174','1','1000','订单项id'), +('mall4cloud-order-item-175','1','1000','订单项id'), +('mall4cloud-order-item-176','1','1000','订单项id'), +('mall4cloud-order-item-177','1','1000','订单项id'), +('mall4cloud-order-item-178','1','1000','订单项id'), +('mall4cloud-order-item-179','1','1000','订单项id'), +('mall4cloud-order-item-180','1','1000','订单项id'), +('mall4cloud-order-item-181','1','1000','订单项id'), +('mall4cloud-order-item-182','1','1000','订单项id'), +('mall4cloud-order-item-183','1','1000','订单项id'), +('mall4cloud-order-item-184','1','1000','订单项id'), +('mall4cloud-order-item-185','1','1000','订单项id'), +('mall4cloud-order-item-186','1','1000','订单项id'), +('mall4cloud-order-item-187','1','1000','订单项id'), +('mall4cloud-order-item-188','1','1000','订单项id'), +('mall4cloud-order-item-189','1','1000','订单项id'), +('mall4cloud-order-item-190','1','1000','订单项id'), +('mall4cloud-order-item-191','1','1000','订单项id'), +('mall4cloud-order-item-192','1','1000','订单项id'), +('mall4cloud-order-item-193','1','1000','订单项id'), +('mall4cloud-order-item-194','1','1000','订单项id'), +('mall4cloud-order-item-195','1','1000','订单项id'), +('mall4cloud-order-item-196','1','1000','订单项id'), +('mall4cloud-order-item-197','1','1000','订单项id'), +('mall4cloud-order-item-198','1','1000','订单项id'), +('mall4cloud-order-item-199','1','1000','订单项id'), +('mall4cloud-order-item-200','1','1000','订单项id'), +('mall4cloud-order-item-201','1','1000','订单项id'), +('mall4cloud-order-item-202','1','1000','订单项id'), +('mall4cloud-order-item-203','1','1000','订单项id'), +('mall4cloud-order-item-204','1','1000','订单项id'), +('mall4cloud-order-item-205','1','1000','订单项id'), +('mall4cloud-order-item-206','1','1000','订单项id'), +('mall4cloud-order-item-207','1','1000','订单项id'), +('mall4cloud-order-item-208','1','1000','订单项id'), +('mall4cloud-order-item-209','1','1000','订单项id'), +('mall4cloud-order-item-210','1','1000','订单项id'), +('mall4cloud-order-item-211','1','1000','订单项id'), +('mall4cloud-order-item-212','1','1000','订单项id'), +('mall4cloud-order-item-213','1','1000','订单项id'), +('mall4cloud-order-item-214','1','1000','订单项id'), +('mall4cloud-order-item-215','1','1000','订单项id'), +('mall4cloud-order-item-216','1','1000','订单项id'), +('mall4cloud-order-item-217','1','1000','订单项id'), +('mall4cloud-order-item-218','1','1000','订单项id'), +('mall4cloud-order-item-219','1','1000','订单项id'), +('mall4cloud-order-item-220','1','1000','订单项id'), +('mall4cloud-order-item-221','1','1000','订单项id'), +('mall4cloud-order-item-222','1','1000','订单项id'), +('mall4cloud-order-item-223','1','1000','订单项id'), +('mall4cloud-order-item-224','1','1000','订单项id'), +('mall4cloud-order-item-225','1','1000','订单项id'), +('mall4cloud-order-item-226','1','1000','订单项id'), +('mall4cloud-order-item-227','1','1000','订单项id'), +('mall4cloud-order-item-228','1','1000','订单项id'), +('mall4cloud-order-item-229','1','1000','订单项id'), +('mall4cloud-order-item-230','1','1000','订单项id'), +('mall4cloud-order-item-231','1','1000','订单项id'), +('mall4cloud-order-item-232','1','1000','订单项id'), +('mall4cloud-order-item-233','1','1000','订单项id'), +('mall4cloud-order-item-234','1','1000','订单项id'), +('mall4cloud-order-item-235','1','1000','订单项id'), +('mall4cloud-order-item-236','1','1000','订单项id'), +('mall4cloud-order-item-237','1','1000','订单项id'), +('mall4cloud-order-item-238','1','1000','订单项id'), +('mall4cloud-order-item-239','1','1000','订单项id'), +('mall4cloud-order-item-240','1','1000','订单项id'), +('mall4cloud-order-item-241','1','1000','订单项id'), +('mall4cloud-order-item-242','1','1000','订单项id'), +('mall4cloud-order-item-243','1','1000','订单项id'), +('mall4cloud-order-item-244','1','1000','订单项id'), +('mall4cloud-order-item-245','1','1000','订单项id'), +('mall4cloud-order-item-246','1','1000','订单项id'), +('mall4cloud-order-item-247','1','1000','订单项id'), +('mall4cloud-order-item-248','1','1000','订单项id'), +('mall4cloud-order-item-249','1','1000','订单项id'), +('mall4cloud-order-item-250','1','1000','订单项id'), +('mall4cloud-order-item-251','1','1000','订单项id'), +('mall4cloud-order-item-252','1','1000','订单项id'), +('mall4cloud-order-item-253','1','1000','订单项id'), +('mall4cloud-order-item-254','1','1000','订单项id'), +('mall4cloud-order-item-255','1','1000','订单项id'), +('mall4cloud-order-item-256','1','1000','订单项id'), +('mall4cloud-order-item-257','1','1000','订单项id'), +('mall4cloud-order-item-258','1','1000','订单项id'), +('mall4cloud-order-item-259','1','1000','订单项id'), +('mall4cloud-order-item-260','1','1000','订单项id'), +('mall4cloud-order-item-261','1','1000','订单项id'), +('mall4cloud-order-item-262','1','1000','订单项id'), +('mall4cloud-order-item-263','1','1000','订单项id'), +('mall4cloud-order-item-264','1','1000','订单项id'), +('mall4cloud-order-item-265','1','1000','订单项id'), +('mall4cloud-order-item-266','1','1000','订单项id'), +('mall4cloud-order-item-267','1','1000','订单项id'), +('mall4cloud-order-item-268','1','1000','订单项id'), +('mall4cloud-order-item-269','1','1000','订单项id'), +('mall4cloud-order-item-270','1','1000','订单项id'), +('mall4cloud-order-item-271','1','1000','订单项id'), +('mall4cloud-order-item-272','1','1000','订单项id'), +('mall4cloud-order-item-273','1','1000','订单项id'), +('mall4cloud-order-item-274','1','1000','订单项id'), +('mall4cloud-order-item-275','1','1000','订单项id'), +('mall4cloud-order-item-276','1','1000','订单项id'), +('mall4cloud-order-item-277','1','1000','订单项id'), +('mall4cloud-order-item-278','1','1000','订单项id'), +('mall4cloud-order-item-279','1','1000','订单项id'), +('mall4cloud-order-item-280','1','1000','订单项id'), +('mall4cloud-order-item-281','1','1000','订单项id'), +('mall4cloud-order-item-282','1','1000','订单项id'), +('mall4cloud-order-item-283','1','1000','订单项id'), +('mall4cloud-order-item-284','1','1000','订单项id'), +('mall4cloud-order-item-285','1','1000','订单项id'), +('mall4cloud-order-item-286','1','1000','订单项id'), +('mall4cloud-order-item-287','1','1000','订单项id'), +('mall4cloud-order-item-288','1','1000','订单项id'), +('mall4cloud-order-item-289','1','1000','订单项id'), +('mall4cloud-order-item-290','1','1000','订单项id'), +('mall4cloud-order-item-291','1','1000','订单项id'), +('mall4cloud-order-item-292','1','1000','订单项id'), +('mall4cloud-order-item-293','1','1000','订单项id'), +('mall4cloud-order-item-294','1','1000','订单项id'), +('mall4cloud-order-item-295','1','1000','订单项id'), +('mall4cloud-order-item-296','1','1000','订单项id'), +('mall4cloud-order-item-297','1','1000','订单项id'), +('mall4cloud-order-item-298','1','1000','订单项id'), +('mall4cloud-order-item-299','1','1000','订单项id'), +('mall4cloud-order-item-300','1','1000','订单项id'), +('mall4cloud-order-item-301','1','1000','订单项id'), +('mall4cloud-order-item-302','1','1000','订单项id'), +('mall4cloud-order-item-303','1','1000','订单项id'), +('mall4cloud-order-item-304','1','1000','订单项id'), +('mall4cloud-order-item-305','1','1000','订单项id'), +('mall4cloud-order-item-306','1','1000','订单项id'), +('mall4cloud-order-item-307','1','1000','订单项id'), +('mall4cloud-order-item-308','1','1000','订单项id'), +('mall4cloud-order-item-309','1','1000','订单项id'), +('mall4cloud-order-item-310','1','1000','订单项id'), +('mall4cloud-order-item-311','1','1000','订单项id'), +('mall4cloud-order-item-312','1','1000','订单项id'), +('mall4cloud-order-item-313','1','1000','订单项id'), +('mall4cloud-order-item-314','1','1000','订单项id'), +('mall4cloud-order-item-315','1','1000','订单项id'), +('mall4cloud-order-item-316','1','1000','订单项id'), +('mall4cloud-order-item-317','1','1000','订单项id'), +('mall4cloud-order-item-318','1','1000','订单项id'), +('mall4cloud-order-item-319','1','1000','订单项id'), +('mall4cloud-order-item-320','1','1000','订单项id'), +('mall4cloud-order-item-321','1','1000','订单项id'), +('mall4cloud-order-item-322','1','1000','订单项id'), +('mall4cloud-order-item-323','1','1000','订单项id'), +('mall4cloud-order-item-324','1','1000','订单项id'), +('mall4cloud-order-item-325','1','1000','订单项id'), +('mall4cloud-order-item-326','1','1000','订单项id'), +('mall4cloud-order-item-327','1','1000','订单项id'), +('mall4cloud-order-item-328','1','1000','订单项id'), +('mall4cloud-order-item-329','1','1000','订单项id'), +('mall4cloud-order-item-330','1','1000','订单项id'), +('mall4cloud-order-item-331','1','1000','订单项id'), +('mall4cloud-order-item-332','1','1000','订单项id'), +('mall4cloud-order-item-333','1','1000','订单项id'), +('mall4cloud-order-item-334','1','1000','订单项id'), +('mall4cloud-order-item-335','1','1000','订单项id'), +('mall4cloud-order-item-336','1','1000','订单项id'), +('mall4cloud-order-item-337','1','1000','订单项id'), +('mall4cloud-order-item-338','1','1000','订单项id'), +('mall4cloud-order-item-339','1','1000','订单项id'), +('mall4cloud-order-item-340','1','1000','订单项id'), +('mall4cloud-order-item-341','1','1000','订单项id'), +('mall4cloud-order-item-342','1','1000','订单项id'), +('mall4cloud-order-item-343','1','1000','订单项id'), +('mall4cloud-order-item-344','1','1000','订单项id'), +('mall4cloud-order-item-345','1','1000','订单项id'), +('mall4cloud-order-item-346','1','1000','订单项id'), +('mall4cloud-order-item-347','1','1000','订单项id'), +('mall4cloud-order-item-348','1','1000','订单项id'), +('mall4cloud-order-item-349','1','1000','订单项id'), +('mall4cloud-order-item-350','1','1000','订单项id'), +('mall4cloud-order-item-351','1','1000','订单项id'), +('mall4cloud-order-item-352','1','1000','订单项id'), +('mall4cloud-order-item-353','1','1000','订单项id'), +('mall4cloud-order-item-354','1','1000','订单项id'), +('mall4cloud-order-item-355','1','1000','订单项id'), +('mall4cloud-order-item-356','1','1000','订单项id'), +('mall4cloud-order-item-357','1','1000','订单项id'), +('mall4cloud-order-item-358','1','1000','订单项id'), +('mall4cloud-order-item-359','1','1000','订单项id'), +('mall4cloud-order-item-360','1','1000','订单项id'), +('mall4cloud-order-item-361','1','1000','订单项id'), +('mall4cloud-order-item-362','1','1000','订单项id'), +('mall4cloud-order-item-363','1','1000','订单项id'), +('mall4cloud-order-item-364','1','1000','订单项id'), +('mall4cloud-order-item-365','1','1000','订单项id'), +('mall4cloud-order-item-366','1','1000','订单项id'), +('mall4cloud-order-item-367','1','1000','订单项id'), +('mall4cloud-order-item-368','1','1000','订单项id'), +('mall4cloud-order-item-369','1','1000','订单项id'), +('mall4cloud-order-item-370','1','1000','订单项id'), +('mall4cloud-order-item-371','1','1000','订单项id'), +('mall4cloud-order-item-372','1','1000','订单项id'), +('mall4cloud-order-item-373','1','1000','订单项id'), +('mall4cloud-order-item-374','1','1000','订单项id'), +('mall4cloud-order-item-375','1','1000','订单项id'), +('mall4cloud-order-item-376','1','1000','订单项id'), +('mall4cloud-order-item-377','1','1000','订单项id'), +('mall4cloud-order-item-378','1','1000','订单项id'), +('mall4cloud-order-item-379','1','1000','订单项id'), +('mall4cloud-order-item-380','1','1000','订单项id'), +('mall4cloud-order-item-381','1','1000','订单项id'), +('mall4cloud-order-item-382','1','1000','订单项id'), +('mall4cloud-order-item-383','1','1000','订单项id'), +('mall4cloud-order-item-384','1','1000','订单项id'), +('mall4cloud-order-item-385','1','1000','订单项id'), +('mall4cloud-order-item-386','1','1000','订单项id'), +('mall4cloud-order-item-387','1','1000','订单项id'), +('mall4cloud-order-item-388','1','1000','订单项id'), +('mall4cloud-order-item-389','1','1000','订单项id'), +('mall4cloud-order-item-390','1','1000','订单项id'), +('mall4cloud-order-item-391','1','1000','订单项id'), +('mall4cloud-order-item-392','1','1000','订单项id'), +('mall4cloud-order-item-393','1','1000','订单项id'), +('mall4cloud-order-item-394','1','1000','订单项id'), +('mall4cloud-order-item-395','1','1000','订单项id'), +('mall4cloud-order-item-396','1','1000','订单项id'), +('mall4cloud-order-item-397','1','1000','订单项id'), +('mall4cloud-order-item-398','1','1000','订单项id'), +('mall4cloud-order-item-399','1','1000','订单项id'), +('mall4cloud-order-item-400','1','1000','订单项id'), +('mall4cloud-order-item-401','1','1000','订单项id'), +('mall4cloud-order-item-402','1','1000','订单项id'), +('mall4cloud-order-item-403','1','1000','订单项id'), +('mall4cloud-order-item-404','1','1000','订单项id'), +('mall4cloud-order-item-405','1','1000','订单项id'), +('mall4cloud-order-item-406','1','1000','订单项id'), +('mall4cloud-order-item-407','1','1000','订单项id'), +('mall4cloud-order-item-408','1','1000','订单项id'), +('mall4cloud-order-item-409','1','1000','订单项id'), +('mall4cloud-order-item-410','1','1000','订单项id'), +('mall4cloud-order-item-411','1','1000','订单项id'), +('mall4cloud-order-item-412','1','1000','订单项id'), +('mall4cloud-order-item-413','1','1000','订单项id'), +('mall4cloud-order-item-414','1','1000','订单项id'), +('mall4cloud-order-item-415','1','1000','订单项id'), +('mall4cloud-order-item-416','1','1000','订单项id'), +('mall4cloud-order-item-417','1','1000','订单项id'), +('mall4cloud-order-item-418','1','1000','订单项id'), +('mall4cloud-order-item-419','1','1000','订单项id'), +('mall4cloud-order-item-420','1','1000','订单项id'), +('mall4cloud-order-item-421','1','1000','订单项id'), +('mall4cloud-order-item-422','1','1000','订单项id'), +('mall4cloud-order-item-423','1','1000','订单项id'), +('mall4cloud-order-item-424','1','1000','订单项id'), +('mall4cloud-order-item-425','1','1000','订单项id'), +('mall4cloud-order-item-426','1','1000','订单项id'), +('mall4cloud-order-item-427','1','1000','订单项id'), +('mall4cloud-order-item-428','1','1000','订单项id'), +('mall4cloud-order-item-429','1','1000','订单项id'), +('mall4cloud-order-item-430','1','1000','订单项id'), +('mall4cloud-order-item-431','1','1000','订单项id'), +('mall4cloud-order-item-432','1','1000','订单项id'), +('mall4cloud-order-item-433','1','1000','订单项id'), +('mall4cloud-order-item-434','1','1000','订单项id'), +('mall4cloud-order-item-435','1','1000','订单项id'), +('mall4cloud-order-item-436','1','1000','订单项id'), +('mall4cloud-order-item-437','1','1000','订单项id'), +('mall4cloud-order-item-438','1','1000','订单项id'), +('mall4cloud-order-item-439','1','1000','订单项id'), +('mall4cloud-order-item-440','1','1000','订单项id'), +('mall4cloud-order-item-441','1','1000','订单项id'), +('mall4cloud-order-item-442','1','1000','订单项id'), +('mall4cloud-order-item-443','1','1000','订单项id'), +('mall4cloud-order-item-444','1','1000','订单项id'), +('mall4cloud-order-item-445','1','1000','订单项id'), +('mall4cloud-order-item-446','1','1000','订单项id'), +('mall4cloud-order-item-447','1','1000','订单项id'), +('mall4cloud-order-item-448','1','1000','订单项id'), +('mall4cloud-order-item-449','1','1000','订单项id'), +('mall4cloud-order-item-450','1','1000','订单项id'), +('mall4cloud-order-item-451','1','1000','订单项id'), +('mall4cloud-order-item-452','1','1000','订单项id'), +('mall4cloud-order-item-453','1','1000','订单项id'), +('mall4cloud-order-item-454','1','1000','订单项id'), +('mall4cloud-order-item-455','1','1000','订单项id'), +('mall4cloud-order-item-456','1','1000','订单项id'), +('mall4cloud-order-item-457','1','1000','订单项id'), +('mall4cloud-order-item-458','1','1000','订单项id'), +('mall4cloud-order-item-459','1','1000','订单项id'), +('mall4cloud-order-item-460','1','1000','订单项id'), +('mall4cloud-order-item-461','1','1000','订单项id'), +('mall4cloud-order-item-462','1','1000','订单项id'), +('mall4cloud-order-item-463','1','1000','订单项id'), +('mall4cloud-order-item-464','1','1000','订单项id'), +('mall4cloud-order-item-465','1','1000','订单项id'), +('mall4cloud-order-item-466','1','1000','订单项id'), +('mall4cloud-order-item-467','1','1000','订单项id'), +('mall4cloud-order-item-468','1','1000','订单项id'), +('mall4cloud-order-item-469','1','1000','订单项id'), +('mall4cloud-order-item-470','1','1000','订单项id'), +('mall4cloud-order-item-471','1','1000','订单项id'), +('mall4cloud-order-item-472','1','1000','订单项id'), +('mall4cloud-order-item-473','1','1000','订单项id'), +('mall4cloud-order-item-474','1','1000','订单项id'), +('mall4cloud-order-item-475','1','1000','订单项id'), +('mall4cloud-order-item-476','1','1000','订单项id'), +('mall4cloud-order-item-477','1','1000','订单项id'), +('mall4cloud-order-item-478','1','1000','订单项id'), +('mall4cloud-order-item-479','1','1000','订单项id'), +('mall4cloud-order-item-480','1','1000','订单项id'), +('mall4cloud-order-item-481','1','1000','订单项id'), +('mall4cloud-order-item-482','1','1000','订单项id'), +('mall4cloud-order-item-483','1','1000','订单项id'), +('mall4cloud-order-item-484','1','1000','订单项id'), +('mall4cloud-order-item-485','1','1000','订单项id'), +('mall4cloud-order-item-486','1','1000','订单项id'), +('mall4cloud-order-item-487','1','1000','订单项id'), +('mall4cloud-order-item-488','1','1000','订单项id'), +('mall4cloud-order-item-489','1','1000','订单项id'), +('mall4cloud-order-item-490','1','1000','订单项id'), +('mall4cloud-order-item-491','1','1000','订单项id'), +('mall4cloud-order-item-492','1','1000','订单项id'), +('mall4cloud-order-item-493','1','1000','订单项id'), +('mall4cloud-order-item-494','1','1000','订单项id'), +('mall4cloud-order-item-495','1','1000','订单项id'), +('mall4cloud-order-item-496','1','1000','订单项id'), +('mall4cloud-order-item-497','1','1000','订单项id'), +('mall4cloud-order-item-498','1','1000','订单项id'), +('mall4cloud-order-item-499','1','1000','订单项id'), +('mall4cloud-order-item-500','1','1000','订单项id'), +('mall4cloud-order-item-501','1','1000','订单项id'), +('mall4cloud-order-item-502','1','1000','订单项id'), +('mall4cloud-order-item-503','1','1000','订单项id'), +('mall4cloud-order-item-504','1','1000','订单项id'), +('mall4cloud-order-item-505','1','1000','订单项id'), +('mall4cloud-order-item-506','1','1000','订单项id'), +('mall4cloud-order-item-507','1','1000','订单项id'), +('mall4cloud-order-item-508','1','1000','订单项id'), +('mall4cloud-order-item-509','1','1000','订单项id'), +('mall4cloud-order-item-510','1','1000','订单项id'), +('mall4cloud-order-item-511','1','1000','订单项id'), +('mall4cloud-order-item-512','1','1000','订单项id'), +('mall4cloud-order-item-513','1','1000','订单项id'), +('mall4cloud-order-item-514','1','1000','订单项id'), +('mall4cloud-order-item-515','1','1000','订单项id'), +('mall4cloud-order-item-516','1','1000','订单项id'), +('mall4cloud-order-item-517','1','1000','订单项id'), +('mall4cloud-order-item-518','1','1000','订单项id'), +('mall4cloud-order-item-519','1','1000','订单项id'), +('mall4cloud-order-item-520','1','1000','订单项id'), +('mall4cloud-order-item-521','1','1000','订单项id'), +('mall4cloud-order-item-522','1','1000','订单项id'), +('mall4cloud-order-item-523','1','1000','订单项id'), +('mall4cloud-order-item-524','1','1000','订单项id'), +('mall4cloud-order-item-525','1','1000','订单项id'), +('mall4cloud-order-item-526','1','1000','订单项id'), +('mall4cloud-order-item-527','1','1000','订单项id'), +('mall4cloud-order-item-528','1','1000','订单项id'), +('mall4cloud-order-item-529','1','1000','订单项id'), +('mall4cloud-order-item-530','1','1000','订单项id'), +('mall4cloud-order-item-531','1','1000','订单项id'), +('mall4cloud-order-item-532','1','1000','订单项id'), +('mall4cloud-order-item-533','1','1000','订单项id'), +('mall4cloud-order-item-534','1','1000','订单项id'), +('mall4cloud-order-item-535','1','1000','订单项id'), +('mall4cloud-order-item-536','1','1000','订单项id'), +('mall4cloud-order-item-537','1','1000','订单项id'), +('mall4cloud-order-item-538','1','1000','订单项id'), +('mall4cloud-order-item-539','1','1000','订单项id'), +('mall4cloud-order-item-540','1','1000','订单项id'), +('mall4cloud-order-item-541','1','1000','订单项id'), +('mall4cloud-order-item-542','1','1000','订单项id'), +('mall4cloud-order-item-543','1','1000','订单项id'), +('mall4cloud-order-item-544','1','1000','订单项id'), +('mall4cloud-order-item-545','1','1000','订单项id'), +('mall4cloud-order-item-546','1','1000','订单项id'), +('mall4cloud-order-item-547','1','1000','订单项id'), +('mall4cloud-order-item-548','1','1000','订单项id'), +('mall4cloud-order-item-549','1','1000','订单项id'), +('mall4cloud-order-item-550','1','1000','订单项id'), +('mall4cloud-order-item-551','1','1000','订单项id'), +('mall4cloud-order-item-552','1','1000','订单项id'), +('mall4cloud-order-item-553','1','1000','订单项id'), +('mall4cloud-order-item-554','1','1000','订单项id'), +('mall4cloud-order-item-555','1','1000','订单项id'), +('mall4cloud-order-item-556','1','1000','订单项id'), +('mall4cloud-order-item-557','1','1000','订单项id'), +('mall4cloud-order-item-558','1','1000','订单项id'), +('mall4cloud-order-item-559','1','1000','订单项id'), +('mall4cloud-order-item-560','1','1000','订单项id'), +('mall4cloud-order-item-561','1','1000','订单项id'), +('mall4cloud-order-item-562','1','1000','订单项id'), +('mall4cloud-order-item-563','1','1000','订单项id'), +('mall4cloud-order-item-564','1','1000','订单项id'), +('mall4cloud-order-item-565','1','1000','订单项id'), +('mall4cloud-order-item-566','1','1000','订单项id'), +('mall4cloud-order-item-567','1','1000','订单项id'), +('mall4cloud-order-item-568','1','1000','订单项id'), +('mall4cloud-order-item-569','1','1000','订单项id'), +('mall4cloud-order-item-570','1','1000','订单项id'), +('mall4cloud-order-item-571','1','1000','订单项id'), +('mall4cloud-order-item-572','1','1000','订单项id'), +('mall4cloud-order-item-573','1','1000','订单项id'), +('mall4cloud-order-item-574','1','1000','订单项id'), +('mall4cloud-order-item-575','1','1000','订单项id'), +('mall4cloud-order-item-576','1','1000','订单项id'), +('mall4cloud-order-item-577','1','1000','订单项id'), +('mall4cloud-order-item-578','1','1000','订单项id'), +('mall4cloud-order-item-579','1','1000','订单项id'), +('mall4cloud-order-item-580','1','1000','订单项id'), +('mall4cloud-order-item-581','1','1000','订单项id'), +('mall4cloud-order-item-582','1','1000','订单项id'), +('mall4cloud-order-item-583','1','1000','订单项id'), +('mall4cloud-order-item-584','1','1000','订单项id'), +('mall4cloud-order-item-585','1','1000','订单项id'), +('mall4cloud-order-item-586','1','1000','订单项id'), +('mall4cloud-order-item-587','1','1000','订单项id'), +('mall4cloud-order-item-588','1','1000','订单项id'), +('mall4cloud-order-item-589','1','1000','订单项id'), +('mall4cloud-order-item-590','1','1000','订单项id'), +('mall4cloud-order-item-591','1','1000','订单项id'), +('mall4cloud-order-item-592','1','1000','订单项id'), +('mall4cloud-order-item-593','1','1000','订单项id'), +('mall4cloud-order-item-594','1','1000','订单项id'), +('mall4cloud-order-item-595','1','1000','订单项id'), +('mall4cloud-order-item-596','1','1000','订单项id'), +('mall4cloud-order-item-597','1','1000','订单项id'), +('mall4cloud-order-item-598','1','1000','订单项id'), +('mall4cloud-order-item-599','1','1000','订单项id'), +('mall4cloud-order-item-600','1','1000','订单项id'), +('mall4cloud-order-item-601','1','1000','订单项id'), +('mall4cloud-order-item-602','1','1000','订单项id'), +('mall4cloud-order-item-603','1','1000','订单项id'), +('mall4cloud-order-item-604','1','1000','订单项id'), +('mall4cloud-order-item-605','1','1000','订单项id'), +('mall4cloud-order-item-606','1','1000','订单项id'), +('mall4cloud-order-item-607','1','1000','订单项id'), +('mall4cloud-order-item-608','1','1000','订单项id'), +('mall4cloud-order-item-609','1','1000','订单项id'), +('mall4cloud-order-item-610','1','1000','订单项id'), +('mall4cloud-order-item-611','1','1000','订单项id'), +('mall4cloud-order-item-612','1','1000','订单项id'), +('mall4cloud-order-item-613','1','1000','订单项id'), +('mall4cloud-order-item-614','1','1000','订单项id'), +('mall4cloud-order-item-615','1','1000','订单项id'), +('mall4cloud-order-item-616','1','1000','订单项id'), +('mall4cloud-order-item-617','1','1000','订单项id'), +('mall4cloud-order-item-618','1','1000','订单项id'), +('mall4cloud-order-item-619','1','1000','订单项id'), +('mall4cloud-order-item-620','1','1000','订单项id'), +('mall4cloud-order-item-621','1','1000','订单项id'), +('mall4cloud-order-item-622','1','1000','订单项id'), +('mall4cloud-order-item-623','1','1000','订单项id'), +('mall4cloud-order-item-624','1','1000','订单项id'), +('mall4cloud-order-item-625','1','1000','订单项id'), +('mall4cloud-order-item-626','1','1000','订单项id'), +('mall4cloud-order-item-627','1','1000','订单项id'), +('mall4cloud-order-item-628','1','1000','订单项id'), +('mall4cloud-order-item-629','1','1000','订单项id'), +('mall4cloud-order-item-630','1','1000','订单项id'), +('mall4cloud-order-item-631','1','1000','订单项id'), +('mall4cloud-order-item-632','1','1000','订单项id'), +('mall4cloud-order-item-633','1','1000','订单项id'), +('mall4cloud-order-item-634','1','1000','订单项id'), +('mall4cloud-order-item-635','1','1000','订单项id'), +('mall4cloud-order-item-636','1','1000','订单项id'), +('mall4cloud-order-item-637','1','1000','订单项id'), +('mall4cloud-order-item-638','1','1000','订单项id'), +('mall4cloud-order-item-639','1','1000','订单项id'), +('mall4cloud-order-item-640','1','1000','订单项id'), +('mall4cloud-order-item-641','1','1000','订单项id'), +('mall4cloud-order-item-642','1','1000','订单项id'), +('mall4cloud-order-item-643','1','1000','订单项id'), +('mall4cloud-order-item-644','1','1000','订单项id'), +('mall4cloud-order-item-645','1','1000','订单项id'), +('mall4cloud-order-item-646','1','1000','订单项id'), +('mall4cloud-order-item-647','1','1000','订单项id'), +('mall4cloud-order-item-648','1','1000','订单项id'), +('mall4cloud-order-item-649','1','1000','订单项id'), +('mall4cloud-order-item-650','1','1000','订单项id'), +('mall4cloud-order-item-651','1','1000','订单项id'), +('mall4cloud-order-item-652','1','1000','订单项id'), +('mall4cloud-order-item-653','1','1000','订单项id'), +('mall4cloud-order-item-654','1','1000','订单项id'), +('mall4cloud-order-item-655','1','1000','订单项id'), +('mall4cloud-order-item-656','1','1000','订单项id'), +('mall4cloud-order-item-657','1','1000','订单项id'), +('mall4cloud-order-item-658','1','1000','订单项id'), +('mall4cloud-order-item-659','1','1000','订单项id'), +('mall4cloud-order-item-660','1','1000','订单项id'), +('mall4cloud-order-item-661','1','1000','订单项id'), +('mall4cloud-order-item-662','1','1000','订单项id'), +('mall4cloud-order-item-663','1','1000','订单项id'), +('mall4cloud-order-item-664','1','1000','订单项id'), +('mall4cloud-order-item-665','1','1000','订单项id'), +('mall4cloud-order-item-666','1','1000','订单项id'), +('mall4cloud-order-item-667','1','1000','订单项id'), +('mall4cloud-order-item-668','1','1000','订单项id'), +('mall4cloud-order-item-669','1','1000','订单项id'), +('mall4cloud-order-item-670','1','1000','订单项id'), +('mall4cloud-order-item-671','1','1000','订单项id'), +('mall4cloud-order-item-672','1','1000','订单项id'), +('mall4cloud-order-item-673','1','1000','订单项id'), +('mall4cloud-order-item-674','1','1000','订单项id'), +('mall4cloud-order-item-675','1','1000','订单项id'), +('mall4cloud-order-item-676','1','1000','订单项id'), +('mall4cloud-order-item-677','1','1000','订单项id'), +('mall4cloud-order-item-678','1','1000','订单项id'), +('mall4cloud-order-item-679','1','1000','订单项id'), +('mall4cloud-order-item-680','1','1000','订单项id'), +('mall4cloud-order-item-681','1','1000','订单项id'), +('mall4cloud-order-item-682','1','1000','订单项id'), +('mall4cloud-order-item-683','1','1000','订单项id'), +('mall4cloud-order-item-684','1','1000','订单项id'), +('mall4cloud-order-item-685','1','1000','订单项id'), +('mall4cloud-order-item-686','1','1000','订单项id'), +('mall4cloud-order-item-687','1','1000','订单项id'), +('mall4cloud-order-item-688','1','1000','订单项id'), +('mall4cloud-order-item-689','1','1000','订单项id'), +('mall4cloud-order-item-690','1','1000','订单项id'), +('mall4cloud-order-item-691','1','1000','订单项id'), +('mall4cloud-order-item-692','1','1000','订单项id'), +('mall4cloud-order-item-693','1','1000','订单项id'), +('mall4cloud-order-item-694','1','1000','订单项id'), +('mall4cloud-order-item-695','1','1000','订单项id'), +('mall4cloud-order-item-696','1','1000','订单项id'), +('mall4cloud-order-item-697','1','1000','订单项id'), +('mall4cloud-order-item-698','1','1000','订单项id'), +('mall4cloud-order-item-699','1','1000','订单项id'), +('mall4cloud-order-item-700','1','1000','订单项id'), +('mall4cloud-order-item-701','1','1000','订单项id'), +('mall4cloud-order-item-702','1','1000','订单项id'), +('mall4cloud-order-item-703','1','1000','订单项id'), +('mall4cloud-order-item-704','1','1000','订单项id'), +('mall4cloud-order-item-705','1','1000','订单项id'), +('mall4cloud-order-item-706','1','1000','订单项id'), +('mall4cloud-order-item-707','1','1000','订单项id'), +('mall4cloud-order-item-708','1','1000','订单项id'), +('mall4cloud-order-item-709','1','1000','订单项id'), +('mall4cloud-order-item-710','1','1000','订单项id'), +('mall4cloud-order-item-711','1','1000','订单项id'), +('mall4cloud-order-item-712','1','1000','订单项id'), +('mall4cloud-order-item-713','1','1000','订单项id'), +('mall4cloud-order-item-714','1','1000','订单项id'), +('mall4cloud-order-item-715','1','1000','订单项id'), +('mall4cloud-order-item-716','1','1000','订单项id'), +('mall4cloud-order-item-717','1','1000','订单项id'), +('mall4cloud-order-item-718','1','1000','订单项id'), +('mall4cloud-order-item-719','1','1000','订单项id'), +('mall4cloud-order-item-720','1','1000','订单项id'), +('mall4cloud-order-item-721','1','1000','订单项id'), +('mall4cloud-order-item-722','1','1000','订单项id'), +('mall4cloud-order-item-723','1','1000','订单项id'), +('mall4cloud-order-item-724','1','1000','订单项id'), +('mall4cloud-order-item-725','1','1000','订单项id'), +('mall4cloud-order-item-726','1','1000','订单项id'), +('mall4cloud-order-item-727','1','1000','订单项id'), +('mall4cloud-order-item-728','1','1000','订单项id'), +('mall4cloud-order-item-729','1','1000','订单项id'), +('mall4cloud-order-item-730','1','1000','订单项id'), +('mall4cloud-order-item-731','1','1000','订单项id'), +('mall4cloud-order-item-732','1','1000','订单项id'), +('mall4cloud-order-item-733','1','1000','订单项id'), +('mall4cloud-order-item-734','1','1000','订单项id'), +('mall4cloud-order-item-735','1','1000','订单项id'), +('mall4cloud-order-item-736','1','1000','订单项id'), +('mall4cloud-order-item-737','1','1000','订单项id'), +('mall4cloud-order-item-738','1','1000','订单项id'), +('mall4cloud-order-item-739','1','1000','订单项id'), +('mall4cloud-order-item-740','1','1000','订单项id'), +('mall4cloud-order-item-741','1','1000','订单项id'), +('mall4cloud-order-item-742','1','1000','订单项id'), +('mall4cloud-order-item-743','1','1000','订单项id'), +('mall4cloud-order-item-744','1','1000','订单项id'), +('mall4cloud-order-item-745','1','1000','订单项id'), +('mall4cloud-order-item-746','1','1000','订单项id'), +('mall4cloud-order-item-747','1','1000','订单项id'), +('mall4cloud-order-item-748','1','1000','订单项id'), +('mall4cloud-order-item-749','1','1000','订单项id'), +('mall4cloud-order-item-750','1','1000','订单项id'), +('mall4cloud-order-item-751','1','1000','订单项id'), +('mall4cloud-order-item-752','1','1000','订单项id'), +('mall4cloud-order-item-753','1','1000','订单项id'), +('mall4cloud-order-item-754','1','1000','订单项id'), +('mall4cloud-order-item-755','1','1000','订单项id'), +('mall4cloud-order-item-756','1','1000','订单项id'), +('mall4cloud-order-item-757','1','1000','订单项id'), +('mall4cloud-order-item-758','1','1000','订单项id'), +('mall4cloud-order-item-759','1','1000','订单项id'), +('mall4cloud-order-item-760','1','1000','订单项id'), +('mall4cloud-order-item-761','1','1000','订单项id'), +('mall4cloud-order-item-762','1','1000','订单项id'), +('mall4cloud-order-item-763','1','1000','订单项id'), +('mall4cloud-order-item-764','1','1000','订单项id'), +('mall4cloud-order-item-765','1','1000','订单项id'), +('mall4cloud-order-item-766','1','1000','订单项id'), +('mall4cloud-order-item-767','1','1000','订单项id'), +('mall4cloud-order-item-768','1','1000','订单项id'), +('mall4cloud-order-item-769','1','1000','订单项id'), +('mall4cloud-order-item-770','1','1000','订单项id'), +('mall4cloud-order-item-771','1','1000','订单项id'), +('mall4cloud-order-item-772','1','1000','订单项id'), +('mall4cloud-order-item-773','1','1000','订单项id'), +('mall4cloud-order-item-774','1','1000','订单项id'), +('mall4cloud-order-item-775','1','1000','订单项id'), +('mall4cloud-order-item-776','1','1000','订单项id'), +('mall4cloud-order-item-777','1','1000','订单项id'), +('mall4cloud-order-item-778','1','1000','订单项id'), +('mall4cloud-order-item-779','1','1000','订单项id'), +('mall4cloud-order-item-780','1','1000','订单项id'), +('mall4cloud-order-item-781','1','1000','订单项id'), +('mall4cloud-order-item-782','1','1000','订单项id'), +('mall4cloud-order-item-783','1','1000','订单项id'), +('mall4cloud-order-item-784','1','1000','订单项id'), +('mall4cloud-order-item-785','1','1000','订单项id'), +('mall4cloud-order-item-786','1','1000','订单项id'), +('mall4cloud-order-item-787','1','1000','订单项id'), +('mall4cloud-order-item-788','1','1000','订单项id'), +('mall4cloud-order-item-789','1','1000','订单项id'), +('mall4cloud-order-item-790','1','1000','订单项id'), +('mall4cloud-order-item-791','1','1000','订单项id'), +('mall4cloud-order-item-792','1','1000','订单项id'), +('mall4cloud-order-item-793','1','1000','订单项id'), +('mall4cloud-order-item-794','1','1000','订单项id'), +('mall4cloud-order-item-795','1','1000','订单项id'), +('mall4cloud-order-item-796','1','1000','订单项id'), +('mall4cloud-order-item-797','1','1000','订单项id'), +('mall4cloud-order-item-798','1','1000','订单项id'), +('mall4cloud-order-item-799','1','1000','订单项id'), +('mall4cloud-order-item-800','1','1000','订单项id'), +('mall4cloud-order-item-801','1','1000','订单项id'), +('mall4cloud-order-item-802','1','1000','订单项id'), +('mall4cloud-order-item-803','1','1000','订单项id'), +('mall4cloud-order-item-804','1','1000','订单项id'), +('mall4cloud-order-item-805','1','1000','订单项id'), +('mall4cloud-order-item-806','1','1000','订单项id'), +('mall4cloud-order-item-807','1','1000','订单项id'), +('mall4cloud-order-item-808','1','1000','订单项id'), +('mall4cloud-order-item-809','1','1000','订单项id'), +('mall4cloud-order-item-810','1','1000','订单项id'), +('mall4cloud-order-item-811','1','1000','订单项id'), +('mall4cloud-order-item-812','1','1000','订单项id'), +('mall4cloud-order-item-813','1','1000','订单项id'), +('mall4cloud-order-item-814','1','1000','订单项id'), +('mall4cloud-order-item-815','1','1000','订单项id'), +('mall4cloud-order-item-816','1','1000','订单项id'), +('mall4cloud-order-item-817','1','1000','订单项id'), +('mall4cloud-order-item-818','1','1000','订单项id'), +('mall4cloud-order-item-819','1','1000','订单项id'), +('mall4cloud-order-item-820','1','1000','订单项id'), +('mall4cloud-order-item-821','1','1000','订单项id'), +('mall4cloud-order-item-822','1','1000','订单项id'), +('mall4cloud-order-item-823','1','1000','订单项id'), +('mall4cloud-order-item-824','1','1000','订单项id'), +('mall4cloud-order-item-825','1','1000','订单项id'), +('mall4cloud-order-item-826','1','1000','订单项id'), +('mall4cloud-order-item-827','1','1000','订单项id'), +('mall4cloud-order-item-828','1','1000','订单项id'), +('mall4cloud-order-item-829','1','1000','订单项id'), +('mall4cloud-order-item-830','1','1000','订单项id'), +('mall4cloud-order-item-831','1','1000','订单项id'), +('mall4cloud-order-item-832','1','1000','订单项id'), +('mall4cloud-order-item-833','1','1000','订单项id'), +('mall4cloud-order-item-834','1','1000','订单项id'), +('mall4cloud-order-item-835','1','1000','订单项id'), +('mall4cloud-order-item-836','1','1000','订单项id'), +('mall4cloud-order-item-837','1','1000','订单项id'), +('mall4cloud-order-item-838','1','1000','订单项id'), +('mall4cloud-order-item-839','1','1000','订单项id'), +('mall4cloud-order-item-840','1','1000','订单项id'), +('mall4cloud-order-item-841','1','1000','订单项id'), +('mall4cloud-order-item-842','1','1000','订单项id'), +('mall4cloud-order-item-843','1','1000','订单项id'), +('mall4cloud-order-item-844','1','1000','订单项id'), +('mall4cloud-order-item-845','1','1000','订单项id'), +('mall4cloud-order-item-846','1','1000','订单项id'), +('mall4cloud-order-item-847','1','1000','订单项id'), +('mall4cloud-order-item-848','1','1000','订单项id'), +('mall4cloud-order-item-849','1','1000','订单项id'), +('mall4cloud-order-item-850','1','1000','订单项id'), +('mall4cloud-order-item-851','1','1000','订单项id'), +('mall4cloud-order-item-852','1','1000','订单项id'), +('mall4cloud-order-item-853','1','1000','订单项id'), +('mall4cloud-order-item-854','1','1000','订单项id'), +('mall4cloud-order-item-855','1','1000','订单项id'), +('mall4cloud-order-item-856','1','1000','订单项id'), +('mall4cloud-order-item-857','1','1000','订单项id'), +('mall4cloud-order-item-858','1','1000','订单项id'), +('mall4cloud-order-item-859','1','1000','订单项id'), +('mall4cloud-order-item-860','1','1000','订单项id'), +('mall4cloud-order-item-861','1','1000','订单项id'), +('mall4cloud-order-item-862','1','1000','订单项id'), +('mall4cloud-order-item-863','1','1000','订单项id'), +('mall4cloud-order-item-864','1','1000','订单项id'), +('mall4cloud-order-item-865','1','1000','订单项id'), +('mall4cloud-order-item-866','1','1000','订单项id'), +('mall4cloud-order-item-867','1','1000','订单项id'), +('mall4cloud-order-item-868','1','1000','订单项id'), +('mall4cloud-order-item-869','1','1000','订单项id'), +('mall4cloud-order-item-870','1','1000','订单项id'), +('mall4cloud-order-item-871','1','1000','订单项id'), +('mall4cloud-order-item-872','1','1000','订单项id'), +('mall4cloud-order-item-873','1','1000','订单项id'), +('mall4cloud-order-item-874','1','1000','订单项id'), +('mall4cloud-order-item-875','1','1000','订单项id'), +('mall4cloud-order-item-876','1','1000','订单项id'), +('mall4cloud-order-item-877','1','1000','订单项id'), +('mall4cloud-order-item-878','1','1000','订单项id'), +('mall4cloud-order-item-879','1','1000','订单项id'), +('mall4cloud-order-item-880','1','1000','订单项id'), +('mall4cloud-order-item-881','1','1000','订单项id'), +('mall4cloud-order-item-882','1','1000','订单项id'), +('mall4cloud-order-item-883','1','1000','订单项id'), +('mall4cloud-order-item-884','1','1000','订单项id'), +('mall4cloud-order-item-885','1','1000','订单项id'), +('mall4cloud-order-item-886','1','1000','订单项id'), +('mall4cloud-order-item-887','1','1000','订单项id'), +('mall4cloud-order-item-888','1','1000','订单项id'), +('mall4cloud-order-item-889','1','1000','订单项id'), +('mall4cloud-order-item-890','1','1000','订单项id'), +('mall4cloud-order-item-891','1','1000','订单项id'), +('mall4cloud-order-item-892','1','1000','订单项id'), +('mall4cloud-order-item-893','1','1000','订单项id'), +('mall4cloud-order-item-894','1','1000','订单项id'), +('mall4cloud-order-item-895','1','1000','订单项id'), +('mall4cloud-order-item-896','1','1000','订单项id'), +('mall4cloud-order-item-897','1','1000','订单项id'), +('mall4cloud-order-item-898','1','1000','订单项id'), +('mall4cloud-order-item-899','1','1000','订单项id'), +('mall4cloud-order-item-900','1','1000','订单项id'), +('mall4cloud-order-item-901','1','1000','订单项id'), +('mall4cloud-order-item-902','1','1000','订单项id'), +('mall4cloud-order-item-903','1','1000','订单项id'), +('mall4cloud-order-item-904','1','1000','订单项id'), +('mall4cloud-order-item-905','1','1000','订单项id'), +('mall4cloud-order-item-906','1','1000','订单项id'), +('mall4cloud-order-item-907','1','1000','订单项id'), +('mall4cloud-order-item-908','1','1000','订单项id'), +('mall4cloud-order-item-909','1','1000','订单项id'), +('mall4cloud-order-item-910','1','1000','订单项id'), +('mall4cloud-order-item-911','1','1000','订单项id'), +('mall4cloud-order-item-912','1','1000','订单项id'), +('mall4cloud-order-item-913','1','1000','订单项id'), +('mall4cloud-order-item-914','1','1000','订单项id'), +('mall4cloud-order-item-915','1','1000','订单项id'), +('mall4cloud-order-item-916','1','1000','订单项id'), +('mall4cloud-order-item-917','1','1000','订单项id'), +('mall4cloud-order-item-918','1','1000','订单项id'), +('mall4cloud-order-item-919','1','1000','订单项id'), +('mall4cloud-order-item-920','1','1000','订单项id'), +('mall4cloud-order-item-921','1','1000','订单项id'), +('mall4cloud-order-item-922','1','1000','订单项id'), +('mall4cloud-order-item-923','1','1000','订单项id'), +('mall4cloud-order-item-924','1','1000','订单项id'), +('mall4cloud-order-item-925','1','1000','订单项id'), +('mall4cloud-order-item-926','1','1000','订单项id'), +('mall4cloud-order-item-927','1','1000','订单项id'), +('mall4cloud-order-item-928','1','1000','订单项id'), +('mall4cloud-order-item-929','1','1000','订单项id'), +('mall4cloud-order-item-930','1','1000','订单项id'), +('mall4cloud-order-item-931','1','1000','订单项id'), +('mall4cloud-order-item-932','1','1000','订单项id'), +('mall4cloud-order-item-933','1','1000','订单项id'), +('mall4cloud-order-item-934','1','1000','订单项id'), +('mall4cloud-order-item-935','1','1000','订单项id'), +('mall4cloud-order-item-936','1','1000','订单项id'), +('mall4cloud-order-item-937','1','1000','订单项id'), +('mall4cloud-order-item-938','1','1000','订单项id'), +('mall4cloud-order-item-939','1','1000','订单项id'), +('mall4cloud-order-item-940','1','1000','订单项id'), +('mall4cloud-order-item-941','1','1000','订单项id'), +('mall4cloud-order-item-942','1','1000','订单项id'), +('mall4cloud-order-item-943','1','1000','订单项id'), +('mall4cloud-order-item-944','1','1000','订单项id'), +('mall4cloud-order-item-945','1','1000','订单项id'), +('mall4cloud-order-item-946','1','1000','订单项id'), +('mall4cloud-order-item-947','1','1000','订单项id'), +('mall4cloud-order-item-948','1','1000','订单项id'), +('mall4cloud-order-item-949','1','1000','订单项id'), +('mall4cloud-order-item-950','1','1000','订单项id'), +('mall4cloud-order-item-951','1','1000','订单项id'), +('mall4cloud-order-item-952','1','1000','订单项id'), +('mall4cloud-order-item-953','1','1000','订单项id'), +('mall4cloud-order-item-954','1','1000','订单项id'), +('mall4cloud-order-item-955','1','1000','订单项id'), +('mall4cloud-order-item-956','1','1000','订单项id'), +('mall4cloud-order-item-957','1','1000','订单项id'), +('mall4cloud-order-item-958','1','1000','订单项id'), +('mall4cloud-order-item-959','1','1000','订单项id'), +('mall4cloud-order-item-960','1','1000','订单项id'), +('mall4cloud-order-item-961','1','1000','订单项id'), +('mall4cloud-order-item-962','1','1000','订单项id'), +('mall4cloud-order-item-963','1','1000','订单项id'), +('mall4cloud-order-item-964','1','1000','订单项id'), +('mall4cloud-order-item-965','1','1000','订单项id'), +('mall4cloud-order-item-966','1','1000','订单项id'), +('mall4cloud-order-item-967','1','1000','订单项id'), +('mall4cloud-order-item-968','1','1000','订单项id'), +('mall4cloud-order-item-969','1','1000','订单项id'), +('mall4cloud-order-item-970','1','1000','订单项id'), +('mall4cloud-order-item-971','1','1000','订单项id'), +('mall4cloud-order-item-972','1','1000','订单项id'), +('mall4cloud-order-item-973','1','1000','订单项id'), +('mall4cloud-order-item-974','1','1000','订单项id'), +('mall4cloud-order-item-975','1','1000','订单项id'), +('mall4cloud-order-item-976','1','1000','订单项id'), +('mall4cloud-order-item-977','1','1000','订单项id'), +('mall4cloud-order-item-978','1','1000','订单项id'), +('mall4cloud-order-item-979','1','1000','订单项id'), +('mall4cloud-order-item-980','1','1000','订单项id'), +('mall4cloud-order-item-981','1','1000','订单项id'), +('mall4cloud-order-item-982','1','1000','订单项id'), +('mall4cloud-order-item-983','1','1000','订单项id'), +('mall4cloud-order-item-984','1','1000','订单项id'), +('mall4cloud-order-item-985','1','1000','订单项id'), +('mall4cloud-order-item-986','1','1000','订单项id'), +('mall4cloud-order-item-987','1','1000','订单项id'), +('mall4cloud-order-item-988','1','1000','订单项id'), +('mall4cloud-order-item-989','1','1000','订单项id'), +('mall4cloud-order-item-990','1','1000','订单项id'), +('mall4cloud-order-item-991','1','1000','订单项id'), +('mall4cloud-order-item-992','1','1000','订单项id'), +('mall4cloud-order-item-993','1','1000','订单项id'), +('mall4cloud-order-item-994','1','1000','订单项id'), +('mall4cloud-order-item-995','1','1000','订单项id'), +('mall4cloud-order-item-996','1','1000','订单项id'), +('mall4cloud-order-item-997','1','1000','订单项id'), +('mall4cloud-order-item-998','1','1000','订单项id'), +('mall4cloud-order-item-999','1','1000','订单项id'), +('mall4cloud-order-pre-sale-000','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-001','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-002','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-003','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-004','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-005','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-006','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-007','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-008','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-009','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-010','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-011','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-012','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-013','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-014','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-015','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-016','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-017','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-018','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-019','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-020','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-021','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-022','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-023','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-024','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-025','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-026','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-027','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-028','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-029','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-030','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-031','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-032','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-033','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-034','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-035','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-036','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-037','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-038','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-039','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-040','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-041','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-042','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-043','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-044','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-045','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-046','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-047','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-048','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-049','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-050','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-051','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-052','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-053','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-054','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-055','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-056','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-057','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-058','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-059','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-060','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-061','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-062','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-063','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-064','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-065','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-066','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-067','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-068','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-069','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-070','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-071','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-072','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-073','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-074','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-075','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-076','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-077','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-078','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-079','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-080','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-081','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-082','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-083','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-084','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-085','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-086','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-087','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-088','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-089','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-090','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-091','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-092','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-093','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-094','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-095','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-096','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-097','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-098','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-099','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-100','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-101','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-102','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-103','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-104','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-105','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-106','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-107','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-108','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-109','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-110','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-111','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-112','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-113','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-114','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-115','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-116','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-117','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-118','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-119','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-120','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-121','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-122','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-123','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-124','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-125','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-126','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-127','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-128','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-129','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-130','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-131','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-132','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-133','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-134','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-135','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-136','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-137','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-138','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-139','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-140','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-141','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-142','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-143','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-144','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-145','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-146','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-147','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-148','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-149','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-150','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-151','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-152','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-153','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-154','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-155','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-156','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-157','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-158','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-159','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-160','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-161','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-162','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-163','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-164','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-165','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-166','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-167','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-168','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-169','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-170','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-171','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-172','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-173','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-174','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-175','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-176','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-177','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-178','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-179','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-180','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-181','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-182','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-183','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-184','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-185','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-186','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-187','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-188','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-189','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-190','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-191','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-192','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-193','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-194','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-195','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-196','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-197','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-198','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-199','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-200','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-201','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-202','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-203','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-204','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-205','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-206','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-207','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-208','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-209','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-210','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-211','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-212','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-213','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-214','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-215','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-216','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-217','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-218','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-219','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-220','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-221','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-222','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-223','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-224','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-225','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-226','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-227','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-228','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-229','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-230','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-231','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-232','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-233','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-234','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-235','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-236','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-237','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-238','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-239','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-240','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-241','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-242','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-243','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-244','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-245','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-246','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-247','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-248','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-249','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-250','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-251','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-252','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-253','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-254','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-255','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-256','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-257','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-258','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-259','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-260','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-261','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-262','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-263','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-264','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-265','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-266','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-267','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-268','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-269','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-270','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-271','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-272','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-273','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-274','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-275','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-276','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-277','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-278','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-279','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-280','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-281','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-282','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-283','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-284','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-285','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-286','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-287','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-288','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-289','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-290','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-291','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-292','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-293','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-294','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-295','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-296','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-297','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-298','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-299','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-300','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-301','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-302','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-303','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-304','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-305','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-306','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-307','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-308','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-309','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-310','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-311','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-312','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-313','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-314','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-315','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-316','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-317','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-318','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-319','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-320','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-321','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-322','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-323','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-324','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-325','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-326','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-327','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-328','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-329','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-330','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-331','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-332','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-333','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-334','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-335','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-336','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-337','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-338','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-339','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-340','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-341','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-342','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-343','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-344','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-345','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-346','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-347','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-348','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-349','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-350','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-351','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-352','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-353','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-354','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-355','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-356','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-357','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-358','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-359','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-360','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-361','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-362','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-363','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-364','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-365','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-366','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-367','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-368','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-369','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-370','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-371','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-372','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-373','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-374','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-375','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-376','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-377','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-378','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-379','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-380','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-381','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-382','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-383','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-384','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-385','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-386','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-387','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-388','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-389','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-390','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-391','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-392','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-393','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-394','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-395','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-396','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-397','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-398','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-399','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-400','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-401','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-402','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-403','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-404','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-405','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-406','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-407','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-408','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-409','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-410','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-411','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-412','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-413','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-414','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-415','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-416','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-417','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-418','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-419','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-420','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-421','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-422','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-423','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-424','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-425','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-426','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-427','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-428','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-429','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-430','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-431','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-432','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-433','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-434','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-435','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-436','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-437','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-438','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-439','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-440','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-441','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-442','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-443','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-444','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-445','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-446','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-447','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-448','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-449','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-450','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-451','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-452','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-453','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-454','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-455','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-456','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-457','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-458','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-459','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-460','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-461','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-462','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-463','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-464','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-465','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-466','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-467','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-468','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-469','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-470','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-471','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-472','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-473','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-474','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-475','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-476','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-477','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-478','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-479','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-480','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-481','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-482','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-483','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-484','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-485','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-486','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-487','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-488','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-489','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-490','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-491','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-492','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-493','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-494','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-495','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-496','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-497','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-498','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-499','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-500','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-501','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-502','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-503','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-504','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-505','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-506','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-507','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-508','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-509','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-510','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-511','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-512','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-513','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-514','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-515','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-516','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-517','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-518','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-519','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-520','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-521','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-522','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-523','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-524','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-525','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-526','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-527','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-528','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-529','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-530','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-531','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-532','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-533','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-534','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-535','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-536','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-537','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-538','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-539','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-540','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-541','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-542','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-543','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-544','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-545','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-546','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-547','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-548','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-549','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-550','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-551','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-552','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-553','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-554','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-555','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-556','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-557','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-558','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-559','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-560','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-561','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-562','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-563','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-564','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-565','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-566','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-567','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-568','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-569','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-570','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-571','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-572','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-573','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-574','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-575','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-576','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-577','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-578','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-579','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-580','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-581','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-582','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-583','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-584','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-585','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-586','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-587','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-588','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-589','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-590','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-591','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-592','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-593','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-594','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-595','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-596','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-597','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-598','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-599','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-600','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-601','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-602','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-603','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-604','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-605','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-606','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-607','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-608','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-609','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-610','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-611','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-612','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-613','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-614','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-615','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-616','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-617','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-618','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-619','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-620','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-621','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-622','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-623','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-624','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-625','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-626','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-627','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-628','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-629','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-630','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-631','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-632','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-633','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-634','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-635','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-636','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-637','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-638','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-639','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-640','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-641','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-642','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-643','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-644','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-645','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-646','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-647','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-648','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-649','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-650','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-651','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-652','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-653','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-654','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-655','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-656','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-657','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-658','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-659','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-660','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-661','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-662','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-663','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-664','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-665','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-666','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-667','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-668','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-669','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-670','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-671','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-672','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-673','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-674','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-675','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-676','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-677','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-678','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-679','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-680','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-681','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-682','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-683','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-684','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-685','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-686','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-687','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-688','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-689','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-690','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-691','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-692','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-693','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-694','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-695','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-696','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-697','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-698','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-699','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-700','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-701','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-702','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-703','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-704','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-705','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-706','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-707','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-708','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-709','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-710','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-711','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-712','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-713','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-714','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-715','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-716','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-717','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-718','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-719','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-720','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-721','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-722','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-723','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-724','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-725','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-726','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-727','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-728','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-729','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-730','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-731','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-732','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-733','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-734','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-735','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-736','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-737','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-738','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-739','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-740','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-741','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-742','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-743','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-744','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-745','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-746','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-747','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-748','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-749','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-750','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-751','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-752','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-753','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-754','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-755','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-756','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-757','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-758','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-759','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-760','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-761','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-762','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-763','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-764','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-765','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-766','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-767','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-768','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-769','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-770','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-771','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-772','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-773','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-774','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-775','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-776','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-777','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-778','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-779','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-780','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-781','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-782','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-783','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-784','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-785','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-786','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-787','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-788','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-789','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-790','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-791','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-792','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-793','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-794','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-795','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-796','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-797','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-798','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-799','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-800','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-801','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-802','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-803','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-804','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-805','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-806','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-807','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-808','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-809','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-810','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-811','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-812','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-813','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-814','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-815','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-816','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-817','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-818','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-819','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-820','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-821','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-822','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-823','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-824','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-825','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-826','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-827','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-828','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-829','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-830','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-831','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-832','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-833','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-834','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-835','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-836','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-837','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-838','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-839','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-840','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-841','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-842','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-843','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-844','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-845','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-846','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-847','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-848','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-849','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-850','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-851','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-852','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-853','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-854','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-855','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-856','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-857','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-858','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-859','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-860','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-861','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-862','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-863','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-864','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-865','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-866','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-867','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-868','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-869','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-870','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-871','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-872','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-873','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-874','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-875','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-876','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-877','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-878','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-879','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-880','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-881','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-882','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-883','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-884','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-885','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-886','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-887','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-888','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-889','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-890','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-891','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-892','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-893','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-894','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-895','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-896','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-897','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-898','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-899','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-900','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-901','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-902','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-903','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-904','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-905','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-906','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-907','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-908','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-909','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-910','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-911','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-912','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-913','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-914','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-915','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-916','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-917','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-918','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-919','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-920','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-921','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-922','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-923','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-924','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-925','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-926','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-927','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-928','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-929','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-930','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-931','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-932','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-933','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-934','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-935','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-936','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-937','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-938','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-939','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-940','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-941','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-942','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-943','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-944','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-945','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-946','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-947','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-948','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-949','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-950','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-951','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-952','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-953','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-954','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-955','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-956','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-957','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-958','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-959','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-960','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-961','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-962','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-963','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-964','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-965','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-966','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-967','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-968','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-969','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-970','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-971','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-972','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-973','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-974','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-975','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-976','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-977','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-978','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-979','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-980','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-981','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-982','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-983','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-984','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-985','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-986','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-987','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-988','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-989','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-990','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-991','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-992','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-993','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-994','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-995','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-996','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-997','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-998','1','1000','订单预售id'), +('mall4cloud-order-pre-sale-999','1','1000','订单预售id'), +('mall4cloud-order-self-station-000','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-001','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-002','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-003','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-004','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-005','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-006','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-007','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-008','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-009','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-010','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-011','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-012','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-013','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-014','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-015','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-016','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-017','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-018','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-019','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-020','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-021','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-022','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-023','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-024','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-025','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-026','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-027','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-028','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-029','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-030','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-031','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-032','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-033','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-034','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-035','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-036','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-037','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-038','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-039','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-040','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-041','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-042','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-043','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-044','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-045','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-046','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-047','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-048','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-049','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-050','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-051','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-052','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-053','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-054','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-055','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-056','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-057','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-058','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-059','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-060','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-061','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-062','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-063','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-064','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-065','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-066','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-067','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-068','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-069','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-070','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-071','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-072','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-073','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-074','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-075','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-076','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-077','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-078','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-079','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-080','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-081','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-082','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-083','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-084','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-085','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-086','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-087','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-088','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-089','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-090','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-091','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-092','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-093','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-094','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-095','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-096','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-097','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-098','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-099','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-100','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-101','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-102','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-103','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-104','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-105','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-106','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-107','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-108','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-109','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-110','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-111','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-112','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-113','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-114','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-115','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-116','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-117','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-118','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-119','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-120','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-121','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-122','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-123','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-124','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-125','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-126','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-127','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-128','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-129','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-130','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-131','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-132','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-133','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-134','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-135','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-136','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-137','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-138','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-139','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-140','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-141','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-142','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-143','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-144','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-145','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-146','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-147','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-148','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-149','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-150','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-151','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-152','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-153','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-154','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-155','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-156','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-157','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-158','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-159','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-160','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-161','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-162','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-163','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-164','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-165','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-166','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-167','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-168','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-169','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-170','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-171','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-172','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-173','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-174','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-175','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-176','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-177','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-178','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-179','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-180','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-181','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-182','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-183','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-184','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-185','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-186','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-187','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-188','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-189','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-190','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-191','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-192','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-193','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-194','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-195','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-196','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-197','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-198','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-199','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-200','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-201','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-202','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-203','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-204','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-205','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-206','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-207','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-208','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-209','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-210','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-211','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-212','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-213','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-214','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-215','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-216','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-217','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-218','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-219','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-220','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-221','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-222','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-223','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-224','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-225','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-226','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-227','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-228','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-229','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-230','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-231','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-232','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-233','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-234','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-235','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-236','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-237','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-238','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-239','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-240','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-241','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-242','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-243','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-244','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-245','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-246','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-247','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-248','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-249','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-250','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-251','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-252','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-253','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-254','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-255','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-256','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-257','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-258','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-259','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-260','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-261','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-262','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-263','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-264','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-265','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-266','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-267','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-268','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-269','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-270','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-271','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-272','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-273','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-274','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-275','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-276','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-277','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-278','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-279','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-280','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-281','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-282','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-283','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-284','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-285','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-286','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-287','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-288','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-289','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-290','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-291','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-292','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-293','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-294','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-295','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-296','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-297','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-298','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-299','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-300','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-301','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-302','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-303','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-304','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-305','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-306','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-307','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-308','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-309','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-310','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-311','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-312','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-313','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-314','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-315','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-316','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-317','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-318','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-319','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-320','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-321','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-322','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-323','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-324','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-325','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-326','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-327','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-328','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-329','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-330','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-331','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-332','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-333','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-334','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-335','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-336','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-337','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-338','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-339','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-340','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-341','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-342','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-343','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-344','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-345','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-346','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-347','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-348','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-349','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-350','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-351','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-352','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-353','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-354','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-355','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-356','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-357','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-358','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-359','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-360','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-361','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-362','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-363','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-364','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-365','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-366','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-367','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-368','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-369','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-370','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-371','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-372','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-373','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-374','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-375','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-376','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-377','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-378','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-379','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-380','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-381','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-382','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-383','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-384','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-385','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-386','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-387','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-388','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-389','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-390','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-391','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-392','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-393','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-394','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-395','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-396','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-397','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-398','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-399','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-400','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-401','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-402','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-403','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-404','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-405','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-406','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-407','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-408','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-409','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-410','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-411','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-412','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-413','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-414','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-415','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-416','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-417','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-418','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-419','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-420','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-421','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-422','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-423','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-424','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-425','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-426','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-427','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-428','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-429','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-430','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-431','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-432','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-433','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-434','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-435','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-436','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-437','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-438','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-439','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-440','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-441','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-442','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-443','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-444','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-445','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-446','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-447','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-448','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-449','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-450','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-451','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-452','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-453','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-454','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-455','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-456','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-457','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-458','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-459','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-460','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-461','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-462','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-463','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-464','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-465','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-466','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-467','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-468','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-469','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-470','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-471','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-472','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-473','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-474','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-475','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-476','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-477','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-478','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-479','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-480','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-481','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-482','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-483','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-484','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-485','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-486','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-487','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-488','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-489','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-490','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-491','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-492','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-493','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-494','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-495','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-496','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-497','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-498','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-499','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-500','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-501','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-502','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-503','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-504','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-505','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-506','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-507','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-508','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-509','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-510','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-511','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-512','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-513','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-514','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-515','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-516','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-517','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-518','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-519','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-520','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-521','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-522','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-523','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-524','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-525','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-526','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-527','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-528','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-529','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-530','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-531','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-532','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-533','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-534','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-535','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-536','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-537','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-538','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-539','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-540','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-541','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-542','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-543','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-544','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-545','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-546','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-547','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-548','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-549','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-550','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-551','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-552','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-553','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-554','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-555','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-556','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-557','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-558','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-559','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-560','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-561','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-562','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-563','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-564','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-565','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-566','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-567','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-568','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-569','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-570','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-571','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-572','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-573','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-574','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-575','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-576','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-577','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-578','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-579','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-580','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-581','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-582','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-583','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-584','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-585','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-586','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-587','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-588','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-589','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-590','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-591','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-592','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-593','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-594','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-595','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-596','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-597','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-598','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-599','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-600','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-601','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-602','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-603','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-604','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-605','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-606','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-607','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-608','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-609','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-610','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-611','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-612','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-613','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-614','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-615','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-616','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-617','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-618','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-619','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-620','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-621','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-622','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-623','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-624','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-625','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-626','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-627','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-628','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-629','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-630','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-631','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-632','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-633','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-634','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-635','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-636','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-637','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-638','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-639','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-640','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-641','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-642','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-643','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-644','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-645','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-646','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-647','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-648','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-649','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-650','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-651','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-652','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-653','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-654','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-655','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-656','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-657','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-658','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-659','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-660','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-661','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-662','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-663','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-664','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-665','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-666','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-667','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-668','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-669','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-670','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-671','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-672','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-673','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-674','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-675','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-676','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-677','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-678','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-679','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-680','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-681','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-682','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-683','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-684','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-685','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-686','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-687','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-688','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-689','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-690','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-691','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-692','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-693','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-694','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-695','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-696','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-697','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-698','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-699','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-700','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-701','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-702','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-703','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-704','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-705','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-706','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-707','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-708','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-709','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-710','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-711','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-712','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-713','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-714','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-715','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-716','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-717','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-718','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-719','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-720','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-721','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-722','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-723','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-724','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-725','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-726','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-727','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-728','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-729','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-730','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-731','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-732','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-733','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-734','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-735','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-736','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-737','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-738','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-739','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-740','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-741','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-742','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-743','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-744','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-745','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-746','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-747','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-748','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-749','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-750','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-751','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-752','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-753','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-754','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-755','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-756','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-757','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-758','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-759','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-760','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-761','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-762','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-763','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-764','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-765','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-766','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-767','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-768','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-769','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-770','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-771','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-772','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-773','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-774','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-775','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-776','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-777','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-778','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-779','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-780','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-781','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-782','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-783','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-784','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-785','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-786','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-787','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-788','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-789','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-790','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-791','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-792','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-793','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-794','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-795','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-796','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-797','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-798','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-799','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-800','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-801','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-802','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-803','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-804','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-805','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-806','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-807','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-808','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-809','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-810','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-811','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-812','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-813','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-814','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-815','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-816','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-817','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-818','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-819','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-820','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-821','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-822','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-823','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-824','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-825','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-826','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-827','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-828','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-829','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-830','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-831','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-832','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-833','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-834','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-835','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-836','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-837','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-838','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-839','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-840','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-841','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-842','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-843','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-844','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-845','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-846','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-847','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-848','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-849','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-850','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-851','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-852','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-853','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-854','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-855','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-856','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-857','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-858','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-859','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-860','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-861','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-862','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-863','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-864','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-865','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-866','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-867','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-868','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-869','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-870','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-871','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-872','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-873','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-874','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-875','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-876','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-877','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-878','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-879','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-880','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-881','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-882','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-883','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-884','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-885','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-886','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-887','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-888','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-889','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-890','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-891','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-892','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-893','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-894','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-895','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-896','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-897','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-898','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-899','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-900','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-901','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-902','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-903','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-904','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-905','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-906','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-907','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-908','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-909','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-910','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-911','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-912','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-913','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-914','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-915','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-916','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-917','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-918','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-919','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-920','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-921','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-922','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-923','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-924','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-925','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-926','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-927','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-928','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-929','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-930','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-931','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-932','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-933','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-934','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-935','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-936','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-937','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-938','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-939','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-940','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-941','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-942','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-943','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-944','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-945','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-946','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-947','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-948','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-949','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-950','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-951','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-952','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-953','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-954','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-955','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-956','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-957','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-958','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-959','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-960','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-961','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-962','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-963','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-964','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-965','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-966','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-967','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-968','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-969','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-970','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-971','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-972','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-973','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-974','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-975','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-976','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-977','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-978','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-979','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-980','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-981','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-982','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-983','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-984','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-985','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-986','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-987','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-988','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-989','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-990','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-991','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-992','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-993','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-994','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-995','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-996','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-997','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-998','1','1000','自提订单的地址id'), +('mall4cloud-order-self-station-999','1','1000','自提订单的地址id'), +('mall4cloud-order-settlement-000','1','1000','订单结算id'), +('mall4cloud-order-settlement-001','1','1000','订单结算id'), +('mall4cloud-order-settlement-002','1','1000','订单结算id'), +('mall4cloud-order-settlement-003','1','1000','订单结算id'), +('mall4cloud-order-settlement-004','1','1000','订单结算id'), +('mall4cloud-order-settlement-005','1','1000','订单结算id'), +('mall4cloud-order-settlement-006','1','1000','订单结算id'), +('mall4cloud-order-settlement-007','1','1000','订单结算id'), +('mall4cloud-order-settlement-008','1','1000','订单结算id'), +('mall4cloud-order-settlement-009','1','1000','订单结算id'), +('mall4cloud-order-settlement-010','1','1000','订单结算id'), +('mall4cloud-order-settlement-011','1','1000','订单结算id'), +('mall4cloud-order-settlement-012','1','1000','订单结算id'), +('mall4cloud-order-settlement-013','1','1000','订单结算id'), +('mall4cloud-order-settlement-014','1','1000','订单结算id'), +('mall4cloud-order-settlement-015','1','1000','订单结算id'), +('mall4cloud-order-settlement-016','1','1000','订单结算id'), +('mall4cloud-order-settlement-017','1','1000','订单结算id'), +('mall4cloud-order-settlement-018','1','1000','订单结算id'), +('mall4cloud-order-settlement-019','1','1000','订单结算id'), +('mall4cloud-order-settlement-020','1','1000','订单结算id'), +('mall4cloud-order-settlement-021','1','1000','订单结算id'), +('mall4cloud-order-settlement-022','1','1000','订单结算id'), +('mall4cloud-order-settlement-023','1','1000','订单结算id'), +('mall4cloud-order-settlement-024','1','1000','订单结算id'), +('mall4cloud-order-settlement-025','1','1000','订单结算id'), +('mall4cloud-order-settlement-026','1','1000','订单结算id'), +('mall4cloud-order-settlement-027','1','1000','订单结算id'), +('mall4cloud-order-settlement-028','1','1000','订单结算id'), +('mall4cloud-order-settlement-029','1','1000','订单结算id'), +('mall4cloud-order-settlement-030','1','1000','订单结算id'), +('mall4cloud-order-settlement-031','1','1000','订单结算id'), +('mall4cloud-order-settlement-032','1','1000','订单结算id'), +('mall4cloud-order-settlement-033','1','1000','订单结算id'), +('mall4cloud-order-settlement-034','1','1000','订单结算id'), +('mall4cloud-order-settlement-035','1','1000','订单结算id'), +('mall4cloud-order-settlement-036','1','1000','订单结算id'), +('mall4cloud-order-settlement-037','1','1000','订单结算id'), +('mall4cloud-order-settlement-038','1','1000','订单结算id'), +('mall4cloud-order-settlement-039','1','1000','订单结算id'), +('mall4cloud-order-settlement-040','1','1000','订单结算id'), +('mall4cloud-order-settlement-041','1','1000','订单结算id'), +('mall4cloud-order-settlement-042','1','1000','订单结算id'), +('mall4cloud-order-settlement-043','1','1000','订单结算id'), +('mall4cloud-order-settlement-044','1','1000','订单结算id'), +('mall4cloud-order-settlement-045','1','1000','订单结算id'), +('mall4cloud-order-settlement-046','1','1000','订单结算id'), +('mall4cloud-order-settlement-047','1','1000','订单结算id'), +('mall4cloud-order-settlement-048','1','1000','订单结算id'), +('mall4cloud-order-settlement-049','1','1000','订单结算id'), +('mall4cloud-order-settlement-050','1','1000','订单结算id'), +('mall4cloud-order-settlement-051','1','1000','订单结算id'), +('mall4cloud-order-settlement-052','1','1000','订单结算id'), +('mall4cloud-order-settlement-053','1','1000','订单结算id'), +('mall4cloud-order-settlement-054','1','1000','订单结算id'), +('mall4cloud-order-settlement-055','1','1000','订单结算id'), +('mall4cloud-order-settlement-056','1','1000','订单结算id'), +('mall4cloud-order-settlement-057','1','1000','订单结算id'), +('mall4cloud-order-settlement-058','1','1000','订单结算id'), +('mall4cloud-order-settlement-059','1','1000','订单结算id'), +('mall4cloud-order-settlement-060','1','1000','订单结算id'), +('mall4cloud-order-settlement-061','1','1000','订单结算id'), +('mall4cloud-order-settlement-062','1','1000','订单结算id'), +('mall4cloud-order-settlement-063','1','1000','订单结算id'), +('mall4cloud-order-settlement-064','1','1000','订单结算id'), +('mall4cloud-order-settlement-065','1','1000','订单结算id'), +('mall4cloud-order-settlement-066','1','1000','订单结算id'), +('mall4cloud-order-settlement-067','1','1000','订单结算id'), +('mall4cloud-order-settlement-068','1','1000','订单结算id'), +('mall4cloud-order-settlement-069','1','1000','订单结算id'), +('mall4cloud-order-settlement-070','1','1000','订单结算id'), +('mall4cloud-order-settlement-071','1','1000','订单结算id'), +('mall4cloud-order-settlement-072','1','1000','订单结算id'), +('mall4cloud-order-settlement-073','1','1000','订单结算id'), +('mall4cloud-order-settlement-074','1','1000','订单结算id'), +('mall4cloud-order-settlement-075','1','1000','订单结算id'), +('mall4cloud-order-settlement-076','1','1000','订单结算id'), +('mall4cloud-order-settlement-077','1','1000','订单结算id'), +('mall4cloud-order-settlement-078','1','1000','订单结算id'), +('mall4cloud-order-settlement-079','1','1000','订单结算id'), +('mall4cloud-order-settlement-080','1','1000','订单结算id'), +('mall4cloud-order-settlement-081','1','1000','订单结算id'), +('mall4cloud-order-settlement-082','1','1000','订单结算id'), +('mall4cloud-order-settlement-083','1','1000','订单结算id'), +('mall4cloud-order-settlement-084','1','1000','订单结算id'), +('mall4cloud-order-settlement-085','1','1000','订单结算id'), +('mall4cloud-order-settlement-086','1','1000','订单结算id'), +('mall4cloud-order-settlement-087','1','1000','订单结算id'), +('mall4cloud-order-settlement-088','1','1000','订单结算id'), +('mall4cloud-order-settlement-089','1','1000','订单结算id'), +('mall4cloud-order-settlement-090','1','1000','订单结算id'), +('mall4cloud-order-settlement-091','1','1000','订单结算id'), +('mall4cloud-order-settlement-092','1','1000','订单结算id'), +('mall4cloud-order-settlement-093','1','1000','订单结算id'), +('mall4cloud-order-settlement-094','1','1000','订单结算id'), +('mall4cloud-order-settlement-095','1','1000','订单结算id'), +('mall4cloud-order-settlement-096','1','1000','订单结算id'), +('mall4cloud-order-settlement-097','1','1000','订单结算id'), +('mall4cloud-order-settlement-098','1','1000','订单结算id'), +('mall4cloud-order-settlement-099','1','1000','订单结算id'), +('mall4cloud-order-settlement-100','1','1000','订单结算id'), +('mall4cloud-order-settlement-101','1','1000','订单结算id'), +('mall4cloud-order-settlement-102','1','1000','订单结算id'), +('mall4cloud-order-settlement-103','1','1000','订单结算id'), +('mall4cloud-order-settlement-104','1','1000','订单结算id'), +('mall4cloud-order-settlement-105','1','1000','订单结算id'), +('mall4cloud-order-settlement-106','1','1000','订单结算id'), +('mall4cloud-order-settlement-107','1','1000','订单结算id'), +('mall4cloud-order-settlement-108','1','1000','订单结算id'), +('mall4cloud-order-settlement-109','1','1000','订单结算id'), +('mall4cloud-order-settlement-110','1','1000','订单结算id'), +('mall4cloud-order-settlement-111','1','1000','订单结算id'), +('mall4cloud-order-settlement-112','1','1000','订单结算id'), +('mall4cloud-order-settlement-113','1','1000','订单结算id'), +('mall4cloud-order-settlement-114','1','1000','订单结算id'), +('mall4cloud-order-settlement-115','1','1000','订单结算id'), +('mall4cloud-order-settlement-116','1','1000','订单结算id'), +('mall4cloud-order-settlement-117','1','1000','订单结算id'), +('mall4cloud-order-settlement-118','1','1000','订单结算id'), +('mall4cloud-order-settlement-119','1','1000','订单结算id'), +('mall4cloud-order-settlement-120','1','1000','订单结算id'), +('mall4cloud-order-settlement-121','1','1000','订单结算id'), +('mall4cloud-order-settlement-122','1','1000','订单结算id'), +('mall4cloud-order-settlement-123','1','1000','订单结算id'), +('mall4cloud-order-settlement-124','1','1000','订单结算id'), +('mall4cloud-order-settlement-125','1','1000','订单结算id'), +('mall4cloud-order-settlement-126','1','1000','订单结算id'), +('mall4cloud-order-settlement-127','1','1000','订单结算id'), +('mall4cloud-order-settlement-128','1','1000','订单结算id'), +('mall4cloud-order-settlement-129','1','1000','订单结算id'), +('mall4cloud-order-settlement-130','1','1000','订单结算id'), +('mall4cloud-order-settlement-131','1','1000','订单结算id'), +('mall4cloud-order-settlement-132','1','1000','订单结算id'), +('mall4cloud-order-settlement-133','1','1000','订单结算id'), +('mall4cloud-order-settlement-134','1','1000','订单结算id'), +('mall4cloud-order-settlement-135','1','1000','订单结算id'), +('mall4cloud-order-settlement-136','1','1000','订单结算id'), +('mall4cloud-order-settlement-137','1','1000','订单结算id'), +('mall4cloud-order-settlement-138','1','1000','订单结算id'), +('mall4cloud-order-settlement-139','1','1000','订单结算id'), +('mall4cloud-order-settlement-140','1','1000','订单结算id'), +('mall4cloud-order-settlement-141','1','1000','订单结算id'), +('mall4cloud-order-settlement-142','1','1000','订单结算id'), +('mall4cloud-order-settlement-143','1','1000','订单结算id'), +('mall4cloud-order-settlement-144','1','1000','订单结算id'), +('mall4cloud-order-settlement-145','1','1000','订单结算id'), +('mall4cloud-order-settlement-146','1','1000','订单结算id'), +('mall4cloud-order-settlement-147','1','1000','订单结算id'), +('mall4cloud-order-settlement-148','1','1000','订单结算id'), +('mall4cloud-order-settlement-149','1','1000','订单结算id'), +('mall4cloud-order-settlement-150','1','1000','订单结算id'), +('mall4cloud-order-settlement-151','1','1000','订单结算id'), +('mall4cloud-order-settlement-152','1','1000','订单结算id'), +('mall4cloud-order-settlement-153','1','1000','订单结算id'), +('mall4cloud-order-settlement-154','1','1000','订单结算id'), +('mall4cloud-order-settlement-155','1','1000','订单结算id'), +('mall4cloud-order-settlement-156','1','1000','订单结算id'), +('mall4cloud-order-settlement-157','1','1000','订单结算id'), +('mall4cloud-order-settlement-158','1','1000','订单结算id'), +('mall4cloud-order-settlement-159','1','1000','订单结算id'), +('mall4cloud-order-settlement-160','1','1000','订单结算id'), +('mall4cloud-order-settlement-161','1','1000','订单结算id'), +('mall4cloud-order-settlement-162','1','1000','订单结算id'), +('mall4cloud-order-settlement-163','1','1000','订单结算id'), +('mall4cloud-order-settlement-164','1','1000','订单结算id'), +('mall4cloud-order-settlement-165','1','1000','订单结算id'), +('mall4cloud-order-settlement-166','1','1000','订单结算id'), +('mall4cloud-order-settlement-167','1','1000','订单结算id'), +('mall4cloud-order-settlement-168','1','1000','订单结算id'), +('mall4cloud-order-settlement-169','1','1000','订单结算id'), +('mall4cloud-order-settlement-170','1','1000','订单结算id'), +('mall4cloud-order-settlement-171','1','1000','订单结算id'), +('mall4cloud-order-settlement-172','1','1000','订单结算id'), +('mall4cloud-order-settlement-173','1','1000','订单结算id'), +('mall4cloud-order-settlement-174','1','1000','订单结算id'), +('mall4cloud-order-settlement-175','1','1000','订单结算id'), +('mall4cloud-order-settlement-176','1','1000','订单结算id'), +('mall4cloud-order-settlement-177','1','1000','订单结算id'), +('mall4cloud-order-settlement-178','1','1000','订单结算id'), +('mall4cloud-order-settlement-179','1','1000','订单结算id'), +('mall4cloud-order-settlement-180','1','1000','订单结算id'), +('mall4cloud-order-settlement-181','1','1000','订单结算id'), +('mall4cloud-order-settlement-182','1','1000','订单结算id'), +('mall4cloud-order-settlement-183','1','1000','订单结算id'), +('mall4cloud-order-settlement-184','1','1000','订单结算id'), +('mall4cloud-order-settlement-185','1','1000','订单结算id'), +('mall4cloud-order-settlement-186','1','1000','订单结算id'), +('mall4cloud-order-settlement-187','1','1000','订单结算id'), +('mall4cloud-order-settlement-188','1','1000','订单结算id'), +('mall4cloud-order-settlement-189','1','1000','订单结算id'), +('mall4cloud-order-settlement-190','1','1000','订单结算id'), +('mall4cloud-order-settlement-191','1','1000','订单结算id'), +('mall4cloud-order-settlement-192','1','1000','订单结算id'), +('mall4cloud-order-settlement-193','1','1000','订单结算id'), +('mall4cloud-order-settlement-194','1','1000','订单结算id'), +('mall4cloud-order-settlement-195','1','1000','订单结算id'), +('mall4cloud-order-settlement-196','1','1000','订单结算id'), +('mall4cloud-order-settlement-197','1','1000','订单结算id'), +('mall4cloud-order-settlement-198','1','1000','订单结算id'), +('mall4cloud-order-settlement-199','1','1000','订单结算id'), +('mall4cloud-order-settlement-200','1','1000','订单结算id'), +('mall4cloud-order-settlement-201','1','1000','订单结算id'), +('mall4cloud-order-settlement-202','1','1000','订单结算id'), +('mall4cloud-order-settlement-203','1','1000','订单结算id'), +('mall4cloud-order-settlement-204','1','1000','订单结算id'), +('mall4cloud-order-settlement-205','1','1000','订单结算id'), +('mall4cloud-order-settlement-206','1','1000','订单结算id'), +('mall4cloud-order-settlement-207','1','1000','订单结算id'), +('mall4cloud-order-settlement-208','1','1000','订单结算id'), +('mall4cloud-order-settlement-209','1','1000','订单结算id'), +('mall4cloud-order-settlement-210','1','1000','订单结算id'), +('mall4cloud-order-settlement-211','1','1000','订单结算id'), +('mall4cloud-order-settlement-212','1','1000','订单结算id'), +('mall4cloud-order-settlement-213','1','1000','订单结算id'), +('mall4cloud-order-settlement-214','1','1000','订单结算id'), +('mall4cloud-order-settlement-215','1','1000','订单结算id'), +('mall4cloud-order-settlement-216','1','1000','订单结算id'), +('mall4cloud-order-settlement-217','1','1000','订单结算id'), +('mall4cloud-order-settlement-218','1','1000','订单结算id'), +('mall4cloud-order-settlement-219','1','1000','订单结算id'), +('mall4cloud-order-settlement-220','1','1000','订单结算id'), +('mall4cloud-order-settlement-221','1','1000','订单结算id'), +('mall4cloud-order-settlement-222','1','1000','订单结算id'), +('mall4cloud-order-settlement-223','1','1000','订单结算id'), +('mall4cloud-order-settlement-224','1','1000','订单结算id'), +('mall4cloud-order-settlement-225','1','1000','订单结算id'), +('mall4cloud-order-settlement-226','1','1000','订单结算id'), +('mall4cloud-order-settlement-227','1','1000','订单结算id'), +('mall4cloud-order-settlement-228','1','1000','订单结算id'), +('mall4cloud-order-settlement-229','1','1000','订单结算id'), +('mall4cloud-order-settlement-230','1','1000','订单结算id'), +('mall4cloud-order-settlement-231','1','1000','订单结算id'), +('mall4cloud-order-settlement-232','1','1000','订单结算id'), +('mall4cloud-order-settlement-233','1','1000','订单结算id'), +('mall4cloud-order-settlement-234','1','1000','订单结算id'), +('mall4cloud-order-settlement-235','1','1000','订单结算id'), +('mall4cloud-order-settlement-236','1','1000','订单结算id'), +('mall4cloud-order-settlement-237','1','1000','订单结算id'), +('mall4cloud-order-settlement-238','1','1000','订单结算id'), +('mall4cloud-order-settlement-239','1','1000','订单结算id'), +('mall4cloud-order-settlement-240','1','1000','订单结算id'), +('mall4cloud-order-settlement-241','1','1000','订单结算id'), +('mall4cloud-order-settlement-242','1','1000','订单结算id'), +('mall4cloud-order-settlement-243','1','1000','订单结算id'), +('mall4cloud-order-settlement-244','1','1000','订单结算id'), +('mall4cloud-order-settlement-245','1','1000','订单结算id'), +('mall4cloud-order-settlement-246','1','1000','订单结算id'), +('mall4cloud-order-settlement-247','1','1000','订单结算id'), +('mall4cloud-order-settlement-248','1','1000','订单结算id'), +('mall4cloud-order-settlement-249','1','1000','订单结算id'), +('mall4cloud-order-settlement-250','1','1000','订单结算id'), +('mall4cloud-order-settlement-251','1','1000','订单结算id'), +('mall4cloud-order-settlement-252','1','1000','订单结算id'), +('mall4cloud-order-settlement-253','1','1000','订单结算id'), +('mall4cloud-order-settlement-254','1','1000','订单结算id'), +('mall4cloud-order-settlement-255','1','1000','订单结算id'), +('mall4cloud-order-settlement-256','1','1000','订单结算id'), +('mall4cloud-order-settlement-257','1','1000','订单结算id'), +('mall4cloud-order-settlement-258','1','1000','订单结算id'), +('mall4cloud-order-settlement-259','1','1000','订单结算id'), +('mall4cloud-order-settlement-260','1','1000','订单结算id'), +('mall4cloud-order-settlement-261','1','1000','订单结算id'), +('mall4cloud-order-settlement-262','1','1000','订单结算id'), +('mall4cloud-order-settlement-263','1','1000','订单结算id'), +('mall4cloud-order-settlement-264','1','1000','订单结算id'), +('mall4cloud-order-settlement-265','1','1000','订单结算id'), +('mall4cloud-order-settlement-266','1','1000','订单结算id'), +('mall4cloud-order-settlement-267','1','1000','订单结算id'), +('mall4cloud-order-settlement-268','1','1000','订单结算id'), +('mall4cloud-order-settlement-269','1','1000','订单结算id'), +('mall4cloud-order-settlement-270','1','1000','订单结算id'), +('mall4cloud-order-settlement-271','1','1000','订单结算id'), +('mall4cloud-order-settlement-272','1','1000','订单结算id'), +('mall4cloud-order-settlement-273','1','1000','订单结算id'), +('mall4cloud-order-settlement-274','1','1000','订单结算id'), +('mall4cloud-order-settlement-275','1','1000','订单结算id'), +('mall4cloud-order-settlement-276','1','1000','订单结算id'), +('mall4cloud-order-settlement-277','1','1000','订单结算id'), +('mall4cloud-order-settlement-278','1','1000','订单结算id'), +('mall4cloud-order-settlement-279','1','1000','订单结算id'), +('mall4cloud-order-settlement-280','1','1000','订单结算id'), +('mall4cloud-order-settlement-281','1','1000','订单结算id'), +('mall4cloud-order-settlement-282','1','1000','订单结算id'), +('mall4cloud-order-settlement-283','1','1000','订单结算id'), +('mall4cloud-order-settlement-284','1','1000','订单结算id'), +('mall4cloud-order-settlement-285','1','1000','订单结算id'), +('mall4cloud-order-settlement-286','1','1000','订单结算id'), +('mall4cloud-order-settlement-287','1','1000','订单结算id'), +('mall4cloud-order-settlement-288','1','1000','订单结算id'), +('mall4cloud-order-settlement-289','1','1000','订单结算id'), +('mall4cloud-order-settlement-290','1','1000','订单结算id'), +('mall4cloud-order-settlement-291','1','1000','订单结算id'), +('mall4cloud-order-settlement-292','1','1000','订单结算id'), +('mall4cloud-order-settlement-293','1','1000','订单结算id'), +('mall4cloud-order-settlement-294','1','1000','订单结算id'), +('mall4cloud-order-settlement-295','1','1000','订单结算id'), +('mall4cloud-order-settlement-296','1','1000','订单结算id'), +('mall4cloud-order-settlement-297','1','1000','订单结算id'), +('mall4cloud-order-settlement-298','1','1000','订单结算id'), +('mall4cloud-order-settlement-299','1','1000','订单结算id'), +('mall4cloud-order-settlement-300','1','1000','订单结算id'), +('mall4cloud-order-settlement-301','1','1000','订单结算id'), +('mall4cloud-order-settlement-302','1','1000','订单结算id'), +('mall4cloud-order-settlement-303','1','1000','订单结算id'), +('mall4cloud-order-settlement-304','1','1000','订单结算id'), +('mall4cloud-order-settlement-305','1','1000','订单结算id'), +('mall4cloud-order-settlement-306','1','1000','订单结算id'), +('mall4cloud-order-settlement-307','1','1000','订单结算id'), +('mall4cloud-order-settlement-308','1','1000','订单结算id'), +('mall4cloud-order-settlement-309','1','1000','订单结算id'), +('mall4cloud-order-settlement-310','1','1000','订单结算id'), +('mall4cloud-order-settlement-311','1','1000','订单结算id'), +('mall4cloud-order-settlement-312','1','1000','订单结算id'), +('mall4cloud-order-settlement-313','1','1000','订单结算id'), +('mall4cloud-order-settlement-314','1','1000','订单结算id'), +('mall4cloud-order-settlement-315','1','1000','订单结算id'), +('mall4cloud-order-settlement-316','1','1000','订单结算id'), +('mall4cloud-order-settlement-317','1','1000','订单结算id'), +('mall4cloud-order-settlement-318','1','1000','订单结算id'), +('mall4cloud-order-settlement-319','1','1000','订单结算id'), +('mall4cloud-order-settlement-320','1','1000','订单结算id'), +('mall4cloud-order-settlement-321','1','1000','订单结算id'), +('mall4cloud-order-settlement-322','1','1000','订单结算id'), +('mall4cloud-order-settlement-323','1','1000','订单结算id'), +('mall4cloud-order-settlement-324','1','1000','订单结算id'), +('mall4cloud-order-settlement-325','1','1000','订单结算id'), +('mall4cloud-order-settlement-326','1','1000','订单结算id'), +('mall4cloud-order-settlement-327','1','1000','订单结算id'), +('mall4cloud-order-settlement-328','1','1000','订单结算id'), +('mall4cloud-order-settlement-329','1','1000','订单结算id'), +('mall4cloud-order-settlement-330','1','1000','订单结算id'), +('mall4cloud-order-settlement-331','1','1000','订单结算id'), +('mall4cloud-order-settlement-332','1','1000','订单结算id'), +('mall4cloud-order-settlement-333','1','1000','订单结算id'), +('mall4cloud-order-settlement-334','1','1000','订单结算id'), +('mall4cloud-order-settlement-335','1','1000','订单结算id'), +('mall4cloud-order-settlement-336','1','1000','订单结算id'), +('mall4cloud-order-settlement-337','1','1000','订单结算id'), +('mall4cloud-order-settlement-338','1','1000','订单结算id'), +('mall4cloud-order-settlement-339','1','1000','订单结算id'), +('mall4cloud-order-settlement-340','1','1000','订单结算id'), +('mall4cloud-order-settlement-341','1','1000','订单结算id'), +('mall4cloud-order-settlement-342','1','1000','订单结算id'), +('mall4cloud-order-settlement-343','1','1000','订单结算id'), +('mall4cloud-order-settlement-344','1','1000','订单结算id'), +('mall4cloud-order-settlement-345','1','1000','订单结算id'), +('mall4cloud-order-settlement-346','1','1000','订单结算id'), +('mall4cloud-order-settlement-347','1','1000','订单结算id'), +('mall4cloud-order-settlement-348','1','1000','订单结算id'), +('mall4cloud-order-settlement-349','1','1000','订单结算id'), +('mall4cloud-order-settlement-350','1','1000','订单结算id'), +('mall4cloud-order-settlement-351','1','1000','订单结算id'), +('mall4cloud-order-settlement-352','1','1000','订单结算id'), +('mall4cloud-order-settlement-353','1','1000','订单结算id'), +('mall4cloud-order-settlement-354','1','1000','订单结算id'), +('mall4cloud-order-settlement-355','1','1000','订单结算id'), +('mall4cloud-order-settlement-356','1','1000','订单结算id'), +('mall4cloud-order-settlement-357','1','1000','订单结算id'), +('mall4cloud-order-settlement-358','1','1000','订单结算id'), +('mall4cloud-order-settlement-359','1','1000','订单结算id'), +('mall4cloud-order-settlement-360','1','1000','订单结算id'), +('mall4cloud-order-settlement-361','1','1000','订单结算id'), +('mall4cloud-order-settlement-362','1','1000','订单结算id'), +('mall4cloud-order-settlement-363','1','1000','订单结算id'), +('mall4cloud-order-settlement-364','1','1000','订单结算id'), +('mall4cloud-order-settlement-365','1','1000','订单结算id'), +('mall4cloud-order-settlement-366','1','1000','订单结算id'), +('mall4cloud-order-settlement-367','1','1000','订单结算id'), +('mall4cloud-order-settlement-368','1','1000','订单结算id'), +('mall4cloud-order-settlement-369','1','1000','订单结算id'), +('mall4cloud-order-settlement-370','1','1000','订单结算id'), +('mall4cloud-order-settlement-371','1','1000','订单结算id'), +('mall4cloud-order-settlement-372','1','1000','订单结算id'), +('mall4cloud-order-settlement-373','1','1000','订单结算id'), +('mall4cloud-order-settlement-374','1','1000','订单结算id'), +('mall4cloud-order-settlement-375','1','1000','订单结算id'), +('mall4cloud-order-settlement-376','1','1000','订单结算id'), +('mall4cloud-order-settlement-377','1','1000','订单结算id'), +('mall4cloud-order-settlement-378','1','1000','订单结算id'), +('mall4cloud-order-settlement-379','1','1000','订单结算id'), +('mall4cloud-order-settlement-380','1','1000','订单结算id'), +('mall4cloud-order-settlement-381','1','1000','订单结算id'), +('mall4cloud-order-settlement-382','1','1000','订单结算id'), +('mall4cloud-order-settlement-383','1','1000','订单结算id'), +('mall4cloud-order-settlement-384','1','1000','订单结算id'), +('mall4cloud-order-settlement-385','1','1000','订单结算id'), +('mall4cloud-order-settlement-386','1','1000','订单结算id'), +('mall4cloud-order-settlement-387','1','1000','订单结算id'), +('mall4cloud-order-settlement-388','1','1000','订单结算id'), +('mall4cloud-order-settlement-389','1','1000','订单结算id'), +('mall4cloud-order-settlement-390','1','1000','订单结算id'), +('mall4cloud-order-settlement-391','1','1000','订单结算id'), +('mall4cloud-order-settlement-392','1','1000','订单结算id'), +('mall4cloud-order-settlement-393','1','1000','订单结算id'), +('mall4cloud-order-settlement-394','1','1000','订单结算id'), +('mall4cloud-order-settlement-395','1','1000','订单结算id'), +('mall4cloud-order-settlement-396','1','1000','订单结算id'), +('mall4cloud-order-settlement-397','1','1000','订单结算id'), +('mall4cloud-order-settlement-398','1','1000','订单结算id'), +('mall4cloud-order-settlement-399','1','1000','订单结算id'), +('mall4cloud-order-settlement-400','1','1000','订单结算id'), +('mall4cloud-order-settlement-401','1','1000','订单结算id'), +('mall4cloud-order-settlement-402','1','1000','订单结算id'), +('mall4cloud-order-settlement-403','1','1000','订单结算id'), +('mall4cloud-order-settlement-404','1','1000','订单结算id'), +('mall4cloud-order-settlement-405','1','1000','订单结算id'), +('mall4cloud-order-settlement-406','1','1000','订单结算id'), +('mall4cloud-order-settlement-407','1','1000','订单结算id'), +('mall4cloud-order-settlement-408','1','1000','订单结算id'), +('mall4cloud-order-settlement-409','1','1000','订单结算id'), +('mall4cloud-order-settlement-410','1','1000','订单结算id'), +('mall4cloud-order-settlement-411','1','1000','订单结算id'), +('mall4cloud-order-settlement-412','1','1000','订单结算id'), +('mall4cloud-order-settlement-413','1','1000','订单结算id'), +('mall4cloud-order-settlement-414','1','1000','订单结算id'), +('mall4cloud-order-settlement-415','1','1000','订单结算id'), +('mall4cloud-order-settlement-416','1','1000','订单结算id'), +('mall4cloud-order-settlement-417','1','1000','订单结算id'), +('mall4cloud-order-settlement-418','1','1000','订单结算id'), +('mall4cloud-order-settlement-419','1','1000','订单结算id'), +('mall4cloud-order-settlement-420','1','1000','订单结算id'), +('mall4cloud-order-settlement-421','1','1000','订单结算id'), +('mall4cloud-order-settlement-422','1','1000','订单结算id'), +('mall4cloud-order-settlement-423','1','1000','订单结算id'), +('mall4cloud-order-settlement-424','1','1000','订单结算id'), +('mall4cloud-order-settlement-425','1','1000','订单结算id'), +('mall4cloud-order-settlement-426','1','1000','订单结算id'), +('mall4cloud-order-settlement-427','1','1000','订单结算id'), +('mall4cloud-order-settlement-428','1','1000','订单结算id'), +('mall4cloud-order-settlement-429','1','1000','订单结算id'), +('mall4cloud-order-settlement-430','1','1000','订单结算id'), +('mall4cloud-order-settlement-431','1','1000','订单结算id'), +('mall4cloud-order-settlement-432','1','1000','订单结算id'), +('mall4cloud-order-settlement-433','1','1000','订单结算id'), +('mall4cloud-order-settlement-434','1','1000','订单结算id'), +('mall4cloud-order-settlement-435','1','1000','订单结算id'), +('mall4cloud-order-settlement-436','1','1000','订单结算id'), +('mall4cloud-order-settlement-437','1','1000','订单结算id'), +('mall4cloud-order-settlement-438','1','1000','订单结算id'), +('mall4cloud-order-settlement-439','1','1000','订单结算id'), +('mall4cloud-order-settlement-440','1','1000','订单结算id'), +('mall4cloud-order-settlement-441','1','1000','订单结算id'), +('mall4cloud-order-settlement-442','1','1000','订单结算id'), +('mall4cloud-order-settlement-443','1','1000','订单结算id'), +('mall4cloud-order-settlement-444','1','1000','订单结算id'), +('mall4cloud-order-settlement-445','1','1000','订单结算id'), +('mall4cloud-order-settlement-446','1','1000','订单结算id'), +('mall4cloud-order-settlement-447','1','1000','订单结算id'), +('mall4cloud-order-settlement-448','1','1000','订单结算id'), +('mall4cloud-order-settlement-449','1','1000','订单结算id'), +('mall4cloud-order-settlement-450','1','1000','订单结算id'), +('mall4cloud-order-settlement-451','1','1000','订单结算id'), +('mall4cloud-order-settlement-452','1','1000','订单结算id'), +('mall4cloud-order-settlement-453','1','1000','订单结算id'), +('mall4cloud-order-settlement-454','1','1000','订单结算id'), +('mall4cloud-order-settlement-455','1','1000','订单结算id'), +('mall4cloud-order-settlement-456','1','1000','订单结算id'), +('mall4cloud-order-settlement-457','1','1000','订单结算id'), +('mall4cloud-order-settlement-458','1','1000','订单结算id'), +('mall4cloud-order-settlement-459','1','1000','订单结算id'), +('mall4cloud-order-settlement-460','1','1000','订单结算id'), +('mall4cloud-order-settlement-461','1','1000','订单结算id'), +('mall4cloud-order-settlement-462','1','1000','订单结算id'), +('mall4cloud-order-settlement-463','1','1000','订单结算id'), +('mall4cloud-order-settlement-464','1','1000','订单结算id'), +('mall4cloud-order-settlement-465','1','1000','订单结算id'), +('mall4cloud-order-settlement-466','1','1000','订单结算id'), +('mall4cloud-order-settlement-467','1','1000','订单结算id'), +('mall4cloud-order-settlement-468','1','1000','订单结算id'), +('mall4cloud-order-settlement-469','1','1000','订单结算id'), +('mall4cloud-order-settlement-470','1','1000','订单结算id'), +('mall4cloud-order-settlement-471','1','1000','订单结算id'), +('mall4cloud-order-settlement-472','1','1000','订单结算id'), +('mall4cloud-order-settlement-473','1','1000','订单结算id'), +('mall4cloud-order-settlement-474','1','1000','订单结算id'), +('mall4cloud-order-settlement-475','1','1000','订单结算id'), +('mall4cloud-order-settlement-476','1','1000','订单结算id'), +('mall4cloud-order-settlement-477','1','1000','订单结算id'), +('mall4cloud-order-settlement-478','1','1000','订单结算id'), +('mall4cloud-order-settlement-479','1','1000','订单结算id'), +('mall4cloud-order-settlement-480','1','1000','订单结算id'), +('mall4cloud-order-settlement-481','1','1000','订单结算id'), +('mall4cloud-order-settlement-482','1','1000','订单结算id'), +('mall4cloud-order-settlement-483','1','1000','订单结算id'), +('mall4cloud-order-settlement-484','1','1000','订单结算id'), +('mall4cloud-order-settlement-485','1','1000','订单结算id'), +('mall4cloud-order-settlement-486','1','1000','订单结算id'), +('mall4cloud-order-settlement-487','1','1000','订单结算id'), +('mall4cloud-order-settlement-488','1','1000','订单结算id'), +('mall4cloud-order-settlement-489','1','1000','订单结算id'), +('mall4cloud-order-settlement-490','1','1000','订单结算id'), +('mall4cloud-order-settlement-491','1','1000','订单结算id'), +('mall4cloud-order-settlement-492','1','1000','订单结算id'), +('mall4cloud-order-settlement-493','1','1000','订单结算id'), +('mall4cloud-order-settlement-494','1','1000','订单结算id'), +('mall4cloud-order-settlement-495','1','1000','订单结算id'), +('mall4cloud-order-settlement-496','1','1000','订单结算id'), +('mall4cloud-order-settlement-497','1','1000','订单结算id'), +('mall4cloud-order-settlement-498','1','1000','订单结算id'), +('mall4cloud-order-settlement-499','1','1000','订单结算id'), +('mall4cloud-order-settlement-500','1','1000','订单结算id'), +('mall4cloud-order-settlement-501','1','1000','订单结算id'), +('mall4cloud-order-settlement-502','1','1000','订单结算id'), +('mall4cloud-order-settlement-503','1','1000','订单结算id'), +('mall4cloud-order-settlement-504','1','1000','订单结算id'), +('mall4cloud-order-settlement-505','1','1000','订单结算id'), +('mall4cloud-order-settlement-506','1','1000','订单结算id'), +('mall4cloud-order-settlement-507','1','1000','订单结算id'), +('mall4cloud-order-settlement-508','1','1000','订单结算id'), +('mall4cloud-order-settlement-509','1','1000','订单结算id'), +('mall4cloud-order-settlement-510','1','1000','订单结算id'), +('mall4cloud-order-settlement-511','1','1000','订单结算id'), +('mall4cloud-order-settlement-512','1','1000','订单结算id'), +('mall4cloud-order-settlement-513','1','1000','订单结算id'), +('mall4cloud-order-settlement-514','1','1000','订单结算id'), +('mall4cloud-order-settlement-515','1','1000','订单结算id'), +('mall4cloud-order-settlement-516','1','1000','订单结算id'), +('mall4cloud-order-settlement-517','1','1000','订单结算id'), +('mall4cloud-order-settlement-518','1','1000','订单结算id'), +('mall4cloud-order-settlement-519','1','1000','订单结算id'), +('mall4cloud-order-settlement-520','1','1000','订单结算id'), +('mall4cloud-order-settlement-521','1','1000','订单结算id'), +('mall4cloud-order-settlement-522','1','1000','订单结算id'), +('mall4cloud-order-settlement-523','1','1000','订单结算id'), +('mall4cloud-order-settlement-524','1','1000','订单结算id'), +('mall4cloud-order-settlement-525','1','1000','订单结算id'), +('mall4cloud-order-settlement-526','1','1000','订单结算id'), +('mall4cloud-order-settlement-527','1','1000','订单结算id'), +('mall4cloud-order-settlement-528','1','1000','订单结算id'), +('mall4cloud-order-settlement-529','1','1000','订单结算id'), +('mall4cloud-order-settlement-530','1','1000','订单结算id'), +('mall4cloud-order-settlement-531','1','1000','订单结算id'), +('mall4cloud-order-settlement-532','1','1000','订单结算id'), +('mall4cloud-order-settlement-533','1','1000','订单结算id'), +('mall4cloud-order-settlement-534','1','1000','订单结算id'), +('mall4cloud-order-settlement-535','1','1000','订单结算id'), +('mall4cloud-order-settlement-536','1','1000','订单结算id'), +('mall4cloud-order-settlement-537','1','1000','订单结算id'), +('mall4cloud-order-settlement-538','1','1000','订单结算id'), +('mall4cloud-order-settlement-539','1','1000','订单结算id'), +('mall4cloud-order-settlement-540','1','1000','订单结算id'), +('mall4cloud-order-settlement-541','1','1000','订单结算id'), +('mall4cloud-order-settlement-542','1','1000','订单结算id'), +('mall4cloud-order-settlement-543','1','1000','订单结算id'), +('mall4cloud-order-settlement-544','1','1000','订单结算id'), +('mall4cloud-order-settlement-545','1','1000','订单结算id'), +('mall4cloud-order-settlement-546','1','1000','订单结算id'), +('mall4cloud-order-settlement-547','1','1000','订单结算id'), +('mall4cloud-order-settlement-548','1','1000','订单结算id'), +('mall4cloud-order-settlement-549','1','1000','订单结算id'), +('mall4cloud-order-settlement-550','1','1000','订单结算id'), +('mall4cloud-order-settlement-551','1','1000','订单结算id'), +('mall4cloud-order-settlement-552','1','1000','订单结算id'), +('mall4cloud-order-settlement-553','1','1000','订单结算id'), +('mall4cloud-order-settlement-554','1','1000','订单结算id'), +('mall4cloud-order-settlement-555','1','1000','订单结算id'), +('mall4cloud-order-settlement-556','1','1000','订单结算id'), +('mall4cloud-order-settlement-557','1','1000','订单结算id'), +('mall4cloud-order-settlement-558','1','1000','订单结算id'), +('mall4cloud-order-settlement-559','1','1000','订单结算id'), +('mall4cloud-order-settlement-560','1','1000','订单结算id'), +('mall4cloud-order-settlement-561','1','1000','订单结算id'), +('mall4cloud-order-settlement-562','1','1000','订单结算id'), +('mall4cloud-order-settlement-563','1','1000','订单结算id'), +('mall4cloud-order-settlement-564','1','1000','订单结算id'), +('mall4cloud-order-settlement-565','1','1000','订单结算id'), +('mall4cloud-order-settlement-566','1','1000','订单结算id'), +('mall4cloud-order-settlement-567','1','1000','订单结算id'), +('mall4cloud-order-settlement-568','1','1000','订单结算id'), +('mall4cloud-order-settlement-569','1','1000','订单结算id'), +('mall4cloud-order-settlement-570','1','1000','订单结算id'), +('mall4cloud-order-settlement-571','1','1000','订单结算id'), +('mall4cloud-order-settlement-572','1','1000','订单结算id'), +('mall4cloud-order-settlement-573','1','1000','订单结算id'), +('mall4cloud-order-settlement-574','1','1000','订单结算id'), +('mall4cloud-order-settlement-575','1','1000','订单结算id'), +('mall4cloud-order-settlement-576','1','1000','订单结算id'), +('mall4cloud-order-settlement-577','1','1000','订单结算id'), +('mall4cloud-order-settlement-578','1','1000','订单结算id'), +('mall4cloud-order-settlement-579','1','1000','订单结算id'), +('mall4cloud-order-settlement-580','1','1000','订单结算id'), +('mall4cloud-order-settlement-581','1','1000','订单结算id'), +('mall4cloud-order-settlement-582','1','1000','订单结算id'), +('mall4cloud-order-settlement-583','1','1000','订单结算id'), +('mall4cloud-order-settlement-584','1','1000','订单结算id'), +('mall4cloud-order-settlement-585','1','1000','订单结算id'), +('mall4cloud-order-settlement-586','1','1000','订单结算id'), +('mall4cloud-order-settlement-587','1','1000','订单结算id'), +('mall4cloud-order-settlement-588','1','1000','订单结算id'), +('mall4cloud-order-settlement-589','1','1000','订单结算id'), +('mall4cloud-order-settlement-590','1','1000','订单结算id'), +('mall4cloud-order-settlement-591','1','1000','订单结算id'), +('mall4cloud-order-settlement-592','1','1000','订单结算id'), +('mall4cloud-order-settlement-593','1','1000','订单结算id'), +('mall4cloud-order-settlement-594','1','1000','订单结算id'), +('mall4cloud-order-settlement-595','1','1000','订单结算id'), +('mall4cloud-order-settlement-596','1','1000','订单结算id'), +('mall4cloud-order-settlement-597','1','1000','订单结算id'), +('mall4cloud-order-settlement-598','1','1000','订单结算id'), +('mall4cloud-order-settlement-599','1','1000','订单结算id'), +('mall4cloud-order-settlement-600','1','1000','订单结算id'), +('mall4cloud-order-settlement-601','1','1000','订单结算id'), +('mall4cloud-order-settlement-602','1','1000','订单结算id'), +('mall4cloud-order-settlement-603','1','1000','订单结算id'), +('mall4cloud-order-settlement-604','1','1000','订单结算id'), +('mall4cloud-order-settlement-605','1','1000','订单结算id'), +('mall4cloud-order-settlement-606','1','1000','订单结算id'), +('mall4cloud-order-settlement-607','1','1000','订单结算id'), +('mall4cloud-order-settlement-608','1','1000','订单结算id'), +('mall4cloud-order-settlement-609','1','1000','订单结算id'), +('mall4cloud-order-settlement-610','1','1000','订单结算id'), +('mall4cloud-order-settlement-611','1','1000','订单结算id'), +('mall4cloud-order-settlement-612','1','1000','订单结算id'), +('mall4cloud-order-settlement-613','1','1000','订单结算id'), +('mall4cloud-order-settlement-614','1','1000','订单结算id'), +('mall4cloud-order-settlement-615','1','1000','订单结算id'), +('mall4cloud-order-settlement-616','1','1000','订单结算id'), +('mall4cloud-order-settlement-617','1','1000','订单结算id'), +('mall4cloud-order-settlement-618','1','1000','订单结算id'), +('mall4cloud-order-settlement-619','1','1000','订单结算id'), +('mall4cloud-order-settlement-620','1','1000','订单结算id'), +('mall4cloud-order-settlement-621','1','1000','订单结算id'), +('mall4cloud-order-settlement-622','1','1000','订单结算id'), +('mall4cloud-order-settlement-623','1','1000','订单结算id'), +('mall4cloud-order-settlement-624','1','1000','订单结算id'), +('mall4cloud-order-settlement-625','1','1000','订单结算id'), +('mall4cloud-order-settlement-626','1','1000','订单结算id'), +('mall4cloud-order-settlement-627','1','1000','订单结算id'), +('mall4cloud-order-settlement-628','1','1000','订单结算id'), +('mall4cloud-order-settlement-629','1','1000','订单结算id'), +('mall4cloud-order-settlement-630','1','1000','订单结算id'), +('mall4cloud-order-settlement-631','1','1000','订单结算id'), +('mall4cloud-order-settlement-632','1','1000','订单结算id'), +('mall4cloud-order-settlement-633','1','1000','订单结算id'), +('mall4cloud-order-settlement-634','1','1000','订单结算id'), +('mall4cloud-order-settlement-635','1','1000','订单结算id'), +('mall4cloud-order-settlement-636','1','1000','订单结算id'), +('mall4cloud-order-settlement-637','1','1000','订单结算id'), +('mall4cloud-order-settlement-638','1','1000','订单结算id'), +('mall4cloud-order-settlement-639','1','1000','订单结算id'), +('mall4cloud-order-settlement-640','1','1000','订单结算id'), +('mall4cloud-order-settlement-641','1','1000','订单结算id'), +('mall4cloud-order-settlement-642','1','1000','订单结算id'), +('mall4cloud-order-settlement-643','1','1000','订单结算id'), +('mall4cloud-order-settlement-644','1','1000','订单结算id'), +('mall4cloud-order-settlement-645','1','1000','订单结算id'), +('mall4cloud-order-settlement-646','1','1000','订单结算id'), +('mall4cloud-order-settlement-647','1','1000','订单结算id'), +('mall4cloud-order-settlement-648','1','1000','订单结算id'), +('mall4cloud-order-settlement-649','1','1000','订单结算id'), +('mall4cloud-order-settlement-650','1','1000','订单结算id'), +('mall4cloud-order-settlement-651','1','1000','订单结算id'), +('mall4cloud-order-settlement-652','1','1000','订单结算id'), +('mall4cloud-order-settlement-653','1','1000','订单结算id'), +('mall4cloud-order-settlement-654','1','1000','订单结算id'), +('mall4cloud-order-settlement-655','1','1000','订单结算id'), +('mall4cloud-order-settlement-656','1','1000','订单结算id'), +('mall4cloud-order-settlement-657','1','1000','订单结算id'), +('mall4cloud-order-settlement-658','1','1000','订单结算id'), +('mall4cloud-order-settlement-659','1','1000','订单结算id'), +('mall4cloud-order-settlement-660','1','1000','订单结算id'), +('mall4cloud-order-settlement-661','1','1000','订单结算id'), +('mall4cloud-order-settlement-662','1','1000','订单结算id'), +('mall4cloud-order-settlement-663','1','1000','订单结算id'), +('mall4cloud-order-settlement-664','1','1000','订单结算id'), +('mall4cloud-order-settlement-665','1','1000','订单结算id'), +('mall4cloud-order-settlement-666','1','1000','订单结算id'), +('mall4cloud-order-settlement-667','1','1000','订单结算id'), +('mall4cloud-order-settlement-668','1','1000','订单结算id'), +('mall4cloud-order-settlement-669','1','1000','订单结算id'), +('mall4cloud-order-settlement-670','1','1000','订单结算id'), +('mall4cloud-order-settlement-671','1','1000','订单结算id'), +('mall4cloud-order-settlement-672','1','1000','订单结算id'), +('mall4cloud-order-settlement-673','1','1000','订单结算id'), +('mall4cloud-order-settlement-674','1','1000','订单结算id'), +('mall4cloud-order-settlement-675','1','1000','订单结算id'), +('mall4cloud-order-settlement-676','1','1000','订单结算id'), +('mall4cloud-order-settlement-677','1','1000','订单结算id'), +('mall4cloud-order-settlement-678','1','1000','订单结算id'), +('mall4cloud-order-settlement-679','1','1000','订单结算id'), +('mall4cloud-order-settlement-680','1','1000','订单结算id'), +('mall4cloud-order-settlement-681','1','1000','订单结算id'), +('mall4cloud-order-settlement-682','1','1000','订单结算id'), +('mall4cloud-order-settlement-683','1','1000','订单结算id'), +('mall4cloud-order-settlement-684','1','1000','订单结算id'), +('mall4cloud-order-settlement-685','1','1000','订单结算id'), +('mall4cloud-order-settlement-686','1','1000','订单结算id'), +('mall4cloud-order-settlement-687','1','1000','订单结算id'), +('mall4cloud-order-settlement-688','1','1000','订单结算id'), +('mall4cloud-order-settlement-689','1','1000','订单结算id'), +('mall4cloud-order-settlement-690','1','1000','订单结算id'), +('mall4cloud-order-settlement-691','1','1000','订单结算id'), +('mall4cloud-order-settlement-692','1','1000','订单结算id'), +('mall4cloud-order-settlement-693','1','1000','订单结算id'), +('mall4cloud-order-settlement-694','1','1000','订单结算id'), +('mall4cloud-order-settlement-695','1','1000','订单结算id'), +('mall4cloud-order-settlement-696','1','1000','订单结算id'), +('mall4cloud-order-settlement-697','1','1000','订单结算id'), +('mall4cloud-order-settlement-698','1','1000','订单结算id'), +('mall4cloud-order-settlement-699','1','1000','订单结算id'), +('mall4cloud-order-settlement-700','1','1000','订单结算id'), +('mall4cloud-order-settlement-701','1','1000','订单结算id'), +('mall4cloud-order-settlement-702','1','1000','订单结算id'), +('mall4cloud-order-settlement-703','1','1000','订单结算id'), +('mall4cloud-order-settlement-704','1','1000','订单结算id'), +('mall4cloud-order-settlement-705','1','1000','订单结算id'), +('mall4cloud-order-settlement-706','1','1000','订单结算id'), +('mall4cloud-order-settlement-707','1','1000','订单结算id'), +('mall4cloud-order-settlement-708','1','1000','订单结算id'), +('mall4cloud-order-settlement-709','1','1000','订单结算id'), +('mall4cloud-order-settlement-710','1','1000','订单结算id'), +('mall4cloud-order-settlement-711','1','1000','订单结算id'), +('mall4cloud-order-settlement-712','1','1000','订单结算id'), +('mall4cloud-order-settlement-713','1','1000','订单结算id'), +('mall4cloud-order-settlement-714','1','1000','订单结算id'), +('mall4cloud-order-settlement-715','1','1000','订单结算id'), +('mall4cloud-order-settlement-716','1','1000','订单结算id'), +('mall4cloud-order-settlement-717','1','1000','订单结算id'), +('mall4cloud-order-settlement-718','1','1000','订单结算id'), +('mall4cloud-order-settlement-719','1','1000','订单结算id'), +('mall4cloud-order-settlement-720','1','1000','订单结算id'), +('mall4cloud-order-settlement-721','1','1000','订单结算id'), +('mall4cloud-order-settlement-722','1','1000','订单结算id'), +('mall4cloud-order-settlement-723','1','1000','订单结算id'), +('mall4cloud-order-settlement-724','1','1000','订单结算id'), +('mall4cloud-order-settlement-725','1','1000','订单结算id'), +('mall4cloud-order-settlement-726','1','1000','订单结算id'), +('mall4cloud-order-settlement-727','1','1000','订单结算id'), +('mall4cloud-order-settlement-728','1','1000','订单结算id'), +('mall4cloud-order-settlement-729','1','1000','订单结算id'), +('mall4cloud-order-settlement-730','1','1000','订单结算id'), +('mall4cloud-order-settlement-731','1','1000','订单结算id'), +('mall4cloud-order-settlement-732','1','1000','订单结算id'), +('mall4cloud-order-settlement-733','1','1000','订单结算id'), +('mall4cloud-order-settlement-734','1','1000','订单结算id'), +('mall4cloud-order-settlement-735','1','1000','订单结算id'), +('mall4cloud-order-settlement-736','1','1000','订单结算id'), +('mall4cloud-order-settlement-737','1','1000','订单结算id'), +('mall4cloud-order-settlement-738','1','1000','订单结算id'), +('mall4cloud-order-settlement-739','1','1000','订单结算id'), +('mall4cloud-order-settlement-740','1','1000','订单结算id'), +('mall4cloud-order-settlement-741','1','1000','订单结算id'), +('mall4cloud-order-settlement-742','1','1000','订单结算id'), +('mall4cloud-order-settlement-743','1','1000','订单结算id'), +('mall4cloud-order-settlement-744','1','1000','订单结算id'), +('mall4cloud-order-settlement-745','1','1000','订单结算id'), +('mall4cloud-order-settlement-746','1','1000','订单结算id'), +('mall4cloud-order-settlement-747','1','1000','订单结算id'), +('mall4cloud-order-settlement-748','1','1000','订单结算id'), +('mall4cloud-order-settlement-749','1','1000','订单结算id'), +('mall4cloud-order-settlement-750','1','1000','订单结算id'), +('mall4cloud-order-settlement-751','1','1000','订单结算id'), +('mall4cloud-order-settlement-752','1','1000','订单结算id'), +('mall4cloud-order-settlement-753','1','1000','订单结算id'), +('mall4cloud-order-settlement-754','1','1000','订单结算id'), +('mall4cloud-order-settlement-755','1','1000','订单结算id'), +('mall4cloud-order-settlement-756','1','1000','订单结算id'), +('mall4cloud-order-settlement-757','1','1000','订单结算id'), +('mall4cloud-order-settlement-758','1','1000','订单结算id'), +('mall4cloud-order-settlement-759','1','1000','订单结算id'), +('mall4cloud-order-settlement-760','1','1000','订单结算id'), +('mall4cloud-order-settlement-761','1','1000','订单结算id'), +('mall4cloud-order-settlement-762','1','1000','订单结算id'), +('mall4cloud-order-settlement-763','1','1000','订单结算id'), +('mall4cloud-order-settlement-764','1','1000','订单结算id'), +('mall4cloud-order-settlement-765','1','1000','订单结算id'), +('mall4cloud-order-settlement-766','1','1000','订单结算id'), +('mall4cloud-order-settlement-767','1','1000','订单结算id'), +('mall4cloud-order-settlement-768','1','1000','订单结算id'), +('mall4cloud-order-settlement-769','1','1000','订单结算id'), +('mall4cloud-order-settlement-770','1','1000','订单结算id'), +('mall4cloud-order-settlement-771','1','1000','订单结算id'), +('mall4cloud-order-settlement-772','1','1000','订单结算id'), +('mall4cloud-order-settlement-773','1','1000','订单结算id'), +('mall4cloud-order-settlement-774','1','1000','订单结算id'), +('mall4cloud-order-settlement-775','1','1000','订单结算id'), +('mall4cloud-order-settlement-776','1','1000','订单结算id'), +('mall4cloud-order-settlement-777','1','1000','订单结算id'), +('mall4cloud-order-settlement-778','1','1000','订单结算id'), +('mall4cloud-order-settlement-779','1','1000','订单结算id'), +('mall4cloud-order-settlement-780','1','1000','订单结算id'), +('mall4cloud-order-settlement-781','1','1000','订单结算id'), +('mall4cloud-order-settlement-782','1','1000','订单结算id'), +('mall4cloud-order-settlement-783','1','1000','订单结算id'), +('mall4cloud-order-settlement-784','1','1000','订单结算id'), +('mall4cloud-order-settlement-785','1','1000','订单结算id'), +('mall4cloud-order-settlement-786','1','1000','订单结算id'), +('mall4cloud-order-settlement-787','1','1000','订单结算id'), +('mall4cloud-order-settlement-788','1','1000','订单结算id'), +('mall4cloud-order-settlement-789','1','1000','订单结算id'), +('mall4cloud-order-settlement-790','1','1000','订单结算id'), +('mall4cloud-order-settlement-791','1','1000','订单结算id'), +('mall4cloud-order-settlement-792','1','1000','订单结算id'), +('mall4cloud-order-settlement-793','1','1000','订单结算id'), +('mall4cloud-order-settlement-794','1','1000','订单结算id'), +('mall4cloud-order-settlement-795','1','1000','订单结算id'), +('mall4cloud-order-settlement-796','1','1000','订单结算id'), +('mall4cloud-order-settlement-797','1','1000','订单结算id'), +('mall4cloud-order-settlement-798','1','1000','订单结算id'), +('mall4cloud-order-settlement-799','1','1000','订单结算id'), +('mall4cloud-order-settlement-800','1','1000','订单结算id'), +('mall4cloud-order-settlement-801','1','1000','订单结算id'), +('mall4cloud-order-settlement-802','1','1000','订单结算id'), +('mall4cloud-order-settlement-803','1','1000','订单结算id'), +('mall4cloud-order-settlement-804','1','1000','订单结算id'), +('mall4cloud-order-settlement-805','1','1000','订单结算id'), +('mall4cloud-order-settlement-806','1','1000','订单结算id'), +('mall4cloud-order-settlement-807','1','1000','订单结算id'), +('mall4cloud-order-settlement-808','1','1000','订单结算id'), +('mall4cloud-order-settlement-809','1','1000','订单结算id'), +('mall4cloud-order-settlement-810','1','1000','订单结算id'), +('mall4cloud-order-settlement-811','1','1000','订单结算id'), +('mall4cloud-order-settlement-812','1','1000','订单结算id'), +('mall4cloud-order-settlement-813','1','1000','订单结算id'), +('mall4cloud-order-settlement-814','1','1000','订单结算id'), +('mall4cloud-order-settlement-815','1','1000','订单结算id'), +('mall4cloud-order-settlement-816','1','1000','订单结算id'), +('mall4cloud-order-settlement-817','1','1000','订单结算id'), +('mall4cloud-order-settlement-818','1','1000','订单结算id'), +('mall4cloud-order-settlement-819','1','1000','订单结算id'), +('mall4cloud-order-settlement-820','1','1000','订单结算id'), +('mall4cloud-order-settlement-821','1','1000','订单结算id'), +('mall4cloud-order-settlement-822','1','1000','订单结算id'), +('mall4cloud-order-settlement-823','1','1000','订单结算id'), +('mall4cloud-order-settlement-824','1','1000','订单结算id'), +('mall4cloud-order-settlement-825','1','1000','订单结算id'), +('mall4cloud-order-settlement-826','1','1000','订单结算id'), +('mall4cloud-order-settlement-827','1','1000','订单结算id'), +('mall4cloud-order-settlement-828','1','1000','订单结算id'), +('mall4cloud-order-settlement-829','1','1000','订单结算id'), +('mall4cloud-order-settlement-830','1','1000','订单结算id'), +('mall4cloud-order-settlement-831','1','1000','订单结算id'), +('mall4cloud-order-settlement-832','1','1000','订单结算id'), +('mall4cloud-order-settlement-833','1','1000','订单结算id'), +('mall4cloud-order-settlement-834','1','1000','订单结算id'), +('mall4cloud-order-settlement-835','1','1000','订单结算id'), +('mall4cloud-order-settlement-836','1','1000','订单结算id'), +('mall4cloud-order-settlement-837','1','1000','订单结算id'), +('mall4cloud-order-settlement-838','1','1000','订单结算id'), +('mall4cloud-order-settlement-839','1','1000','订单结算id'), +('mall4cloud-order-settlement-840','1','1000','订单结算id'), +('mall4cloud-order-settlement-841','1','1000','订单结算id'), +('mall4cloud-order-settlement-842','1','1000','订单结算id'), +('mall4cloud-order-settlement-843','1','1000','订单结算id'), +('mall4cloud-order-settlement-844','1','1000','订单结算id'), +('mall4cloud-order-settlement-845','1','1000','订单结算id'), +('mall4cloud-order-settlement-846','1','1000','订单结算id'), +('mall4cloud-order-settlement-847','1','1000','订单结算id'), +('mall4cloud-order-settlement-848','1','1000','订单结算id'), +('mall4cloud-order-settlement-849','1','1000','订单结算id'), +('mall4cloud-order-settlement-850','1','1000','订单结算id'), +('mall4cloud-order-settlement-851','1','1000','订单结算id'), +('mall4cloud-order-settlement-852','1','1000','订单结算id'), +('mall4cloud-order-settlement-853','1','1000','订单结算id'), +('mall4cloud-order-settlement-854','1','1000','订单结算id'), +('mall4cloud-order-settlement-855','1','1000','订单结算id'), +('mall4cloud-order-settlement-856','1','1000','订单结算id'), +('mall4cloud-order-settlement-857','1','1000','订单结算id'), +('mall4cloud-order-settlement-858','1','1000','订单结算id'), +('mall4cloud-order-settlement-859','1','1000','订单结算id'), +('mall4cloud-order-settlement-860','1','1000','订单结算id'), +('mall4cloud-order-settlement-861','1','1000','订单结算id'), +('mall4cloud-order-settlement-862','1','1000','订单结算id'), +('mall4cloud-order-settlement-863','1','1000','订单结算id'), +('mall4cloud-order-settlement-864','1','1000','订单结算id'), +('mall4cloud-order-settlement-865','1','1000','订单结算id'), +('mall4cloud-order-settlement-866','1','1000','订单结算id'), +('mall4cloud-order-settlement-867','1','1000','订单结算id'), +('mall4cloud-order-settlement-868','1','1000','订单结算id'), +('mall4cloud-order-settlement-869','1','1000','订单结算id'), +('mall4cloud-order-settlement-870','1','1000','订单结算id'), +('mall4cloud-order-settlement-871','1','1000','订单结算id'), +('mall4cloud-order-settlement-872','1','1000','订单结算id'), +('mall4cloud-order-settlement-873','1','1000','订单结算id'), +('mall4cloud-order-settlement-874','1','1000','订单结算id'), +('mall4cloud-order-settlement-875','1','1000','订单结算id'), +('mall4cloud-order-settlement-876','1','1000','订单结算id'), +('mall4cloud-order-settlement-877','1','1000','订单结算id'), +('mall4cloud-order-settlement-878','1','1000','订单结算id'), +('mall4cloud-order-settlement-879','1','1000','订单结算id'), +('mall4cloud-order-settlement-880','1','1000','订单结算id'), +('mall4cloud-order-settlement-881','1','1000','订单结算id'), +('mall4cloud-order-settlement-882','1','1000','订单结算id'), +('mall4cloud-order-settlement-883','1','1000','订单结算id'), +('mall4cloud-order-settlement-884','1','1000','订单结算id'), +('mall4cloud-order-settlement-885','1','1000','订单结算id'), +('mall4cloud-order-settlement-886','1','1000','订单结算id'), +('mall4cloud-order-settlement-887','1','1000','订单结算id'), +('mall4cloud-order-settlement-888','1','1000','订单结算id'), +('mall4cloud-order-settlement-889','1','1000','订单结算id'), +('mall4cloud-order-settlement-890','1','1000','订单结算id'), +('mall4cloud-order-settlement-891','1','1000','订单结算id'), +('mall4cloud-order-settlement-892','1','1000','订单结算id'), +('mall4cloud-order-settlement-893','1','1000','订单结算id'), +('mall4cloud-order-settlement-894','1','1000','订单结算id'), +('mall4cloud-order-settlement-895','1','1000','订单结算id'), +('mall4cloud-order-settlement-896','1','1000','订单结算id'), +('mall4cloud-order-settlement-897','1','1000','订单结算id'), +('mall4cloud-order-settlement-898','1','1000','订单结算id'), +('mall4cloud-order-settlement-899','1','1000','订单结算id'), +('mall4cloud-order-settlement-900','1','1000','订单结算id'), +('mall4cloud-order-settlement-901','1','1000','订单结算id'), +('mall4cloud-order-settlement-902','1','1000','订单结算id'), +('mall4cloud-order-settlement-903','1','1000','订单结算id'), +('mall4cloud-order-settlement-904','1','1000','订单结算id'), +('mall4cloud-order-settlement-905','1','1000','订单结算id'), +('mall4cloud-order-settlement-906','1','1000','订单结算id'), +('mall4cloud-order-settlement-907','1','1000','订单结算id'), +('mall4cloud-order-settlement-908','1','1000','订单结算id'), +('mall4cloud-order-settlement-909','1','1000','订单结算id'), +('mall4cloud-order-settlement-910','1','1000','订单结算id'), +('mall4cloud-order-settlement-911','1','1000','订单结算id'), +('mall4cloud-order-settlement-912','1','1000','订单结算id'), +('mall4cloud-order-settlement-913','1','1000','订单结算id'), +('mall4cloud-order-settlement-914','1','1000','订单结算id'), +('mall4cloud-order-settlement-915','1','1000','订单结算id'), +('mall4cloud-order-settlement-916','1','1000','订单结算id'), +('mall4cloud-order-settlement-917','1','1000','订单结算id'), +('mall4cloud-order-settlement-918','1','1000','订单结算id'), +('mall4cloud-order-settlement-919','1','1000','订单结算id'), +('mall4cloud-order-settlement-920','1','1000','订单结算id'), +('mall4cloud-order-settlement-921','1','1000','订单结算id'), +('mall4cloud-order-settlement-922','1','1000','订单结算id'), +('mall4cloud-order-settlement-923','1','1000','订单结算id'), +('mall4cloud-order-settlement-924','1','1000','订单结算id'), +('mall4cloud-order-settlement-925','1','1000','订单结算id'), +('mall4cloud-order-settlement-926','1','1000','订单结算id'), +('mall4cloud-order-settlement-927','1','1000','订单结算id'), +('mall4cloud-order-settlement-928','1','1000','订单结算id'), +('mall4cloud-order-settlement-929','1','1000','订单结算id'), +('mall4cloud-order-settlement-930','1','1000','订单结算id'), +('mall4cloud-order-settlement-931','1','1000','订单结算id'), +('mall4cloud-order-settlement-932','1','1000','订单结算id'), +('mall4cloud-order-settlement-933','1','1000','订单结算id'), +('mall4cloud-order-settlement-934','1','1000','订单结算id'), +('mall4cloud-order-settlement-935','1','1000','订单结算id'), +('mall4cloud-order-settlement-936','1','1000','订单结算id'), +('mall4cloud-order-settlement-937','1','1000','订单结算id'), +('mall4cloud-order-settlement-938','1','1000','订单结算id'), +('mall4cloud-order-settlement-939','1','1000','订单结算id'), +('mall4cloud-order-settlement-940','1','1000','订单结算id'), +('mall4cloud-order-settlement-941','1','1000','订单结算id'), +('mall4cloud-order-settlement-942','1','1000','订单结算id'), +('mall4cloud-order-settlement-943','1','1000','订单结算id'), +('mall4cloud-order-settlement-944','1','1000','订单结算id'), +('mall4cloud-order-settlement-945','1','1000','订单结算id'), +('mall4cloud-order-settlement-946','1','1000','订单结算id'), +('mall4cloud-order-settlement-947','1','1000','订单结算id'), +('mall4cloud-order-settlement-948','1','1000','订单结算id'), +('mall4cloud-order-settlement-949','1','1000','订单结算id'), +('mall4cloud-order-settlement-950','1','1000','订单结算id'), +('mall4cloud-order-settlement-951','1','1000','订单结算id'), +('mall4cloud-order-settlement-952','1','1000','订单结算id'), +('mall4cloud-order-settlement-953','1','1000','订单结算id'), +('mall4cloud-order-settlement-954','1','1000','订单结算id'), +('mall4cloud-order-settlement-955','1','1000','订单结算id'), +('mall4cloud-order-settlement-956','1','1000','订单结算id'), +('mall4cloud-order-settlement-957','1','1000','订单结算id'), +('mall4cloud-order-settlement-958','1','1000','订单结算id'), +('mall4cloud-order-settlement-959','1','1000','订单结算id'), +('mall4cloud-order-settlement-960','1','1000','订单结算id'), +('mall4cloud-order-settlement-961','1','1000','订单结算id'), +('mall4cloud-order-settlement-962','1','1000','订单结算id'), +('mall4cloud-order-settlement-963','1','1000','订单结算id'), +('mall4cloud-order-settlement-964','1','1000','订单结算id'), +('mall4cloud-order-settlement-965','1','1000','订单结算id'), +('mall4cloud-order-settlement-966','1','1000','订单结算id'), +('mall4cloud-order-settlement-967','1','1000','订单结算id'), +('mall4cloud-order-settlement-968','1','1000','订单结算id'), +('mall4cloud-order-settlement-969','1','1000','订单结算id'), +('mall4cloud-order-settlement-970','1','1000','订单结算id'), +('mall4cloud-order-settlement-971','1','1000','订单结算id'), +('mall4cloud-order-settlement-972','1','1000','订单结算id'), +('mall4cloud-order-settlement-973','1','1000','订单结算id'), +('mall4cloud-order-settlement-974','1','1000','订单结算id'), +('mall4cloud-order-settlement-975','1','1000','订单结算id'), +('mall4cloud-order-settlement-976','1','1000','订单结算id'), +('mall4cloud-order-settlement-977','1','1000','订单结算id'), +('mall4cloud-order-settlement-978','1','1000','订单结算id'), +('mall4cloud-order-settlement-979','1','1000','订单结算id'), +('mall4cloud-order-settlement-980','1','1000','订单结算id'), +('mall4cloud-order-settlement-981','1','1000','订单结算id'), +('mall4cloud-order-settlement-982','1','1000','订单结算id'), +('mall4cloud-order-settlement-983','1','1000','订单结算id'), +('mall4cloud-order-settlement-984','1','1000','订单结算id'), +('mall4cloud-order-settlement-985','1','1000','订单结算id'), +('mall4cloud-order-settlement-986','1','1000','订单结算id'), +('mall4cloud-order-settlement-987','1','1000','订单结算id'), +('mall4cloud-order-settlement-988','1','1000','订单结算id'), +('mall4cloud-order-settlement-989','1','1000','订单结算id'), +('mall4cloud-order-settlement-990','1','1000','订单结算id'), +('mall4cloud-order-settlement-991','1','1000','订单结算id'), +('mall4cloud-order-settlement-992','1','1000','订单结算id'), +('mall4cloud-order-settlement-993','1','1000','订单结算id'), +('mall4cloud-order-settlement-994','1','1000','订单结算id'), +('mall4cloud-order-settlement-995','1','1000','订单结算id'), +('mall4cloud-order-settlement-996','1','1000','订单结算id'), +('mall4cloud-order-settlement-997','1','1000','订单结算id'), +('mall4cloud-order-settlement-998','1','1000','订单结算id'), +('mall4cloud-order-settlement-999','1','1000','订单结算id'), +('mall4cloud-order-station-code','1','1000','订单id'), +('mall4cloud-order-virtual-code','1','1000','订单id'), +('mall4cloud-order-virtual-info-000','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-001','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-002','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-003','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-004','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-005','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-006','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-007','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-008','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-009','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-010','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-011','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-012','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-013','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-014','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-015','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-016','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-017','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-018','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-019','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-020','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-021','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-022','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-023','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-024','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-025','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-026','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-027','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-028','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-029','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-030','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-031','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-032','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-033','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-034','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-035','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-036','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-037','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-038','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-039','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-040','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-041','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-042','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-043','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-044','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-045','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-046','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-047','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-048','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-049','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-050','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-051','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-052','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-053','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-054','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-055','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-056','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-057','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-058','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-059','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-060','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-061','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-062','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-063','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-064','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-065','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-066','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-067','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-068','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-069','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-070','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-071','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-072','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-073','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-074','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-075','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-076','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-077','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-078','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-079','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-080','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-081','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-082','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-083','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-084','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-085','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-086','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-087','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-088','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-089','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-090','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-091','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-092','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-093','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-094','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-095','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-096','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-097','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-098','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-099','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-100','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-101','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-102','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-103','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-104','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-105','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-106','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-107','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-108','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-109','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-110','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-111','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-112','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-113','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-114','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-115','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-116','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-117','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-118','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-119','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-120','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-121','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-122','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-123','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-124','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-125','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-126','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-127','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-128','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-129','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-130','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-131','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-132','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-133','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-134','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-135','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-136','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-137','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-138','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-139','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-140','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-141','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-142','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-143','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-144','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-145','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-146','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-147','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-148','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-149','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-150','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-151','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-152','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-153','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-154','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-155','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-156','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-157','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-158','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-159','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-160','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-161','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-162','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-163','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-164','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-165','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-166','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-167','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-168','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-169','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-170','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-171','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-172','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-173','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-174','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-175','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-176','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-177','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-178','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-179','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-180','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-181','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-182','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-183','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-184','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-185','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-186','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-187','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-188','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-189','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-190','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-191','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-192','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-193','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-194','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-195','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-196','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-197','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-198','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-199','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-200','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-201','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-202','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-203','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-204','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-205','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-206','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-207','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-208','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-209','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-210','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-211','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-212','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-213','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-214','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-215','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-216','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-217','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-218','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-219','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-220','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-221','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-222','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-223','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-224','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-225','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-226','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-227','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-228','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-229','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-230','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-231','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-232','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-233','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-234','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-235','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-236','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-237','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-238','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-239','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-240','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-241','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-242','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-243','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-244','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-245','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-246','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-247','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-248','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-249','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-250','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-251','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-252','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-253','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-254','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-255','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-256','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-257','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-258','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-259','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-260','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-261','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-262','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-263','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-264','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-265','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-266','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-267','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-268','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-269','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-270','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-271','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-272','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-273','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-274','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-275','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-276','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-277','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-278','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-279','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-280','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-281','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-282','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-283','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-284','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-285','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-286','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-287','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-288','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-289','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-290','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-291','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-292','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-293','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-294','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-295','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-296','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-297','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-298','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-299','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-300','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-301','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-302','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-303','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-304','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-305','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-306','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-307','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-308','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-309','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-310','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-311','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-312','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-313','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-314','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-315','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-316','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-317','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-318','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-319','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-320','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-321','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-322','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-323','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-324','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-325','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-326','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-327','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-328','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-329','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-330','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-331','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-332','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-333','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-334','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-335','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-336','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-337','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-338','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-339','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-340','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-341','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-342','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-343','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-344','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-345','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-346','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-347','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-348','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-349','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-350','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-351','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-352','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-353','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-354','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-355','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-356','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-357','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-358','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-359','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-360','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-361','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-362','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-363','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-364','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-365','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-366','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-367','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-368','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-369','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-370','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-371','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-372','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-373','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-374','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-375','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-376','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-377','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-378','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-379','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-380','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-381','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-382','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-383','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-384','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-385','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-386','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-387','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-388','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-389','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-390','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-391','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-392','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-393','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-394','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-395','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-396','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-397','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-398','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-399','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-400','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-401','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-402','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-403','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-404','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-405','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-406','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-407','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-408','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-409','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-410','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-411','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-412','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-413','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-414','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-415','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-416','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-417','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-418','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-419','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-420','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-421','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-422','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-423','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-424','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-425','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-426','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-427','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-428','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-429','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-430','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-431','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-432','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-433','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-434','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-435','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-436','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-437','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-438','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-439','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-440','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-441','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-442','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-443','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-444','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-445','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-446','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-447','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-448','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-449','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-450','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-451','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-452','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-453','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-454','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-455','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-456','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-457','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-458','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-459','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-460','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-461','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-462','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-463','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-464','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-465','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-466','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-467','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-468','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-469','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-470','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-471','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-472','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-473','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-474','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-475','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-476','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-477','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-478','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-479','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-480','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-481','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-482','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-483','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-484','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-485','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-486','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-487','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-488','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-489','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-490','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-491','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-492','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-493','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-494','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-495','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-496','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-497','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-498','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-499','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-500','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-501','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-502','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-503','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-504','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-505','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-506','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-507','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-508','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-509','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-510','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-511','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-512','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-513','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-514','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-515','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-516','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-517','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-518','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-519','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-520','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-521','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-522','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-523','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-524','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-525','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-526','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-527','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-528','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-529','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-530','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-531','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-532','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-533','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-534','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-535','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-536','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-537','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-538','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-539','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-540','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-541','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-542','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-543','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-544','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-545','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-546','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-547','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-548','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-549','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-550','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-551','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-552','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-553','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-554','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-555','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-556','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-557','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-558','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-559','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-560','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-561','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-562','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-563','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-564','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-565','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-566','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-567','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-568','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-569','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-570','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-571','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-572','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-573','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-574','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-575','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-576','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-577','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-578','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-579','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-580','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-581','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-582','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-583','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-584','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-585','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-586','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-587','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-588','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-589','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-590','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-591','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-592','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-593','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-594','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-595','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-596','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-597','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-598','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-599','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-600','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-601','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-602','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-603','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-604','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-605','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-606','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-607','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-608','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-609','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-610','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-611','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-612','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-613','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-614','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-615','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-616','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-617','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-618','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-619','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-620','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-621','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-622','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-623','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-624','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-625','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-626','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-627','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-628','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-629','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-630','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-631','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-632','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-633','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-634','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-635','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-636','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-637','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-638','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-639','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-640','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-641','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-642','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-643','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-644','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-645','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-646','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-647','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-648','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-649','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-650','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-651','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-652','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-653','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-654','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-655','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-656','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-657','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-658','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-659','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-660','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-661','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-662','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-663','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-664','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-665','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-666','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-667','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-668','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-669','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-670','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-671','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-672','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-673','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-674','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-675','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-676','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-677','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-678','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-679','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-680','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-681','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-682','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-683','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-684','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-685','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-686','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-687','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-688','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-689','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-690','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-691','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-692','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-693','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-694','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-695','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-696','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-697','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-698','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-699','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-700','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-701','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-702','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-703','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-704','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-705','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-706','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-707','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-708','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-709','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-710','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-711','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-712','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-713','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-714','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-715','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-716','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-717','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-718','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-719','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-720','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-721','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-722','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-723','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-724','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-725','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-726','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-727','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-728','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-729','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-730','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-731','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-732','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-733','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-734','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-735','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-736','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-737','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-738','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-739','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-740','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-741','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-742','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-743','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-744','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-745','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-746','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-747','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-748','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-749','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-750','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-751','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-752','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-753','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-754','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-755','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-756','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-757','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-758','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-759','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-760','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-761','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-762','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-763','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-764','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-765','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-766','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-767','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-768','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-769','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-770','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-771','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-772','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-773','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-774','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-775','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-776','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-777','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-778','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-779','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-780','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-781','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-782','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-783','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-784','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-785','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-786','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-787','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-788','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-789','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-790','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-791','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-792','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-793','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-794','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-795','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-796','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-797','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-798','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-799','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-800','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-801','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-802','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-803','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-804','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-805','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-806','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-807','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-808','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-809','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-810','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-811','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-812','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-813','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-814','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-815','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-816','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-817','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-818','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-819','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-820','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-821','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-822','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-823','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-824','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-825','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-826','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-827','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-828','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-829','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-830','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-831','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-832','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-833','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-834','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-835','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-836','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-837','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-838','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-839','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-840','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-841','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-842','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-843','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-844','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-845','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-846','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-847','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-848','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-849','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-850','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-851','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-852','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-853','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-854','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-855','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-856','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-857','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-858','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-859','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-860','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-861','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-862','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-863','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-864','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-865','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-866','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-867','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-868','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-869','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-870','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-871','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-872','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-873','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-874','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-875','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-876','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-877','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-878','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-879','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-880','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-881','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-882','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-883','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-884','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-885','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-886','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-887','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-888','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-889','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-890','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-891','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-892','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-893','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-894','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-895','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-896','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-897','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-898','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-899','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-900','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-901','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-902','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-903','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-904','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-905','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-906','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-907','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-908','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-909','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-910','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-911','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-912','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-913','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-914','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-915','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-916','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-917','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-918','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-919','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-920','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-921','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-922','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-923','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-924','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-925','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-926','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-927','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-928','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-929','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-930','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-931','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-932','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-933','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-934','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-935','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-936','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-937','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-938','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-939','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-940','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-941','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-942','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-943','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-944','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-945','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-946','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-947','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-948','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-949','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-950','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-951','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-952','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-953','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-954','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-955','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-956','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-957','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-958','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-959','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-960','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-961','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-962','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-963','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-964','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-965','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-966','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-967','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-968','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-969','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-970','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-971','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-972','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-973','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-974','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-975','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-976','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-977','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-978','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-979','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-980','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-981','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-982','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-983','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-984','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-985','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-986','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-987','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-988','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-989','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-990','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-991','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-992','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-993','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-994','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-995','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-996','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-997','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-998','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-virtual-info-999','1','1000','虚拟订单核销记录id'), +('mall4cloud-order-invoice-000','1','1000','订单发票id'), +('mall4cloud-order-invoice-001','1','1000','订单发票id'), +('mall4cloud-order-invoice-002','1','1000','订单发票id'), +('mall4cloud-order-invoice-003','1','1000','订单发票id'), +('mall4cloud-order-invoice-004','1','1000','订单发票id'), +('mall4cloud-order-invoice-005','1','1000','订单发票id'), +('mall4cloud-order-invoice-006','1','1000','订单发票id'), +('mall4cloud-order-invoice-007','1','1000','订单发票id'), +('mall4cloud-order-invoice-008','1','1000','订单发票id'), +('mall4cloud-order-invoice-009','1','1000','订单发票id'), +('mall4cloud-order-invoice-010','1','1000','订单发票id'), +('mall4cloud-order-invoice-011','1','1000','订单发票id'), +('mall4cloud-order-invoice-012','1','1000','订单发票id'), +('mall4cloud-order-invoice-013','1','1000','订单发票id'), +('mall4cloud-order-invoice-014','1','1000','订单发票id'), +('mall4cloud-order-invoice-015','1','1000','订单发票id'), +('mall4cloud-order-invoice-016','1','1000','订单发票id'), +('mall4cloud-order-invoice-017','1','1000','订单发票id'), +('mall4cloud-order-invoice-018','1','1000','订单发票id'), +('mall4cloud-order-invoice-019','1','1000','订单发票id'), +('mall4cloud-order-invoice-020','1','1000','订单发票id'), +('mall4cloud-order-invoice-021','1','1000','订单发票id'), +('mall4cloud-order-invoice-022','1','1000','订单发票id'), +('mall4cloud-order-invoice-023','1','1000','订单发票id'), +('mall4cloud-order-invoice-024','1','1000','订单发票id'), +('mall4cloud-order-invoice-025','1','1000','订单发票id'), +('mall4cloud-order-invoice-026','1','1000','订单发票id'), +('mall4cloud-order-invoice-027','1','1000','订单发票id'), +('mall4cloud-order-invoice-028','1','1000','订单发票id'), +('mall4cloud-order-invoice-029','1','1000','订单发票id'), +('mall4cloud-order-invoice-030','1','1000','订单发票id'), +('mall4cloud-order-invoice-031','1','1000','订单发票id'), +('mall4cloud-order-invoice-032','1','1000','订单发票id'), +('mall4cloud-order-invoice-033','1','1000','订单发票id'), +('mall4cloud-order-invoice-034','1','1000','订单发票id'), +('mall4cloud-order-invoice-035','1','1000','订单发票id'), +('mall4cloud-order-invoice-036','1','1000','订单发票id'), +('mall4cloud-order-invoice-037','1','1000','订单发票id'), +('mall4cloud-order-invoice-038','1','1000','订单发票id'), +('mall4cloud-order-invoice-039','1','1000','订单发票id'), +('mall4cloud-order-invoice-040','1','1000','订单发票id'), +('mall4cloud-order-invoice-041','1','1000','订单发票id'), +('mall4cloud-order-invoice-042','1','1000','订单发票id'), +('mall4cloud-order-invoice-043','1','1000','订单发票id'), +('mall4cloud-order-invoice-044','1','1000','订单发票id'), +('mall4cloud-order-invoice-045','1','1000','订单发票id'), +('mall4cloud-order-invoice-046','1','1000','订单发票id'), +('mall4cloud-order-invoice-047','1','1000','订单发票id'), +('mall4cloud-order-invoice-048','1','1000','订单发票id'), +('mall4cloud-order-invoice-049','1','1000','订单发票id'), +('mall4cloud-order-invoice-050','1','1000','订单发票id'), +('mall4cloud-order-invoice-051','1','1000','订单发票id'), +('mall4cloud-order-invoice-052','1','1000','订单发票id'), +('mall4cloud-order-invoice-053','1','1000','订单发票id'), +('mall4cloud-order-invoice-054','1','1000','订单发票id'), +('mall4cloud-order-invoice-055','1','1000','订单发票id'), +('mall4cloud-order-invoice-056','1','1000','订单发票id'), +('mall4cloud-order-invoice-057','1','1000','订单发票id'), +('mall4cloud-order-invoice-058','1','1000','订单发票id'), +('mall4cloud-order-invoice-059','1','1000','订单发票id'), +('mall4cloud-order-invoice-060','1','1000','订单发票id'), +('mall4cloud-order-invoice-061','1','1000','订单发票id'), +('mall4cloud-order-invoice-062','1','1000','订单发票id'), +('mall4cloud-order-invoice-063','1','1000','订单发票id'), +('mall4cloud-order-invoice-064','1','1000','订单发票id'), +('mall4cloud-order-invoice-065','1','1000','订单发票id'), +('mall4cloud-order-invoice-066','1','1000','订单发票id'), +('mall4cloud-order-invoice-067','1','1000','订单发票id'), +('mall4cloud-order-invoice-068','1','1000','订单发票id'), +('mall4cloud-order-invoice-069','1','1000','订单发票id'), +('mall4cloud-order-invoice-070','1','1000','订单发票id'), +('mall4cloud-order-invoice-071','1','1000','订单发票id'), +('mall4cloud-order-invoice-072','1','1000','订单发票id'), +('mall4cloud-order-invoice-073','1','1000','订单发票id'), +('mall4cloud-order-invoice-074','1','1000','订单发票id'), +('mall4cloud-order-invoice-075','1','1000','订单发票id'), +('mall4cloud-order-invoice-076','1','1000','订单发票id'), +('mall4cloud-order-invoice-077','1','1000','订单发票id'), +('mall4cloud-order-invoice-078','1','1000','订单发票id'), +('mall4cloud-order-invoice-079','1','1000','订单发票id'), +('mall4cloud-order-invoice-080','1','1000','订单发票id'), +('mall4cloud-order-invoice-081','1','1000','订单发票id'), +('mall4cloud-order-invoice-082','1','1000','订单发票id'), +('mall4cloud-order-invoice-083','1','1000','订单发票id'), +('mall4cloud-order-invoice-084','1','1000','订单发票id'), +('mall4cloud-order-invoice-085','1','1000','订单发票id'), +('mall4cloud-order-invoice-086','1','1000','订单发票id'), +('mall4cloud-order-invoice-087','1','1000','订单发票id'), +('mall4cloud-order-invoice-088','1','1000','订单发票id'), +('mall4cloud-order-invoice-089','1','1000','订单发票id'), +('mall4cloud-order-invoice-090','1','1000','订单发票id'), +('mall4cloud-order-invoice-091','1','1000','订单发票id'), +('mall4cloud-order-invoice-092','1','1000','订单发票id'), +('mall4cloud-order-invoice-093','1','1000','订单发票id'), +('mall4cloud-order-invoice-094','1','1000','订单发票id'), +('mall4cloud-order-invoice-095','1','1000','订单发票id'), +('mall4cloud-order-invoice-096','1','1000','订单发票id'), +('mall4cloud-order-invoice-097','1','1000','订单发票id'), +('mall4cloud-order-invoice-098','1','1000','订单发票id'), +('mall4cloud-order-invoice-099','1','1000','订单发票id'), +('mall4cloud-order-invoice-100','1','1000','订单发票id'), +('mall4cloud-order-invoice-101','1','1000','订单发票id'), +('mall4cloud-order-invoice-102','1','1000','订单发票id'), +('mall4cloud-order-invoice-103','1','1000','订单发票id'), +('mall4cloud-order-invoice-104','1','1000','订单发票id'), +('mall4cloud-order-invoice-105','1','1000','订单发票id'), +('mall4cloud-order-invoice-106','1','1000','订单发票id'), +('mall4cloud-order-invoice-107','1','1000','订单发票id'), +('mall4cloud-order-invoice-108','1','1000','订单发票id'), +('mall4cloud-order-invoice-109','1','1000','订单发票id'), +('mall4cloud-order-invoice-110','1','1000','订单发票id'), +('mall4cloud-order-invoice-111','1','1000','订单发票id'), +('mall4cloud-order-invoice-112','1','1000','订单发票id'), +('mall4cloud-order-invoice-113','1','1000','订单发票id'), +('mall4cloud-order-invoice-114','1','1000','订单发票id'), +('mall4cloud-order-invoice-115','1','1000','订单发票id'), +('mall4cloud-order-invoice-116','1','1000','订单发票id'), +('mall4cloud-order-invoice-117','1','1000','订单发票id'), +('mall4cloud-order-invoice-118','1','1000','订单发票id'), +('mall4cloud-order-invoice-119','1','1000','订单发票id'), +('mall4cloud-order-invoice-120','1','1000','订单发票id'), +('mall4cloud-order-invoice-121','1','1000','订单发票id'), +('mall4cloud-order-invoice-122','1','1000','订单发票id'), +('mall4cloud-order-invoice-123','1','1000','订单发票id'), +('mall4cloud-order-invoice-124','1','1000','订单发票id'), +('mall4cloud-order-invoice-125','1','1000','订单发票id'), +('mall4cloud-order-invoice-126','1','1000','订单发票id'), +('mall4cloud-order-invoice-127','1','1000','订单发票id'), +('mall4cloud-order-invoice-128','1','1000','订单发票id'), +('mall4cloud-order-invoice-129','1','1000','订单发票id'), +('mall4cloud-order-invoice-130','1','1000','订单发票id'), +('mall4cloud-order-invoice-131','1','1000','订单发票id'), +('mall4cloud-order-invoice-132','1','1000','订单发票id'), +('mall4cloud-order-invoice-133','1','1000','订单发票id'), +('mall4cloud-order-invoice-134','1','1000','订单发票id'), +('mall4cloud-order-invoice-135','1','1000','订单发票id'), +('mall4cloud-order-invoice-136','1','1000','订单发票id'), +('mall4cloud-order-invoice-137','1','1000','订单发票id'), +('mall4cloud-order-invoice-138','1','1000','订单发票id'), +('mall4cloud-order-invoice-139','1','1000','订单发票id'), +('mall4cloud-order-invoice-140','1','1000','订单发票id'), +('mall4cloud-order-invoice-141','1','1000','订单发票id'), +('mall4cloud-order-invoice-142','1','1000','订单发票id'), +('mall4cloud-order-invoice-143','1','1000','订单发票id'), +('mall4cloud-order-invoice-144','1','1000','订单发票id'), +('mall4cloud-order-invoice-145','1','1000','订单发票id'), +('mall4cloud-order-invoice-146','1','1000','订单发票id'), +('mall4cloud-order-invoice-147','1','1000','订单发票id'), +('mall4cloud-order-invoice-148','1','1000','订单发票id'), +('mall4cloud-order-invoice-149','1','1000','订单发票id'), +('mall4cloud-order-invoice-150','1','1000','订单发票id'), +('mall4cloud-order-invoice-151','1','1000','订单发票id'), +('mall4cloud-order-invoice-152','1','1000','订单发票id'), +('mall4cloud-order-invoice-153','1','1000','订单发票id'), +('mall4cloud-order-invoice-154','1','1000','订单发票id'), +('mall4cloud-order-invoice-155','1','1000','订单发票id'), +('mall4cloud-order-invoice-156','1','1000','订单发票id'), +('mall4cloud-order-invoice-157','1','1000','订单发票id'), +('mall4cloud-order-invoice-158','1','1000','订单发票id'), +('mall4cloud-order-invoice-159','1','1000','订单发票id'), +('mall4cloud-order-invoice-160','1','1000','订单发票id'), +('mall4cloud-order-invoice-161','1','1000','订单发票id'), +('mall4cloud-order-invoice-162','1','1000','订单发票id'), +('mall4cloud-order-invoice-163','1','1000','订单发票id'), +('mall4cloud-order-invoice-164','1','1000','订单发票id'), +('mall4cloud-order-invoice-165','1','1000','订单发票id'), +('mall4cloud-order-invoice-166','1','1000','订单发票id'), +('mall4cloud-order-invoice-167','1','1000','订单发票id'), +('mall4cloud-order-invoice-168','1','1000','订单发票id'), +('mall4cloud-order-invoice-169','1','1000','订单发票id'), +('mall4cloud-order-invoice-170','1','1000','订单发票id'), +('mall4cloud-order-invoice-171','1','1000','订单发票id'), +('mall4cloud-order-invoice-172','1','1000','订单发票id'), +('mall4cloud-order-invoice-173','1','1000','订单发票id'), +('mall4cloud-order-invoice-174','1','1000','订单发票id'), +('mall4cloud-order-invoice-175','1','1000','订单发票id'), +('mall4cloud-order-invoice-176','1','1000','订单发票id'), +('mall4cloud-order-invoice-177','1','1000','订单发票id'), +('mall4cloud-order-invoice-178','1','1000','订单发票id'), +('mall4cloud-order-invoice-179','1','1000','订单发票id'), +('mall4cloud-order-invoice-180','1','1000','订单发票id'), +('mall4cloud-order-invoice-181','1','1000','订单发票id'), +('mall4cloud-order-invoice-182','1','1000','订单发票id'), +('mall4cloud-order-invoice-183','1','1000','订单发票id'), +('mall4cloud-order-invoice-184','1','1000','订单发票id'), +('mall4cloud-order-invoice-185','1','1000','订单发票id'), +('mall4cloud-order-invoice-186','1','1000','订单发票id'), +('mall4cloud-order-invoice-187','1','1000','订单发票id'), +('mall4cloud-order-invoice-188','1','1000','订单发票id'), +('mall4cloud-order-invoice-189','1','1000','订单发票id'), +('mall4cloud-order-invoice-190','1','1000','订单发票id'), +('mall4cloud-order-invoice-191','1','1000','订单发票id'), +('mall4cloud-order-invoice-192','1','1000','订单发票id'), +('mall4cloud-order-invoice-193','1','1000','订单发票id'), +('mall4cloud-order-invoice-194','1','1000','订单发票id'), +('mall4cloud-order-invoice-195','1','1000','订单发票id'), +('mall4cloud-order-invoice-196','1','1000','订单发票id'), +('mall4cloud-order-invoice-197','1','1000','订单发票id'), +('mall4cloud-order-invoice-198','1','1000','订单发票id'), +('mall4cloud-order-invoice-199','1','1000','订单发票id'), +('mall4cloud-order-invoice-200','1','1000','订单发票id'), +('mall4cloud-order-invoice-201','1','1000','订单发票id'), +('mall4cloud-order-invoice-202','1','1000','订单发票id'), +('mall4cloud-order-invoice-203','1','1000','订单发票id'), +('mall4cloud-order-invoice-204','1','1000','订单发票id'), +('mall4cloud-order-invoice-205','1','1000','订单发票id'), +('mall4cloud-order-invoice-206','1','1000','订单发票id'), +('mall4cloud-order-invoice-207','1','1000','订单发票id'), +('mall4cloud-order-invoice-208','1','1000','订单发票id'), +('mall4cloud-order-invoice-209','1','1000','订单发票id'), +('mall4cloud-order-invoice-210','1','1000','订单发票id'), +('mall4cloud-order-invoice-211','1','1000','订单发票id'), +('mall4cloud-order-invoice-212','1','1000','订单发票id'), +('mall4cloud-order-invoice-213','1','1000','订单发票id'), +('mall4cloud-order-invoice-214','1','1000','订单发票id'), +('mall4cloud-order-invoice-215','1','1000','订单发票id'), +('mall4cloud-order-invoice-216','1','1000','订单发票id'), +('mall4cloud-order-invoice-217','1','1000','订单发票id'), +('mall4cloud-order-invoice-218','1','1000','订单发票id'), +('mall4cloud-order-invoice-219','1','1000','订单发票id'), +('mall4cloud-order-invoice-220','1','1000','订单发票id'), +('mall4cloud-order-invoice-221','1','1000','订单发票id'), +('mall4cloud-order-invoice-222','1','1000','订单发票id'), +('mall4cloud-order-invoice-223','1','1000','订单发票id'), +('mall4cloud-order-invoice-224','1','1000','订单发票id'), +('mall4cloud-order-invoice-225','1','1000','订单发票id'), +('mall4cloud-order-invoice-226','1','1000','订单发票id'), +('mall4cloud-order-invoice-227','1','1000','订单发票id'), +('mall4cloud-order-invoice-228','1','1000','订单发票id'), +('mall4cloud-order-invoice-229','1','1000','订单发票id'), +('mall4cloud-order-invoice-230','1','1000','订单发票id'), +('mall4cloud-order-invoice-231','1','1000','订单发票id'), +('mall4cloud-order-invoice-232','1','1000','订单发票id'), +('mall4cloud-order-invoice-233','1','1000','订单发票id'), +('mall4cloud-order-invoice-234','1','1000','订单发票id'), +('mall4cloud-order-invoice-235','1','1000','订单发票id'), +('mall4cloud-order-invoice-236','1','1000','订单发票id'), +('mall4cloud-order-invoice-237','1','1000','订单发票id'), +('mall4cloud-order-invoice-238','1','1000','订单发票id'), +('mall4cloud-order-invoice-239','1','1000','订单发票id'), +('mall4cloud-order-invoice-240','1','1000','订单发票id'), +('mall4cloud-order-invoice-241','1','1000','订单发票id'), +('mall4cloud-order-invoice-242','1','1000','订单发票id'), +('mall4cloud-order-invoice-243','1','1000','订单发票id'), +('mall4cloud-order-invoice-244','1','1000','订单发票id'), +('mall4cloud-order-invoice-245','1','1000','订单发票id'), +('mall4cloud-order-invoice-246','1','1000','订单发票id'), +('mall4cloud-order-invoice-247','1','1000','订单发票id'), +('mall4cloud-order-invoice-248','1','1000','订单发票id'), +('mall4cloud-order-invoice-249','1','1000','订单发票id'), +('mall4cloud-order-invoice-250','1','1000','订单发票id'), +('mall4cloud-order-invoice-251','1','1000','订单发票id'), +('mall4cloud-order-invoice-252','1','1000','订单发票id'), +('mall4cloud-order-invoice-253','1','1000','订单发票id'), +('mall4cloud-order-invoice-254','1','1000','订单发票id'), +('mall4cloud-order-invoice-255','1','1000','订单发票id'), +('mall4cloud-order-invoice-256','1','1000','订单发票id'), +('mall4cloud-order-invoice-257','1','1000','订单发票id'), +('mall4cloud-order-invoice-258','1','1000','订单发票id'), +('mall4cloud-order-invoice-259','1','1000','订单发票id'), +('mall4cloud-order-invoice-260','1','1000','订单发票id'), +('mall4cloud-order-invoice-261','1','1000','订单发票id'), +('mall4cloud-order-invoice-262','1','1000','订单发票id'), +('mall4cloud-order-invoice-263','1','1000','订单发票id'), +('mall4cloud-order-invoice-264','1','1000','订单发票id'), +('mall4cloud-order-invoice-265','1','1000','订单发票id'), +('mall4cloud-order-invoice-266','1','1000','订单发票id'), +('mall4cloud-order-invoice-267','1','1000','订单发票id'), +('mall4cloud-order-invoice-268','1','1000','订单发票id'), +('mall4cloud-order-invoice-269','1','1000','订单发票id'), +('mall4cloud-order-invoice-270','1','1000','订单发票id'), +('mall4cloud-order-invoice-271','1','1000','订单发票id'), +('mall4cloud-order-invoice-272','1','1000','订单发票id'), +('mall4cloud-order-invoice-273','1','1000','订单发票id'), +('mall4cloud-order-invoice-274','1','1000','订单发票id'), +('mall4cloud-order-invoice-275','1','1000','订单发票id'), +('mall4cloud-order-invoice-276','1','1000','订单发票id'), +('mall4cloud-order-invoice-277','1','1000','订单发票id'), +('mall4cloud-order-invoice-278','1','1000','订单发票id'), +('mall4cloud-order-invoice-279','1','1000','订单发票id'), +('mall4cloud-order-invoice-280','1','1000','订单发票id'), +('mall4cloud-order-invoice-281','1','1000','订单发票id'), +('mall4cloud-order-invoice-282','1','1000','订单发票id'), +('mall4cloud-order-invoice-283','1','1000','订单发票id'), +('mall4cloud-order-invoice-284','1','1000','订单发票id'), +('mall4cloud-order-invoice-285','1','1000','订单发票id'), +('mall4cloud-order-invoice-286','1','1000','订单发票id'), +('mall4cloud-order-invoice-287','1','1000','订单发票id'), +('mall4cloud-order-invoice-288','1','1000','订单发票id'), +('mall4cloud-order-invoice-289','1','1000','订单发票id'), +('mall4cloud-order-invoice-290','1','1000','订单发票id'), +('mall4cloud-order-invoice-291','1','1000','订单发票id'), +('mall4cloud-order-invoice-292','1','1000','订单发票id'), +('mall4cloud-order-invoice-293','1','1000','订单发票id'), +('mall4cloud-order-invoice-294','1','1000','订单发票id'), +('mall4cloud-order-invoice-295','1','1000','订单发票id'), +('mall4cloud-order-invoice-296','1','1000','订单发票id'), +('mall4cloud-order-invoice-297','1','1000','订单发票id'), +('mall4cloud-order-invoice-298','1','1000','订单发票id'), +('mall4cloud-order-invoice-299','1','1000','订单发票id'), +('mall4cloud-order-invoice-300','1','1000','订单发票id'), +('mall4cloud-order-invoice-301','1','1000','订单发票id'), +('mall4cloud-order-invoice-302','1','1000','订单发票id'), +('mall4cloud-order-invoice-303','1','1000','订单发票id'), +('mall4cloud-order-invoice-304','1','1000','订单发票id'), +('mall4cloud-order-invoice-305','1','1000','订单发票id'), +('mall4cloud-order-invoice-306','1','1000','订单发票id'), +('mall4cloud-order-invoice-307','1','1000','订单发票id'), +('mall4cloud-order-invoice-308','1','1000','订单发票id'), +('mall4cloud-order-invoice-309','1','1000','订单发票id'), +('mall4cloud-order-invoice-310','1','1000','订单发票id'), +('mall4cloud-order-invoice-311','1','1000','订单发票id'), +('mall4cloud-order-invoice-312','1','1000','订单发票id'), +('mall4cloud-order-invoice-313','1','1000','订单发票id'), +('mall4cloud-order-invoice-314','1','1000','订单发票id'), +('mall4cloud-order-invoice-315','1','1000','订单发票id'), +('mall4cloud-order-invoice-316','1','1000','订单发票id'), +('mall4cloud-order-invoice-317','1','1000','订单发票id'), +('mall4cloud-order-invoice-318','1','1000','订单发票id'), +('mall4cloud-order-invoice-319','1','1000','订单发票id'), +('mall4cloud-order-invoice-320','1','1000','订单发票id'), +('mall4cloud-order-invoice-321','1','1000','订单发票id'), +('mall4cloud-order-invoice-322','1','1000','订单发票id'), +('mall4cloud-order-invoice-323','1','1000','订单发票id'), +('mall4cloud-order-invoice-324','1','1000','订单发票id'), +('mall4cloud-order-invoice-325','1','1000','订单发票id'), +('mall4cloud-order-invoice-326','1','1000','订单发票id'), +('mall4cloud-order-invoice-327','1','1000','订单发票id'), +('mall4cloud-order-invoice-328','1','1000','订单发票id'), +('mall4cloud-order-invoice-329','1','1000','订单发票id'), +('mall4cloud-order-invoice-330','1','1000','订单发票id'), +('mall4cloud-order-invoice-331','1','1000','订单发票id'), +('mall4cloud-order-invoice-332','1','1000','订单发票id'), +('mall4cloud-order-invoice-333','1','1000','订单发票id'), +('mall4cloud-order-invoice-334','1','1000','订单发票id'), +('mall4cloud-order-invoice-335','1','1000','订单发票id'), +('mall4cloud-order-invoice-336','1','1000','订单发票id'), +('mall4cloud-order-invoice-337','1','1000','订单发票id'), +('mall4cloud-order-invoice-338','1','1000','订单发票id'), +('mall4cloud-order-invoice-339','1','1000','订单发票id'), +('mall4cloud-order-invoice-340','1','1000','订单发票id'), +('mall4cloud-order-invoice-341','1','1000','订单发票id'), +('mall4cloud-order-invoice-342','1','1000','订单发票id'), +('mall4cloud-order-invoice-343','1','1000','订单发票id'), +('mall4cloud-order-invoice-344','1','1000','订单发票id'), +('mall4cloud-order-invoice-345','1','1000','订单发票id'), +('mall4cloud-order-invoice-346','1','1000','订单发票id'), +('mall4cloud-order-invoice-347','1','1000','订单发票id'), +('mall4cloud-order-invoice-348','1','1000','订单发票id'), +('mall4cloud-order-invoice-349','1','1000','订单发票id'), +('mall4cloud-order-invoice-350','1','1000','订单发票id'), +('mall4cloud-order-invoice-351','1','1000','订单发票id'), +('mall4cloud-order-invoice-352','1','1000','订单发票id'), +('mall4cloud-order-invoice-353','1','1000','订单发票id'), +('mall4cloud-order-invoice-354','1','1000','订单发票id'), +('mall4cloud-order-invoice-355','1','1000','订单发票id'), +('mall4cloud-order-invoice-356','1','1000','订单发票id'), +('mall4cloud-order-invoice-357','1','1000','订单发票id'), +('mall4cloud-order-invoice-358','1','1000','订单发票id'), +('mall4cloud-order-invoice-359','1','1000','订单发票id'), +('mall4cloud-order-invoice-360','1','1000','订单发票id'), +('mall4cloud-order-invoice-361','1','1000','订单发票id'), +('mall4cloud-order-invoice-362','1','1000','订单发票id'), +('mall4cloud-order-invoice-363','1','1000','订单发票id'), +('mall4cloud-order-invoice-364','1','1000','订单发票id'), +('mall4cloud-order-invoice-365','1','1000','订单发票id'), +('mall4cloud-order-invoice-366','1','1000','订单发票id'), +('mall4cloud-order-invoice-367','1','1000','订单发票id'), +('mall4cloud-order-invoice-368','1','1000','订单发票id'), +('mall4cloud-order-invoice-369','1','1000','订单发票id'), +('mall4cloud-order-invoice-370','1','1000','订单发票id'), +('mall4cloud-order-invoice-371','1','1000','订单发票id'), +('mall4cloud-order-invoice-372','1','1000','订单发票id'), +('mall4cloud-order-invoice-373','1','1000','订单发票id'), +('mall4cloud-order-invoice-374','1','1000','订单发票id'), +('mall4cloud-order-invoice-375','1','1000','订单发票id'), +('mall4cloud-order-invoice-376','1','1000','订单发票id'), +('mall4cloud-order-invoice-377','1','1000','订单发票id'), +('mall4cloud-order-invoice-378','1','1000','订单发票id'), +('mall4cloud-order-invoice-379','1','1000','订单发票id'), +('mall4cloud-order-invoice-380','1','1000','订单发票id'), +('mall4cloud-order-invoice-381','1','1000','订单发票id'), +('mall4cloud-order-invoice-382','1','1000','订单发票id'), +('mall4cloud-order-invoice-383','1','1000','订单发票id'), +('mall4cloud-order-invoice-384','1','1000','订单发票id'), +('mall4cloud-order-invoice-385','1','1000','订单发票id'), +('mall4cloud-order-invoice-386','1','1000','订单发票id'), +('mall4cloud-order-invoice-387','1','1000','订单发票id'), +('mall4cloud-order-invoice-388','1','1000','订单发票id'), +('mall4cloud-order-invoice-389','1','1000','订单发票id'), +('mall4cloud-order-invoice-390','1','1000','订单发票id'), +('mall4cloud-order-invoice-391','1','1000','订单发票id'), +('mall4cloud-order-invoice-392','1','1000','订单发票id'), +('mall4cloud-order-invoice-393','1','1000','订单发票id'), +('mall4cloud-order-invoice-394','1','1000','订单发票id'), +('mall4cloud-order-invoice-395','1','1000','订单发票id'), +('mall4cloud-order-invoice-396','1','1000','订单发票id'), +('mall4cloud-order-invoice-397','1','1000','订单发票id'), +('mall4cloud-order-invoice-398','1','1000','订单发票id'), +('mall4cloud-order-invoice-399','1','1000','订单发票id'), +('mall4cloud-order-invoice-400','1','1000','订单发票id'), +('mall4cloud-order-invoice-401','1','1000','订单发票id'), +('mall4cloud-order-invoice-402','1','1000','订单发票id'), +('mall4cloud-order-invoice-403','1','1000','订单发票id'), +('mall4cloud-order-invoice-404','1','1000','订单发票id'), +('mall4cloud-order-invoice-405','1','1000','订单发票id'), +('mall4cloud-order-invoice-406','1','1000','订单发票id'), +('mall4cloud-order-invoice-407','1','1000','订单发票id'), +('mall4cloud-order-invoice-408','1','1000','订单发票id'), +('mall4cloud-order-invoice-409','1','1000','订单发票id'), +('mall4cloud-order-invoice-410','1','1000','订单发票id'), +('mall4cloud-order-invoice-411','1','1000','订单发票id'), +('mall4cloud-order-invoice-412','1','1000','订单发票id'), +('mall4cloud-order-invoice-413','1','1000','订单发票id'), +('mall4cloud-order-invoice-414','1','1000','订单发票id'), +('mall4cloud-order-invoice-415','1','1000','订单发票id'), +('mall4cloud-order-invoice-416','1','1000','订单发票id'), +('mall4cloud-order-invoice-417','1','1000','订单发票id'), +('mall4cloud-order-invoice-418','1','1000','订单发票id'), +('mall4cloud-order-invoice-419','1','1000','订单发票id'), +('mall4cloud-order-invoice-420','1','1000','订单发票id'), +('mall4cloud-order-invoice-421','1','1000','订单发票id'), +('mall4cloud-order-invoice-422','1','1000','订单发票id'), +('mall4cloud-order-invoice-423','1','1000','订单发票id'), +('mall4cloud-order-invoice-424','1','1000','订单发票id'), +('mall4cloud-order-invoice-425','1','1000','订单发票id'), +('mall4cloud-order-invoice-426','1','1000','订单发票id'), +('mall4cloud-order-invoice-427','1','1000','订单发票id'), +('mall4cloud-order-invoice-428','1','1000','订单发票id'), +('mall4cloud-order-invoice-429','1','1000','订单发票id'), +('mall4cloud-order-invoice-430','1','1000','订单发票id'), +('mall4cloud-order-invoice-431','1','1000','订单发票id'), +('mall4cloud-order-invoice-432','1','1000','订单发票id'), +('mall4cloud-order-invoice-433','1','1000','订单发票id'), +('mall4cloud-order-invoice-434','1','1000','订单发票id'), +('mall4cloud-order-invoice-435','1','1000','订单发票id'), +('mall4cloud-order-invoice-436','1','1000','订单发票id'), +('mall4cloud-order-invoice-437','1','1000','订单发票id'), +('mall4cloud-order-invoice-438','1','1000','订单发票id'), +('mall4cloud-order-invoice-439','1','1000','订单发票id'), +('mall4cloud-order-invoice-440','1','1000','订单发票id'), +('mall4cloud-order-invoice-441','1','1000','订单发票id'), +('mall4cloud-order-invoice-442','1','1000','订单发票id'), +('mall4cloud-order-invoice-443','1','1000','订单发票id'), +('mall4cloud-order-invoice-444','1','1000','订单发票id'), +('mall4cloud-order-invoice-445','1','1000','订单发票id'), +('mall4cloud-order-invoice-446','1','1000','订单发票id'), +('mall4cloud-order-invoice-447','1','1000','订单发票id'), +('mall4cloud-order-invoice-448','1','1000','订单发票id'), +('mall4cloud-order-invoice-449','1','1000','订单发票id'), +('mall4cloud-order-invoice-450','1','1000','订单发票id'), +('mall4cloud-order-invoice-451','1','1000','订单发票id'), +('mall4cloud-order-invoice-452','1','1000','订单发票id'), +('mall4cloud-order-invoice-453','1','1000','订单发票id'), +('mall4cloud-order-invoice-454','1','1000','订单发票id'), +('mall4cloud-order-invoice-455','1','1000','订单发票id'), +('mall4cloud-order-invoice-456','1','1000','订单发票id'), +('mall4cloud-order-invoice-457','1','1000','订单发票id'), +('mall4cloud-order-invoice-458','1','1000','订单发票id'), +('mall4cloud-order-invoice-459','1','1000','订单发票id'), +('mall4cloud-order-invoice-460','1','1000','订单发票id'), +('mall4cloud-order-invoice-461','1','1000','订单发票id'), +('mall4cloud-order-invoice-462','1','1000','订单发票id'), +('mall4cloud-order-invoice-463','1','1000','订单发票id'), +('mall4cloud-order-invoice-464','1','1000','订单发票id'), +('mall4cloud-order-invoice-465','1','1000','订单发票id'), +('mall4cloud-order-invoice-466','1','1000','订单发票id'), +('mall4cloud-order-invoice-467','1','1000','订单发票id'), +('mall4cloud-order-invoice-468','1','1000','订单发票id'), +('mall4cloud-order-invoice-469','1','1000','订单发票id'), +('mall4cloud-order-invoice-470','1','1000','订单发票id'), +('mall4cloud-order-invoice-471','1','1000','订单发票id'), +('mall4cloud-order-invoice-472','1','1000','订单发票id'), +('mall4cloud-order-invoice-473','1','1000','订单发票id'), +('mall4cloud-order-invoice-474','1','1000','订单发票id'), +('mall4cloud-order-invoice-475','1','1000','订单发票id'), +('mall4cloud-order-invoice-476','1','1000','订单发票id'), +('mall4cloud-order-invoice-477','1','1000','订单发票id'), +('mall4cloud-order-invoice-478','1','1000','订单发票id'), +('mall4cloud-order-invoice-479','1','1000','订单发票id'), +('mall4cloud-order-invoice-480','1','1000','订单发票id'), +('mall4cloud-order-invoice-481','1','1000','订单发票id'), +('mall4cloud-order-invoice-482','1','1000','订单发票id'), +('mall4cloud-order-invoice-483','1','1000','订单发票id'), +('mall4cloud-order-invoice-484','1','1000','订单发票id'), +('mall4cloud-order-invoice-485','1','1000','订单发票id'), +('mall4cloud-order-invoice-486','1','1000','订单发票id'), +('mall4cloud-order-invoice-487','1','1000','订单发票id'), +('mall4cloud-order-invoice-488','1','1000','订单发票id'), +('mall4cloud-order-invoice-489','1','1000','订单发票id'), +('mall4cloud-order-invoice-490','1','1000','订单发票id'), +('mall4cloud-order-invoice-491','1','1000','订单发票id'), +('mall4cloud-order-invoice-492','1','1000','订单发票id'), +('mall4cloud-order-invoice-493','1','1000','订单发票id'), +('mall4cloud-order-invoice-494','1','1000','订单发票id'), +('mall4cloud-order-invoice-495','1','1000','订单发票id'), +('mall4cloud-order-invoice-496','1','1000','订单发票id'), +('mall4cloud-order-invoice-497','1','1000','订单发票id'), +('mall4cloud-order-invoice-498','1','1000','订单发票id'), +('mall4cloud-order-invoice-499','1','1000','订单发票id'), +('mall4cloud-order-invoice-500','1','1000','订单发票id'), +('mall4cloud-order-invoice-501','1','1000','订单发票id'), +('mall4cloud-order-invoice-502','1','1000','订单发票id'), +('mall4cloud-order-invoice-503','1','1000','订单发票id'), +('mall4cloud-order-invoice-504','1','1000','订单发票id'), +('mall4cloud-order-invoice-505','1','1000','订单发票id'), +('mall4cloud-order-invoice-506','1','1000','订单发票id'), +('mall4cloud-order-invoice-507','1','1000','订单发票id'), +('mall4cloud-order-invoice-508','1','1000','订单发票id'), +('mall4cloud-order-invoice-509','1','1000','订单发票id'), +('mall4cloud-order-invoice-510','1','1000','订单发票id'), +('mall4cloud-order-invoice-511','1','1000','订单发票id'), +('mall4cloud-order-invoice-512','1','1000','订单发票id'), +('mall4cloud-order-invoice-513','1','1000','订单发票id'), +('mall4cloud-order-invoice-514','1','1000','订单发票id'), +('mall4cloud-order-invoice-515','1','1000','订单发票id'), +('mall4cloud-order-invoice-516','1','1000','订单发票id'), +('mall4cloud-order-invoice-517','1','1000','订单发票id'), +('mall4cloud-order-invoice-518','1','1000','订单发票id'), +('mall4cloud-order-invoice-519','1','1000','订单发票id'), +('mall4cloud-order-invoice-520','1','1000','订单发票id'), +('mall4cloud-order-invoice-521','1','1000','订单发票id'), +('mall4cloud-order-invoice-522','1','1000','订单发票id'), +('mall4cloud-order-invoice-523','1','1000','订单发票id'), +('mall4cloud-order-invoice-524','1','1000','订单发票id'), +('mall4cloud-order-invoice-525','1','1000','订单发票id'), +('mall4cloud-order-invoice-526','1','1000','订单发票id'), +('mall4cloud-order-invoice-527','1','1000','订单发票id'), +('mall4cloud-order-invoice-528','1','1000','订单发票id'), +('mall4cloud-order-invoice-529','1','1000','订单发票id'), +('mall4cloud-order-invoice-530','1','1000','订单发票id'), +('mall4cloud-order-invoice-531','1','1000','订单发票id'), +('mall4cloud-order-invoice-532','1','1000','订单发票id'), +('mall4cloud-order-invoice-533','1','1000','订单发票id'), +('mall4cloud-order-invoice-534','1','1000','订单发票id'), +('mall4cloud-order-invoice-535','1','1000','订单发票id'), +('mall4cloud-order-invoice-536','1','1000','订单发票id'), +('mall4cloud-order-invoice-537','1','1000','订单发票id'), +('mall4cloud-order-invoice-538','1','1000','订单发票id'), +('mall4cloud-order-invoice-539','1','1000','订单发票id'), +('mall4cloud-order-invoice-540','1','1000','订单发票id'), +('mall4cloud-order-invoice-541','1','1000','订单发票id'), +('mall4cloud-order-invoice-542','1','1000','订单发票id'), +('mall4cloud-order-invoice-543','1','1000','订单发票id'), +('mall4cloud-order-invoice-544','1','1000','订单发票id'), +('mall4cloud-order-invoice-545','1','1000','订单发票id'), +('mall4cloud-order-invoice-546','1','1000','订单发票id'), +('mall4cloud-order-invoice-547','1','1000','订单发票id'), +('mall4cloud-order-invoice-548','1','1000','订单发票id'), +('mall4cloud-order-invoice-549','1','1000','订单发票id'), +('mall4cloud-order-invoice-550','1','1000','订单发票id'), +('mall4cloud-order-invoice-551','1','1000','订单发票id'), +('mall4cloud-order-invoice-552','1','1000','订单发票id'), +('mall4cloud-order-invoice-553','1','1000','订单发票id'), +('mall4cloud-order-invoice-554','1','1000','订单发票id'), +('mall4cloud-order-invoice-555','1','1000','订单发票id'), +('mall4cloud-order-invoice-556','1','1000','订单发票id'), +('mall4cloud-order-invoice-557','1','1000','订单发票id'), +('mall4cloud-order-invoice-558','1','1000','订单发票id'), +('mall4cloud-order-invoice-559','1','1000','订单发票id'), +('mall4cloud-order-invoice-560','1','1000','订单发票id'), +('mall4cloud-order-invoice-561','1','1000','订单发票id'), +('mall4cloud-order-invoice-562','1','1000','订单发票id'), +('mall4cloud-order-invoice-563','1','1000','订单发票id'), +('mall4cloud-order-invoice-564','1','1000','订单发票id'), +('mall4cloud-order-invoice-565','1','1000','订单发票id'), +('mall4cloud-order-invoice-566','1','1000','订单发票id'), +('mall4cloud-order-invoice-567','1','1000','订单发票id'), +('mall4cloud-order-invoice-568','1','1000','订单发票id'), +('mall4cloud-order-invoice-569','1','1000','订单发票id'), +('mall4cloud-order-invoice-570','1','1000','订单发票id'), +('mall4cloud-order-invoice-571','1','1000','订单发票id'), +('mall4cloud-order-invoice-572','1','1000','订单发票id'), +('mall4cloud-order-invoice-573','1','1000','订单发票id'), +('mall4cloud-order-invoice-574','1','1000','订单发票id'), +('mall4cloud-order-invoice-575','1','1000','订单发票id'), +('mall4cloud-order-invoice-576','1','1000','订单发票id'), +('mall4cloud-order-invoice-577','1','1000','订单发票id'), +('mall4cloud-order-invoice-578','1','1000','订单发票id'), +('mall4cloud-order-invoice-579','1','1000','订单发票id'), +('mall4cloud-order-invoice-580','1','1000','订单发票id'), +('mall4cloud-order-invoice-581','1','1000','订单发票id'), +('mall4cloud-order-invoice-582','1','1000','订单发票id'), +('mall4cloud-order-invoice-583','1','1000','订单发票id'), +('mall4cloud-order-invoice-584','1','1000','订单发票id'), +('mall4cloud-order-invoice-585','1','1000','订单发票id'), +('mall4cloud-order-invoice-586','1','1000','订单发票id'), +('mall4cloud-order-invoice-587','1','1000','订单发票id'), +('mall4cloud-order-invoice-588','1','1000','订单发票id'), +('mall4cloud-order-invoice-589','1','1000','订单发票id'), +('mall4cloud-order-invoice-590','1','1000','订单发票id'), +('mall4cloud-order-invoice-591','1','1000','订单发票id'), +('mall4cloud-order-invoice-592','1','1000','订单发票id'), +('mall4cloud-order-invoice-593','1','1000','订单发票id'), +('mall4cloud-order-invoice-594','1','1000','订单发票id'), +('mall4cloud-order-invoice-595','1','1000','订单发票id'), +('mall4cloud-order-invoice-596','1','1000','订单发票id'), +('mall4cloud-order-invoice-597','1','1000','订单发票id'), +('mall4cloud-order-invoice-598','1','1000','订单发票id'), +('mall4cloud-order-invoice-599','1','1000','订单发票id'), +('mall4cloud-order-invoice-600','1','1000','订单发票id'), +('mall4cloud-order-invoice-601','1','1000','订单发票id'), +('mall4cloud-order-invoice-602','1','1000','订单发票id'), +('mall4cloud-order-invoice-603','1','1000','订单发票id'), +('mall4cloud-order-invoice-604','1','1000','订单发票id'), +('mall4cloud-order-invoice-605','1','1000','订单发票id'), +('mall4cloud-order-invoice-606','1','1000','订单发票id'), +('mall4cloud-order-invoice-607','1','1000','订单发票id'), +('mall4cloud-order-invoice-608','1','1000','订单发票id'), +('mall4cloud-order-invoice-609','1','1000','订单发票id'), +('mall4cloud-order-invoice-610','1','1000','订单发票id'), +('mall4cloud-order-invoice-611','1','1000','订单发票id'), +('mall4cloud-order-invoice-612','1','1000','订单发票id'), +('mall4cloud-order-invoice-613','1','1000','订单发票id'), +('mall4cloud-order-invoice-614','1','1000','订单发票id'), +('mall4cloud-order-invoice-615','1','1000','订单发票id'), +('mall4cloud-order-invoice-616','1','1000','订单发票id'), +('mall4cloud-order-invoice-617','1','1000','订单发票id'), +('mall4cloud-order-invoice-618','1','1000','订单发票id'), +('mall4cloud-order-invoice-619','1','1000','订单发票id'), +('mall4cloud-order-invoice-620','1','1000','订单发票id'), +('mall4cloud-order-invoice-621','1','1000','订单发票id'), +('mall4cloud-order-invoice-622','1','1000','订单发票id'), +('mall4cloud-order-invoice-623','1','1000','订单发票id'), +('mall4cloud-order-invoice-624','1','1000','订单发票id'), +('mall4cloud-order-invoice-625','1','1000','订单发票id'), +('mall4cloud-order-invoice-626','1','1000','订单发票id'), +('mall4cloud-order-invoice-627','1','1000','订单发票id'), +('mall4cloud-order-invoice-628','1','1000','订单发票id'), +('mall4cloud-order-invoice-629','1','1000','订单发票id'), +('mall4cloud-order-invoice-630','1','1000','订单发票id'), +('mall4cloud-order-invoice-631','1','1000','订单发票id'), +('mall4cloud-order-invoice-632','1','1000','订单发票id'), +('mall4cloud-order-invoice-633','1','1000','订单发票id'), +('mall4cloud-order-invoice-634','1','1000','订单发票id'), +('mall4cloud-order-invoice-635','1','1000','订单发票id'), +('mall4cloud-order-invoice-636','1','1000','订单发票id'), +('mall4cloud-order-invoice-637','1','1000','订单发票id'), +('mall4cloud-order-invoice-638','1','1000','订单发票id'), +('mall4cloud-order-invoice-639','1','1000','订单发票id'), +('mall4cloud-order-invoice-640','1','1000','订单发票id'), +('mall4cloud-order-invoice-641','1','1000','订单发票id'), +('mall4cloud-order-invoice-642','1','1000','订单发票id'), +('mall4cloud-order-invoice-643','1','1000','订单发票id'), +('mall4cloud-order-invoice-644','1','1000','订单发票id'), +('mall4cloud-order-invoice-645','1','1000','订单发票id'), +('mall4cloud-order-invoice-646','1','1000','订单发票id'), +('mall4cloud-order-invoice-647','1','1000','订单发票id'), +('mall4cloud-order-invoice-648','1','1000','订单发票id'), +('mall4cloud-order-invoice-649','1','1000','订单发票id'), +('mall4cloud-order-invoice-650','1','1000','订单发票id'), +('mall4cloud-order-invoice-651','1','1000','订单发票id'), +('mall4cloud-order-invoice-652','1','1000','订单发票id'), +('mall4cloud-order-invoice-653','1','1000','订单发票id'), +('mall4cloud-order-invoice-654','1','1000','订单发票id'), +('mall4cloud-order-invoice-655','1','1000','订单发票id'), +('mall4cloud-order-invoice-656','1','1000','订单发票id'), +('mall4cloud-order-invoice-657','1','1000','订单发票id'), +('mall4cloud-order-invoice-658','1','1000','订单发票id'), +('mall4cloud-order-invoice-659','1','1000','订单发票id'), +('mall4cloud-order-invoice-660','1','1000','订单发票id'), +('mall4cloud-order-invoice-661','1','1000','订单发票id'), +('mall4cloud-order-invoice-662','1','1000','订单发票id'), +('mall4cloud-order-invoice-663','1','1000','订单发票id'), +('mall4cloud-order-invoice-664','1','1000','订单发票id'), +('mall4cloud-order-invoice-665','1','1000','订单发票id'), +('mall4cloud-order-invoice-666','1','1000','订单发票id'), +('mall4cloud-order-invoice-667','1','1000','订单发票id'), +('mall4cloud-order-invoice-668','1','1000','订单发票id'), +('mall4cloud-order-invoice-669','1','1000','订单发票id'), +('mall4cloud-order-invoice-670','1','1000','订单发票id'), +('mall4cloud-order-invoice-671','1','1000','订单发票id'), +('mall4cloud-order-invoice-672','1','1000','订单发票id'), +('mall4cloud-order-invoice-673','1','1000','订单发票id'), +('mall4cloud-order-invoice-674','1','1000','订单发票id'), +('mall4cloud-order-invoice-675','1','1000','订单发票id'), +('mall4cloud-order-invoice-676','1','1000','订单发票id'), +('mall4cloud-order-invoice-677','1','1000','订单发票id'), +('mall4cloud-order-invoice-678','1','1000','订单发票id'), +('mall4cloud-order-invoice-679','1','1000','订单发票id'), +('mall4cloud-order-invoice-680','1','1000','订单发票id'), +('mall4cloud-order-invoice-681','1','1000','订单发票id'), +('mall4cloud-order-invoice-682','1','1000','订单发票id'), +('mall4cloud-order-invoice-683','1','1000','订单发票id'), +('mall4cloud-order-invoice-684','1','1000','订单发票id'), +('mall4cloud-order-invoice-685','1','1000','订单发票id'), +('mall4cloud-order-invoice-686','1','1000','订单发票id'), +('mall4cloud-order-invoice-687','1','1000','订单发票id'), +('mall4cloud-order-invoice-688','1','1000','订单发票id'), +('mall4cloud-order-invoice-689','1','1000','订单发票id'), +('mall4cloud-order-invoice-690','1','1000','订单发票id'), +('mall4cloud-order-invoice-691','1','1000','订单发票id'), +('mall4cloud-order-invoice-692','1','1000','订单发票id'), +('mall4cloud-order-invoice-693','1','1000','订单发票id'), +('mall4cloud-order-invoice-694','1','1000','订单发票id'), +('mall4cloud-order-invoice-695','1','1000','订单发票id'), +('mall4cloud-order-invoice-696','1','1000','订单发票id'), +('mall4cloud-order-invoice-697','1','1000','订单发票id'), +('mall4cloud-order-invoice-698','1','1000','订单发票id'), +('mall4cloud-order-invoice-699','1','1000','订单发票id'), +('mall4cloud-order-invoice-700','1','1000','订单发票id'), +('mall4cloud-order-invoice-701','1','1000','订单发票id'), +('mall4cloud-order-invoice-702','1','1000','订单发票id'), +('mall4cloud-order-invoice-703','1','1000','订单发票id'), +('mall4cloud-order-invoice-704','1','1000','订单发票id'), +('mall4cloud-order-invoice-705','1','1000','订单发票id'), +('mall4cloud-order-invoice-706','1','1000','订单发票id'), +('mall4cloud-order-invoice-707','1','1000','订单发票id'), +('mall4cloud-order-invoice-708','1','1000','订单发票id'), +('mall4cloud-order-invoice-709','1','1000','订单发票id'), +('mall4cloud-order-invoice-710','1','1000','订单发票id'), +('mall4cloud-order-invoice-711','1','1000','订单发票id'), +('mall4cloud-order-invoice-712','1','1000','订单发票id'), +('mall4cloud-order-invoice-713','1','1000','订单发票id'), +('mall4cloud-order-invoice-714','1','1000','订单发票id'), +('mall4cloud-order-invoice-715','1','1000','订单发票id'), +('mall4cloud-order-invoice-716','1','1000','订单发票id'), +('mall4cloud-order-invoice-717','1','1000','订单发票id'), +('mall4cloud-order-invoice-718','1','1000','订单发票id'), +('mall4cloud-order-invoice-719','1','1000','订单发票id'), +('mall4cloud-order-invoice-720','1','1000','订单发票id'), +('mall4cloud-order-invoice-721','1','1000','订单发票id'), +('mall4cloud-order-invoice-722','1','1000','订单发票id'), +('mall4cloud-order-invoice-723','1','1000','订单发票id'), +('mall4cloud-order-invoice-724','1','1000','订单发票id'), +('mall4cloud-order-invoice-725','1','1000','订单发票id'), +('mall4cloud-order-invoice-726','1','1000','订单发票id'), +('mall4cloud-order-invoice-727','1','1000','订单发票id'), +('mall4cloud-order-invoice-728','1','1000','订单发票id'), +('mall4cloud-order-invoice-729','1','1000','订单发票id'), +('mall4cloud-order-invoice-730','1','1000','订单发票id'), +('mall4cloud-order-invoice-731','1','1000','订单发票id'), +('mall4cloud-order-invoice-732','1','1000','订单发票id'), +('mall4cloud-order-invoice-733','1','1000','订单发票id'), +('mall4cloud-order-invoice-734','1','1000','订单发票id'), +('mall4cloud-order-invoice-735','1','1000','订单发票id'), +('mall4cloud-order-invoice-736','1','1000','订单发票id'), +('mall4cloud-order-invoice-737','1','1000','订单发票id'), +('mall4cloud-order-invoice-738','1','1000','订单发票id'), +('mall4cloud-order-invoice-739','1','1000','订单发票id'), +('mall4cloud-order-invoice-740','1','1000','订单发票id'), +('mall4cloud-order-invoice-741','1','1000','订单发票id'), +('mall4cloud-order-invoice-742','1','1000','订单发票id'), +('mall4cloud-order-invoice-743','1','1000','订单发票id'), +('mall4cloud-order-invoice-744','1','1000','订单发票id'), +('mall4cloud-order-invoice-745','1','1000','订单发票id'), +('mall4cloud-order-invoice-746','1','1000','订单发票id'), +('mall4cloud-order-invoice-747','1','1000','订单发票id'), +('mall4cloud-order-invoice-748','1','1000','订单发票id'), +('mall4cloud-order-invoice-749','1','1000','订单发票id'), +('mall4cloud-order-invoice-750','1','1000','订单发票id'), +('mall4cloud-order-invoice-751','1','1000','订单发票id'), +('mall4cloud-order-invoice-752','1','1000','订单发票id'), +('mall4cloud-order-invoice-753','1','1000','订单发票id'), +('mall4cloud-order-invoice-754','1','1000','订单发票id'), +('mall4cloud-order-invoice-755','1','1000','订单发票id'), +('mall4cloud-order-invoice-756','1','1000','订单发票id'), +('mall4cloud-order-invoice-757','1','1000','订单发票id'), +('mall4cloud-order-invoice-758','1','1000','订单发票id'), +('mall4cloud-order-invoice-759','1','1000','订单发票id'), +('mall4cloud-order-invoice-760','1','1000','订单发票id'), +('mall4cloud-order-invoice-761','1','1000','订单发票id'), +('mall4cloud-order-invoice-762','1','1000','订单发票id'), +('mall4cloud-order-invoice-763','1','1000','订单发票id'), +('mall4cloud-order-invoice-764','1','1000','订单发票id'), +('mall4cloud-order-invoice-765','1','1000','订单发票id'), +('mall4cloud-order-invoice-766','1','1000','订单发票id'), +('mall4cloud-order-invoice-767','1','1000','订单发票id'), +('mall4cloud-order-invoice-768','1','1000','订单发票id'), +('mall4cloud-order-invoice-769','1','1000','订单发票id'), +('mall4cloud-order-invoice-770','1','1000','订单发票id'), +('mall4cloud-order-invoice-771','1','1000','订单发票id'), +('mall4cloud-order-invoice-772','1','1000','订单发票id'), +('mall4cloud-order-invoice-773','1','1000','订单发票id'), +('mall4cloud-order-invoice-774','1','1000','订单发票id'), +('mall4cloud-order-invoice-775','1','1000','订单发票id'), +('mall4cloud-order-invoice-776','1','1000','订单发票id'), +('mall4cloud-order-invoice-777','1','1000','订单发票id'), +('mall4cloud-order-invoice-778','1','1000','订单发票id'), +('mall4cloud-order-invoice-779','1','1000','订单发票id'), +('mall4cloud-order-invoice-780','1','1000','订单发票id'), +('mall4cloud-order-invoice-781','1','1000','订单发票id'), +('mall4cloud-order-invoice-782','1','1000','订单发票id'), +('mall4cloud-order-invoice-783','1','1000','订单发票id'), +('mall4cloud-order-invoice-784','1','1000','订单发票id'), +('mall4cloud-order-invoice-785','1','1000','订单发票id'), +('mall4cloud-order-invoice-786','1','1000','订单发票id'), +('mall4cloud-order-invoice-787','1','1000','订单发票id'), +('mall4cloud-order-invoice-788','1','1000','订单发票id'), +('mall4cloud-order-invoice-789','1','1000','订单发票id'), +('mall4cloud-order-invoice-790','1','1000','订单发票id'), +('mall4cloud-order-invoice-791','1','1000','订单发票id'), +('mall4cloud-order-invoice-792','1','1000','订单发票id'), +('mall4cloud-order-invoice-793','1','1000','订单发票id'), +('mall4cloud-order-invoice-794','1','1000','订单发票id'), +('mall4cloud-order-invoice-795','1','1000','订单发票id'), +('mall4cloud-order-invoice-796','1','1000','订单发票id'), +('mall4cloud-order-invoice-797','1','1000','订单发票id'), +('mall4cloud-order-invoice-798','1','1000','订单发票id'), +('mall4cloud-order-invoice-799','1','1000','订单发票id'), +('mall4cloud-order-invoice-800','1','1000','订单发票id'), +('mall4cloud-order-invoice-801','1','1000','订单发票id'), +('mall4cloud-order-invoice-802','1','1000','订单发票id'), +('mall4cloud-order-invoice-803','1','1000','订单发票id'), +('mall4cloud-order-invoice-804','1','1000','订单发票id'), +('mall4cloud-order-invoice-805','1','1000','订单发票id'), +('mall4cloud-order-invoice-806','1','1000','订单发票id'), +('mall4cloud-order-invoice-807','1','1000','订单发票id'), +('mall4cloud-order-invoice-808','1','1000','订单发票id'), +('mall4cloud-order-invoice-809','1','1000','订单发票id'), +('mall4cloud-order-invoice-810','1','1000','订单发票id'), +('mall4cloud-order-invoice-811','1','1000','订单发票id'), +('mall4cloud-order-invoice-812','1','1000','订单发票id'), +('mall4cloud-order-invoice-813','1','1000','订单发票id'), +('mall4cloud-order-invoice-814','1','1000','订单发票id'), +('mall4cloud-order-invoice-815','1','1000','订单发票id'), +('mall4cloud-order-invoice-816','1','1000','订单发票id'), +('mall4cloud-order-invoice-817','1','1000','订单发票id'), +('mall4cloud-order-invoice-818','1','1000','订单发票id'), +('mall4cloud-order-invoice-819','1','1000','订单发票id'), +('mall4cloud-order-invoice-820','1','1000','订单发票id'), +('mall4cloud-order-invoice-821','1','1000','订单发票id'), +('mall4cloud-order-invoice-822','1','1000','订单发票id'), +('mall4cloud-order-invoice-823','1','1000','订单发票id'), +('mall4cloud-order-invoice-824','1','1000','订单发票id'), +('mall4cloud-order-invoice-825','1','1000','订单发票id'), +('mall4cloud-order-invoice-826','1','1000','订单发票id'), +('mall4cloud-order-invoice-827','1','1000','订单发票id'), +('mall4cloud-order-invoice-828','1','1000','订单发票id'), +('mall4cloud-order-invoice-829','1','1000','订单发票id'), +('mall4cloud-order-invoice-830','1','1000','订单发票id'), +('mall4cloud-order-invoice-831','1','1000','订单发票id'), +('mall4cloud-order-invoice-832','1','1000','订单发票id'), +('mall4cloud-order-invoice-833','1','1000','订单发票id'), +('mall4cloud-order-invoice-834','1','1000','订单发票id'), +('mall4cloud-order-invoice-835','1','1000','订单发票id'), +('mall4cloud-order-invoice-836','1','1000','订单发票id'), +('mall4cloud-order-invoice-837','1','1000','订单发票id'), +('mall4cloud-order-invoice-838','1','1000','订单发票id'), +('mall4cloud-order-invoice-839','1','1000','订单发票id'), +('mall4cloud-order-invoice-840','1','1000','订单发票id'), +('mall4cloud-order-invoice-841','1','1000','订单发票id'), +('mall4cloud-order-invoice-842','1','1000','订单发票id'), +('mall4cloud-order-invoice-843','1','1000','订单发票id'), +('mall4cloud-order-invoice-844','1','1000','订单发票id'), +('mall4cloud-order-invoice-845','1','1000','订单发票id'), +('mall4cloud-order-invoice-846','1','1000','订单发票id'), +('mall4cloud-order-invoice-847','1','1000','订单发票id'), +('mall4cloud-order-invoice-848','1','1000','订单发票id'), +('mall4cloud-order-invoice-849','1','1000','订单发票id'), +('mall4cloud-order-invoice-850','1','1000','订单发票id'), +('mall4cloud-order-invoice-851','1','1000','订单发票id'), +('mall4cloud-order-invoice-852','1','1000','订单发票id'), +('mall4cloud-order-invoice-853','1','1000','订单发票id'), +('mall4cloud-order-invoice-854','1','1000','订单发票id'), +('mall4cloud-order-invoice-855','1','1000','订单发票id'), +('mall4cloud-order-invoice-856','1','1000','订单发票id'), +('mall4cloud-order-invoice-857','1','1000','订单发票id'), +('mall4cloud-order-invoice-858','1','1000','订单发票id'), +('mall4cloud-order-invoice-859','1','1000','订单发票id'), +('mall4cloud-order-invoice-860','1','1000','订单发票id'), +('mall4cloud-order-invoice-861','1','1000','订单发票id'), +('mall4cloud-order-invoice-862','1','1000','订单发票id'), +('mall4cloud-order-invoice-863','1','1000','订单发票id'), +('mall4cloud-order-invoice-864','1','1000','订单发票id'), +('mall4cloud-order-invoice-865','1','1000','订单发票id'), +('mall4cloud-order-invoice-866','1','1000','订单发票id'), +('mall4cloud-order-invoice-867','1','1000','订单发票id'), +('mall4cloud-order-invoice-868','1','1000','订单发票id'), +('mall4cloud-order-invoice-869','1','1000','订单发票id'), +('mall4cloud-order-invoice-870','1','1000','订单发票id'), +('mall4cloud-order-invoice-871','1','1000','订单发票id'), +('mall4cloud-order-invoice-872','1','1000','订单发票id'), +('mall4cloud-order-invoice-873','1','1000','订单发票id'), +('mall4cloud-order-invoice-874','1','1000','订单发票id'), +('mall4cloud-order-invoice-875','1','1000','订单发票id'), +('mall4cloud-order-invoice-876','1','1000','订单发票id'), +('mall4cloud-order-invoice-877','1','1000','订单发票id'), +('mall4cloud-order-invoice-878','1','1000','订单发票id'), +('mall4cloud-order-invoice-879','1','1000','订单发票id'), +('mall4cloud-order-invoice-880','1','1000','订单发票id'), +('mall4cloud-order-invoice-881','1','1000','订单发票id'), +('mall4cloud-order-invoice-882','1','1000','订单发票id'), +('mall4cloud-order-invoice-883','1','1000','订单发票id'), +('mall4cloud-order-invoice-884','1','1000','订单发票id'), +('mall4cloud-order-invoice-885','1','1000','订单发票id'), +('mall4cloud-order-invoice-886','1','1000','订单发票id'), +('mall4cloud-order-invoice-887','1','1000','订单发票id'), +('mall4cloud-order-invoice-888','1','1000','订单发票id'), +('mall4cloud-order-invoice-889','1','1000','订单发票id'), +('mall4cloud-order-invoice-890','1','1000','订单发票id'), +('mall4cloud-order-invoice-891','1','1000','订单发票id'), +('mall4cloud-order-invoice-892','1','1000','订单发票id'), +('mall4cloud-order-invoice-893','1','1000','订单发票id'), +('mall4cloud-order-invoice-894','1','1000','订单发票id'), +('mall4cloud-order-invoice-895','1','1000','订单发票id'), +('mall4cloud-order-invoice-896','1','1000','订单发票id'), +('mall4cloud-order-invoice-897','1','1000','订单发票id'), +('mall4cloud-order-invoice-898','1','1000','订单发票id'), +('mall4cloud-order-invoice-899','1','1000','订单发票id'), +('mall4cloud-order-invoice-900','1','1000','订单发票id'), +('mall4cloud-order-invoice-901','1','1000','订单发票id'), +('mall4cloud-order-invoice-902','1','1000','订单发票id'), +('mall4cloud-order-invoice-903','1','1000','订单发票id'), +('mall4cloud-order-invoice-904','1','1000','订单发票id'), +('mall4cloud-order-invoice-905','1','1000','订单发票id'), +('mall4cloud-order-invoice-906','1','1000','订单发票id'), +('mall4cloud-order-invoice-907','1','1000','订单发票id'), +('mall4cloud-order-invoice-908','1','1000','订单发票id'), +('mall4cloud-order-invoice-909','1','1000','订单发票id'), +('mall4cloud-order-invoice-910','1','1000','订单发票id'), +('mall4cloud-order-invoice-911','1','1000','订单发票id'), +('mall4cloud-order-invoice-912','1','1000','订单发票id'), +('mall4cloud-order-invoice-913','1','1000','订单发票id'), +('mall4cloud-order-invoice-914','1','1000','订单发票id'), +('mall4cloud-order-invoice-915','1','1000','订单发票id'), +('mall4cloud-order-invoice-916','1','1000','订单发票id'), +('mall4cloud-order-invoice-917','1','1000','订单发票id'), +('mall4cloud-order-invoice-918','1','1000','订单发票id'), +('mall4cloud-order-invoice-919','1','1000','订单发票id'), +('mall4cloud-order-invoice-920','1','1000','订单发票id'), +('mall4cloud-order-invoice-921','1','1000','订单发票id'), +('mall4cloud-order-invoice-922','1','1000','订单发票id'), +('mall4cloud-order-invoice-923','1','1000','订单发票id'), +('mall4cloud-order-invoice-924','1','1000','订单发票id'), +('mall4cloud-order-invoice-925','1','1000','订单发票id'), +('mall4cloud-order-invoice-926','1','1000','订单发票id'), +('mall4cloud-order-invoice-927','1','1000','订单发票id'), +('mall4cloud-order-invoice-928','1','1000','订单发票id'), +('mall4cloud-order-invoice-929','1','1000','订单发票id'), +('mall4cloud-order-invoice-930','1','1000','订单发票id'), +('mall4cloud-order-invoice-931','1','1000','订单发票id'), +('mall4cloud-order-invoice-932','1','1000','订单发票id'), +('mall4cloud-order-invoice-933','1','1000','订单发票id'), +('mall4cloud-order-invoice-934','1','1000','订单发票id'), +('mall4cloud-order-invoice-935','1','1000','订单发票id'), +('mall4cloud-order-invoice-936','1','1000','订单发票id'), +('mall4cloud-order-invoice-937','1','1000','订单发票id'), +('mall4cloud-order-invoice-938','1','1000','订单发票id'), +('mall4cloud-order-invoice-939','1','1000','订单发票id'), +('mall4cloud-order-invoice-940','1','1000','订单发票id'), +('mall4cloud-order-invoice-941','1','1000','订单发票id'), +('mall4cloud-order-invoice-942','1','1000','订单发票id'), +('mall4cloud-order-invoice-943','1','1000','订单发票id'), +('mall4cloud-order-invoice-944','1','1000','订单发票id'), +('mall4cloud-order-invoice-945','1','1000','订单发票id'), +('mall4cloud-order-invoice-946','1','1000','订单发票id'), +('mall4cloud-order-invoice-947','1','1000','订单发票id'), +('mall4cloud-order-invoice-948','1','1000','订单发票id'), +('mall4cloud-order-invoice-949','1','1000','订单发票id'), +('mall4cloud-order-invoice-950','1','1000','订单发票id'), +('mall4cloud-order-invoice-951','1','1000','订单发票id'), +('mall4cloud-order-invoice-952','1','1000','订单发票id'), +('mall4cloud-order-invoice-953','1','1000','订单发票id'), +('mall4cloud-order-invoice-954','1','1000','订单发票id'), +('mall4cloud-order-invoice-955','1','1000','订单发票id'), +('mall4cloud-order-invoice-956','1','1000','订单发票id'), +('mall4cloud-order-invoice-957','1','1000','订单发票id'), +('mall4cloud-order-invoice-958','1','1000','订单发票id'), +('mall4cloud-order-invoice-959','1','1000','订单发票id'), +('mall4cloud-order-invoice-960','1','1000','订单发票id'), +('mall4cloud-order-invoice-961','1','1000','订单发票id'), +('mall4cloud-order-invoice-962','1','1000','订单发票id'), +('mall4cloud-order-invoice-963','1','1000','订单发票id'), +('mall4cloud-order-invoice-964','1','1000','订单发票id'), +('mall4cloud-order-invoice-965','1','1000','订单发票id'), +('mall4cloud-order-invoice-966','1','1000','订单发票id'), +('mall4cloud-order-invoice-967','1','1000','订单发票id'), +('mall4cloud-order-invoice-968','1','1000','订单发票id'), +('mall4cloud-order-invoice-969','1','1000','订单发票id'), +('mall4cloud-order-invoice-970','1','1000','订单发票id'), +('mall4cloud-order-invoice-971','1','1000','订单发票id'), +('mall4cloud-order-invoice-972','1','1000','订单发票id'), +('mall4cloud-order-invoice-973','1','1000','订单发票id'), +('mall4cloud-order-invoice-974','1','1000','订单发票id'), +('mall4cloud-order-invoice-975','1','1000','订单发票id'), +('mall4cloud-order-invoice-976','1','1000','订单发票id'), +('mall4cloud-order-invoice-977','1','1000','订单发票id'), +('mall4cloud-order-invoice-978','1','1000','订单发票id'), +('mall4cloud-order-invoice-979','1','1000','订单发票id'), +('mall4cloud-order-invoice-980','1','1000','订单发票id'), +('mall4cloud-order-invoice-981','1','1000','订单发票id'), +('mall4cloud-order-invoice-982','1','1000','订单发票id'), +('mall4cloud-order-invoice-983','1','1000','订单发票id'), +('mall4cloud-order-invoice-984','1','1000','订单发票id'), +('mall4cloud-order-invoice-985','1','1000','订单发票id'), +('mall4cloud-order-invoice-986','1','1000','订单发票id'), +('mall4cloud-order-invoice-987','1','1000','订单发票id'), +('mall4cloud-order-invoice-988','1','1000','订单发票id'), +('mall4cloud-order-invoice-989','1','1000','订单发票id'), +('mall4cloud-order-invoice-990','1','1000','订单发票id'), +('mall4cloud-order-invoice-991','1','1000','订单发票id'), +('mall4cloud-order-invoice-992','1','1000','订单发票id'), +('mall4cloud-order-invoice-993','1','1000','订单发票id'), +('mall4cloud-order-invoice-994','1','1000','订单发票id'), +('mall4cloud-order-invoice-995','1','1000','订单发票id'), +('mall4cloud-order-invoice-996','1','1000','订单发票id'), +('mall4cloud-order-invoice-997','1','1000','订单发票id'), +('mall4cloud-order-invoice-998','1','1000','订单发票id'), +('mall4cloud-order-invoice-999','1','1000','订单发票id'), +('mall4cloud-product-stock-in','1','1000','MongoDB中stockBillLog表的入库单号'), +('mall4cloud-purchase-order-000','1','1000','采购订单id'), +('mall4cloud-purchase-order-001','1','1000','采购订单id'), +('mall4cloud-purchase-order-002','1','1000','采购订单id'), +('mall4cloud-purchase-order-003','1','1000','采购订单id'), +('mall4cloud-purchase-order-004','1','1000','采购订单id'), +('mall4cloud-purchase-order-005','1','1000','采购订单id'), +('mall4cloud-purchase-order-006','1','1000','采购订单id'), +('mall4cloud-purchase-order-007','1','1000','采购订单id'), +('mall4cloud-purchase-order-008','1','1000','采购订单id'), +('mall4cloud-purchase-order-009','1','1000','采购订单id'), +('mall4cloud-purchase-order-010','1','1000','采购订单id'), +('mall4cloud-purchase-order-011','1','1000','采购订单id'), +('mall4cloud-purchase-order-012','1','1000','采购订单id'), +('mall4cloud-purchase-order-013','1','1000','采购订单id'), +('mall4cloud-purchase-order-014','1','1000','采购订单id'), +('mall4cloud-purchase-order-015','1','1000','采购订单id'), +('mall4cloud-purchase-order-016','1','1000','采购订单id'), +('mall4cloud-purchase-order-017','1','1000','采购订单id'), +('mall4cloud-purchase-order-018','1','1000','采购订单id'), +('mall4cloud-purchase-order-019','1','1000','采购订单id'), +('mall4cloud-purchase-order-020','1','1000','采购订单id'), +('mall4cloud-purchase-order-021','1','1000','采购订单id'), +('mall4cloud-purchase-order-022','1','1000','采购订单id'), +('mall4cloud-purchase-order-023','1','1000','采购订单id'), +('mall4cloud-purchase-order-024','1','1000','采购订单id'), +('mall4cloud-purchase-order-025','1','1000','采购订单id'), +('mall4cloud-purchase-order-026','1','1000','采购订单id'), +('mall4cloud-purchase-order-027','1','1000','采购订单id'), +('mall4cloud-purchase-order-028','1','1000','采购订单id'), +('mall4cloud-purchase-order-029','1','1000','采购订单id'), +('mall4cloud-purchase-order-030','1','1000','采购订单id'), +('mall4cloud-purchase-order-031','1','1000','采购订单id'), +('mall4cloud-purchase-order-032','1','1000','采购订单id'), +('mall4cloud-purchase-order-033','1','1000','采购订单id'), +('mall4cloud-purchase-order-034','1','1000','采购订单id'), +('mall4cloud-purchase-order-035','1','1000','采购订单id'), +('mall4cloud-purchase-order-036','1','1000','采购订单id'), +('mall4cloud-purchase-order-037','1','1000','采购订单id'), +('mall4cloud-purchase-order-038','1','1000','采购订单id'), +('mall4cloud-purchase-order-039','1','1000','采购订单id'), +('mall4cloud-purchase-order-040','1','1000','采购订单id'), +('mall4cloud-purchase-order-041','1','1000','采购订单id'), +('mall4cloud-purchase-order-042','1','1000','采购订单id'), +('mall4cloud-purchase-order-043','1','1000','采购订单id'), +('mall4cloud-purchase-order-044','1','1000','采购订单id'), +('mall4cloud-purchase-order-045','1','1000','采购订单id'), +('mall4cloud-purchase-order-046','1','1000','采购订单id'), +('mall4cloud-purchase-order-047','1','1000','采购订单id'), +('mall4cloud-purchase-order-048','1','1000','采购订单id'), +('mall4cloud-purchase-order-049','1','1000','采购订单id'), +('mall4cloud-purchase-order-050','1','1000','采购订单id'), +('mall4cloud-purchase-order-051','1','1000','采购订单id'), +('mall4cloud-purchase-order-052','1','1000','采购订单id'), +('mall4cloud-purchase-order-053','1','1000','采购订单id'), +('mall4cloud-purchase-order-054','1','1000','采购订单id'), +('mall4cloud-purchase-order-055','1','1000','采购订单id'), +('mall4cloud-purchase-order-056','1','1000','采购订单id'), +('mall4cloud-purchase-order-057','1','1000','采购订单id'), +('mall4cloud-purchase-order-058','1','1000','采购订单id'), +('mall4cloud-purchase-order-059','1','1000','采购订单id'), +('mall4cloud-purchase-order-060','1','1000','采购订单id'), +('mall4cloud-purchase-order-061','1','1000','采购订单id'), +('mall4cloud-purchase-order-062','1','1000','采购订单id'), +('mall4cloud-purchase-order-063','1','1000','采购订单id'), +('mall4cloud-purchase-order-064','1','1000','采购订单id'), +('mall4cloud-purchase-order-065','1','1000','采购订单id'), +('mall4cloud-purchase-order-066','1','1000','采购订单id'), +('mall4cloud-purchase-order-067','1','1000','采购订单id'), +('mall4cloud-purchase-order-068','1','1000','采购订单id'), +('mall4cloud-purchase-order-069','1','1000','采购订单id'), +('mall4cloud-purchase-order-070','1','1000','采购订单id'), +('mall4cloud-purchase-order-071','1','1000','采购订单id'), +('mall4cloud-purchase-order-072','1','1000','采购订单id'), +('mall4cloud-purchase-order-073','1','1000','采购订单id'), +('mall4cloud-purchase-order-074','1','1000','采购订单id'), +('mall4cloud-purchase-order-075','1','1000','采购订单id'), +('mall4cloud-purchase-order-076','1','1000','采购订单id'), +('mall4cloud-purchase-order-077','1','1000','采购订单id'), +('mall4cloud-purchase-order-078','1','1000','采购订单id'), +('mall4cloud-purchase-order-079','1','1000','采购订单id'), +('mall4cloud-purchase-order-080','1','1000','采购订单id'), +('mall4cloud-purchase-order-081','1','1000','采购订单id'), +('mall4cloud-purchase-order-082','1','1000','采购订单id'), +('mall4cloud-purchase-order-083','1','1000','采购订单id'), +('mall4cloud-purchase-order-084','1','1000','采购订单id'), +('mall4cloud-purchase-order-085','1','1000','采购订单id'), +('mall4cloud-purchase-order-086','1','1000','采购订单id'), +('mall4cloud-purchase-order-087','1','1000','采购订单id'), +('mall4cloud-purchase-order-088','1','1000','采购订单id'), +('mall4cloud-purchase-order-089','1','1000','采购订单id'), +('mall4cloud-purchase-order-090','1','1000','采购订单id'), +('mall4cloud-purchase-order-091','1','1000','采购订单id'), +('mall4cloud-purchase-order-092','1','1000','采购订单id'), +('mall4cloud-purchase-order-093','1','1000','采购订单id'), +('mall4cloud-purchase-order-094','1','1000','采购订单id'), +('mall4cloud-purchase-order-095','1','1000','采购订单id'), +('mall4cloud-purchase-order-096','1','1000','采购订单id'), +('mall4cloud-purchase-order-097','1','1000','采购订单id'), +('mall4cloud-purchase-order-098','1','1000','采购订单id'), +('mall4cloud-purchase-order-099','1','1000','采购订单id'), +('mall4cloud-purchase-order-100','1','1000','采购订单id'), +('mall4cloud-purchase-order-101','1','1000','采购订单id'), +('mall4cloud-purchase-order-102','1','1000','采购订单id'), +('mall4cloud-purchase-order-103','1','1000','采购订单id'), +('mall4cloud-purchase-order-104','1','1000','采购订单id'), +('mall4cloud-purchase-order-105','1','1000','采购订单id'), +('mall4cloud-purchase-order-106','1','1000','采购订单id'), +('mall4cloud-purchase-order-107','1','1000','采购订单id'), +('mall4cloud-purchase-order-108','1','1000','采购订单id'), +('mall4cloud-purchase-order-109','1','1000','采购订单id'), +('mall4cloud-purchase-order-110','1','1000','采购订单id'), +('mall4cloud-purchase-order-111','1','1000','采购订单id'), +('mall4cloud-purchase-order-112','1','1000','采购订单id'), +('mall4cloud-purchase-order-113','1','1000','采购订单id'), +('mall4cloud-purchase-order-114','1','1000','采购订单id'), +('mall4cloud-purchase-order-115','1','1000','采购订单id'), +('mall4cloud-purchase-order-116','1','1000','采购订单id'), +('mall4cloud-purchase-order-117','1','1000','采购订单id'), +('mall4cloud-purchase-order-118','1','1000','采购订单id'), +('mall4cloud-purchase-order-119','1','1000','采购订单id'), +('mall4cloud-purchase-order-120','1','1000','采购订单id'), +('mall4cloud-purchase-order-121','1','1000','采购订单id'), +('mall4cloud-purchase-order-122','1','1000','采购订单id'), +('mall4cloud-purchase-order-123','1','1000','采购订单id'), +('mall4cloud-purchase-order-124','1','1000','采购订单id'), +('mall4cloud-purchase-order-125','1','1000','采购订单id'), +('mall4cloud-purchase-order-126','1','1000','采购订单id'), +('mall4cloud-purchase-order-127','1','1000','采购订单id'), +('mall4cloud-purchase-order-128','1','1000','采购订单id'), +('mall4cloud-purchase-order-129','1','1000','采购订单id'), +('mall4cloud-purchase-order-130','1','1000','采购订单id'), +('mall4cloud-purchase-order-131','1','1000','采购订单id'), +('mall4cloud-purchase-order-132','1','1000','采购订单id'), +('mall4cloud-purchase-order-133','1','1000','采购订单id'), +('mall4cloud-purchase-order-134','1','1000','采购订单id'), +('mall4cloud-purchase-order-135','1','1000','采购订单id'), +('mall4cloud-purchase-order-136','1','1000','采购订单id'), +('mall4cloud-purchase-order-137','1','1000','采购订单id'), +('mall4cloud-purchase-order-138','1','1000','采购订单id'), +('mall4cloud-purchase-order-139','1','1000','采购订单id'), +('mall4cloud-purchase-order-140','1','1000','采购订单id'), +('mall4cloud-purchase-order-141','1','1000','采购订单id'), +('mall4cloud-purchase-order-142','1','1000','采购订单id'), +('mall4cloud-purchase-order-143','1','1000','采购订单id'), +('mall4cloud-purchase-order-144','1','1000','采购订单id'), +('mall4cloud-purchase-order-145','1','1000','采购订单id'), +('mall4cloud-purchase-order-146','1','1000','采购订单id'), +('mall4cloud-purchase-order-147','1','1000','采购订单id'), +('mall4cloud-purchase-order-148','1','1000','采购订单id'), +('mall4cloud-purchase-order-149','1','1000','采购订单id'), +('mall4cloud-purchase-order-150','1','1000','采购订单id'), +('mall4cloud-purchase-order-151','1','1000','采购订单id'), +('mall4cloud-purchase-order-152','1','1000','采购订单id'), +('mall4cloud-purchase-order-153','1','1000','采购订单id'), +('mall4cloud-purchase-order-154','1','1000','采购订单id'), +('mall4cloud-purchase-order-155','1','1000','采购订单id'), +('mall4cloud-purchase-order-156','1','1000','采购订单id'), +('mall4cloud-purchase-order-157','1','1000','采购订单id'), +('mall4cloud-purchase-order-158','1','1000','采购订单id'), +('mall4cloud-purchase-order-159','1','1000','采购订单id'), +('mall4cloud-purchase-order-160','1','1000','采购订单id'), +('mall4cloud-purchase-order-161','1','1000','采购订单id'), +('mall4cloud-purchase-order-162','1','1000','采购订单id'), +('mall4cloud-purchase-order-163','1','1000','采购订单id'), +('mall4cloud-purchase-order-164','1','1000','采购订单id'), +('mall4cloud-purchase-order-165','1','1000','采购订单id'), +('mall4cloud-purchase-order-166','1','1000','采购订单id'), +('mall4cloud-purchase-order-167','1','1000','采购订单id'), +('mall4cloud-purchase-order-168','1','1000','采购订单id'), +('mall4cloud-purchase-order-169','1','1000','采购订单id'), +('mall4cloud-purchase-order-170','1','1000','采购订单id'), +('mall4cloud-purchase-order-171','1','1000','采购订单id'), +('mall4cloud-purchase-order-172','1','1000','采购订单id'), +('mall4cloud-purchase-order-173','1','1000','采购订单id'), +('mall4cloud-purchase-order-174','1','1000','采购订单id'), +('mall4cloud-purchase-order-175','1','1000','采购订单id'), +('mall4cloud-purchase-order-176','1','1000','采购订单id'), +('mall4cloud-purchase-order-177','1','1000','采购订单id'), +('mall4cloud-purchase-order-178','1','1000','采购订单id'), +('mall4cloud-purchase-order-179','1','1000','采购订单id'), +('mall4cloud-purchase-order-180','1','1000','采购订单id'), +('mall4cloud-purchase-order-181','1','1000','采购订单id'), +('mall4cloud-purchase-order-182','1','1000','采购订单id'), +('mall4cloud-purchase-order-183','1','1000','采购订单id'), +('mall4cloud-purchase-order-184','1','1000','采购订单id'), +('mall4cloud-purchase-order-185','1','1000','采购订单id'), +('mall4cloud-purchase-order-186','1','1000','采购订单id'), +('mall4cloud-purchase-order-187','1','1000','采购订单id'), +('mall4cloud-purchase-order-188','1','1000','采购订单id'), +('mall4cloud-purchase-order-189','1','1000','采购订单id'), +('mall4cloud-purchase-order-190','1','1000','采购订单id'), +('mall4cloud-purchase-order-191','1','1000','采购订单id'), +('mall4cloud-purchase-order-192','1','1000','采购订单id'), +('mall4cloud-purchase-order-193','1','1000','采购订单id'), +('mall4cloud-purchase-order-194','1','1000','采购订单id'), +('mall4cloud-purchase-order-195','1','1000','采购订单id'), +('mall4cloud-purchase-order-196','1','1000','采购订单id'), +('mall4cloud-purchase-order-197','1','1000','采购订单id'), +('mall4cloud-purchase-order-198','1','1000','采购订单id'), +('mall4cloud-purchase-order-199','1','1000','采购订单id'), +('mall4cloud-purchase-order-200','1','1000','采购订单id'), +('mall4cloud-purchase-order-201','1','1000','采购订单id'), +('mall4cloud-purchase-order-202','1','1000','采购订单id'), +('mall4cloud-purchase-order-203','1','1000','采购订单id'), +('mall4cloud-purchase-order-204','1','1000','采购订单id'), +('mall4cloud-purchase-order-205','1','1000','采购订单id'), +('mall4cloud-purchase-order-206','1','1000','采购订单id'), +('mall4cloud-purchase-order-207','1','1000','采购订单id'), +('mall4cloud-purchase-order-208','1','1000','采购订单id'), +('mall4cloud-purchase-order-209','1','1000','采购订单id'), +('mall4cloud-purchase-order-210','1','1000','采购订单id'), +('mall4cloud-purchase-order-211','1','1000','采购订单id'), +('mall4cloud-purchase-order-212','1','1000','采购订单id'), +('mall4cloud-purchase-order-213','1','1000','采购订单id'), +('mall4cloud-purchase-order-214','1','1000','采购订单id'), +('mall4cloud-purchase-order-215','1','1000','采购订单id'), +('mall4cloud-purchase-order-216','1','1000','采购订单id'), +('mall4cloud-purchase-order-217','1','1000','采购订单id'), +('mall4cloud-purchase-order-218','1','1000','采购订单id'), +('mall4cloud-purchase-order-219','1','1000','采购订单id'), +('mall4cloud-purchase-order-220','1','1000','采购订单id'), +('mall4cloud-purchase-order-221','1','1000','采购订单id'), +('mall4cloud-purchase-order-222','1','1000','采购订单id'), +('mall4cloud-purchase-order-223','1','1000','采购订单id'), +('mall4cloud-purchase-order-224','1','1000','采购订单id'), +('mall4cloud-purchase-order-225','1','1000','采购订单id'), +('mall4cloud-purchase-order-226','1','1000','采购订单id'), +('mall4cloud-purchase-order-227','1','1000','采购订单id'), +('mall4cloud-purchase-order-228','1','1000','采购订单id'), +('mall4cloud-purchase-order-229','1','1000','采购订单id'), +('mall4cloud-purchase-order-230','1','1000','采购订单id'), +('mall4cloud-purchase-order-231','1','1000','采购订单id'), +('mall4cloud-purchase-order-232','1','1000','采购订单id'), +('mall4cloud-purchase-order-233','1','1000','采购订单id'), +('mall4cloud-purchase-order-234','1','1000','采购订单id'), +('mall4cloud-purchase-order-235','1','1000','采购订单id'), +('mall4cloud-purchase-order-236','1','1000','采购订单id'), +('mall4cloud-purchase-order-237','1','1000','采购订单id'), +('mall4cloud-purchase-order-238','1','1000','采购订单id'), +('mall4cloud-purchase-order-239','1','1000','采购订单id'), +('mall4cloud-purchase-order-240','1','1000','采购订单id'), +('mall4cloud-purchase-order-241','1','1000','采购订单id'), +('mall4cloud-purchase-order-242','1','1000','采购订单id'), +('mall4cloud-purchase-order-243','1','1000','采购订单id'), +('mall4cloud-purchase-order-244','1','1000','采购订单id'), +('mall4cloud-purchase-order-245','1','1000','采购订单id'), +('mall4cloud-purchase-order-246','1','1000','采购订单id'), +('mall4cloud-purchase-order-247','1','1000','采购订单id'), +('mall4cloud-purchase-order-248','1','1000','采购订单id'), +('mall4cloud-purchase-order-249','1','1000','采购订单id'), +('mall4cloud-purchase-order-250','1','1000','采购订单id'), +('mall4cloud-purchase-order-251','1','1000','采购订单id'), +('mall4cloud-purchase-order-252','1','1000','采购订单id'), +('mall4cloud-purchase-order-253','1','1000','采购订单id'), +('mall4cloud-purchase-order-254','1','1000','采购订单id'), +('mall4cloud-purchase-order-255','1','1000','采购订单id'), +('mall4cloud-purchase-order-256','1','1000','采购订单id'), +('mall4cloud-purchase-order-257','1','1000','采购订单id'), +('mall4cloud-purchase-order-258','1','1000','采购订单id'), +('mall4cloud-purchase-order-259','1','1000','采购订单id'), +('mall4cloud-purchase-order-260','1','1000','采购订单id'), +('mall4cloud-purchase-order-261','1','1000','采购订单id'), +('mall4cloud-purchase-order-262','1','1000','采购订单id'), +('mall4cloud-purchase-order-263','1','1000','采购订单id'), +('mall4cloud-purchase-order-264','1','1000','采购订单id'), +('mall4cloud-purchase-order-265','1','1000','采购订单id'), +('mall4cloud-purchase-order-266','1','1000','采购订单id'), +('mall4cloud-purchase-order-267','1','1000','采购订单id'), +('mall4cloud-purchase-order-268','1','1000','采购订单id'), +('mall4cloud-purchase-order-269','1','1000','采购订单id'), +('mall4cloud-purchase-order-270','1','1000','采购订单id'), +('mall4cloud-purchase-order-271','1','1000','采购订单id'), +('mall4cloud-purchase-order-272','1','1000','采购订单id'), +('mall4cloud-purchase-order-273','1','1000','采购订单id'), +('mall4cloud-purchase-order-274','1','1000','采购订单id'), +('mall4cloud-purchase-order-275','1','1000','采购订单id'), +('mall4cloud-purchase-order-276','1','1000','采购订单id'), +('mall4cloud-purchase-order-277','1','1000','采购订单id'), +('mall4cloud-purchase-order-278','1','1000','采购订单id'), +('mall4cloud-purchase-order-279','1','1000','采购订单id'), +('mall4cloud-purchase-order-280','1','1000','采购订单id'), +('mall4cloud-purchase-order-281','1','1000','采购订单id'), +('mall4cloud-purchase-order-282','1','1000','采购订单id'), +('mall4cloud-purchase-order-283','1','1000','采购订单id'), +('mall4cloud-purchase-order-284','1','1000','采购订单id'), +('mall4cloud-purchase-order-285','1','1000','采购订单id'), +('mall4cloud-purchase-order-286','1','1000','采购订单id'), +('mall4cloud-purchase-order-287','1','1000','采购订单id'), +('mall4cloud-purchase-order-288','1','1000','采购订单id'), +('mall4cloud-purchase-order-289','1','1000','采购订单id'), +('mall4cloud-purchase-order-290','1','1000','采购订单id'), +('mall4cloud-purchase-order-291','1','1000','采购订单id'), +('mall4cloud-purchase-order-292','1','1000','采购订单id'), +('mall4cloud-purchase-order-293','1','1000','采购订单id'), +('mall4cloud-purchase-order-294','1','1000','采购订单id'), +('mall4cloud-purchase-order-295','1','1000','采购订单id'), +('mall4cloud-purchase-order-296','1','1000','采购订单id'), +('mall4cloud-purchase-order-297','1','1000','采购订单id'), +('mall4cloud-purchase-order-298','1','1000','采购订单id'), +('mall4cloud-purchase-order-299','1','1000','采购订单id'), +('mall4cloud-purchase-order-300','1','1000','采购订单id'), +('mall4cloud-purchase-order-301','1','1000','采购订单id'), +('mall4cloud-purchase-order-302','1','1000','采购订单id'), +('mall4cloud-purchase-order-303','1','1000','采购订单id'), +('mall4cloud-purchase-order-304','1','1000','采购订单id'), +('mall4cloud-purchase-order-305','1','1000','采购订单id'), +('mall4cloud-purchase-order-306','1','1000','采购订单id'), +('mall4cloud-purchase-order-307','1','1000','采购订单id'), +('mall4cloud-purchase-order-308','1','1000','采购订单id'), +('mall4cloud-purchase-order-309','1','1000','采购订单id'), +('mall4cloud-purchase-order-310','1','1000','采购订单id'), +('mall4cloud-purchase-order-311','1','1000','采购订单id'), +('mall4cloud-purchase-order-312','1','1000','采购订单id'), +('mall4cloud-purchase-order-313','1','1000','采购订单id'), +('mall4cloud-purchase-order-314','1','1000','采购订单id'), +('mall4cloud-purchase-order-315','1','1000','采购订单id'), +('mall4cloud-purchase-order-316','1','1000','采购订单id'), +('mall4cloud-purchase-order-317','1','1000','采购订单id'), +('mall4cloud-purchase-order-318','1','1000','采购订单id'), +('mall4cloud-purchase-order-319','1','1000','采购订单id'), +('mall4cloud-purchase-order-320','1','1000','采购订单id'), +('mall4cloud-purchase-order-321','1','1000','采购订单id'), +('mall4cloud-purchase-order-322','1','1000','采购订单id'), +('mall4cloud-purchase-order-323','1','1000','采购订单id'), +('mall4cloud-purchase-order-324','1','1000','采购订单id'), +('mall4cloud-purchase-order-325','1','1000','采购订单id'), +('mall4cloud-purchase-order-326','1','1000','采购订单id'), +('mall4cloud-purchase-order-327','1','1000','采购订单id'), +('mall4cloud-purchase-order-328','1','1000','采购订单id'), +('mall4cloud-purchase-order-329','1','1000','采购订单id'), +('mall4cloud-purchase-order-330','1','1000','采购订单id'), +('mall4cloud-purchase-order-331','1','1000','采购订单id'), +('mall4cloud-purchase-order-332','1','1000','采购订单id'), +('mall4cloud-purchase-order-333','1','1000','采购订单id'), +('mall4cloud-purchase-order-334','1','1000','采购订单id'), +('mall4cloud-purchase-order-335','1','1000','采购订单id'), +('mall4cloud-purchase-order-336','1','1000','采购订单id'), +('mall4cloud-purchase-order-337','1','1000','采购订单id'), +('mall4cloud-purchase-order-338','1','1000','采购订单id'), +('mall4cloud-purchase-order-339','1','1000','采购订单id'), +('mall4cloud-purchase-order-340','1','1000','采购订单id'), +('mall4cloud-purchase-order-341','1','1000','采购订单id'), +('mall4cloud-purchase-order-342','1','1000','采购订单id'), +('mall4cloud-purchase-order-343','1','1000','采购订单id'), +('mall4cloud-purchase-order-344','1','1000','采购订单id'), +('mall4cloud-purchase-order-345','1','1000','采购订单id'), +('mall4cloud-purchase-order-346','1','1000','采购订单id'), +('mall4cloud-purchase-order-347','1','1000','采购订单id'), +('mall4cloud-purchase-order-348','1','1000','采购订单id'), +('mall4cloud-purchase-order-349','1','1000','采购订单id'), +('mall4cloud-purchase-order-350','1','1000','采购订单id'), +('mall4cloud-purchase-order-351','1','1000','采购订单id'), +('mall4cloud-purchase-order-352','1','1000','采购订单id'), +('mall4cloud-purchase-order-353','1','1000','采购订单id'), +('mall4cloud-purchase-order-354','1','1000','采购订单id'), +('mall4cloud-purchase-order-355','1','1000','采购订单id'), +('mall4cloud-purchase-order-356','1','1000','采购订单id'), +('mall4cloud-purchase-order-357','1','1000','采购订单id'), +('mall4cloud-purchase-order-358','1','1000','采购订单id'), +('mall4cloud-purchase-order-359','1','1000','采购订单id'), +('mall4cloud-purchase-order-360','1','1000','采购订单id'), +('mall4cloud-purchase-order-361','1','1000','采购订单id'), +('mall4cloud-purchase-order-362','1','1000','采购订单id'), +('mall4cloud-purchase-order-363','1','1000','采购订单id'), +('mall4cloud-purchase-order-364','1','1000','采购订单id'), +('mall4cloud-purchase-order-365','1','1000','采购订单id'), +('mall4cloud-purchase-order-366','1','1000','采购订单id'), +('mall4cloud-purchase-order-367','1','1000','采购订单id'), +('mall4cloud-purchase-order-368','1','1000','采购订单id'), +('mall4cloud-purchase-order-369','1','1000','采购订单id'), +('mall4cloud-purchase-order-370','1','1000','采购订单id'), +('mall4cloud-purchase-order-371','1','1000','采购订单id'), +('mall4cloud-purchase-order-372','1','1000','采购订单id'), +('mall4cloud-purchase-order-373','1','1000','采购订单id'), +('mall4cloud-purchase-order-374','1','1000','采购订单id'), +('mall4cloud-purchase-order-375','1','1000','采购订单id'), +('mall4cloud-purchase-order-376','1','1000','采购订单id'), +('mall4cloud-purchase-order-377','1','1000','采购订单id'), +('mall4cloud-purchase-order-378','1','1000','采购订单id'), +('mall4cloud-purchase-order-379','1','1000','采购订单id'), +('mall4cloud-purchase-order-380','1','1000','采购订单id'), +('mall4cloud-purchase-order-381','1','1000','采购订单id'), +('mall4cloud-purchase-order-382','1','1000','采购订单id'), +('mall4cloud-purchase-order-383','1','1000','采购订单id'), +('mall4cloud-purchase-order-384','1','1000','采购订单id'), +('mall4cloud-purchase-order-385','1','1000','采购订单id'), +('mall4cloud-purchase-order-386','1','1000','采购订单id'), +('mall4cloud-purchase-order-387','1','1000','采购订单id'), +('mall4cloud-purchase-order-388','1','1000','采购订单id'), +('mall4cloud-purchase-order-389','1','1000','采购订单id'), +('mall4cloud-purchase-order-390','1','1000','采购订单id'), +('mall4cloud-purchase-order-391','1','1000','采购订单id'), +('mall4cloud-purchase-order-392','1','1000','采购订单id'), +('mall4cloud-purchase-order-393','1','1000','采购订单id'), +('mall4cloud-purchase-order-394','1','1000','采购订单id'), +('mall4cloud-purchase-order-395','1','1000','采购订单id'), +('mall4cloud-purchase-order-396','1','1000','采购订单id'), +('mall4cloud-purchase-order-397','1','1000','采购订单id'), +('mall4cloud-purchase-order-398','1','1000','采购订单id'), +('mall4cloud-purchase-order-399','1','1000','采购订单id'), +('mall4cloud-purchase-order-400','1','1000','采购订单id'), +('mall4cloud-purchase-order-401','1','1000','采购订单id'), +('mall4cloud-purchase-order-402','1','1000','采购订单id'), +('mall4cloud-purchase-order-403','1','1000','采购订单id'), +('mall4cloud-purchase-order-404','1','1000','采购订单id'), +('mall4cloud-purchase-order-405','1','1000','采购订单id'), +('mall4cloud-purchase-order-406','1','1000','采购订单id'), +('mall4cloud-purchase-order-407','1','1000','采购订单id'), +('mall4cloud-purchase-order-408','1','1000','采购订单id'), +('mall4cloud-purchase-order-409','1','1000','采购订单id'), +('mall4cloud-purchase-order-410','1','1000','采购订单id'), +('mall4cloud-purchase-order-411','1','1000','采购订单id'), +('mall4cloud-purchase-order-412','1','1000','采购订单id'), +('mall4cloud-purchase-order-413','1','1000','采购订单id'), +('mall4cloud-purchase-order-414','1','1000','采购订单id'), +('mall4cloud-purchase-order-415','1','1000','采购订单id'), +('mall4cloud-purchase-order-416','1','1000','采购订单id'), +('mall4cloud-purchase-order-417','1','1000','采购订单id'), +('mall4cloud-purchase-order-418','1','1000','采购订单id'), +('mall4cloud-purchase-order-419','1','1000','采购订单id'), +('mall4cloud-purchase-order-420','1','1000','采购订单id'), +('mall4cloud-purchase-order-421','1','1000','采购订单id'), +('mall4cloud-purchase-order-422','1','1000','采购订单id'), +('mall4cloud-purchase-order-423','1','1000','采购订单id'), +('mall4cloud-purchase-order-424','1','1000','采购订单id'), +('mall4cloud-purchase-order-425','1','1000','采购订单id'), +('mall4cloud-purchase-order-426','1','1000','采购订单id'), +('mall4cloud-purchase-order-427','1','1000','采购订单id'), +('mall4cloud-purchase-order-428','1','1000','采购订单id'), +('mall4cloud-purchase-order-429','1','1000','采购订单id'), +('mall4cloud-purchase-order-430','1','1000','采购订单id'), +('mall4cloud-purchase-order-431','1','1000','采购订单id'), +('mall4cloud-purchase-order-432','1','1000','采购订单id'), +('mall4cloud-purchase-order-433','1','1000','采购订单id'), +('mall4cloud-purchase-order-434','1','1000','采购订单id'), +('mall4cloud-purchase-order-435','1','1000','采购订单id'), +('mall4cloud-purchase-order-436','1','1000','采购订单id'), +('mall4cloud-purchase-order-437','1','1000','采购订单id'), +('mall4cloud-purchase-order-438','1','1000','采购订单id'), +('mall4cloud-purchase-order-439','1','1000','采购订单id'), +('mall4cloud-purchase-order-440','1','1000','采购订单id'), +('mall4cloud-purchase-order-441','1','1000','采购订单id'), +('mall4cloud-purchase-order-442','1','1000','采购订单id'), +('mall4cloud-purchase-order-443','1','1000','采购订单id'), +('mall4cloud-purchase-order-444','1','1000','采购订单id'), +('mall4cloud-purchase-order-445','1','1000','采购订单id'), +('mall4cloud-purchase-order-446','1','1000','采购订单id'), +('mall4cloud-purchase-order-447','1','1000','采购订单id'), +('mall4cloud-purchase-order-448','1','1000','采购订单id'), +('mall4cloud-purchase-order-449','1','1000','采购订单id'), +('mall4cloud-purchase-order-450','1','1000','采购订单id'), +('mall4cloud-purchase-order-451','1','1000','采购订单id'), +('mall4cloud-purchase-order-452','1','1000','采购订单id'), +('mall4cloud-purchase-order-453','1','1000','采购订单id'), +('mall4cloud-purchase-order-454','1','1000','采购订单id'), +('mall4cloud-purchase-order-455','1','1000','采购订单id'), +('mall4cloud-purchase-order-456','1','1000','采购订单id'), +('mall4cloud-purchase-order-457','1','1000','采购订单id'), +('mall4cloud-purchase-order-458','1','1000','采购订单id'), +('mall4cloud-purchase-order-459','1','1000','采购订单id'), +('mall4cloud-purchase-order-460','1','1000','采购订单id'), +('mall4cloud-purchase-order-461','1','1000','采购订单id'), +('mall4cloud-purchase-order-462','1','1000','采购订单id'), +('mall4cloud-purchase-order-463','1','1000','采购订单id'), +('mall4cloud-purchase-order-464','1','1000','采购订单id'), +('mall4cloud-purchase-order-465','1','1000','采购订单id'), +('mall4cloud-purchase-order-466','1','1000','采购订单id'), +('mall4cloud-purchase-order-467','1','1000','采购订单id'), +('mall4cloud-purchase-order-468','1','1000','采购订单id'), +('mall4cloud-purchase-order-469','1','1000','采购订单id'), +('mall4cloud-purchase-order-470','1','1000','采购订单id'), +('mall4cloud-purchase-order-471','1','1000','采购订单id'), +('mall4cloud-purchase-order-472','1','1000','采购订单id'), +('mall4cloud-purchase-order-473','1','1000','采购订单id'), +('mall4cloud-purchase-order-474','1','1000','采购订单id'), +('mall4cloud-purchase-order-475','1','1000','采购订单id'), +('mall4cloud-purchase-order-476','1','1000','采购订单id'), +('mall4cloud-purchase-order-477','1','1000','采购订单id'), +('mall4cloud-purchase-order-478','1','1000','采购订单id'), +('mall4cloud-purchase-order-479','1','1000','采购订单id'), +('mall4cloud-purchase-order-480','1','1000','采购订单id'), +('mall4cloud-purchase-order-481','1','1000','采购订单id'), +('mall4cloud-purchase-order-482','1','1000','采购订单id'), +('mall4cloud-purchase-order-483','1','1000','采购订单id'), +('mall4cloud-purchase-order-484','1','1000','采购订单id'), +('mall4cloud-purchase-order-485','1','1000','采购订单id'), +('mall4cloud-purchase-order-486','1','1000','采购订单id'), +('mall4cloud-purchase-order-487','1','1000','采购订单id'), +('mall4cloud-purchase-order-488','1','1000','采购订单id'), +('mall4cloud-purchase-order-489','1','1000','采购订单id'), +('mall4cloud-purchase-order-490','1','1000','采购订单id'), +('mall4cloud-purchase-order-491','1','1000','采购订单id'), +('mall4cloud-purchase-order-492','1','1000','采购订单id'), +('mall4cloud-purchase-order-493','1','1000','采购订单id'), +('mall4cloud-purchase-order-494','1','1000','采购订单id'), +('mall4cloud-purchase-order-495','1','1000','采购订单id'), +('mall4cloud-purchase-order-496','1','1000','采购订单id'), +('mall4cloud-purchase-order-497','1','1000','采购订单id'), +('mall4cloud-purchase-order-498','1','1000','采购订单id'), +('mall4cloud-purchase-order-499','1','1000','采购订单id'), +('mall4cloud-purchase-order-500','1','1000','采购订单id'), +('mall4cloud-purchase-order-501','1','1000','采购订单id'), +('mall4cloud-purchase-order-502','1','1000','采购订单id'), +('mall4cloud-purchase-order-503','1','1000','采购订单id'), +('mall4cloud-purchase-order-504','1','1000','采购订单id'), +('mall4cloud-purchase-order-505','1','1000','采购订单id'), +('mall4cloud-purchase-order-506','1','1000','采购订单id'), +('mall4cloud-purchase-order-507','1','1000','采购订单id'), +('mall4cloud-purchase-order-508','1','1000','采购订单id'), +('mall4cloud-purchase-order-509','1','1000','采购订单id'), +('mall4cloud-purchase-order-510','1','1000','采购订单id'), +('mall4cloud-purchase-order-511','1','1000','采购订单id'), +('mall4cloud-purchase-order-512','1','1000','采购订单id'), +('mall4cloud-purchase-order-513','1','1000','采购订单id'), +('mall4cloud-purchase-order-514','1','1000','采购订单id'), +('mall4cloud-purchase-order-515','1','1000','采购订单id'), +('mall4cloud-purchase-order-516','1','1000','采购订单id'), +('mall4cloud-purchase-order-517','1','1000','采购订单id'), +('mall4cloud-purchase-order-518','1','1000','采购订单id'), +('mall4cloud-purchase-order-519','1','1000','采购订单id'), +('mall4cloud-purchase-order-520','1','1000','采购订单id'), +('mall4cloud-purchase-order-521','1','1000','采购订单id'), +('mall4cloud-purchase-order-522','1','1000','采购订单id'), +('mall4cloud-purchase-order-523','1','1000','采购订单id'), +('mall4cloud-purchase-order-524','1','1000','采购订单id'), +('mall4cloud-purchase-order-525','1','1000','采购订单id'), +('mall4cloud-purchase-order-526','1','1000','采购订单id'), +('mall4cloud-purchase-order-527','1','1000','采购订单id'), +('mall4cloud-purchase-order-528','1','1000','采购订单id'), +('mall4cloud-purchase-order-529','1','1000','采购订单id'), +('mall4cloud-purchase-order-530','1','1000','采购订单id'), +('mall4cloud-purchase-order-531','1','1000','采购订单id'), +('mall4cloud-purchase-order-532','1','1000','采购订单id'), +('mall4cloud-purchase-order-533','1','1000','采购订单id'), +('mall4cloud-purchase-order-534','1','1000','采购订单id'), +('mall4cloud-purchase-order-535','1','1000','采购订单id'), +('mall4cloud-purchase-order-536','1','1000','采购订单id'), +('mall4cloud-purchase-order-537','1','1000','采购订单id'), +('mall4cloud-purchase-order-538','1','1000','采购订单id'), +('mall4cloud-purchase-order-539','1','1000','采购订单id'), +('mall4cloud-purchase-order-540','1','1000','采购订单id'), +('mall4cloud-purchase-order-541','1','1000','采购订单id'), +('mall4cloud-purchase-order-542','1','1000','采购订单id'), +('mall4cloud-purchase-order-543','1','1000','采购订单id'), +('mall4cloud-purchase-order-544','1','1000','采购订单id'), +('mall4cloud-purchase-order-545','1','1000','采购订单id'), +('mall4cloud-purchase-order-546','1','1000','采购订单id'), +('mall4cloud-purchase-order-547','1','1000','采购订单id'), +('mall4cloud-purchase-order-548','1','1000','采购订单id'), +('mall4cloud-purchase-order-549','1','1000','采购订单id'), +('mall4cloud-purchase-order-550','1','1000','采购订单id'), +('mall4cloud-purchase-order-551','1','1000','采购订单id'), +('mall4cloud-purchase-order-552','1','1000','采购订单id'), +('mall4cloud-purchase-order-553','1','1000','采购订单id'), +('mall4cloud-purchase-order-554','1','1000','采购订单id'), +('mall4cloud-purchase-order-555','1','1000','采购订单id'), +('mall4cloud-purchase-order-556','1','1000','采购订单id'), +('mall4cloud-purchase-order-557','1','1000','采购订单id'), +('mall4cloud-purchase-order-558','1','1000','采购订单id'), +('mall4cloud-purchase-order-559','1','1000','采购订单id'), +('mall4cloud-purchase-order-560','1','1000','采购订单id'), +('mall4cloud-purchase-order-561','1','1000','采购订单id'), +('mall4cloud-purchase-order-562','1','1000','采购订单id'), +('mall4cloud-purchase-order-563','1','1000','采购订单id'), +('mall4cloud-purchase-order-564','1','1000','采购订单id'), +('mall4cloud-purchase-order-565','1','1000','采购订单id'), +('mall4cloud-purchase-order-566','1','1000','采购订单id'), +('mall4cloud-purchase-order-567','1','1000','采购订单id'), +('mall4cloud-purchase-order-568','1','1000','采购订单id'), +('mall4cloud-purchase-order-569','1','1000','采购订单id'), +('mall4cloud-purchase-order-570','1','1000','采购订单id'), +('mall4cloud-purchase-order-571','1','1000','采购订单id'), +('mall4cloud-purchase-order-572','1','1000','采购订单id'), +('mall4cloud-purchase-order-573','1','1000','采购订单id'), +('mall4cloud-purchase-order-574','1','1000','采购订单id'), +('mall4cloud-purchase-order-575','1','1000','采购订单id'), +('mall4cloud-purchase-order-576','1','1000','采购订单id'), +('mall4cloud-purchase-order-577','1','1000','采购订单id'), +('mall4cloud-purchase-order-578','1','1000','采购订单id'), +('mall4cloud-purchase-order-579','1','1000','采购订单id'), +('mall4cloud-purchase-order-580','1','1000','采购订单id'), +('mall4cloud-purchase-order-581','1','1000','采购订单id'), +('mall4cloud-purchase-order-582','1','1000','采购订单id'), +('mall4cloud-purchase-order-583','1','1000','采购订单id'), +('mall4cloud-purchase-order-584','1','1000','采购订单id'), +('mall4cloud-purchase-order-585','1','1000','采购订单id'), +('mall4cloud-purchase-order-586','1','1000','采购订单id'), +('mall4cloud-purchase-order-587','1','1000','采购订单id'), +('mall4cloud-purchase-order-588','1','1000','采购订单id'), +('mall4cloud-purchase-order-589','1','1000','采购订单id'), +('mall4cloud-purchase-order-590','1','1000','采购订单id'), +('mall4cloud-purchase-order-591','1','1000','采购订单id'), +('mall4cloud-purchase-order-592','1','1000','采购订单id'), +('mall4cloud-purchase-order-593','1','1000','采购订单id'), +('mall4cloud-purchase-order-594','1','1000','采购订单id'), +('mall4cloud-purchase-order-595','1','1000','采购订单id'), +('mall4cloud-purchase-order-596','1','1000','采购订单id'), +('mall4cloud-purchase-order-597','1','1000','采购订单id'), +('mall4cloud-purchase-order-598','1','1000','采购订单id'), +('mall4cloud-purchase-order-599','1','1000','采购订单id'), +('mall4cloud-purchase-order-600','1','1000','采购订单id'), +('mall4cloud-purchase-order-601','1','1000','采购订单id'), +('mall4cloud-purchase-order-602','1','1000','采购订单id'), +('mall4cloud-purchase-order-603','1','1000','采购订单id'), +('mall4cloud-purchase-order-604','1','1000','采购订单id'), +('mall4cloud-purchase-order-605','1','1000','采购订单id'), +('mall4cloud-purchase-order-606','1','1000','采购订单id'), +('mall4cloud-purchase-order-607','1','1000','采购订单id'), +('mall4cloud-purchase-order-608','1','1000','采购订单id'), +('mall4cloud-purchase-order-609','1','1000','采购订单id'), +('mall4cloud-purchase-order-610','1','1000','采购订单id'), +('mall4cloud-purchase-order-611','1','1000','采购订单id'), +('mall4cloud-purchase-order-612','1','1000','采购订单id'), +('mall4cloud-purchase-order-613','1','1000','采购订单id'), +('mall4cloud-purchase-order-614','1','1000','采购订单id'), +('mall4cloud-purchase-order-615','1','1000','采购订单id'), +('mall4cloud-purchase-order-616','1','1000','采购订单id'), +('mall4cloud-purchase-order-617','1','1000','采购订单id'), +('mall4cloud-purchase-order-618','1','1000','采购订单id'), +('mall4cloud-purchase-order-619','1','1000','采购订单id'), +('mall4cloud-purchase-order-620','1','1000','采购订单id'), +('mall4cloud-purchase-order-621','1','1000','采购订单id'), +('mall4cloud-purchase-order-622','1','1000','采购订单id'), +('mall4cloud-purchase-order-623','1','1000','采购订单id'), +('mall4cloud-purchase-order-624','1','1000','采购订单id'), +('mall4cloud-purchase-order-625','1','1000','采购订单id'), +('mall4cloud-purchase-order-626','1','1000','采购订单id'), +('mall4cloud-purchase-order-627','1','1000','采购订单id'), +('mall4cloud-purchase-order-628','1','1000','采购订单id'), +('mall4cloud-purchase-order-629','1','1000','采购订单id'), +('mall4cloud-purchase-order-630','1','1000','采购订单id'), +('mall4cloud-purchase-order-631','1','1000','采购订单id'), +('mall4cloud-purchase-order-632','1','1000','采购订单id'), +('mall4cloud-purchase-order-633','1','1000','采购订单id'), +('mall4cloud-purchase-order-634','1','1000','采购订单id'), +('mall4cloud-purchase-order-635','1','1000','采购订单id'), +('mall4cloud-purchase-order-636','1','1000','采购订单id'), +('mall4cloud-purchase-order-637','1','1000','采购订单id'), +('mall4cloud-purchase-order-638','1','1000','采购订单id'), +('mall4cloud-purchase-order-639','1','1000','采购订单id'), +('mall4cloud-purchase-order-640','1','1000','采购订单id'), +('mall4cloud-purchase-order-641','1','1000','采购订单id'), +('mall4cloud-purchase-order-642','1','1000','采购订单id'), +('mall4cloud-purchase-order-643','1','1000','采购订单id'), +('mall4cloud-purchase-order-644','1','1000','采购订单id'), +('mall4cloud-purchase-order-645','1','1000','采购订单id'), +('mall4cloud-purchase-order-646','1','1000','采购订单id'), +('mall4cloud-purchase-order-647','1','1000','采购订单id'), +('mall4cloud-purchase-order-648','1','1000','采购订单id'), +('mall4cloud-purchase-order-649','1','1000','采购订单id'), +('mall4cloud-purchase-order-650','1','1000','采购订单id'), +('mall4cloud-purchase-order-651','1','1000','采购订单id'), +('mall4cloud-purchase-order-652','1','1000','采购订单id'), +('mall4cloud-purchase-order-653','1','1000','采购订单id'), +('mall4cloud-purchase-order-654','1','1000','采购订单id'), +('mall4cloud-purchase-order-655','1','1000','采购订单id'), +('mall4cloud-purchase-order-656','1','1000','采购订单id'), +('mall4cloud-purchase-order-657','1','1000','采购订单id'), +('mall4cloud-purchase-order-658','1','1000','采购订单id'), +('mall4cloud-purchase-order-659','1','1000','采购订单id'), +('mall4cloud-purchase-order-660','1','1000','采购订单id'), +('mall4cloud-purchase-order-661','1','1000','采购订单id'), +('mall4cloud-purchase-order-662','1','1000','采购订单id'), +('mall4cloud-purchase-order-663','1','1000','采购订单id'), +('mall4cloud-purchase-order-664','1','1000','采购订单id'), +('mall4cloud-purchase-order-665','1','1000','采购订单id'), +('mall4cloud-purchase-order-666','1','1000','采购订单id'), +('mall4cloud-purchase-order-667','1','1000','采购订单id'), +('mall4cloud-purchase-order-668','1','1000','采购订单id'), +('mall4cloud-purchase-order-669','1','1000','采购订单id'), +('mall4cloud-purchase-order-670','1','1000','采购订单id'), +('mall4cloud-purchase-order-671','1','1000','采购订单id'), +('mall4cloud-purchase-order-672','1','1000','采购订单id'), +('mall4cloud-purchase-order-673','1','1000','采购订单id'), +('mall4cloud-purchase-order-674','1','1000','采购订单id'), +('mall4cloud-purchase-order-675','1','1000','采购订单id'), +('mall4cloud-purchase-order-676','1','1000','采购订单id'), +('mall4cloud-purchase-order-677','1','1000','采购订单id'), +('mall4cloud-purchase-order-678','1','1000','采购订单id'), +('mall4cloud-purchase-order-679','1','1000','采购订单id'), +('mall4cloud-purchase-order-680','1','1000','采购订单id'), +('mall4cloud-purchase-order-681','1','1000','采购订单id'), +('mall4cloud-purchase-order-682','1','1000','采购订单id'), +('mall4cloud-purchase-order-683','1','1000','采购订单id'), +('mall4cloud-purchase-order-684','1','1000','采购订单id'), +('mall4cloud-purchase-order-685','1','1000','采购订单id'), +('mall4cloud-purchase-order-686','1','1000','采购订单id'), +('mall4cloud-purchase-order-687','1','1000','采购订单id'), +('mall4cloud-purchase-order-688','1','1000','采购订单id'), +('mall4cloud-purchase-order-689','1','1000','采购订单id'), +('mall4cloud-purchase-order-690','1','1000','采购订单id'), +('mall4cloud-purchase-order-691','1','1000','采购订单id'), +('mall4cloud-purchase-order-692','1','1000','采购订单id'), +('mall4cloud-purchase-order-693','1','1000','采购订单id'), +('mall4cloud-purchase-order-694','1','1000','采购订单id'), +('mall4cloud-purchase-order-695','1','1000','采购订单id'), +('mall4cloud-purchase-order-696','1','1000','采购订单id'), +('mall4cloud-purchase-order-697','1','1000','采购订单id'), +('mall4cloud-purchase-order-698','1','1000','采购订单id'), +('mall4cloud-purchase-order-699','1','1000','采购订单id'), +('mall4cloud-purchase-order-700','1','1000','采购订单id'), +('mall4cloud-purchase-order-701','1','1000','采购订单id'), +('mall4cloud-purchase-order-702','1','1000','采购订单id'), +('mall4cloud-purchase-order-703','1','1000','采购订单id'), +('mall4cloud-purchase-order-704','1','1000','采购订单id'), +('mall4cloud-purchase-order-705','1','1000','采购订单id'), +('mall4cloud-purchase-order-706','1','1000','采购订单id'), +('mall4cloud-purchase-order-707','1','1000','采购订单id'), +('mall4cloud-purchase-order-708','1','1000','采购订单id'), +('mall4cloud-purchase-order-709','1','1000','采购订单id'), +('mall4cloud-purchase-order-710','1','1000','采购订单id'), +('mall4cloud-purchase-order-711','1','1000','采购订单id'), +('mall4cloud-purchase-order-712','1','1000','采购订单id'), +('mall4cloud-purchase-order-713','1','1000','采购订单id'), +('mall4cloud-purchase-order-714','1','1000','采购订单id'), +('mall4cloud-purchase-order-715','1','1000','采购订单id'), +('mall4cloud-purchase-order-716','1','1000','采购订单id'), +('mall4cloud-purchase-order-717','1','1000','采购订单id'), +('mall4cloud-purchase-order-718','1','1000','采购订单id'), +('mall4cloud-purchase-order-719','1','1000','采购订单id'), +('mall4cloud-purchase-order-720','1','1000','采购订单id'), +('mall4cloud-purchase-order-721','1','1000','采购订单id'), +('mall4cloud-purchase-order-722','1','1000','采购订单id'), +('mall4cloud-purchase-order-723','1','1000','采购订单id'), +('mall4cloud-purchase-order-724','1','1000','采购订单id'), +('mall4cloud-purchase-order-725','1','1000','采购订单id'), +('mall4cloud-purchase-order-726','1','1000','采购订单id'), +('mall4cloud-purchase-order-727','1','1000','采购订单id'), +('mall4cloud-purchase-order-728','1','1000','采购订单id'), +('mall4cloud-purchase-order-729','1','1000','采购订单id'), +('mall4cloud-purchase-order-730','1','1000','采购订单id'), +('mall4cloud-purchase-order-731','1','1000','采购订单id'), +('mall4cloud-purchase-order-732','1','1000','采购订单id'), +('mall4cloud-purchase-order-733','1','1000','采购订单id'), +('mall4cloud-purchase-order-734','1','1000','采购订单id'), +('mall4cloud-purchase-order-735','1','1000','采购订单id'), +('mall4cloud-purchase-order-736','1','1000','采购订单id'), +('mall4cloud-purchase-order-737','1','1000','采购订单id'), +('mall4cloud-purchase-order-738','1','1000','采购订单id'), +('mall4cloud-purchase-order-739','1','1000','采购订单id'), +('mall4cloud-purchase-order-740','1','1000','采购订单id'), +('mall4cloud-purchase-order-741','1','1000','采购订单id'), +('mall4cloud-purchase-order-742','1','1000','采购订单id'), +('mall4cloud-purchase-order-743','1','1000','采购订单id'), +('mall4cloud-purchase-order-744','1','1000','采购订单id'), +('mall4cloud-purchase-order-745','1','1000','采购订单id'), +('mall4cloud-purchase-order-746','1','1000','采购订单id'), +('mall4cloud-purchase-order-747','1','1000','采购订单id'), +('mall4cloud-purchase-order-748','1','1000','采购订单id'), +('mall4cloud-purchase-order-749','1','1000','采购订单id'), +('mall4cloud-purchase-order-750','1','1000','采购订单id'), +('mall4cloud-purchase-order-751','1','1000','采购订单id'), +('mall4cloud-purchase-order-752','1','1000','采购订单id'), +('mall4cloud-purchase-order-753','1','1000','采购订单id'), +('mall4cloud-purchase-order-754','1','1000','采购订单id'), +('mall4cloud-purchase-order-755','1','1000','采购订单id'), +('mall4cloud-purchase-order-756','1','1000','采购订单id'), +('mall4cloud-purchase-order-757','1','1000','采购订单id'), +('mall4cloud-purchase-order-758','1','1000','采购订单id'), +('mall4cloud-purchase-order-759','1','1000','采购订单id'), +('mall4cloud-purchase-order-760','1','1000','采购订单id'), +('mall4cloud-purchase-order-761','1','1000','采购订单id'), +('mall4cloud-purchase-order-762','1','1000','采购订单id'), +('mall4cloud-purchase-order-763','1','1000','采购订单id'), +('mall4cloud-purchase-order-764','1','1000','采购订单id'), +('mall4cloud-purchase-order-765','1','1000','采购订单id'), +('mall4cloud-purchase-order-766','1','1000','采购订单id'), +('mall4cloud-purchase-order-767','1','1000','采购订单id'), +('mall4cloud-purchase-order-768','1','1000','采购订单id'), +('mall4cloud-purchase-order-769','1','1000','采购订单id'), +('mall4cloud-purchase-order-770','1','1000','采购订单id'), +('mall4cloud-purchase-order-771','1','1000','采购订单id'), +('mall4cloud-purchase-order-772','1','1000','采购订单id'), +('mall4cloud-purchase-order-773','1','1000','采购订单id'), +('mall4cloud-purchase-order-774','1','1000','采购订单id'), +('mall4cloud-purchase-order-775','1','1000','采购订单id'), +('mall4cloud-purchase-order-776','1','1000','采购订单id'), +('mall4cloud-purchase-order-777','1','1000','采购订单id'), +('mall4cloud-purchase-order-778','1','1000','采购订单id'), +('mall4cloud-purchase-order-779','1','1000','采购订单id'), +('mall4cloud-purchase-order-780','1','1000','采购订单id'), +('mall4cloud-purchase-order-781','1','1000','采购订单id'), +('mall4cloud-purchase-order-782','1','1000','采购订单id'), +('mall4cloud-purchase-order-783','1','1000','采购订单id'), +('mall4cloud-purchase-order-784','1','1000','采购订单id'), +('mall4cloud-purchase-order-785','1','1000','采购订单id'), +('mall4cloud-purchase-order-786','1','1000','采购订单id'), +('mall4cloud-purchase-order-787','1','1000','采购订单id'), +('mall4cloud-purchase-order-788','1','1000','采购订单id'), +('mall4cloud-purchase-order-789','1','1000','采购订单id'), +('mall4cloud-purchase-order-790','1','1000','采购订单id'), +('mall4cloud-purchase-order-791','1','1000','采购订单id'), +('mall4cloud-purchase-order-792','1','1000','采购订单id'), +('mall4cloud-purchase-order-793','1','1000','采购订单id'), +('mall4cloud-purchase-order-794','1','1000','采购订单id'), +('mall4cloud-purchase-order-795','1','1000','采购订单id'), +('mall4cloud-purchase-order-796','1','1000','采购订单id'), +('mall4cloud-purchase-order-797','1','1000','采购订单id'), +('mall4cloud-purchase-order-798','1','1000','采购订单id'), +('mall4cloud-purchase-order-799','1','1000','采购订单id'), +('mall4cloud-purchase-order-800','1','1000','采购订单id'), +('mall4cloud-purchase-order-801','1','1000','采购订单id'), +('mall4cloud-purchase-order-802','1','1000','采购订单id'), +('mall4cloud-purchase-order-803','1','1000','采购订单id'), +('mall4cloud-purchase-order-804','1','1000','采购订单id'), +('mall4cloud-purchase-order-805','1','1000','采购订单id'), +('mall4cloud-purchase-order-806','1','1000','采购订单id'), +('mall4cloud-purchase-order-807','1','1000','采购订单id'), +('mall4cloud-purchase-order-808','1','1000','采购订单id'), +('mall4cloud-purchase-order-809','1','1000','采购订单id'), +('mall4cloud-purchase-order-810','1','1000','采购订单id'), +('mall4cloud-purchase-order-811','1','1000','采购订单id'), +('mall4cloud-purchase-order-812','1','1000','采购订单id'), +('mall4cloud-purchase-order-813','1','1000','采购订单id'), +('mall4cloud-purchase-order-814','1','1000','采购订单id'), +('mall4cloud-purchase-order-815','1','1000','采购订单id'), +('mall4cloud-purchase-order-816','1','1000','采购订单id'), +('mall4cloud-purchase-order-817','1','1000','采购订单id'), +('mall4cloud-purchase-order-818','1','1000','采购订单id'), +('mall4cloud-purchase-order-819','1','1000','采购订单id'), +('mall4cloud-purchase-order-820','1','1000','采购订单id'), +('mall4cloud-purchase-order-821','1','1000','采购订单id'), +('mall4cloud-purchase-order-822','1','1000','采购订单id'), +('mall4cloud-purchase-order-823','1','1000','采购订单id'), +('mall4cloud-purchase-order-824','1','1000','采购订单id'), +('mall4cloud-purchase-order-825','1','1000','采购订单id'), +('mall4cloud-purchase-order-826','1','1000','采购订单id'), +('mall4cloud-purchase-order-827','1','1000','采购订单id'), +('mall4cloud-purchase-order-828','1','1000','采购订单id'), +('mall4cloud-purchase-order-829','1','1000','采购订单id'), +('mall4cloud-purchase-order-830','1','1000','采购订单id'), +('mall4cloud-purchase-order-831','1','1000','采购订单id'), +('mall4cloud-purchase-order-832','1','1000','采购订单id'), +('mall4cloud-purchase-order-833','1','1000','采购订单id'), +('mall4cloud-purchase-order-834','1','1000','采购订单id'), +('mall4cloud-purchase-order-835','1','1000','采购订单id'), +('mall4cloud-purchase-order-836','1','1000','采购订单id'), +('mall4cloud-purchase-order-837','1','1000','采购订单id'), +('mall4cloud-purchase-order-838','1','1000','采购订单id'), +('mall4cloud-purchase-order-839','1','1000','采购订单id'), +('mall4cloud-purchase-order-840','1','1000','采购订单id'), +('mall4cloud-purchase-order-841','1','1000','采购订单id'), +('mall4cloud-purchase-order-842','1','1000','采购订单id'), +('mall4cloud-purchase-order-843','1','1000','采购订单id'), +('mall4cloud-purchase-order-844','1','1000','采购订单id'), +('mall4cloud-purchase-order-845','1','1000','采购订单id'), +('mall4cloud-purchase-order-846','1','1000','采购订单id'), +('mall4cloud-purchase-order-847','1','1000','采购订单id'), +('mall4cloud-purchase-order-848','1','1000','采购订单id'), +('mall4cloud-purchase-order-849','1','1000','采购订单id'), +('mall4cloud-purchase-order-850','1','1000','采购订单id'), +('mall4cloud-purchase-order-851','1','1000','采购订单id'), +('mall4cloud-purchase-order-852','1','1000','采购订单id'), +('mall4cloud-purchase-order-853','1','1000','采购订单id'), +('mall4cloud-purchase-order-854','1','1000','采购订单id'), +('mall4cloud-purchase-order-855','1','1000','采购订单id'), +('mall4cloud-purchase-order-856','1','1000','采购订单id'), +('mall4cloud-purchase-order-857','1','1000','采购订单id'), +('mall4cloud-purchase-order-858','1','1000','采购订单id'), +('mall4cloud-purchase-order-859','1','1000','采购订单id'), +('mall4cloud-purchase-order-860','1','1000','采购订单id'), +('mall4cloud-purchase-order-861','1','1000','采购订单id'), +('mall4cloud-purchase-order-862','1','1000','采购订单id'), +('mall4cloud-purchase-order-863','1','1000','采购订单id'), +('mall4cloud-purchase-order-864','1','1000','采购订单id'), +('mall4cloud-purchase-order-865','1','1000','采购订单id'), +('mall4cloud-purchase-order-866','1','1000','采购订单id'), +('mall4cloud-purchase-order-867','1','1000','采购订单id'), +('mall4cloud-purchase-order-868','1','1000','采购订单id'), +('mall4cloud-purchase-order-869','1','1000','采购订单id'), +('mall4cloud-purchase-order-870','1','1000','采购订单id'), +('mall4cloud-purchase-order-871','1','1000','采购订单id'), +('mall4cloud-purchase-order-872','1','1000','采购订单id'), +('mall4cloud-purchase-order-873','1','1000','采购订单id'), +('mall4cloud-purchase-order-874','1','1000','采购订单id'), +('mall4cloud-purchase-order-875','1','1000','采购订单id'), +('mall4cloud-purchase-order-876','1','1000','采购订单id'), +('mall4cloud-purchase-order-877','1','1000','采购订单id'), +('mall4cloud-purchase-order-878','1','1000','采购订单id'), +('mall4cloud-purchase-order-879','1','1000','采购订单id'), +('mall4cloud-purchase-order-880','1','1000','采购订单id'), +('mall4cloud-purchase-order-881','1','1000','采购订单id'), +('mall4cloud-purchase-order-882','1','1000','采购订单id'), +('mall4cloud-purchase-order-883','1','1000','采购订单id'), +('mall4cloud-purchase-order-884','1','1000','采购订单id'), +('mall4cloud-purchase-order-885','1','1000','采购订单id'), +('mall4cloud-purchase-order-886','1','1000','采购订单id'), +('mall4cloud-purchase-order-887','1','1000','采购订单id'), +('mall4cloud-purchase-order-888','1','1000','采购订单id'), +('mall4cloud-purchase-order-889','1','1000','采购订单id'), +('mall4cloud-purchase-order-890','1','1000','采购订单id'), +('mall4cloud-purchase-order-891','1','1000','采购订单id'), +('mall4cloud-purchase-order-892','1','1000','采购订单id'), +('mall4cloud-purchase-order-893','1','1000','采购订单id'), +('mall4cloud-purchase-order-894','1','1000','采购订单id'), +('mall4cloud-purchase-order-895','1','1000','采购订单id'), +('mall4cloud-purchase-order-896','1','1000','采购订单id'), +('mall4cloud-purchase-order-897','1','1000','采购订单id'), +('mall4cloud-purchase-order-898','1','1000','采购订单id'), +('mall4cloud-purchase-order-899','1','1000','采购订单id'), +('mall4cloud-purchase-order-900','1','1000','采购订单id'), +('mall4cloud-purchase-order-901','1','1000','采购订单id'), +('mall4cloud-purchase-order-902','1','1000','采购订单id'), +('mall4cloud-purchase-order-903','1','1000','采购订单id'), +('mall4cloud-purchase-order-904','1','1000','采购订单id'), +('mall4cloud-purchase-order-905','1','1000','采购订单id'), +('mall4cloud-purchase-order-906','1','1000','采购订单id'), +('mall4cloud-purchase-order-907','1','1000','采购订单id'), +('mall4cloud-purchase-order-908','1','1000','采购订单id'), +('mall4cloud-purchase-order-909','1','1000','采购订单id'), +('mall4cloud-purchase-order-910','1','1000','采购订单id'), +('mall4cloud-purchase-order-911','1','1000','采购订单id'), +('mall4cloud-purchase-order-912','1','1000','采购订单id'), +('mall4cloud-purchase-order-913','1','1000','采购订单id'), +('mall4cloud-purchase-order-914','1','1000','采购订单id'), +('mall4cloud-purchase-order-915','1','1000','采购订单id'), +('mall4cloud-purchase-order-916','1','1000','采购订单id'), +('mall4cloud-purchase-order-917','1','1000','采购订单id'), +('mall4cloud-purchase-order-918','1','1000','采购订单id'), +('mall4cloud-purchase-order-919','1','1000','采购订单id'), +('mall4cloud-purchase-order-920','1','1000','采购订单id'), +('mall4cloud-purchase-order-921','1','1000','采购订单id'), +('mall4cloud-purchase-order-922','1','1000','采购订单id'), +('mall4cloud-purchase-order-923','1','1000','采购订单id'), +('mall4cloud-purchase-order-924','1','1000','采购订单id'), +('mall4cloud-purchase-order-925','1','1000','采购订单id'), +('mall4cloud-purchase-order-926','1','1000','采购订单id'), +('mall4cloud-purchase-order-927','1','1000','采购订单id'), +('mall4cloud-purchase-order-928','1','1000','采购订单id'), +('mall4cloud-purchase-order-929','1','1000','采购订单id'), +('mall4cloud-purchase-order-930','1','1000','采购订单id'), +('mall4cloud-purchase-order-931','1','1000','采购订单id'), +('mall4cloud-purchase-order-932','1','1000','采购订单id'), +('mall4cloud-purchase-order-933','1','1000','采购订单id'), +('mall4cloud-purchase-order-934','1','1000','采购订单id'), +('mall4cloud-purchase-order-935','1','1000','采购订单id'), +('mall4cloud-purchase-order-936','1','1000','采购订单id'), +('mall4cloud-purchase-order-937','1','1000','采购订单id'), +('mall4cloud-purchase-order-938','1','1000','采购订单id'), +('mall4cloud-purchase-order-939','1','1000','采购订单id'), +('mall4cloud-purchase-order-940','1','1000','采购订单id'), +('mall4cloud-purchase-order-941','1','1000','采购订单id'), +('mall4cloud-purchase-order-942','1','1000','采购订单id'), +('mall4cloud-purchase-order-943','1','1000','采购订单id'), +('mall4cloud-purchase-order-944','1','1000','采购订单id'), +('mall4cloud-purchase-order-945','1','1000','采购订单id'), +('mall4cloud-purchase-order-946','1','1000','采购订单id'), +('mall4cloud-purchase-order-947','1','1000','采购订单id'), +('mall4cloud-purchase-order-948','1','1000','采购订单id'), +('mall4cloud-purchase-order-949','1','1000','采购订单id'), +('mall4cloud-purchase-order-950','1','1000','采购订单id'), +('mall4cloud-purchase-order-951','1','1000','采购订单id'), +('mall4cloud-purchase-order-952','1','1000','采购订单id'), +('mall4cloud-purchase-order-953','1','1000','采购订单id'), +('mall4cloud-purchase-order-954','1','1000','采购订单id'), +('mall4cloud-purchase-order-955','1','1000','采购订单id'), +('mall4cloud-purchase-order-956','1','1000','采购订单id'), +('mall4cloud-purchase-order-957','1','1000','采购订单id'), +('mall4cloud-purchase-order-958','1','1000','采购订单id'), +('mall4cloud-purchase-order-959','1','1000','采购订单id'), +('mall4cloud-purchase-order-960','1','1000','采购订单id'), +('mall4cloud-purchase-order-961','1','1000','采购订单id'), +('mall4cloud-purchase-order-962','1','1000','采购订单id'), +('mall4cloud-purchase-order-963','1','1000','采购订单id'), +('mall4cloud-purchase-order-964','1','1000','采购订单id'), +('mall4cloud-purchase-order-965','1','1000','采购订单id'), +('mall4cloud-purchase-order-966','1','1000','采购订单id'), +('mall4cloud-purchase-order-967','1','1000','采购订单id'), +('mall4cloud-purchase-order-968','1','1000','采购订单id'), +('mall4cloud-purchase-order-969','1','1000','采购订单id'), +('mall4cloud-purchase-order-970','1','1000','采购订单id'), +('mall4cloud-purchase-order-971','1','1000','采购订单id'), +('mall4cloud-purchase-order-972','1','1000','采购订单id'), +('mall4cloud-purchase-order-973','1','1000','采购订单id'), +('mall4cloud-purchase-order-974','1','1000','采购订单id'), +('mall4cloud-purchase-order-975','1','1000','采购订单id'), +('mall4cloud-purchase-order-976','1','1000','采购订单id'), +('mall4cloud-purchase-order-977','1','1000','采购订单id'), +('mall4cloud-purchase-order-978','1','1000','采购订单id'), +('mall4cloud-purchase-order-979','1','1000','采购订单id'), +('mall4cloud-purchase-order-980','1','1000','采购订单id'), +('mall4cloud-purchase-order-981','1','1000','采购订单id'), +('mall4cloud-purchase-order-982','1','1000','采购订单id'), +('mall4cloud-purchase-order-983','1','1000','采购订单id'), +('mall4cloud-purchase-order-984','1','1000','采购订单id'), +('mall4cloud-purchase-order-985','1','1000','采购订单id'), +('mall4cloud-purchase-order-986','1','1000','采购订单id'), +('mall4cloud-purchase-order-987','1','1000','采购订单id'), +('mall4cloud-purchase-order-988','1','1000','采购订单id'), +('mall4cloud-purchase-order-989','1','1000','采购订单id'), +('mall4cloud-purchase-order-990','1','1000','采购订单id'), +('mall4cloud-purchase-order-991','1','1000','采购订单id'), +('mall4cloud-purchase-order-992','1','1000','采购订单id'), +('mall4cloud-purchase-order-993','1','1000','采购订单id'), +('mall4cloud-purchase-order-994','1','1000','采购订单id'), +('mall4cloud-purchase-order-995','1','1000','采购订单id'), +('mall4cloud-purchase-order-996','1','1000','采购订单id'), +('mall4cloud-purchase-order-997','1','1000','采购订单id'), +('mall4cloud-purchase-order-998','1','1000','采购订单id'), +('mall4cloud-purchase-order-999','1','1000','采购订单id'), +('mall4cloud-purchase-order-addr-000','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-001','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-002','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-003','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-004','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-005','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-006','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-007','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-008','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-009','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-010','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-011','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-012','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-013','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-014','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-015','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-016','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-017','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-018','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-019','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-020','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-021','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-022','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-023','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-024','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-025','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-026','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-027','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-028','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-029','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-030','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-031','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-032','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-033','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-034','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-035','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-036','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-037','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-038','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-039','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-040','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-041','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-042','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-043','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-044','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-045','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-046','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-047','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-048','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-049','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-050','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-051','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-052','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-053','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-054','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-055','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-056','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-057','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-058','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-059','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-060','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-061','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-062','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-063','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-064','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-065','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-066','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-067','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-068','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-069','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-070','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-071','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-072','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-073','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-074','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-075','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-076','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-077','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-078','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-079','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-080','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-081','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-082','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-083','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-084','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-085','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-086','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-087','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-088','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-089','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-090','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-091','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-092','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-093','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-094','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-095','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-096','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-097','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-098','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-099','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-100','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-101','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-102','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-103','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-104','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-105','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-106','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-107','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-108','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-109','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-110','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-111','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-112','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-113','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-114','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-115','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-116','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-117','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-118','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-119','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-120','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-121','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-122','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-123','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-124','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-125','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-126','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-127','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-128','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-129','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-130','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-131','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-132','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-133','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-134','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-135','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-136','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-137','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-138','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-139','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-140','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-141','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-142','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-143','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-144','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-145','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-146','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-147','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-148','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-149','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-150','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-151','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-152','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-153','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-154','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-155','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-156','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-157','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-158','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-159','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-160','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-161','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-162','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-163','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-164','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-165','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-166','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-167','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-168','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-169','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-170','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-171','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-172','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-173','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-174','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-175','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-176','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-177','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-178','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-179','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-180','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-181','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-182','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-183','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-184','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-185','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-186','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-187','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-188','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-189','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-190','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-191','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-192','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-193','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-194','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-195','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-196','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-197','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-198','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-199','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-200','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-201','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-202','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-203','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-204','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-205','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-206','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-207','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-208','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-209','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-210','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-211','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-212','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-213','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-214','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-215','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-216','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-217','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-218','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-219','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-220','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-221','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-222','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-223','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-224','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-225','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-226','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-227','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-228','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-229','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-230','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-231','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-232','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-233','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-234','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-235','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-236','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-237','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-238','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-239','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-240','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-241','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-242','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-243','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-244','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-245','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-246','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-247','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-248','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-249','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-250','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-251','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-252','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-253','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-254','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-255','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-256','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-257','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-258','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-259','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-260','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-261','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-262','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-263','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-264','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-265','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-266','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-267','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-268','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-269','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-270','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-271','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-272','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-273','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-274','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-275','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-276','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-277','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-278','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-279','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-280','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-281','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-282','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-283','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-284','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-285','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-286','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-287','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-288','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-289','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-290','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-291','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-292','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-293','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-294','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-295','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-296','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-297','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-298','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-299','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-300','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-301','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-302','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-303','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-304','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-305','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-306','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-307','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-308','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-309','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-310','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-311','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-312','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-313','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-314','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-315','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-316','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-317','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-318','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-319','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-320','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-321','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-322','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-323','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-324','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-325','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-326','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-327','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-328','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-329','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-330','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-331','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-332','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-333','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-334','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-335','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-336','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-337','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-338','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-339','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-340','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-341','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-342','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-343','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-344','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-345','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-346','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-347','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-348','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-349','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-350','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-351','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-352','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-353','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-354','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-355','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-356','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-357','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-358','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-359','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-360','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-361','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-362','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-363','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-364','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-365','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-366','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-367','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-368','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-369','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-370','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-371','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-372','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-373','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-374','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-375','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-376','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-377','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-378','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-379','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-380','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-381','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-382','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-383','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-384','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-385','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-386','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-387','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-388','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-389','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-390','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-391','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-392','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-393','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-394','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-395','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-396','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-397','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-398','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-399','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-400','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-401','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-402','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-403','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-404','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-405','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-406','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-407','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-408','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-409','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-410','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-411','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-412','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-413','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-414','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-415','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-416','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-417','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-418','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-419','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-420','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-421','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-422','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-423','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-424','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-425','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-426','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-427','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-428','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-429','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-430','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-431','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-432','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-433','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-434','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-435','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-436','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-437','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-438','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-439','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-440','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-441','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-442','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-443','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-444','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-445','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-446','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-447','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-448','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-449','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-450','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-451','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-452','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-453','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-454','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-455','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-456','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-457','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-458','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-459','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-460','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-461','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-462','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-463','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-464','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-465','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-466','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-467','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-468','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-469','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-470','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-471','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-472','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-473','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-474','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-475','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-476','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-477','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-478','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-479','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-480','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-481','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-482','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-483','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-484','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-485','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-486','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-487','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-488','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-489','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-490','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-491','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-492','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-493','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-494','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-495','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-496','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-497','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-498','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-499','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-500','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-501','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-502','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-503','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-504','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-505','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-506','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-507','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-508','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-509','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-510','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-511','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-512','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-513','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-514','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-515','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-516','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-517','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-518','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-519','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-520','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-521','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-522','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-523','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-524','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-525','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-526','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-527','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-528','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-529','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-530','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-531','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-532','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-533','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-534','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-535','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-536','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-537','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-538','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-539','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-540','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-541','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-542','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-543','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-544','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-545','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-546','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-547','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-548','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-549','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-550','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-551','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-552','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-553','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-554','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-555','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-556','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-557','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-558','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-559','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-560','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-561','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-562','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-563','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-564','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-565','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-566','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-567','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-568','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-569','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-570','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-571','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-572','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-573','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-574','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-575','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-576','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-577','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-578','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-579','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-580','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-581','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-582','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-583','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-584','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-585','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-586','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-587','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-588','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-589','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-590','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-591','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-592','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-593','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-594','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-595','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-596','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-597','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-598','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-599','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-600','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-601','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-602','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-603','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-604','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-605','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-606','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-607','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-608','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-609','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-610','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-611','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-612','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-613','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-614','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-615','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-616','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-617','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-618','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-619','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-620','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-621','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-622','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-623','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-624','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-625','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-626','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-627','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-628','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-629','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-630','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-631','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-632','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-633','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-634','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-635','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-636','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-637','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-638','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-639','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-640','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-641','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-642','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-643','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-644','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-645','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-646','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-647','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-648','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-649','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-650','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-651','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-652','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-653','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-654','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-655','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-656','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-657','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-658','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-659','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-660','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-661','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-662','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-663','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-664','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-665','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-666','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-667','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-668','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-669','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-670','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-671','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-672','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-673','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-674','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-675','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-676','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-677','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-678','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-679','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-680','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-681','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-682','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-683','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-684','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-685','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-686','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-687','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-688','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-689','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-690','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-691','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-692','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-693','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-694','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-695','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-696','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-697','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-698','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-699','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-700','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-701','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-702','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-703','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-704','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-705','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-706','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-707','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-708','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-709','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-710','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-711','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-712','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-713','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-714','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-715','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-716','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-717','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-718','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-719','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-720','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-721','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-722','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-723','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-724','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-725','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-726','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-727','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-728','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-729','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-730','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-731','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-732','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-733','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-734','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-735','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-736','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-737','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-738','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-739','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-740','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-741','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-742','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-743','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-744','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-745','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-746','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-747','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-748','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-749','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-750','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-751','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-752','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-753','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-754','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-755','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-756','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-757','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-758','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-759','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-760','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-761','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-762','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-763','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-764','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-765','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-766','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-767','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-768','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-769','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-770','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-771','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-772','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-773','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-774','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-775','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-776','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-777','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-778','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-779','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-780','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-781','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-782','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-783','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-784','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-785','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-786','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-787','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-788','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-789','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-790','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-791','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-792','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-793','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-794','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-795','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-796','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-797','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-798','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-799','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-800','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-801','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-802','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-803','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-804','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-805','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-806','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-807','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-808','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-809','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-810','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-811','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-812','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-813','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-814','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-815','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-816','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-817','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-818','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-819','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-820','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-821','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-822','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-823','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-824','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-825','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-826','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-827','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-828','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-829','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-830','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-831','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-832','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-833','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-834','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-835','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-836','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-837','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-838','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-839','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-840','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-841','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-842','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-843','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-844','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-845','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-846','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-847','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-848','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-849','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-850','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-851','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-852','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-853','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-854','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-855','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-856','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-857','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-858','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-859','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-860','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-861','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-862','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-863','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-864','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-865','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-866','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-867','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-868','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-869','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-870','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-871','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-872','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-873','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-874','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-875','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-876','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-877','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-878','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-879','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-880','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-881','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-882','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-883','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-884','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-885','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-886','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-887','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-888','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-889','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-890','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-891','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-892','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-893','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-894','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-895','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-896','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-897','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-898','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-899','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-900','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-901','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-902','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-903','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-904','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-905','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-906','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-907','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-908','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-909','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-910','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-911','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-912','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-913','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-914','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-915','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-916','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-917','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-918','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-919','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-920','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-921','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-922','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-923','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-924','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-925','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-926','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-927','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-928','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-929','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-930','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-931','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-932','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-933','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-934','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-935','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-936','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-937','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-938','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-939','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-940','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-941','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-942','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-943','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-944','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-945','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-946','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-947','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-948','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-949','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-950','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-951','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-952','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-953','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-954','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-955','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-956','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-957','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-958','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-959','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-960','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-961','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-962','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-963','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-964','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-965','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-966','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-967','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-968','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-969','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-970','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-971','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-972','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-973','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-974','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-975','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-976','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-977','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-978','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-979','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-980','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-981','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-982','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-983','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-984','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-985','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-986','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-987','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-988','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-989','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-990','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-991','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-992','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-993','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-994','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-995','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-996','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-997','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-998','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-addr-999','1','1000','采购订单地址id'), +('mall4cloud-purchase-order-item-000','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-001','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-002','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-003','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-004','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-005','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-006','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-007','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-008','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-009','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-010','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-011','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-012','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-013','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-014','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-015','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-016','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-017','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-018','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-019','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-020','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-021','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-022','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-023','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-024','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-025','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-026','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-027','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-028','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-029','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-030','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-031','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-032','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-033','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-034','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-035','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-036','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-037','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-038','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-039','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-040','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-041','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-042','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-043','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-044','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-045','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-046','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-047','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-048','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-049','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-050','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-051','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-052','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-053','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-054','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-055','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-056','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-057','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-058','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-059','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-060','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-061','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-062','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-063','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-064','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-065','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-066','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-067','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-068','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-069','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-070','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-071','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-072','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-073','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-074','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-075','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-076','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-077','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-078','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-079','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-080','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-081','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-082','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-083','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-084','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-085','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-086','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-087','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-088','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-089','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-090','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-091','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-092','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-093','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-094','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-095','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-096','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-097','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-098','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-099','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-100','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-101','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-102','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-103','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-104','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-105','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-106','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-107','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-108','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-109','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-110','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-111','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-112','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-113','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-114','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-115','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-116','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-117','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-118','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-119','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-120','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-121','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-122','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-123','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-124','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-125','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-126','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-127','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-128','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-129','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-130','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-131','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-132','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-133','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-134','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-135','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-136','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-137','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-138','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-139','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-140','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-141','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-142','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-143','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-144','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-145','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-146','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-147','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-148','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-149','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-150','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-151','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-152','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-153','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-154','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-155','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-156','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-157','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-158','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-159','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-160','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-161','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-162','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-163','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-164','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-165','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-166','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-167','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-168','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-169','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-170','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-171','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-172','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-173','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-174','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-175','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-176','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-177','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-178','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-179','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-180','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-181','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-182','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-183','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-184','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-185','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-186','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-187','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-188','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-189','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-190','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-191','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-192','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-193','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-194','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-195','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-196','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-197','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-198','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-199','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-200','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-201','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-202','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-203','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-204','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-205','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-206','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-207','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-208','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-209','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-210','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-211','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-212','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-213','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-214','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-215','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-216','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-217','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-218','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-219','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-220','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-221','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-222','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-223','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-224','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-225','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-226','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-227','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-228','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-229','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-230','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-231','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-232','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-233','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-234','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-235','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-236','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-237','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-238','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-239','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-240','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-241','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-242','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-243','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-244','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-245','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-246','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-247','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-248','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-249','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-250','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-251','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-252','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-253','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-254','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-255','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-256','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-257','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-258','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-259','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-260','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-261','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-262','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-263','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-264','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-265','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-266','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-267','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-268','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-269','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-270','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-271','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-272','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-273','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-274','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-275','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-276','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-277','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-278','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-279','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-280','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-281','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-282','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-283','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-284','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-285','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-286','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-287','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-288','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-289','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-290','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-291','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-292','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-293','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-294','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-295','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-296','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-297','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-298','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-299','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-300','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-301','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-302','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-303','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-304','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-305','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-306','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-307','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-308','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-309','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-310','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-311','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-312','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-313','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-314','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-315','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-316','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-317','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-318','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-319','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-320','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-321','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-322','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-323','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-324','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-325','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-326','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-327','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-328','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-329','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-330','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-331','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-332','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-333','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-334','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-335','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-336','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-337','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-338','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-339','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-340','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-341','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-342','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-343','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-344','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-345','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-346','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-347','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-348','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-349','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-350','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-351','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-352','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-353','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-354','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-355','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-356','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-357','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-358','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-359','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-360','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-361','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-362','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-363','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-364','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-365','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-366','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-367','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-368','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-369','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-370','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-371','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-372','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-373','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-374','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-375','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-376','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-377','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-378','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-379','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-380','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-381','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-382','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-383','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-384','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-385','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-386','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-387','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-388','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-389','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-390','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-391','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-392','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-393','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-394','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-395','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-396','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-397','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-398','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-399','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-400','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-401','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-402','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-403','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-404','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-405','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-406','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-407','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-408','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-409','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-410','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-411','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-412','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-413','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-414','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-415','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-416','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-417','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-418','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-419','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-420','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-421','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-422','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-423','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-424','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-425','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-426','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-427','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-428','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-429','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-430','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-431','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-432','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-433','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-434','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-435','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-436','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-437','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-438','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-439','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-440','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-441','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-442','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-443','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-444','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-445','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-446','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-447','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-448','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-449','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-450','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-451','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-452','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-453','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-454','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-455','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-456','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-457','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-458','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-459','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-460','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-461','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-462','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-463','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-464','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-465','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-466','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-467','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-468','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-469','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-470','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-471','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-472','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-473','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-474','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-475','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-476','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-477','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-478','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-479','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-480','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-481','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-482','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-483','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-484','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-485','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-486','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-487','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-488','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-489','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-490','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-491','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-492','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-493','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-494','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-495','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-496','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-497','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-498','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-499','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-500','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-501','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-502','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-503','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-504','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-505','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-506','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-507','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-508','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-509','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-510','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-511','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-512','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-513','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-514','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-515','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-516','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-517','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-518','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-519','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-520','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-521','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-522','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-523','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-524','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-525','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-526','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-527','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-528','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-529','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-530','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-531','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-532','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-533','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-534','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-535','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-536','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-537','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-538','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-539','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-540','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-541','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-542','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-543','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-544','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-545','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-546','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-547','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-548','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-549','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-550','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-551','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-552','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-553','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-554','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-555','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-556','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-557','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-558','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-559','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-560','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-561','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-562','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-563','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-564','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-565','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-566','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-567','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-568','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-569','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-570','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-571','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-572','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-573','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-574','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-575','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-576','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-577','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-578','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-579','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-580','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-581','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-582','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-583','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-584','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-585','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-586','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-587','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-588','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-589','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-590','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-591','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-592','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-593','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-594','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-595','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-596','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-597','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-598','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-599','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-600','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-601','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-602','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-603','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-604','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-605','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-606','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-607','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-608','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-609','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-610','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-611','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-612','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-613','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-614','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-615','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-616','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-617','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-618','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-619','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-620','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-621','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-622','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-623','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-624','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-625','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-626','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-627','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-628','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-629','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-630','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-631','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-632','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-633','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-634','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-635','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-636','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-637','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-638','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-639','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-640','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-641','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-642','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-643','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-644','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-645','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-646','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-647','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-648','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-649','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-650','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-651','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-652','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-653','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-654','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-655','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-656','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-657','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-658','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-659','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-660','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-661','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-662','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-663','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-664','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-665','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-666','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-667','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-668','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-669','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-670','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-671','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-672','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-673','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-674','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-675','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-676','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-677','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-678','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-679','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-680','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-681','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-682','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-683','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-684','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-685','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-686','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-687','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-688','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-689','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-690','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-691','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-692','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-693','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-694','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-695','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-696','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-697','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-698','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-699','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-700','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-701','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-702','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-703','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-704','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-705','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-706','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-707','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-708','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-709','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-710','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-711','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-712','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-713','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-714','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-715','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-716','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-717','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-718','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-719','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-720','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-721','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-722','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-723','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-724','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-725','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-726','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-727','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-728','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-729','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-730','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-731','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-732','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-733','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-734','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-735','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-736','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-737','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-738','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-739','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-740','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-741','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-742','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-743','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-744','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-745','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-746','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-747','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-748','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-749','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-750','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-751','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-752','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-753','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-754','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-755','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-756','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-757','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-758','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-759','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-760','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-761','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-762','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-763','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-764','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-765','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-766','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-767','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-768','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-769','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-770','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-771','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-772','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-773','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-774','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-775','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-776','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-777','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-778','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-779','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-780','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-781','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-782','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-783','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-784','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-785','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-786','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-787','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-788','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-789','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-790','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-791','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-792','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-793','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-794','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-795','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-796','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-797','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-798','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-799','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-800','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-801','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-802','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-803','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-804','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-805','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-806','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-807','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-808','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-809','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-810','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-811','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-812','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-813','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-814','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-815','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-816','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-817','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-818','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-819','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-820','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-821','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-822','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-823','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-824','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-825','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-826','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-827','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-828','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-829','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-830','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-831','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-832','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-833','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-834','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-835','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-836','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-837','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-838','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-839','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-840','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-841','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-842','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-843','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-844','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-845','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-846','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-847','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-848','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-849','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-850','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-851','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-852','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-853','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-854','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-855','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-856','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-857','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-858','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-859','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-860','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-861','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-862','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-863','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-864','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-865','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-866','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-867','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-868','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-869','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-870','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-871','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-872','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-873','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-874','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-875','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-876','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-877','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-878','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-879','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-880','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-881','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-882','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-883','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-884','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-885','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-886','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-887','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-888','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-889','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-890','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-891','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-892','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-893','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-894','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-895','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-896','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-897','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-898','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-899','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-900','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-901','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-902','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-903','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-904','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-905','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-906','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-907','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-908','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-909','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-910','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-911','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-912','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-913','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-914','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-915','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-916','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-917','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-918','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-919','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-920','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-921','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-922','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-923','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-924','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-925','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-926','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-927','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-928','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-929','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-930','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-931','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-932','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-933','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-934','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-935','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-936','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-937','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-938','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-939','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-940','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-941','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-942','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-943','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-944','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-945','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-946','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-947','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-948','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-949','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-950','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-951','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-952','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-953','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-954','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-955','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-956','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-957','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-958','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-959','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-960','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-961','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-962','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-963','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-964','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-965','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-966','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-967','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-968','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-969','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-970','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-971','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-972','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-973','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-974','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-975','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-976','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-977','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-978','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-979','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-980','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-981','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-982','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-983','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-984','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-985','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-986','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-987','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-988','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-989','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-990','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-991','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-992','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-993','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-994','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-995','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-996','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-997','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-998','1','1000','采购订单项id'), +('mall4cloud-purchase-order-item-999','1','1000','采购订单项id'), +('mall4cloud-refund-000','1','1000','退款id'), +('mall4cloud-refund-001','1','1000','退款id'), +('mall4cloud-refund-002','1','1000','退款id'), +('mall4cloud-refund-003','1','1000','退款id'), +('mall4cloud-refund-004','1','1000','退款id'), +('mall4cloud-refund-005','1','1000','退款id'), +('mall4cloud-refund-006','1','1000','退款id'), +('mall4cloud-refund-007','1','1000','退款id'), +('mall4cloud-refund-008','1','1000','退款id'), +('mall4cloud-refund-009','1','1000','退款id'), +('mall4cloud-refund-010','1','1000','退款id'), +('mall4cloud-refund-011','1','1000','退款id'), +('mall4cloud-refund-012','1','1000','退款id'), +('mall4cloud-refund-013','1','1000','退款id'), +('mall4cloud-refund-014','1','1000','退款id'), +('mall4cloud-refund-015','1','1000','退款id'), +('mall4cloud-refund-016','1','1000','退款id'), +('mall4cloud-refund-017','1','1000','退款id'), +('mall4cloud-refund-018','1','1000','退款id'), +('mall4cloud-refund-019','1','1000','退款id'), +('mall4cloud-refund-020','1','1000','退款id'), +('mall4cloud-refund-021','1','1000','退款id'), +('mall4cloud-refund-022','1','1000','退款id'), +('mall4cloud-refund-023','1','1000','退款id'), +('mall4cloud-refund-024','1','1000','退款id'), +('mall4cloud-refund-025','1','1000','退款id'), +('mall4cloud-refund-026','1','1000','退款id'), +('mall4cloud-refund-027','1','1000','退款id'), +('mall4cloud-refund-028','1','1000','退款id'), +('mall4cloud-refund-029','1','1000','退款id'), +('mall4cloud-refund-030','1','1000','退款id'), +('mall4cloud-refund-031','1','1000','退款id'), +('mall4cloud-refund-032','1','1000','退款id'), +('mall4cloud-refund-033','1','1000','退款id'), +('mall4cloud-refund-034','1','1000','退款id'), +('mall4cloud-refund-035','1','1000','退款id'), +('mall4cloud-refund-036','1','1000','退款id'), +('mall4cloud-refund-037','1','1000','退款id'), +('mall4cloud-refund-038','1','1000','退款id'), +('mall4cloud-refund-039','1','1000','退款id'), +('mall4cloud-refund-040','1','1000','退款id'), +('mall4cloud-refund-041','1','1000','退款id'), +('mall4cloud-refund-042','1','1000','退款id'), +('mall4cloud-refund-043','1','1000','退款id'), +('mall4cloud-refund-044','1','1000','退款id'), +('mall4cloud-refund-045','1','1000','退款id'), +('mall4cloud-refund-046','1','1000','退款id'), +('mall4cloud-refund-047','1','1000','退款id'), +('mall4cloud-refund-048','1','1000','退款id'), +('mall4cloud-refund-049','1','1000','退款id'), +('mall4cloud-refund-050','1','1000','退款id'), +('mall4cloud-refund-051','1','1000','退款id'), +('mall4cloud-refund-052','1','1000','退款id'), +('mall4cloud-refund-053','1','1000','退款id'), +('mall4cloud-refund-054','1','1000','退款id'), +('mall4cloud-refund-055','1','1000','退款id'), +('mall4cloud-refund-056','1','1000','退款id'), +('mall4cloud-refund-057','1','1000','退款id'), +('mall4cloud-refund-058','1','1000','退款id'), +('mall4cloud-refund-059','1','1000','退款id'), +('mall4cloud-refund-060','1','1000','退款id'), +('mall4cloud-refund-061','1','1000','退款id'), +('mall4cloud-refund-062','1','1000','退款id'), +('mall4cloud-refund-063','1','1000','退款id'), +('mall4cloud-refund-064','1','1000','退款id'), +('mall4cloud-refund-065','1','1000','退款id'), +('mall4cloud-refund-066','1','1000','退款id'), +('mall4cloud-refund-067','1','1000','退款id'), +('mall4cloud-refund-068','1','1000','退款id'), +('mall4cloud-refund-069','1','1000','退款id'), +('mall4cloud-refund-070','1','1000','退款id'), +('mall4cloud-refund-071','1','1000','退款id'), +('mall4cloud-refund-072','1','1000','退款id'), +('mall4cloud-refund-073','1','1000','退款id'), +('mall4cloud-refund-074','1','1000','退款id'), +('mall4cloud-refund-075','1','1000','退款id'), +('mall4cloud-refund-076','1','1000','退款id'), +('mall4cloud-refund-077','1','1000','退款id'), +('mall4cloud-refund-078','1','1000','退款id'), +('mall4cloud-refund-079','1','1000','退款id'), +('mall4cloud-refund-080','1','1000','退款id'), +('mall4cloud-refund-081','1','1000','退款id'), +('mall4cloud-refund-082','1','1000','退款id'), +('mall4cloud-refund-083','1','1000','退款id'), +('mall4cloud-refund-084','1','1000','退款id'), +('mall4cloud-refund-085','1','1000','退款id'), +('mall4cloud-refund-086','1','1000','退款id'), +('mall4cloud-refund-087','1','1000','退款id'), +('mall4cloud-refund-088','1','1000','退款id'), +('mall4cloud-refund-089','1','1000','退款id'), +('mall4cloud-refund-090','1','1000','退款id'), +('mall4cloud-refund-091','1','1000','退款id'), +('mall4cloud-refund-092','1','1000','退款id'), +('mall4cloud-refund-093','1','1000','退款id'), +('mall4cloud-refund-094','1','1000','退款id'), +('mall4cloud-refund-095','1','1000','退款id'), +('mall4cloud-refund-096','1','1000','退款id'), +('mall4cloud-refund-097','1','1000','退款id'), +('mall4cloud-refund-098','1','1000','退款id'), +('mall4cloud-refund-099','1','1000','退款id'), +('mall4cloud-refund-100','1','1000','退款id'), +('mall4cloud-refund-101','1','1000','退款id'), +('mall4cloud-refund-102','1','1000','退款id'), +('mall4cloud-refund-103','1','1000','退款id'), +('mall4cloud-refund-104','1','1000','退款id'), +('mall4cloud-refund-105','1','1000','退款id'), +('mall4cloud-refund-106','1','1000','退款id'), +('mall4cloud-refund-107','1','1000','退款id'), +('mall4cloud-refund-108','1','1000','退款id'), +('mall4cloud-refund-109','1','1000','退款id'), +('mall4cloud-refund-110','1','1000','退款id'), +('mall4cloud-refund-111','1','1000','退款id'), +('mall4cloud-refund-112','1','1000','退款id'), +('mall4cloud-refund-113','1','1000','退款id'), +('mall4cloud-refund-114','1','1000','退款id'), +('mall4cloud-refund-115','1','1000','退款id'), +('mall4cloud-refund-116','1','1000','退款id'), +('mall4cloud-refund-117','1','1000','退款id'), +('mall4cloud-refund-118','1','1000','退款id'), +('mall4cloud-refund-119','1','1000','退款id'), +('mall4cloud-refund-120','1','1000','退款id'), +('mall4cloud-refund-121','1','1000','退款id'), +('mall4cloud-refund-122','1','1000','退款id'), +('mall4cloud-refund-123','1','1000','退款id'), +('mall4cloud-refund-124','1','1000','退款id'), +('mall4cloud-refund-125','1','1000','退款id'), +('mall4cloud-refund-126','1','1000','退款id'), +('mall4cloud-refund-127','1','1000','退款id'), +('mall4cloud-refund-128','1','1000','退款id'), +('mall4cloud-refund-129','1','1000','退款id'), +('mall4cloud-refund-130','1','1000','退款id'), +('mall4cloud-refund-131','1','1000','退款id'), +('mall4cloud-refund-132','1','1000','退款id'), +('mall4cloud-refund-133','1','1000','退款id'), +('mall4cloud-refund-134','1','1000','退款id'), +('mall4cloud-refund-135','1','1000','退款id'), +('mall4cloud-refund-136','1','1000','退款id'), +('mall4cloud-refund-137','1','1000','退款id'), +('mall4cloud-refund-138','1','1000','退款id'), +('mall4cloud-refund-139','1','1000','退款id'), +('mall4cloud-refund-140','1','1000','退款id'), +('mall4cloud-refund-141','1','1000','退款id'), +('mall4cloud-refund-142','1','1000','退款id'), +('mall4cloud-refund-143','1','1000','退款id'), +('mall4cloud-refund-144','1','1000','退款id'), +('mall4cloud-refund-145','1','1000','退款id'), +('mall4cloud-refund-146','1','1000','退款id'), +('mall4cloud-refund-147','1','1000','退款id'), +('mall4cloud-refund-148','1','1000','退款id'), +('mall4cloud-refund-149','1','1000','退款id'), +('mall4cloud-refund-150','1','1000','退款id'), +('mall4cloud-refund-151','1','1000','退款id'), +('mall4cloud-refund-152','1','1000','退款id'), +('mall4cloud-refund-153','1','1000','退款id'), +('mall4cloud-refund-154','1','1000','退款id'), +('mall4cloud-refund-155','1','1000','退款id'), +('mall4cloud-refund-156','1','1000','退款id'), +('mall4cloud-refund-157','1','1000','退款id'), +('mall4cloud-refund-158','1','1000','退款id'), +('mall4cloud-refund-159','1','1000','退款id'), +('mall4cloud-refund-160','1','1000','退款id'), +('mall4cloud-refund-161','1','1000','退款id'), +('mall4cloud-refund-162','1','1000','退款id'), +('mall4cloud-refund-163','1','1000','退款id'), +('mall4cloud-refund-164','1','1000','退款id'), +('mall4cloud-refund-165','1','1000','退款id'), +('mall4cloud-refund-166','1','1000','退款id'), +('mall4cloud-refund-167','1','1000','退款id'), +('mall4cloud-refund-168','1','1000','退款id'), +('mall4cloud-refund-169','1','1000','退款id'), +('mall4cloud-refund-170','1','1000','退款id'), +('mall4cloud-refund-171','1','1000','退款id'), +('mall4cloud-refund-172','1','1000','退款id'), +('mall4cloud-refund-173','1','1000','退款id'), +('mall4cloud-refund-174','1','1000','退款id'), +('mall4cloud-refund-175','1','1000','退款id'), +('mall4cloud-refund-176','1','1000','退款id'), +('mall4cloud-refund-177','1','1000','退款id'), +('mall4cloud-refund-178','1','1000','退款id'), +('mall4cloud-refund-179','1','1000','退款id'), +('mall4cloud-refund-180','1','1000','退款id'), +('mall4cloud-refund-181','1','1000','退款id'), +('mall4cloud-refund-182','1','1000','退款id'), +('mall4cloud-refund-183','1','1000','退款id'), +('mall4cloud-refund-184','1','1000','退款id'), +('mall4cloud-refund-185','1','1000','退款id'), +('mall4cloud-refund-186','1','1000','退款id'), +('mall4cloud-refund-187','1','1000','退款id'), +('mall4cloud-refund-188','1','1000','退款id'), +('mall4cloud-refund-189','1','1000','退款id'), +('mall4cloud-refund-190','1','1000','退款id'), +('mall4cloud-refund-191','1','1000','退款id'), +('mall4cloud-refund-192','1','1000','退款id'), +('mall4cloud-refund-193','1','1000','退款id'), +('mall4cloud-refund-194','1','1000','退款id'), +('mall4cloud-refund-195','1','1000','退款id'), +('mall4cloud-refund-196','1','1000','退款id'), +('mall4cloud-refund-197','1','1000','退款id'), +('mall4cloud-refund-198','1','1000','退款id'), +('mall4cloud-refund-199','1','1000','退款id'), +('mall4cloud-refund-200','1','1000','退款id'), +('mall4cloud-refund-201','1','1000','退款id'), +('mall4cloud-refund-202','1','1000','退款id'), +('mall4cloud-refund-203','1','1000','退款id'), +('mall4cloud-refund-204','1','1000','退款id'), +('mall4cloud-refund-205','1','1000','退款id'), +('mall4cloud-refund-206','1','1000','退款id'), +('mall4cloud-refund-207','1','1000','退款id'), +('mall4cloud-refund-208','1','1000','退款id'), +('mall4cloud-refund-209','1','1000','退款id'), +('mall4cloud-refund-210','1','1000','退款id'), +('mall4cloud-refund-211','1','1000','退款id'), +('mall4cloud-refund-212','1','1000','退款id'), +('mall4cloud-refund-213','1','1000','退款id'), +('mall4cloud-refund-214','1','1000','退款id'), +('mall4cloud-refund-215','1','1000','退款id'), +('mall4cloud-refund-216','1','1000','退款id'), +('mall4cloud-refund-217','1','1000','退款id'), +('mall4cloud-refund-218','1','1000','退款id'), +('mall4cloud-refund-219','1','1000','退款id'), +('mall4cloud-refund-220','1','1000','退款id'), +('mall4cloud-refund-221','1','1000','退款id'), +('mall4cloud-refund-222','1','1000','退款id'), +('mall4cloud-refund-223','1','1000','退款id'), +('mall4cloud-refund-224','1','1000','退款id'), +('mall4cloud-refund-225','1','1000','退款id'), +('mall4cloud-refund-226','1','1000','退款id'), +('mall4cloud-refund-227','1','1000','退款id'), +('mall4cloud-refund-228','1','1000','退款id'), +('mall4cloud-refund-229','1','1000','退款id'), +('mall4cloud-refund-230','1','1000','退款id'), +('mall4cloud-refund-231','1','1000','退款id'), +('mall4cloud-refund-232','1','1000','退款id'), +('mall4cloud-refund-233','1','1000','退款id'), +('mall4cloud-refund-234','1','1000','退款id'), +('mall4cloud-refund-235','1','1000','退款id'), +('mall4cloud-refund-236','1','1000','退款id'), +('mall4cloud-refund-237','1','1000','退款id'), +('mall4cloud-refund-238','1','1000','退款id'), +('mall4cloud-refund-239','1','1000','退款id'), +('mall4cloud-refund-240','1','1000','退款id'), +('mall4cloud-refund-241','1','1000','退款id'), +('mall4cloud-refund-242','1','1000','退款id'), +('mall4cloud-refund-243','1','1000','退款id'), +('mall4cloud-refund-244','1','1000','退款id'), +('mall4cloud-refund-245','1','1000','退款id'), +('mall4cloud-refund-246','1','1000','退款id'), +('mall4cloud-refund-247','1','1000','退款id'), +('mall4cloud-refund-248','1','1000','退款id'), +('mall4cloud-refund-249','1','1000','退款id'), +('mall4cloud-refund-250','1','1000','退款id'), +('mall4cloud-refund-251','1','1000','退款id'), +('mall4cloud-refund-252','1','1000','退款id'), +('mall4cloud-refund-253','1','1000','退款id'), +('mall4cloud-refund-254','1','1000','退款id'), +('mall4cloud-refund-255','1','1000','退款id'), +('mall4cloud-refund-256','1','1000','退款id'), +('mall4cloud-refund-257','1','1000','退款id'), +('mall4cloud-refund-258','1','1000','退款id'), +('mall4cloud-refund-259','1','1000','退款id'), +('mall4cloud-refund-260','1','1000','退款id'), +('mall4cloud-refund-261','1','1000','退款id'), +('mall4cloud-refund-262','1','1000','退款id'), +('mall4cloud-refund-263','1','1000','退款id'), +('mall4cloud-refund-264','1','1000','退款id'), +('mall4cloud-refund-265','1','1000','退款id'), +('mall4cloud-refund-266','1','1000','退款id'), +('mall4cloud-refund-267','1','1000','退款id'), +('mall4cloud-refund-268','1','1000','退款id'), +('mall4cloud-refund-269','1','1000','退款id'), +('mall4cloud-refund-270','1','1000','退款id'), +('mall4cloud-refund-271','1','1000','退款id'), +('mall4cloud-refund-272','1','1000','退款id'), +('mall4cloud-refund-273','1','1000','退款id'), +('mall4cloud-refund-274','1','1000','退款id'), +('mall4cloud-refund-275','1','1000','退款id'), +('mall4cloud-refund-276','1','1000','退款id'), +('mall4cloud-refund-277','1','1000','退款id'), +('mall4cloud-refund-278','1','1000','退款id'), +('mall4cloud-refund-279','1','1000','退款id'), +('mall4cloud-refund-280','1','1000','退款id'), +('mall4cloud-refund-281','1','1000','退款id'), +('mall4cloud-refund-282','1','1000','退款id'), +('mall4cloud-refund-283','1','1000','退款id'), +('mall4cloud-refund-284','1','1000','退款id'), +('mall4cloud-refund-285','1','1000','退款id'), +('mall4cloud-refund-286','1','1000','退款id'), +('mall4cloud-refund-287','1','1000','退款id'), +('mall4cloud-refund-288','1','1000','退款id'), +('mall4cloud-refund-289','1','1000','退款id'), +('mall4cloud-refund-290','1','1000','退款id'), +('mall4cloud-refund-291','1','1000','退款id'), +('mall4cloud-refund-292','1','1000','退款id'), +('mall4cloud-refund-293','1','1000','退款id'), +('mall4cloud-refund-294','1','1000','退款id'), +('mall4cloud-refund-295','1','1000','退款id'), +('mall4cloud-refund-296','1','1000','退款id'), +('mall4cloud-refund-297','1','1000','退款id'), +('mall4cloud-refund-298','1','1000','退款id'), +('mall4cloud-refund-299','1','1000','退款id'), +('mall4cloud-refund-300','1','1000','退款id'), +('mall4cloud-refund-301','1','1000','退款id'), +('mall4cloud-refund-302','1','1000','退款id'), +('mall4cloud-refund-303','1','1000','退款id'), +('mall4cloud-refund-304','1','1000','退款id'), +('mall4cloud-refund-305','1','1000','退款id'), +('mall4cloud-refund-306','1','1000','退款id'), +('mall4cloud-refund-307','1','1000','退款id'), +('mall4cloud-refund-308','1','1000','退款id'), +('mall4cloud-refund-309','1','1000','退款id'), +('mall4cloud-refund-310','1','1000','退款id'), +('mall4cloud-refund-311','1','1000','退款id'), +('mall4cloud-refund-312','1','1000','退款id'), +('mall4cloud-refund-313','1','1000','退款id'), +('mall4cloud-refund-314','1','1000','退款id'), +('mall4cloud-refund-315','1','1000','退款id'), +('mall4cloud-refund-316','1','1000','退款id'), +('mall4cloud-refund-317','1','1000','退款id'), +('mall4cloud-refund-318','1','1000','退款id'), +('mall4cloud-refund-319','1','1000','退款id'), +('mall4cloud-refund-320','1','1000','退款id'), +('mall4cloud-refund-321','1','1000','退款id'), +('mall4cloud-refund-322','1','1000','退款id'), +('mall4cloud-refund-323','1','1000','退款id'), +('mall4cloud-refund-324','1','1000','退款id'), +('mall4cloud-refund-325','1','1000','退款id'), +('mall4cloud-refund-326','1','1000','退款id'), +('mall4cloud-refund-327','1','1000','退款id'), +('mall4cloud-refund-328','1','1000','退款id'), +('mall4cloud-refund-329','1','1000','退款id'), +('mall4cloud-refund-330','1','1000','退款id'), +('mall4cloud-refund-331','1','1000','退款id'), +('mall4cloud-refund-332','1','1000','退款id'), +('mall4cloud-refund-333','1','1000','退款id'), +('mall4cloud-refund-334','1','1000','退款id'), +('mall4cloud-refund-335','1','1000','退款id'), +('mall4cloud-refund-336','1','1000','退款id'), +('mall4cloud-refund-337','1','1000','退款id'), +('mall4cloud-refund-338','1','1000','退款id'), +('mall4cloud-refund-339','1','1000','退款id'), +('mall4cloud-refund-340','1','1000','退款id'), +('mall4cloud-refund-341','1','1000','退款id'), +('mall4cloud-refund-342','1','1000','退款id'), +('mall4cloud-refund-343','1','1000','退款id'), +('mall4cloud-refund-344','1','1000','退款id'), +('mall4cloud-refund-345','1','1000','退款id'), +('mall4cloud-refund-346','1','1000','退款id'), +('mall4cloud-refund-347','1','1000','退款id'), +('mall4cloud-refund-348','1','1000','退款id'), +('mall4cloud-refund-349','1','1000','退款id'), +('mall4cloud-refund-350','1','1000','退款id'), +('mall4cloud-refund-351','1','1000','退款id'), +('mall4cloud-refund-352','1','1000','退款id'), +('mall4cloud-refund-353','1','1000','退款id'), +('mall4cloud-refund-354','1','1000','退款id'), +('mall4cloud-refund-355','1','1000','退款id'), +('mall4cloud-refund-356','1','1000','退款id'), +('mall4cloud-refund-357','1','1000','退款id'), +('mall4cloud-refund-358','1','1000','退款id'), +('mall4cloud-refund-359','1','1000','退款id'), +('mall4cloud-refund-360','1','1000','退款id'), +('mall4cloud-refund-361','1','1000','退款id'), +('mall4cloud-refund-362','1','1000','退款id'), +('mall4cloud-refund-363','1','1000','退款id'), +('mall4cloud-refund-364','1','1000','退款id'), +('mall4cloud-refund-365','1','1000','退款id'), +('mall4cloud-refund-366','1','1000','退款id'), +('mall4cloud-refund-367','1','1000','退款id'), +('mall4cloud-refund-368','1','1000','退款id'), +('mall4cloud-refund-369','1','1000','退款id'), +('mall4cloud-refund-370','1','1000','退款id'), +('mall4cloud-refund-371','1','1000','退款id'), +('mall4cloud-refund-372','1','1000','退款id'), +('mall4cloud-refund-373','1','1000','退款id'), +('mall4cloud-refund-374','1','1000','退款id'), +('mall4cloud-refund-375','1','1000','退款id'), +('mall4cloud-refund-376','1','1000','退款id'), +('mall4cloud-refund-377','1','1000','退款id'), +('mall4cloud-refund-378','1','1000','退款id'), +('mall4cloud-refund-379','1','1000','退款id'), +('mall4cloud-refund-380','1','1000','退款id'), +('mall4cloud-refund-381','1','1000','退款id'), +('mall4cloud-refund-382','1','1000','退款id'), +('mall4cloud-refund-383','1','1000','退款id'), +('mall4cloud-refund-384','1','1000','退款id'), +('mall4cloud-refund-385','1','1000','退款id'), +('mall4cloud-refund-386','1','1000','退款id'), +('mall4cloud-refund-387','1','1000','退款id'), +('mall4cloud-refund-388','1','1000','退款id'), +('mall4cloud-refund-389','1','1000','退款id'), +('mall4cloud-refund-390','1','1000','退款id'), +('mall4cloud-refund-391','1','1000','退款id'), +('mall4cloud-refund-392','1','1000','退款id'), +('mall4cloud-refund-393','1','1000','退款id'), +('mall4cloud-refund-394','1','1000','退款id'), +('mall4cloud-refund-395','1','1000','退款id'), +('mall4cloud-refund-396','1','1000','退款id'), +('mall4cloud-refund-397','1','1000','退款id'), +('mall4cloud-refund-398','1','1000','退款id'), +('mall4cloud-refund-399','1','1000','退款id'), +('mall4cloud-refund-400','1','1000','退款id'), +('mall4cloud-refund-401','1','1000','退款id'), +('mall4cloud-refund-402','1','1000','退款id'), +('mall4cloud-refund-403','1','1000','退款id'), +('mall4cloud-refund-404','1','1000','退款id'), +('mall4cloud-refund-405','1','1000','退款id'), +('mall4cloud-refund-406','1','1000','退款id'), +('mall4cloud-refund-407','1','1000','退款id'), +('mall4cloud-refund-408','1','1000','退款id'), +('mall4cloud-refund-409','1','1000','退款id'), +('mall4cloud-refund-410','1','1000','退款id'), +('mall4cloud-refund-411','1','1000','退款id'), +('mall4cloud-refund-412','1','1000','退款id'), +('mall4cloud-refund-413','1','1000','退款id'), +('mall4cloud-refund-414','1','1000','退款id'), +('mall4cloud-refund-415','1','1000','退款id'), +('mall4cloud-refund-416','1','1000','退款id'), +('mall4cloud-refund-417','1','1000','退款id'), +('mall4cloud-refund-418','1','1000','退款id'), +('mall4cloud-refund-419','1','1000','退款id'), +('mall4cloud-refund-420','1','1000','退款id'), +('mall4cloud-refund-421','1','1000','退款id'), +('mall4cloud-refund-422','1','1000','退款id'), +('mall4cloud-refund-423','1','1000','退款id'), +('mall4cloud-refund-424','1','1000','退款id'), +('mall4cloud-refund-425','1','1000','退款id'), +('mall4cloud-refund-426','1','1000','退款id'), +('mall4cloud-refund-427','1','1000','退款id'), +('mall4cloud-refund-428','1','1000','退款id'), +('mall4cloud-refund-429','1','1000','退款id'), +('mall4cloud-refund-430','1','1000','退款id'), +('mall4cloud-refund-431','1','1000','退款id'), +('mall4cloud-refund-432','1','1000','退款id'), +('mall4cloud-refund-433','1','1000','退款id'), +('mall4cloud-refund-434','1','1000','退款id'), +('mall4cloud-refund-435','1','1000','退款id'), +('mall4cloud-refund-436','1','1000','退款id'), +('mall4cloud-refund-437','1','1000','退款id'), +('mall4cloud-refund-438','1','1000','退款id'), +('mall4cloud-refund-439','1','1000','退款id'), +('mall4cloud-refund-440','1','1000','退款id'), +('mall4cloud-refund-441','1','1000','退款id'), +('mall4cloud-refund-442','1','1000','退款id'), +('mall4cloud-refund-443','1','1000','退款id'), +('mall4cloud-refund-444','1','1000','退款id'), +('mall4cloud-refund-445','1','1000','退款id'), +('mall4cloud-refund-446','1','1000','退款id'), +('mall4cloud-refund-447','1','1000','退款id'), +('mall4cloud-refund-448','1','1000','退款id'), +('mall4cloud-refund-449','1','1000','退款id'), +('mall4cloud-refund-450','1','1000','退款id'), +('mall4cloud-refund-451','1','1000','退款id'), +('mall4cloud-refund-452','1','1000','退款id'), +('mall4cloud-refund-453','1','1000','退款id'), +('mall4cloud-refund-454','1','1000','退款id'), +('mall4cloud-refund-455','1','1000','退款id'), +('mall4cloud-refund-456','1','1000','退款id'), +('mall4cloud-refund-457','1','1000','退款id'), +('mall4cloud-refund-458','1','1000','退款id'), +('mall4cloud-refund-459','1','1000','退款id'), +('mall4cloud-refund-460','1','1000','退款id'), +('mall4cloud-refund-461','1','1000','退款id'), +('mall4cloud-refund-462','1','1000','退款id'), +('mall4cloud-refund-463','1','1000','退款id'), +('mall4cloud-refund-464','1','1000','退款id'), +('mall4cloud-refund-465','1','1000','退款id'), +('mall4cloud-refund-466','1','1000','退款id'), +('mall4cloud-refund-467','1','1000','退款id'), +('mall4cloud-refund-468','1','1000','退款id'), +('mall4cloud-refund-469','1','1000','退款id'), +('mall4cloud-refund-470','1','1000','退款id'), +('mall4cloud-refund-471','1','1000','退款id'), +('mall4cloud-refund-472','1','1000','退款id'), +('mall4cloud-refund-473','1','1000','退款id'), +('mall4cloud-refund-474','1','1000','退款id'), +('mall4cloud-refund-475','1','1000','退款id'), +('mall4cloud-refund-476','1','1000','退款id'), +('mall4cloud-refund-477','1','1000','退款id'), +('mall4cloud-refund-478','1','1000','退款id'), +('mall4cloud-refund-479','1','1000','退款id'), +('mall4cloud-refund-480','1','1000','退款id'), +('mall4cloud-refund-481','1','1000','退款id'), +('mall4cloud-refund-482','1','1000','退款id'), +('mall4cloud-refund-483','1','1000','退款id'), +('mall4cloud-refund-484','1','1000','退款id'), +('mall4cloud-refund-485','1','1000','退款id'), +('mall4cloud-refund-486','1','1000','退款id'), +('mall4cloud-refund-487','1','1000','退款id'), +('mall4cloud-refund-488','1','1000','退款id'), +('mall4cloud-refund-489','1','1000','退款id'), +('mall4cloud-refund-490','1','1000','退款id'), +('mall4cloud-refund-491','1','1000','退款id'), +('mall4cloud-refund-492','1','1000','退款id'), +('mall4cloud-refund-493','1','1000','退款id'), +('mall4cloud-refund-494','1','1000','退款id'), +('mall4cloud-refund-495','1','1000','退款id'), +('mall4cloud-refund-496','1','1000','退款id'), +('mall4cloud-refund-497','1','1000','退款id'), +('mall4cloud-refund-498','1','1000','退款id'), +('mall4cloud-refund-499','1','1000','退款id'), +('mall4cloud-refund-500','1','1000','退款id'), +('mall4cloud-refund-501','1','1000','退款id'), +('mall4cloud-refund-502','1','1000','退款id'), +('mall4cloud-refund-503','1','1000','退款id'), +('mall4cloud-refund-504','1','1000','退款id'), +('mall4cloud-refund-505','1','1000','退款id'), +('mall4cloud-refund-506','1','1000','退款id'), +('mall4cloud-refund-507','1','1000','退款id'), +('mall4cloud-refund-508','1','1000','退款id'), +('mall4cloud-refund-509','1','1000','退款id'), +('mall4cloud-refund-510','1','1000','退款id'), +('mall4cloud-refund-511','1','1000','退款id'), +('mall4cloud-refund-512','1','1000','退款id'), +('mall4cloud-refund-513','1','1000','退款id'), +('mall4cloud-refund-514','1','1000','退款id'), +('mall4cloud-refund-515','1','1000','退款id'), +('mall4cloud-refund-516','1','1000','退款id'), +('mall4cloud-refund-517','1','1000','退款id'), +('mall4cloud-refund-518','1','1000','退款id'), +('mall4cloud-refund-519','1','1000','退款id'), +('mall4cloud-refund-520','1','1000','退款id'), +('mall4cloud-refund-521','1','1000','退款id'), +('mall4cloud-refund-522','1','1000','退款id'), +('mall4cloud-refund-523','1','1000','退款id'), +('mall4cloud-refund-524','1','1000','退款id'), +('mall4cloud-refund-525','1','1000','退款id'), +('mall4cloud-refund-526','1','1000','退款id'), +('mall4cloud-refund-527','1','1000','退款id'), +('mall4cloud-refund-528','1','1000','退款id'), +('mall4cloud-refund-529','1','1000','退款id'), +('mall4cloud-refund-530','1','1000','退款id'), +('mall4cloud-refund-531','1','1000','退款id'), +('mall4cloud-refund-532','1','1000','退款id'), +('mall4cloud-refund-533','1','1000','退款id'), +('mall4cloud-refund-534','1','1000','退款id'), +('mall4cloud-refund-535','1','1000','退款id'), +('mall4cloud-refund-536','1','1000','退款id'), +('mall4cloud-refund-537','1','1000','退款id'), +('mall4cloud-refund-538','1','1000','退款id'), +('mall4cloud-refund-539','1','1000','退款id'), +('mall4cloud-refund-540','1','1000','退款id'), +('mall4cloud-refund-541','1','1000','退款id'), +('mall4cloud-refund-542','1','1000','退款id'), +('mall4cloud-refund-543','1','1000','退款id'), +('mall4cloud-refund-544','1','1000','退款id'), +('mall4cloud-refund-545','1','1000','退款id'), +('mall4cloud-refund-546','1','1000','退款id'), +('mall4cloud-refund-547','1','1000','退款id'), +('mall4cloud-refund-548','1','1000','退款id'), +('mall4cloud-refund-549','1','1000','退款id'), +('mall4cloud-refund-550','1','1000','退款id'), +('mall4cloud-refund-551','1','1000','退款id'), +('mall4cloud-refund-552','1','1000','退款id'), +('mall4cloud-refund-553','1','1000','退款id'), +('mall4cloud-refund-554','1','1000','退款id'), +('mall4cloud-refund-555','1','1000','退款id'), +('mall4cloud-refund-556','1','1000','退款id'), +('mall4cloud-refund-557','1','1000','退款id'), +('mall4cloud-refund-558','1','1000','退款id'), +('mall4cloud-refund-559','1','1000','退款id'), +('mall4cloud-refund-560','1','1000','退款id'), +('mall4cloud-refund-561','1','1000','退款id'), +('mall4cloud-refund-562','1','1000','退款id'), +('mall4cloud-refund-563','1','1000','退款id'), +('mall4cloud-refund-564','1','1000','退款id'), +('mall4cloud-refund-565','1','1000','退款id'), +('mall4cloud-refund-566','1','1000','退款id'), +('mall4cloud-refund-567','1','1000','退款id'), +('mall4cloud-refund-568','1','1000','退款id'), +('mall4cloud-refund-569','1','1000','退款id'), +('mall4cloud-refund-570','1','1000','退款id'), +('mall4cloud-refund-571','1','1000','退款id'), +('mall4cloud-refund-572','1','1000','退款id'), +('mall4cloud-refund-573','1','1000','退款id'), +('mall4cloud-refund-574','1','1000','退款id'), +('mall4cloud-refund-575','1','1000','退款id'), +('mall4cloud-refund-576','1','1000','退款id'), +('mall4cloud-refund-577','1','1000','退款id'), +('mall4cloud-refund-578','1','1000','退款id'), +('mall4cloud-refund-579','1','1000','退款id'), +('mall4cloud-refund-580','1','1000','退款id'), +('mall4cloud-refund-581','1','1000','退款id'), +('mall4cloud-refund-582','1','1000','退款id'), +('mall4cloud-refund-583','1','1000','退款id'), +('mall4cloud-refund-584','1','1000','退款id'), +('mall4cloud-refund-585','1','1000','退款id'), +('mall4cloud-refund-586','1','1000','退款id'), +('mall4cloud-refund-587','1','1000','退款id'), +('mall4cloud-refund-588','1','1000','退款id'), +('mall4cloud-refund-589','1','1000','退款id'), +('mall4cloud-refund-590','1','1000','退款id'), +('mall4cloud-refund-591','1','1000','退款id'), +('mall4cloud-refund-592','1','1000','退款id'), +('mall4cloud-refund-593','1','1000','退款id'), +('mall4cloud-refund-594','1','1000','退款id'), +('mall4cloud-refund-595','1','1000','退款id'), +('mall4cloud-refund-596','1','1000','退款id'), +('mall4cloud-refund-597','1','1000','退款id'), +('mall4cloud-refund-598','1','1000','退款id'), +('mall4cloud-refund-599','1','1000','退款id'), +('mall4cloud-refund-600','1','1000','退款id'), +('mall4cloud-refund-601','1','1000','退款id'), +('mall4cloud-refund-602','1','1000','退款id'), +('mall4cloud-refund-603','1','1000','退款id'), +('mall4cloud-refund-604','1','1000','退款id'), +('mall4cloud-refund-605','1','1000','退款id'), +('mall4cloud-refund-606','1','1000','退款id'), +('mall4cloud-refund-607','1','1000','退款id'), +('mall4cloud-refund-608','1','1000','退款id'), +('mall4cloud-refund-609','1','1000','退款id'), +('mall4cloud-refund-610','1','1000','退款id'), +('mall4cloud-refund-611','1','1000','退款id'), +('mall4cloud-refund-612','1','1000','退款id'), +('mall4cloud-refund-613','1','1000','退款id'), +('mall4cloud-refund-614','1','1000','退款id'), +('mall4cloud-refund-615','1','1000','退款id'), +('mall4cloud-refund-616','1','1000','退款id'), +('mall4cloud-refund-617','1','1000','退款id'), +('mall4cloud-refund-618','1','1000','退款id'), +('mall4cloud-refund-619','1','1000','退款id'), +('mall4cloud-refund-620','1','1000','退款id'), +('mall4cloud-refund-621','1','1000','退款id'), +('mall4cloud-refund-622','1','1000','退款id'), +('mall4cloud-refund-623','1','1000','退款id'), +('mall4cloud-refund-624','1','1000','退款id'), +('mall4cloud-refund-625','1','1000','退款id'), +('mall4cloud-refund-626','1','1000','退款id'), +('mall4cloud-refund-627','1','1000','退款id'), +('mall4cloud-refund-628','1','1000','退款id'), +('mall4cloud-refund-629','1','1000','退款id'), +('mall4cloud-refund-630','1','1000','退款id'), +('mall4cloud-refund-631','1','1000','退款id'), +('mall4cloud-refund-632','1','1000','退款id'), +('mall4cloud-refund-633','1','1000','退款id'), +('mall4cloud-refund-634','1','1000','退款id'), +('mall4cloud-refund-635','1','1000','退款id'), +('mall4cloud-refund-636','1','1000','退款id'), +('mall4cloud-refund-637','1','1000','退款id'), +('mall4cloud-refund-638','1','1000','退款id'), +('mall4cloud-refund-639','1','1000','退款id'), +('mall4cloud-refund-640','1','1000','退款id'), +('mall4cloud-refund-641','1','1000','退款id'), +('mall4cloud-refund-642','1','1000','退款id'), +('mall4cloud-refund-643','1','1000','退款id'), +('mall4cloud-refund-644','1','1000','退款id'), +('mall4cloud-refund-645','1','1000','退款id'), +('mall4cloud-refund-646','1','1000','退款id'), +('mall4cloud-refund-647','1','1000','退款id'), +('mall4cloud-refund-648','1','1000','退款id'), +('mall4cloud-refund-649','1','1000','退款id'), +('mall4cloud-refund-650','1','1000','退款id'), +('mall4cloud-refund-651','1','1000','退款id'), +('mall4cloud-refund-652','1','1000','退款id'), +('mall4cloud-refund-653','1','1000','退款id'), +('mall4cloud-refund-654','1','1000','退款id'), +('mall4cloud-refund-655','1','1000','退款id'), +('mall4cloud-refund-656','1','1000','退款id'), +('mall4cloud-refund-657','1','1000','退款id'), +('mall4cloud-refund-658','1','1000','退款id'), +('mall4cloud-refund-659','1','1000','退款id'), +('mall4cloud-refund-660','1','1000','退款id'), +('mall4cloud-refund-661','1','1000','退款id'), +('mall4cloud-refund-662','1','1000','退款id'), +('mall4cloud-refund-663','1','1000','退款id'), +('mall4cloud-refund-664','1','1000','退款id'), +('mall4cloud-refund-665','1','1000','退款id'), +('mall4cloud-refund-666','1','1000','退款id'), +('mall4cloud-refund-667','1','1000','退款id'), +('mall4cloud-refund-668','1','1000','退款id'), +('mall4cloud-refund-669','1','1000','退款id'), +('mall4cloud-refund-670','1','1000','退款id'), +('mall4cloud-refund-671','1','1000','退款id'), +('mall4cloud-refund-672','1','1000','退款id'), +('mall4cloud-refund-673','1','1000','退款id'), +('mall4cloud-refund-674','1','1000','退款id'), +('mall4cloud-refund-675','1','1000','退款id'), +('mall4cloud-refund-676','1','1000','退款id'), +('mall4cloud-refund-677','1','1000','退款id'), +('mall4cloud-refund-678','1','1000','退款id'), +('mall4cloud-refund-679','1','1000','退款id'), +('mall4cloud-refund-680','1','1000','退款id'), +('mall4cloud-refund-681','1','1000','退款id'), +('mall4cloud-refund-682','1','1000','退款id'), +('mall4cloud-refund-683','1','1000','退款id'), +('mall4cloud-refund-684','1','1000','退款id'), +('mall4cloud-refund-685','1','1000','退款id'), +('mall4cloud-refund-686','1','1000','退款id'), +('mall4cloud-refund-687','1','1000','退款id'), +('mall4cloud-refund-688','1','1000','退款id'), +('mall4cloud-refund-689','1','1000','退款id'), +('mall4cloud-refund-690','1','1000','退款id'), +('mall4cloud-refund-691','1','1000','退款id'), +('mall4cloud-refund-692','1','1000','退款id'), +('mall4cloud-refund-693','1','1000','退款id'), +('mall4cloud-refund-694','1','1000','退款id'), +('mall4cloud-refund-695','1','1000','退款id'), +('mall4cloud-refund-696','1','1000','退款id'), +('mall4cloud-refund-697','1','1000','退款id'), +('mall4cloud-refund-698','1','1000','退款id'), +('mall4cloud-refund-699','1','1000','退款id'), +('mall4cloud-refund-700','1','1000','退款id'), +('mall4cloud-refund-701','1','1000','退款id'), +('mall4cloud-refund-702','1','1000','退款id'), +('mall4cloud-refund-703','1','1000','退款id'), +('mall4cloud-refund-704','1','1000','退款id'), +('mall4cloud-refund-705','1','1000','退款id'), +('mall4cloud-refund-706','1','1000','退款id'), +('mall4cloud-refund-707','1','1000','退款id'), +('mall4cloud-refund-708','1','1000','退款id'), +('mall4cloud-refund-709','1','1000','退款id'), +('mall4cloud-refund-710','1','1000','退款id'), +('mall4cloud-refund-711','1','1000','退款id'), +('mall4cloud-refund-712','1','1000','退款id'), +('mall4cloud-refund-713','1','1000','退款id'), +('mall4cloud-refund-714','1','1000','退款id'), +('mall4cloud-refund-715','1','1000','退款id'), +('mall4cloud-refund-716','1','1000','退款id'), +('mall4cloud-refund-717','1','1000','退款id'), +('mall4cloud-refund-718','1','1000','退款id'), +('mall4cloud-refund-719','1','1000','退款id'), +('mall4cloud-refund-720','1','1000','退款id'), +('mall4cloud-refund-721','1','1000','退款id'), +('mall4cloud-refund-722','1','1000','退款id'), +('mall4cloud-refund-723','1','1000','退款id'), +('mall4cloud-refund-724','1','1000','退款id'), +('mall4cloud-refund-725','1','1000','退款id'), +('mall4cloud-refund-726','1','1000','退款id'), +('mall4cloud-refund-727','1','1000','退款id'), +('mall4cloud-refund-728','1','1000','退款id'), +('mall4cloud-refund-729','1','1000','退款id'), +('mall4cloud-refund-730','1','1000','退款id'), +('mall4cloud-refund-731','1','1000','退款id'), +('mall4cloud-refund-732','1','1000','退款id'), +('mall4cloud-refund-733','1','1000','退款id'), +('mall4cloud-refund-734','1','1000','退款id'), +('mall4cloud-refund-735','1','1000','退款id'), +('mall4cloud-refund-736','1','1000','退款id'), +('mall4cloud-refund-737','1','1000','退款id'), +('mall4cloud-refund-738','1','1000','退款id'), +('mall4cloud-refund-739','1','1000','退款id'), +('mall4cloud-refund-740','1','1000','退款id'), +('mall4cloud-refund-741','1','1000','退款id'), +('mall4cloud-refund-742','1','1000','退款id'), +('mall4cloud-refund-743','1','1000','退款id'), +('mall4cloud-refund-744','1','1000','退款id'), +('mall4cloud-refund-745','1','1000','退款id'), +('mall4cloud-refund-746','1','1000','退款id'), +('mall4cloud-refund-747','1','1000','退款id'), +('mall4cloud-refund-748','1','1000','退款id'), +('mall4cloud-refund-749','1','1000','退款id'), +('mall4cloud-refund-750','1','1000','退款id'), +('mall4cloud-refund-751','1','1000','退款id'), +('mall4cloud-refund-752','1','1000','退款id'), +('mall4cloud-refund-753','1','1000','退款id'), +('mall4cloud-refund-754','1','1000','退款id'), +('mall4cloud-refund-755','1','1000','退款id'), +('mall4cloud-refund-756','1','1000','退款id'), +('mall4cloud-refund-757','1','1000','退款id'), +('mall4cloud-refund-758','1','1000','退款id'), +('mall4cloud-refund-759','1','1000','退款id'), +('mall4cloud-refund-760','1','1000','退款id'), +('mall4cloud-refund-761','1','1000','退款id'), +('mall4cloud-refund-762','1','1000','退款id'), +('mall4cloud-refund-763','1','1000','退款id'), +('mall4cloud-refund-764','1','1000','退款id'), +('mall4cloud-refund-765','1','1000','退款id'), +('mall4cloud-refund-766','1','1000','退款id'), +('mall4cloud-refund-767','1','1000','退款id'), +('mall4cloud-refund-768','1','1000','退款id'), +('mall4cloud-refund-769','1','1000','退款id'), +('mall4cloud-refund-770','1','1000','退款id'), +('mall4cloud-refund-771','1','1000','退款id'), +('mall4cloud-refund-772','1','1000','退款id'), +('mall4cloud-refund-773','1','1000','退款id'), +('mall4cloud-refund-774','1','1000','退款id'), +('mall4cloud-refund-775','1','1000','退款id'), +('mall4cloud-refund-776','1','1000','退款id'), +('mall4cloud-refund-777','1','1000','退款id'), +('mall4cloud-refund-778','1','1000','退款id'), +('mall4cloud-refund-779','1','1000','退款id'), +('mall4cloud-refund-780','1','1000','退款id'), +('mall4cloud-refund-781','1','1000','退款id'), +('mall4cloud-refund-782','1','1000','退款id'), +('mall4cloud-refund-783','1','1000','退款id'), +('mall4cloud-refund-784','1','1000','退款id'), +('mall4cloud-refund-785','1','1000','退款id'), +('mall4cloud-refund-786','1','1000','退款id'), +('mall4cloud-refund-787','1','1000','退款id'), +('mall4cloud-refund-788','1','1000','退款id'), +('mall4cloud-refund-789','1','1000','退款id'), +('mall4cloud-refund-790','1','1000','退款id'), +('mall4cloud-refund-791','1','1000','退款id'), +('mall4cloud-refund-792','1','1000','退款id'), +('mall4cloud-refund-793','1','1000','退款id'), +('mall4cloud-refund-794','1','1000','退款id'), +('mall4cloud-refund-795','1','1000','退款id'), +('mall4cloud-refund-796','1','1000','退款id'), +('mall4cloud-refund-797','1','1000','退款id'), +('mall4cloud-refund-798','1','1000','退款id'), +('mall4cloud-refund-799','1','1000','退款id'), +('mall4cloud-refund-800','1','1000','退款id'), +('mall4cloud-refund-801','1','1000','退款id'), +('mall4cloud-refund-802','1','1000','退款id'), +('mall4cloud-refund-803','1','1000','退款id'), +('mall4cloud-refund-804','1','1000','退款id'), +('mall4cloud-refund-805','1','1000','退款id'), +('mall4cloud-refund-806','1','1000','退款id'), +('mall4cloud-refund-807','1','1000','退款id'), +('mall4cloud-refund-808','1','1000','退款id'), +('mall4cloud-refund-809','1','1000','退款id'), +('mall4cloud-refund-810','1','1000','退款id'), +('mall4cloud-refund-811','1','1000','退款id'), +('mall4cloud-refund-812','1','1000','退款id'), +('mall4cloud-refund-813','1','1000','退款id'), +('mall4cloud-refund-814','1','1000','退款id'), +('mall4cloud-refund-815','1','1000','退款id'), +('mall4cloud-refund-816','1','1000','退款id'), +('mall4cloud-refund-817','1','1000','退款id'), +('mall4cloud-refund-818','1','1000','退款id'), +('mall4cloud-refund-819','1','1000','退款id'), +('mall4cloud-refund-820','1','1000','退款id'), +('mall4cloud-refund-821','1','1000','退款id'), +('mall4cloud-refund-822','1','1000','退款id'), +('mall4cloud-refund-823','1','1000','退款id'), +('mall4cloud-refund-824','1','1000','退款id'), +('mall4cloud-refund-825','1','1000','退款id'), +('mall4cloud-refund-826','1','1000','退款id'), +('mall4cloud-refund-827','1','1000','退款id'), +('mall4cloud-refund-828','1','1000','退款id'), +('mall4cloud-refund-829','1','1000','退款id'), +('mall4cloud-refund-830','1','1000','退款id'), +('mall4cloud-refund-831','1','1000','退款id'), +('mall4cloud-refund-832','1','1000','退款id'), +('mall4cloud-refund-833','1','1000','退款id'), +('mall4cloud-refund-834','1','1000','退款id'), +('mall4cloud-refund-835','1','1000','退款id'), +('mall4cloud-refund-836','1','1000','退款id'), +('mall4cloud-refund-837','1','1000','退款id'), +('mall4cloud-refund-838','1','1000','退款id'), +('mall4cloud-refund-839','1','1000','退款id'), +('mall4cloud-refund-840','1','1000','退款id'), +('mall4cloud-refund-841','1','1000','退款id'), +('mall4cloud-refund-842','1','1000','退款id'), +('mall4cloud-refund-843','1','1000','退款id'), +('mall4cloud-refund-844','1','1000','退款id'), +('mall4cloud-refund-845','1','1000','退款id'), +('mall4cloud-refund-846','1','1000','退款id'), +('mall4cloud-refund-847','1','1000','退款id'), +('mall4cloud-refund-848','1','1000','退款id'), +('mall4cloud-refund-849','1','1000','退款id'), +('mall4cloud-refund-850','1','1000','退款id'), +('mall4cloud-refund-851','1','1000','退款id'), +('mall4cloud-refund-852','1','1000','退款id'), +('mall4cloud-refund-853','1','1000','退款id'), +('mall4cloud-refund-854','1','1000','退款id'), +('mall4cloud-refund-855','1','1000','退款id'), +('mall4cloud-refund-856','1','1000','退款id'), +('mall4cloud-refund-857','1','1000','退款id'), +('mall4cloud-refund-858','1','1000','退款id'), +('mall4cloud-refund-859','1','1000','退款id'), +('mall4cloud-refund-860','1','1000','退款id'), +('mall4cloud-refund-861','1','1000','退款id'), +('mall4cloud-refund-862','1','1000','退款id'), +('mall4cloud-refund-863','1','1000','退款id'), +('mall4cloud-refund-864','1','1000','退款id'), +('mall4cloud-refund-865','1','1000','退款id'), +('mall4cloud-refund-866','1','1000','退款id'), +('mall4cloud-refund-867','1','1000','退款id'), +('mall4cloud-refund-868','1','1000','退款id'), +('mall4cloud-refund-869','1','1000','退款id'), +('mall4cloud-refund-870','1','1000','退款id'), +('mall4cloud-refund-871','1','1000','退款id'), +('mall4cloud-refund-872','1','1000','退款id'), +('mall4cloud-refund-873','1','1000','退款id'), +('mall4cloud-refund-874','1','1000','退款id'), +('mall4cloud-refund-875','1','1000','退款id'), +('mall4cloud-refund-876','1','1000','退款id'), +('mall4cloud-refund-877','1','1000','退款id'), +('mall4cloud-refund-878','1','1000','退款id'), +('mall4cloud-refund-879','1','1000','退款id'), +('mall4cloud-refund-880','1','1000','退款id'), +('mall4cloud-refund-881','1','1000','退款id'), +('mall4cloud-refund-882','1','1000','退款id'), +('mall4cloud-refund-883','1','1000','退款id'), +('mall4cloud-refund-884','1','1000','退款id'), +('mall4cloud-refund-885','1','1000','退款id'), +('mall4cloud-refund-886','1','1000','退款id'), +('mall4cloud-refund-887','1','1000','退款id'), +('mall4cloud-refund-888','1','1000','退款id'), +('mall4cloud-refund-889','1','1000','退款id'), +('mall4cloud-refund-890','1','1000','退款id'), +('mall4cloud-refund-891','1','1000','退款id'), +('mall4cloud-refund-892','1','1000','退款id'), +('mall4cloud-refund-893','1','1000','退款id'), +('mall4cloud-refund-894','1','1000','退款id'), +('mall4cloud-refund-895','1','1000','退款id'), +('mall4cloud-refund-896','1','1000','退款id'), +('mall4cloud-refund-897','1','1000','退款id'), +('mall4cloud-refund-898','1','1000','退款id'), +('mall4cloud-refund-899','1','1000','退款id'), +('mall4cloud-refund-900','1','1000','退款id'), +('mall4cloud-refund-901','1','1000','退款id'), +('mall4cloud-refund-902','1','1000','退款id'), +('mall4cloud-refund-903','1','1000','退款id'), +('mall4cloud-refund-904','1','1000','退款id'), +('mall4cloud-refund-905','1','1000','退款id'), +('mall4cloud-refund-906','1','1000','退款id'), +('mall4cloud-refund-907','1','1000','退款id'), +('mall4cloud-refund-908','1','1000','退款id'), +('mall4cloud-refund-909','1','1000','退款id'), +('mall4cloud-refund-910','1','1000','退款id'), +('mall4cloud-refund-911','1','1000','退款id'), +('mall4cloud-refund-912','1','1000','退款id'), +('mall4cloud-refund-913','1','1000','退款id'), +('mall4cloud-refund-914','1','1000','退款id'), +('mall4cloud-refund-915','1','1000','退款id'), +('mall4cloud-refund-916','1','1000','退款id'), +('mall4cloud-refund-917','1','1000','退款id'), +('mall4cloud-refund-918','1','1000','退款id'), +('mall4cloud-refund-919','1','1000','退款id'), +('mall4cloud-refund-920','1','1000','退款id'), +('mall4cloud-refund-921','1','1000','退款id'), +('mall4cloud-refund-922','1','1000','退款id'), +('mall4cloud-refund-923','1','1000','退款id'), +('mall4cloud-refund-924','1','1000','退款id'), +('mall4cloud-refund-925','1','1000','退款id'), +('mall4cloud-refund-926','1','1000','退款id'), +('mall4cloud-refund-927','1','1000','退款id'), +('mall4cloud-refund-928','1','1000','退款id'), +('mall4cloud-refund-929','1','1000','退款id'), +('mall4cloud-refund-930','1','1000','退款id'), +('mall4cloud-refund-931','1','1000','退款id'), +('mall4cloud-refund-932','1','1000','退款id'), +('mall4cloud-refund-933','1','1000','退款id'), +('mall4cloud-refund-934','1','1000','退款id'), +('mall4cloud-refund-935','1','1000','退款id'), +('mall4cloud-refund-936','1','1000','退款id'), +('mall4cloud-refund-937','1','1000','退款id'), +('mall4cloud-refund-938','1','1000','退款id'), +('mall4cloud-refund-939','1','1000','退款id'), +('mall4cloud-refund-940','1','1000','退款id'), +('mall4cloud-refund-941','1','1000','退款id'), +('mall4cloud-refund-942','1','1000','退款id'), +('mall4cloud-refund-943','1','1000','退款id'), +('mall4cloud-refund-944','1','1000','退款id'), +('mall4cloud-refund-945','1','1000','退款id'), +('mall4cloud-refund-946','1','1000','退款id'), +('mall4cloud-refund-947','1','1000','退款id'), +('mall4cloud-refund-948','1','1000','退款id'), +('mall4cloud-refund-949','1','1000','退款id'), +('mall4cloud-refund-950','1','1000','退款id'), +('mall4cloud-refund-951','1','1000','退款id'), +('mall4cloud-refund-952','1','1000','退款id'), +('mall4cloud-refund-953','1','1000','退款id'), +('mall4cloud-refund-954','1','1000','退款id'), +('mall4cloud-refund-955','1','1000','退款id'), +('mall4cloud-refund-956','1','1000','退款id'), +('mall4cloud-refund-957','1','1000','退款id'), +('mall4cloud-refund-958','1','1000','退款id'), +('mall4cloud-refund-959','1','1000','退款id'), +('mall4cloud-refund-960','1','1000','退款id'), +('mall4cloud-refund-961','1','1000','退款id'), +('mall4cloud-refund-962','1','1000','退款id'), +('mall4cloud-refund-963','1','1000','退款id'), +('mall4cloud-refund-964','1','1000','退款id'), +('mall4cloud-refund-965','1','1000','退款id'), +('mall4cloud-refund-966','1','1000','退款id'), +('mall4cloud-refund-967','1','1000','退款id'), +('mall4cloud-refund-968','1','1000','退款id'), +('mall4cloud-refund-969','1','1000','退款id'), +('mall4cloud-refund-970','1','1000','退款id'), +('mall4cloud-refund-971','1','1000','退款id'), +('mall4cloud-refund-972','1','1000','退款id'), +('mall4cloud-refund-973','1','1000','退款id'), +('mall4cloud-refund-974','1','1000','退款id'), +('mall4cloud-refund-975','1','1000','退款id'), +('mall4cloud-refund-976','1','1000','退款id'), +('mall4cloud-refund-977','1','1000','退款id'), +('mall4cloud-refund-978','1','1000','退款id'), +('mall4cloud-refund-979','1','1000','退款id'), +('mall4cloud-refund-980','1','1000','退款id'), +('mall4cloud-refund-981','1','1000','退款id'), +('mall4cloud-refund-982','1','1000','退款id'), +('mall4cloud-refund-983','1','1000','退款id'), +('mall4cloud-refund-984','1','1000','退款id'), +('mall4cloud-refund-985','1','1000','退款id'), +('mall4cloud-refund-986','1','1000','退款id'), +('mall4cloud-refund-987','1','1000','退款id'), +('mall4cloud-refund-988','1','1000','退款id'), +('mall4cloud-refund-989','1','1000','退款id'), +('mall4cloud-refund-990','1','1000','退款id'), +('mall4cloud-refund-991','1','1000','退款id'), +('mall4cloud-refund-992','1','1000','退款id'), +('mall4cloud-refund-993','1','1000','退款id'), +('mall4cloud-refund-994','1','1000','退款id'), +('mall4cloud-refund-995','1','1000','退款id'), +('mall4cloud-refund-996','1','1000','退款id'), +('mall4cloud-refund-997','1','1000','退款id'), +('mall4cloud-refund-998','1','1000','退款id'), +('mall4cloud-refund-999','1','1000','退款id'), +('mall4cloud-shop-wallet-log','1000000000000','1000','MongoDB中shopWalletLog表的钱包日志id'), +('mall4cloud-station-user','1000000000000','1000','门店端用户id'), +('mall4cloud-stock-bill-log','1000000000000','1000','MongoDB中stockBillLog表中的日志id'), +('mall4cloud-order-virtual-info-log','1000000000000','1000','核销日志id'); + + + + +USE `mall4cloud_product`; +DROP TABLE IF EXISTS `leaf_alloc`; +CREATE TABLE `leaf_alloc` ( + `biz_tag` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '区分业务', + `max_id` bigint unsigned NOT NULL DEFAULT '1' COMMENT '该biz_tag目前所被分配的ID号段的最大值', + `step` int NOT NULL COMMENT '每次分配的号段长度', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + PRIMARY KEY (`biz_tag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +insert into `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) values +('mall4cloud-product-comm','1000000000000','1000','商品评论id'), +('mall4cloud-product-sku-code','1000000000000','1000','sku的编码'), +('mall4cloud-product-stock-in','1000000000000','1000','MongoDB中stockBillLog表的入库单号'), +('mall4cloud-product-stock-out','1000000000000','1000','MongoDB中stockBillLog表的出库单号'), +('mall4cloud-spu','1000000000000','1000','商品id'), +('mall4cloud-spu-browse-log','1000000000000','1000','商品浏览记录id'), +('mall4cloud-stock-bill-log','1000000000000','1000','MongoDB中stockBillLog表的出入库日志id'); + + + + +USE `mall4cloud_seckill`; +DROP TABLE IF EXISTS `leaf_alloc`; +CREATE TABLE `leaf_alloc` ( + `biz_tag` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '区分业务', + `max_id` bigint unsigned NOT NULL DEFAULT '1' COMMENT '该biz_tag目前所被分配的ID号段的最大值', + `step` int NOT NULL COMMENT '每次分配的号段长度', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + PRIMARY KEY (`biz_tag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +insert into `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) values +('mall4cloud-order-000','1','1000','订单id'), +('mall4cloud-order-001','1','1000','订单id'), +('mall4cloud-order-002','1','1000','订单id'), +('mall4cloud-order-003','1','1000','订单id'), +('mall4cloud-order-004','1','1000','订单id'), +('mall4cloud-order-005','1','1000','订单id'), +('mall4cloud-order-006','1','1000','订单id'), +('mall4cloud-order-007','1','1000','订单id'), +('mall4cloud-order-008','1','1000','订单id'), +('mall4cloud-order-009','1','1000','订单id'), +('mall4cloud-order-010','1','1000','订单id'), +('mall4cloud-order-011','1','1000','订单id'), +('mall4cloud-order-012','1','1000','订单id'), +('mall4cloud-order-013','1','1000','订单id'), +('mall4cloud-order-014','1','1000','订单id'), +('mall4cloud-order-015','1','1000','订单id'), +('mall4cloud-order-016','1','1000','订单id'), +('mall4cloud-order-017','1','1000','订单id'), +('mall4cloud-order-018','1','1000','订单id'), +('mall4cloud-order-019','1','1000','订单id'), +('mall4cloud-order-020','1','1000','订单id'), +('mall4cloud-order-021','1','1000','订单id'), +('mall4cloud-order-022','1','1000','订单id'), +('mall4cloud-order-023','1','1000','订单id'), +('mall4cloud-order-024','1','1000','订单id'), +('mall4cloud-order-025','1','1000','订单id'), +('mall4cloud-order-026','1','1000','订单id'), +('mall4cloud-order-027','1','1000','订单id'), +('mall4cloud-order-028','1','1000','订单id'), +('mall4cloud-order-029','1','1000','订单id'), +('mall4cloud-order-030','1','1000','订单id'), +('mall4cloud-order-031','1','1000','订单id'), +('mall4cloud-order-032','1','1000','订单id'), +('mall4cloud-order-033','1','1000','订单id'), +('mall4cloud-order-034','1','1000','订单id'), +('mall4cloud-order-035','1','1000','订单id'), +('mall4cloud-order-036','1','1000','订单id'), +('mall4cloud-order-037','1','1000','订单id'), +('mall4cloud-order-038','1','1000','订单id'), +('mall4cloud-order-039','1','1000','订单id'), +('mall4cloud-order-040','1','1000','订单id'), +('mall4cloud-order-041','1','1000','订单id'), +('mall4cloud-order-042','1','1000','订单id'), +('mall4cloud-order-043','1','1000','订单id'), +('mall4cloud-order-044','1','1000','订单id'), +('mall4cloud-order-045','1','1000','订单id'), +('mall4cloud-order-046','1','1000','订单id'), +('mall4cloud-order-047','1','1000','订单id'), +('mall4cloud-order-048','1','1000','订单id'), +('mall4cloud-order-049','1','1000','订单id'), +('mall4cloud-order-050','1','1000','订单id'), +('mall4cloud-order-051','1','1000','订单id'), +('mall4cloud-order-052','1','1000','订单id'), +('mall4cloud-order-053','1','1000','订单id'), +('mall4cloud-order-054','1','1000','订单id'), +('mall4cloud-order-055','1','1000','订单id'), +('mall4cloud-order-056','1','1000','订单id'), +('mall4cloud-order-057','1','1000','订单id'), +('mall4cloud-order-058','1','1000','订单id'), +('mall4cloud-order-059','1','1000','订单id'), +('mall4cloud-order-060','1','1000','订单id'), +('mall4cloud-order-061','1','1000','订单id'), +('mall4cloud-order-062','1','1000','订单id'), +('mall4cloud-order-063','1','1000','订单id'), +('mall4cloud-order-064','1','1000','订单id'), +('mall4cloud-order-065','1','1000','订单id'), +('mall4cloud-order-066','1','1000','订单id'), +('mall4cloud-order-067','1','1000','订单id'), +('mall4cloud-order-068','1','1000','订单id'), +('mall4cloud-order-069','1','1000','订单id'), +('mall4cloud-order-070','1','1000','订单id'), +('mall4cloud-order-071','1','1000','订单id'), +('mall4cloud-order-072','1','1000','订单id'), +('mall4cloud-order-073','1','1000','订单id'), +('mall4cloud-order-074','1','1000','订单id'), +('mall4cloud-order-075','1','1000','订单id'), +('mall4cloud-order-076','1','1000','订单id'), +('mall4cloud-order-077','1','1000','订单id'), +('mall4cloud-order-078','1','1000','订单id'), +('mall4cloud-order-079','1','1000','订单id'), +('mall4cloud-order-080','1','1000','订单id'), +('mall4cloud-order-081','1','1000','订单id'), +('mall4cloud-order-082','1','1000','订单id'), +('mall4cloud-order-083','1','1000','订单id'), +('mall4cloud-order-084','1','1000','订单id'), +('mall4cloud-order-085','1','1000','订单id'), +('mall4cloud-order-086','1','1000','订单id'), +('mall4cloud-order-087','1','1000','订单id'), +('mall4cloud-order-088','1','1000','订单id'), +('mall4cloud-order-089','1','1000','订单id'), +('mall4cloud-order-090','1','1000','订单id'), +('mall4cloud-order-091','1','1000','订单id'), +('mall4cloud-order-092','1','1000','订单id'), +('mall4cloud-order-093','1','1000','订单id'), +('mall4cloud-order-094','1','1000','订单id'), +('mall4cloud-order-095','1','1000','订单id'), +('mall4cloud-order-096','1','1000','订单id'), +('mall4cloud-order-097','1','1000','订单id'), +('mall4cloud-order-098','1','1000','订单id'), +('mall4cloud-order-099','1','1000','订单id'), +('mall4cloud-order-100','1','1000','订单id'), +('mall4cloud-order-101','1','1000','订单id'), +('mall4cloud-order-102','1','1000','订单id'), +('mall4cloud-order-103','1','1000','订单id'), +('mall4cloud-order-104','1','1000','订单id'), +('mall4cloud-order-105','1','1000','订单id'), +('mall4cloud-order-106','1','1000','订单id'), +('mall4cloud-order-107','1','1000','订单id'), +('mall4cloud-order-108','1','1000','订单id'), +('mall4cloud-order-109','1','1000','订单id'), +('mall4cloud-order-110','1','1000','订单id'), +('mall4cloud-order-111','1','1000','订单id'), +('mall4cloud-order-112','1','1000','订单id'), +('mall4cloud-order-113','1','1000','订单id'), +('mall4cloud-order-114','1','1000','订单id'), +('mall4cloud-order-115','1','1000','订单id'), +('mall4cloud-order-116','1','1000','订单id'), +('mall4cloud-order-117','1','1000','订单id'), +('mall4cloud-order-118','1','1000','订单id'), +('mall4cloud-order-119','1','1000','订单id'), +('mall4cloud-order-120','1','1000','订单id'), +('mall4cloud-order-121','1','1000','订单id'), +('mall4cloud-order-122','1','1000','订单id'), +('mall4cloud-order-123','1','1000','订单id'), +('mall4cloud-order-124','1','1000','订单id'), +('mall4cloud-order-125','1','1000','订单id'), +('mall4cloud-order-126','1','1000','订单id'), +('mall4cloud-order-127','1','1000','订单id'), +('mall4cloud-order-128','1','1000','订单id'), +('mall4cloud-order-129','1','1000','订单id'), +('mall4cloud-order-130','1','1000','订单id'), +('mall4cloud-order-131','1','1000','订单id'), +('mall4cloud-order-132','1','1000','订单id'), +('mall4cloud-order-133','1','1000','订单id'), +('mall4cloud-order-134','1','1000','订单id'), +('mall4cloud-order-135','1','1000','订单id'), +('mall4cloud-order-136','1','1000','订单id'), +('mall4cloud-order-137','1','1000','订单id'), +('mall4cloud-order-138','1','1000','订单id'), +('mall4cloud-order-139','1','1000','订单id'), +('mall4cloud-order-140','1','1000','订单id'), +('mall4cloud-order-141','1','1000','订单id'), +('mall4cloud-order-142','1','1000','订单id'), +('mall4cloud-order-143','1','1000','订单id'), +('mall4cloud-order-144','1','1000','订单id'), +('mall4cloud-order-145','1','1000','订单id'), +('mall4cloud-order-146','1','1000','订单id'), +('mall4cloud-order-147','1','1000','订单id'), +('mall4cloud-order-148','1','1000','订单id'), +('mall4cloud-order-149','1','1000','订单id'), +('mall4cloud-order-150','1','1000','订单id'), +('mall4cloud-order-151','1','1000','订单id'), +('mall4cloud-order-152','1','1000','订单id'), +('mall4cloud-order-153','1','1000','订单id'), +('mall4cloud-order-154','1','1000','订单id'), +('mall4cloud-order-155','1','1000','订单id'), +('mall4cloud-order-156','1','1000','订单id'), +('mall4cloud-order-157','1','1000','订单id'), +('mall4cloud-order-158','1','1000','订单id'), +('mall4cloud-order-159','1','1000','订单id'), +('mall4cloud-order-160','1','1000','订单id'), +('mall4cloud-order-161','1','1000','订单id'), +('mall4cloud-order-162','1','1000','订单id'), +('mall4cloud-order-163','1','1000','订单id'), +('mall4cloud-order-164','1','1000','订单id'), +('mall4cloud-order-165','1','1000','订单id'), +('mall4cloud-order-166','1','1000','订单id'), +('mall4cloud-order-167','1','1000','订单id'), +('mall4cloud-order-168','1','1000','订单id'), +('mall4cloud-order-169','1','1000','订单id'), +('mall4cloud-order-170','1','1000','订单id'), +('mall4cloud-order-171','1','1000','订单id'), +('mall4cloud-order-172','1','1000','订单id'), +('mall4cloud-order-173','1','1000','订单id'), +('mall4cloud-order-174','1','1000','订单id'), +('mall4cloud-order-175','1','1000','订单id'), +('mall4cloud-order-176','1','1000','订单id'), +('mall4cloud-order-177','1','1000','订单id'), +('mall4cloud-order-178','1','1000','订单id'), +('mall4cloud-order-179','1','1000','订单id'), +('mall4cloud-order-180','1','1000','订单id'), +('mall4cloud-order-181','1','1000','订单id'), +('mall4cloud-order-182','1','1000','订单id'), +('mall4cloud-order-183','1','1000','订单id'), +('mall4cloud-order-184','1','1000','订单id'), +('mall4cloud-order-185','1','1000','订单id'), +('mall4cloud-order-186','1','1000','订单id'), +('mall4cloud-order-187','1','1000','订单id'), +('mall4cloud-order-188','1','1000','订单id'), +('mall4cloud-order-189','1','1000','订单id'), +('mall4cloud-order-190','1','1000','订单id'), +('mall4cloud-order-191','1','1000','订单id'), +('mall4cloud-order-192','1','1000','订单id'), +('mall4cloud-order-193','1','1000','订单id'), +('mall4cloud-order-194','1','1000','订单id'), +('mall4cloud-order-195','1','1000','订单id'), +('mall4cloud-order-196','1','1000','订单id'), +('mall4cloud-order-197','1','1000','订单id'), +('mall4cloud-order-198','1','1000','订单id'), +('mall4cloud-order-199','1','1000','订单id'), +('mall4cloud-order-200','1','1000','订单id'), +('mall4cloud-order-201','1','1000','订单id'), +('mall4cloud-order-202','1','1000','订单id'), +('mall4cloud-order-203','1','1000','订单id'), +('mall4cloud-order-204','1','1000','订单id'), +('mall4cloud-order-205','1','1000','订单id'), +('mall4cloud-order-206','1','1000','订单id'), +('mall4cloud-order-207','1','1000','订单id'), +('mall4cloud-order-208','1','1000','订单id'), +('mall4cloud-order-209','1','1000','订单id'), +('mall4cloud-order-210','1','1000','订单id'), +('mall4cloud-order-211','1','1000','订单id'), +('mall4cloud-order-212','1','1000','订单id'), +('mall4cloud-order-213','1','1000','订单id'), +('mall4cloud-order-214','1','1000','订单id'), +('mall4cloud-order-215','1','1000','订单id'), +('mall4cloud-order-216','1','1000','订单id'), +('mall4cloud-order-217','1','1000','订单id'), +('mall4cloud-order-218','1','1000','订单id'), +('mall4cloud-order-219','1','1000','订单id'), +('mall4cloud-order-220','1','1000','订单id'), +('mall4cloud-order-221','1','1000','订单id'), +('mall4cloud-order-222','1','1000','订单id'), +('mall4cloud-order-223','1','1000','订单id'), +('mall4cloud-order-224','1','1000','订单id'), +('mall4cloud-order-225','1','1000','订单id'), +('mall4cloud-order-226','1','1000','订单id'), +('mall4cloud-order-227','1','1000','订单id'), +('mall4cloud-order-228','1','1000','订单id'), +('mall4cloud-order-229','1','1000','订单id'), +('mall4cloud-order-230','1','1000','订单id'), +('mall4cloud-order-231','1','1000','订单id'), +('mall4cloud-order-232','1','1000','订单id'), +('mall4cloud-order-233','1','1000','订单id'), +('mall4cloud-order-234','1','1000','订单id'), +('mall4cloud-order-235','1','1000','订单id'), +('mall4cloud-order-236','1','1000','订单id'), +('mall4cloud-order-237','1','1000','订单id'), +('mall4cloud-order-238','1','1000','订单id'), +('mall4cloud-order-239','1','1000','订单id'), +('mall4cloud-order-240','1','1000','订单id'), +('mall4cloud-order-241','1','1000','订单id'), +('mall4cloud-order-242','1','1000','订单id'), +('mall4cloud-order-243','1','1000','订单id'), +('mall4cloud-order-244','1','1000','订单id'), +('mall4cloud-order-245','1','1000','订单id'), +('mall4cloud-order-246','1','1000','订单id'), +('mall4cloud-order-247','1','1000','订单id'), +('mall4cloud-order-248','1','1000','订单id'), +('mall4cloud-order-249','1','1000','订单id'), +('mall4cloud-order-250','1','1000','订单id'), +('mall4cloud-order-251','1','1000','订单id'), +('mall4cloud-order-252','1','1000','订单id'), +('mall4cloud-order-253','1','1000','订单id'), +('mall4cloud-order-254','1','1000','订单id'), +('mall4cloud-order-255','1','1000','订单id'), +('mall4cloud-order-256','1','1000','订单id'), +('mall4cloud-order-257','1','1000','订单id'), +('mall4cloud-order-258','1','1000','订单id'), +('mall4cloud-order-259','1','1000','订单id'), +('mall4cloud-order-260','1','1000','订单id'), +('mall4cloud-order-261','1','1000','订单id'), +('mall4cloud-order-262','1','1000','订单id'), +('mall4cloud-order-263','1','1000','订单id'), +('mall4cloud-order-264','1','1000','订单id'), +('mall4cloud-order-265','1','1000','订单id'), +('mall4cloud-order-266','1','1000','订单id'), +('mall4cloud-order-267','1','1000','订单id'), +('mall4cloud-order-268','1','1000','订单id'), +('mall4cloud-order-269','1','1000','订单id'), +('mall4cloud-order-270','1','1000','订单id'), +('mall4cloud-order-271','1','1000','订单id'), +('mall4cloud-order-272','1','1000','订单id'), +('mall4cloud-order-273','1','1000','订单id'), +('mall4cloud-order-274','1','1000','订单id'), +('mall4cloud-order-275','1','1000','订单id'), +('mall4cloud-order-276','1','1000','订单id'), +('mall4cloud-order-277','1','1000','订单id'), +('mall4cloud-order-278','1','1000','订单id'), +('mall4cloud-order-279','1','1000','订单id'), +('mall4cloud-order-280','1','1000','订单id'), +('mall4cloud-order-281','1','1000','订单id'), +('mall4cloud-order-282','1','1000','订单id'), +('mall4cloud-order-283','1','1000','订单id'), +('mall4cloud-order-284','1','1000','订单id'), +('mall4cloud-order-285','1','1000','订单id'), +('mall4cloud-order-286','1','1000','订单id'), +('mall4cloud-order-287','1','1000','订单id'), +('mall4cloud-order-288','1','1000','订单id'), +('mall4cloud-order-289','1','1000','订单id'), +('mall4cloud-order-290','1','1000','订单id'), +('mall4cloud-order-291','1','1000','订单id'), +('mall4cloud-order-292','1','1000','订单id'), +('mall4cloud-order-293','1','1000','订单id'), +('mall4cloud-order-294','1','1000','订单id'), +('mall4cloud-order-295','1','1000','订单id'), +('mall4cloud-order-296','1','1000','订单id'), +('mall4cloud-order-297','1','1000','订单id'), +('mall4cloud-order-298','1','1000','订单id'), +('mall4cloud-order-299','1','1000','订单id'), +('mall4cloud-order-300','1','1000','订单id'), +('mall4cloud-order-301','1','1000','订单id'), +('mall4cloud-order-302','1','1000','订单id'), +('mall4cloud-order-303','1','1000','订单id'), +('mall4cloud-order-304','1','1000','订单id'), +('mall4cloud-order-305','1','1000','订单id'), +('mall4cloud-order-306','1','1000','订单id'), +('mall4cloud-order-307','1','1000','订单id'), +('mall4cloud-order-308','1','1000','订单id'), +('mall4cloud-order-309','1','1000','订单id'), +('mall4cloud-order-310','1','1000','订单id'), +('mall4cloud-order-311','1','1000','订单id'), +('mall4cloud-order-312','1','1000','订单id'), +('mall4cloud-order-313','1','1000','订单id'), +('mall4cloud-order-314','1','1000','订单id'), +('mall4cloud-order-315','1','1000','订单id'), +('mall4cloud-order-316','1','1000','订单id'), +('mall4cloud-order-317','1','1000','订单id'), +('mall4cloud-order-318','1','1000','订单id'), +('mall4cloud-order-319','1','1000','订单id'), +('mall4cloud-order-320','1','1000','订单id'), +('mall4cloud-order-321','1','1000','订单id'), +('mall4cloud-order-322','1','1000','订单id'), +('mall4cloud-order-323','1','1000','订单id'), +('mall4cloud-order-324','1','1000','订单id'), +('mall4cloud-order-325','1','1000','订单id'), +('mall4cloud-order-326','1','1000','订单id'), +('mall4cloud-order-327','1','1000','订单id'), +('mall4cloud-order-328','1','1000','订单id'), +('mall4cloud-order-329','1','1000','订单id'), +('mall4cloud-order-330','1','1000','订单id'), +('mall4cloud-order-331','1','1000','订单id'), +('mall4cloud-order-332','1','1000','订单id'), +('mall4cloud-order-333','1','1000','订单id'), +('mall4cloud-order-334','1','1000','订单id'), +('mall4cloud-order-335','1','1000','订单id'), +('mall4cloud-order-336','1','1000','订单id'), +('mall4cloud-order-337','1','1000','订单id'), +('mall4cloud-order-338','1','1000','订单id'), +('mall4cloud-order-339','1','1000','订单id'), +('mall4cloud-order-340','1','1000','订单id'), +('mall4cloud-order-341','1','1000','订单id'), +('mall4cloud-order-342','1','1000','订单id'), +('mall4cloud-order-343','1','1000','订单id'), +('mall4cloud-order-344','1','1000','订单id'), +('mall4cloud-order-345','1','1000','订单id'), +('mall4cloud-order-346','1','1000','订单id'), +('mall4cloud-order-347','1','1000','订单id'), +('mall4cloud-order-348','1','1000','订单id'), +('mall4cloud-order-349','1','1000','订单id'), +('mall4cloud-order-350','1','1000','订单id'), +('mall4cloud-order-351','1','1000','订单id'), +('mall4cloud-order-352','1','1000','订单id'), +('mall4cloud-order-353','1','1000','订单id'), +('mall4cloud-order-354','1','1000','订单id'), +('mall4cloud-order-355','1','1000','订单id'), +('mall4cloud-order-356','1','1000','订单id'), +('mall4cloud-order-357','1','1000','订单id'), +('mall4cloud-order-358','1','1000','订单id'), +('mall4cloud-order-359','1','1000','订单id'), +('mall4cloud-order-360','1','1000','订单id'), +('mall4cloud-order-361','1','1000','订单id'), +('mall4cloud-order-362','1','1000','订单id'), +('mall4cloud-order-363','1','1000','订单id'), +('mall4cloud-order-364','1','1000','订单id'), +('mall4cloud-order-365','1','1000','订单id'), +('mall4cloud-order-366','1','1000','订单id'), +('mall4cloud-order-367','1','1000','订单id'), +('mall4cloud-order-368','1','1000','订单id'), +('mall4cloud-order-369','1','1000','订单id'), +('mall4cloud-order-370','1','1000','订单id'), +('mall4cloud-order-371','1','1000','订单id'), +('mall4cloud-order-372','1','1000','订单id'), +('mall4cloud-order-373','1','1000','订单id'), +('mall4cloud-order-374','1','1000','订单id'), +('mall4cloud-order-375','1','1000','订单id'), +('mall4cloud-order-376','1','1000','订单id'), +('mall4cloud-order-377','1','1000','订单id'), +('mall4cloud-order-378','1','1000','订单id'), +('mall4cloud-order-379','1','1000','订单id'), +('mall4cloud-order-380','1','1000','订单id'), +('mall4cloud-order-381','1','1000','订单id'), +('mall4cloud-order-382','1','1000','订单id'), +('mall4cloud-order-383','1','1000','订单id'), +('mall4cloud-order-384','1','1000','订单id'), +('mall4cloud-order-385','1','1000','订单id'), +('mall4cloud-order-386','1','1000','订单id'), +('mall4cloud-order-387','1','1000','订单id'), +('mall4cloud-order-388','1','1000','订单id'), +('mall4cloud-order-389','1','1000','订单id'), +('mall4cloud-order-390','1','1000','订单id'), +('mall4cloud-order-391','1','1000','订单id'), +('mall4cloud-order-392','1','1000','订单id'), +('mall4cloud-order-393','1','1000','订单id'), +('mall4cloud-order-394','1','1000','订单id'), +('mall4cloud-order-395','1','1000','订单id'), +('mall4cloud-order-396','1','1000','订单id'), +('mall4cloud-order-397','1','1000','订单id'), +('mall4cloud-order-398','1','1000','订单id'), +('mall4cloud-order-399','1','1000','订单id'), +('mall4cloud-order-400','1','1000','订单id'), +('mall4cloud-order-401','1','1000','订单id'), +('mall4cloud-order-402','1','1000','订单id'), +('mall4cloud-order-403','1','1000','订单id'), +('mall4cloud-order-404','1','1000','订单id'), +('mall4cloud-order-405','1','1000','订单id'), +('mall4cloud-order-406','1','1000','订单id'), +('mall4cloud-order-407','1','1000','订单id'), +('mall4cloud-order-408','1','1000','订单id'), +('mall4cloud-order-409','1','1000','订单id'), +('mall4cloud-order-410','1','1000','订单id'), +('mall4cloud-order-411','1','1000','订单id'), +('mall4cloud-order-412','1','1000','订单id'), +('mall4cloud-order-413','1','1000','订单id'), +('mall4cloud-order-414','1','1000','订单id'), +('mall4cloud-order-415','1','1000','订单id'), +('mall4cloud-order-416','1','1000','订单id'), +('mall4cloud-order-417','1','1000','订单id'), +('mall4cloud-order-418','1','1000','订单id'), +('mall4cloud-order-419','1','1000','订单id'), +('mall4cloud-order-420','1','1000','订单id'), +('mall4cloud-order-421','1','1000','订单id'), +('mall4cloud-order-422','1','1000','订单id'), +('mall4cloud-order-423','1','1000','订单id'), +('mall4cloud-order-424','1','1000','订单id'), +('mall4cloud-order-425','1','1000','订单id'), +('mall4cloud-order-426','1','1000','订单id'), +('mall4cloud-order-427','1','1000','订单id'), +('mall4cloud-order-428','1','1000','订单id'), +('mall4cloud-order-429','1','1000','订单id'), +('mall4cloud-order-430','1','1000','订单id'), +('mall4cloud-order-431','1','1000','订单id'), +('mall4cloud-order-432','1','1000','订单id'), +('mall4cloud-order-433','1','1000','订单id'), +('mall4cloud-order-434','1','1000','订单id'), +('mall4cloud-order-435','1','1000','订单id'), +('mall4cloud-order-436','1','1000','订单id'), +('mall4cloud-order-437','1','1000','订单id'), +('mall4cloud-order-438','1','1000','订单id'), +('mall4cloud-order-439','1','1000','订单id'), +('mall4cloud-order-440','1','1000','订单id'), +('mall4cloud-order-441','1','1000','订单id'), +('mall4cloud-order-442','1','1000','订单id'), +('mall4cloud-order-443','1','1000','订单id'), +('mall4cloud-order-444','1','1000','订单id'), +('mall4cloud-order-445','1','1000','订单id'), +('mall4cloud-order-446','1','1000','订单id'), +('mall4cloud-order-447','1','1000','订单id'), +('mall4cloud-order-448','1','1000','订单id'), +('mall4cloud-order-449','1','1000','订单id'), +('mall4cloud-order-450','1','1000','订单id'), +('mall4cloud-order-451','1','1000','订单id'), +('mall4cloud-order-452','1','1000','订单id'), +('mall4cloud-order-453','1','1000','订单id'), +('mall4cloud-order-454','1','1000','订单id'), +('mall4cloud-order-455','1','1000','订单id'), +('mall4cloud-order-456','1','1000','订单id'), +('mall4cloud-order-457','1','1000','订单id'), +('mall4cloud-order-458','1','1000','订单id'), +('mall4cloud-order-459','1','1000','订单id'), +('mall4cloud-order-460','1','1000','订单id'), +('mall4cloud-order-461','1','1000','订单id'), +('mall4cloud-order-462','1','1000','订单id'), +('mall4cloud-order-463','1','1000','订单id'), +('mall4cloud-order-464','1','1000','订单id'), +('mall4cloud-order-465','1','1000','订单id'), +('mall4cloud-order-466','1','1000','订单id'), +('mall4cloud-order-467','1','1000','订单id'), +('mall4cloud-order-468','1','1000','订单id'), +('mall4cloud-order-469','1','1000','订单id'), +('mall4cloud-order-470','1','1000','订单id'), +('mall4cloud-order-471','1','1000','订单id'), +('mall4cloud-order-472','1','1000','订单id'), +('mall4cloud-order-473','1','1000','订单id'), +('mall4cloud-order-474','1','1000','订单id'), +('mall4cloud-order-475','1','1000','订单id'), +('mall4cloud-order-476','1','1000','订单id'), +('mall4cloud-order-477','1','1000','订单id'), +('mall4cloud-order-478','1','1000','订单id'), +('mall4cloud-order-479','1','1000','订单id'), +('mall4cloud-order-480','1','1000','订单id'), +('mall4cloud-order-481','1','1000','订单id'), +('mall4cloud-order-482','1','1000','订单id'), +('mall4cloud-order-483','1','1000','订单id'), +('mall4cloud-order-484','1','1000','订单id'), +('mall4cloud-order-485','1','1000','订单id'), +('mall4cloud-order-486','1','1000','订单id'), +('mall4cloud-order-487','1','1000','订单id'), +('mall4cloud-order-488','1','1000','订单id'), +('mall4cloud-order-489','1','1000','订单id'), +('mall4cloud-order-490','1','1000','订单id'), +('mall4cloud-order-491','1','1000','订单id'), +('mall4cloud-order-492','1','1000','订单id'), +('mall4cloud-order-493','1','1000','订单id'), +('mall4cloud-order-494','1','1000','订单id'), +('mall4cloud-order-495','1','1000','订单id'), +('mall4cloud-order-496','1','1000','订单id'), +('mall4cloud-order-497','1','1000','订单id'), +('mall4cloud-order-498','1','1000','订单id'), +('mall4cloud-order-499','1','1000','订单id'), +('mall4cloud-order-500','1','1000','订单id'), +('mall4cloud-order-501','1','1000','订单id'), +('mall4cloud-order-502','1','1000','订单id'), +('mall4cloud-order-503','1','1000','订单id'), +('mall4cloud-order-504','1','1000','订单id'), +('mall4cloud-order-505','1','1000','订单id'), +('mall4cloud-order-506','1','1000','订单id'), +('mall4cloud-order-507','1','1000','订单id'), +('mall4cloud-order-508','1','1000','订单id'), +('mall4cloud-order-509','1','1000','订单id'), +('mall4cloud-order-510','1','1000','订单id'), +('mall4cloud-order-511','1','1000','订单id'), +('mall4cloud-order-512','1','1000','订单id'), +('mall4cloud-order-513','1','1000','订单id'), +('mall4cloud-order-514','1','1000','订单id'), +('mall4cloud-order-515','1','1000','订单id'), +('mall4cloud-order-516','1','1000','订单id'), +('mall4cloud-order-517','1','1000','订单id'), +('mall4cloud-order-518','1','1000','订单id'), +('mall4cloud-order-519','1','1000','订单id'), +('mall4cloud-order-520','1','1000','订单id'), +('mall4cloud-order-521','1','1000','订单id'), +('mall4cloud-order-522','1','1000','订单id'), +('mall4cloud-order-523','1','1000','订单id'), +('mall4cloud-order-524','1','1000','订单id'), +('mall4cloud-order-525','1','1000','订单id'), +('mall4cloud-order-526','1','1000','订单id'), +('mall4cloud-order-527','1','1000','订单id'), +('mall4cloud-order-528','1','1000','订单id'), +('mall4cloud-order-529','1','1000','订单id'), +('mall4cloud-order-530','1','1000','订单id'), +('mall4cloud-order-531','1','1000','订单id'), +('mall4cloud-order-532','1','1000','订单id'), +('mall4cloud-order-533','1','1000','订单id'), +('mall4cloud-order-534','1','1000','订单id'), +('mall4cloud-order-535','1','1000','订单id'), +('mall4cloud-order-536','1','1000','订单id'), +('mall4cloud-order-537','1','1000','订单id'), +('mall4cloud-order-538','1','1000','订单id'), +('mall4cloud-order-539','1','1000','订单id'), +('mall4cloud-order-540','1','1000','订单id'), +('mall4cloud-order-541','1','1000','订单id'), +('mall4cloud-order-542','1','1000','订单id'), +('mall4cloud-order-543','1','1000','订单id'), +('mall4cloud-order-544','1','1000','订单id'), +('mall4cloud-order-545','1','1000','订单id'), +('mall4cloud-order-546','1','1000','订单id'), +('mall4cloud-order-547','1','1000','订单id'), +('mall4cloud-order-548','1','1000','订单id'), +('mall4cloud-order-549','1','1000','订单id'), +('mall4cloud-order-550','1','1000','订单id'), +('mall4cloud-order-551','1','1000','订单id'), +('mall4cloud-order-552','1','1000','订单id'), +('mall4cloud-order-553','1','1000','订单id'), +('mall4cloud-order-554','1','1000','订单id'), +('mall4cloud-order-555','1','1000','订单id'), +('mall4cloud-order-556','1','1000','订单id'), +('mall4cloud-order-557','1','1000','订单id'), +('mall4cloud-order-558','1','1000','订单id'), +('mall4cloud-order-559','1','1000','订单id'), +('mall4cloud-order-560','1','1000','订单id'), +('mall4cloud-order-561','1','1000','订单id'), +('mall4cloud-order-562','1','1000','订单id'), +('mall4cloud-order-563','1','1000','订单id'), +('mall4cloud-order-564','1','1000','订单id'), +('mall4cloud-order-565','1','1000','订单id'), +('mall4cloud-order-566','1','1000','订单id'), +('mall4cloud-order-567','1','1000','订单id'), +('mall4cloud-order-568','1','1000','订单id'), +('mall4cloud-order-569','1','1000','订单id'), +('mall4cloud-order-570','1','1000','订单id'), +('mall4cloud-order-571','1','1000','订单id'), +('mall4cloud-order-572','1','1000','订单id'), +('mall4cloud-order-573','1','1000','订单id'), +('mall4cloud-order-574','1','1000','订单id'), +('mall4cloud-order-575','1','1000','订单id'), +('mall4cloud-order-576','1','1000','订单id'), +('mall4cloud-order-577','1','1000','订单id'), +('mall4cloud-order-578','1','1000','订单id'), +('mall4cloud-order-579','1','1000','订单id'), +('mall4cloud-order-580','1','1000','订单id'), +('mall4cloud-order-581','1','1000','订单id'), +('mall4cloud-order-582','1','1000','订单id'), +('mall4cloud-order-583','1','1000','订单id'), +('mall4cloud-order-584','1','1000','订单id'), +('mall4cloud-order-585','1','1000','订单id'), +('mall4cloud-order-586','1','1000','订单id'), +('mall4cloud-order-587','1','1000','订单id'), +('mall4cloud-order-588','1','1000','订单id'), +('mall4cloud-order-589','1','1000','订单id'), +('mall4cloud-order-590','1','1000','订单id'), +('mall4cloud-order-591','1','1000','订单id'), +('mall4cloud-order-592','1','1000','订单id'), +('mall4cloud-order-593','1','1000','订单id'), +('mall4cloud-order-594','1','1000','订单id'), +('mall4cloud-order-595','1','1000','订单id'), +('mall4cloud-order-596','1','1000','订单id'), +('mall4cloud-order-597','1','1000','订单id'), +('mall4cloud-order-598','1','1000','订单id'), +('mall4cloud-order-599','1','1000','订单id'), +('mall4cloud-order-600','1','1000','订单id'), +('mall4cloud-order-601','1','1000','订单id'), +('mall4cloud-order-602','1','1000','订单id'), +('mall4cloud-order-603','1','1000','订单id'), +('mall4cloud-order-604','1','1000','订单id'), +('mall4cloud-order-605','1','1000','订单id'), +('mall4cloud-order-606','1','1000','订单id'), +('mall4cloud-order-607','1','1000','订单id'), +('mall4cloud-order-608','1','1000','订单id'), +('mall4cloud-order-609','1','1000','订单id'), +('mall4cloud-order-610','1','1000','订单id'), +('mall4cloud-order-611','1','1000','订单id'), +('mall4cloud-order-612','1','1000','订单id'), +('mall4cloud-order-613','1','1000','订单id'), +('mall4cloud-order-614','1','1000','订单id'), +('mall4cloud-order-615','1','1000','订单id'), +('mall4cloud-order-616','1','1000','订单id'), +('mall4cloud-order-617','1','1000','订单id'), +('mall4cloud-order-618','1','1000','订单id'), +('mall4cloud-order-619','1','1000','订单id'), +('mall4cloud-order-620','1','1000','订单id'), +('mall4cloud-order-621','1','1000','订单id'), +('mall4cloud-order-622','1','1000','订单id'), +('mall4cloud-order-623','1','1000','订单id'), +('mall4cloud-order-624','1','1000','订单id'), +('mall4cloud-order-625','1','1000','订单id'), +('mall4cloud-order-626','1','1000','订单id'), +('mall4cloud-order-627','1','1000','订单id'), +('mall4cloud-order-628','1','1000','订单id'), +('mall4cloud-order-629','1','1000','订单id'), +('mall4cloud-order-630','1','1000','订单id'), +('mall4cloud-order-631','1','1000','订单id'), +('mall4cloud-order-632','1','1000','订单id'), +('mall4cloud-order-633','1','1000','订单id'), +('mall4cloud-order-634','1','1000','订单id'), +('mall4cloud-order-635','1','1000','订单id'), +('mall4cloud-order-636','1','1000','订单id'), +('mall4cloud-order-637','1','1000','订单id'), +('mall4cloud-order-638','1','1000','订单id'), +('mall4cloud-order-639','1','1000','订单id'), +('mall4cloud-order-640','1','1000','订单id'), +('mall4cloud-order-641','1','1000','订单id'), +('mall4cloud-order-642','1','1000','订单id'), +('mall4cloud-order-643','1','1000','订单id'), +('mall4cloud-order-644','1','1000','订单id'), +('mall4cloud-order-645','1','1000','订单id'), +('mall4cloud-order-646','1','1000','订单id'), +('mall4cloud-order-647','1','1000','订单id'), +('mall4cloud-order-648','1','1000','订单id'), +('mall4cloud-order-649','1','1000','订单id'), +('mall4cloud-order-650','1','1000','订单id'), +('mall4cloud-order-651','1','1000','订单id'), +('mall4cloud-order-652','1','1000','订单id'), +('mall4cloud-order-653','1','1000','订单id'), +('mall4cloud-order-654','1','1000','订单id'), +('mall4cloud-order-655','1','1000','订单id'), +('mall4cloud-order-656','1','1000','订单id'), +('mall4cloud-order-657','1','1000','订单id'), +('mall4cloud-order-658','1','1000','订单id'), +('mall4cloud-order-659','1','1000','订单id'), +('mall4cloud-order-660','1','1000','订单id'), +('mall4cloud-order-661','1','1000','订单id'), +('mall4cloud-order-662','1','1000','订单id'), +('mall4cloud-order-663','1','1000','订单id'), +('mall4cloud-order-664','1','1000','订单id'), +('mall4cloud-order-665','1','1000','订单id'), +('mall4cloud-order-666','1','1000','订单id'), +('mall4cloud-order-667','1','1000','订单id'), +('mall4cloud-order-668','1','1000','订单id'), +('mall4cloud-order-669','1','1000','订单id'), +('mall4cloud-order-670','1','1000','订单id'), +('mall4cloud-order-671','1','1000','订单id'), +('mall4cloud-order-672','1','1000','订单id'), +('mall4cloud-order-673','1','1000','订单id'), +('mall4cloud-order-674','1','1000','订单id'), +('mall4cloud-order-675','1','1000','订单id'), +('mall4cloud-order-676','1','1000','订单id'), +('mall4cloud-order-677','1','1000','订单id'), +('mall4cloud-order-678','1','1000','订单id'), +('mall4cloud-order-679','1','1000','订单id'), +('mall4cloud-order-680','1','1000','订单id'), +('mall4cloud-order-681','1','1000','订单id'), +('mall4cloud-order-682','1','1000','订单id'), +('mall4cloud-order-683','1','1000','订单id'), +('mall4cloud-order-684','1','1000','订单id'), +('mall4cloud-order-685','1','1000','订单id'), +('mall4cloud-order-686','1','1000','订单id'), +('mall4cloud-order-687','1','1000','订单id'), +('mall4cloud-order-688','1','1000','订单id'), +('mall4cloud-order-689','1','1000','订单id'), +('mall4cloud-order-690','1','1000','订单id'), +('mall4cloud-order-691','1','1000','订单id'), +('mall4cloud-order-692','1','1000','订单id'), +('mall4cloud-order-693','1','1000','订单id'), +('mall4cloud-order-694','1','1000','订单id'), +('mall4cloud-order-695','1','1000','订单id'), +('mall4cloud-order-696','1','1000','订单id'), +('mall4cloud-order-697','1','1000','订单id'), +('mall4cloud-order-698','1','1000','订单id'), +('mall4cloud-order-699','1','1000','订单id'), +('mall4cloud-order-700','1','1000','订单id'), +('mall4cloud-order-701','1','1000','订单id'), +('mall4cloud-order-702','1','1000','订单id'), +('mall4cloud-order-703','1','1000','订单id'), +('mall4cloud-order-704','1','1000','订单id'), +('mall4cloud-order-705','1','1000','订单id'), +('mall4cloud-order-706','1','1000','订单id'), +('mall4cloud-order-707','1','1000','订单id'), +('mall4cloud-order-708','1','1000','订单id'), +('mall4cloud-order-709','1','1000','订单id'), +('mall4cloud-order-710','1','1000','订单id'), +('mall4cloud-order-711','1','1000','订单id'), +('mall4cloud-order-712','1','1000','订单id'), +('mall4cloud-order-713','1','1000','订单id'), +('mall4cloud-order-714','1','1000','订单id'), +('mall4cloud-order-715','1','1000','订单id'), +('mall4cloud-order-716','1','1000','订单id'), +('mall4cloud-order-717','1','1000','订单id'), +('mall4cloud-order-718','1','1000','订单id'), +('mall4cloud-order-719','1','1000','订单id'), +('mall4cloud-order-720','1','1000','订单id'), +('mall4cloud-order-721','1','1000','订单id'), +('mall4cloud-order-722','1','1000','订单id'), +('mall4cloud-order-723','1','1000','订单id'), +('mall4cloud-order-724','1','1000','订单id'), +('mall4cloud-order-725','1','1000','订单id'), +('mall4cloud-order-726','1','1000','订单id'), +('mall4cloud-order-727','1','1000','订单id'), +('mall4cloud-order-728','1','1000','订单id'), +('mall4cloud-order-729','1','1000','订单id'), +('mall4cloud-order-730','1','1000','订单id'), +('mall4cloud-order-731','1','1000','订单id'), +('mall4cloud-order-732','1','1000','订单id'), +('mall4cloud-order-733','1','1000','订单id'), +('mall4cloud-order-734','1','1000','订单id'), +('mall4cloud-order-735','1','1000','订单id'), +('mall4cloud-order-736','1','1000','订单id'), +('mall4cloud-order-737','1','1000','订单id'), +('mall4cloud-order-738','1','1000','订单id'), +('mall4cloud-order-739','1','1000','订单id'), +('mall4cloud-order-740','1','1000','订单id'), +('mall4cloud-order-741','1','1000','订单id'), +('mall4cloud-order-742','1','1000','订单id'), +('mall4cloud-order-743','1','1000','订单id'), +('mall4cloud-order-744','1','1000','订单id'), +('mall4cloud-order-745','1','1000','订单id'), +('mall4cloud-order-746','1','1000','订单id'), +('mall4cloud-order-747','1','1000','订单id'), +('mall4cloud-order-748','1','1000','订单id'), +('mall4cloud-order-749','1','1000','订单id'), +('mall4cloud-order-750','1','1000','订单id'), +('mall4cloud-order-751','1','1000','订单id'), +('mall4cloud-order-752','1','1000','订单id'), +('mall4cloud-order-753','1','1000','订单id'), +('mall4cloud-order-754','1','1000','订单id'), +('mall4cloud-order-755','1','1000','订单id'), +('mall4cloud-order-756','1','1000','订单id'), +('mall4cloud-order-757','1','1000','订单id'), +('mall4cloud-order-758','1','1000','订单id'), +('mall4cloud-order-759','1','1000','订单id'), +('mall4cloud-order-760','1','1000','订单id'), +('mall4cloud-order-761','1','1000','订单id'), +('mall4cloud-order-762','1','1000','订单id'), +('mall4cloud-order-763','1','1000','订单id'), +('mall4cloud-order-764','1','1000','订单id'), +('mall4cloud-order-765','1','1000','订单id'), +('mall4cloud-order-766','1','1000','订单id'), +('mall4cloud-order-767','1','1000','订单id'), +('mall4cloud-order-768','1','1000','订单id'), +('mall4cloud-order-769','1','1000','订单id'), +('mall4cloud-order-770','1','1000','订单id'), +('mall4cloud-order-771','1','1000','订单id'), +('mall4cloud-order-772','1','1000','订单id'), +('mall4cloud-order-773','1','1000','订单id'), +('mall4cloud-order-774','1','1000','订单id'), +('mall4cloud-order-775','1','1000','订单id'), +('mall4cloud-order-776','1','1000','订单id'), +('mall4cloud-order-777','1','1000','订单id'), +('mall4cloud-order-778','1','1000','订单id'), +('mall4cloud-order-779','1','1000','订单id'), +('mall4cloud-order-780','1','1000','订单id'), +('mall4cloud-order-781','1','1000','订单id'), +('mall4cloud-order-782','1','1000','订单id'), +('mall4cloud-order-783','1','1000','订单id'), +('mall4cloud-order-784','1','1000','订单id'), +('mall4cloud-order-785','1','1000','订单id'), +('mall4cloud-order-786','1','1000','订单id'), +('mall4cloud-order-787','1','1000','订单id'), +('mall4cloud-order-788','1','1000','订单id'), +('mall4cloud-order-789','1','1000','订单id'), +('mall4cloud-order-790','1','1000','订单id'), +('mall4cloud-order-791','1','1000','订单id'), +('mall4cloud-order-792','1','1000','订单id'), +('mall4cloud-order-793','1','1000','订单id'), +('mall4cloud-order-794','1','1000','订单id'), +('mall4cloud-order-795','1','1000','订单id'), +('mall4cloud-order-796','1','1000','订单id'), +('mall4cloud-order-797','1','1000','订单id'), +('mall4cloud-order-798','1','1000','订单id'), +('mall4cloud-order-799','1','1000','订单id'), +('mall4cloud-order-800','1','1000','订单id'), +('mall4cloud-order-801','1','1000','订单id'), +('mall4cloud-order-802','1','1000','订单id'), +('mall4cloud-order-803','1','1000','订单id'), +('mall4cloud-order-804','1','1000','订单id'), +('mall4cloud-order-805','1','1000','订单id'), +('mall4cloud-order-806','1','1000','订单id'), +('mall4cloud-order-807','1','1000','订单id'), +('mall4cloud-order-808','1','1000','订单id'), +('mall4cloud-order-809','1','1000','订单id'), +('mall4cloud-order-810','1','1000','订单id'), +('mall4cloud-order-811','1','1000','订单id'), +('mall4cloud-order-812','1','1000','订单id'), +('mall4cloud-order-813','1','1000','订单id'), +('mall4cloud-order-814','1','1000','订单id'), +('mall4cloud-order-815','1','1000','订单id'), +('mall4cloud-order-816','1','1000','订单id'), +('mall4cloud-order-817','1','1000','订单id'), +('mall4cloud-order-818','1','1000','订单id'), +('mall4cloud-order-819','1','1000','订单id'), +('mall4cloud-order-820','1','1000','订单id'), +('mall4cloud-order-821','1','1000','订单id'), +('mall4cloud-order-822','1','1000','订单id'), +('mall4cloud-order-823','1','1000','订单id'), +('mall4cloud-order-824','1','1000','订单id'), +('mall4cloud-order-825','1','1000','订单id'), +('mall4cloud-order-826','1','1000','订单id'), +('mall4cloud-order-827','1','1000','订单id'), +('mall4cloud-order-828','1','1000','订单id'), +('mall4cloud-order-829','1','1000','订单id'), +('mall4cloud-order-830','1','1000','订单id'), +('mall4cloud-order-831','1','1000','订单id'), +('mall4cloud-order-832','1','1000','订单id'), +('mall4cloud-order-833','1','1000','订单id'), +('mall4cloud-order-834','1','1000','订单id'), +('mall4cloud-order-835','1','1000','订单id'), +('mall4cloud-order-836','1','1000','订单id'), +('mall4cloud-order-837','1','1000','订单id'), +('mall4cloud-order-838','1','1000','订单id'), +('mall4cloud-order-839','1','1000','订单id'), +('mall4cloud-order-840','1','1000','订单id'), +('mall4cloud-order-841','1','1000','订单id'), +('mall4cloud-order-842','1','1000','订单id'), +('mall4cloud-order-843','1','1000','订单id'), +('mall4cloud-order-844','1','1000','订单id'), +('mall4cloud-order-845','1','1000','订单id'), +('mall4cloud-order-846','1','1000','订单id'), +('mall4cloud-order-847','1','1000','订单id'), +('mall4cloud-order-848','1','1000','订单id'), +('mall4cloud-order-849','1','1000','订单id'), +('mall4cloud-order-850','1','1000','订单id'), +('mall4cloud-order-851','1','1000','订单id'), +('mall4cloud-order-852','1','1000','订单id'), +('mall4cloud-order-853','1','1000','订单id'), +('mall4cloud-order-854','1','1000','订单id'), +('mall4cloud-order-855','1','1000','订单id'), +('mall4cloud-order-856','1','1000','订单id'), +('mall4cloud-order-857','1','1000','订单id'), +('mall4cloud-order-858','1','1000','订单id'), +('mall4cloud-order-859','1','1000','订单id'), +('mall4cloud-order-860','1','1000','订单id'), +('mall4cloud-order-861','1','1000','订单id'), +('mall4cloud-order-862','1','1000','订单id'), +('mall4cloud-order-863','1','1000','订单id'), +('mall4cloud-order-864','1','1000','订单id'), +('mall4cloud-order-865','1','1000','订单id'), +('mall4cloud-order-866','1','1000','订单id'), +('mall4cloud-order-867','1','1000','订单id'), +('mall4cloud-order-868','1','1000','订单id'), +('mall4cloud-order-869','1','1000','订单id'), +('mall4cloud-order-870','1','1000','订单id'), +('mall4cloud-order-871','1','1000','订单id'), +('mall4cloud-order-872','1','1000','订单id'), +('mall4cloud-order-873','1','1000','订单id'), +('mall4cloud-order-874','1','1000','订单id'), +('mall4cloud-order-875','1','1000','订单id'), +('mall4cloud-order-876','1','1000','订单id'), +('mall4cloud-order-877','1','1000','订单id'), +('mall4cloud-order-878','1','1000','订单id'), +('mall4cloud-order-879','1','1000','订单id'), +('mall4cloud-order-880','1','1000','订单id'), +('mall4cloud-order-881','1','1000','订单id'), +('mall4cloud-order-882','1','1000','订单id'), +('mall4cloud-order-883','1','1000','订单id'), +('mall4cloud-order-884','1','1000','订单id'), +('mall4cloud-order-885','1','1000','订单id'), +('mall4cloud-order-886','1','1000','订单id'), +('mall4cloud-order-887','1','1000','订单id'), +('mall4cloud-order-888','1','1000','订单id'), +('mall4cloud-order-889','1','1000','订单id'), +('mall4cloud-order-890','1','1000','订单id'), +('mall4cloud-order-891','1','1000','订单id'), +('mall4cloud-order-892','1','1000','订单id'), +('mall4cloud-order-893','1','1000','订单id'), +('mall4cloud-order-894','1','1000','订单id'), +('mall4cloud-order-895','1','1000','订单id'), +('mall4cloud-order-896','1','1000','订单id'), +('mall4cloud-order-897','1','1000','订单id'), +('mall4cloud-order-898','1','1000','订单id'), +('mall4cloud-order-899','1','1000','订单id'), +('mall4cloud-order-900','1','1000','订单id'), +('mall4cloud-order-901','1','1000','订单id'), +('mall4cloud-order-902','1','1000','订单id'), +('mall4cloud-order-903','1','1000','订单id'), +('mall4cloud-order-904','1','1000','订单id'), +('mall4cloud-order-905','1','1000','订单id'), +('mall4cloud-order-906','1','1000','订单id'), +('mall4cloud-order-907','1','1000','订单id'), +('mall4cloud-order-908','1','1000','订单id'), +('mall4cloud-order-909','1','1000','订单id'), +('mall4cloud-order-910','1','1000','订单id'), +('mall4cloud-order-911','1','1000','订单id'), +('mall4cloud-order-912','1','1000','订单id'), +('mall4cloud-order-913','1','1000','订单id'), +('mall4cloud-order-914','1','1000','订单id'), +('mall4cloud-order-915','1','1000','订单id'), +('mall4cloud-order-916','1','1000','订单id'), +('mall4cloud-order-917','1','1000','订单id'), +('mall4cloud-order-918','1','1000','订单id'), +('mall4cloud-order-919','1','1000','订单id'), +('mall4cloud-order-920','1','1000','订单id'), +('mall4cloud-order-921','1','1000','订单id'), +('mall4cloud-order-922','1','1000','订单id'), +('mall4cloud-order-923','1','1000','订单id'), +('mall4cloud-order-924','1','1000','订单id'), +('mall4cloud-order-925','1','1000','订单id'), +('mall4cloud-order-926','1','1000','订单id'), +('mall4cloud-order-927','1','1000','订单id'), +('mall4cloud-order-928','1','1000','订单id'), +('mall4cloud-order-929','1','1000','订单id'), +('mall4cloud-order-930','1','1000','订单id'), +('mall4cloud-order-931','1','1000','订单id'), +('mall4cloud-order-932','1','1000','订单id'), +('mall4cloud-order-933','1','1000','订单id'), +('mall4cloud-order-934','1','1000','订单id'), +('mall4cloud-order-935','1','1000','订单id'), +('mall4cloud-order-936','1','1000','订单id'), +('mall4cloud-order-937','1','1000','订单id'), +('mall4cloud-order-938','1','1000','订单id'), +('mall4cloud-order-939','1','1000','订单id'), +('mall4cloud-order-940','1','1000','订单id'), +('mall4cloud-order-941','1','1000','订单id'), +('mall4cloud-order-942','1','1000','订单id'), +('mall4cloud-order-943','1','1000','订单id'), +('mall4cloud-order-944','1','1000','订单id'), +('mall4cloud-order-945','1','1000','订单id'), +('mall4cloud-order-946','1','1000','订单id'), +('mall4cloud-order-947','1','1000','订单id'), +('mall4cloud-order-948','1','1000','订单id'), +('mall4cloud-order-949','1','1000','订单id'), +('mall4cloud-order-950','1','1000','订单id'), +('mall4cloud-order-951','1','1000','订单id'), +('mall4cloud-order-952','1','1000','订单id'), +('mall4cloud-order-953','1','1000','订单id'), +('mall4cloud-order-954','1','1000','订单id'), +('mall4cloud-order-955','1','1000','订单id'), +('mall4cloud-order-956','1','1000','订单id'), +('mall4cloud-order-957','1','1000','订单id'), +('mall4cloud-order-958','1','1000','订单id'), +('mall4cloud-order-959','1','1000','订单id'), +('mall4cloud-order-960','1','1000','订单id'), +('mall4cloud-order-961','1','1000','订单id'), +('mall4cloud-order-962','1','1000','订单id'), +('mall4cloud-order-963','1','1000','订单id'), +('mall4cloud-order-964','1','1000','订单id'), +('mall4cloud-order-965','1','1000','订单id'), +('mall4cloud-order-966','1','1000','订单id'), +('mall4cloud-order-967','1','1000','订单id'), +('mall4cloud-order-968','1','1000','订单id'), +('mall4cloud-order-969','1','1000','订单id'), +('mall4cloud-order-970','1','1000','订单id'), +('mall4cloud-order-971','1','1000','订单id'), +('mall4cloud-order-972','1','1000','订单id'), +('mall4cloud-order-973','1','1000','订单id'), +('mall4cloud-order-974','1','1000','订单id'), +('mall4cloud-order-975','1','1000','订单id'), +('mall4cloud-order-976','1','1000','订单id'), +('mall4cloud-order-977','1','1000','订单id'), +('mall4cloud-order-978','1','1000','订单id'), +('mall4cloud-order-979','1','1000','订单id'), +('mall4cloud-order-980','1','1000','订单id'), +('mall4cloud-order-981','1','1000','订单id'), +('mall4cloud-order-982','1','1000','订单id'), +('mall4cloud-order-983','1','1000','订单id'), +('mall4cloud-order-984','1','1000','订单id'), +('mall4cloud-order-985','1','1000','订单id'), +('mall4cloud-order-986','1','1000','订单id'), +('mall4cloud-order-987','1','1000','订单id'), +('mall4cloud-order-988','1','1000','订单id'), +('mall4cloud-order-989','1','1000','订单id'), +('mall4cloud-order-990','1','1000','订单id'), +('mall4cloud-order-991','1','1000','订单id'), +('mall4cloud-order-992','1','1000','订单id'), +('mall4cloud-order-993','1','1000','订单id'), +('mall4cloud-order-994','1','1000','订单id'), +('mall4cloud-order-995','1','1000','订单id'), +('mall4cloud-order-996','1','1000','订单id'), +('mall4cloud-order-997','1','1000','订单id'), +('mall4cloud-order-998','1','1000','订单id'), +('mall4cloud-order-999','1','1000','订单id'); + + + + +USE `mall4cloud_user`; +DROP TABLE IF EXISTS `leaf_alloc`; +CREATE TABLE `leaf_alloc` ( + `biz_tag` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '区分业务', + `max_id` bigint unsigned NOT NULL DEFAULT '1' COMMENT '该biz_tag目前所被分配的ID号段的最大值', + `step` int NOT NULL COMMENT '每次分配的号段长度', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + PRIMARY KEY (`biz_tag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +insert into `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) values +('mall4cloud-user','1000000000000','1000','用户id'), +('mall4cloud-user-score-log','1000000000000','1000','mall4cloud余额日志'), +('mall4cloud-user-balance-log','1000000000000','1000','mall4cloud积分日志'); diff --git a/db/2023-11-20 拼团订单搬迁到mongodb(看注释).sql b/db/2023-11-20 拼团订单搬迁到mongodb(看注释).sql new file mode 100644 index 0000000..02b01b0 --- /dev/null +++ b/db/2023-11-20 拼团订单搬迁到mongodb(看注释).sql @@ -0,0 +1,1248 @@ +# 看注释!!!!!! + +# 1.在总库建group_order、group_team两个总表,方便后面mongodb迁移数据 +USE mall4cloud_group; +DROP TABLE IF EXISTS `group_order`; +CREATE TABLE `group_order` ( + `group_order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '拼团订单id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `group_activity_id` bigint DEFAULT NULL COMMENT '拼团活动id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `group_team_id` bigint DEFAULT NULL COMMENT '拼团团队id', + `user_id` bigint DEFAULT NULL COMMENT 'user_id(当user_id为0时标识为机器人)', + `identity_type` tinyint(1) DEFAULT NULL COMMENT '身份标识(0:成员 1:团长)', + `activity_prod_price` bigint DEFAULT NULL COMMENT '活动商品金额', + `pay_price` bigint DEFAULT NULL COMMENT '支付金额', + `order_id` bigint DEFAULT NULL COMMENT '订单id', + `status` tinyint(1) DEFAULT NULL COMMENT '状态(0:待支付、1:支付成功、-1:失效)', + `count` int DEFAULT NULL COMMENT '商品数量', + PRIMARY KEY (`group_order_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='拼团订单表'; + +DROP TABLE IF EXISTS `group_team`; +CREATE TABLE `group_team` ( + `group_team_id` bigint NOT NULL AUTO_INCREMENT COMMENT '拼团团队id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `group_activity_id` bigint DEFAULT NULL COMMENT '拼团活动id', + `group_spu_id` bigint DEFAULT NULL COMMENT '活动商品Id', + `join_num` int DEFAULT NULL COMMENT '已参团人数', + `status` tinyint(1) DEFAULT NULL COMMENT '拼团状态(0:待成团,1:拼团中,2:拼团成功,3:拼团失败)', + `total_price` bigint DEFAULT NULL COMMENT '团队订单总额', + `start_time` datetime DEFAULT NULL COMMENT '开始时间', + `end_time` datetime DEFAULT NULL COMMENT '剩余时间', + `share_user_id` bigint DEFAULT NULL COMMENT '团长user_Id', + PRIMARY KEY (`group_team_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='拼团团队表'; + +# 2.将分库里面订单相关内容迁移到总表中,根据自身配置可以将总库库名mall4cloud_group更改为自己配置的 +USE mall4cloud_group_0; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @create_group_order_table = CONCAT( + 'INSERT INTO mall4cloud_group.`group_order` + (SELECT * FROM group_order_', i, ")" + ); + PREPARE create_group_order_table FROM @create_group_order_table; + EXECUTE create_group_order_table; + + SET @create_group_team_table = CONCAT( + 'INSERT INTO mall4cloud_group.`group_team` + (SELECT * FROM group_team_', i, ")" + ); + PREPARE create_group_team_table FROM @create_group_team_table; + EXECUTE create_group_team_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_group_1; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @create_group_order_table = CONCAT( + 'INSERT INTO mall4cloud_group.`group_order` + (SELECT * FROM group_order_', i, ")" + ); + PREPARE create_group_order_table FROM @create_group_order_table; + EXECUTE create_group_order_table; + + SET @create_group_team_table = CONCAT( + 'INSERT INTO mall4cloud_group.`group_team` + (SELECT * FROM group_team_', i, ")" + ); + PREPARE create_group_team_table FROM @create_group_team_table; + EXECUTE create_group_team_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_group_2; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @create_group_order_table = CONCAT( + 'INSERT INTO mall4cloud_group.`group_order` + (SELECT * FROM group_order_', i, ")" + ); + PREPARE create_group_order_table FROM @create_group_order_table; + EXECUTE create_group_order_table; + + SET @create_group_team_table = CONCAT( + 'INSERT INTO mall4cloud_group.`group_team` + (SELECT * FROM group_team_', i, ")" + ); + PREPARE create_group_team_table FROM @create_group_team_table; + EXECUTE create_group_team_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_group_3; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @create_group_order_table = CONCAT( + 'INSERT INTO mall4cloud_group.`group_order` + (SELECT * FROM group_order_', i, ")" + ); + PREPARE create_group_order_table FROM @create_group_order_table; + EXECUTE create_group_order_table; + + SET @create_group_team_table = CONCAT( + 'INSERT INTO mall4cloud_group.`group_team` + (SELECT * FROM group_team_', i, ")" + ); + PREPARE create_group_team_table FROM @create_group_team_table; + EXECUTE create_group_team_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +# 3.将nacos中mall4cloud-group.yml的配置清空(sharding相关的配置, 将shardingsphere下的参数全部删除),然后重新配置数据库连接参数,注意检查连接配置,重新发布保存 +# spring: +# datasource: +# url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:mall4cloud_group}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true +# username: ${MYSQL_USERNAME:root} +# password: ${MYSQL_PASSWORD:hn02le.34lkdLKD} +# data: +# mongodb: +# host: 192.168.193.128 +# port: 27017 +# database: mall4cloud +# username: mall4cloud +# password: mall4cloud +# authentication-database: mall4cloud + + +# 4.重启group的java服务,因为将分表分库的配置删除了,需要重启更新配置 + +# 5.启用定时任务initGroupToMongo,这个定时任务只对2023-11-20更新前将group_order和group_team存入mysql之后,将数据搬迁到mongodb +# 该定时任务正常执行*成功*一次后(数据已经完全搬迁到mongodb)就可以置为停止或删除 +# 随后可以将mysql中分库(即mall4cloud_group_0 -> 3)的内容以及总库的group_order和group_team删除 +# 并且可以将GroupOrderMapper、GroupTeamMapper以及相关定时任务代码从代码中删去 +USE `mall4cloud_job`; +insert into `xxl_job_info`(`job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, + `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, + `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, + `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`, + `trigger_status`, `trigger_last_time`, `trigger_next_time`) +values (3, '初始化原有拼团数据库记录至mongodb', '2023-11-06 10:07:30', '2023-11-06 10:07:30', 'admin', '', 'CRON', + '0 0 0 1 1 ? *', 'DO_NOTHING', 'FIRST', 'initGroupToMongo', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', + '', 'GLUE代码初始化', '2023-11-06 10:07:30', '', 0, 0, 0); + + +# 移除授权标识唯一索引 +USE `mall4cloud_auth`; +ALTER TABLE `menu_permission` +DROP INDEX `uk_permission`; + +# 删除之前的菜单资源,重新添加新的!!!!注意核实!!!!!!! +DELETE FROM `menu_permission`; + +# 重新添加菜单资源 +insert into `menu_permission`(`menu_permission_id`,`create_time`,`update_time`,`menu_id`,`biz_type`,`permission`,`name`,`uri`,`method`) values +(1, '2021-07-08 09:47:13', '2021-07-08 09:54:59', 137, 1, 'product:attr:save', '新增商品属性', '/mp/attr', 2), +(2, '2021-07-08 09:48:14', '2021-07-08 09:48:14', 137, 1, 'product:attr:update', '编辑商品属性', '/mp/attr', 3), +(3, '2021-07-08 09:49:12', '2021-07-08 09:49:12', 137, 1, 'product:attr:delete', '删除商品属性', '/mp/attr', 4), +(4, '2021-07-08 09:54:47', '2021-07-08 09:54:47', 139, 1, 'product:category:save', '新增店铺分类', '/mp/category', 2), +(5, '2021-07-08 09:55:58', '2021-07-08 09:55:58', 139, 1, 'product:category:update', '编辑店铺分类', '/mp/category', 3), +(6, '2021-07-08 09:59:40', '2021-07-08 09:59:40', 139, 1, 'product:category:offShelf', '下架店铺分类', '/mp/category/category_enable_or_disable', 3), +(7, '2021-07-08 10:00:46', '2021-07-08 10:00:46', 139, 1, 'product:category:putOnShelf', '上架店铺分类', '/mp/category/category_enable_or_disable', 3), +(8, '2021-07-08 10:02:19', '2021-07-08 10:02:19', 139, 1, 'product:category:delete', '删除店铺分类', '/mp/category', 4), +(9, '2021-07-08 10:16:29', '2021-07-08 11:03:01', 279, 1, 'marketing:seckill:join', '参与', '/mp/seckill/list_seckill_spu_by_time', 1), +(11, '2021-07-08 10:26:15', '2021-07-08 11:03:54', 279, 1, 'marketing:seckill:detail', '详情', '/mp/seckill/list_seckill_spu_by_time', 1), +(13, '2021-07-08 10:36:19', '2021-07-09 10:00:53', 142, 1, 'product:spu:save', '发布商品', '/mp/spu', 2), +(15, '2021-07-08 10:45:01', '2021-07-08 10:45:01', 152, 1, 'product:spu:soldExcel', '导出商品', '/mp/spu/sold_excel', 1), +(16, '2021-07-08 10:48:17', '2021-07-08 10:48:17', 152, 1, 'product:spu:upload', '导入商品', '/mp/spu/export_excel', 2), +(17, '2021-07-08 13:21:53', '2021-07-08 16:52:08', 235, 1, 'marketing:coupon:update', '修改', '/mp/coupon', 3), +(18, '2021-07-08 13:23:41', '2021-07-08 13:58:58', 235, 1, 'marketing:coupon:delete', '删除', '/mp/coupon', 4), +(19, '2021-07-08 13:45:16', '2021-07-09 11:21:04', 235, 1, 'marketing:coupon:auditApply', '申请上线', '/mp/coupon/audit_apply', 2), +(20, '2021-07-08 13:50:25', '2021-07-09 11:20:47', 235, 1, 'marketing:coupon:waitAudit', '等待审核', '/mp/coupon/get_offline_handle_event', 1), +(21, '2021-07-08 13:58:36', '2021-07-08 16:53:38', 235, 1, 'marketing:coupon:save', '新增', '/mp/coupon', 2), +(23, '2021-07-08 14:18:23', '2021-07-08 16:53:17', 154, 1, 'marketing:discount:save', '新增', '/mp/discount', 2), +(24, '2021-07-08 14:19:58', '2021-07-08 14:19:58', 151, 1, 'user:transport:update', '编辑', '/mp/transport', 3), +(25, '2021-07-08 14:20:28', '2021-07-08 14:20:28', 151, 1, 'user:transport:save', '新增', '/mp/transport', 2), +(26, '2021-07-08 14:20:52', '2021-07-08 14:20:52', 151, 1, 'user:transport:delete', '删除', '/mp/transport', 4), +(27, '2021-07-08 14:22:57', '2021-07-23 11:25:12', 271, 1, 'shop:shopDetail:save', '基本信息保存', '/m/apply_shop/shop_detail/storage', 2), +(28, '2021-07-08 14:23:31', '2021-07-08 16:50:46', 154, 1, 'marketing:discount:update', '编辑', '/mp/discount', 3), +(29, '2021-07-08 14:25:24', '2023-11-14 14:42:30', 271, 1, 'shop:shopCompany:save', '工商信息保存', '/m/shop_company_auditing/apply_change_company_info', 2), +(30, '2021-07-08 14:27:33', '2021-07-08 15:10:10', 271, 1, 'shop:shopBankCard:update', '变更当前收款账户', '/m/apply_shop/shop_bank_card', 3), +(31, '2021-07-08 14:28:02', '2021-07-08 14:28:09', 154, 1, 'marketing:discount:delete', '删除', '/mp/discount', 4), +(32, '2021-07-08 14:29:18', '2021-07-08 15:09:57', 271, 1, 'shop:shopUser:update', '设置主账号', '/m/apply_shop/shop_bank_card/set_primary', 3), +(33, '2021-07-08 14:29:56', '2021-07-08 15:09:49', 271, 1, 'shop:shopUser:delete', '删除账号', '/m/apply_shop/shop_bank_card', 4), +(34, '2021-07-08 14:31:10', '2021-07-09 11:20:10', 154, 1, 'marketing:discount:waitAudit', '等待审核', '/mp/discount/get_offline_handle_event', 2), +(35, '2021-07-08 14:33:22', '2021-07-08 16:54:09', 275, 1, 'marketing:group:save', '新增', '/mp/group_activity', 2), +(36, '2021-07-08 14:33:57', '2021-07-08 16:51:12', 275, 1, 'marketing:group:update', '编辑', '/mp/group_activity', 3), +(38, '2021-07-08 14:35:07', '2021-07-08 14:35:07', 275, 1, 'marketing:group:delete', '删除', '/mp/group_activity', 4), +(39, '2021-07-08 14:38:03', '2021-08-03 10:00:13', 275, 1, 'marketing:group:invalid', '失效活动', '/mp/group_activity/invalid', 1), +(40, '2021-07-08 14:39:38', '2021-07-09 11:10:21', 275, 1, 'marketing:group:waitAudit', '等待审核', '/mp/group_activity/get_offline_handle_event', 1), +(41, '2021-07-08 14:39:55', '2021-07-08 14:39:55', 258, 1, 'user:hotSearch:update', '编辑', 'mp/hot_search', 3), +(42, '2021-07-08 14:44:16', '2021-07-08 14:44:16', 258, 1, 'user:hotSearch:save', '新建', '/mp/hot_search', 2), +(43, '2021-07-08 14:45:00', '2021-07-08 14:45:00', 258, 1, 'user:hotSearch:delete', '删除', 'mp/hot_search', 4), +(44, '2021-07-08 14:46:11', '2021-07-08 15:22:31', 146, 1, 'user:indexImg:save', '新建', '/mp/index_img', 2), +(45, '2021-07-08 14:46:45', '2021-07-08 14:46:45', 146, 1, 'user:indexImg:update', '编辑', '/mp/index_img', 3), +(46, '2021-07-08 14:47:07', '2021-07-08 14:47:07', 146, 1, 'user:indexImg:delete', '删除', '/mp/index_img', 4), +(47, '2021-07-08 14:47:54', '2023-11-14 09:56:07', 669, 1, 'user:notice:save', '新建', '/mp/notice', 2), +(48, '2021-07-08 14:48:20', '2023-11-14 09:56:01', 669, 1, 'user:notice:update', '编辑', '/mp/notice', 3), +(49, '2021-07-08 14:48:38', '2023-11-14 09:55:55', 669, 1, 'user:notice:delete', '删除', '/mp/notice', 4), +(50, '2021-07-08 14:49:46', '2023-11-14 11:06:09', 665, 1, 'shop:shopWallet:detail', '交易详情', '/mp/order_item/get_order_detail', 1), +(51, '2021-07-08 14:54:35', '2021-08-19 14:16:41', 148, 1, 'order:order:sold', '导出', '/mp/order/sold_excel', 1), +(52, '2021-07-08 15:01:05', '2021-08-19 14:16:33', 148, 1, 'order:order:info', '订单详情', '/mp/order/order_info/*', 1), +(53, '2021-07-08 15:05:07', '2021-08-19 14:15:42', 148, 1, 'order:order:logistics', '修改物流', '/mp/order_delivery/update', 3), +(54, '2021-07-08 15:06:29', '2021-08-19 14:15:32', 148, 1, 'order:order:delivery', '发货', '/mp/order/delivery', 2), +(55, '2021-07-08 15:11:05', '2021-08-19 14:15:24', 148, 1, 'order:order:refund', '退款信息', '/mp/order_refund/page', 1), +(56, '2021-07-08 15:15:35', '2021-08-19 14:15:18', 148, 1, 'order:order:amount', '改变金额', '/mp/order/change_amount', 3), +(57, '2021-07-08 15:17:12', '2023-11-14 15:10:33', 665, 1, 'shop:shopWithdrawCash:save', '提现', '/m/shop_withdraw_cash/apply/*', 2), +(58, '2021-07-08 15:21:52', '2021-07-08 15:21:52', 272, 1, 'shop:shopRefundAddr:save', '新建', '/mp/shop_refund_addr', 2), +(59, '2021-07-08 15:23:07', '2021-07-08 15:23:07', 272, 1, 'shop:shopRefundAddr:update', '编辑', '/mp/shop_refund_addr', 3), +(60, '2021-07-08 15:25:03', '2021-07-08 15:25:03', 272, 1, 'shop:shopRefundAddr:delete', '删除', '/mp/shop_refund_addr', 4), +(62, '2021-07-08 16:09:52', '2021-07-08 16:09:52', 149, 1, 'order:refund:refund', '处理退款', '/m/order_refund/info', 1), +(63, '2021-07-08 16:10:15', '2021-07-08 16:10:15', 266, 2, 'delivery:company:save', '新增', '/p/delivery_company', 2), +(64, '2021-07-08 16:14:44', '2021-07-08 16:15:47', 271, 1, 'shop:shopBankCard:save', '新增账号', '/m/apply_shop/shop_bank_card', 2), +(66, '2021-07-08 16:18:34', '2021-07-08 16:20:04', 266, 2, 'delivery:company:edit', '编辑', '/p/delivery_company', 3), +(67, '2021-07-08 16:20:50', '2021-07-08 16:20:57', 266, 2, 'delivery:company:delete', '删除', '/p/delivery_company', 4), +(68, '2021-07-08 16:20:53', '2021-07-08 16:20:53', 152, 1, 'product:spu:edit', '编辑商品', '/mp/spu', 3), +(69, '2021-07-08 16:23:57', '2021-07-08 16:23:57', 152, 1, 'product:spu:prodSale', '上架商品', '/mp/spu/prod_status', 3), +(70, '2021-07-08 16:24:50', '2021-07-08 16:24:50', 152, 1, 'product:spu:prodNotSale', '下架商品', '/mp/spu/prod_status', 3), +(72, '2021-07-08 16:29:11', '2021-07-08 16:29:11', 152, 1, 'product:spu:delete', '删除商品', '/mp/spu', 4), +(73, '2021-07-08 16:35:09', '2021-07-08 16:35:09', 152, 1, 'product:spu:modifyProdName', '编辑商品名称', '/mp/spu/update_spu_data', 3), +(74, '2021-07-08 16:40:52', '2021-07-09 10:53:21', 112, 1, 'multishop:shopUser:update', '编辑', '/m/shop_user', 3), +(78, '2021-07-08 16:41:36', '2021-07-09 10:53:10', 112, 1, 'multishop:shopUser:save', '新增', '/m/shop_user', 2), +(79, '2021-07-08 16:42:20', '2021-07-09 10:52:55', 112, 1, 'multishop:shopUser:delete', '删除', '/m/shop_user', 4), +(80, '2021-07-08 16:42:49', '2021-07-08 16:42:49', 152, 1, 'product:spu:modifyProdPrice', '编辑商品价格', '/mp/spu/update_spu_data', 3), +(81, '2021-07-08 16:44:58', '2021-07-08 16:44:58', 152, 1, 'product:spu:modifyProdStock', '编辑商品库存', '/mp/spu/update_spu_data', 3), +(82, '2021-07-08 16:47:00', '2021-07-08 16:47:56', 134, 1, 'rbac:role:update', '编辑', '/mp/role', 3), +(83, '2021-07-08 16:47:17', '2021-07-08 16:47:17', 152, 1, 'product:spu:modifySeq', '编辑商品序号', '/mp/spu/update_spu_data', 3), +(84, '2021-07-08 16:47:41', '2021-07-08 16:47:41', 134, 1, 'rbac:role:save', '新增', '/mp/role', 2), +(85, '2021-07-08 16:49:10', '2021-07-08 16:49:10', 134, 1, 'rbac:role:delete', '删除', '/mp/role', 4), +(86, '2021-07-08 16:55:31', '2021-07-08 16:55:31', 284, 1, 'resource:img:uploadImg', '上传图片', '/ua/oss/info', 1), +(87, '2021-07-08 17:00:17', '2021-07-08 17:00:17', 284, 1, 'resource:img:saveImgGroup', '新建图片分组', '/mp/attach_file_group', 2), +(88, '2021-07-08 17:03:29', '2021-07-08 17:03:29', 284, 1, 'resource:img:editImgGroup', '编辑图片分组', '/mp/attach_file_group', 3), +(89, '2021-07-08 17:04:33', '2021-07-08 17:04:33', 284, 1, 'resource:img:deleteImgGroup', '删除图片分组', '/mp/attach_file_group', 4), +(91, '2021-07-08 17:08:21', '2021-07-08 17:08:21', 284, 1, 'resource:img:deleteImgs', '批量删除图片', '/m/attach_file/delete_by_ids', 4), +(92, '2021-07-08 17:09:38', '2021-07-08 17:09:38', 284, 1, 'resource:img:deleteImg', '删除图片', '/mp/attach_file', 4), +(93, '2021-07-08 17:23:43', '2021-07-09 08:32:43', 284, 1, 'resource:img:editImg', '编辑图片', '/mp/attach_file/update_file', 3), +(94, '2021-07-08 17:26:00', '2021-08-03 09:52:11', 284, 1, 'resource:img:moveImgs', '批量移动图片', '/m/attach_file/batch_move', 3), +(95, '2021-07-08 17:33:02', '2021-07-08 17:33:02', 285, 1, 'resource:video:uploadVideo', '上传视频', '/ua/oss/info', 1), +(97, '2021-07-08 17:33:55', '2021-07-08 17:33:55', 285, 1, 'resource:video:saveVideoGroup', '新建视频分组', '/mp/attach_file_group', 2), +(99, '2021-07-08 17:35:02', '2021-07-08 17:35:02', 285, 1, 'resource:video:editVideoGroup', '编辑视频分组', '/mp/attach_file_group', 3), +(101, '2021-07-08 17:36:33', '2021-07-08 17:36:33', 285, 1, 'resource:video:deleteVideoGroup', '删除视频分组', '/mp/attach_file_group', 4), +(103, '2021-07-08 17:37:37', '2021-07-08 17:37:37', 285, 1, 'resource:video:deleteVideos', '批量删除图片', '/m/attach_file/delete_by_ids', 4), +(104, '2021-07-08 17:38:21', '2021-07-08 17:38:21', 285, 1, 'resource:video:deleteVideo', '删除视频', '/mp/attach_file', 4), +(105, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 308, 2, 'notify:notifyTemplateTag:save', '新增', '/p/notify_template_tag', 2), +(106, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 308, 2, 'notify:notifyTemplateTag:update', '修改', '/p/notify_template_tag', 3), +(107, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 308, 2, 'notify:notifyTemplateTag:delete', '删除', '/p/notify_template_tag', 4), +(108, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 308, 2, 'notify:notifyTemplateTag:sendMsg', '推送消息', '/p/notify_template_tag/send_msg', 3), +(109, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 304, 2, 'notify:notify:save', '新增', '/p/notify_template', 2), +(110, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 304, 2, 'notify:notify:update', '修改', '/p/notify_template', 3), +(111, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 304, 2, 'notify:notify:delete', '删除', '/p/notify_template', 4), +(112, '2021-07-08 17:43:45', '2023-08-08 14:03:24', 635, 2, 'user:tag:save', '新增', '/p/user_tag', 2), +(113, '2021-07-08 17:43:45', '2023-08-08 14:04:57', 635, 2, 'user:tag:update', '修改', '/p/user_tag', 3), +(114, '2021-07-08 17:43:45', '2023-08-08 14:09:29', 635, 2, 'user:tag:delete', '删除', '/p/user_tag', 4), +(115, '2021-07-08 17:43:45', '2023-08-08 14:05:50', 635, 2, 'user:tag:refresh', '更新', '/p/user_tag/refresh', 1), +(116, '2021-07-08 17:43:45', '2023-08-08 14:03:41', 638, 2, 'user:recharge:save', '新增', '/p/user_recharge', 2), +(117, '2021-07-08 17:43:45', '2023-08-08 14:04:47', 638, 2, 'user:recharge:update', '修改', '/p/user_recharge', 3), +(118, '2021-07-08 17:43:45', '2023-08-08 14:09:15', 638, 2, 'user:recharge:delete', '删除', '/p/user_recharge', 4), +(119, '2021-07-08 17:43:45', '2023-08-08 14:03:48', 639, 2, 'user:rights:save', '新增', '/p/user_rights', 2), +(120, '2021-07-08 17:43:45', '2023-08-08 14:04:40', 639, 2, 'user:rights:update', '修改', '/p/user_rights', 3), +(121, '2021-07-08 17:43:45', '2023-08-08 14:09:07', 639, 2, 'user:rights:delete', '删除', '/p/user_rights', 4), +(122, '2021-07-08 17:43:45', '2023-08-08 14:08:58', 634, 2, 'user:user:info', '会员详情', '/p/user/user_info', 1), +(123, '2021-07-08 17:43:45', '2023-08-08 14:08:51', 634, 2, 'user:user:update', '修改会员信息', '/p/user', 3), +(124, '2021-07-08 17:43:45', '2023-08-08 14:08:43', 634, 2, 'user:user:updateGrowth', '修改会员成长值', '/p/user_level/update_growth', 3), +(125, '2021-07-08 17:43:45', '2023-08-08 14:08:37', 634, 2, 'user:user:updateScore', '修改会员积分', '/p/user_level/batch_user_score', 3), +(126, '2021-07-08 17:43:45', '2023-08-08 14:08:31', 634, 2, 'user:user:modifyBalance', '修改会员余额', '/p/user_recharge/update_user_balance', 3), +(127, '2021-07-08 17:43:45', '2023-08-08 14:08:24', 634, 2, 'user:user:sendCoupons', '赠送优惠券', '/mp/coupon/send_user_coupon', 3), +(128, '2021-07-08 17:43:45', '2023-08-08 14:08:08', 634, 2, 'user:user:tagging', '打标签', '/p/user_tag_user/update_user_Tag', 3), +(129, '2021-07-08 17:43:45', '2023-08-08 14:07:48', 634, 2, 'user:user:import', '用户导入', '/p/user/import_excel', 2), +(130, '2021-07-08 17:43:45', '2023-08-08 14:07:40', 634, 2, 'user:user:export', '导出会员信息', '/p/user/sold_excel', 1), +(131, '2021-07-08 17:43:45', '2023-08-08 14:03:56', 636, 2, 'user:level:save', '新增', '/p/user_level', 2), +(132, '2021-07-08 17:43:45', '2023-08-08 14:04:30', 636, 2, 'user:level:update', '修改', '/p/user_level', 3), +(133, '2021-07-08 17:43:45', '2023-08-08 14:07:10', 636, 2, 'user:level:delete', '删除', '/p/user_level', 4), +(134, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 262, 2, 'platform:shopManage:save', '新增', '/p/shop_detail/create_shop', 2), +(135, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 262, 2, 'platform:shopManage:update', '编辑', '/p/shop_detail', 3), +(137, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 262, 2, 'platform:shopManage:info', '详情', '/p/shop_detail/info', 1), +(138, '2021-07-08 17:43:45', '2023-05-12 15:07:10', 262, 2, 'platform:shopManage:closeStore', '下线店铺', '/p/shop_detail/offline', 3), +(140, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 262, 2, 'platform:shopManage:preferred', '设为/取消优选店铺', '/p/shop_detail/update_shop_preferred', 3), +(141, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 262, 2, 'platform:shopManage:updatePassword', '账号管理', '/p/shop_detail/update_password', 3), +(142, '2021-07-08 17:43:45', '2023-07-05 17:57:03', 262, 2, 'platform:auditShop:audit', '审核', '/p/shop_auditing/audit', 3), +(143, '2021-07-08 17:43:45', '2023-03-24 16:34:00', 305, 2, 'platform:notice:save', '新增', '/mp/notice', 2), +(144, '2021-07-08 17:43:45', '2023-03-24 16:34:00', 305, 2, 'platform:notice:update', '编辑', '/mp/notice', 3), +(145, '2021-07-08 17:43:45', '2023-03-24 16:34:02', 305, 2, 'platform:notice:delete', '删除', '/mp/notice', 4), +(146, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 257, 2, 'platform:indexImg:save', '新增', '/mp/index_img', 2), +(147, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 257, 2, 'platform:indexImg:update', '编辑', '/mp/index_img', 3), +(148, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 257, 2, 'platform:indexImg:delete', '删除', '/mp/index_img', 4), +(149, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 256, 2, 'platform:hotSearch:save', '新增', '/mp/hot_search', 2), +(150, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 256, 2, 'platform:hotSearch:update', '编辑', '/mp/hot_search', 3), +(151, '2021-07-08 17:43:45', '2021-07-08 17:43:45', 256, 2, 'platform:hotSearch:delete', '删除', '/mp/hot_search', 4), +(152, '2021-07-09 08:36:44', '2021-07-09 08:36:44', 285, 1, 'resource:Video:editVideo', '编辑视频', '/mp/attach_file/update_file', 3), +(153, '2021-07-09 08:37:58', '2021-08-03 09:52:30', 285, 1, 'resource:video:moveVideos', '批量移动视频', '/m/attach_file/batch_move', 3), +(154, '2021-07-09 08:53:05', '2021-07-09 09:32:05', 149, 1, 'order:refund:order', '查看订单', '/m/order/order_info/*', 1), +(155, '2021-07-09 09:43:51', '2021-07-09 09:46:33', 149, 1, 'order:refund:page', '列表', '/m/order_refund/page', 1), +(156, '2021-07-09 11:11:56', '2021-07-09 11:11:56', 275, 1, 'marketing:group:auditApply', '申请上架', '/mp/group_activity/audit_apply', 2), +(157, '2021-07-09 11:19:38', '2021-07-09 11:19:38', 154, 1, 'marketing:discount:auditApply', '申请上线', '/mp/discount/audit_apply', 2), +(158, '2021-07-12 19:30:09', '2021-07-12 19:31:56', 254, 2, 'platform:coupon:save', '新增', '/mp/coupon', 2), +(159, '2021-07-12 19:31:34', '2021-07-12 19:31:49', 254, 2, 'platform:coupon:update', '编辑', '/mp/coupon', 3), +(160, '2021-07-12 19:34:03', '2021-07-12 19:34:03', 254, 2, 'platform:coupon:delete', '删除', '/mp/coupon', 4), +(161, '2021-07-12 19:37:20', '2021-07-12 19:37:20', 233, 2, 'shop:coupon:offline', '下线', '/mp/coupon/offline', 2), +(162, '2021-07-12 19:38:49', '2021-07-12 19:39:23', 233, 2, 'shop:coupon:offline:manage', '下线管理', '/mp/coupon/get_offline_handle_event/*', 1), +(163, '2021-07-12 19:40:29', '2021-07-12 19:40:52', 233, 2, 'shop:coupon:audit', '审核', '/mp/coupon/audit', 2), +(164, '2021-07-12 19:44:41', '2021-07-12 19:55:23', 270, 2, 'marketing:discount:offline', '下线', '/mp/discount/offline', 2), +(165, '2021-07-12 19:45:21', '2021-07-12 19:55:17', 270, 2, 'marketing:discount:audit', '审核', '/mp/discount/audit', 2), +(166, '2021-07-12 19:46:39', '2021-07-12 19:55:13', 177, 2, 'marketing:discount:info', '查看', '/mp/discount/info/*', 1), +(167, '2021-07-12 19:50:27', '2021-07-12 19:50:27', 233, 2, 'shop:coupon:info', '查看', '/mp/coupon', 1), +(168, '2021-07-12 19:56:58', '2021-07-12 19:58:59', 278, 2, 'marketing:group:info', '查看', '/mp/group_activity', 1), +(169, '2021-07-12 19:58:36', '2021-07-12 19:58:48', 278, 2, 'marketing:group:audit', '审核', '/mp/group_activity/audit', 2), +(170, '2021-07-12 20:00:00', '2021-07-12 20:00:00', 278, 2, 'marketing:group:offline', '下线', '/mp/group_activity/offline', 2), +(171, '2021-07-12 20:04:08', '2021-07-12 20:06:02', 171, 2, 'order:order:refund:info', '退款信息', '/p/order/order_info/*', 1), +(172, '2021-07-12 20:04:26', '2021-07-12 20:05:26', 171, 2, 'order:order:info', '查看详情', '/p/order_refund/page', 1), +(173, '2021-07-12 20:08:23', '2021-07-12 20:08:23', 172, 2, 'order:refund:order:info', '查看订单', '/p/order/order_info/*', 1), +(174, '2021-07-12 20:09:00', '2021-07-12 20:09:00', 172, 2, 'order:refund:info', '查看退款', '/p/order_refund/info/*', 1), +(175, '2021-07-12 20:11:57', '2021-07-12 20:11:57', 281, 2, 'seckill:time:save', '保存秒杀配置', '/p/seckill_time', 2), +(176, '2021-07-12 20:12:40', '2021-10-13 09:03:28', 281, 2, 'seckill:cateogry:save', '新增秒杀分类', '/mp/seckill_category', 2), +(177, '2021-07-12 20:13:01', '2021-07-12 20:14:31', 281, 2, 'seckill:cateogry:update', '修改秒杀分类', '/mp/seckill_category', 3), +(178, '2021-07-12 20:14:01', '2021-07-12 20:14:01', 281, 2, 'seckill:cateogry:delete', '删除秒杀分类', '/mp/seckill_category', 4), +(179, '2021-07-12 20:15:59', '2021-07-12 20:27:53', 281, 2, 'seckill:seckill:info', '详情', '/mp/seckill', 1), +(180, '2021-07-12 20:22:39', '2021-07-12 20:27:24', 281, 2, 'seckill:seckill:offline', '下线秒杀活动', '/mp/seckill/offline', 2), +(181, '2021-07-12 20:23:17', '2021-07-12 20:27:34', 281, 2, 'seckill:seckill:audit', '审核秒杀活动', '/mp/seckill/audit', 2), +(240, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 264, 2, 'product:spuTag:save', '新增', '/p/spu_tag', 2), +(241, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 264, 2, 'product:spuTag:update', '编辑', '/p/spu_tag', 3), +(242, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 264, 2, 'product:spuTag:addProdForTag', '商品管理', '/p/spu_tag_reference/add_prod_for_tag', 2), +(243, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 264, 2, 'product:spuTag:delete', '删除', '/p/spu_tag', 4), +(244, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 160, 2, 'product:attr:save', '新增', '/mp/attr', 2), +(245, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 160, 2, 'product:attr:update', '修改', '/mp/attr', 3), +(246, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 160, 2, 'product:attr:delete', '删除', '/mp/attr', 4), +(247, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 161, 2, 'product:brand:save', '新增', '/p/brand', 2), +(248, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 161, 2, 'product:brand:update', '修改', '/p/brand', 3), +(249, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 161, 2, 'product:brand:updateStatus', '更新品牌状态', '/p/brand/update_brand_status', 3), +(250, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 161, 2, 'product:brand:delete', '删除', '/p/brand', 4), +(251, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 162, 2, 'product:category:save', '新增', '/mp/category', 2), +(252, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 162, 2, 'product:category:update', '修改', '/mp/category', 3), +(253, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 162, 2, 'product:category:updateStatus', '上下架', '/mp/category/category_enable_or_disable', 3), +(254, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 162, 2, 'product:category:delete', '删除', '/mp/category', 4), +(255, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 175, 2, 'product:spu:offline', '下架商品', '/mp/spu/offline', 2), +(256, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 175, 2, 'product:spu:audit', '下架管理', '/mp/spu/audit', 2), +(257, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 175, 2, 'product:spu:prodStatus', '修改商品状态', '/mp/spu/prod_status', 3), +(258, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 175, 2, 'product:spu:delete', '删除', '/mp/spu', 4), +(259, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 313, 2, 'resource:file:save', '上传文件', '/mp/attach_file', 2), +(260, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 313, 2, 'resource:file:update', '修改文件', '/mp/attach_file/update_file', 3), +(261, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 313, 2, 'resource:file:batchMove', '批量移动', '/p/attach_file/batch_move', 3), +(262, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 313, 2, 'resource:file:delete', '删除文件', '/p/attach_file/delete_by_ids', 4), +(263, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 313, 2, 'resource:fileGroup:save', '新建分组', '/mp/attach_file_group', 2), +(264, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 313, 2, 'resource:fileGroup:update', '修改分组', '/mp/attach_file_group', 3), +(265, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 313, 2, 'resource:fileGroup:delete', '删除分组', '/mp/attach_file_group', 4), +(266, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 314, 2, 'resource:videoFile:save', '上传文件', '/mp/attach_file', 2), +(267, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 314, 2, 'resource:videoFile:update', '修改文件', '/mp/attach_file/update_file', 3), +(268, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 314, 2, 'resource:videoFile:batchMove', '批量移动', '/p/attach_file/batch_move', 3), +(269, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 314, 2, 'resource:videoFile:delete', '删除文件', '/p/attach_file/delete_by_ids', 4), +(270, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 314, 2, 'resource:videoFileGroup:save', '新建分组', '/mp/attach_file_group', 2), +(271, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 314, 2, 'resource:videoFileGroup:update', '修改分组', '/mp/attach_file_group', 3), +(272, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 314, 2, 'resource:videoFileGroup:delete', '删除分组', '/mp/attach_file_group', 4), +(273, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 326, 2, 'finance:shopWithdrawCash:audit', '审核', '/p/shop_withdraw_cash/audit', 3), +(274, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 156, 2, 'platform:sysUser:save', '新增', '/p/sys_user', 2), +(275, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 156, 2, 'platform:sysUser:update', '修改', '/p/sys_user', 3), +(276, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 156, 2, 'platform:account:save', '设置账号', '/p/sys_user/account', 2), +(277, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 156, 2, 'platform:account:update', '修改账号', '/p/sys_user/account', 3), +(278, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 156, 2, 'platform:sysUser:delete', '删除', '/p/sys_user', 4), +(279, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 157, 2, 'rbac:role:save', '新增', '/mp/role', 2), +(280, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 157, 2, 'rbac:role:update', '修改', '/mp/role', 3), +(281, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 157, 2, 'rbac:role:delete', '删除', '/mp/role', 4), +(282, '2021-07-14 13:43:14', '2023-05-10 10:53:56', 158, 2, 'rbac:shopMenu:save', '商家端菜单-新增', '/mp/menu', 2), +(283, '2021-07-14 13:43:14', '2023-05-10 10:53:45', 158, 2, 'rbac:shopMenu:update', '商家端菜单-修改', '/mp/menu', 3), +(284, '2021-07-14 13:43:14', '2023-05-10 10:53:38', 158, 2, 'rbac:shopMenu:delete', '商家端菜单-删除', '/mp/menu', 4), +(285, '2021-07-14 13:43:14', '2023-05-10 10:53:24', 158, 2, 'rbac:menu:save', '平台端菜单-新增', '/mp/menu', 2), +(286, '2021-07-14 13:43:14', '2023-05-10 10:53:17', 158, 2, 'rbac:menu:update', '平台端菜单-修改', '/mp/menu', 3), +(287, '2021-07-14 13:43:14', '2023-05-10 11:00:04', 158, 2, 'rbac:menu:delete', '平台端菜单-删除', '/mp/menu', 4), +(288, '2021-07-14 13:43:14', '2023-05-10 10:51:24', 159, 2, 'rbac:shopMenuPermission:save', '商家菜单资源-新增', '/mp/menu_permission', 2), +(289, '2021-07-14 13:43:14', '2023-05-10 10:51:14', 159, 2, 'rbac:shopMenuPermission:update', '商家菜单资源-修改', '/mp/menu_permission', 3), +(290, '2021-07-14 13:43:14', '2023-05-10 10:51:06', 159, 2, 'rbac:shopMenuPermission:delete', '商家菜单资源-删除', '/mp/menu_permission', 4), +(291, '2021-07-14 13:43:14', '2023-05-10 10:52:46', 159, 2, 'rbac:menuPermission:save', '平台菜单资源-新增', '/mp/menu_permission', 2), +(292, '2021-07-14 13:43:14', '2023-05-10 10:52:40', 159, 2, 'rbac:menuPermission:update', '平台菜单资源-修改', '/mp/menu_permission', 3), +(293, '2021-07-14 13:43:14', '2023-05-10 10:52:35', 159, 2, 'rbac:menuPermission:delete', '平台菜单资源-删除', '/mp/menu_permission', 4), +(294, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 167, 2, 'system:addr:save', '新增', '/p/area', 2), +(295, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 167, 2, 'system:addr:update', '修改', '/p/area', 3), +(296, '2021-07-14 13:43:14', '2021-07-14 13:43:14', 167, 2, 'system:addr:delete', '删除', '/p/area', 4), +(297, '2021-07-22 08:58:06', '2021-08-19 14:15:09', 148, 1, 'order:delivery:getExcel', '批量发货', '/mp/order/un_delivery_sold_excel', 1), +(298, '2021-07-23 16:19:23', '2021-07-23 16:19:23', 175, 2, 'product:spu:top', '置顶商品', '/p/spu/to_top', 3), +(299, '2021-07-23 16:20:18', '2021-07-23 16:20:18', 175, 2, 'product:spu:unTop', '取消置顶商品', '/p/spu/to_top', 3), +(300, '2021-07-23 16:23:41', '2021-07-23 16:23:41', 271, 1, 'shop:shopDetail:applyOnline', '店铺申请上线', '/m/apply_shop/shop_detail/audit_apply', 3), +(301, '2021-07-23 16:43:30', '2021-07-23 16:43:30', 175, 2, 'product:spu:editWaterSoldNum', '修改注水销量', '/p/spuExtension/water_sold_num', 3), +(302, '2021-07-27 10:48:31', '2023-08-08 14:07:26', 636, 2, 'user:level:updateRecruitStatus', '修改招募状态', '/p/user_level/recruit_status', 3), +(303, '2021-08-03 10:48:15', '2021-08-03 10:49:36', 271, 1, 'shop:shopUser:notmain', '取消主账号', '/m/apply_shop/shop_bank_card/set_not_primary', 3), +(304, '2021-08-03 11:20:24', '2023-11-14 11:10:12', 665, 1, 'shop:shopCash:cashInfo', '提现详情', '/mp/shop_withdraw_cash/info', 1), +(305, '2021-08-04 13:21:07', '2021-08-04 13:21:07', 152, 1, 'product:spu:applyOnline', '申请上线', '/mp/spu/audit_apply', 2), +(306, '2021-08-04 13:22:51', '2021-08-04 13:23:12', 152, 1, 'product:spu:viewAudit', '查看审核信息', '/mp/spu/get_offline_handle_event/*', 1), +(313, '2021-08-09 14:37:23', '2021-08-09 14:37:23', 334, 1, 'order:get:info', '查看订单', '/m/order/order_info', 1), +(314, '2021-08-09 14:45:42', '2021-08-09 15:08:43', 334, 1, 'order:orderInvoice:update', '编辑', '/m/order_invoice', 1), +(315, '2021-08-09 14:49:18', '2021-08-09 15:08:54', 334, 1, 'order:orderInvoice:commit', '确定', '/m/order_invoice', 3), +(316, '2021-08-09 15:07:29', '2021-08-09 15:10:09', 334, 1, 'order:orderInvoice:upload', '确定上传', '/m/attach_file/save_pdf_file', 2), +(317, '2021-08-25 09:44:18', '2023-03-24 16:33:16', 360, 2, 'distribution:msg:save', '新建', '/p/distribution_msg', 2), +(318, '2021-08-25 09:45:40', '2023-03-24 16:33:17', 360, 2, 'distribution:msg:update', '编辑', '/p/distribution_msg', 3), +(319, '2021-08-25 09:46:14', '2023-03-24 16:33:17', 360, 2, 'distribution:msg:delete', '删除', '/p/distribution_msg', 4), +(320, '2021-08-25 09:46:47', '2023-03-24 16:33:19', 360, 2, 'distribution:msg:deleteBatch', '批量删除', '/p/distribution_msg', 4), +(321, '2021-08-25 10:11:52', '2023-03-24 16:32:37', 359, 2, 'distribution:user:update', '修改状态', '/p/distribution_user/update_state', 3), +(322, '2021-08-25 10:22:54', '2023-03-24 16:29:06', 363, 2, 'distribution:distributionUserWallet:update', '修改分销钱包', '/p/distribution_user_wallet', 3), +(323, '2021-08-25 10:25:14', '2023-03-24 16:29:07', 363, 2, 'distribution:distributionWithdrawCash:updateToSuccess', '设为已提现', '/p/distribution_withdraw_cash/to_success', 3), +(324, '2021-08-25 10:35:39', '2023-03-24 16:32:38', 359, 2, 'distribution:auditing:update', '审核', '/p/distribution_auditing', 3), +(325, '2021-08-25 11:01:52', '2022-01-24 17:14:17', 364, 1, 'marketing:distributionSpu:save', '新建分销商品', '/mall4cloud_distribution/m/distribution_spu', 2), +(326, '2021-08-25 11:03:40', '2022-01-24 17:14:04', 364, 1, 'marketing:distributionSpu:edit', '更新分销商品', '/mall4cloud_distribution/m/distribution_spu', 3), +(327, '2021-08-25 11:04:38', '2022-01-24 17:13:43', 364, 1, 'marketing:distributionSpu:putShelf', '上架分销商品', '/mall4cloud_distribution/m/distribution_spu/update_state', 3), +(328, '2021-08-25 11:05:11', '2022-01-24 17:13:34', 364, 1, 'marketing:distributionSpu:offShelf', '下架分销商品', '/mall4cloud_distribution/m/distribution_spu/update_state', 3), +(329, '2021-08-25 11:06:02', '2022-01-24 17:13:25', 364, 1, 'marketing:distributionSpu:applyOnline', '申请上线分销商品', '/mall4cloud_distribution/m/distribution_spu/audit_apply', 3), +(330, '2021-08-25 11:08:25', '2022-01-24 17:13:16', 364, 1, 'marketing:distributionSpu:delete', '删除分销商品', '/mall4cloud_distribution/m/distribution_spu', 4), +(334, '2021-08-19 13:29:27', '2023-08-08 14:02:09', 641, 2, 'score:order:info', '查看详情', '/mp/order/order_info/*', 1), +(335, '2021-08-19 13:31:02', '2023-08-08 14:02:24', 641, 2, 'score:order:delivery', '发货', '/mp/order/delivery', 2), +(336, '2021-08-19 13:31:38', '2023-08-08 14:02:40', 641, 2, 'score:order:logistics', '修改物流', '/mp/order_delivery/update', 3), +(337, '2021-08-19 13:37:54', '2023-08-08 14:00:59', 646, 2, 'score:attr:save', '新增', '/mp/attr', 2), +(338, '2021-08-19 13:39:31', '2023-08-08 14:01:11', 646, 2, 'score:attr:update', '修改', '/mp/attr', 3), +(339, '2021-08-19 13:40:10', '2023-08-08 14:01:30', 646, 2, 'score:attr:delete', '删除', '/mp/attr', 4), +(340, '2021-08-19 13:44:11', '2023-08-08 14:01:50', 642, 2, 'score:spu:save', '发布商品', '/mp/spu', 2), +(341, '2021-08-19 13:47:21', '2023-08-08 13:58:39', 643, 2, 'score:spu:prodSale', '上架商品', '/mp/spu/prod_status', 3), +(342, '2021-08-19 13:48:01', '2023-08-08 13:59:05', 643, 2, 'score:spu:prodNotSale', '下架商品', '/mp/spu/prod_status', 3), +(343, '2021-08-19 13:49:35', '2023-08-08 13:59:24', 643, 2, 'score:spu:modifyProdName', '编辑商品名称', '/mp/spu/update_spu_data', 3), +(344, '2021-08-19 13:50:12', '2023-08-08 13:59:47', 643, 2, 'score:spu:modifyProdPrice', '编辑商品价格', '/mp/spu/update_spu_data', 3), +(345, '2021-08-19 13:51:25', '2023-08-08 13:59:57', 643, 2, 'score:spu:modifyProdStock', '编辑商品库存', '/mp/spu/update_spu_data', 3), +(346, '2021-08-19 13:53:52', '2023-08-08 14:00:10', 643, 2, 'score:spu:modifySeq', '编辑商品序号', '/mp/spu/update_spu_data', 3), +(347, '2021-08-19 13:55:34', '2023-08-08 13:55:23', 643, 2, 'score:spu:edit', '编辑商品', '/mp/spu', 3), +(348, '2021-08-19 13:56:13', '2023-08-08 14:00:25', 643, 2, 'score:spu:delete', '删除商品', '/mp/spu', 3), +(350, '2022-01-04 15:44:47', '2022-01-04 15:44:47', 366, 2, 'message:message:view', '客服', '/p/im/conversations', 1), +(351, '2022-01-04 15:48:55', '2022-01-04 15:48:55', 367, 1, 'shop:message:view', '消息盒子', '/m/im/conversations', 1), +(352, '2022-08-03 14:10:02', '2022-08-03 14:10:02', 425, 2, 'platform:webConfig:save', '新建网站配置', '/p/web_config/operate', 2), +(353, '2022-08-03 14:10:24', '2022-09-26 17:56:16', 425, 2, 'platform:webConfig:update', '修改网站配置', '/p/web_config/save', 2), +(354, '2022-08-03 14:10:51', '2022-08-03 14:10:51', 425, 2, 'platform:webConfig:delete', '删除网站配置', '/p/web_config/operate', 4), +(355, '2022-08-05 09:37:20', '2022-08-05 09:39:30', 508, 3, 'product:spu:viewAudit', '查看审核信息', '/s/spu/get_offline_handle_event/*', 1), +(356, '2022-08-05 09:37:46', '2022-08-05 09:40:11', 508, 3, 'product:spu:applyOnline', '申请上线', '/s/spu/audit_apply', 2), +(357, '2022-08-05 09:41:48', '2023-11-15 16:26:15', 667, 3, 'shop:shopCash:cashInfo', '提现详情', '/sp/supplier_withdraw_cash/info', 1), +(358, '2022-08-05 09:43:40', '2022-08-05 09:46:09', 503, 3, 'shop:shopUser:notmain', '取消主账号', '/s/apply_supplier/supplier_bank_card/set_not_primary', 3), +(359, '2022-08-05 09:45:58', '2022-08-05 09:45:58', 503, 3, 'shop:shopDetail:applyOnline', '店铺申请上线', '/s/apply_supplier/supplier_detail/audit_apply', 3), +(362, '2022-08-05 10:28:08', '2022-08-05 11:44:36', 478, 3, 'order:delivery:getExcel', '批量发货', '/s/order/un_delivery_sold_excel', 1), +(366, '2022-08-05 10:29:40', '2022-08-05 11:44:42', 479, 3, 'purchaseOrder:delivery:getExcel', '批量发货', '/s/purchase/order/un_delivery_sold_excel', 1), +(367, '2022-08-05 10:32:55', '2022-08-05 10:53:48', 480, 3, 'order:refund:page ', '列表', '/s/order_refund/page', 1), +(368, '2022-08-05 10:36:01', '2022-08-05 10:36:01', 480, 3, 'order:refund:order', '查看订单', '/s/order_refund/info/*', 1), +(369, '2022-08-05 10:37:15', '2022-08-05 10:54:01', 489, 3, 'resource:video:moveVideos', '批量移动视频', '/s/attach_file/batch_move', 3), +(370, '2022-08-05 10:38:41', '2022-08-05 10:38:46', 489, 3, 'resource:Video:editVideo', '编辑视频', '/mp/attach_file/update_file', 3), +(371, '2022-08-05 10:45:02', '2022-08-05 10:45:02', 489, 3, 'resource:video:deleteVideo', '删除视频', '/mp/attach_file', 4), +(372, '2022-08-05 10:47:20', '2022-08-05 10:47:20', 489, 3, 'resource:video:deleteVideos', '批量删除视频', '/s/attach_file/delete_by_ids', 4), +(373, '2022-08-05 10:50:13', '2022-08-05 10:50:13', 489, 3, 'resource:video:deleteVideoGroup', '删除视频分组', '/mp/attach_file_group', 4), +(374, '2022-08-05 10:51:18', '2022-08-05 10:54:13', 489, 3, 'resource:video:editVideoGroup', '编辑视频分组', '/mp/attach_file_group', 3), +(378, '2022-08-05 10:53:00', '2022-08-05 10:54:29', 489, 3, 'resource:video:saveVideoGroup', '新建视频分组', '/mp/attach_file_group', 2), +(379, '2022-08-05 10:55:33', '2022-08-05 10:55:33', 489, 3, 'resource:video:uploadVideo', '上传视频', '/ua/oss/info', 1), +(380, '2022-08-05 10:56:35', '2022-08-05 10:56:35', 488, 3, 'resource:img:moveImgs', '批量移动图片', '/s/attach_file/batch_move', 3), +(381, '2022-08-05 10:57:27', '2022-08-05 10:57:27', 488, 3, 'resource:img:editImg', '编辑图片', '/mp/attach_file/update_file', 3), +(382, '2022-08-05 10:59:25', '2022-08-05 10:59:25', 488, 3, 'esource:img:deleteImg', '删除图片', '/mp/attach_file', 4), +(383, '2022-08-05 11:00:16', '2022-08-05 11:00:16', 488, 3, 'resource:img:deleteImgs', '批量删除图片', '/s/attach_file/delete_by_ids', 4), +(384, '2022-08-05 11:00:43', '2022-08-05 11:00:43', 488, 3, 'resource:img:deleteImgGroup', '删除图片分组', '/mp/attach_file_group', 4), +(386, '2022-08-05 11:02:27', '2022-08-05 11:02:40', 488, 3, 'resource:img:editImgGroup', '编辑图片分组', '/mp/attach_file_group', 3), +(387, '2022-08-05 11:03:35', '2022-08-05 11:03:35', 488, 3, 'resource:img:saveImgGroup', '新建图片分组', '/mp/attach_file_group', 2), +(388, '2022-08-05 11:04:18', '2022-08-05 11:04:18', 488, 3, 'resource:img:uploadImg', '上传图片', '/ua/oss/info', 1), +(389, '2022-08-05 11:05:28', '2022-08-05 11:05:34', 486, 3, 'rbac:role:delete', '删除', '/mp/role', 4), +(390, '2022-08-05 11:06:23', '2022-08-05 11:11:27', 486, 3, 'rbac:role:save', '新增', '/mp/role', 2), +(391, '2022-08-05 11:07:58', '2022-08-05 11:07:58', 508, 3, 'product:spu:modifySeq', '编辑商品序号', '/s/spu/update_spu_data', 3), +(392, '2022-08-05 11:09:12', '2022-08-05 11:09:16', 486, 3, 'rbac:role:update', '编辑', '/mp/role', 3), +(393, '2022-08-05 11:10:00', '2022-08-05 11:10:00', 508, 3, 'product:spu:modifyProdStock', '编辑商品库存', '/s/spu/update_spu_data', 3), +(394, '2022-08-05 11:10:45', '2022-08-05 11:10:45', 508, 3, 'product:spu:modifyProdPrice', '编辑商品价格', '/s/spu/update_spu_data', 3), +(395, '2022-08-05 11:16:03', '2022-08-05 11:16:03', 485, 3, 'multishop:shopUser:delete', '删除', '/s/supplier_user', 4), +(396, '2022-08-05 11:16:48', '2022-08-05 11:16:48', 485, 3, 'multishop:shopUser:save', '新增', '/s/supplier_user', 2), +(397, '2022-08-05 11:17:30', '2022-08-05 11:17:30', 485, 3, 'multishop:shopUser:update', '编辑', '/s/supplier_user', 3), +(398, '2022-08-05 11:18:55', '2022-08-05 11:18:55', 508, 3, 'product:spu:modifyProdName', '编辑商品名称', '/s/spu/update_spu_data', 3), +(399, '2022-08-05 11:20:32', '2022-08-05 11:27:23', 508, 3, 'product:spu:delete', '删除商品', 's/spu/batch', 4), +(400, '2022-08-05 11:21:22', '2022-08-05 11:21:22', 508, 3, 'product:spu:prodNotSale', '下架商品', '/s/spu/prod_status', 3), +(401, '2022-08-05 11:22:44', '2022-08-05 11:22:44', 508, 3, 'product:spu:prodSale', '上架商品', '/s/spu/prod_status', 3), +(402, '2022-08-05 11:27:09', '2022-08-05 11:28:03', 508, 3, 'product:spu:batchDelete', '批量删除', 's/spu/batch', 4), +(403, '2022-08-05 11:29:29', '2022-08-05 11:29:29', 508, 3, 'product:spu:edit', '编辑商品', '/s/spu', 3), +(404, '2022-08-05 11:32:41', '2022-08-05 11:32:41', 503, 3, 'shop:shopBankCard:save', '新增账号', '/s/apply_supplier/supplier_bank_card', 2), +(405, '2022-08-05 11:34:03', '2022-08-05 11:34:03', 480, 3, 'order:refund:refund', '处理退款', '/s/order_refund/info', 1), +(406, '2022-08-05 11:35:13', '2023-11-15 10:00:59', 463, 3, 'shop:shopRefundAddr:delete', '删除', '/s/supplier_refund_addr', 4), +(407, '2022-08-05 11:35:46', '2023-11-15 10:00:52', 463, 3, 'shop:shopRefundAddr:update', '编辑', '/s/supplier_refund_addr', 3), +(408, '2022-08-05 11:36:28', '2023-11-15 10:00:48', 463, 3, 'shop:shopRefundAddr:save', '新建', '/s/supplier_refund_addr', 2), +(409, '2022-08-05 11:38:22', '2023-11-15 10:42:41', 667, 3, 'shop:shopWithdrawCash:save', '提现', '/s/supplier_withdraw_cash/apply', 2), +(410, '2022-08-05 11:41:41', '2022-08-05 11:41:55', 478, 3, 'order:order:amount', '改变金额', '/s/order/change_amount', 3), +(411, '2022-08-05 11:44:22', '2022-08-05 11:44:22', 478, 3, 'order:order:refund', '退款信息', '/s/order_refund/page', 1), +(413, '2022-08-05 11:45:17', '2022-08-05 11:46:57', 479, 3, 'purchaseOrder:order:refund', '退款信息', '/s/order_refund/page', 1), +(414, '2022-08-05 11:48:49', '2022-08-05 11:48:49', 478, 3, 'order:order:delivery', '发货', '/s/order/delivery', 2), +(415, '2022-08-05 11:51:28', '2022-08-05 11:51:28', 479, 3, 'purchaseOrder:order:delivery', '发货', '/s/order/delivery', 2), +(416, '2022-08-05 14:28:23', '2022-08-05 14:28:23', 478, 3, 'order:order:logistics', '修改物流', '/mp/order_delivery/update', 3), +(417, '2022-08-05 14:31:26', '2022-08-05 14:31:33', 502, 3, 'order:order:info', '订单详情', '/mp/order/order_info/*', 1), +(418, '2022-08-05 14:32:22', '2023-04-03 15:22:30', 496, 3, 'purchaseOrder:order:info', '订单详情', '/s/purchase/order/info/*', 1), +(419, '2022-08-05 14:35:30', '2022-08-05 14:35:30', 478, 3, 'order:order:sold', '导出', '/s/order/sold_excel', 1), +(420, '2022-08-05 14:36:20', '2022-08-05 14:36:20', 479, 3, 'purchaseOrder:order:sold', '导出', '/s/purchase/order/sold_excel', 1), +(421, '2022-08-05 14:58:14', '2023-11-15 16:25:50', 667, 3, 'shop:shopWallet:page', '交易详情', '/mp/order_item/get_order_detail', 1), +(422, '2022-08-05 15:02:45', '2022-08-05 15:02:45', 503, 3, 'shop:shopUser:delete', '删除账号', '/s/apply_supplier/supplier_bank_card', 4), +(423, '2022-08-05 15:06:35', '2022-08-05 15:06:35', 503, 3, 'shop:shopUser:update', '设置主账号', '/s/apply_supplier/supplier_bank_card/set_primary', 3), +(424, '2022-08-05 15:54:41', '2022-08-05 15:54:41', 503, 3, 'shop:shopBankCard:update', '变更当前收款账户', '/s/apply_supplier/supplier_bank_card', 3), +(425, '2022-08-05 15:55:38', '2022-08-05 15:55:38', 503, 3, 'shop:shopCompany:save', '工商信息保存', '/s/apply_supplier/supplier_company/storage', 2), +(426, '2022-08-05 15:56:26', '2022-08-05 15:56:26', 503, 3, 'shop:shopDetail:save', '基本信息保存', '/s/apply_supplier/supplier_detail/storage', 2), +(427, '2022-08-05 16:01:10', '2022-08-05 16:01:10', 477, 3, 'user:transport:delete', '删除', '/mp/transport', 4), +(428, '2022-08-05 16:02:57', '2022-08-05 16:02:57', 477, 3, 'user:transport:save', '新增', '/mp/transport', 2), +(429, '2022-08-05 16:03:23', '2022-08-05 16:03:23', 477, 3, 'user:transport:update', '编辑', '/mp/transport', 3), +(430, '2022-08-05 16:10:32', '2022-08-05 16:10:32', 508, 3, 'product:spu:upload', '导入商品', '/s/spu/export_excel', 2), +(431, '2022-08-05 16:12:12', '2022-08-05 16:12:12', 508, 3, 'product:spu:soldExcel', '导出商品', '/s/spu/sold_excel', 1), +(432, '2022-08-05 16:12:55', '2022-08-05 16:12:55', 468, 3, 'product:spu:save', '发布商品', '/s/spu', 2), +(433, '2022-08-05 16:16:35', '2022-08-05 16:16:45', 466, 3, 'product:attr:delete', '删除商品规格', '/s/attr', 4), +(434, '2022-08-05 16:17:21', '2022-08-05 16:18:32', 466, 3, 'product:attr:update', '编辑商品规格', '/s/attr', 3), +(435, '2022-08-05 16:18:02', '2022-08-05 16:19:54', 466, 3, 'product:attr:save', '新增商品规格', '/s/attr', 2), +(439, '2022-08-23 10:05:56', '2022-08-29 11:43:25', 528, 2, 'platform:shopRenovation:savePC', '新增页面', '/mp/shop_renovation/save_pc', 2), +(440, '2022-08-23 10:07:23', '2022-08-29 11:43:27', 528, 2, 'platform:shopRenovation:updateHomePagePC', '设为主页', '/mp/shop_renovation/update_home_status_pc', 3), +(441, '2022-08-23 10:08:06', '2022-08-29 11:43:28', 528, 2, 'platform:shopRenovation:deletePC', '删除', '/mp/shop_renovation/delete_pc', 4), +(442, '2022-08-23 10:09:00', '2022-08-29 11:43:29', 528, 2, 'platform:shopRenovation:updatePC', '修改页面', '/mp/shop_renovation/update_pc', 3), +(443, '2022-08-23 10:09:47', '2022-08-29 11:43:31', 531, 2, 'platform:shopTemplate:savePC', '新增模板', '/mp/shop_template/save_pc', 2), +(444, '2022-08-23 10:10:35', '2022-08-29 11:43:32', 531, 2, 'platform:shopTemplate:updatePC', '编辑模板', '/mp/shop_template/update_pc', 3), +(445, '2022-08-23 10:11:16', '2022-08-29 11:43:34', 531, 2, 'platform:shopTemplate:deletePC', '删除', '/mp/shop_template/delete_pc', 4), +(446, '2022-08-23 10:12:03', '2022-08-29 11:43:35', 531, 2, 'platform:shopTemplate:copyPC', '复制', '/mp/shop_template/copy_pc', 2), +(447, '2022-08-23 10:13:08', '2022-08-29 11:43:37', 533, 2, 'platform:shopRenovation:saveMove', '新增页面', '/mp/shop_renovation/save_h5', 2), +(448, '2022-08-23 10:13:57', '2022-08-29 11:43:39', 533, 2, 'platform:shopRenovation:updateHomePageMove', '设为主页', '/mp/shop_renovation/update_h5_home_status', 3), +(449, '2022-08-23 10:14:30', '2022-08-29 11:43:41', 533, 2, 'platform:shopRenovation:deleteMove', '删除', '/mp/shop_renovation/delete_h5', 4), +(450, '2022-08-23 10:16:57', '2022-08-29 11:43:42', 533, 2, 'platform:shopRenovation:updateMove', '修改页面', '/mp/shop_renovation/update_h5', 3), +(451, '2022-08-23 10:17:39', '2022-08-29 11:43:44', 535, 2, 'platform:shopTemplate:saveMove', '新建模板', '/mp/shop_template/save_h5', 2), +(452, '2022-08-23 10:18:20', '2022-08-29 11:43:48', 535, 2, 'platform:shopTemplate:copyMove', '复制', '/mp/shop_template/copy_h5', 2), +(453, '2022-08-23 10:19:28', '2022-08-29 11:43:49', 535, 2, 'platform:shopTemplate:deleteMove', '删除', '/mp/shop_template/delete_h5', 4), +(454, '2022-08-23 10:20:03', '2022-08-29 11:43:51', 535, 2, 'platform:shopTemplate:updateMove', '编辑模板', '/mp/shop_template/update_h5', 3), +(455, '2022-08-23 10:27:33', '2022-08-29 11:43:52', 538, 1, 'shop:shopRenovation:savePC', '新增页面', '/mp/shop_renovation/save_pc', 2), +(456, '2022-08-23 10:28:08', '2022-08-29 11:43:53', 538, 1, 'shop:shopRenovation:updatePC', '修改页面', '/mp/shop_renovation/update_pc', 3), +(457, '2022-08-23 10:28:48', '2022-08-29 11:43:55', 538, 1, 'shop:shopRenovation:deletePC', '删除', '/mp/shop_renovation/delete_pc', 4), +(458, '2022-08-23 10:29:47', '2022-08-29 11:43:58', 538, 1, 'shop:shopRenovation:updateHomePagePC', '设为主页', '/mp/shop_renovation/update_home_status_pc', 3), +(459, '2022-08-23 10:30:32', '2022-08-29 11:43:59', 539, 1, 'shop:shopTemplate:savePC', '新增模板', '/mp/shop_template/save_pc', 2), +(460, '2022-08-23 10:31:08', '2022-08-29 11:44:00', 539, 1, 'shop:shopTemplate:updatePC', '编辑模板', '/mp/shop_template/update_pc', 3), +(461, '2022-08-23 10:31:44', '2022-08-29 11:44:02', 539, 1, 'shop:shopTemplate:copyPC', '复制', '/mp/shop_template/copy_pc', 2), +(462, '2022-08-23 10:32:34', '2022-08-29 11:44:03', 539, 1, 'shop:shopTemplate:deletePC', '删除', '/mp/shop_template/delete_pc', 4), +(463, '2022-08-23 10:33:31', '2022-08-29 11:44:05', 543, 1, 'shop:shopRenovation:saveMove', '新增页面', '/mp/shop_renovation/save_h5', 2), +(464, '2022-08-23 10:34:18', '2022-08-29 11:44:06', 543, 1, 'shop:shopRenovation:updateMove', '修改页面', '/mp/shop_renovation/update_h5', 3), +(465, '2022-08-23 10:34:58', '2022-08-29 11:44:07', 543, 1, 'shop:shopRenovation:deleteMove', '删除', '/mp/shop_renovation/delete_h5', 4), +(466, '2022-08-23 10:35:29', '2022-08-29 11:44:08', 543, 1, 'shop:shopRenovation:updateHomeMove', '设为主页', '/mp/shop_renovation/update_h5_home_status', 3), +(467, '2022-08-23 10:36:39', '2022-08-29 11:44:09', 544, 1, 'shop:shopTemplate:saveMove', '新增模板', '/mp/shop_template/save_h5', 2), +(468, '2022-08-23 10:37:14', '2022-08-29 11:44:11', 544, 1, 'shop:shopTemplate:updateMove', '编辑模板', '/mp/shop_template/update_h5', 3), +(469, '2022-08-23 10:37:45', '2022-08-29 11:44:13', 544, 1, 'shop:shopTemplate:deleteMove', '删除', '/mp/shop_template/delete_h5', 4), +(470, '2022-08-23 10:38:18', '2022-08-29 11:44:14', 544, 1, 'shop:shopTemplate:copyMove', '复制', '/mp/shop_template/copy_h5', 2), +(477, '2023-01-11 10:11:49', '2023-01-11 10:11:49', 583, 2, 'platform:finance:export', '导出报表', '/p/finance/finance_detail_export', 1), +(478, '2023-01-11 10:14:20', '2023-01-11 10:14:20', 316, 2, 'platform:accountDetail:export', '导出收入对账', '/p/account_detail/sold_excel', 1), +(479, '2023-01-11 10:15:08', '2023-01-11 10:15:08', 316, 2, 'platform:accountRefundDetail:export', '导出退款对账', '/p/account_detail/refund_sold_excel', 1), +(480, '2023-01-11 10:18:15', '2023-01-11 10:18:15', 331, 2, 'platform:shopWallet:export', '导出店铺结算报表', '/mp/shop_wallet/get_shop_wallet_log_form', 1), +(481, '2023-01-11 10:19:42', '2023-01-11 10:19:42', 511, 2, 'platform:supplierWallet:export', '导出供应商结算报表', '/mp/supplier_wallet/get_supplier_wallet_log_form', 1), +(482, '2023-01-11 10:22:45', '2023-01-11 10:22:45', 301, 2, 'platform:memberTrend:export', '会员人数趋势导出', '/mp/customer_analysis/member_trend_export', 1), +(483, '2023-01-11 10:25:26', '2023-01-11 10:25:26', 292, 2, 'platform:analysisData:export', '流量总览导出', '/p/flow_analysis/analysis_data_export', 1), +(484, '2023-01-11 10:26:00', '2023-01-11 10:26:00', 292, 2, 'platform:flowTrend:export', '流量趋势导出', '/p/flow_analysis/flow_trend_export', 1), +(485, '2023-01-11 10:26:37', '2023-01-11 10:26:37', 292, 2, 'platform:flowSour:export', '成交转换导出', '/p/flow_analysis/flow_sour_export', 1), +(486, '2023-01-11 10:46:13', '2023-01-11 10:46:13', 293, 2, 'platform:userAnalysis:export', '访问地域分布导出', '/p/user_visit_analysis/user_analysis_data_export', 1), +(487, '2023-01-11 10:48:00', '2023-01-11 10:48:00', 298, 2, 'platform:prodEffect:export', '商品洞察导出', '/p/product_analyse/prod_effect_export', 1), +(488, '2023-01-11 11:06:44', '2023-01-11 11:08:37', 175, 2, 'platform:spu:export', '商品导出', '/p/spu/sold_excel', 2), +(489, '2023-01-11 11:08:32', '2023-01-11 11:08:32', 162, 2, 'platform:category:export', '商品分类导出', '/p/category/sold_excel', 1), +(490, '2023-01-11 11:10:53', '2023-01-11 11:10:53', 139, 1, 'shop:category:export', '商品分类导出', '/mp/category/sold_excel', 1), +(491, '2023-02-09 14:04:09', '2023-02-09 14:04:09', 590, 2, 'platform:form:save', '新增平台报表', '/p/form', 2), +(492, '2023-02-09 14:05:23', '2023-02-09 14:05:23', 590, 2, 'platform:form:update', '编辑平台报表', '/p/form', 3), +(493, '2023-02-09 14:06:25', '2023-02-09 14:06:25', 590, 2, 'platform:form:excel', '导出平台报表', '/p/form/form_excel', 1), +(494, '2023-02-09 14:07:07', '2023-02-09 14:07:07', 590, 2, 'platform:form:delete', '删除平台报表', '/p/form', 4), +(495, '2023-02-09 14:09:57', '2023-04-03 16:30:50', 591, 2, 'platform:form:add', '加入平台报表', '/p/form', 2), +(496, '2023-02-09 14:11:12', '2023-02-09 14:11:12', 592, 2, 'platform:recommend:save', '新建推荐报表', '/p/form', 2), +(497, '2023-02-09 14:11:54', '2023-02-09 14:11:54', 592, 2, 'platform:recommend:update', '编辑推荐报表', '/p/form', 3), +(498, '2023-02-09 14:12:25', '2023-02-09 14:12:25', 592, 2, 'platform:recommend:delete', '删除推荐报表', '/p/form', 4), +(499, '2023-02-09 14:13:35', '2023-02-09 14:15:29', 596, 1, 'shop:form:add', '加入我的报表', '/m/form', 2), +(500, '2023-02-09 14:14:46', '2023-02-09 14:15:24', 595, 1, 'shop:form:save', '新建报表', '/m/form', 2), +(501, '2023-02-09 14:15:19', '2023-02-09 14:15:19', 595, 1, 'shop:form:update', '编辑报表', '/m/form', 3), +(502, '2023-02-09 14:16:25', '2023-02-09 14:17:37', 595, 1, 'shop:form:excel', '导出报表', '/m/form/form_excel', 1), +(503, '2023-02-09 14:17:18', '2023-02-09 14:17:18', 595, 1, 'shop:form:delete', '删除报表', '/m/form', 4), +(504, '2023-02-09 16:47:25', '2023-04-03 17:43:54', 600, 2, 'delivery:station:audit', '门店审核', ' /p/station/auditStation', 2), +(505, '2023-02-09 16:45:57', '2023-04-03 17:41:02', 600, 2, 'delivery:station:offline', '门店下线', '/p/station/offline', 2), +(506, '2023-03-07 14:08:54', '2023-03-07 14:08:54', 148, 1, 'order:virtual:update', '核销', '/m/order_virtual_info/order_write_off_by_order_id', 3), +(507, '2023-03-07 14:07:47', '2023-03-07 14:07:47', 148, 1, 'admin:station:orderItemsDelivery', '提货', '/m/order_self_station/change_status_and_order_station', 3), +(508, '2023-04-03 15:03:43', '2023-04-03 15:03:43', 503, 3, 'shop:shopCategory:save', '新增签约类目', '/mall4cloud_product/s/apply_supplier/category/add_signing_category', 2), +(509, '2023-04-03 15:07:50', '2023-07-18 09:32:57', 503, 3, 'shop:shopBrand:save', '新增签约品牌', '/mall4cloud_product/s/apply_supplier/brand/add_signing_brand', 2), +(511, '2023-04-03 15:59:20', '2023-04-03 16:00:48', 175, 2, 'product:spu:view', '详情', '/mall4cloud_product/mp/spu', 1), +(512, '2023-04-03 16:10:16', '2023-11-14 15:31:33', 530, 2, 'platform:shopRenovation:viewPC', '查看', '/mp/shop_renovation', 1), +(513, '2023-04-03 15:41:19', '2023-04-03 15:41:27', 430, 1, 'inventory:purchaseOrder:putStorage', '入库', '/m/purchase/order/inbound', 3), +(514, '2023-04-03 15:50:03', '2023-04-03 15:50:40', 430, 1, 'inventory:purchaseOrder:delete', '作废', '/m/purchase/order/nullify', 4), +(515, '2023-04-03 15:53:28', '2023-04-03 15:53:28', 430, 1, 'inventory:purchaseOrder:detail', '详情', '/m/purchase/order/info', 1), +(516, '2023-04-03 15:59:36', '2023-04-03 15:59:36', 430, 1, 'inventory:purchaseOrder:accomplish', '完成', '/m/purchase/order/complete', 3), +(517, '2023-04-03 16:06:56', '2023-04-03 16:06:56', 442, 1, 'prod:saleProxyInform:info', '查看', '/mp/spu', 1), +(518, '2023-04-03 16:10:16', '2023-04-03 16:10:16', 442, 1, 'prod:saleProxyInform:edit', '编辑', '/mp/spu', 3), +(519, '2023-04-03 16:18:22', '2023-04-03 16:18:22', 443, 1, 'prod:saleProxyProd:soldOut', '下架', '/mp/spu/prod_status', 3), +(520, '2023-04-03 16:16:18', '2023-04-03 16:18:26', 443, 1, 'prod:saleProxyProd:putaway', '上架', '/mp/spu/prod_status', 3), +(521, '2023-04-03 16:19:32', '2023-04-03 16:19:32', 443, 1, 'prod:saleProxyProd:delete', '删除', '/mp/spu', 4), +(534, '2023-04-04 09:07:20', '2023-04-04 09:07:20', 334, 1, 'order:orderInvoice:info', '查看订单', '/mp/order/order_info', 1), +(535, '2023-04-04 09:30:03', '2023-04-04 09:30:03', 599, 1, 'delivery:station:edit', '编辑', '/m/station', 3), +(536, '2023-04-04 09:31:48', '2023-04-04 09:31:48', 599, 1, 'delivery:station:add', '新建', '/m/station', 2), +(537, '2023-04-04 09:34:07', '2023-07-18 09:32:23', 599, 1, 'delivery:station:editPassword', '重置密码', '/m/station/change_account_info', 3), +(538, '2023-04-04 09:35:45', '2023-04-04 09:35:45', 599, 1, 'delivery:station:apply', '申请上架', '/m/station/audit_apply', 2), +(539, '2023-04-04 09:36:54', '2023-04-04 09:38:00', 599, 1, 'delivery:station:delete', '删除', '/m/station', 4), +(540, '2023-04-04 09:58:45', '2023-04-04 09:58:45', 512, 1, 'marketing:giveaway:add', '新增', '/m/giveaway', 2), +(541, '2023-04-04 10:01:47', '2023-04-04 10:01:47', 512, 1, 'marketing:giveaway:close', '失效活动', '/m/giveaway/changeStatus', 3), +(542, '2023-04-04 10:01:06', '2023-04-04 10:01:58', 512, 1, 'marketing:giveaway:edit', '修改', '/m/giveaway', 3), +(543, '2023-04-04 10:02:40', '2023-04-04 10:02:40', 512, 1, 'marketing:giveaway:delete', '删除', '/m/giveaway/changeStatus', 3), +(544, '2023-04-04 10:23:01', '2023-04-04 10:23:01', 580, 1, 'prod:prodComm:delete', '删除', '/m/spu_comm', 4), +(545, '2023-04-04 10:26:38', '2023-04-04 10:26:38', 587, 1, 'customer:customer:sendCoupons', '送优惠券', '/mp/coupon/send_user_coupon', 3), +(546, '2023-04-04 10:19:52', '2023-04-04 10:26:45', 580, 1, 'prod:prodComm:update', '编辑', '/m/spu_comm', 3), +(547, '2023-04-04 10:28:24', '2023-04-04 10:28:24', 587, 1, 'customer:customer:import', '导入用户', '/m/user/import_excel', 2), +(548, '2023-04-04 10:29:09', '2023-04-04 10:29:09', 587, 1, 'customer:customer:export', '导出用户', '/m/user/sold_excel', 1), +(549, '2023-04-04 10:30:58', '2023-04-04 10:30:58', 587, 1, 'customer:customer:info', '编辑', '/m/user/user_info', 1), +(550, '2023-04-04 10:35:17', '2023-04-04 10:35:17', 572, 1, 'notify:notifyList:edit', '全部已读', '/mp/notify_log/is_read', 1), +(551, '2023-04-04 10:36:42', '2023-04-04 10:36:42', 572, 1, 'notify:notifyList:view', '查看', '/mp/search/order_refund/page', 1), +(552, '2023-04-04 10:39:31', '2023-04-04 10:39:31', 572, 1, 'notify:notifySetting:edit', '关闭提醒', '/mp/notify_template_remind', 3), +(553, '2023-04-04 10:49:47', '2023-07-18 11:41:35', 435, 1, 'recSendManage:receiveList:add', '新建入库', '/m/stock_bill_log', 2), +(554, '2023-04-04 10:53:03', '2023-04-04 10:53:03', 435, 1, 'recSendManage:receiveList:export', '导出', '/m/stock_bill_log/exportStockBillLog', 1), +(555, '2023-04-04 10:58:35', '2023-04-04 10:58:35', 435, 1, 'recSendManage:receiveList:voided', '作废', '/m/stock_bill_log/voided', 3), +(556, '2023-04-04 10:56:37', '2023-04-04 10:58:50', 435, 1, 'recSendManage:receiveList:edit', '编辑', '/m/stock_bill_log', 3), +(557, '2023-04-04 11:03:54', '2023-04-04 11:04:03', 438, 1, 'recSendManage:sendList:export', '导出', '/m/stock_bill_log/exportStockBillLog', 1), +(558, '2023-04-04 11:04:47', '2023-04-04 11:04:47', 438, 1, 'recSendManage:sendList:add', '新建出库', '/m/stock_bill_log', 2), +(559, '2023-04-04 11:05:55', '2023-04-04 11:05:55', 438, 1, 'recSendManage:sendList:edit', '编辑', '/m/stock_bill_log', 3), +(560, '2023-04-04 11:06:34', '2023-04-04 11:06:34', 438, 1, 'recSendManage:sendList:voided', '作废', '/m/stock_bill_log/voided', 3), +(561, '2023-04-04 11:32:05', '2023-04-04 11:32:05', 571, 1, 'notify:platformNotify:view', '查看', '/mp/notice', 1), +(562, '2023-04-27 15:57:37', '2023-04-27 15:57:37', 604, 2, 'admin:sysAccessKey:save', '添加访问密钥', '/p/sys_access_key', 2), +(563, '2023-04-27 15:58:13', '2023-04-27 15:58:13', 604, 2, 'admin:sysAccessKey:update', '更新访问密钥', '/p/sys_access_key', 3), +(564, '2023-04-27 15:58:57', '2023-04-27 15:58:57', 604, 2, 'admin:sysAccessKey:reset', '重置访问密钥', '/p/sys_access_key/reset_access_key', 3), +(565, '2023-04-27 15:59:21', '2023-04-27 15:59:21', 604, 2, 'admin:sysAccessKey:delete', '删除访问密钥', '/p/sys_access_key', 4), +(566, '2023-07-05 17:59:45', '2023-11-14 15:31:27', 619, 2, 'platform:shopRenovation:viewH5', '查看h5', '/mp/shop_renovation/get_h5', 1), +(567, '2023-07-06 07:24:00', '2023-07-10 14:53:08', 499, 2, 'platform:supplierManage:save', '新增', '/p/supplier_detail/create_supplier', 1), +(568, '2023-07-06 07:24:00', '2023-07-10 14:53:08', 499, 2, 'platform:supplierManage:update', '编辑', '/p/supplier_detail', 3), +(570, '2023-07-06 07:24:00', '2023-07-10 14:53:08', 499, 2, 'platform:supplierManage:closeStore', '下线供应商', '/p/supplier_detail/offline', 3), +(571, '2023-07-06 07:24:00', '2023-07-10 14:53:08', 499, 2, 'platform:supplierManage:updatePassword', '账号管理', '/p/supplier_detail/update_password', 3), +(572, '2023-07-06 07:24:00', '2023-07-10 14:53:08', 499, 2, 'platform:supplierManage:businessAudit', '工商信息变更申请审核', '/p/supplier_company_auditing/audit', 3), +(573, '2023-07-06 07:24:00', '2023-07-10 14:53:08', 499, 2, 'platform:auditSupplier:audit', '审核', '/p/supplier_auditing/audit', 3), +(574, '2023-07-06 07:24:00', '2023-07-06 07:24:00', 600, 2, 'delivery:station:info', '详情', '/p/station', 1), +(575, '2023-07-06 09:49:05', '2023-07-06 16:40:55', 262, 2, 'platform:shopManage:businessAudit', '工商信息变更申请审核', '/p/shop_company_auditing/audit', 3), +(576, '2023-07-10 15:05:26', '2023-07-10 15:05:26', 499, 2, 'platform:supplierManage:info', '详情', '/p/supplier_detail/info', 1), +(577, '2023-07-10 16:58:17', '2023-07-10 16:58:17', 499, 2, 'platform:supplierManage:openStore', '下线管理', '/p/offline_handle_event/getOfflineHandleEventByShopId', 1), +(578, '2023-07-10 16:58:17', '2023-07-10 16:58:17', 262, 2, 'platform:shopManage:openStore', '下线管理', '/p/offline_handle_event/getOfflineHandleEventByShopId', 1), +(579, '2023-07-10 17:36:11', '2023-07-10 17:36:11', 601, 2, 'platform:imMsgBizSkills:save', '新建', '/p/im_msg_biz_skills', 2), +(580, '2023-07-10 17:36:11', '2023-07-10 17:36:11', 601, 2, 'platform:imMsgBizSkills:update', '编辑', '/p/im_msg_biz_skills', 3), +(581, '2023-07-10 17:36:11', '2023-07-10 17:36:11', 601, 2, 'platform:imMsgBizSkills:delete', '删除', '/p/im_msg_biz_skills', 4), +(582, '2023-07-10 17:36:11', '2023-07-10 17:36:11', 602, 1, 'platform:imMsgBizSkills:save', '新建', '/m/im_msg_biz_skills', 2), +(583, '2023-07-10 17:36:11', '2023-07-10 17:36:11', 602, 1, 'platform:imMsgBizSkills:update', '编辑', '/m/im_msg_biz_skills', 3), +(584, '2023-07-10 17:36:11', '2023-07-10 17:36:11', 602, 1, 'platform:imMsgBizSkills:delete', '删除', '/m/im_msg_biz_skills', 4), +(585, '2023-07-10 17:36:11', '2023-11-14 14:56:16', 665, 1, 'shop:shopRecharge:save', '充值', '/m/shop_recharge/*', 2), +(586, '2023-07-10 17:36:11', '2023-07-10 17:36:11', 427, 1, 'multishop:inquireStock:export', '导出商品', '/m/sku/sold_excel', 1), +(587, '2023-07-10 17:36:11', '2023-07-10 17:36:11', 428, 1, 'multishop:stockFlow:export', '导出', '/m/stock_bill_log_item/exportFlow', 1), +(588, '2023-07-18 09:29:54', '2023-07-18 09:29:54', 359, 2, 'distribution:auditing:show', '查看', '/p/distribution_user/page', 1), +(589, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 435, 1, 'recSendManage:receiveList:detail', '入库明细详情', '/m/stock_bill_log/info', 1), +(590, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 438, 1, 'recSendManage:sendList:detail', '出库明细详情', '/m/stock_bill_log/info', 1), +(591, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 430, 1, 'inventory:purchaseOrder:payment', '付款', '/m/purchase/order/updatePayVoucher', 3), +(592, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 430, 1, 'inventory:purchaseOrder:add', '新建', '/m/purchase/order', 2), +(593, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 576, 1, 'iinventory:takeStock:add', '新建', '/m/take_stock', 2), +(594, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 576, 1, 'inventory:takeStock:delete', '作废', '/m/take_stock/finishInventory', 3), +(595, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 576, 1, 'inventory:takeStock:edit', '编辑', '/m/take_stock/finishInventory', 3), +(596, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 576, 1, 'inventory:takeStock:detail', '详情', '/m/take_stock/finishInventory', 3), +(597, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 576, 1, 'inventory:takeStock:export', '导出', '/m/take_stock/exportTakeStock', 1), +(598, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 152, 1, 'product:spu:selectProdSale', '批量上架', '/mp/spu/prod_status', 3), +(599, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 152, 1, 'product:spu:selectProdNotSale', '批量下架', '/mp/spu/prod_status', 3), +(600, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 443, 1, 'prod:saleProxyProd:shelve', '批量上架', '/mp/spu/prod_status', 3), +(601, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 443, 1, 'prod:saleProxyProd:export', '批量导出', '/mp/spu/supplier_excel', 1), +(602, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 550, 1, 'marketing:offerPackage:show', '查看', '/m/combo', 1), +(603, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 550, 1, 'marketing:offerPackage:save', '新增', '/m/combo', 2), +(604, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 550, 1, 'marketing:offerPackage:edit', '编辑', '/m/combo', 3), +(605, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 550, 1, 'marketing:offerPackage:delete', '删除', '/m/combo/updateComboStatus', 3), +(606, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 550, 1, 'marketing:offerPackage:failed', '失效活动', '/m/combo/updateComboStatus', 3), +(607, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 279, 1, 'marketing:seckillDetail:show', '详情查看', '/mp/seckill', 1), +(608, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 279, 1, 'marketing:seckillDetail:failedActivities', '失效活动', '/m/combo/updateComboStatus', 3), +(609, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 279, 1, 'marketing:seckillDetail:waitReview', '等待审核', '/mp/seckill/get_offline_handle_event', 1), +(610, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 279, 1, 'marketing:seckillDetail:ApplyOnline', '申请上架', '/mp/seckill/audit_apply', 2), +(611, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 364, 1, 'marketing:distributionSpu:WaitReview', '等待审核', '/m/distribution_spu/get_offline_handle_event', 1), +(612, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 275, 1, 'marketing:group:start', '启用', '/mp/group_activity/active', 3), +(613, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 275, 1, 'marketing:group:show', '查看', '/mp/group_activity', 1), +(614, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 512, 1, 'marketing:giveaway:show', '查看', '/m/giveaway', 1), +(615, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 148, 1, 'order:order:contactClient', '联系卖家', '/m/im/conversations', 1), +(616, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 580, 1, 'prod:prodComm:show', '查看', '/m/spu_comm', 1), +(617, '2023-07-18 09:31:43', '2023-07-18 09:31:43', 599, 1, 'delivery:station:audit', '等待审核', '/m/station/get_offline_handle_event', 1), +(618, '2023-07-18 09:32:33', '2023-07-18 09:32:33', 508, 3, 'product:spu:selectProdSale', '批量上架', '/s/spu/prod_status', 3), +(619, '2023-07-18 09:32:33', '2023-07-18 09:32:33', 508, 3, 'product:spu:selectProdNotSale', '批量下架', '/s/spu/prod_status', 3), +(620, '2023-07-18 09:32:33', '2023-07-18 09:32:33', 503, 3, 'shop:shopCompany:saveShow', '查看工商信息修改', '/s/supplier_company_auditing/auditInfo', 1), +(621, '2023-07-18 09:32:33', '2023-07-18 09:32:33', 503, 3, 'shop:shopCategory:delete', '删除签约类目', '/s/apply_supplier/category/delete_signing_category', 4), +(622, '2023-07-18 09:32:33', '2023-07-18 09:32:33', 503, 3, 'shop:shopBrand:delete', '删除签约品牌', '/s/apply_supplier/brand/delete_signing_brand', 4), +(623, '2023-07-18 09:32:33', '2023-07-18 09:32:33', 477, 3, 'user:transport:selectDelete', '批量删除', '/mp/transport', 4), +(624, '2023-07-18 09:32:33', '2023-07-18 09:32:33', 479, 3, 'purchaseOrder:order:process', '审核', '/s/purchase/order/auditVoucher', 3), +(625, '2023-07-18 09:32:33', '2023-07-18 09:32:33', 568, 3, 'notify:platformNotify:view', '查看 ', '/mp/notice', 1), +(626, '2023-07-18 09:32:33', '2023-07-18 09:32:33', 569, 3, 'notify:notifySetting:edit', '关闭/开启提醒', '/mp/notify_template_remind', 3), +(627, '2023-07-18 09:32:33', '2023-07-18 09:32:33', 569, 3, 'notify:notifyList:allEdit', '全部已读', '/mp/notify_log/is_read', 3), +(628, '2023-07-18 09:32:33', '2023-07-18 09:32:33', 569, 3, 'notify:notifyList:edit', '批量已读', '/mp/notify_log/is_read', 3), +(629, '2023-07-18 09:32:33', '2023-07-18 09:32:33', 569, 3, 'notify:notifyList:view', ' 查看 ', '/mp/notify_log/info', 1), +(635, '2023-08-29 15:59:11', '2023-08-29 15:59:11', 648, 1, 'shop:outletConfig:save', '新增', '/mp/outlet_config', 2), +(636, '2023-08-29 15:59:36', '2023-08-29 15:59:36', 648, 1, 'shop:outletConfig:update', '编辑', '/mp/outlet_config', 3), +(637, '2023-08-29 15:59:53', '2023-08-29 15:59:53', 648, 1, 'shop:outletConfig:delete', '删除', '/mp/outlet_config', 4), +(638, '2023-08-29 16:00:30', '2023-08-29 16:00:30', 648, 1, 'shop:outletConfig:paperSize', '纸张规格', '/mp/outlet_config', 3), +(639, '2023-08-29 16:01:09', '2023-08-29 16:01:09', 648, 1, 'shop:outletConfig:setDefault', '设为默认', '/mp/outlet_config/set_default', 3), +(640, '2023-08-29 16:01:38', '2023-08-29 16:01:38', 649, 1, 'shop:printer:save', '新增', '/mp/printer', 2), +(641, '2023-08-29 16:01:57', '2023-08-29 16:01:57', 649, 1, 'shop:printer:update', '编辑', '/mp/printer', 3), +(642, '2023-08-29 16:02:10', '2023-08-29 16:02:10', 649, 1, 'shop:printer:delete', '删除', '/mp/printer', 4), +(643, '2023-08-29 16:02:39', '2023-08-29 16:02:39', 649, 1, 'shop:printer:setDefault', '设为默认', '/mp/printer/set_default', 3), +(653, '2023-08-29 15:59:11', '2023-08-29 16:06:24', 652, 2, 'platform:outletConfig:save', '新增', '/mp/outlet_config', 2), +(654, '2023-08-29 15:59:36', '2023-08-29 16:06:26', 652, 2, 'platform:outletConfig:update', '编辑', '/mp/outlet_config', 3), +(655, '2023-08-29 15:59:53', '2023-08-29 16:06:28', 652, 2, 'platform:outletConfig:delete', '删除', '/mp/outlet_config', 4), +(656, '2023-08-29 16:00:30', '2023-08-29 16:06:31', 652, 2, 'platform:outletConfig:paperSize', '纸张规格', '/mp/outlet_config', 3), +(657, '2023-08-29 16:01:09', '2023-08-29 16:06:34', 652, 2, 'platform:outletConfig:setDefault', '设为默认', '/mp/outlet_config/set_default', 3), +(658, '2023-08-29 16:01:38', '2023-08-29 16:06:37', 653, 2, 'platform:printer:save', '新增', '/mp/printer', 2), +(659, '2023-08-29 16:01:57', '2023-08-29 16:06:38', 653, 2, 'platform:printer:update', '编辑', '/mp/printer', 3), +(660, '2023-08-29 16:02:10', '2023-08-29 16:06:41', 653, 2, 'platform:printer:delete', '删除', '/mp/printer', 4), +(661, '2023-08-29 16:02:39', '2023-08-29 16:06:43', 653, 2, 'platform:printer:setDefault', '设为默认', '/mp/printer/set_default', 3), +(662, '2023-08-29 15:59:11', '2023-08-29 16:06:50', 655, 3, 'supplier:outletConfig:save', '新增', '/s/outlet_config', 2), +(663, '2023-08-29 15:59:36', '2023-08-29 16:06:51', 655, 3, 'supplier:outletConfig:update', '编辑', '/s/outlet_config', 3), +(664, '2023-08-29 15:59:53', '2023-08-29 16:06:53', 655, 3, 'supplier:outletConfig:delete', '删除', '/s/outlet_config', 4), +(665, '2023-08-29 16:00:30', '2023-08-29 16:06:55', 655, 3, 'supplier:outletConfig:paperSize', '纸张规格', '/s/outlet_config', 3), +(666, '2023-08-29 16:01:09', '2023-08-29 16:06:57', 655, 3, 'supplier:outletConfig:setDefault', '设为默认', '/s/outlet_config/set_default', 3), +(667, '2023-08-29 16:01:38', '2023-08-29 16:06:59', 656, 3, 'supplier:printer:save', '新增', '/s/printer', 2), +(668, '2023-08-29 16:01:57', '2023-08-29 16:07:01', 656, 3, 'supplier:printer:update', '编辑', '/s/printer', 3), +(669, '2023-08-29 16:02:10', '2023-08-29 16:07:02', 656, 3, 'supplier:printer:delete', '删除', '/s/printer', 4), +(670, '2023-08-29 16:02:39', '2023-08-29 16:07:03', 656, 3, 'supplier:printer:setDefault', '设为默认', '/s/printer/set_default', 3), +(671, '2022-08-05 11:35:13', '2023-11-14 09:55:23', 673, 2, 'platform:shopAddr:delete', '删除', '/mp/shop_refund_addr', 4), +(672, '2022-08-05 11:35:46', '2023-11-14 09:55:17', 673, 2, 'platform:shopAddr:update', '编辑', '/mp/shop_refund_addr', 3), +(673, '2022-08-05 11:36:28', '2023-11-14 09:55:08', 673, 2, 'platform:shopAddr:save', '新建', '/mp/shop_refund_addr', 2), +(674, '2023-11-14 09:41:56', '2023-11-14 09:41:56', 271, 1, 'shop:view:companyAuditInfo', '查看修改情况', '/mp/shop_company_auditing/auditInfo', 1), +(675, '2023-11-14 09:49:05', '2023-11-14 09:49:05', 258, 1, 'user:hotSearch:page', '分页查询', '/mp/hot_search/page', 1), +(676, '2023-11-14 09:49:30', '2023-11-14 09:49:30', 258, 1, 'user:hotSearch:get', '查看', '/mp/hot_search', 1), +(677, '2023-11-14 09:51:01', '2023-11-14 09:51:01', 146, 1, 'user:indexImg:page', '分页查询', '/mp/index_img/page', 1), +(678, '2023-11-14 09:51:21', '2023-11-14 09:51:21', 146, 1, 'user:indexImg:get', '查看', '/mp/index_img', 1), +(679, '2023-11-14 09:56:27', '2023-11-14 09:56:27', 669, 1, 'user:notice:page', '分页查询', '/mp/notice/page', 1), +(680, '2023-11-14 10:03:41', '2023-11-14 10:03:52', 571, 1, 'notify:platformNotify:page', '分页查询', '/mp/notice/p/pagePlatformNotice', 1), +(681, '2023-11-14 10:11:40', '2023-11-14 10:11:40', 271, 1, 'shop:idCardStatus:update', '更新影印件', '/mp/shop_company/update_id_card_status', 3), +(682, '2023-11-14 10:13:44', '2023-11-14 10:13:44', 271, 1, 'shop:uploadIdCard:update', '重新上传影印件', '/mp/shop_company/upload_id_card', 3), +(683, '2023-11-14 10:16:08', '2023-11-14 15:27:29', 665, 1, 'shop:recharge:page', '分页查询余额充值', '/mp/shop_recharge/page', 1), +(684, '2023-11-14 10:16:58', '2023-11-14 10:17:13', 272, 1, 'shop:shopRefundAddr:page', '分页查询', '/mp/shop_refund_addr/page', 1), +(685, '2023-11-14 10:17:50', '2023-11-14 10:17:50', 272, 1, 'shop:shopRefundAddr:get', '查看', '/mp/shop_refund_addr', 1), +(686, '2023-11-14 10:19:55', '2023-11-14 10:19:55', 648, 1, 'shop:shopRefundAddr:list', '获取地址列表', '/mp/shop_refund_addr/list', 1), +(687, '2023-11-14 10:23:44', '2023-11-14 10:23:44', 538, 1, 'shop:shopRenovation:page', '分页查询', '/mp/shop_renovation/page', 1), +(688, '2023-11-14 10:24:51', '2023-11-14 10:24:51', 543, 1, 'shop:shopRenovation:pageH5', '分页查询', '/mp/shop_renovation/page_h5', 1), +(689, '2023-11-14 10:25:28', '2023-11-14 10:25:28', 538, 1, 'shop:shopRenovation:get', '查看', '/mp/shop_renovation', 1), +(690, '2023-11-14 10:25:53', '2023-11-14 10:25:53', 543, 1, 'shop:shopRenovation:getH5', '查看', '/mp/shop_renovation/get_h5', 1), +(691, '2023-11-14 10:27:27', '2023-11-14 10:27:27', 539, 1, 'shop:shopTemplate:page', '分页查询', '/mp/shop_template/page', 1), +(692, '2023-11-14 10:27:48', '2023-11-14 10:27:48', 544, 1, 'shop:shopTemplate:pageH5', '分页查询', '/mp/shop_template/page_h5', 1), +(693, '2023-11-14 10:57:04', '2023-11-14 10:57:04', 539, 1, 'shop:shopTemplate:get', '查看', '/mp/shop_template', 1), +(694, '2023-11-14 10:57:29', '2023-11-14 10:57:29', 544, 1, 'shop:shopTemplat:getH5', '查看', '/mp/shop_template/get_h5', 1), +(695, '2023-11-14 11:09:01', '2023-11-14 11:09:01', 665, 1, 'shop:shopWallet:page', '分页查询钱包日志', '/mp/shop_wallet/page', 1), +(696, '2023-11-14 11:09:31', '2023-11-14 11:09:31', 665, 1, 'shop:shopWallet:get', '查询钱包', '/mp/shop_wallet/get_shop_wallet', 1), +(697, '2023-11-14 11:10:53', '2023-11-14 11:11:01', 665, 1, 'shop:shopCash:page', '分页查询提现', '/mp/shop_withdraw_cash/page', 1), +(698, '2023-11-14 14:12:31', '2023-11-14 14:12:31', 441, 1, 'shop:substituteSales:get', '分页查找', '/m/shop_substitute_sales', 1), +(699, '2023-11-14 14:13:22', '2023-11-14 14:13:22', 441, 1, 'shop:substituteSales:save', '保存', '/m/shop_substitute_sales', 2), +(700, '2023-11-14 14:25:30', '2023-11-14 14:25:30', 367, 1, 'shop:applyShopUser:info', '获取商家信息', '/m/apply_shop/shop_user/info', 1), +(701, '2023-11-14 14:30:07', '2023-11-14 14:30:07', 112, 1, 'shop:applyShopUser:info', '查看店铺用户信息', '/m/apply_shop/shop_user/info', 1), +(702, '2023-11-14 14:36:45', '2023-11-14 14:36:45', 428, 1, 'shop:applyShopUser:list', '获取店铺员工列表', '/m/apply_shop/shop_user/list', 1), +(703, '2023-11-14 14:38:12', '2023-11-14 14:38:12', 435, 1, 'shop:applyShopUser:list', '获取店铺员工列表', '/m/apply_shop/shop_user/list', 1), +(704, '2023-11-14 14:38:25', '2023-11-14 14:38:25', 438, 1, 'shop:applyShopUser:list', '获取店铺员工列表', '/m/apply_shop/shop_user/list', 1), +(705, '2023-11-14 14:43:06', '2023-11-14 14:43:06', 271, 1, 'shop:shopCompany:revoke', '撤销申请', '/m/shop_company_auditing/revoke', 1), +(706, '2023-11-14 15:02:38', '2023-11-14 15:02:38', 112, 1, 'multishop:shopUser:page', '分页查找员工列表', '/m/shop_user/page', 1), +(707, '2023-11-14 15:03:21', '2023-11-14 15:03:21', 112, 1, 'multishop:shopUser:get', '查看', '/m/shop_user', 1), +(708, '2023-11-14 15:04:32', '2023-11-14 15:04:32', 576, 1, 'multishop:shopUser:page', '分页查找员工列表', '/m/shop_user/page', 1), +(709, '2023-11-14 15:14:55', '2023-11-14 15:14:55', 306, 2, 'platform:view:companyAuditInfo', '查看修改情况', '/mp/shop_company_auditing/auditInfo', 1), +(710, '2023-11-14 15:19:47', '2023-11-15 16:18:29', 256, 2, 'platform:hotSearch:page', '列表', '/mp/hot_search/page', 1), +(711, '2023-11-14 15:20:11', '2023-11-14 15:20:11', 256, 2, 'platform:hotSearch:get', '查看', '/mp/hot_search', 1), +(712, '2023-11-14 15:20:47', '2023-11-15 16:18:18', 257, 2, 'platform:indexImg:page', '列表', '/mp/index_img/page', 1), +(713, '2023-11-14 15:21:08', '2023-11-14 15:21:08', 257, 2, 'platform:indexImg:get', '查看', '/mp/index_img', 1), +(714, '2023-11-14 15:21:57', '2023-11-15 16:18:13', 305, 2, 'platform:notice:page', '列表', '/mp/notice/page', 1), +(715, '2023-11-14 15:24:41', '2023-11-14 15:24:41', 306, 2, 'platform:idCardStatus:update', '更新影印件', '/mp/shop_company/update_id_card_status', 3), +(716, '2023-11-14 15:27:07', '2023-11-14 15:27:07', 306, 2, 'platform:uploadIdCard:update', '重新上传影印件', '/mp/shop_company/upload_id_card', 1), +(717, '2023-11-14 15:28:46', '2023-11-15 16:18:03', 673, 2, 'platform:shopAddr:page', '列表', '/mp/shop_refund_addr/page', 1), +(718, '2023-11-14 15:29:11', '2023-11-14 15:29:11', 673, 2, 'platform:shopAddr:get', '查看', '/mp/shop_refund_addr', 1), +(719, '2023-11-14 15:29:47', '2023-11-14 15:29:47', 652, 2, 'shop:shopAddr:list', '获取地址列表', '/mp/shop_refund_addr/list', 1), +(720, '2023-11-14 15:32:11', '2023-11-15 16:17:56', 528, 2, 'platform:shopRenovation:page', '列表', '/mp/shop_renovation/page', 1), +(721, '2023-11-14 15:32:30', '2023-11-15 16:17:50', 533, 2, 'platform:shopRenovation:pageH5', '列表', '/mp/shop_renovation/page_h5', 1), +(722, '2023-11-14 15:33:58', '2023-11-15 16:17:42', 531, 2, 'platform:shopTemplate:page', '列表', ' /mp/shop_template/page', 1), +(723, '2023-11-14 15:34:21', '2023-11-15 16:17:36', 535, 2, 'platform:shopTemplate:pageH5', '列表', '/mp/shop_template/page_h5', 1), +(724, '2023-11-14 15:34:53', '2023-11-14 15:34:53', 531, 2, 'platform:shopTemplate:get', '查看', '/mp/shop_template', 1), +(725, '2023-11-14 15:35:10', '2023-11-14 15:35:10', 535, 2, 'platform:shopTemplate:getH5', '查看', '/mp/shop_template', 1), +(726, '2023-11-14 15:37:28', '2023-11-15 16:17:28', 324, 2, 'platform:wallet:page', '列表', '/mp/shop_wallet/page', 1), +(727, '2023-11-14 15:38:02', '2023-11-14 15:38:02', 324, 2, 'platform:wallet:get', '获取钱包信息', '/mp/shop_wallet/get_shop_wallet', 1), +(728, '2023-11-14 15:39:12', '2023-11-14 15:39:12', 331, 2, 'platform:wallet:all', '获取所有店铺钱包', 'mp/shop_wallet/get_all_shop_wallet', 1), +(729, '2023-11-14 15:39:43', '2023-11-15 16:17:13', 331, 2, 'platform:wallet:pageAll', '获取所有店铺钱包列表', '/mp/shop_wallet/page_shop_wallet_by_time', 1), +(730, '2023-11-14 15:40:57', '2023-11-15 16:17:06', 326, 2, 'platform:shopCash:page', '列表', '/mp/shop_withdraw_cash/page', 1), +(731, '2023-11-14 15:42:30', '2023-11-15 16:17:00', 262, 2, 'platform:shopManage:businessPage', '获取工商信息申请列表', '/p/shop_company_auditing/page', 1), +(732, '2023-11-14 15:43:17', '2023-11-15 16:16:41', 262, 2, 'platform:auditShop:page', '获取开店店铺列表', '/p/shop_auditing/page', 1), +(734, '2023-11-14 15:46:26', '2023-11-14 15:46:26', 302, 2, 'platform:auditShop:bankCard', '获取店铺银行卡信息', '/p/shop_bank_card/list_by_shop_id', 1), +(735, '2023-11-14 15:50:07', '2023-11-14 15:50:07', 326, 2, 'platform:cashConfig:save', '保存提现设置', '/p/shop_withdraw_cash/save', 2), +(736, '2023-11-14 15:53:01', '2023-11-14 15:53:01', 326, 2, 'platform:cash:info', '查看审核信息', '/p/shop_withdraw_cash/info', 1), +(737, '2023-11-14 15:54:46', '2023-11-14 15:54:46', 271, 1, 'shop:event:info', '获取下线信息', '/m/offline_handle_event/get_event_info', 1), +(738, '2023-11-14 15:58:46', '2023-11-14 15:58:46', 357, 2, 'platform:distributionConfig:info', '获取分销设置', '/p/distribution_config/info', 1), +(739, '2023-11-14 15:59:22', '2023-11-14 15:59:22', 357, 2, 'platform:distributionConfig:recruitInfo', '获取分销推广设置', '/p/distribution_config/recruit_info', 1), +(740, '2023-11-14 16:01:09', '2023-11-14 16:11:12', 357, 2, 'platform:distributionConfig:save', '保存分销设置', '/p/distribution_config', 2), +(741, '2023-11-14 16:01:36', '2023-11-14 16:11:08', 357, 2, 'platform:distributionConfig:saveRecruit', '保存推广设置', '/p/distribution_config/recruit', 2), +(742, '2023-11-14 16:11:41', '2023-11-14 16:11:41', 645, 2, 'platform:growthConfig:save', '保存成长值配置', '/p/growth_config', 2), +(743, '2023-11-14 16:18:21', '2023-11-14 16:18:21', 645, 2, 'platform:growthConfig:info', '获取成长值配置', '/p/growth_config/info/*', 1), +(744, '2023-11-14 16:20:51', '2023-11-14 16:20:51', 499, 2, 'platform:supplierManage:openStore', '下线管理', '/p/offline_handle_event/getOfflineHandleEventByShopId', 1), +(745, '2023-11-14 16:21:55', '2023-11-14 16:21:55', 645, 2, 'platform:scoreConfig:info', '获取积分配置', '/p/score_config/info', 1), +(746, '2023-11-14 16:22:23', '2023-11-14 16:22:23', 645, 2, 'platform:scoreConfig:save', '保存积分配置', '/p/score_config', 2), +(747, '2023-11-14 16:24:21', '2023-11-14 16:24:21', 645, 2, 'platform:scoreOther:save', '其他配置保存', '/p/score/other_related', 2), +(748, '2023-11-14 16:25:56', '2023-11-15 16:11:29', 604, 2, 'admin:sysAccessKey:page', '列表', '/p/sys_access_key/page', 1), +(749, '2023-11-14 16:26:18', '2023-11-14 16:26:18', 604, 2, 'admin:sysAccessKey:get', '查看', '/p/sys_access_key', 1), +(750, '2023-11-14 16:27:46', '2023-11-14 16:27:46', 425, 2, 'platform:webConfig:get', '查看', '/p/web_config/info/*', 1), +(751, '2023-11-14 16:28:50', '2023-11-14 16:28:50', 503, 3, 'supplier:event:info', '获取下线信息', '/s/offline_handle_event/get_event_info', 1), +(752, '2023-11-14 16:30:15', '2023-11-14 16:30:15', 231, 2, 'platform:config:info', '获取配置', '/p/sys_config/info/*', 1), +(753, '2023-11-14 16:30:37', '2023-11-14 16:30:37', 612, 2, 'platform:config:info', '获取配置', '/p/sys_config/info/*', 1), +(754, '2023-11-14 16:31:05', '2023-11-14 16:31:05', 231, 2, 'platform:config:save', '保存', '/p/sys_config/save', 2), +(755, '2023-11-14 16:31:23', '2023-11-14 16:31:23', 612, 2, 'platform:config:save', '保存', '/p/sys_config/save', 1), +(756, '2023-11-14 16:36:16', '2023-11-14 16:36:40', 156, 2, 'platform:account:get', '获取平台用户账号信息', '/p/sys_user/account', 1), +(757, '2023-11-15 09:40:22', '2023-11-15 15:51:46', 156, 2, 'platform:sysUser:page', '列表', '/p/sys_user/page', 1), +(758, '2023-11-15 09:47:32', '2023-11-15 09:47:32', 503, 3, 'supplier:idCardStatus:update', '更新影印件', '/mp/supplier_company/update_id_card_status', 3), +(759, '2023-11-15 09:48:06', '2023-11-15 09:48:06', 503, 3, 'supplier:uploadIdCard:update', '重新上传影印件', '/mp/supplier_company/upload_id_card', 3), +(760, '2023-11-15 09:56:50', '2023-11-15 09:56:50', 500, 2, 'supplier:idCardStatus:update', '更新影印件', '/mp/supplier_company/update_id_card_status', 1), +(761, '2023-11-15 09:57:15', '2023-11-15 09:57:15', 500, 2, 'supplier:uploadIdCard:update', '重新上传影印件', '/mp/supplier_company/upload_id_card', 1), +(762, '2023-11-15 10:01:24', '2023-11-15 10:01:24', 463, 3, 'shop:shopRefundAddr:page', '分页查询', '/s/supplier_refund_addr/page', 1), +(763, '2023-11-15 10:01:45', '2023-11-15 10:01:45', 463, 3, 'shop:shopRefundAddr:get', '查询', '/s/supplier_refund_addr', 1), +(764, '2023-11-15 10:03:01', '2023-11-15 10:03:01', 655, 3, 'shop:shopRefundAddr:list', '获取地址列表', '/s/supplier_refund_addr/list', 1), +(765, '2023-11-15 10:03:39', '2023-11-15 10:03:39', 661, 3, 'shop:shopRefundAddr:list', '查看退货地址列表', '/s/supplier_refund_addr/list', 1), +(766, '2023-11-15 10:04:51', '2023-11-15 10:04:51', 667, 3, 'supplier:shopWallet:page', '分页查询钱包日志', '/mp/supplier_wallet/page', 1), +(767, '2023-11-15 10:05:20', '2023-11-15 10:05:20', 667, 3, 'supplier:shopWallet:get', '查询钱包', '/mp/supplier_wallet/get_supplier_wallet', 1), +(768, '2023-11-15 10:08:13', '2023-11-15 15:54:54', 511, 2, 'platform:supplierWallet:page', '查看供应商所有的钱包记录日志', '/mp/supplier_wallet/page_all_supplier', 1), +(769, '2023-11-15 10:10:04', '2023-11-15 15:51:38', 511, 2, 'platform:supplierWallet:pageByTime', '查看供应商钱包列表', '/mp/supplier_wallet/page_supplier_wallet_by_time', 1), +(770, '2023-11-15 10:10:47', '2023-11-15 10:10:47', 511, 2, 'platform:supplierWallet:getAll', '查看所有供应商钱包总信息', '/mp/supplier_wallet/get_all_supplier_wallet', 1), +(771, '2023-11-15 10:11:51', '2023-11-15 10:11:51', 667, 3, 'supplier:withdraw:page', '分页获取提现记录', '/mp/supplier_withdraw_cash/page', 1), +(772, '2023-11-15 10:12:17', '2023-11-15 10:12:17', 667, 3, 'supplier:withdraw:info', '查看提现详情', '/mp/supplier_withdraw_cash/info', 1), +(773, '2023-11-15 10:13:03', '2023-11-15 15:54:25', 510, 2, 'supplier:withdraw:page', '列表', '/mp/supplier_withdraw_cash/page', 1), +(774, '2023-11-15 10:14:36', '2023-11-15 10:14:36', 664, 1, 'shop:purchaseAmountLog:page', '分页获取采购金额日志', '/m/purchase_amount_log/page', 1), +(775, '2023-11-15 10:15:22', '2023-11-15 10:15:22', 664, 1, 'shop:purchaseAmountLog:list', '获取供应商列表', '/m/purchase_amount_log/list_supplier', 1), +(776, '2023-11-15 10:16:05', '2023-11-15 10:16:05', 664, 1, 'shop:purchaseAmountLog:getTotalAmount', '获取采购总金额', '/m/purchase_amount_log/get_total_amount', 1), +(777, '2023-11-15 10:16:45', '2023-11-15 10:16:45', 664, 1, 'shop:purchaseAmountLog:export', '导出', '/m/purchase_amount_log/export_excel', 1), +(778, '2023-11-15 10:19:51', '2023-11-15 10:19:51', 431, 1, 'shop:supplier:page', '分页获取供应商', '/m/supplier_detail/page_supplier', 1), +(779, '2023-11-15 10:20:41', '2023-11-15 10:23:45', 578, 1, 'shop:supplier:page', '分页获取供应商', '/m/supplier_detail/page_supplier', 1), +(780, '2023-11-15 10:25:25', '2023-11-15 15:42:16', 499, 2, 'supplier:company:page', '获取供应商工商信息审核列表', '/p/supplier_company_auditing/page', 1), +(781, '2023-11-15 10:26:23', '2023-11-15 10:26:23', 499, 2, 'supplier:company:auditInfo', '查看供应商审核详情', '/p/supplier_company_auditing/auditInfo', 1), +(782, '2023-11-15 10:28:32', '2023-11-15 15:42:05', 499, 2, 'platform:auditSupplier:page', '获取供应商开店列表', '/p/supplier_auditing/page', 1), +(783, '2023-11-15 10:30:47', '2023-11-15 10:30:47', 510, 2, 'platform:supplierWithdraw:info', '获取提现详情', '/p/supplier_withdraw_cash/info', 1), +(784, '2023-11-15 10:31:08', '2023-11-15 10:31:08', 510, 2, 'platform:supplierWithdraw:audit', '审核', '/p/supplier_withdraw_cash/audit', 1), +(785, '2023-11-15 10:31:28', '2023-11-15 10:31:28', 510, 2, 'platform:supplierWithdraw:save', '保存提现金额设置', '/p/supplier_withdraw_cash/save', 1), +(786, '2023-11-15 10:34:28', '2023-11-15 10:34:28', 503, 3, 'supplier:companyAudit:apply', '申请变更工商信息', '/s/supplier_company_auditing/apply_change_company_info', 1), +(787, '2023-11-15 10:35:14', '2023-11-15 10:35:14', 503, 3, 'supplier:companyAudit:revoke', '撤销申请', '/s/supplier_company_auditing/revoke', 1), +(788, '2023-11-15 10:40:00', '2023-11-15 10:40:00', 668, 3, 'supplier:purchaseAmountLog:list', '获取店铺列表', '/s/purchase_amount_log/list_shop', 1), +(789, '2023-11-15 10:40:40', '2023-11-15 10:40:40', 668, 3, 'supplier:puchaseAmountLog:page', '分页查询', '/s/purchase_amount_log/page', 1), +(790, '2023-11-15 10:41:20', '2023-11-15 10:41:20', 668, 3, 'supplier:purchaseAmountLog:getTotalAmount', '获取采购总金额', '/s/purchase_amount_log/get_total_amount', 1), +(791, '2023-11-15 10:41:46', '2023-11-15 10:41:46', 668, 3, 'supplier:purchaseAmountLog:export', '导出', '/s/purchase_amount_log/export_excel', 1), +(792, '2023-11-15 10:47:36', '2023-11-15 10:47:36', 485, 3, 'supplier:user:page', '分页获取', '/s/supplier_user/page', 1), +(793, '2023-11-15 10:47:52', '2023-11-15 10:47:52', 485, 3, 'supplier:user:get', '查看', '/s/supplier_user', 1), +(794, '2023-11-15 11:02:38', '2023-11-15 15:41:56', 157, 2, 'rbac:role:page', '列表', '/mp/role/page', 1), +(795, '2023-11-15 11:03:05', '2023-11-15 11:03:05', 156, 2, 'rbac:role:list', '获取角色列表', '/mp/role/list', 1), +(796, '2023-11-15 11:05:51', '2023-11-15 11:05:51', 486, 3, 'rbac:role:page', '分页获取', '/mp/role/page', 1), +(797, '2023-11-15 11:06:12', '2023-11-15 11:06:12', 485, 3, 'rbac:role:list', '获取角色列表', '/mp/role/list', 1), +(798, '2023-11-15 11:06:38', '2023-11-15 11:06:38', 134, 1, 'rbac:role:page', '分页获取', '/mp/role/page', 1), +(799, '2023-11-15 11:06:58', '2023-11-15 11:06:58', 112, 1, 'rbac:role:list', '获取角色列表', '/mp/role/list', 1), +(800, '2023-11-15 13:41:35', '2023-11-15 15:41:50', 313, 2, 'resource:file:page', '列表', '/mp/attach_file/page', 1), +(801, '2023-11-15 13:42:28', '2023-11-15 15:41:46', 314, 2, 'resource:file:page', '列表', '/mp/attach_file/page', 1), +(802, '2023-11-15 13:44:07', '2023-11-15 13:44:07', 313, 2, 'resource:fileGroup:list', '分组列表查询', '/mp/attach_file_group/list', 1), +(803, '2023-11-15 13:44:31', '2023-11-15 13:44:31', 314, 2, 'resource:fileGroup:list', '分组列表查询', '/mp/attach_file_group/list', 1), +(804, '2023-11-15 13:46:33', '2023-11-15 13:46:33', 488, 3, 'resource:file:page', '分页查询', '/mp/attach_file/page', 1), +(805, '2023-11-15 13:46:42', '2023-11-15 13:46:42', 489, 3, 'resource:file:page', '分页查询', '/mp/attach_file/page', 1), +(806, '2023-11-15 13:46:59', '2023-11-15 13:46:59', 488, 3, 'resource:fileGroup:list', '分组列表查询', '/mp/attach_file_group/list', 1), +(807, '2023-11-15 13:47:10', '2023-11-15 13:47:10', 489, 3, 'resource:fileGroup:list', '分组列表查询', '/mp/attach_file_group/list', 1), +(808, '2023-11-15 13:47:38', '2023-11-15 13:47:38', 284, 1, 'resource:file:page', '分页查询', '/mp/attach_file/page', 1), +(809, '2023-11-15 13:47:53', '2023-11-15 13:47:53', 285, 1, 'resource:file:page', '分页查询', '/mp/attach_file/page', 1), +(810, '2023-11-15 13:48:22', '2023-11-15 13:48:22', 284, 1, 'resource:fileGroup:list', '分组列表查询', '/mp/attach_file_group/list', 1), +(811, '2023-11-15 13:48:33', '2023-11-15 13:48:33', 285, 1, 'resource:fileGroup:list', '分组列表查询', '/mp/attach_file_group/list', 1), +(812, '2023-11-15 13:50:22', '2023-11-15 13:50:22', 572, 1, 'notify:notifyList:list', '查询未读列表', '/mp/notify_log/unread_count_list', 1), +(813, '2023-11-15 13:50:49', '2023-11-15 13:50:49', 569, 3, 'notify:notifyList:list', '查询未读列表', '/mp/notify_log/unread_count_list', 1), +(814, '2023-11-15 13:52:40', '2023-11-15 13:52:40', 572, 1, 'notify:notifySetting:page', '分页获取消息提醒列表', '/mp/notify_template_remind/page', 1), +(815, '2023-11-15 13:53:09', '2023-11-15 13:53:09', 569, 3, 'notify:notifySetting:page', '分页获取消息提醒列表', '/mp/notify_template_remind/page', 1), +(816, '2023-11-15 13:55:08', '2023-11-15 15:41:39', 304, 2, 'notify:notifyLog:page', '获取消息记录列表', '/p/notify_log/page', 1), +(817, '2023-11-15 13:56:10', '2023-11-15 15:40:50', 304, 2, 'notify:notifyTemplate:page', '获取消息配置列表', '/p/notify_template/page', 1), +(818, '2023-11-15 13:56:55', '2023-11-15 13:56:55', 304, 2, 'notify:notifyTemplate:get', '获取消息通知配置', '/p/notify_template', 1), +(819, '2023-11-15 13:57:54', '2023-11-15 15:40:39', 308, 2, 'notify:notifyTemplateTag:page', '列表', '/p/notify_template_tag/page', 1), +(820, '2023-11-15 13:58:30', '2023-11-15 13:58:30', 308, 2, 'notify:notifyTemplateTag:info', '获取标签消息信息', '/p/notify_template_tag/info', 1), +(821, '2023-11-15 14:12:03', '2023-11-15 14:12:03', 301, 2, 'platform:member:survey', '获取会员概况数据', '/mp/customer_analysis/get_member_survey', 1), +(822, '2023-11-15 14:12:48', '2023-11-15 14:12:48', 301, 2, 'platform:member:trend', '获取会员人数/占比数据', '/mp/customer_analysis/get_member_trend', 1), +(823, '2023-11-15 14:13:35', '2023-11-15 14:13:35', 301, 2, 'platform:member:vontribute', '获取会员贡献价值分析数据', '/mp/customer_analysis/get_member_vontribute_value', 1), +(824, '2023-11-15 14:33:55', '2023-11-15 14:33:55', 301, 2, 'platform:member:deal', '获取新老会员成交分析', '/mp/customer_analysis/get_member_deal', 1), +(825, '2023-11-15 14:34:38', '2023-11-15 14:34:38', 301, 2, 'platform:member:retained', '获取客户留存分析数据', '/mp/customer_analysis/get_customer_retained', 1), +(826, '2023-11-15 15:04:51', '2023-11-15 15:04:51', 595, 1, 'shop:form:page', '分页获取', '/m/form/page', 1), +(827, '2023-11-15 15:05:11', '2023-11-15 15:05:11', 595, 1, 'shop:form:get', '获取报表信息', '/m/form', 1), +(828, '2023-11-15 15:06:01', '2023-11-15 15:06:01', 596, 1, 'shop:form:recommend', '获取推荐报表列表', '/m/form/get_recommend_form_list', 1), +(829, '2023-11-15 15:06:35', '2023-11-15 15:06:35', 310, 1, 'shop:product:analyse', '获取商品洞察数据', '/m/product_analyse/get_product_effect', 1), +(830, '2023-11-15 15:07:55', '2023-11-15 15:07:55', 292, 2, 'platform:flow:all', '获取流量总览数据', '/p/flow_analysis/flow_all', 1), +(831, '2023-11-15 15:08:37', '2023-11-15 15:08:37', 292, 2, 'platform:flow:trend', '获取流量趋势数据', '/p/flow_analysis/flow_trend', 1), +(832, '2023-11-15 15:09:26', '2023-11-15 15:09:26', 292, 2, 'platform:flow:sour', '获取成交转化数据', '/p/flow_analysis/flow_sour', 1), +(833, '2023-11-15 15:10:02', '2023-11-15 15:40:30', 590, 2, 'platform:form:page', '列表', '/p/form/page', 1), +(834, '2023-11-15 15:10:26', '2023-11-15 15:10:26', 590, 2, 'platform:form:get', '获取报表信息', '/p/form', 1), +(835, '2023-11-15 15:11:34', '2023-11-15 15:40:20', 592, 2, 'platform:recomment:page', '列表', '/p/form/get_recommend_form_page', 1), +(836, '2023-11-15 15:11:59', '2023-11-15 15:11:59', 591, 2, 'platformLrecommend:list', '获取列表信息', '/p/form/get_recommend_form_list', 1), +(837, '2023-11-15 15:12:34', '2023-11-15 15:12:34', 298, 2, 'platform:product:analyse', '获取商品洞察数据', '/p/product_analyse/get_product_effect', 1), +(838, '2023-11-15 15:13:14', '2023-11-15 15:13:14', 293, 2, 'platform:user:analysis', '获取访客分析数据', '/p/user_visit_analysis/get_user_analysis_data', 1), +(839, '2023-11-15 16:20:40', '2023-11-15 16:20:40', 498, 2, 'platform:supplierBank:list', '获取供应商银行卡列表', '/p/supplier_bank_card/list_by_supplier_id', 1), +(840, '2023-11-15 16:22:05', '2023-11-15 16:22:05', 500, 2, 'platform:supplierAllinpay:apply', '供应商通联开店申请', '/p/supplier_bank_card/allinpay_save_and_apply_supplier', 1), +(841, '2023-11-15 16:22:37', '2023-11-15 16:22:46', 306, 2, 'platform:shopAllinpay:apply', '店铺通联开店申请', '/p/shop_bank_card/allinpay_save_and_apply_shop', 1), +(842, '2023-11-14 14:53:15', '2023-11-14 14:53:15', 479, 3, 'purchaseOrder:order:exportOrderExcel', '导入订单', '/s/purchase/order/export_order_excel', 1), +(843, '2023-11-14 14:52:23', '2023-11-14 14:52:35', 479, 3, 'purchaseOrder:order:orderDelivery', '发货', '/s/purchase/order/delivery', 2), +(844, '2023-11-14 14:51:11', '2023-11-14 14:51:19', 479, 3, 'purchaseOrder:order:address', '订单项待发货数量查询', '/s/purchase/order/order_item_and_address/*', 1), +(845, '2023-11-14 14:49:48', '2023-11-14 14:49:48', 480, 3, 'order:refund:saveIntervention', '添加介入凭证', '/s/order_refund_intervention/save_intervention_voucher', 1), +(846, '2023-11-14 14:48:46', '2023-11-14 14:48:46', 480, 3, 'order:refund:returnMoney', '退货退款最后一步处理', '/s/order_refund/return_money', 3), +(847, '2023-11-14 14:48:01', '2023-11-14 14:48:01', 480, 3, 'order:refund:isLastRefund', '是否为最后一单退款', '/s/order_refund/is_last_refund', 1), +(848, '2023-11-14 14:46:39', '2023-11-14 14:46:39', 480, 3, 'order:refund:return_and_refund_audit', '处理退款', '/s/order_refund/return_and_refund_audit', 3), +(849, '2023-11-14 14:40:52', '2023-11-14 14:40:52', 478, 3, 'order:order:soldUnDeliveryExcel', '导出待发货订单', '/s/order/un_delivery_sold_excel', 1), +(850, '2023-11-14 14:40:00', '2023-11-14 14:40:04', 478, 3, 'order:order:changeRemark', '修改订单备注', '/s/order/change_order_remark', 3), +(851, '2023-11-14 14:39:22', '2023-11-14 14:39:27', 478, 3, 'order:order:changeUserAddr', '修改地址', '/s/order/change_user_addr', 3), +(852, '2023-11-14 14:38:52', '2023-11-14 14:38:52', 478, 3, 'order:order:changeAmount', '获取修改地址后的运费', '/s/order/get_change_amount', 1), +(853, '2023-11-14 14:37:50', '2023-11-14 14:37:50', 478, 3, 'order:order:address', '待发货查询', '/s/order/order_item_and_address/*', 1), +(854, '2023-11-14 14:36:52', '2023-11-14 14:36:52', 478, 3, 'order:order:orderAddr', '获取下单地址', '/s/order/order_addr/*', 1), +(855, '2023-11-14 14:35:59', '2023-11-14 14:35:59', 502, 3, 'order:order:orderInfo', '订单详情', '/s/order/order_info', 1), +(856, '2023-11-14 14:34:41', '2023-11-14 14:34:41', 478, 3, 'order:order:page', '列表', '/s/order/page', 1), +(857, '2023-11-14 14:32:25', '2023-11-14 14:32:25', 172, 2, 'platform:order:refundCountRanking', '获取店铺退款订单数量排行榜', '/p/order_statistics/list_shop_ranking_by_refund_count', 1), +(858, '2023-11-14 14:31:51', '2023-11-14 14:31:51', 171, 2, 'platform:order:shopRaning', '获取店铺销售排行榜', '/p/order_statistics/list_shop_ranking_by_pay_actual', 1), +(859, '2023-11-14 14:31:16', '2023-11-14 14:31:16', 171, 2, 'platform:order:listSpurankingByOrderCount', '获取商品订单数量排行榜', '/p/order_statistics/list_spu_ranking_by_order_count', 1), +(860, '2023-11-14 14:30:13', '2023-11-14 14:30:13', 171, 2, 'platform:order:getOrderInfoByDayCount', '获取近多少天内的订单统计数据', '/p/order_statistics/get_order_info_by_day_count', 1), +(861, '2023-11-14 14:28:56', '2023-11-14 14:28:56', 171, 2, 'platform:order:getDetailByhour', '获取当天与昨天订单实时统计数据', '/p/order_statistics/get_detail_by_hour', 1), +(862, '2023-11-14 14:27:42', '2023-11-14 14:27:42', 172, 2, 'order:refund:isLastRefund', '是否为最后一单', '/p/order_refund/is_last_refund', 1), +(863, '2023-11-14 14:27:04', '2023-11-14 14:27:58', 172, 2, 'platform:finance:handleIntervention', '处理平台介入', '/p/order_refund/handle_platform_intervention', 3), +(864, '2023-11-14 14:26:18', '2023-11-14 14:26:25', 172, 2, 'order:refund:page', '列表', '/p/order_refund/page', 1), +(865, '2023-11-14 14:25:18', '2023-11-14 14:25:37', 583, 2, 'platform:finance:detail', '获取财务明细', '/p/finance/get_finance_detail', 1), +(866, '2023-11-14 14:24:43', '2023-11-14 14:24:43', 171, 2, 'order:order:getOrderByUserId', '获取用户订单数据', '/p/order/get_order_by_userId', 1), +(867, '2023-11-14 14:23:14', '2023-11-14 14:23:14', 430, 1, 'inventory:purchaseOrder:inboundExportExcel', '导入入库文件', '/m/purchase/order/inbound/exportExcel/*', 1), +(868, '2023-11-14 14:22:20', '2023-11-14 14:22:25', 430, 1, 'inventory:purchaseOrder:export', '导出入库商品', '/m/purchase/order/inbound/export', 1), +(869, '2023-11-14 14:21:08', '2023-11-14 14:21:08', 430, 1, 'inventory:purchaseOrder:exportExcel', '导入采购商品', '/m/purchase/order/export_excel', 2), +(870, '2023-11-14 14:20:31', '2023-11-14 14:20:31', 430, 1, 'inventory:purchaseOrder:downloadModel', '下载模板', '/m/purchase/order/download_model', 1), +(871, '2023-11-14 14:16:24', '2023-11-14 14:16:24', 148, 1, 'order:virtual:info', '虚拟订单信息', '/m/order_virtual_info/order_info/*', 1), +(872, '2023-11-14 14:14:37', '2023-11-14 14:14:57', 149, 1, 'order:ordre:listRefundRankingByReason', '退款原因排行', '/m/order_statistics/list_refund_ranking_by_reason', 1), +(873, '2023-11-14 14:13:29', '2023-11-14 14:15:06', 149, 1, 'order:refund:listRefundRankByProd', '商品退款排行', '/m/order_statistics/list_refund_ranking_by_prod', 1), +(874, '2023-11-14 14:12:33', '2023-11-14 14:13:48', 149, 1, 'order:refund:listOrderRefundInfo', '当月退款数据', '/m/order_statistics/list_order_refund_info', 1), +(875, '2023-11-14 14:11:38', '2023-11-14 14:11:38', 148, 1, 'order:ordre:onMonth', '当月数据统计', '/m/order_statistics/get_current_month_by_day', 1), +(876, '2023-11-14 14:09:13', '2023-11-14 14:09:13', 148, 1, 'order:ordre:getToday', '当天订单数据', '/m/order_statistics/get_to day_by_hour', 1), +(877, '2023-11-14 14:08:20', '2023-11-14 14:08:20', 148, 1, 'order:ordre:orderCount', '状态统计', '/m/order_statistics/order_count', 1), +(878, '2023-11-14 14:07:20', '2023-11-14 14:07:20', 148, 1, 'order:order:getOrderSelfStation', '获取提货订单详情', '/m/order_self_station/get_order_item_and_station_info', 1), +(879, '2023-11-14 14:06:05', '2023-11-14 14:06:05', 149, 1, 'order:refund:saveIntervention', '添加介入凭证', '/m/order_refund_intervention/save_intervention_voucher', 3), +(880, '2023-11-14 14:04:36', '2023-11-14 14:04:36', 149, 1, 'order:refund:returnMoney', '退货退款的最后处理', '/m/order_refund/return_money', 3), +(881, '2023-11-14 14:03:54', '2023-11-14 14:03:54', 149, 1, 'order:refund:isLastRefund', '是否为最后一单', '/m/order_refund/is_last_refund', 1), +(882, '2023-11-14 14:03:19', '2023-11-14 14:03:19', 149, 1, 'order:refund:return', '处理退款', '/m/order_refund/return_and_refund_audit', 3), +(883, '2023-11-14 14:01:40', '2023-11-14 14:01:40', 334, 1, 'order:orderInvoice:changeInvoice', '申请换开(向供应商)', '/m/order_invoice/changeInvoice', 3), +(884, '2023-11-14 14:01:00', '2023-11-14 14:01:00', 334, 1, 'order:orderInvoice:applyInvoice', '申请开票(向供应商)', '/m/order_invoice/applyInvoice', 2), +(885, '2023-11-14 14:00:07', '2023-11-14 14:00:17', 334, 1, 'order:orderInvoice:isUpload', '是否上传发票查询', '/m/order_invoice/is_upload', 1), +(886, '2023-11-15 11:58:16', '2023-11-15 11:58:16', 171, 2, 'order:order:getOrderDetail', '获取订单项详情', '/mp/order_item/get_order_detail', 1), +(887, '2023-11-15 11:52:28', '2023-11-15 11:52:28', 148, 1, 'order:order:getOrderDetail', '获取订单项', '/mp/order_item/get_order_detail', 1), +(888, '2023-11-15 11:50:26', '2023-11-15 11:50:26', 148, 1, 'order:order:getByUserId', '获取某个用户的订单', '/mp/order/get_shop_order_by_userId', 1), +(889, '2023-11-15 11:49:01', '2023-11-15 11:49:13', 148, 1, 'order:order:exportOrderExcel', '导入订单', '/mp/order/export_order_excel', 2), +(890, '2023-11-15 11:47:49', '2023-11-15 11:47:49', 148, 1, 'order:order:changeOrderRemark', '修改订单备注', '/mp/order/change_order_remark', 3), +(891, '2023-11-15 11:47:12', '2023-11-15 11:47:12', 148, 1, 'order:order:changeUserAddr', '修改用户收货地址', '/mp/order/change_user_addr', 3), +(892, '2023-11-15 11:46:27', '2023-11-15 11:46:27', 148, 1, 'order:order:changeAmount', '查询修改订单地址后的运费', '/mp/order/get_change_amount', 1), +(893, '2023-11-15 11:45:36', '2023-11-15 11:45:36', 148, 1, 'order:order:sourcing', '采购', '/mp/order/sourcing_order', 3), +(894, '2023-11-15 11:44:10', '2023-11-15 11:44:15', 148, 1, 'order:order:item:undelivery', '订单项待发货数量查询', '/mp/order/order_item_and_address/*', 1), +(895, '2023-11-15 11:43:14', '2023-11-15 11:43:25', 148, 1, 'order:order:addr', '获取订单地址', '/mp/order/order_addr/*', 1), +(896, '2023-11-15 11:38:39', '2023-11-15 11:39:14', 148, 1, 'order:order:page', '列表', '/mp/order/page', 1), +(897, '2023-11-15 10:55:11', '2023-11-15 10:55:11', 564, 2, 'marketing:liveRoom:delete', '删除', '/p/live_room', 4), +(898, '2023-11-15 10:54:41', '2023-11-15 10:54:41', 564, 2, 'marketing:liveRoom:info', '查看', '/p/live_room', 1), +(899, '2023-11-15 10:54:06', '2023-11-15 10:54:06', 564, 2, 'marketing:liveRoom:page', '列表', '/p/live_room/page', 1), +(900, '2023-11-15 10:48:55', '2023-11-15 10:48:55', 558, 1, 'marketing:liveRoom:prod', '获取直播间商品列表', '/m/live_room/list_live_room_prod', 1), +(901, '2023-11-15 10:48:21', '2023-11-15 10:48:21', 558, 1, 'marketing:liveRoom:delete', '删除', '/m/live_room', 4), +(902, '2023-11-15 10:47:58', '2023-11-15 10:47:58', 558, 1, 'marketing:liveRoom:update', '修改', '/m/live_room', 3), +(903, '2023-11-15 10:47:40', '2023-11-15 10:47:40', 558, 1, 'marketing:liveRoom:save', '新增', '/m/live_room', 2), +(904, '2023-11-15 10:47:03', '2023-11-15 10:47:03', 558, 1, 'marketing:liveRoom:get', '获取', '/m/live_room', 1), +(905, '2023-11-15 10:46:27', '2023-11-15 10:46:27', 558, 1, 'marketing:liveRoom:page', '列表', '/m/live_room/page', 1), +(906, '2023-11-15 10:40:57', '2023-11-15 10:40:57', 363, 2, 'distribution:distributionWithdrawCash:page', '提现记录列表', '/p/distribution_withdraw_cash/page', 1), +(907, '2023-11-15 10:38:21', '2023-11-15 10:38:32', 363, 2, 'distribution:distributionUserWallet:page', '列表', '/p/distribution_user_wallet/page', 1), +(908, '2023-11-15 10:37:16', '2023-11-15 10:38:51', 363, 2, 'distribution:wallet:bill:page', '流水列表', '/p/distribution_user_wallet_bill/wallet_bill_page', 1), +(909, '2023-11-15 10:35:06', '2023-11-15 10:35:06', 362, 2, 'distribution:income:page', '分销业绩列表', '/mp/distribution_user_income/effect_page', 1), +(910, '2023-11-15 10:30:39', '2023-11-15 10:30:39', 359, 2, 'distribution:user:ban:info', '获取分销员封禁信息', '/p/distribution_user/ban_info', 1), +(911, '2023-11-15 10:29:19', '2023-11-15 10:29:19', 359, 2, 'distribution:user:achievement:page', '业绩列表', '/p/distribution_user/achievement_page', 1), +(912, '2023-11-15 10:24:51', '2023-11-15 10:24:51', 359, 2, 'distribution:user:bind:page', '绑定关系列表', '/p/distribution_user_bind/page', 1), +(913, '2023-11-15 10:23:49', '2023-11-15 10:23:49', 359, 2, 'distribution:user:ban:page', '分销员封禁记录列表', '/p/distribution_user_ban/page', 1), +(914, '2023-11-15 10:22:31', '2023-11-15 10:22:31', 361, 2, 'distribution:spu:delete', '删除分销商品信息', '/p/distribution_spu', 4), +(915, '2023-11-15 10:21:42', '2023-11-15 10:21:42', 361, 2, 'distribution:spu:get:offline', '获取分销商品审核信息', '/p/distribution_spu/get_offline_handle_event', 1), +(916, '2023-11-15 10:21:04', '2023-11-15 10:26:06', 361, 2, 'distribution:spu:audit', '审核分销商品', '/p/distribution_spu/audit', 2), +(917, '2023-11-15 10:16:35', '2023-11-15 10:21:55', 361, 2, 'distribution:spu:offline', '下线分销商品', '/p/distribution_spu/offline', 2), +(918, '2023-11-15 10:15:35', '2023-11-15 10:15:35', 361, 2, 'distribution:spu:get', '获取分销商品', '/p/distribution_spu', 1), +(919, '2023-11-15 10:13:23', '2023-11-15 10:13:23', 360, 2, 'distribution:msg:page', '列表', '/p/distribution_msg/page', 1), +(920, '2023-11-15 10:12:11', '2023-11-15 10:12:11', 359, 2, 'distribution:auditing:get', '获取分销员申请信息', '/p/distribution_auditing', 1), +(921, '2023-11-15 10:11:22', '2023-11-15 10:11:35', 359, 2, 'distribution:auditing:page', '审核列表', '/p/distribution_auditing/page', 1), +(922, '2023-11-15 10:07:27', '2023-11-15 10:07:34', 364, 1, 'marketing:distributionSpu:get', '获取分销商品', '/m/distribution_spu', 1), +(923, '2023-11-15 10:05:21', '2023-11-15 10:05:39', 361, 2, 'marketing:distributionSpu:log', '分销收入记录', '/mp/distribution_user_income/page_sales_record', 1), +(924, '2023-11-15 09:55:08', '2023-11-15 10:00:56', 270, 2, 'marketing:discount:get:offline', '查看下线事件', '/mp/discount/get_offline_handle_event/*', 1), +(925, '2023-11-15 09:53:20', '2023-11-15 09:54:10', 177, 2, 'marketing:discount:page', '列表', '/mp/discount/platform_page', 1), +(926, '2023-11-15 09:52:29', '2023-11-15 10:01:35', 154, 1, 'marketing:discount:get', '查看', '/mp/discount/info/*', 1), +(927, '2023-11-15 09:51:19', '2023-11-15 09:51:19', 154, 1, 'marketing:discount:page', '列表', '/mp/discount/page', 1), +(928, '2023-11-15 09:50:12', '2023-11-15 09:50:12', 634, 2, 'user:user:get:coupon', '获取用户的优惠券', '/p/coupon/page_coupon_user', 1), +(929, '2023-11-15 09:48:14', '2023-11-15 09:48:14', 233, 2, 'marketing:coupon:shop:coupon', '商家优惠券分页查询', '/mp/coupon/admin_page', 1), +(930, '2023-11-15 09:47:02', '2023-11-15 09:47:02', 254, 2, 'marketing:coupon:platform:coupons', '分页获取平台优惠劵', '/mp/coupon/page_platform_coupons', 1), +(931, '2023-11-15 09:44:48', '2023-11-15 09:45:12', 634, 2, 'user:user:send:coupon', '平台批量发放优惠券', '/mp/coupon/send_user_coupon', 1), +(932, '2023-11-15 09:43:46', '2023-11-15 09:43:46', 235, 1, 'marketing:coupon:user:coupon', '获取用户的优惠券列表', '/mp/coupon/page_shop_coupon_user', 1), +(933, '2023-11-15 09:42:39', '2023-11-15 09:42:39', 254, 2, 'marketing:coupon:page', '列表', '/mp/coupon/page', 1), +(934, '2023-11-15 09:38:38', '2023-11-15 09:38:38', 235, 1, 'marketing:coupon:get', '查看', '/mp/coupon', 1), +(935, '2023-11-15 09:36:48', '2023-11-15 09:36:48', 235, 1, 'marketing:coupon:page', '列表', '/mp/coupon/page', 1), +(936, '2023-11-15 09:30:42', '2023-11-15 09:30:51', 550, 1, 'marketing:offerPackage:page', '列表', '/m/combo/page', 1), +(937, '2023-11-15 09:23:11', '2023-11-15 09:23:11', 278, 2, 'marketing:group:page', '列表', '/mp/group_activity/platform_page', 1), +(938, '2023-11-15 09:22:08', '2023-11-15 09:22:08', 275, 1, 'marketing:group:page', '列表', '/mp/group_activity/page', 1), +(939, '2023-11-15 15:18:18', '2023-11-15 15:18:18', 564, 2, 'platform:liveRoom:offline', '违规下架', '/p/live_room/offline', 2), +(940, '2023-11-15 15:17:52', '2023-11-15 15:17:52', 564, 2, 'platform:liveRoom:top', '置顶', '/p/live_room/toTop', 2), +(941, '2023-11-16 11:48:58', '2023-11-16 11:48:58', 634, 2, 'user:tagUser:delete', '删除会员的某个标签', '/p/user_tag_user/delete_user_tag', 4), +(942, '2023-11-16 11:47:09', '2023-11-16 11:47:09', 634, 2, 'user:tag:page', '客户标签列表', '/p/user_tag/tag_page', 1), +(943, '2023-11-16 11:46:42', '2023-11-16 11:46:42', 635, 2, 'user:tag:page', '客户标签列表', '/p/user_tag/tag_page', 1), +(944, '2023-11-16 11:45:46', '2023-11-16 11:45:46', 635, 2, 'user:tag:tagList', '可以添加的标签列表', '/p/user_tag/tag_list', 1), +(945, '2023-11-16 11:44:06', '2023-11-16 11:44:06', 635, 2, 'user:tag:show', '获取客户标签', '/p/user_tag', 1), +(946, '2023-11-16 11:33:57', '2023-11-16 11:33:57', 634, 2, 'user:scoreLog:page', '用户积分记录列表', '/p/user_score_log/page', 1), +(947, '2023-11-16 11:31:39', '2023-11-16 11:31:39', 639, 2, 'user:rights:show', '获取用户权益信息', '/p/user_rights', 1), +(948, '2023-11-16 11:30:52', '2023-11-16 11:30:52', 639, 2, 'user:rights:page', '用户权益信息列表', '/p/user_rights/page', 1), +(949, '2023-11-16 11:28:11', '2023-11-16 11:28:11', 634, 2, 'user:recharge:pageUserLog', '用户的余额明细', '/p/user_recharge/page_user_log', 1), +(950, '2023-11-16 11:27:00', '2023-11-16 11:27:00', 634, 2, 'user:recharge:updateUserBalance', '批量修改会员余额', '/p/user_recharge/update_user_balance', 3), +(951, '2023-11-16 11:25:27', '2023-11-16 11:25:27', 638, 2, 'user:recharge:info', '获取余额充值套餐数据', '/p/user_recharge/info', 1), +(952, '2023-11-16 11:24:08', '2023-11-16 11:28:24', 638, 2, 'user:recharge:list', '余额充值列表数据', '/p/user_recharge/list', 1), +(953, '2023-11-16 11:21:15', '2023-11-16 11:21:15', 637, 2, 'user:userLevelLog:page', '获取付费会员购买记录', '/p/user_level_log/page_buy_level_log', 1), +(954, '2023-11-16 11:17:26', '2023-11-16 11:17:26', 634, 2, 'user:leve:batchUserScore', '批量修改会员积分', '/p/user_level/batch_user_score', 3), +(955, '2023-11-16 11:16:49', '2023-11-16 11:16:49', 634, 2, 'user:leve:updateGrowth', '批量修改会员成长值', '/p/user_level/update_growth', 3), +(956, '2023-11-16 11:16:11', '2023-11-16 11:16:11', 636, 2, 'user:leve:updateUserLevel', '新增/更新用户会员等级', '/p/user_level/update_user_level', 3), +(957, '2023-11-16 11:09:22', '2023-11-16 11:09:22', 636, 2, 'user:leve:recruitStatus', '付费会员,是否可以招募会员', '/p/user_level/recruit_status', 3), +(958, '2023-11-16 11:07:51', '2023-11-16 11:07:51', 636, 2, 'user:leve:show', '获取会员等级表', '/p/user_level', 1), +(959, '2023-11-16 11:07:05', '2023-11-16 11:07:05', 636, 2, 'user:leve:list', '会员等级表列表', '/p/user_level/list', 1), +(960, '2023-11-16 11:06:27', '2023-11-16 11:06:27', 634, 2, 'user:leve:list', '会员等级表列表', '/p/user_level/list', 1), +(961, '2023-11-16 11:05:04', '2023-11-16 11:05:04', 634, 2, 'user:growthLog:page', '用户成长值记录列表', '/p/user_growth_log/page', 1), +(962, '2023-11-16 10:58:22', '2023-11-16 10:58:22', 634, 2, 'user:user:downModel', '下载用户信息导入excel模板', '/p/user/down_model', 1), +(963, '2023-11-16 10:57:23', '2023-11-16 10:57:23', 634, 2, 'user:user:update', '修改', '/p/user', 3), +(964, '2023-11-16 10:56:40', '2023-11-16 10:56:40', 634, 2, 'user:user:show', '获取会员信息', '/p/user/user_info', 1), +(965, '2023-11-16 10:55:45', '2023-11-16 10:55:45', 634, 2, 'user:user:page', '会员列表', '/p/user/user_page', 1), +(966, '2023-11-16 10:47:08', '2023-11-16 10:47:08', 587, 1, 'customer:customer:downModel', '下载客户信息excel模板', '/m/user/down_model', 1), +(967, '2023-11-16 10:37:39', '2023-11-16 10:37:39', 587, 1, 'customer:customer:info', '获取会员信息', '/m/user/user_info', 1), +(968, '2023-11-16 10:36:26', '2023-11-16 10:36:26', 587, 1, 'customer:customer:update', '修改', '/m/user', 3), +(969, '2023-11-16 10:33:35', '2023-11-16 10:33:35', 587, 1, 'customer:customer:shopCustomerPage', '客户列表', '/m/user/shop_customer_page', 1), +(970, '2023-11-16 10:24:48', '2023-11-16 10:24:48', 281, 2, 'seckill:time:info', '秒杀时间配置信息', '/p/seckill_time/info/*', 1), +(971, '2023-11-16 10:22:31', '2023-11-16 10:22:31', 281, 2, 'mp:seckill:getJoinSeckillMerchantNum', '正在参与秒杀活动的商家数量', '/mp/seckill/get_join_seckill_merchant_num', 1), +(972, '2023-11-16 10:20:58', '2023-11-16 10:20:58', 289, 1, 'mp:seckill:auditApply', '违规活动提交审核', '/mp/seckill/audit_apply', 2), +(973, '2023-11-16 10:20:18', '2023-11-16 10:20:18', 294, 2, 'mp:seckill:audit', '审核活动', '/mp/seckill/audit', 2), +(974, '2023-11-16 10:19:36', '2023-11-16 10:19:36', 294, 2, 'mp:seckill:offline', '下线秒杀活动', '/mp/seckill/offline', 3), +(975, '2023-11-16 10:18:49', '2023-11-16 10:18:49', 294, 2, 'mp:seckill:getOfflineHandleEvent', '获取最新下线的事件', '/mp/seckill/get_offline_handle_event/*', 1), +(976, '2023-11-16 10:18:29', '2023-11-16 10:18:29', 289, 1, 'mp:seckill:getOfflineHandleEvent', '获取最新下线的事件', '/mp/seckill/get_offline_handle_event/*', 1), +(977, '2023-11-16 10:16:48', '2023-11-16 10:16:48', 289, 1, 'mp:seckill:delete', '删除秒杀信息', '/mp/seckill', 4), +(978, '2023-11-16 10:16:00', '2023-11-16 10:16:00', 289, 1, 'mp:seckill:invalid', '使秒杀商品失效', '/mp/seckill/invalid/*', 3), +(979, '2023-11-16 10:14:48', '2023-11-16 10:14:48', 294, 2, 'mp:seckill:show', '查询秒杀信息', '/mp/seckill', 1), +(980, '2023-11-16 10:14:22', '2023-11-16 10:14:22', 289, 1, 'mp:seckill:show', '查询秒杀信息', '/mp/seckill', 1), +(981, '2023-11-16 10:12:45', '2023-11-16 10:12:45', 289, 1, 'mp:seckill:save', '新增秒杀信息', '/mp/seckill', 2), +(982, '2023-11-16 10:08:25', '2023-11-16 10:08:25', 294, 2, 'mp:seckill:listSeckillSpuByTime', '秒杀商品信息列表', '/mp/seckill/list_seckill_spu_by_time', 1), +(983, '2023-11-16 10:07:50', '2023-11-16 10:07:50', 289, 1, 'mp:seckill:listSeckillSpuByTime', '秒杀商品信息列表', '/mp/seckill/list_seckill_spu_by_time', 1), +(984, '2023-11-16 10:06:28', '2023-11-16 10:06:28', 281, 2, 'mp:seckill:listEndSeckill', '已经结束的秒杀信息列表', '/mp/seckill/list_end_seckill', 1), +(985, '2023-11-16 10:05:25', '2023-11-16 10:05:25', 279, 1, 'mp:seckill:listEndSeckill', '已经结束的秒杀信息列', '/mp/seckill/list_end_seckill', 1), +(986, '2023-11-16 10:04:13', '2023-11-16 10:04:13', 279, 1, 'mp:seckill:list', '秒杀信息列表', '/mp/seckill/list_seckill', 1), +(987, '2023-11-16 10:03:15', '2023-11-16 10:03:15', 281, 2, 'mp:seckill:list', '秒杀信息列表', '/mp/seckill/list_seckill', 1), +(988, '2023-11-16 09:15:15', '2023-11-16 09:15:15', 281, 2, 'seckill:category:show', '获取秒杀分类信息', '/mp/seckill_category', 1), +(989, '2023-11-16 09:11:54', '2023-11-16 09:13:32', 281, 2, 'seckill:category:list', '秒杀分类信息列表', '/mp/seckill_category/list', 1), +(990, '2023-11-16 09:10:41', '2023-11-16 09:13:38', 289, 1, 'seckill:category:list', '秒杀分类信息列表', '/mp/seckill_category/list', 1), +(991, '2023-11-15 17:39:31', '2023-11-15 17:39:31', 545, 1, 'mp:spuSearch:renovationPage', '商品信息列表(商家装修商品列表)', '/mp/search/renovation_page', 1), +(992, '2023-11-15 17:39:12', '2023-11-15 17:39:12', 541, 1, 'mp:spuSearch:renovationPage', '商品信息列表(商家装修商品列表)', '/mp/search/renovation_page', 1), +(993, '2023-11-15 17:38:20', '2023-11-15 17:38:20', 513, 1, 'mp:spuSearch:pageComboAddSpu', '/mp/search/page_combo_add_spu', '/mp/search/page_combo_add_spu', 1), +(994, '2023-11-15 17:37:59', '2023-11-15 17:37:59', 551, 1, 'mp:spuSearch:pageComboAddSpu', '套餐以及赠品选择商品列表', '/mp/search/page_combo_add_spu', 1), +(995, '2023-11-15 17:36:29', '2023-11-15 17:36:29', 443, 1, 'mp:spuSearch:pageConsignmentSpu', '代销商品列表', '/mp/search/pageConsignmentSpu', 1), +(996, '2023-11-15 17:34:25', '2023-11-15 17:34:25', 433, 1, 'mp:spuSearch:pageShopSpuList', '获取商家的商品列表', '/mp/search/page_shop_spu_list', 1), +(997, '2023-11-15 17:34:06', '2023-11-15 17:34:06', 436, 1, 'mp:spuSearch:pageShopSpuList', '获取商家的商品列表', '/mp/search/page_shop_spu_list', 1), +(998, '2023-11-15 17:32:29', '2023-11-15 17:32:29', 431, 1, 'mp:spuSearch:pageSupplierSpuList', '获取某个供应商或商家(不含代销商品)的商品列表', '/mp/search/page_supplier_spu_list', 1), +(999, '2023-11-15 17:29:52', '2023-11-15 17:29:52', 142, 1, 'mp:spuSearch:pageSupplySpu', '供应商品列表', '/mp/search/page_supply_spu', 1), +(1000, '2023-11-15 17:28:24', '2023-11-15 17:28:24', 364, 1, 'mp:spuSearch:pageDistributionSpu', '分销商品列表', '/mp/search/page_distribution_spu', 1), +(1001, '2023-11-15 17:27:29', '2023-11-15 17:27:29', 152, 1, 'mp:spuSearch:page', '商品列表', '/mp/search/page', 1), +(1002, '2023-11-15 17:25:15', '2023-11-15 17:25:15', 148, 1, 'mp:order:soldExcel', '导出订单excel', '/mp/order/search/sold_excel', 1), +(1003, '2023-11-15 17:19:54', '2023-11-15 17:19:54', 172, 2, 'mp:orderRefund:page', '退款订单列表', '/mp/search/order_refund/page', 1), +(1004, '2023-11-15 17:18:50', '2023-11-15 17:19:25', 149, 1, 'mp:orderRefund:page', '退款订单列表', '/mp/search/order_refund/page', 1), +(1005, '2023-11-15 17:16:20', '2023-11-15 17:16:20', 479, 3, 'supplier:purchaseOrderSearch:page', '采购订单列表', '/s/purchase_order_search/page', 1), +(1006, '2023-11-15 17:14:38', '2023-11-15 17:14:38', 508, 3, 'supplier:spu:page', '商品信息列表', '/s/search/page', 1), +(1007, '2023-11-15 17:13:42', '2023-11-15 17:13:42', 478, 3, 'supplier:order:soldExcel', '导出订单excel', '/s/order/search/page', 1), +(1008, '2023-11-15 17:09:19', '2023-11-15 17:09:19', 534, 2, 'platform:spu:renovationPage', '商品信息列表(平台装修商品列表)', '/p/search/renovation_page', 1), +(1009, '2023-11-15 17:08:52', '2023-11-15 17:08:52', 529, 2, 'platform:spu:renovationPage', '商品信息列表(平台装修商品列表)', '/p/search/renovation_page', 1), +(1010, '2023-11-15 17:03:13', '2023-11-15 17:03:13', 643, 2, 'platform:spu:scorePage', '积分商品列表', '/p/search/score_page', 1), +(1011, '2023-11-15 17:02:14', '2023-11-15 17:02:14', 175, 2, 'platform:spu:page', '商品管理信息列表', '/p/search/page', 1), +(1012, '2023-11-15 17:00:27', '2023-11-15 17:00:27', 171, 2, 'platform:order:soldExcel', '导出订单excel', '/p/order/search/sold_excel', 1), +(1013, '2023-11-15 16:58:28', '2023-11-15 16:58:28', 641, 2, 'platform:order:scoreSoldExcel', '积分订单导出excel', '/p/order/search/score_sold_excel', 1), +(1014, '2023-11-15 16:55:44', '2023-11-15 16:55:44', 430, 1, 'shop:purchaseOrderSearch:page', '采购订单列表', '/m/purchase_order_search/page', 1), +(1015, '2023-11-15 16:53:28', '2023-11-15 16:53:28', 334, 1, 'shop:orderInvoiceSearch:page', '获取订单发票列表', '/m/order_invoice_search/page', 1), +(1016, '2023-11-15 16:48:43', '2023-11-15 16:48:43', 503, 3, 'supplier:allinpayCompany:signAcctProtocol', '账户协议签约(通联支付)', '/s/apply_supplier/allinpay/company/sign_acct_protocol', 1), +(1017, '2023-11-15 16:47:38', '2023-11-15 16:47:38', 503, 3, 'supplier:allinpayCompany:bindCompanyAccount', '企业会员绑定对公户(通联支付)', '/s/apply_supplier/allinpay/company/bind_company_account', 2), +(1018, '2023-11-15 16:45:45', '2023-11-15 16:45:45', 503, 3, 'supplier:allinpayCompany:unbindBankCard', '解绑银行卡(通联支付)', '/s/apply_supplier/allinpay/company/unbind_bank_card', 3), +(1019, '2023-11-15 16:44:06', '2023-11-15 16:44:06', 503, 3, 'supplier:allinpayCompany:applyBindBankCard', '请求绑定银行卡(通联支付)(法人账户)', '/s/apply_supplier/allinpay/company/apply_bind_bank_card', 2), +(1020, '2023-11-15 16:42:42', '2023-11-15 16:42:42', 503, 3, 'supplier:allinpayCompany:unbindPhone', '解绑手机号(通联支付)', '/s/apply_supplier/allinpay/company/unbind_phone', 3), +(1021, '2023-11-15 16:41:48', '2023-11-15 16:42:48', 503, 3, 'supplier:allinpayCompany:bindPhone', '绑定手机号(通联支付)', '/s/apply_supplier/allinpay/company/bind_phone', 2), +(1022, '2023-11-15 16:39:38', '2023-11-15 16:40:16', 503, 3, 'supplier:allinpayCompany:sendVerificationCode', '发送短信验证码(通联绑定手机号)', '/s/apply_supplier/allinpay/company/send_verification_code', 1), +(1023, '2023-11-15 16:33:38', '2023-11-15 16:40:23', 503, 3, 'supplier:allinpayCompany:getCompanyInfo', '获取企业信息', '/s/apply_supplier/allinpay/company/get_company_info', 1), +(1024, '2023-11-15 16:13:45', '2023-11-15 16:19:25', 316, 2, 'shop:accountDetail:getRefundInfo', '获取指定店铺的退款结算明细列表', '/p/account_detail/get_refund_info', 1), +(1025, '2023-11-15 16:09:19', '2023-11-15 16:20:34', 316, 2, 'platform:accountDetail:getPayInfo', '获取指定店铺的收入结算明细列表', '/p/account_detail/get_pay_info', 1), +(1026, '2023-11-15 16:07:02', '2023-11-15 16:20:39', 316, 2, 'platform:accountDetail:/getRefundAccountDetailInfo', '获取退款账户详情列表', '/p/account_detail/get_refund_account_detail_info', 1), +(1027, '2023-11-15 16:06:02', '2023-11-15 16:20:44', 316, 2, 'platform:accountDetail:getIncomeAccountDetailInfo', '获取收入账户详情列表', '/p/account_detail/get_income_account_detail_info', 1), +(1028, '2023-11-15 16:04:05', '2023-11-15 16:23:24', 316, 2, 'platform:accountDetail:getRefundAccountDetail', '获取退款账户详情', '/p/account_detail/get_refund_account_detail', 1), +(1029, '2023-11-15 16:02:03', '2023-11-15 16:23:30', 316, 2, 'platform:accountDetail:getIncomeAccountDetail', '获取收入账户详情', '/p/account_detail/get_income_account_detail', 1), +(1030, '2023-11-15 15:40:25', '2023-11-15 15:40:25', 665, 1, 'shop:pay:isPa', '根据订单号查询该订单是否已经支付', '/m/pay/is_pay/*', 1), +(1031, '2023-11-15 15:38:54', '2023-11-15 15:38:54', 665, 1, 'shop:pay:recharge', '余额充值', '/m/pay/recharge', 2), +(1032, '2023-11-15 15:36:00', '2023-11-15 15:36:00', 662, 1, 'shop:allinpayOrder:resendPaySms', '重新发送支付验证码 (通联支付)', '/m/allinpay/order/resend_pay_sms', 1), +(1033, '2023-11-15 15:35:34', '2023-11-15 15:35:34', 148, 1, 'shop:allinpayOrder:resendPaySms', '重新发送支付验证码 (通联支付)', '/m/allinpay/order/resend_pay_sms', 1), +(1034, '2023-11-15 15:31:42', '2023-11-15 15:31:42', 662, 1, 'shop:allinpayOrder:payConfirmByBacSms', '确定支付 - 后台+短信验证(通联支付)', '/m/allinpay/order/pay_confirm_by_back_sms', 2), +(1035, '2023-11-15 15:31:18', '2023-11-15 15:31:18', 148, 1, 'shop:allinpayOrder:payConfirmByBacSms', '确定支付 - 后台+短信验证(通联支付)', '/m/allinpay/order/pay_confirm_by_back_sms', 2), +(1036, '2023-11-15 15:23:19', '2023-11-15 15:23:19', 271, 1, 'shop:allinpayCompany:signAcctProtocol', '账户协议签约(通联支付)', '/m/apply_shop/allinpay/company/sign_acct_protocol', 2), +(1037, '2023-11-15 15:22:06', '2023-11-15 15:22:06', 271, 1, 'shop:allinpayCompany:bindCompanyAccount', '企业会员绑定对公户(通联支付)', '/m/apply_shop/allinpay/company/bind_company_account', 2), +(1038, '2023-11-15 15:20:08', '2023-11-15 15:20:08', 271, 1, 'shop:allinpayCompany:unbindBankCard', '解绑银行卡(通联支付)', '/m/apply_shop/allinpay/company/unbind_bank_card', 3), +(1039, '2023-11-15 15:19:00', '2023-11-15 15:19:00', 271, 1, 'shop:allinpayCompany:applyBindBankCard', '请求绑定银行卡-法人(通联支付)', '/m/apply_shop/allinpay/company/apply_bind_bank_card', 2), +(1040, '2023-11-15 15:16:39', '2023-11-15 15:16:39', 271, 1, 'shop:allinpayCompany:unbindPhone', '解绑手机号(通联支付)', '/mall4cloud_payment/m/apply_shop/allinpay/company/unbind_phone', 3), +(1041, '2023-11-15 15:15:39', '2023-11-15 15:15:39', 271, 1, 'shop:allinpayCompany:bindPhone', '绑定手机号(通联支付)', '/m/apply_shop/allinpay/company/bind_phone', 2), +(1042, '2023-11-15 15:09:21', '2023-11-15 15:17:12', 271, 1, 'shop:allinpayCompany:sendVerificationCode', '发送短信验证码(通联支付)', '/m/apply_shop/allinpay/company/send_verification_code', 2), +(1043, '2023-11-15 15:00:31', '2023-11-15 15:00:31', 148, 1, 'shop:allinpayCompany:getCompanyInfo', '获取企业信息', '/m/apply_shop/allinpay/company/get_company_info', 1), +(1044, '2023-11-15 14:45:29', '2023-11-15 14:45:29', 443, 1, 'product:spu:supplierExcel', '代销商品导出excel', '/mp/spu/supplier_excel', 1), +(1045, '2023-11-15 14:44:47', '2023-11-15 14:44:47', 142, 1, 'product:spu:importSupplierSpu', '商家单个/批量导入供应商商品', '/mp/spu/import_supplier_spu', 2), +(1046, '2023-11-15 14:39:30', '2023-11-15 14:39:30', 152, 1, 'product:spu:auditApply', '违规下架商品提交审核', '/mp/spu/audit_apply', 2), +(1047, '2023-11-15 14:38:24', '2023-11-15 14:38:24', 175, 2, 'product:spu:audit', '审核商品', '/mp/spu/audit', 2), +(1048, '2023-11-15 14:37:37', '2023-11-15 14:37:37', 152, 1, 'product:spu:getOfflineHandleEvent', '获取最新下线的事件', '/mp/spu/get_offline_handle_event/*', 1), +(1049, '2023-11-15 14:36:45', '2023-11-15 14:36:45', 175, 2, 'product:spu:getOfflineHandleEvent', '获取最新下线的事件', '/mp/spu/get_offline_handle_event/*', 1), +(1050, '2023-11-15 14:35:40', '2023-11-15 14:35:40', 175, 2, 'product:spu:batchOffline', '批量下线商品', '/mp/spu/batch_offline', 1), +(1051, '2023-11-15 14:31:07', '2023-11-15 14:31:07', 152, 1, 'product:spu:exportExcel', '导入spu文件', '/mp/spu/export_excel', 2), +(1052, '2023-11-15 14:30:24', '2023-11-15 14:30:24', 152, 1, 'product:spu:downModel', '导出商品excel模板', '/mp/spu/down_model', 1), +(1053, '2023-11-15 14:28:56', '2023-11-15 14:28:56', 443, 1, 'product:spu:soldExcel', '导出商品excel', '/mp/spu/sold_excel', 1), +(1054, '2023-11-15 14:28:34', '2023-11-15 14:28:34', 152, 1, 'product:spu:soldExcel', '导出商品excel', '/mp/spu/sold_excel', 1), +(1055, '2023-11-15 14:14:39', '2023-11-15 14:14:39', 443, 1, 'product:spu:prodStatus', '商品上下架', '/mp/spu/prod_status', 3), +(1056, '2023-11-15 14:14:12', '2023-11-15 14:14:12', 152, 1, 'product:spu:prodStatus', '商品上下架', '/mp/spu/prod_status', 3), +(1057, '2023-11-15 14:13:23', '2023-11-15 14:13:23', 443, 1, 'product:spu:updateSpuData', '修改spu(名称、价格、库存、序号)信息', '/mp/spu/update_spu_data', 3), +(1058, '2023-11-15 14:13:06', '2023-11-15 14:13:06', 152, 1, 'product:spu:updateSpuData', '修改spu(名称、价格、库存、序号)信息', '/mp/spu/update_spu_data', 3), +(1059, '2023-11-15 14:12:07', '2023-11-15 14:12:07', 443, 1, 'product:spu:delete', '根据spu信息id删除spu信息', '/mp/spu', 4), +(1060, '2023-11-15 14:11:21', '2023-11-15 14:11:21', 443, 1, 'product:spu:edit', '更新商品信息', '/mp/spu', 3), +(1061, '2023-11-15 14:08:01', '2023-11-15 14:08:01', 443, 1, 'product:spu:show', '获取商品信息', '/mp/spu', 1), +(1062, '2023-11-15 14:02:18', '2023-11-15 14:08:07', 142, 1, 'product:spu:show', '获取商品信息', '/mp/spu', 1), +(1063, '2023-11-15 13:56:56', '2023-11-15 13:56:56', 162, 2, 'product:category:soldExcel', '导出分类excel', '/mp/category/sold_excel', 1), +(1064, '2023-11-15 13:56:31', '2023-11-15 13:56:31', 139, 1, 'product:category:soldExcel', '导出分类excel', '/mp/category/sold_excel', 1), +(1065, '2023-11-15 13:55:21', '2023-11-15 13:55:21', 139, 1, 'product:category:/categoryEnableOrDisable', '分类的启用或禁用', '/mp/category/category_enable_or_disable', 1), +(1066, '2023-11-15 13:54:48', '2023-11-15 13:54:48', 162, 2, 'product:category:/categoryEnableOrDisable', '分类的启用或禁用', '/mp/category/category_enable_or_disable', 3), +(1067, '2023-11-15 13:52:58', '2023-11-15 13:52:58', 152, 1, 'product:category:enableCategories', '获取平台/店铺启用的分类信息', '/mp/category/enable_categories', 1), +(1068, '2023-11-15 13:52:19', '2023-11-15 13:52:19', 175, 2, 'product:category:enableCategories', '获取平台/店铺启用的分类信息', '/mp/category/enable_categories', 1), +(1069, '2023-11-15 13:49:08', '2023-11-15 13:49:08', 139, 1, 'product:category:shopCategories', '获取店铺所有的分类信息', '/mp/category/shop_categories', 1), +(1070, '2023-11-15 13:39:18', '2023-11-15 13:39:18', 162, 2, 'product:category:platformCategories', '获取平台所有的分类信息', '/mp/category/platform_categories', 1), +(1071, '2023-11-15 13:37:54', '2023-11-15 13:37:54', 162, 2, 'product:category:show', '获取分类信息', '/mp/category', 1), +(1072, '2023-11-15 12:00:53', '2023-11-15 12:00:53', 500, 2, 'product:brand:listByParams', '根据参数获取平台品牌列表', '/mp/attr/get_shop_attrs', 1), +(1073, '2023-11-15 12:00:32', '2023-11-15 12:00:32', 306, 2, 'product:brand:listByParams', '根据参数获取平台品牌列表', '/mp/attr/get_shop_attrs', 1), +(1074, '2023-11-15 11:59:38', '2023-11-15 11:59:38', 501, 2, 'product:brand:listByParams', '根据参数获取平台品牌列表', '/mp/brand/list_by_params', 1), +(1075, '2023-11-15 11:59:15', '2023-11-15 11:59:15', 365, 2, 'product:brand:listByParams', '根据参数获取平台品牌列表', '/mp/brand/list_by_params', 1), +(1076, '2023-11-15 11:52:04', '2023-11-15 11:52:04', 642, 2, 'score:attr:getShopAttrs', '获取店铺中的销售属性', '/mp/attr/get_shop_attrs', 1), +(1077, '2023-11-15 11:50:22', '2023-11-15 11:50:22', 175, 2, 'product:attr:getAttrsByCategoryId', '根据分类及属性类别获取属性列表', '/mp/attr/get_attrs_by_category_id', 1), +(1078, '2023-11-15 11:48:00', '2023-11-15 11:48:00', 160, 2, 'product:attr:show', '获取属性信息', '/mp/attr', 1), +(1079, '2023-11-15 11:46:04', '2023-11-15 11:46:04', 160, 2, 'product:attr:page', '获取属性信息列表', '/mp/attr/page', 1), +(1080, '2023-11-15 11:36:06', '2023-11-15 11:36:06', 473, 3, 'product:spuPriceLog:page', '获取商品调价记录列表', '/s/spu_price_log/page', 1), +(1081, '2023-11-15 11:27:59', '2023-11-15 11:27:59', 508, 3, 'product:spu:downModel', '导出商品excel模板', '/s/spu/down_model', 1), +(1082, '2023-11-15 11:26:12', '2023-11-15 11:26:12', 508, 3, 'product:spu:updateSpuStatus', '商品上下架', '/s/spu/prod_status', 3), +(1083, '2023-11-15 11:25:37', '2023-11-15 11:25:37', 508, 3, 'product:spu:updateSpuData', '修改spu(名称、价格、库存、序号)信息', '/s/spu/update_spu_data', 3), +(1084, '2023-11-15 11:23:50', '2023-11-15 11:23:50', 508, 3, 'product:spu:batchDelete', '批量删除spu信息', '/s/spu/batch', 4), +(1085, '2023-11-15 11:22:45', '2023-11-15 11:22:45', 508, 3, 'product:spu:delete', '删除spu', '/s/spu', 4), +(1086, '2023-11-15 11:21:58', '2023-11-15 11:21:58', 468, 3, 'product:spu:update', '更新spu信息', '/s/spu', 3), +(1087, '2023-11-15 11:20:38', '2023-11-15 11:20:38', 468, 3, 'product:spu:show', '获取spu信息', '/s/spu', 1), +(1088, '2023-11-15 11:04:41', '2023-11-15 11:04:41', 503, 3, 'supplier:category:listApplySigningCategory', '获取可以签约的平台分类列表(已经签约的平台分类不会返回)', '/s/apply_supplier/category/list_apply_signing_category', 1), +(1089, '2023-11-15 11:03:57', '2023-11-15 11:03:57', 468, 3, 'product:category:listSigningCategory', '获取签约的可用分类列表(发布商品时使用,包含对应的上级分类)', '/s/apply_supplier/category/list_signing_category', 1), +(1090, '2023-11-15 11:02:52', '2023-11-15 11:02:52', 503, 3, 'supplier:category:platformCategories', '获取平台所有的分类信息', '/s/apply_supplier/category/platform_categories', 1), +(1091, '2023-11-15 11:02:14', '2023-11-15 11:02:14', 503, 3, 'supplier:category:listBySupplier', '获取签约的分类列表(返回所有)', '/s/apply_supplier/category/list_by_supplier', 1), +(1092, '2023-11-15 11:01:46', '2023-11-15 11:01:50', 503, 3, 'supplier:category:signing', '签约分类', '/s/apply_supplier/category/signing', 2), +(1093, '2023-11-15 10:44:37', '2023-11-15 10:44:37', 503, 3, 'supplier:brand:listApplySigningBrand', '获取可以签约的品牌列表', '/s/apply_supplier/brand/list_apply_signing_brand', 1), +(1094, '2023-11-15 10:43:57', '2023-11-15 10:43:57', 503, 3, 'supplier:brand:deleteSigningBrand', '根据签约信息Id删除签约品牌', '/s/apply_supplier/brand/delete_signing_brand', 4), +(1095, '2023-11-15 10:42:59', '2023-11-15 10:42:59', 468, 3, 'product:brand:listAvailableByCategoryAndName', '根据分类id与品牌名称获取分类下的品牌与店铺签约的品牌', '/s/apply_supplier/brand/list_available_by_category_and_name', 1), +(1096, '2023-11-15 10:38:05', '2023-11-15 10:38:05', 503, 3, 'supplier:brand:listSigning', '获取店铺下已签约的品牌列表', '/s/apply_supplier/brand/list_signing', 1), +(1097, '2023-11-15 10:37:02', '2023-11-15 10:37:02', 503, 3, 'supplier:brand:signing', '签约品牌', '/s/apply_supplier/brand/signing', 2), +(1098, '2023-11-15 09:49:58', '2023-11-15 09:49:58', 468, 3, 'product:attr:deleteProd', '获取店铺中的销售属性', '/s/attr/get_shop_attrs', 1), +(1099, '2023-11-15 09:49:30', '2023-11-15 09:49:30', 468, 3, 'product:attr:getAttrsByCategoryId', '根据分类及属性类别获取属性列表', '/s/attr/get_attrs_by_category_id', 1), +(1100, '2023-11-15 09:14:55', '2023-11-15 09:14:55', 264, 2, 'product:spuTag:deleteProd', '删除分组中的商品', '/p/spu_tag_reference/delete_prod', 4), +(1101, '2023-11-15 09:14:24', '2023-11-15 09:14:24', 264, 2, 'product:spuTag:updateProdSeq', '修改分组中的商品排序号', '/p/spu_tag_reference/update_prod_seq', 3), +(1102, '2023-11-15 09:13:47', '2023-11-15 09:13:47', 264, 2, 'product:spuTag:pageSpuByTag', '获取当前分组的所有商品', '/p/spu_tag_reference/page_spu_by_tag', 1), +(1103, '2023-11-14 17:59:35', '2023-11-14 17:59:35', 264, 2, 'product:spuTag:getNotTagProdPage', '获取非本分组的商品列表', '/p/spu_tag/get_not_tag_prod_page', 1), +(1104, '2023-11-14 17:50:45', '2023-11-14 17:50:45', 264, 2, 'roduct:spuTag:getById', '根据id获取商品分组', '/p/spu_tag/info/{id}', 1), +(1105, '2023-11-14 17:49:45', '2023-11-14 17:49:45', 264, 2, 'product:spuTag:page', '获取商品分组表列表', '/p/spu_tag/page', 1), +(1106, '2023-11-14 17:35:15', '2023-11-14 17:40:45', 175, 2, 'product:spu:soldExcel', '导出商品excel', '/p/spu/sold_excel', 1), +(1107, '2023-11-14 17:34:45', '2023-11-14 17:40:52', 175, 2, 'product:spu:auditSpu', '商品审核', '/p/spu/audit_spu', 3), +(1108, '2023-11-14 17:32:29', '2023-11-14 17:32:29', 642, 2, 'platform:spu:scoreSave', '保存积分spu信息', '/p/spu/score_save', 2), +(1109, '2023-11-14 17:31:10', '2023-11-14 17:31:10', 175, 2, 'platform:spu:toTop', '通过商品id设置是否置顶', '/p/spu/to_top', 3), +(1110, '2023-11-14 17:25:56', '2023-11-14 17:25:56', 162, 2, 'product:category:soldExcel', '导出excel', '/p/category/sold_excel', 1), +(1111, '2023-11-14 17:23:31', '2023-11-14 17:26:33', 500, 2, 'platform:category:signing', '更新店铺签约分类', '/p/category/signing', 3), +(1112, '2023-11-14 17:23:12', '2023-11-14 17:26:44', 306, 2, 'platform:category:signing', '更新店铺签约分类', '/p/category/signing', 3), +(1113, '2023-11-14 17:22:32', '2023-11-14 17:26:52', 498, 2, 'platform:category:signingInfoByShopId', '根据店铺id获取分类签约信息', '/p/category/signing_info_by_shopId', 1), +(1114, '2023-11-14 17:22:13', '2023-11-14 17:26:58', 302, 2, 'platform:category:signingInfoByShopId', '根据店铺id获取分类签约信息', '/p/category/signing_info_by_shopId', 1), +(1115, '2023-11-14 17:18:49', '2023-11-14 17:27:08', 500, 2, 'platform:brand:signing', '根据店铺id更新店铺下的签约品牌', '/p/brand/signing', 3), +(1116, '2023-11-14 17:18:22', '2023-11-14 17:18:22', 498, 2, 'product:brand:signingInfoByShopId', '根据店铺id获取签约的品牌列表', '/p/brand/signing_info_by_shop_id', 1), +(1117, '2023-11-14 17:17:06', '2023-11-14 17:27:18', 306, 2, 'platform:brand:signing', '根据店铺id更新店铺下的签约品牌', '/p/brand/signing', 3), +(1118, '2023-11-14 17:15:07', '2023-11-14 17:27:29', 302, 2, 'platform:brand:signingInfoByShopId', '根据店铺id获取签约的品牌列表', '/p/brand/signing_info_by_shop_id', 1), +(1119, '2023-11-14 17:11:59', '2023-11-14 17:11:59', 161, 2, 'product:brand:show', '获取品牌信息', '/p/brand', 1), +(1120, '2023-11-14 17:08:58', '2023-11-14 17:08:58', 161, 2, 'product:brand:page', '获取品牌信息列表', '/p/brand/page', 1), +(1121, '2023-11-14 16:30:44', '2023-11-14 16:30:44', 579, 1, 'shop:takeStockSpu:exportTakeStockSpu', '实物盘点商品Excel导出', '/m/take_stock_spu/export_take_stock_spu', 1), +(1122, '2023-11-14 16:29:49', '2023-11-14 16:29:49', 579, 1, 'shop:takeStockSpu:/importExcel', '导入盘点商品', '/m/take_stock_spu/import_excel', 2), +(1123, '2023-11-14 16:29:03', '2023-11-14 16:29:03', 579, 1, 'shop:takeStockSpu:downloadModel', '实物盘点商品Excel模板下载', '/m/take_stock_spu/download_model', 1), +(1124, '2023-11-14 16:26:30', '2023-11-14 16:26:30', 579, 1, 'shop:takeStockSpu:listByTakeStockId', '通过takeStockId获取盘点商品列表', '/m/take_stock_spu/list_by_take_stock_id', 1), +(1125, '2023-11-14 15:59:06', '2023-11-14 15:59:06', 576, 1, 'shop:takeStock:exportTakeStock', '实物盘点Excel导出', '/m/take_stock/export_take_stock', 1), +(1126, '2023-11-14 15:57:47', '2023-11-15 10:48:37', 576, 1, 'shop:takeStock:voidedInventory', '作废盘点', '/m/take_stock/voided_inventory/*', 3), +(1127, '2023-11-14 15:56:25', '2023-11-14 15:56:25', 578, 1, 'shop:takeStock:finishInventory', '完成盘点', '/m/take_stock/finish_inventory', 3), +(1128, '2023-11-14 15:55:25', '2023-11-14 15:55:25', 578, 1, 'shop:takeStock:update', '保存草稿', '/m/take_stock', 3), +(1129, '2023-11-14 15:54:46', '2023-11-14 15:54:46', 578, 1, 'shop:takeStock:save', '新增盘点', '/m/take_stock', 2), +(1130, '2023-11-14 15:53:28', '2023-11-15 10:48:29', 579, 1, 'shop:takeStock:show', '根据id查询库存盘点信息', '/m/take_stock/info/*', 1), +(1131, '2023-11-14 15:50:08', '2023-11-14 15:50:08', 576, 1, 'shop:takeStock:page', '分页查询库存盘点信息', '/m/take_stock/page', 1), +(1132, '2023-11-14 15:40:57', '2023-11-14 15:40:57', 439, 1, 'shop:stockChangeReason:changeStatus', '修改出入库原因状态', '/m/stock_change_reason/change_status', 3), +(1133, '2023-11-14 15:36:57', '2023-11-14 15:37:01', 439, 1, 'shop:stockChangeReason:delete', '删除出入库原因', '/m/stock_change_reason', 4), +(1134, '2023-11-14 15:36:24', '2023-11-14 15:36:24', 439, 1, 'shop:stockChangeReason:update', '更新出入库原因', '/m/stock_change_reason', 3), +(1135, '2023-11-14 15:35:51', '2023-11-14 15:36:30', 439, 1, 'shop:stockChangeReason:save', '保存出入库原因', '/m/stock_change_reason', 2), +(1136, '2023-11-14 15:35:32', '2023-11-14 15:35:32', 439, 1, 'shop:stockBillLogItem:show', '获取出入库原因', '/m/stock_change_reason', 1), +(1137, '2023-11-14 15:34:56', '2023-11-14 15:34:56', 439, 1, 'shop:stockChangeReason:list', '获取店铺所有的出入库原因', ' /m/stock_change_reason/list', 1), +(1138, '2023-11-14 15:34:21', '2023-11-14 15:34:21', 439, 1, 'shop:stockChangeReason:page', '分页获取出入库原因列表', '/m/stock_change_reason/page', 1), +(1139, '2023-11-14 15:31:47', '2023-11-14 15:31:47', 433, 1, 'shop:stockBillLogItem:importExcel', '批量导入商品项', '/m/stock_bill_log_item/import_excel', 2), +(1140, '2023-11-14 15:31:07', '2023-11-14 15:31:07', 436, 1, 'shop:stockBillLogItem:importExcel', '批量导入商品项', '/m/stock_bill_log_item/import_excel', 2), +(1141, '2023-11-14 15:15:37', '2023-11-14 15:15:37', 428, 1, 'shop:stockBillLogItem:exportFlow', '导出库存流水', '/m/stock_bill_log_item/export_flow', 1), +(1142, '2023-11-14 15:12:16', '2023-11-14 15:12:16', 428, 1, 'shop:stockBillLogItem:page', '分页获取库存流水', '/m/stock_bill_log_item/page', 1), +(1143, '2023-11-14 15:09:47', '2023-11-14 15:09:47', 438, 1, 'shop:stockBillLog:voided', '作废出入库明细单', '/m/stock_bill_log/voided', 1), +(1144, '2023-11-14 15:09:24', '2023-11-14 15:09:24', 435, 1, 'shop:stockBillLog:voided', '作废出入库明细单', '/m/stock_bill_log/voided', 3), +(1145, '2023-11-14 15:08:17', '2023-11-14 15:08:17', 438, 1, 'shop:stockBillLog:exportStockBillLog', '导出出入库明细列表', '/m/stock_bill_log/export_stock_bill_log', 1), +(1146, '2023-11-14 15:07:57', '2023-11-14 15:07:57', 435, 1, 'shop:stockBillLog:exportStockBillLog', '导出出入库明细列表', '/m/stock_bill_log/export_stock_bill_log', 1), +(1147, '2023-11-14 15:05:54', '2023-11-14 15:05:54', 434, 1, 'shop:stockBillLog:update', '更新出入库明细', '/m/stock_bill_log', 1), +(1148, '2023-11-14 15:05:33', '2023-11-14 15:05:33', 623, 1, 'shop:stockBillLog:update', '更新出入库明细', '/m/stock_bill_log', 3), +(1149, '2023-11-14 15:03:48', '2023-11-14 15:03:48', 433, 1, 'shop:stockBillLog:save', '保存出入库明细', '/m/stock_bill_log', 2), +(1150, '2023-11-14 15:03:21', '2023-11-14 15:03:21', 436, 1, 'shop:stockBillLog:save', '保存出入库明细', '/m/stock_bill_log', 2), +(1151, '2023-11-14 15:02:34', '2023-11-15 10:53:22', 434, 1, 'shop:stockBillLog:info', '获取出入库明细', '/m/stock_bill_log/info/*', 1), +(1152, '2023-11-14 15:01:55', '2023-11-15 10:53:30', 623, 1, 'shop:stockBillLog:info', '获取出入库明细', '/m/stock_bill_log/info/*', 1), +(1153, '2023-11-14 14:25:43', '2023-11-14 14:25:43', 438, 1, 'shop:stockBillLog:page', '获取出入库明细列表', '/m/stock_bill_log', 1), +(1154, '2023-11-14 14:08:29', '2023-11-14 14:08:29', 435, 1, 'shop:stockBillLog:page', '获取出入库明细列表', '/m/stock_bill_log/page', 1), +(1155, '2023-11-14 14:05:10', '2023-11-14 14:05:10', 442, 1, 'shop:spuSupplierChangeLog:batchSync', '变更信息批量同步', '/m/spu_supplier_change_log/batchSync', 2), +(1156, '2023-11-14 14:04:37', '2023-11-14 14:04:37', 442, 1, 'shop:spuSupplierChangeLog:delete', '删除商品供应商变更记录', '/m/spu_supplier_change_log', 4), +(1157, '2023-11-14 14:04:06', '2023-11-14 14:04:06', 442, 1, 'shop:spuSupplierChangeLog:update', '更新商品供应商变更记录', '/m/spu_supplier_change_log', 3), +(1158, '2023-11-14 14:03:38', '2023-11-14 14:03:38', 442, 1, 'shop:spuSupplierChangeLog:save', '保存商品供应商变更记录', '/m/spu_supplier_change_log', 2), +(1159, '2023-11-14 14:03:03', '2023-11-14 14:03:03', 442, 1, 'shop:spuSupplierChangeLog:show', '获取商品供应商变更记录', '/m/spu_supplier_change_log', 1), +(1160, '2023-11-14 14:00:22', '2023-11-14 14:01:11', 442, 1, 'shop:spuSupplierChangeLog:page', '获取商品供应商变更记录列表', '/m/spu_supplier_change_log/page', 1), +(1161, '2023-11-14 13:53:08', '2023-11-14 13:53:08', 431, 1, 'shop:spu:pageSpuSku', '分页查询当前商家的spu及其sku信息', '/m/spu/pageSpuSku', 1), +(1162, '2023-11-14 11:38:10', '2023-11-14 11:38:10', 580, 1, 'shop:spuComm:delete', '删除商品评论', '/m/spu_comm', 4), +(1163, '2023-11-14 11:37:34', '2023-11-14 11:37:34', 580, 1, 'shop:spuComm:update', '更新商品评论', '/m/spu_comm', 3), +(1164, '2023-11-14 11:36:41', '2023-11-14 11:36:41', 580, 1, 'shop:spuComm:show', '获取商品评论', '/m/spu_comm', 1), +(1165, '2023-11-14 11:36:01', '2023-11-14 11:36:01', 580, 1, 'shop:spuComm:page', '获取商品评论列表', '/m/spu_comm/page', 1), +(1166, '2023-11-14 11:34:01', '2023-11-14 11:34:01', 427, 1, 'shop:sku:pageSku', '分页查询sku信息', '/m/sku/page_sku', 1), +(1167, '2023-11-14 11:08:18', '2023-11-14 11:08:18', 427, 1, 'shop:sku:getAllSkuList', '通过商品Id获取全部的规格列表', '/m/sku/get_all_skuList', 1), +(1168, '2023-11-14 11:02:38', '2023-11-14 11:02:38', 512, 1, 'marketing:giveawaySpu:mainSpuPage', '分页获取主赠送商品', '/m/giveaway_spu/mainSpuPage', 1), +(1169, '2023-11-14 11:01:14', '2023-11-14 11:02:03', 512, 1, 'marketing:giveawaySpu:page', '获取赠品套装商品项列表', '/m/giveaway_spu/page', 1), +(1170, '2023-11-14 10:48:49', '2023-11-14 10:48:49', 271, 1, 'shop:category:addSigningCategory', '新增签约分类', '/m/apply_shop/category/add_signing_category', 2), +(1171, '2023-11-14 10:47:32', '2023-11-14 10:47:32', 271, 1, 'shop:category:listApplySigningCategory', '获取可以签约的平台分类列表', '/m/apply_shop/category/list_apply_signing_category', 1), +(1172, '2023-11-14 10:46:13', '2023-11-14 10:46:13', 271, 1, 'shop:category:deleteSigningCategory', '删除签约信息', '/m/apply_shop/category/delete_signing_category', 4), +(1173, '2023-11-14 10:38:28', '2023-11-14 10:38:28', 142, 1, 'shop:category:listSigningCategory', '获取签约的可用分类列表(发布商品时使用,包含对应的上级分类)', '/m/apply_shop/category/list_signing_category', 1), +(1174, '2023-11-14 10:33:38', '2023-11-14 10:33:38', 271, 1, 'shop:category:platformCategories', '获取平台所有的分类信息', '/m/apply_shop/category/platform_categories', 1), +(1175, '2023-11-14 10:32:48', '2023-11-14 10:32:48', 271, 1, 'shop:category:listByShop', '获取签约的分类列表(返回所有)', '/m/apply_shop/category/list_by_shop', 1), +(1176, '2023-11-14 10:28:28', '2023-11-14 10:28:28', 271, 1, 'shop:category:signing', '签约分类', '/m/apply_shop/category/signing', 2), +(1177, '2023-11-14 10:25:55', '2023-11-14 10:25:55', 271, 1, 'shop:brand:addSigningBrand', '新增签约品牌', '/m/apply_shop/brand/add_signing_brand', 2), +(1178, '2023-11-14 10:24:28', '2023-11-14 10:24:28', 271, 1, 'shop:brand:listApplySigningBrand', '获取可以签约的品牌列表', '/m/apply_shop/brand/list_apply_signing_brand', 1), +(1179, '2023-11-14 10:00:29', '2023-11-14 10:00:51', 271, 1, 'shop:brand:deleteSigning', '删除签约品牌', '/m/apply_shop/brand/delete_signing_brand', 4), +(1180, '2023-11-14 09:52:09', '2023-11-14 09:52:09', 271, 1, 'shop:brand:listAvailable', '获取分类下的品牌与店铺签约的品牌', '/m/apply_shop/brand/list_available_by_category_and_name', 1), +(1181, '2023-11-14 09:45:37', '2023-11-14 09:45:37', 271, 1, 'shop:brand:listSigning', '获取店铺下已签约的品牌列表', '/m/apply_shop/brand/list_signing', 1), +(1182, '2023-11-14 09:43:18', '2023-11-14 09:43:18', 271, 1, 'shop:brand:signing', '签约品牌', '/m/apply_shop/brand/signing', 2), +(1183, '2023-11-14 09:37:37', '2023-11-14 09:37:37', 512, 1, 'marketing:giveaway:page', '分页查看', '/m/giveaway/page', 1); \ No newline at end of file diff --git a/db/2023-11-27-文件上传优化.sql b/db/2023-11-27-文件上传优化.sql new file mode 100644 index 0000000..be4167f --- /dev/null +++ b/db/2023-11-27-文件上传优化.sql @@ -0,0 +1,22 @@ +USE `mall4cloud_admin`; + +# 新增文件上传配置,需要在后台重新配置文件上传 +INSERT INTO `sys_config`(`param_key`, `param_value`, `remark`) +VALUES + ('UPLOAD_FILE_CONFIG', '{\"storageType\":\"1\", \"endPoint\":\"\", \"accessKey\":\"\", \"secretKey\":\"\", \"bucketName\":\"\"}', '文件上传配置'); + +USE `mall4cloud_auth`; +# 移除首页接口菜单资源授权,执行完sql需要手动移除redis缓存 查找key 'permission:uri_permissions:' +DELETE FROM menu_permission WHERE uri IN ( + '/p/order_statistics/list_shop_ranking_by_refund_count', + '/p/order_statistics/list_shop_ranking_by_pay_actual', + '/p/order_statistics/list_spu_ranking_by_order_count', + '/p/order_statistics/get_order_info_by_day_count', + '/p/order_statistics/get_detail_by_hour'); + +# 删除旧的微信小程序发货配置 +USE `mall4cloud_admin`; +DELETE FROM sys_config where param_key = 'WECHAT_SHIPPING_CONFIG'; +# 将发货配置添加到微信小程序参数配置里面 +UPDATE sys_config set param_value = + REPLACE(param_value,'}',',\"wechatShippingAudit\":false}') where param_key = 'MA_CONFIG'; \ No newline at end of file diff --git a/db/2023-12-04 优惠券纯redis改造.sql b/db/2023-12-04 优惠券纯redis改造.sql new file mode 100644 index 0000000..e8b5d7a --- /dev/null +++ b/db/2023-12-04 优惠券纯redis改造.sql @@ -0,0 +1,197 @@ +# 看注释!!!!!! + +# 将redis中优惠券缓存(mall4cloud_coupon目录下的缓存)删除后执行下列操作 + +# 将nacos中mall4cloud-marketing.yml的配置清空,然后重新配置数据库连接参数,注意检查连接配置,重新发布保存 +# spring: +# datasource: +# url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:mall4cloud_marketing}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true +# username: ${MYSQL_USERNAME:root} +# password: ${MYSQL_PASSWORD:hn02le.34lkdLKD} +# data: +# mongodb: +# host: 192.168.193.128 +# port: 27017 +# database: mall4cloud +# username: mall4cloud +# password: mall4cloud +# authentication-database: mall4cloud +# redis: +# multi: +# enable: true +# password: hn02le.34lkdLKD +# database: 0 +# redisAddrs: +# - 192.168.193.128:6379 + + +# initCouponUserToMongodb,这个定时任务只对2023-12-04更新前将coupon_user存入mysql之后,将数据搬迁到mongodb +# 该定时任务正常执行*成功*一次后(数据已经完全搬迁到mongodb)就可以置为停止或删除 +# 随后可以将mysql中的coupon_user删除 +# 并且可以将CouponUserMapper以及相关定时任务(initCouponUserToMongodb)代码从代码中删去 +USE `mall4cloud_job`; +insert into `xxl_job_info`(`job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, + `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, + `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, + `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`, + `trigger_status`, `trigger_last_time`, `trigger_next_time`) +values (5, '初始化原有领券数据库记录至mongodb', '2023-11-27 10:07:30', '2023-11-27 10:07:30', 'admin', '', 'CRON', + '0 0 0 1 1 ? *', 'DO_NOTHING', 'FIRST', 'initCouponUserToMongodb', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', + '', 'GLUE代码初始化', '2023-11-06 10:07:30', '', 0, 0, 0), + (5, '解锁优惠券', '2023-11-27 10:07:30', '2023-11-27 10:07:30', 'admin', '', 'CRON', + '0 5 0 * * ?', 'DO_NOTHING', 'FIRST', 'unLockCouponStock', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', + '', 'GLUE代码初始化', '2023-11-06 10:07:30', '', 0, 0, 0); +# 将原本的优惠券库存落库定时任务删除 +delete from `xxl_job_info` where `executor_handler` = 'hotCouponStockPlacement'; + +# 添加领券id,这里max_id调高是防止与之前的id重复,可以参考现有最高的coupon_user_id来限定该值 +USE `mall4cloud_marketing`; +insert into `leaf_alloc`(`biz_tag`,`max_id`,`step`,`description`) values +('mall4cloud-coupon-user',1000000,1000,'领券记录id'); + + +# 订单支付记录添加字段 +USE mall4cloud_payment_0; +DELIMITER // +DROP PROCEDURE IF EXISTS updatePayInfoColumn // +CREATE PROCEDURE updatePayInfoColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `biz_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方系统userid'" ); +PREPARE add_column FROM @add_column; +EXECUTE add_column; +SET i = i + 1; +END WHILE; +END // +CALL updatePayInfoColumn() // +DROP PROCEDURE updatePayInfoColumn // +DELIMITER; + +USE mall4cloud_payment_1; +DELIMITER // +DROP PROCEDURE IF EXISTS updatePayInfoColumn // +CREATE PROCEDURE updatePayInfoColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `biz_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方系统userid'" ); +PREPARE add_column FROM @add_column; +EXECUTE add_column; +SET i = i + 1; +END WHILE; +END // +CALL updatePayInfoColumn() // +DROP PROCEDURE updatePayInfoColumn // +DELIMITER; + +USE mall4cloud_payment_2; +DELIMITER // +DROP PROCEDURE IF EXISTS updatePayInfoColumn // +CREATE PROCEDURE updatePayInfoColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `biz_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方系统userid'" ); +PREPARE add_column FROM @add_column; +EXECUTE add_column; +SET i = i + 1; +END WHILE; +END // +CALL updatePayInfoColumn() // +DROP PROCEDURE updatePayInfoColumn // +DELIMITER; + +USE mall4cloud_payment_3; +DELIMITER // +DROP PROCEDURE IF EXISTS updatePayInfoColumn // +CREATE PROCEDURE updatePayInfoColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `biz_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方系统userid'" ); +PREPARE add_column FROM @add_column; +EXECUTE add_column; +SET i = i + 1; +END WHILE; +END // +CALL updatePayInfoColumn() // +DROP PROCEDURE updatePayInfoColumn // +DELIMITER; + + +USE mall4cloud_payment_4; +DELIMITER // +DROP PROCEDURE IF EXISTS updatePayInfoColumn // +CREATE PROCEDURE updatePayInfoColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `biz_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方系统userid'" ); +PREPARE add_column FROM @add_column; +EXECUTE add_column; +SET i = i + 1; +END WHILE; +END // +CALL updatePayInfoColumn() // +DROP PROCEDURE updatePayInfoColumn // +DELIMITER; + +USE mall4cloud_payment_5; +DELIMITER // +DROP PROCEDURE IF EXISTS updatePayInfoColumn // +CREATE PROCEDURE updatePayInfoColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `biz_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方系统userid'" ); +PREPARE add_column FROM @add_column; +EXECUTE add_column; +SET i = i + 1; +END WHILE; +END // +CALL updatePayInfoColumn() // +DROP PROCEDURE updatePayInfoColumn // +DELIMITER; + +USE mall4cloud_payment_6; +DELIMITER // +DROP PROCEDURE IF EXISTS updatePayInfoColumn // +CREATE PROCEDURE updatePayInfoColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `biz_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方系统userid'" ); +PREPARE add_column FROM @add_column; +EXECUTE add_column; +SET i = i + 1; +END WHILE; +END // +CALL updatePayInfoColumn() // +DROP PROCEDURE updatePayInfoColumn // +DELIMITER; + +USE mall4cloud_payment_7; +DELIMITER // +DROP PROCEDURE IF EXISTS updatePayInfoColumn // +CREATE PROCEDURE updatePayInfoColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `biz_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方系统userid'" ); +PREPARE add_column FROM @add_column; +EXECUTE add_column; +SET i = i + 1; +END WHILE; +END // +CALL updatePayInfoColumn() // +DROP PROCEDURE updatePayInfoColumn // +DELIMITER; \ No newline at end of file diff --git a/db/2023-12-18 去除dubbo默认异常处理过滤器.sql b/db/2023-12-18 去除dubbo默认异常处理过滤器.sql new file mode 100644 index 0000000..1eeaca9 --- /dev/null +++ b/db/2023-12-18 去除dubbo默认异常处理过滤器.sql @@ -0,0 +1,49 @@ +# 看注释!!!!!! + + +# 方案一. 在nacos中application.yml,添加的dubbo配置(建议此操作) +# dubbo: +# provider: +# filter: -exception + +# 方案二. 执行以下sql,然后重新保存nacos中application.yml +use mall4cloud_nacos; +update config_info set content = REPLACE(content, 'provider:\n token: true\n', 'provider:\n token: true\n filter: -exception\n') where data_id = 'application.yml'; + + +# 满减满折菜单名称更新为限时折扣 +USE mall4cloud_auth; +UPDATE menu SET name = '限时折扣' , title = '限时折扣' WHERE menu_id = 154; +UPDATE menu SET name = '限时折扣' , title = '限时折扣' WHERE menu_id = 177; +UPDATE menu SET title = '查看限时折扣' WHERE menu_id = 270; +UPDATE menu SET title = '限时折扣编辑' WHERE menu_id = 268; + +# 修改平台菜单 +USE `mall4cloud_auth`; + +# 删除原来的 轮播图 和 分组管理 菜单 +delete from `menu` where menu_id in (257, 264, 265); + +# 添加到新的默认组件菜单中 +INSERT INTO `menu`(`menu_id`, `create_time`, `update_time`, `parent_id`, `biz_type`, `permission`, `path`, `component`, + `redirect`, `always_show`, `hidden`, `name`, `title`, `icon`, `no_cache`, `breadcrumb`, `affix`, + `active_menu`, `seq`) +VALUES (676, '2023-12-15 10:32:06', '2023-12-15 10:32:14', 526, 2, NULL, '/platform-default', 'default', NULL, NULL, 0, + '默认组件', '默认组件', '', NULL, NULL, NULL, NULL, 2), + (677, '2023-12-15 10:32:39', '2023-12-15 10:39:49', 676, 2, NULL, 'index-img', 'platform/default/index-img', + NULL, NULL, 0, '轮播图', '轮播图', 'el-icon-picture-outline', NULL, NULL, NULL, NULL, 1), + (678, '2023-12-15 10:32:37', '2023-12-15 10:39:53', 676, 2, NULL, 'spu-tag', 'platform/default/spu-tag', NULL, + NULL, 0, '分组管理', '分组管理', '', NULL, NULL, NULL, NULL, 2), + (679, '2023-12-15 10:32:26', '2023-12-15 11:19:43', 676, 2, NULL, 'tag-prod', 'platform/default/tag-prod', NULL, + NULL, 1, '添加分组商品', '添加分组商品', '', NULL, NULL, NULL, NULL, 0); + +# 修改菜单名称 +UPDATE `menu` +SET + `title` = '积分规格' +WHERE + `title` = '规格管理' + AND biz_type = 2 + + + diff --git a/db/2024-01-08 1.升级shardingSphere(看注释!!).sql b/db/2024-01-08 1.升级shardingSphere(看注释!!).sql new file mode 100644 index 0000000..1bc03f9 --- /dev/null +++ b/db/2024-01-08 1.升级shardingSphere(看注释!!).sql @@ -0,0 +1,3928 @@ +# 看注释执行!!!!!! +# 2024-01-08 总共四个sql文件需要执行,先执行这个!!! + +# 本sql文件无法直接执行,文件内容较多,建议在IntelliJ IDEA开发工具打开,右键选择 Folding-->Collapse All 方便查看并且复制 +# 本sql文件默认ip为192.168.193.128,按需替换成自己本机ip + +# 整体流程:将原本订单退款、采购订单改为8库64表,需要将原数据都统计到总表中,再建新分表,再通过sql分配到各个分表中,最后删除总表数据 + +# 按顺序执行!,执行时只按分块执行,例如第一步执行 1.在总表新建表,就只执行到 CREATE TABLE purchase_order_addr,也即 2.统计订单表数据到总表、清空分库信息 之前, +# 确保执行成功后再执行下一步2,以此类推下述每一步 + +# ============================== 1.在总表新建表 ============================== +USE mall4cloud_order; +DROP TABLE IF EXISTS `order_refund`; +CREATE TABLE order_refund ( + `refund_id` BIGINT NOT NULL COMMENT '记录ID', + `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` BIGINT NOT NULL COMMENT '店铺ID', + `user_id` BIGINT NOT NULL COMMENT '买家ID', + `order_id` BIGINT NOT NULL COMMENT '订单号', + `order_item_id` BIGINT NOT NULL DEFAULT '0' COMMENT '订单项ID(0:为全部订单项)', + `refund_count` INT DEFAULT '0' COMMENT '退货数量(0:为全部订单项)', + `refund_score` BIGINT DEFAULT NULL COMMENT '退还积分', + `refund_amount` BIGINT DEFAULT NULL COMMENT '退款金额', + `platform_refund_commission` BIGINT DEFAULT NULL COMMENT '平台佣金退款金额', + `platform_refund_amount` BIGINT DEFAULT NULL COMMENT '平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)', + `distribution_total_amount` BIGINT DEFAULT NULL COMMENT '退款单总分销金额', + `refund_type` TINYINT NOT NULL DEFAULT '0' COMMENT '退款单类型(1:整单退款,2:单个物品退款)', + `apply_type` TINYINT NOT NULL COMMENT '申请类型:1,仅退款,2退款退货', + `pay_sys_type` TINYINT NOT NULL DEFAULT '0' COMMENT '支付系统类型 0默认1通联支付', + `is_received` TINYINT DEFAULT NULL COMMENT '是否接收到商品(1:已收到,0:未收到)', + `close_type` TINYINT DEFAULT NULL COMMENT '退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)', + `return_money_sts` TINYINT NOT NULL DEFAULT '0' COMMENT '处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType', + `buyer_reason` TINYINT DEFAULT NULL COMMENT '申请原因(具体见BuyerReasonType)', + `buyer_desc` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请说明', + `buyer_mobile` VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式(退款时留下的手机号码)', + `img_urls` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + `shop_img_urls` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家/供应商文件凭证(逗号隔开)', + `over_time` DATETIME DEFAULT NULL COMMENT '超时时间(超过该时间不处理,系统将自动处理)(保留字段)', + `reject_message` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拒绝原因', + `seller_msg` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '卖家备注', + `shop_seller_msg` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家备注(移交供应商处理时保存)', + `handel_time` DATETIME DEFAULT NULL COMMENT '受理时间', + `supplier_time` DATETIME DEFAULT NULL COMMENT '移交供应商时间', + `delivery_time` DATETIME DEFAULT NULL COMMENT '发货时间', + `receive_time` DATETIME DEFAULT NULL COMMENT '收货时间', + `close_time` DATETIME DEFAULT NULL COMMENT '关闭时间', + `decision_time` DATETIME DEFAULT NULL COMMENT '确定时间(确定退款时间)', + `refund_time` DATETIME DEFAULT NULL COMMENT '退款时间', + `supplier_id` BIGINT NOT NULL DEFAULT '0' COMMENT '供应商id', + `supplier_handle_status` TINYINT DEFAULT '-1' COMMENT '供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝', + `purchase_refund_amount` BIGINT DEFAULT '0' COMMENT '采购退款金额', + `pur_platform_refund_commission` BIGINT DEFAULT '0' COMMENT '采购的平台佣金退款金额', + `return_giveaway_ids` VARCHAR(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款退回的赠品订单项ids', + `refund_actual_total` DECIMAL(15,2) DEFAULT NULL COMMENT '当前退款的实付金额(实付金额减去不退回赠品的金额)', + `platform_intervention_status` TINYINT NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + `apply_intervention_reason` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由', + `apply_intervention_img_urls` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)', + `intervention_refund_type` TINYINT DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款', + `after_intervention_refund_amount` BIGINT DEFAULT NULL COMMENT '平台介入前的退款金额', + `platform_message` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言', + `apply_intervention_time` DATETIME DEFAULT NULL COMMENT '申请介入时间', + `intervention_finish_time` DATETIME DEFAULT NULL COMMENT '介入完成时间', + PRIMARY KEY (`refund_id`) +) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款记录信息'; + +DROP TABLE IF EXISTS `order_refund_intervention`; +CREATE TABLE order_refund_intervention ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录'; + +DROP TABLE IF EXISTS `order_refund_addr`; +CREATE TABLE order_refund_addr ( + `refund_addr_id` bigint NOT NULL AUTO_INCREMENT COMMENT '物流ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `refund_id` bigint NOT NULL COMMENT '退款号', + `user_id` bigint NOT NULL COMMENT '买家ID', + `delivery_company_id` bigint DEFAULT NULL COMMENT '物流公司ID', + `delivery_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流公司名称', + `delivery_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流单号', + `consignee_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人姓名', + `consignee_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人电话(顺丰快递需要)', + `consignee_telephone` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人座机', + `consignee_post_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人邮政编码', + `consignee_addr` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人地址', + `sender_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发送人手机号码', + `sender_remarks` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '买家备注', + `imgs` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片凭证', + PRIMARY KEY (`refund_addr_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户退货物流地址'; + +DROP TABLE IF EXISTS `order_refund_settlement`; +CREATE TABLE order_refund_settlement ( + `settlement_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '退款结算单据id', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `pay_id` bigint DEFAULT NULL COMMENT '订单支付单号', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `refund_id` bigint DEFAULT NULL COMMENT '退款单编号(本系统退款单号)', + `user_id` bigint DEFAULT NULL COMMENT '用户ID', + `biz_refund_no` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信/支付宝退款单号(支付平台退款单号)', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式(1:微信支付 2支付宝支付)', + `refund_status` tinyint DEFAULT NULL COMMENT '退款状态(1:申请中 2:已完成 -1失败)', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `order_total_amount` bigint DEFAULT NULL COMMENT '订单总额', + `version` int DEFAULT '0' COMMENT '版本号', + PRIMARY KEY (`settlement_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款支付结算单据'; + +DROP TABLE IF EXISTS `purchase_order`; +CREATE TABLE purchase_order ( + `purchase_order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '采购id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `deliver_time` datetime DEFAULT NULL COMMENT '送达时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `supplier_id` bigint NOT NULL COMMENT '供应商id', + `total_amount` bigint NOT NULL COMMENT '总采购金额', + `total_stock` int NOT NULL COMMENT '总采购库存数量', + `actual_total_stock` int DEFAULT NULL COMMENT '实际总库存数量', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `employee_id` bigint DEFAULT NULL COMMENT '操作员工id', + `delivery_type` tinyint DEFAULT NULL COMMENT '配送类型 1:快递 2:自提 3:无需快递 4同城配送', + `purchase_order_addr_id` bigint DEFAULT NULL COMMENT '采购订单地址Id', + `voucher_img_urls` VARCHAR(1000) DEFAULT NULL COMMENT '付款凭证图片 多个图片逗号分隔', + `warehouse_id` bigint DEFAULT NULL COMMENT '仓库id', + `supplier_warehouse_id` bigint DEFAULT NULL COMMENT '供应商仓库id', + `stock_point_type` int DEFAULT NULL COMMENT '库存点类型(1:仓库, 2:门店)', + PRIMARY KEY (`purchase_order_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单'; + +DROP TABLE IF EXISTS `purchase_order_lang`; +CREATE TABLE purchase_order_lang ( + `purchase_order_id` bigint NOT NULL, + `lang` tinyint NOT NULL, + `spu_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`purchase_order_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单-国际化'; + +DROP TABLE IF EXISTS `purchase_order_item`; +CREATE TABLE purchase_order_item ( + `purchase_item_id` bigint NOT NULL COMMENT 'id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `purchase_order_id` bigint DEFAULT NULL COMMENT '采购订单id', + `spu_id` bigint DEFAULT NULL COMMENT '商品id', + `sku_id` bigint DEFAULT NULL COMMENT 'sku id', + `spu_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码', + `party_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku编码', + `pic` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品图片', + `purchase_amount` bigint DEFAULT NULL COMMENT '采购金额', + `purchase_price` bigint DEFAULT NULL COMMENT '采购价', + `purchase_stock` int DEFAULT NULL COMMENT '采购库存数量', + `actual_stock` int DEFAULT NULL COMMENT '实际库存数量', + `delivery_type` tinyint DEFAULT NULL COMMENT '订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `be_delivered_num` int DEFAULT NULL COMMENT '0全部发货 其他数量为剩余待发货数量', + PRIMARY KEY (`purchase_item_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单项'; + +DROP TABLE IF EXISTS `purchase_order_item_lang`; +CREATE TABLE purchase_order_item_lang ( + `purchase_item_id` bigint NOT NULL COMMENT '订单项ID', + `lang` tinyint NOT NULL COMMENT '语言 1.中文 2.英文', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + PRIMARY KEY (`purchase_item_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项-国际化'; + +DROP TABLE IF EXISTS `purchase_order_addr`; +CREATE TABLE purchase_order_addr ( + `purchase_order_addr_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `consignee` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收货人', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + `addr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机', + PRIMARY KEY (`purchase_order_addr_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单配送地址'; + + +# ============================== 2.统计订单表数据到总表、清空分库信息 ============================== +# 假如执行报错Column 'xxx(字段名)' cannot be null,检查下分库中表的数据结构,顺序是否与上述建表接口一致,不一致就将上述建表结构调整到和分库分表中一致 + +# 再重新执行一次,后续新建的分表结构也要和总库中总表结构一致,否则会导入失败,要确保所有分表的结构一致,否则会出现难以预料的字段赋值错误bug!!!! + +# 为了防止sql执行报错,目前只编写了0库sql,0库执行正常后,剩下六个库执行的时候只需要将首句USE mall4cloud_release_order_0;中的0改成1,执行后改成2...以此类推直到执行到7库完成 +USE mall4cloud_order_0; +# 新增调拨订单表、采购订单字段补充 +DELIMITER // +DROP PROCEDURE IF EXISTS addAllotOrderTable // +CREATE PROCEDURE addAllotOrderTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 2 DO + + SET @update_purchase_order = CONCAT( "ALTER TABLE `purchase_order_", i, "` + ADD COLUMN `warehouse_id` bigint(0) NULL COMMENT '仓库id' AFTER `voucher_img_urls`, + ADD COLUMN `supplier_warehouse_id` bigint(0) NULL COMMENT '供应商仓库id' AFTER `warehouse_id`, + ADD COLUMN `stock_point_type` int(1) NULL COMMENT '库存点类型(1:仓库, 2:门店)' AFTER `supplier_warehouse_id`; + " ); + PREPARE update_purchase_order FROM @update_purchase_order; + EXECUTE update_purchase_order; + + SET i = i + 1; + END WHILE; +END // +CALL addAllotOrderTable() // +DROP PROCEDURE addAllotOrderTable // +DELIMITER ; + +USE mall4cloud_order_0; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<32 DO + # 汇总到总表 + SET @create_order_refund_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_refund` + (SELECT * FROM order_refund_', i, ")" + ); + PREPARE create_order_refund_table FROM @create_order_refund_table; + EXECUTE create_order_refund_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_refund_intervention` (`refund_id`,`create_time`,`update_time`,`biz_id`,`sys_type`,`voucher_desc`,`img_urls`) + (SELECT `refund_id`,`create_time`,`update_time`,`biz_id`,`sys_type`,`voucher_desc`,`img_urls` FROM order_refund_intervention_', i, ")" + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_refund_addr` (`create_time`,`update_time`,`shop_id`,`refund_id`,`user_id`,`delivery_company_id`,`delivery_name`,`delivery_no`,`consignee_name`,`consignee_mobile`,`consignee_telephone`,`consignee_post_code`,`consignee_addr`,`sender_mobile`,`sender_remarks`,`imgs`) + (SELECT `create_time`,`update_time`,`shop_id`,`refund_id`,`user_id`,`delivery_company_id`,`delivery_name`,`delivery_no`,`consignee_name`,`consignee_mobile`,`consignee_telephone`,`consignee_post_code`,`consignee_addr`,`sender_mobile`,`sender_remarks`,`imgs` FROM order_refund_addr_', i, ")" + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_refund_settlement` (`create_time`,`update_time`,`pay_id`,`order_id`,`refund_id`,`user_id`,`biz_refund_no`,`pay_type`,`refund_status`,`refund_amount`,`order_total_amount`,`version`) + (SELECT `create_time`,`update_time`,`pay_id`,`order_id`,`refund_id`,`user_id`,`biz_refund_no`,`pay_type`,`refund_status`,`refund_amount`,`order_total_amount`,`version` FROM order_refund_settlement_', i, ")" + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + # 清理分库 + SET @clear_refund_table = CONCAT( + 'DELETE FROM order_refund_', i + ); + PREPARE clear_refund_table FROM @clear_refund_table; + EXECUTE clear_refund_table; + + SET @clear_order_refund_intervention_table = CONCAT( + 'DELETE FROM order_refund_intervention_', i + ); + PREPARE clear_order_refund_intervention_table FROM @clear_order_refund_intervention_table; + EXECUTE clear_order_refund_intervention_table; + + SET @clear_order_refund_addr_table = CONCAT( + 'DELETE FROM order_refund_addr_', i + ); + PREPARE clear_order_refund_addr_table FROM @clear_order_refund_addr_table; + EXECUTE clear_order_refund_addr_table; + + SET @clear_order_refund_settlement_table = CONCAT( + 'DELETE FROM order_refund_settlement_', i + ); + PREPARE clear_order_refund_settlement_table FROM @clear_order_refund_settlement_table; + EXECUTE clear_order_refund_settlement_table; + + SET i = i+1; + END WHILE; + + SET i = 0; + WHILE i<2 DO + # 汇总到总表 + SET @create_purchase_order_table = CONCAT( + 'INSERT INTO mall4cloud_order.`purchase_order` + (SELECT * FROM purchase_order_', i, ")" + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @delete_purchase_order_lang_lang_table = CONCAT( + 'delete from purchase_order_lang_', i, " WHERE lang = 2" + ); + PREPARE delete_purchase_order_lang_lang_table FROM @delete_purchase_order_lang_lang_table; + EXECUTE delete_purchase_order_lang_lang_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'INSERT INTO mall4cloud_order.`purchase_order_lang` + (SELECT * FROM purchase_order_lang_', i, ")" + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'INSERT INTO mall4cloud_order.`purchase_order_item` + (SELECT * FROM purchase_order_item_', i, ")" + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @delete_purchase_order_item_lang_lang_table = CONCAT( + 'delete from purchase_order_item_lang_', i, " WHERE lang = 2" + ); + PREPARE delete_purchase_order_item_lang_lang_table FROM @delete_purchase_order_item_lang_lang_table; + EXECUTE delete_purchase_order_item_lang_lang_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'INSERT INTO mall4cloud_order.`purchase_order_item_lang` + (SELECT * FROM purchase_order_item_lang_', i, ")" + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'INSERT INTO mall4cloud_order.`purchase_order_addr` + (SELECT * FROM purchase_order_addr_', i, ")" + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + # 清理分库 + SET @clear_purchase_order_table = CONCAT( + 'DELETE FROM purchase_order_', i + ); + PREPARE clear_purchase_order_table FROM @clear_purchase_order_table; + EXECUTE clear_purchase_order_table; + + SET @clear_purchase_order_lang_table = CONCAT( + 'DELETE FROM purchase_order_lang_', i + ); + PREPARE clear_purchase_order_lang_table FROM @clear_purchase_order_lang_table; + EXECUTE clear_purchase_order_lang_table; + + SET @purchase_order_item_ = CONCAT( + 'DELETE FROM purchase_order_item_', i + ); + PREPARE purchase_order_item_ FROM @purchase_order_item_; + EXECUTE purchase_order_item_; + + SET @clear_purchase_order_item_lang_table = CONCAT( + 'DELETE FROM purchase_order_item_lang_', i + ); + PREPARE clear_purchase_order_item_lang_table FROM @clear_purchase_order_item_lang_table; + EXECUTE clear_purchase_order_item_lang_table; + + SET @clear_purchase_order_addr_table = CONCAT( + 'DELETE FROM purchase_order_addr_', i + ); + PREPARE clear_purchase_order_addr_table FROM @clear_purchase_order_addr_table; + EXECUTE clear_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + + +# ============================== 3.新建订单分表 ============================== +# 请确保上述1-2执行成功后再执行此sql +# !!!注意,如果步骤2中曾经修改过总表结构,请检查下述建表结构是否与原分表结构一致,不一致请调整到和总表以及原有分表一致 +USE mall4cloud_order_0; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + # ============================== 订单退款 ============================== + SET i = 32; + WHILE i<64 DO + SET @create_order_refund_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_', i, + " + ( + `refund_id` bigint NOT NULL COMMENT '记录ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint NOT NULL COMMENT '店铺ID', + `user_id` bigint NOT NULL COMMENT '买家ID', + `order_id` bigint NOT NULL COMMENT '订单号', + `order_item_id` bigint NOT NULL DEFAULT '0' COMMENT '订单项ID(0:为全部订单项)', + `refund_count` int DEFAULT '0' COMMENT '退货数量(0:为全部订单项)', + `refund_score` bigint DEFAULT NULL COMMENT '退还积分', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `platform_refund_commission` bigint DEFAULT NULL COMMENT '平台佣金退款金额', + `platform_refund_amount` bigint DEFAULT NULL COMMENT '平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)', + `distribution_total_amount` bigint DEFAULT NULL COMMENT '退款单总分销金额', + `refund_type` tinyint NOT NULL DEFAULT '0' COMMENT '退款单类型(1:整单退款,2:单个物品退款)', + `apply_type` tinyint NOT NULL COMMENT '申请类型:1,仅退款,2退款退货', + `pay_sys_type` tinyint NOT NULL DEFAULT '0' COMMENT '支付系统类型 0默认1通联支付', + `is_received` tinyint DEFAULT NULL COMMENT '是否接收到商品(1:已收到,0:未收到)', + `close_type` tinyint DEFAULT NULL COMMENT '退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)', + `return_money_sts` tinyint NOT NULL DEFAULT '0' COMMENT '处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType', + `buyer_reason` tinyint DEFAULT NULL COMMENT '申请原因(具体见BuyerReasonType)', + `buyer_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请说明', + `buyer_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式(退款时留下的手机号码)', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + `shop_img_urls` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''商家/供应商文件凭证(逗号隔开)'', + `over_time` datetime DEFAULT NULL COMMENT '超时时间(超过该时间不处理,系统将自动处理)(保留字段)', + `reject_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拒绝原因', + `seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '卖家备注', + `shop_seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家备注(移交供应商处理时保存)', + `handel_time` datetime DEFAULT NULL COMMENT '受理时间', + `supplier_time` datetime DEFAULT NULL COMMENT '移交供应商时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `receive_time` datetime DEFAULT NULL COMMENT '收货时间', + `close_time` datetime DEFAULT NULL COMMENT '关闭时间', + `decision_time` datetime DEFAULT NULL COMMENT '确定时间(确定退款时间)', + `refund_time` datetime DEFAULT NULL COMMENT '退款时间', + `supplier_id` bigint NOT NULL DEFAULT '0' COMMENT '供应商id', + `supplier_handle_status` tinyint DEFAULT '-1' COMMENT '供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝', + `purchase_refund_amount` bigint DEFAULT '0' COMMENT '采购退款金额', + `pur_platform_refund_commission` bigint DEFAULT '0' COMMENT '采购的平台佣金退款金额', + `return_giveaway_ids` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款退回的赠品订单项ids', + `refund_actual_total` decimal(15,2) DEFAULT NULL COMMENT '当前退款的实付金额(实付金额减去不退回赠品的金额)', + `platform_intervention_status` tinyint NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + `apply_intervention_reason` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由', + `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)', + `intervention_refund_type` tinyint DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款', + `after_intervention_refund_amount` bigint DEFAULT NULL COMMENT '平台介入前的退款金额', + `platform_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言', + `apply_intervention_time` datetime DEFAULT NULL COMMENT '申请介入时间', + `intervention_finish_time` datetime DEFAULT NULL COMMENT '介入完成时间', + PRIMARY KEY (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_order_item_id` (`order_item_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款记录信息' + " + ); + PREPARE create_order_refund_table FROM @create_order_refund_table; + EXECUTE create_order_refund_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_addr_', i, + " + ( + `refund_addr_id` bigint NOT NULL AUTO_INCREMENT COMMENT '物流ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `refund_id` bigint NOT NULL COMMENT '退款号', + `user_id` bigint NOT NULL COMMENT '买家ID', + `delivery_company_id` bigint DEFAULT NULL COMMENT '物流公司ID', + `delivery_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流公司名称', + `delivery_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流单号', + `consignee_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人姓名', + `consignee_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人电话(顺丰快递需要)', + `consignee_telephone` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人座机', + `consignee_post_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人邮政编码', + `consignee_addr` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人地址', + `sender_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发送人手机号码', + `sender_remarks` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '买家备注', + `imgs` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片凭证', + PRIMARY KEY (`refund_addr_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_delivery_company_id` (`delivery_company_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户退货物流地址' + " + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_settlement_', i, + " + ( + `settlement_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '退款结算单据id', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `pay_id` bigint DEFAULT NULL COMMENT '订单支付单号', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `refund_id` bigint DEFAULT NULL COMMENT '退款单编号(本系统退款单号)', + `user_id` bigint DEFAULT NULL COMMENT '用户ID', + `biz_refund_no` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信/支付宝退款单号(支付平台退款单号)', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式(1:微信支付 2支付宝支付)', + `refund_status` tinyint DEFAULT NULL COMMENT '退款状态(1:申请中 2:已完成 -1失败)', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `order_total_amount` bigint DEFAULT NULL COMMENT '订单总额', + `version` int DEFAULT '0' COMMENT '版本号', + PRIMARY KEY (`settlement_id`), + UNIQUE KEY `uni_refund_id` (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_biz_refund_no` (`biz_refund_no`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款支付结算单据' + " + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET i = i+1; + END WHILE; + # ============================== 采购订单 ============================== + SET i = 2; + WHILE i<64 DO + SET @create_purchase_order_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_', i, + "(`purchase_order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '采购id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `deliver_time` datetime DEFAULT NULL COMMENT '送达时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `supplier_id` bigint NOT NULL COMMENT '供应商id', + `total_amount` bigint NOT NULL COMMENT '总采购金额', + `total_stock` int NOT NULL COMMENT '总采购库存数量', + `actual_total_stock` int DEFAULT NULL COMMENT '实际总库存数量', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `employee_id` bigint DEFAULT NULL COMMENT '操作员工id', + `delivery_type` tinyint DEFAULT NULL COMMENT '配送类型 1:快递 2:自提 3:无需快递 4同城配送', + `purchase_order_addr_id` bigint DEFAULT NULL COMMENT '采购订单地址Id', + `voucher_img_urls` VARCHAR(1000) DEFAULT NULL COMMENT '付款凭证图片 多个图片逗号分隔', + `warehouse_id` bigint DEFAULT NULL COMMENT '仓库id', + `supplier_warehouse_id` bigint DEFAULT NULL COMMENT '供应商仓库id', + `stock_point_type` int DEFAULT NULL COMMENT '库存点类型(1:仓库, 2:门店)', + PRIMARY KEY (`purchase_order_id`), + KEY `idx_supplier_id` (`supplier_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单' + " + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_lang_', i, + " + ( + `purchase_order_id` bigint NOT NULL, + `lang` tinyint NOT NULL, + `spu_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单-国际化' + " + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT 'id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `purchase_order_id` bigint DEFAULT NULL COMMENT '采购订单id', + `spu_id` bigint DEFAULT NULL COMMENT '商品id', + `sku_id` bigint DEFAULT NULL COMMENT 'sku id', + `spu_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码', + `party_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku编码', + `pic` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品图片', + `purchase_amount` bigint DEFAULT NULL COMMENT '采购金额', + `purchase_price` bigint DEFAULT NULL COMMENT '采购价', + `purchase_stock` int DEFAULT NULL COMMENT '采购库存数量', + `actual_stock` int DEFAULT NULL COMMENT '实际库存数量', + `delivery_type` tinyint DEFAULT NULL COMMENT '订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `be_delivered_num` int DEFAULT NULL COMMENT '0全部发货 其他数量为剩余待发货数量', + PRIMARY KEY (`purchase_item_id`), + KEY `idx_purchase_order_id` (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单项' + " + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_lang_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT '订单项ID', + `lang` tinyint NOT NULL COMMENT '语言 1.中文 2.英文', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + PRIMARY KEY (`purchase_item_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项-国际化' + " + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_addr_', i, + " + ( + `purchase_order_addr_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `consignee` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收货人', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + `addr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机', + PRIMARY KEY (`purchase_order_addr_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单配送地址' + " + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_1; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + # ============================== 订单退款 ============================== + SET i = 32; + WHILE i<64 DO + SET @create_order_refund_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_', i, + " + ( + `refund_id` bigint NOT NULL COMMENT '记录ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint NOT NULL COMMENT '店铺ID', + `user_id` bigint NOT NULL COMMENT '买家ID', + `order_id` bigint NOT NULL COMMENT '订单号', + `order_item_id` bigint NOT NULL DEFAULT '0' COMMENT '订单项ID(0:为全部订单项)', + `refund_count` int DEFAULT '0' COMMENT '退货数量(0:为全部订单项)', + `refund_score` bigint DEFAULT NULL COMMENT '退还积分', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `platform_refund_commission` bigint DEFAULT NULL COMMENT '平台佣金退款金额', + `platform_refund_amount` bigint DEFAULT NULL COMMENT '平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)', + `distribution_total_amount` bigint DEFAULT NULL COMMENT '退款单总分销金额', + `refund_type` tinyint NOT NULL DEFAULT '0' COMMENT '退款单类型(1:整单退款,2:单个物品退款)', + `apply_type` tinyint NOT NULL COMMENT '申请类型:1,仅退款,2退款退货', + `pay_sys_type` tinyint NOT NULL DEFAULT '0' COMMENT '支付系统类型 0默认1通联支付', + `is_received` tinyint DEFAULT NULL COMMENT '是否接收到商品(1:已收到,0:未收到)', + `close_type` tinyint DEFAULT NULL COMMENT '退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)', + `return_money_sts` tinyint NOT NULL DEFAULT '0' COMMENT '处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType', + `buyer_reason` tinyint DEFAULT NULL COMMENT '申请原因(具体见BuyerReasonType)', + `buyer_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请说明', + `buyer_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式(退款时留下的手机号码)', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + `shop_img_urls` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''商家/供应商文件凭证(逗号隔开)'', + `over_time` datetime DEFAULT NULL COMMENT '超时时间(超过该时间不处理,系统将自动处理)(保留字段)', + `reject_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拒绝原因', + `seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '卖家备注', + `shop_seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家备注(移交供应商处理时保存)', + `handel_time` datetime DEFAULT NULL COMMENT '受理时间', + `supplier_time` datetime DEFAULT NULL COMMENT '移交供应商时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `receive_time` datetime DEFAULT NULL COMMENT '收货时间', + `close_time` datetime DEFAULT NULL COMMENT '关闭时间', + `decision_time` datetime DEFAULT NULL COMMENT '确定时间(确定退款时间)', + `refund_time` datetime DEFAULT NULL COMMENT '退款时间', + `supplier_id` bigint NOT NULL DEFAULT '0' COMMENT '供应商id', + `supplier_handle_status` tinyint DEFAULT '-1' COMMENT '供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝', + `purchase_refund_amount` bigint DEFAULT '0' COMMENT '采购退款金额', + `pur_platform_refund_commission` bigint DEFAULT '0' COMMENT '采购的平台佣金退款金额', + `return_giveaway_ids` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款退回的赠品订单项ids', + `refund_actual_total` decimal(15,2) DEFAULT NULL COMMENT '当前退款的实付金额(实付金额减去不退回赠品的金额)', + `platform_intervention_status` tinyint NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + `apply_intervention_reason` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由', + `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)', + `intervention_refund_type` tinyint DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款', + `after_intervention_refund_amount` bigint DEFAULT NULL COMMENT '平台介入前的退款金额', + `platform_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言', + `apply_intervention_time` datetime DEFAULT NULL COMMENT '申请介入时间', + `intervention_finish_time` datetime DEFAULT NULL COMMENT '介入完成时间', + PRIMARY KEY (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_order_item_id` (`order_item_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款记录信息' + " + ); + PREPARE create_order_refund_table FROM @create_order_refund_table; + EXECUTE create_order_refund_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_addr_', i, + " + ( + `refund_addr_id` bigint NOT NULL AUTO_INCREMENT COMMENT '物流ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `refund_id` bigint NOT NULL COMMENT '退款号', + `user_id` bigint NOT NULL COMMENT '买家ID', + `delivery_company_id` bigint DEFAULT NULL COMMENT '物流公司ID', + `delivery_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流公司名称', + `delivery_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流单号', + `consignee_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人姓名', + `consignee_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人电话(顺丰快递需要)', + `consignee_telephone` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人座机', + `consignee_post_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人邮政编码', + `consignee_addr` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人地址', + `sender_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发送人手机号码', + `sender_remarks` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '买家备注', + `imgs` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片凭证', + PRIMARY KEY (`refund_addr_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_delivery_company_id` (`delivery_company_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户退货物流地址' + " + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_settlement_', i, + " + ( + `settlement_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '退款结算单据id', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `pay_id` bigint DEFAULT NULL COMMENT '订单支付单号', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `refund_id` bigint DEFAULT NULL COMMENT '退款单编号(本系统退款单号)', + `user_id` bigint DEFAULT NULL COMMENT '用户ID', + `biz_refund_no` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信/支付宝退款单号(支付平台退款单号)', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式(1:微信支付 2支付宝支付)', + `refund_status` tinyint DEFAULT NULL COMMENT '退款状态(1:申请中 2:已完成 -1失败)', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `order_total_amount` bigint DEFAULT NULL COMMENT '订单总额', + `version` int DEFAULT '0' COMMENT '版本号', + PRIMARY KEY (`settlement_id`), + UNIQUE KEY `uni_refund_id` (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_biz_refund_no` (`biz_refund_no`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款支付结算单据' + " + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET i = i+1; + END WHILE; + # ============================== 采购订单 ============================== + SET i = 2; + WHILE i<64 DO + SET @create_purchase_order_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_', i, + "(`purchase_order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '采购id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `deliver_time` datetime DEFAULT NULL COMMENT '送达时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `supplier_id` bigint NOT NULL COMMENT '供应商id', + `total_amount` bigint NOT NULL COMMENT '总采购金额', + `total_stock` int NOT NULL COMMENT '总采购库存数量', + `actual_total_stock` int DEFAULT NULL COMMENT '实际总库存数量', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `employee_id` bigint DEFAULT NULL COMMENT '操作员工id', + `delivery_type` tinyint DEFAULT NULL COMMENT '配送类型 1:快递 2:自提 3:无需快递 4同城配送', + `purchase_order_addr_id` bigint DEFAULT NULL COMMENT '采购订单地址Id', + `voucher_img_urls` VARCHAR(1000) DEFAULT NULL COMMENT '付款凭证图片 多个图片逗号分隔', + `warehouse_id` bigint DEFAULT NULL COMMENT '仓库id', + `supplier_warehouse_id` bigint DEFAULT NULL COMMENT '供应商仓库id', + `stock_point_type` int DEFAULT NULL COMMENT '库存点类型(1:仓库, 2:门店)', + PRIMARY KEY (`purchase_order_id`), + KEY `idx_supplier_id` (`supplier_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单' + " + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_lang_', i, + " + ( + `purchase_order_id` bigint NOT NULL, + `lang` tinyint NOT NULL, + `spu_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单-国际化' + " + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT 'id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `purchase_order_id` bigint DEFAULT NULL COMMENT '采购订单id', + `spu_id` bigint DEFAULT NULL COMMENT '商品id', + `sku_id` bigint DEFAULT NULL COMMENT 'sku id', + `spu_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码', + `party_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku编码', + `pic` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品图片', + `purchase_amount` bigint DEFAULT NULL COMMENT '采购金额', + `purchase_price` bigint DEFAULT NULL COMMENT '采购价', + `purchase_stock` int DEFAULT NULL COMMENT '采购库存数量', + `actual_stock` int DEFAULT NULL COMMENT '实际库存数量', + `delivery_type` tinyint DEFAULT NULL COMMENT '订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `be_delivered_num` int DEFAULT NULL COMMENT '0全部发货 其他数量为剩余待发货数量', + PRIMARY KEY (`purchase_item_id`), + KEY `idx_purchase_order_id` (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单项' + " + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_lang_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT '订单项ID', + `lang` tinyint NOT NULL COMMENT '语言 1.中文 2.英文', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + PRIMARY KEY (`purchase_item_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项-国际化' + " + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_addr_', i, + " + ( + `purchase_order_addr_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `consignee` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收货人', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + `addr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机', + PRIMARY KEY (`purchase_order_addr_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单配送地址' + " + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + + +USE mall4cloud_order_2; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + # ============================== 订单退款 ============================== + SET i = 32; + WHILE i<64 DO + SET @create_order_refund_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_', i, + " + ( + `refund_id` bigint NOT NULL COMMENT '记录ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint NOT NULL COMMENT '店铺ID', + `user_id` bigint NOT NULL COMMENT '买家ID', + `order_id` bigint NOT NULL COMMENT '订单号', + `order_item_id` bigint NOT NULL DEFAULT '0' COMMENT '订单项ID(0:为全部订单项)', + `refund_count` int DEFAULT '0' COMMENT '退货数量(0:为全部订单项)', + `refund_score` bigint DEFAULT NULL COMMENT '退还积分', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `platform_refund_commission` bigint DEFAULT NULL COMMENT '平台佣金退款金额', + `platform_refund_amount` bigint DEFAULT NULL COMMENT '平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)', + `distribution_total_amount` bigint DEFAULT NULL COMMENT '退款单总分销金额', + `refund_type` tinyint NOT NULL DEFAULT '0' COMMENT '退款单类型(1:整单退款,2:单个物品退款)', + `apply_type` tinyint NOT NULL COMMENT '申请类型:1,仅退款,2退款退货', + `pay_sys_type` tinyint NOT NULL DEFAULT '0' COMMENT '支付系统类型 0默认1通联支付', + `is_received` tinyint DEFAULT NULL COMMENT '是否接收到商品(1:已收到,0:未收到)', + `close_type` tinyint DEFAULT NULL COMMENT '退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)', + `return_money_sts` tinyint NOT NULL DEFAULT '0' COMMENT '处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType', + `buyer_reason` tinyint DEFAULT NULL COMMENT '申请原因(具体见BuyerReasonType)', + `buyer_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请说明', + `buyer_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式(退款时留下的手机号码)', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + `shop_img_urls` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''商家/供应商文件凭证(逗号隔开)'', + `over_time` datetime DEFAULT NULL COMMENT '超时时间(超过该时间不处理,系统将自动处理)(保留字段)', + `reject_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拒绝原因', + `seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '卖家备注', + `shop_seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家备注(移交供应商处理时保存)', + `handel_time` datetime DEFAULT NULL COMMENT '受理时间', + `supplier_time` datetime DEFAULT NULL COMMENT '移交供应商时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `receive_time` datetime DEFAULT NULL COMMENT '收货时间', + `close_time` datetime DEFAULT NULL COMMENT '关闭时间', + `decision_time` datetime DEFAULT NULL COMMENT '确定时间(确定退款时间)', + `refund_time` datetime DEFAULT NULL COMMENT '退款时间', + `supplier_id` bigint NOT NULL DEFAULT '0' COMMENT '供应商id', + `supplier_handle_status` tinyint DEFAULT '-1' COMMENT '供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝', + `purchase_refund_amount` bigint DEFAULT '0' COMMENT '采购退款金额', + `pur_platform_refund_commission` bigint DEFAULT '0' COMMENT '采购的平台佣金退款金额', + `return_giveaway_ids` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款退回的赠品订单项ids', + `refund_actual_total` decimal(15,2) DEFAULT NULL COMMENT '当前退款的实付金额(实付金额减去不退回赠品的金额)', + `platform_intervention_status` tinyint NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + `apply_intervention_reason` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由', + `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)', + `intervention_refund_type` tinyint DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款', + `after_intervention_refund_amount` bigint DEFAULT NULL COMMENT '平台介入前的退款金额', + `platform_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言', + `apply_intervention_time` datetime DEFAULT NULL COMMENT '申请介入时间', + `intervention_finish_time` datetime DEFAULT NULL COMMENT '介入完成时间', + PRIMARY KEY (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_order_item_id` (`order_item_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款记录信息' + " + ); + PREPARE create_order_refund_table FROM @create_order_refund_table; + EXECUTE create_order_refund_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_addr_', i, + " + ( + `refund_addr_id` bigint NOT NULL AUTO_INCREMENT COMMENT '物流ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `refund_id` bigint NOT NULL COMMENT '退款号', + `user_id` bigint NOT NULL COMMENT '买家ID', + `delivery_company_id` bigint DEFAULT NULL COMMENT '物流公司ID', + `delivery_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流公司名称', + `delivery_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流单号', + `consignee_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人姓名', + `consignee_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人电话(顺丰快递需要)', + `consignee_telephone` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人座机', + `consignee_post_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人邮政编码', + `consignee_addr` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人地址', + `sender_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发送人手机号码', + `sender_remarks` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '买家备注', + `imgs` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片凭证', + PRIMARY KEY (`refund_addr_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_delivery_company_id` (`delivery_company_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户退货物流地址' + " + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_settlement_', i, + " + ( + `settlement_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '退款结算单据id', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `pay_id` bigint DEFAULT NULL COMMENT '订单支付单号', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `refund_id` bigint DEFAULT NULL COMMENT '退款单编号(本系统退款单号)', + `user_id` bigint DEFAULT NULL COMMENT '用户ID', + `biz_refund_no` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信/支付宝退款单号(支付平台退款单号)', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式(1:微信支付 2支付宝支付)', + `refund_status` tinyint DEFAULT NULL COMMENT '退款状态(1:申请中 2:已完成 -1失败)', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `order_total_amount` bigint DEFAULT NULL COMMENT '订单总额', + `version` int DEFAULT '0' COMMENT '版本号', + PRIMARY KEY (`settlement_id`), + UNIQUE KEY `uni_refund_id` (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_biz_refund_no` (`biz_refund_no`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款支付结算单据' + " + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET i = i+1; + END WHILE; + # ============================== 采购订单 ============================== + SET i = 2; + WHILE i<64 DO + SET @create_purchase_order_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_', i, + "(`purchase_order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '采购id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `deliver_time` datetime DEFAULT NULL COMMENT '送达时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `supplier_id` bigint NOT NULL COMMENT '供应商id', + `total_amount` bigint NOT NULL COMMENT '总采购金额', + `total_stock` int NOT NULL COMMENT '总采购库存数量', + `actual_total_stock` int DEFAULT NULL COMMENT '实际总库存数量', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `employee_id` bigint DEFAULT NULL COMMENT '操作员工id', + `delivery_type` tinyint DEFAULT NULL COMMENT '配送类型 1:快递 2:自提 3:无需快递 4同城配送', + `purchase_order_addr_id` bigint DEFAULT NULL COMMENT '采购订单地址Id', + `voucher_img_urls` VARCHAR(1000) DEFAULT NULL COMMENT '付款凭证图片 多个图片逗号分隔', + `warehouse_id` bigint DEFAULT NULL COMMENT '仓库id', + `supplier_warehouse_id` bigint DEFAULT NULL COMMENT '供应商仓库id', + `stock_point_type` int DEFAULT NULL COMMENT '库存点类型(1:仓库, 2:门店)', + PRIMARY KEY (`purchase_order_id`), + KEY `idx_supplier_id` (`supplier_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单' + " + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_lang_', i, + " + ( + `purchase_order_id` bigint NOT NULL, + `lang` tinyint NOT NULL, + `spu_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单-国际化' + " + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT 'id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `purchase_order_id` bigint DEFAULT NULL COMMENT '采购订单id', + `spu_id` bigint DEFAULT NULL COMMENT '商品id', + `sku_id` bigint DEFAULT NULL COMMENT 'sku id', + `spu_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码', + `party_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku编码', + `pic` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品图片', + `purchase_amount` bigint DEFAULT NULL COMMENT '采购金额', + `purchase_price` bigint DEFAULT NULL COMMENT '采购价', + `purchase_stock` int DEFAULT NULL COMMENT '采购库存数量', + `actual_stock` int DEFAULT NULL COMMENT '实际库存数量', + `delivery_type` tinyint DEFAULT NULL COMMENT '订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `be_delivered_num` int DEFAULT NULL COMMENT '0全部发货 其他数量为剩余待发货数量', + PRIMARY KEY (`purchase_item_id`), + KEY `idx_purchase_order_id` (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单项' + " + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_lang_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT '订单项ID', + `lang` tinyint NOT NULL COMMENT '语言 1.中文 2.英文', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + PRIMARY KEY (`purchase_item_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项-国际化' + " + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_addr_', i, + " + ( + `purchase_order_addr_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `consignee` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收货人', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + `addr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机', + PRIMARY KEY (`purchase_order_addr_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单配送地址' + " + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + + +USE mall4cloud_order_3; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + # ============================== 订单退款 ============================== + SET i = 32; + WHILE i<64 DO + SET @create_order_refund_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_', i, + " + ( + `refund_id` bigint NOT NULL COMMENT '记录ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint NOT NULL COMMENT '店铺ID', + `user_id` bigint NOT NULL COMMENT '买家ID', + `order_id` bigint NOT NULL COMMENT '订单号', + `order_item_id` bigint NOT NULL DEFAULT '0' COMMENT '订单项ID(0:为全部订单项)', + `refund_count` int DEFAULT '0' COMMENT '退货数量(0:为全部订单项)', + `refund_score` bigint DEFAULT NULL COMMENT '退还积分', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `platform_refund_commission` bigint DEFAULT NULL COMMENT '平台佣金退款金额', + `platform_refund_amount` bigint DEFAULT NULL COMMENT '平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)', + `distribution_total_amount` bigint DEFAULT NULL COMMENT '退款单总分销金额', + `refund_type` tinyint NOT NULL DEFAULT '0' COMMENT '退款单类型(1:整单退款,2:单个物品退款)', + `apply_type` tinyint NOT NULL COMMENT '申请类型:1,仅退款,2退款退货', + `pay_sys_type` tinyint NOT NULL DEFAULT '0' COMMENT '支付系统类型 0默认1通联支付', + `is_received` tinyint DEFAULT NULL COMMENT '是否接收到商品(1:已收到,0:未收到)', + `close_type` tinyint DEFAULT NULL COMMENT '退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)', + `return_money_sts` tinyint NOT NULL DEFAULT '0' COMMENT '处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType', + `buyer_reason` tinyint DEFAULT NULL COMMENT '申请原因(具体见BuyerReasonType)', + `buyer_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请说明', + `buyer_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式(退款时留下的手机号码)', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + `shop_img_urls` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''商家/供应商文件凭证(逗号隔开)'', + `over_time` datetime DEFAULT NULL COMMENT '超时时间(超过该时间不处理,系统将自动处理)(保留字段)', + `reject_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拒绝原因', + `seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '卖家备注', + `shop_seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家备注(移交供应商处理时保存)', + `handel_time` datetime DEFAULT NULL COMMENT '受理时间', + `supplier_time` datetime DEFAULT NULL COMMENT '移交供应商时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `receive_time` datetime DEFAULT NULL COMMENT '收货时间', + `close_time` datetime DEFAULT NULL COMMENT '关闭时间', + `decision_time` datetime DEFAULT NULL COMMENT '确定时间(确定退款时间)', + `refund_time` datetime DEFAULT NULL COMMENT '退款时间', + `supplier_id` bigint NOT NULL DEFAULT '0' COMMENT '供应商id', + `supplier_handle_status` tinyint DEFAULT '-1' COMMENT '供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝', + `purchase_refund_amount` bigint DEFAULT '0' COMMENT '采购退款金额', + `pur_platform_refund_commission` bigint DEFAULT '0' COMMENT '采购的平台佣金退款金额', + `return_giveaway_ids` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款退回的赠品订单项ids', + `refund_actual_total` decimal(15,2) DEFAULT NULL COMMENT '当前退款的实付金额(实付金额减去不退回赠品的金额)', + `platform_intervention_status` tinyint NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + `apply_intervention_reason` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由', + `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)', + `intervention_refund_type` tinyint DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款', + `after_intervention_refund_amount` bigint DEFAULT NULL COMMENT '平台介入前的退款金额', + `platform_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言', + `apply_intervention_time` datetime DEFAULT NULL COMMENT '申请介入时间', + `intervention_finish_time` datetime DEFAULT NULL COMMENT '介入完成时间', + PRIMARY KEY (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_order_item_id` (`order_item_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款记录信息' + " + ); + PREPARE create_order_refund_table FROM @create_order_refund_table; + EXECUTE create_order_refund_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_addr_', i, + " + ( + `refund_addr_id` bigint NOT NULL AUTO_INCREMENT COMMENT '物流ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `refund_id` bigint NOT NULL COMMENT '退款号', + `user_id` bigint NOT NULL COMMENT '买家ID', + `delivery_company_id` bigint DEFAULT NULL COMMENT '物流公司ID', + `delivery_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流公司名称', + `delivery_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流单号', + `consignee_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人姓名', + `consignee_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人电话(顺丰快递需要)', + `consignee_telephone` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人座机', + `consignee_post_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人邮政编码', + `consignee_addr` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人地址', + `sender_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发送人手机号码', + `sender_remarks` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '买家备注', + `imgs` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片凭证', + PRIMARY KEY (`refund_addr_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_delivery_company_id` (`delivery_company_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户退货物流地址' + " + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_settlement_', i, + " + ( + `settlement_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '退款结算单据id', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `pay_id` bigint DEFAULT NULL COMMENT '订单支付单号', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `refund_id` bigint DEFAULT NULL COMMENT '退款单编号(本系统退款单号)', + `user_id` bigint DEFAULT NULL COMMENT '用户ID', + `biz_refund_no` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信/支付宝退款单号(支付平台退款单号)', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式(1:微信支付 2支付宝支付)', + `refund_status` tinyint DEFAULT NULL COMMENT '退款状态(1:申请中 2:已完成 -1失败)', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `order_total_amount` bigint DEFAULT NULL COMMENT '订单总额', + `version` int DEFAULT '0' COMMENT '版本号', + PRIMARY KEY (`settlement_id`), + UNIQUE KEY `uni_refund_id` (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_biz_refund_no` (`biz_refund_no`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款支付结算单据' + " + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET i = i+1; + END WHILE; + # ============================== 采购订单 ============================== + SET i = 2; + WHILE i<64 DO + SET @create_purchase_order_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_', i, + "(`purchase_order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '采购id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `deliver_time` datetime DEFAULT NULL COMMENT '送达时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `supplier_id` bigint NOT NULL COMMENT '供应商id', + `total_amount` bigint NOT NULL COMMENT '总采购金额', + `total_stock` int NOT NULL COMMENT '总采购库存数量', + `actual_total_stock` int DEFAULT NULL COMMENT '实际总库存数量', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `employee_id` bigint DEFAULT NULL COMMENT '操作员工id', + `delivery_type` tinyint DEFAULT NULL COMMENT '配送类型 1:快递 2:自提 3:无需快递 4同城配送', + `purchase_order_addr_id` bigint DEFAULT NULL COMMENT '采购订单地址Id', + `voucher_img_urls` VARCHAR(1000) DEFAULT NULL COMMENT '付款凭证图片 多个图片逗号分隔', + `warehouse_id` bigint DEFAULT NULL COMMENT '仓库id', + `supplier_warehouse_id` bigint DEFAULT NULL COMMENT '供应商仓库id', + `stock_point_type` int DEFAULT NULL COMMENT '库存点类型(1:仓库, 2:门店)', + PRIMARY KEY (`purchase_order_id`), + KEY `idx_supplier_id` (`supplier_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单' + " + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_lang_', i, + " + ( + `purchase_order_id` bigint NOT NULL, + `lang` tinyint NOT NULL, + `spu_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单-国际化' + " + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT 'id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `purchase_order_id` bigint DEFAULT NULL COMMENT '采购订单id', + `spu_id` bigint DEFAULT NULL COMMENT '商品id', + `sku_id` bigint DEFAULT NULL COMMENT 'sku id', + `spu_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码', + `party_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku编码', + `pic` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品图片', + `purchase_amount` bigint DEFAULT NULL COMMENT '采购金额', + `purchase_price` bigint DEFAULT NULL COMMENT '采购价', + `purchase_stock` int DEFAULT NULL COMMENT '采购库存数量', + `actual_stock` int DEFAULT NULL COMMENT '实际库存数量', + `delivery_type` tinyint DEFAULT NULL COMMENT '订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `be_delivered_num` int DEFAULT NULL COMMENT '0全部发货 其他数量为剩余待发货数量', + PRIMARY KEY (`purchase_item_id`), + KEY `idx_purchase_order_id` (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单项' + " + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_lang_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT '订单项ID', + `lang` tinyint NOT NULL COMMENT '语言 1.中文 2.英文', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + PRIMARY KEY (`purchase_item_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项-国际化' + " + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_addr_', i, + " + ( + `purchase_order_addr_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `consignee` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收货人', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + `addr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机', + PRIMARY KEY (`purchase_order_addr_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单配送地址' + " + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_4; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + # ============================== 订单退款 ============================== + SET i = 32; + WHILE i<64 DO + SET @create_order_refund_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_', i, + " + ( + `refund_id` bigint NOT NULL COMMENT '记录ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint NOT NULL COMMENT '店铺ID', + `user_id` bigint NOT NULL COMMENT '买家ID', + `order_id` bigint NOT NULL COMMENT '订单号', + `order_item_id` bigint NOT NULL DEFAULT '0' COMMENT '订单项ID(0:为全部订单项)', + `refund_count` int DEFAULT '0' COMMENT '退货数量(0:为全部订单项)', + `refund_score` bigint DEFAULT NULL COMMENT '退还积分', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `platform_refund_commission` bigint DEFAULT NULL COMMENT '平台佣金退款金额', + `platform_refund_amount` bigint DEFAULT NULL COMMENT '平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)', + `distribution_total_amount` bigint DEFAULT NULL COMMENT '退款单总分销金额', + `refund_type` tinyint NOT NULL DEFAULT '0' COMMENT '退款单类型(1:整单退款,2:单个物品退款)', + `apply_type` tinyint NOT NULL COMMENT '申请类型:1,仅退款,2退款退货', + `pay_sys_type` tinyint NOT NULL DEFAULT '0' COMMENT '支付系统类型 0默认1通联支付', + `is_received` tinyint DEFAULT NULL COMMENT '是否接收到商品(1:已收到,0:未收到)', + `close_type` tinyint DEFAULT NULL COMMENT '退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)', + `return_money_sts` tinyint NOT NULL DEFAULT '0' COMMENT '处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType', + `buyer_reason` tinyint DEFAULT NULL COMMENT '申请原因(具体见BuyerReasonType)', + `buyer_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请说明', + `buyer_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式(退款时留下的手机号码)', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + `shop_img_urls` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''商家/供应商文件凭证(逗号隔开)'', + `over_time` datetime DEFAULT NULL COMMENT '超时时间(超过该时间不处理,系统将自动处理)(保留字段)', + `reject_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拒绝原因', + `seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '卖家备注', + `shop_seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家备注(移交供应商处理时保存)', + `handel_time` datetime DEFAULT NULL COMMENT '受理时间', + `supplier_time` datetime DEFAULT NULL COMMENT '移交供应商时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `receive_time` datetime DEFAULT NULL COMMENT '收货时间', + `close_time` datetime DEFAULT NULL COMMENT '关闭时间', + `decision_time` datetime DEFAULT NULL COMMENT '确定时间(确定退款时间)', + `refund_time` datetime DEFAULT NULL COMMENT '退款时间', + `supplier_id` bigint NOT NULL DEFAULT '0' COMMENT '供应商id', + `supplier_handle_status` tinyint DEFAULT '-1' COMMENT '供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝', + `purchase_refund_amount` bigint DEFAULT '0' COMMENT '采购退款金额', + `pur_platform_refund_commission` bigint DEFAULT '0' COMMENT '采购的平台佣金退款金额', + `return_giveaway_ids` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款退回的赠品订单项ids', + `refund_actual_total` decimal(15,2) DEFAULT NULL COMMENT '当前退款的实付金额(实付金额减去不退回赠品的金额)', + `platform_intervention_status` tinyint NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + `apply_intervention_reason` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由', + `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)', + `intervention_refund_type` tinyint DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款', + `after_intervention_refund_amount` bigint DEFAULT NULL COMMENT '平台介入前的退款金额', + `platform_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言', + `apply_intervention_time` datetime DEFAULT NULL COMMENT '申请介入时间', + `intervention_finish_time` datetime DEFAULT NULL COMMENT '介入完成时间', + PRIMARY KEY (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_order_item_id` (`order_item_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款记录信息' + " + ); + PREPARE create_order_refund_table FROM @create_order_refund_table; + EXECUTE create_order_refund_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_addr_', i, + " + ( + `refund_addr_id` bigint NOT NULL AUTO_INCREMENT COMMENT '物流ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `refund_id` bigint NOT NULL COMMENT '退款号', + `user_id` bigint NOT NULL COMMENT '买家ID', + `delivery_company_id` bigint DEFAULT NULL COMMENT '物流公司ID', + `delivery_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流公司名称', + `delivery_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流单号', + `consignee_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人姓名', + `consignee_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人电话(顺丰快递需要)', + `consignee_telephone` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人座机', + `consignee_post_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人邮政编码', + `consignee_addr` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人地址', + `sender_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发送人手机号码', + `sender_remarks` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '买家备注', + `imgs` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片凭证', + PRIMARY KEY (`refund_addr_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_delivery_company_id` (`delivery_company_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户退货物流地址' + " + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_settlement_', i, + " + ( + `settlement_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '退款结算单据id', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `pay_id` bigint DEFAULT NULL COMMENT '订单支付单号', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `refund_id` bigint DEFAULT NULL COMMENT '退款单编号(本系统退款单号)', + `user_id` bigint DEFAULT NULL COMMENT '用户ID', + `biz_refund_no` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信/支付宝退款单号(支付平台退款单号)', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式(1:微信支付 2支付宝支付)', + `refund_status` tinyint DEFAULT NULL COMMENT '退款状态(1:申请中 2:已完成 -1失败)', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `order_total_amount` bigint DEFAULT NULL COMMENT '订单总额', + `version` int DEFAULT '0' COMMENT '版本号', + PRIMARY KEY (`settlement_id`), + UNIQUE KEY `uni_refund_id` (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_biz_refund_no` (`biz_refund_no`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款支付结算单据' + " + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET i = i+1; + END WHILE; + # ============================== 采购订单 ============================== + SET i = 2; + WHILE i<64 DO + SET @create_purchase_order_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_', i, + "(`purchase_order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '采购id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `deliver_time` datetime DEFAULT NULL COMMENT '送达时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `supplier_id` bigint NOT NULL COMMENT '供应商id', + `total_amount` bigint NOT NULL COMMENT '总采购金额', + `total_stock` int NOT NULL COMMENT '总采购库存数量', + `actual_total_stock` int DEFAULT NULL COMMENT '实际总库存数量', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `employee_id` bigint DEFAULT NULL COMMENT '操作员工id', + `delivery_type` tinyint DEFAULT NULL COMMENT '配送类型 1:快递 2:自提 3:无需快递 4同城配送', + `purchase_order_addr_id` bigint DEFAULT NULL COMMENT '采购订单地址Id', + `voucher_img_urls` VARCHAR(1000) DEFAULT NULL COMMENT '付款凭证图片 多个图片逗号分隔', + `warehouse_id` bigint DEFAULT NULL COMMENT '仓库id', + `supplier_warehouse_id` bigint DEFAULT NULL COMMENT '供应商仓库id', + `stock_point_type` int DEFAULT NULL COMMENT '库存点类型(1:仓库, 2:门店)', + PRIMARY KEY (`purchase_order_id`), + KEY `idx_supplier_id` (`supplier_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单' + " + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_lang_', i, + " + ( + `purchase_order_id` bigint NOT NULL, + `lang` tinyint NOT NULL, + `spu_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单-国际化' + " + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT 'id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `purchase_order_id` bigint DEFAULT NULL COMMENT '采购订单id', + `spu_id` bigint DEFAULT NULL COMMENT '商品id', + `sku_id` bigint DEFAULT NULL COMMENT 'sku id', + `spu_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码', + `party_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku编码', + `pic` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品图片', + `purchase_amount` bigint DEFAULT NULL COMMENT '采购金额', + `purchase_price` bigint DEFAULT NULL COMMENT '采购价', + `purchase_stock` int DEFAULT NULL COMMENT '采购库存数量', + `actual_stock` int DEFAULT NULL COMMENT '实际库存数量', + `delivery_type` tinyint DEFAULT NULL COMMENT '订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `be_delivered_num` int DEFAULT NULL COMMENT '0全部发货 其他数量为剩余待发货数量', + PRIMARY KEY (`purchase_item_id`), + KEY `idx_purchase_order_id` (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单项' + " + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_lang_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT '订单项ID', + `lang` tinyint NOT NULL COMMENT '语言 1.中文 2.英文', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + PRIMARY KEY (`purchase_item_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项-国际化' + " + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_addr_', i, + " + ( + `purchase_order_addr_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `consignee` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收货人', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + `addr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机', + PRIMARY KEY (`purchase_order_addr_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单配送地址' + " + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + + +USE mall4cloud_order_5; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + # ============================== 订单退款 ============================== + SET i = 32; + WHILE i<64 DO + SET @create_order_refund_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_', i, + " + ( + `refund_id` bigint NOT NULL COMMENT '记录ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint NOT NULL COMMENT '店铺ID', + `user_id` bigint NOT NULL COMMENT '买家ID', + `order_id` bigint NOT NULL COMMENT '订单号', + `order_item_id` bigint NOT NULL DEFAULT '0' COMMENT '订单项ID(0:为全部订单项)', + `refund_count` int DEFAULT '0' COMMENT '退货数量(0:为全部订单项)', + `refund_score` bigint DEFAULT NULL COMMENT '退还积分', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `platform_refund_commission` bigint DEFAULT NULL COMMENT '平台佣金退款金额', + `platform_refund_amount` bigint DEFAULT NULL COMMENT '平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)', + `distribution_total_amount` bigint DEFAULT NULL COMMENT '退款单总分销金额', + `refund_type` tinyint NOT NULL DEFAULT '0' COMMENT '退款单类型(1:整单退款,2:单个物品退款)', + `apply_type` tinyint NOT NULL COMMENT '申请类型:1,仅退款,2退款退货', + `pay_sys_type` tinyint NOT NULL DEFAULT '0' COMMENT '支付系统类型 0默认1通联支付', + `is_received` tinyint DEFAULT NULL COMMENT '是否接收到商品(1:已收到,0:未收到)', + `close_type` tinyint DEFAULT NULL COMMENT '退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)', + `return_money_sts` tinyint NOT NULL DEFAULT '0' COMMENT '处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType', + `buyer_reason` tinyint DEFAULT NULL COMMENT '申请原因(具体见BuyerReasonType)', + `buyer_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请说明', + `buyer_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式(退款时留下的手机号码)', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + `shop_img_urls` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''商家/供应商文件凭证(逗号隔开)'', + `over_time` datetime DEFAULT NULL COMMENT '超时时间(超过该时间不处理,系统将自动处理)(保留字段)', + `reject_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拒绝原因', + `seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '卖家备注', + `shop_seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家备注(移交供应商处理时保存)', + `handel_time` datetime DEFAULT NULL COMMENT '受理时间', + `supplier_time` datetime DEFAULT NULL COMMENT '移交供应商时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `receive_time` datetime DEFAULT NULL COMMENT '收货时间', + `close_time` datetime DEFAULT NULL COMMENT '关闭时间', + `decision_time` datetime DEFAULT NULL COMMENT '确定时间(确定退款时间)', + `refund_time` datetime DEFAULT NULL COMMENT '退款时间', + `supplier_id` bigint NOT NULL DEFAULT '0' COMMENT '供应商id', + `supplier_handle_status` tinyint DEFAULT '-1' COMMENT '供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝', + `purchase_refund_amount` bigint DEFAULT '0' COMMENT '采购退款金额', + `pur_platform_refund_commission` bigint DEFAULT '0' COMMENT '采购的平台佣金退款金额', + `return_giveaway_ids` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款退回的赠品订单项ids', + `refund_actual_total` decimal(15,2) DEFAULT NULL COMMENT '当前退款的实付金额(实付金额减去不退回赠品的金额)', + `platform_intervention_status` tinyint NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + `apply_intervention_reason` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由', + `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)', + `intervention_refund_type` tinyint DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款', + `after_intervention_refund_amount` bigint DEFAULT NULL COMMENT '平台介入前的退款金额', + `platform_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言', + `apply_intervention_time` datetime DEFAULT NULL COMMENT '申请介入时间', + `intervention_finish_time` datetime DEFAULT NULL COMMENT '介入完成时间', + PRIMARY KEY (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_order_item_id` (`order_item_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款记录信息' + " + ); + PREPARE create_order_refund_table FROM @create_order_refund_table; + EXECUTE create_order_refund_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_addr_', i, + " + ( + `refund_addr_id` bigint NOT NULL AUTO_INCREMENT COMMENT '物流ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `refund_id` bigint NOT NULL COMMENT '退款号', + `user_id` bigint NOT NULL COMMENT '买家ID', + `delivery_company_id` bigint DEFAULT NULL COMMENT '物流公司ID', + `delivery_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流公司名称', + `delivery_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流单号', + `consignee_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人姓名', + `consignee_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人电话(顺丰快递需要)', + `consignee_telephone` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人座机', + `consignee_post_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人邮政编码', + `consignee_addr` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人地址', + `sender_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发送人手机号码', + `sender_remarks` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '买家备注', + `imgs` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片凭证', + PRIMARY KEY (`refund_addr_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_delivery_company_id` (`delivery_company_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户退货物流地址' + " + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_settlement_', i, + " + ( + `settlement_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '退款结算单据id', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `pay_id` bigint DEFAULT NULL COMMENT '订单支付单号', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `refund_id` bigint DEFAULT NULL COMMENT '退款单编号(本系统退款单号)', + `user_id` bigint DEFAULT NULL COMMENT '用户ID', + `biz_refund_no` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信/支付宝退款单号(支付平台退款单号)', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式(1:微信支付 2支付宝支付)', + `refund_status` tinyint DEFAULT NULL COMMENT '退款状态(1:申请中 2:已完成 -1失败)', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `order_total_amount` bigint DEFAULT NULL COMMENT '订单总额', + `version` int DEFAULT '0' COMMENT '版本号', + PRIMARY KEY (`settlement_id`), + UNIQUE KEY `uni_refund_id` (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_biz_refund_no` (`biz_refund_no`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款支付结算单据' + " + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET i = i+1; + END WHILE; + # ============================== 采购订单 ============================== + SET i = 2; + WHILE i<64 DO + SET @create_purchase_order_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_', i, + "(`purchase_order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '采购id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `deliver_time` datetime DEFAULT NULL COMMENT '送达时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `supplier_id` bigint NOT NULL COMMENT '供应商id', + `total_amount` bigint NOT NULL COMMENT '总采购金额', + `total_stock` int NOT NULL COMMENT '总采购库存数量', + `actual_total_stock` int DEFAULT NULL COMMENT '实际总库存数量', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `employee_id` bigint DEFAULT NULL COMMENT '操作员工id', + `delivery_type` tinyint DEFAULT NULL COMMENT '配送类型 1:快递 2:自提 3:无需快递 4同城配送', + `purchase_order_addr_id` bigint DEFAULT NULL COMMENT '采购订单地址Id', + `voucher_img_urls` VARCHAR(1000) DEFAULT NULL COMMENT '付款凭证图片 多个图片逗号分隔', + `warehouse_id` bigint DEFAULT NULL COMMENT '仓库id', + `supplier_warehouse_id` bigint DEFAULT NULL COMMENT '供应商仓库id', + `stock_point_type` int DEFAULT NULL COMMENT '库存点类型(1:仓库, 2:门店)', + PRIMARY KEY (`purchase_order_id`), + KEY `idx_supplier_id` (`supplier_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单' + " + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_lang_', i, + " + ( + `purchase_order_id` bigint NOT NULL, + `lang` tinyint NOT NULL, + `spu_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单-国际化' + " + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT 'id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `purchase_order_id` bigint DEFAULT NULL COMMENT '采购订单id', + `spu_id` bigint DEFAULT NULL COMMENT '商品id', + `sku_id` bigint DEFAULT NULL COMMENT 'sku id', + `spu_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码', + `party_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku编码', + `pic` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品图片', + `purchase_amount` bigint DEFAULT NULL COMMENT '采购金额', + `purchase_price` bigint DEFAULT NULL COMMENT '采购价', + `purchase_stock` int DEFAULT NULL COMMENT '采购库存数量', + `actual_stock` int DEFAULT NULL COMMENT '实际库存数量', + `delivery_type` tinyint DEFAULT NULL COMMENT '订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `be_delivered_num` int DEFAULT NULL COMMENT '0全部发货 其他数量为剩余待发货数量', + PRIMARY KEY (`purchase_item_id`), + KEY `idx_purchase_order_id` (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单项' + " + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_lang_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT '订单项ID', + `lang` tinyint NOT NULL COMMENT '语言 1.中文 2.英文', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + PRIMARY KEY (`purchase_item_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项-国际化' + " + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_addr_', i, + " + ( + `purchase_order_addr_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `consignee` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收货人', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + `addr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机', + PRIMARY KEY (`purchase_order_addr_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单配送地址' + " + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_6; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + # ============================== 订单退款 ============================== + SET i = 32; + WHILE i<64 DO + SET @create_order_refund_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_', i, + " + ( + `refund_id` bigint NOT NULL COMMENT '记录ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint NOT NULL COMMENT '店铺ID', + `user_id` bigint NOT NULL COMMENT '买家ID', + `order_id` bigint NOT NULL COMMENT '订单号', + `order_item_id` bigint NOT NULL DEFAULT '0' COMMENT '订单项ID(0:为全部订单项)', + `refund_count` int DEFAULT '0' COMMENT '退货数量(0:为全部订单项)', + `refund_score` bigint DEFAULT NULL COMMENT '退还积分', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `platform_refund_commission` bigint DEFAULT NULL COMMENT '平台佣金退款金额', + `platform_refund_amount` bigint DEFAULT NULL COMMENT '平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)', + `distribution_total_amount` bigint DEFAULT NULL COMMENT '退款单总分销金额', + `refund_type` tinyint NOT NULL DEFAULT '0' COMMENT '退款单类型(1:整单退款,2:单个物品退款)', + `apply_type` tinyint NOT NULL COMMENT '申请类型:1,仅退款,2退款退货', + `pay_sys_type` tinyint NOT NULL DEFAULT '0' COMMENT '支付系统类型 0默认1通联支付', + `is_received` tinyint DEFAULT NULL COMMENT '是否接收到商品(1:已收到,0:未收到)', + `close_type` tinyint DEFAULT NULL COMMENT '退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)', + `return_money_sts` tinyint NOT NULL DEFAULT '0' COMMENT '处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType', + `buyer_reason` tinyint DEFAULT NULL COMMENT '申请原因(具体见BuyerReasonType)', + `buyer_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请说明', + `buyer_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式(退款时留下的手机号码)', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + `shop_img_urls` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''商家/供应商文件凭证(逗号隔开)'', + `over_time` datetime DEFAULT NULL COMMENT '超时时间(超过该时间不处理,系统将自动处理)(保留字段)', + `reject_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拒绝原因', + `seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '卖家备注', + `shop_seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家备注(移交供应商处理时保存)', + `handel_time` datetime DEFAULT NULL COMMENT '受理时间', + `supplier_time` datetime DEFAULT NULL COMMENT '移交供应商时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `receive_time` datetime DEFAULT NULL COMMENT '收货时间', + `close_time` datetime DEFAULT NULL COMMENT '关闭时间', + `decision_time` datetime DEFAULT NULL COMMENT '确定时间(确定退款时间)', + `refund_time` datetime DEFAULT NULL COMMENT '退款时间', + `supplier_id` bigint NOT NULL DEFAULT '0' COMMENT '供应商id', + `supplier_handle_status` tinyint DEFAULT '-1' COMMENT '供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝', + `purchase_refund_amount` bigint DEFAULT '0' COMMENT '采购退款金额', + `pur_platform_refund_commission` bigint DEFAULT '0' COMMENT '采购的平台佣金退款金额', + `return_giveaway_ids` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款退回的赠品订单项ids', + `refund_actual_total` decimal(15,2) DEFAULT NULL COMMENT '当前退款的实付金额(实付金额减去不退回赠品的金额)', + `platform_intervention_status` tinyint NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + `apply_intervention_reason` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由', + `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)', + `intervention_refund_type` tinyint DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款', + `after_intervention_refund_amount` bigint DEFAULT NULL COMMENT '平台介入前的退款金额', + `platform_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言', + `apply_intervention_time` datetime DEFAULT NULL COMMENT '申请介入时间', + `intervention_finish_time` datetime DEFAULT NULL COMMENT '介入完成时间', + PRIMARY KEY (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_order_item_id` (`order_item_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款记录信息' + " + ); + PREPARE create_order_refund_table FROM @create_order_refund_table; + EXECUTE create_order_refund_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_addr_', i, + " + ( + `refund_addr_id` bigint NOT NULL AUTO_INCREMENT COMMENT '物流ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `refund_id` bigint NOT NULL COMMENT '退款号', + `user_id` bigint NOT NULL COMMENT '买家ID', + `delivery_company_id` bigint DEFAULT NULL COMMENT '物流公司ID', + `delivery_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流公司名称', + `delivery_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流单号', + `consignee_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人姓名', + `consignee_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人电话(顺丰快递需要)', + `consignee_telephone` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人座机', + `consignee_post_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人邮政编码', + `consignee_addr` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人地址', + `sender_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发送人手机号码', + `sender_remarks` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '买家备注', + `imgs` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片凭证', + PRIMARY KEY (`refund_addr_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_delivery_company_id` (`delivery_company_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户退货物流地址' + " + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_settlement_', i, + " + ( + `settlement_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '退款结算单据id', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `pay_id` bigint DEFAULT NULL COMMENT '订单支付单号', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `refund_id` bigint DEFAULT NULL COMMENT '退款单编号(本系统退款单号)', + `user_id` bigint DEFAULT NULL COMMENT '用户ID', + `biz_refund_no` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信/支付宝退款单号(支付平台退款单号)', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式(1:微信支付 2支付宝支付)', + `refund_status` tinyint DEFAULT NULL COMMENT '退款状态(1:申请中 2:已完成 -1失败)', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `order_total_amount` bigint DEFAULT NULL COMMENT '订单总额', + `version` int DEFAULT '0' COMMENT '版本号', + PRIMARY KEY (`settlement_id`), + UNIQUE KEY `uni_refund_id` (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_biz_refund_no` (`biz_refund_no`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款支付结算单据' + " + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET i = i+1; + END WHILE; + # ============================== 采购订单 ============================== + SET i = 2; + WHILE i<64 DO + SET @create_purchase_order_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_', i, + "(`purchase_order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '采购id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `deliver_time` datetime DEFAULT NULL COMMENT '送达时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `supplier_id` bigint NOT NULL COMMENT '供应商id', + `total_amount` bigint NOT NULL COMMENT '总采购金额', + `total_stock` int NOT NULL COMMENT '总采购库存数量', + `actual_total_stock` int DEFAULT NULL COMMENT '实际总库存数量', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `employee_id` bigint DEFAULT NULL COMMENT '操作员工id', + `delivery_type` tinyint DEFAULT NULL COMMENT '配送类型 1:快递 2:自提 3:无需快递 4同城配送', + `purchase_order_addr_id` bigint DEFAULT NULL COMMENT '采购订单地址Id', + `voucher_img_urls` VARCHAR(1000) DEFAULT NULL COMMENT '付款凭证图片 多个图片逗号分隔', + `warehouse_id` bigint DEFAULT NULL COMMENT '仓库id', + `supplier_warehouse_id` bigint DEFAULT NULL COMMENT '供应商仓库id', + `stock_point_type` int DEFAULT NULL COMMENT '库存点类型(1:仓库, 2:门店)', + PRIMARY KEY (`purchase_order_id`), + KEY `idx_supplier_id` (`supplier_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单' + " + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_lang_', i, + " + ( + `purchase_order_id` bigint NOT NULL, + `lang` tinyint NOT NULL, + `spu_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单-国际化' + " + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT 'id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `purchase_order_id` bigint DEFAULT NULL COMMENT '采购订单id', + `spu_id` bigint DEFAULT NULL COMMENT '商品id', + `sku_id` bigint DEFAULT NULL COMMENT 'sku id', + `spu_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码', + `party_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku编码', + `pic` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品图片', + `purchase_amount` bigint DEFAULT NULL COMMENT '采购金额', + `purchase_price` bigint DEFAULT NULL COMMENT '采购价', + `purchase_stock` int DEFAULT NULL COMMENT '采购库存数量', + `actual_stock` int DEFAULT NULL COMMENT '实际库存数量', + `delivery_type` tinyint DEFAULT NULL COMMENT '订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `be_delivered_num` int DEFAULT NULL COMMENT '0全部发货 其他数量为剩余待发货数量', + PRIMARY KEY (`purchase_item_id`), + KEY `idx_purchase_order_id` (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单项' + " + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_lang_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT '订单项ID', + `lang` tinyint NOT NULL COMMENT '语言 1.中文 2.英文', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + PRIMARY KEY (`purchase_item_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项-国际化' + " + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_addr_', i, + " + ( + `purchase_order_addr_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `consignee` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收货人', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + `addr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机', + PRIMARY KEY (`purchase_order_addr_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单配送地址' + " + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_7; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + # ============================== 订单退款 ============================== + SET i = 32; + WHILE i<64 DO + SET @create_order_refund_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_', i, + " + ( + `refund_id` bigint NOT NULL COMMENT '记录ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint NOT NULL COMMENT '店铺ID', + `user_id` bigint NOT NULL COMMENT '买家ID', + `order_id` bigint NOT NULL COMMENT '订单号', + `order_item_id` bigint NOT NULL DEFAULT '0' COMMENT '订单项ID(0:为全部订单项)', + `refund_count` int DEFAULT '0' COMMENT '退货数量(0:为全部订单项)', + `refund_score` bigint DEFAULT NULL COMMENT '退还积分', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `platform_refund_commission` bigint DEFAULT NULL COMMENT '平台佣金退款金额', + `platform_refund_amount` bigint DEFAULT NULL COMMENT '平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)', + `distribution_total_amount` bigint DEFAULT NULL COMMENT '退款单总分销金额', + `refund_type` tinyint NOT NULL DEFAULT '0' COMMENT '退款单类型(1:整单退款,2:单个物品退款)', + `apply_type` tinyint NOT NULL COMMENT '申请类型:1,仅退款,2退款退货', + `pay_sys_type` tinyint NOT NULL DEFAULT '0' COMMENT '支付系统类型 0默认1通联支付', + `is_received` tinyint DEFAULT NULL COMMENT '是否接收到商品(1:已收到,0:未收到)', + `close_type` tinyint DEFAULT NULL COMMENT '退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)', + `return_money_sts` tinyint NOT NULL DEFAULT '0' COMMENT '处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType', + `buyer_reason` tinyint DEFAULT NULL COMMENT '申请原因(具体见BuyerReasonType)', + `buyer_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请说明', + `buyer_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式(退款时留下的手机号码)', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + `shop_img_urls` VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''商家/供应商文件凭证(逗号隔开)'', + `over_time` datetime DEFAULT NULL COMMENT '超时时间(超过该时间不处理,系统将自动处理)(保留字段)', + `reject_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拒绝原因', + `seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '卖家备注', + `shop_seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家备注(移交供应商处理时保存)', + `handel_time` datetime DEFAULT NULL COMMENT '受理时间', + `supplier_time` datetime DEFAULT NULL COMMENT '移交供应商时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `receive_time` datetime DEFAULT NULL COMMENT '收货时间', + `close_time` datetime DEFAULT NULL COMMENT '关闭时间', + `decision_time` datetime DEFAULT NULL COMMENT '确定时间(确定退款时间)', + `refund_time` datetime DEFAULT NULL COMMENT '退款时间', + `supplier_id` bigint NOT NULL DEFAULT '0' COMMENT '供应商id', + `supplier_handle_status` tinyint DEFAULT '-1' COMMENT '供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝', + `purchase_refund_amount` bigint DEFAULT '0' COMMENT '采购退款金额', + `pur_platform_refund_commission` bigint DEFAULT '0' COMMENT '采购的平台佣金退款金额', + `return_giveaway_ids` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款退回的赠品订单项ids', + `refund_actual_total` decimal(15,2) DEFAULT NULL COMMENT '当前退款的实付金额(实付金额减去不退回赠品的金额)', + `platform_intervention_status` tinyint NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + `apply_intervention_reason` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由', + `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)', + `intervention_refund_type` tinyint DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款', + `after_intervention_refund_amount` bigint DEFAULT NULL COMMENT '平台介入前的退款金额', + `platform_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言', + `apply_intervention_time` datetime DEFAULT NULL COMMENT '申请介入时间', + `intervention_finish_time` datetime DEFAULT NULL COMMENT '介入完成时间', + PRIMARY KEY (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_order_item_id` (`order_item_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款记录信息' + " + ); + PREPARE create_order_refund_table FROM @create_order_refund_table; + EXECUTE create_order_refund_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_addr_', i, + " + ( + `refund_addr_id` bigint NOT NULL AUTO_INCREMENT COMMENT '物流ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `refund_id` bigint NOT NULL COMMENT '退款号', + `user_id` bigint NOT NULL COMMENT '买家ID', + `delivery_company_id` bigint DEFAULT NULL COMMENT '物流公司ID', + `delivery_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流公司名称', + `delivery_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流单号', + `consignee_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人姓名', + `consignee_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人电话(顺丰快递需要)', + `consignee_telephone` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人座机', + `consignee_post_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人邮政编码', + `consignee_addr` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人地址', + `sender_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发送人手机号码', + `sender_remarks` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '买家备注', + `imgs` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片凭证', + PRIMARY KEY (`refund_addr_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_delivery_company_id` (`delivery_company_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户退货物流地址' + " + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_settlement_', i, + " + ( + `settlement_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '退款结算单据id', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `pay_id` bigint DEFAULT NULL COMMENT '订单支付单号', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `refund_id` bigint DEFAULT NULL COMMENT '退款单编号(本系统退款单号)', + `user_id` bigint DEFAULT NULL COMMENT '用户ID', + `biz_refund_no` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信/支付宝退款单号(支付平台退款单号)', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式(1:微信支付 2支付宝支付)', + `refund_status` tinyint DEFAULT NULL COMMENT '退款状态(1:申请中 2:已完成 -1失败)', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `order_total_amount` bigint DEFAULT NULL COMMENT '订单总额', + `version` int DEFAULT '0' COMMENT '版本号', + PRIMARY KEY (`settlement_id`), + UNIQUE KEY `uni_refund_id` (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_biz_refund_no` (`biz_refund_no`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款支付结算单据' + " + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET i = i+1; + END WHILE; + # ============================== 采购订单 ============================== + SET i = 2; + WHILE i<64 DO + SET @create_purchase_order_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_', i, + "(`purchase_order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '采购id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `deliver_time` datetime DEFAULT NULL COMMENT '送达时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `supplier_id` bigint NOT NULL COMMENT '供应商id', + `total_amount` bigint NOT NULL COMMENT '总采购金额', + `total_stock` int NOT NULL COMMENT '总采购库存数量', + `actual_total_stock` int DEFAULT NULL COMMENT '实际总库存数量', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `employee_id` bigint DEFAULT NULL COMMENT '操作员工id', + `delivery_type` tinyint DEFAULT NULL COMMENT '配送类型 1:快递 2:自提 3:无需快递 4同城配送', + `purchase_order_addr_id` bigint DEFAULT NULL COMMENT '采购订单地址Id', + `voucher_img_urls` VARCHAR(1000) DEFAULT NULL COMMENT '付款凭证图片 多个图片逗号分隔', + `warehouse_id` bigint DEFAULT NULL COMMENT '仓库id', + `supplier_warehouse_id` bigint DEFAULT NULL COMMENT '供应商仓库id', + `stock_point_type` int DEFAULT NULL COMMENT '库存点类型(1:仓库, 2:门店)', + PRIMARY KEY (`purchase_order_id`), + KEY `idx_supplier_id` (`supplier_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单' + " + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_lang_', i, + " + ( + `purchase_order_id` bigint NOT NULL, + `lang` tinyint NOT NULL, + `spu_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单-国际化' + " + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT 'id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `purchase_order_id` bigint DEFAULT NULL COMMENT '采购订单id', + `spu_id` bigint DEFAULT NULL COMMENT '商品id', + `sku_id` bigint DEFAULT NULL COMMENT 'sku id', + `spu_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码', + `party_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku编码', + `pic` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品图片', + `purchase_amount` bigint DEFAULT NULL COMMENT '采购金额', + `purchase_price` bigint DEFAULT NULL COMMENT '采购价', + `purchase_stock` int DEFAULT NULL COMMENT '采购库存数量', + `actual_stock` int DEFAULT NULL COMMENT '实际库存数量', + `delivery_type` tinyint DEFAULT NULL COMMENT '订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `be_delivered_num` int DEFAULT NULL COMMENT '0全部发货 其他数量为剩余待发货数量', + PRIMARY KEY (`purchase_item_id`), + KEY `idx_purchase_order_id` (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单项' + " + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_lang_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT '订单项ID', + `lang` tinyint NOT NULL COMMENT '语言 1.中文 2.英文', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + PRIMARY KEY (`purchase_item_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项-国际化' + " + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_addr_', i, + " + ( + `purchase_order_addr_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `consignee` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收货人', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + `addr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机', + PRIMARY KEY (`purchase_order_addr_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单配送地址' + " + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + + +# ============================== 4.统计订单数据到各个分表 ============================== +# 请确保上述1-3执行成功后再执行此sql +USE mall4cloud_order_0; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i,j INT; + SET i = 0; + SET j = 0; + WHILE i<64 DO + SET @create_refund_info_table = CONCAT( + 'INSERT INTO order_refund_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_refund_info_table FROM @create_refund_info_table; + EXECUTE create_refund_info_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'INSERT INTO order_refund_intervention_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_intervention` WHERE (SUBSTRING(refund_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(refund_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'INSERT INTO order_refund_addr_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_addr` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'INSERT INTO order_refund_settlement_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_settlement` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET @create_purchase_order_table = CONCAT( + 'INSERT INTO purchase_order_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'INSERT INTO purchase_order_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_lang` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'INSERT INTO purchase_order_item_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'INSERT INTO purchase_order_item_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item_lang` WHERE (SUBSTRING(purchase_item_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_item_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'INSERT INTO purchase_order_addr_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_addr` WHERE (SUBSTRING(purchase_order_addr_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_addr_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_1; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i,j INT; + SET i = 0; + SET j = 1; + WHILE i<64 DO + SET @create_refund_info_table = CONCAT( + 'INSERT INTO order_refund_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_refund_info_table FROM @create_refund_info_table; + EXECUTE create_refund_info_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'INSERT INTO order_refund_intervention_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_intervention` WHERE (SUBSTRING(refund_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(refund_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'INSERT INTO order_refund_addr_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_addr` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'INSERT INTO order_refund_settlement_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_settlement` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET @create_purchase_order_table = CONCAT( + 'INSERT INTO purchase_order_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'INSERT INTO purchase_order_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_lang` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'INSERT INTO purchase_order_item_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'INSERT INTO purchase_order_item_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item_lang` WHERE (SUBSTRING(purchase_item_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_item_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'INSERT INTO purchase_order_addr_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_addr` WHERE (SUBSTRING(purchase_order_addr_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_addr_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_2; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i,j INT; + SET i = 0; + SET j = 2; + WHILE i<64 DO + SET @create_refund_info_table = CONCAT( + 'INSERT INTO order_refund_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_refund_info_table FROM @create_refund_info_table; + EXECUTE create_refund_info_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'INSERT INTO order_refund_intervention_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_intervention` WHERE (SUBSTRING(refund_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(refund_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'INSERT INTO order_refund_addr_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_addr` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'INSERT INTO order_refund_settlement_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_settlement` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET @create_purchase_order_table = CONCAT( + 'INSERT INTO purchase_order_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'INSERT INTO purchase_order_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_lang` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'INSERT INTO purchase_order_item_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'INSERT INTO purchase_order_item_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item_lang` WHERE (SUBSTRING(purchase_item_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_item_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'INSERT INTO purchase_order_addr_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_addr` WHERE (SUBSTRING(purchase_order_addr_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_addr_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_3; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i,j INT; + SET i = 0; + SET j = 3; + WHILE i<64 DO + SET @create_refund_info_table = CONCAT( + 'INSERT INTO order_refund_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_refund_info_table FROM @create_refund_info_table; + EXECUTE create_refund_info_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'INSERT INTO order_refund_intervention_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_intervention` WHERE (SUBSTRING(refund_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(refund_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'INSERT INTO order_refund_addr_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_addr` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'INSERT INTO order_refund_settlement_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_settlement` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET @create_purchase_order_table = CONCAT( + 'INSERT INTO purchase_order_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'INSERT INTO purchase_order_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_lang` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'INSERT INTO purchase_order_item_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'INSERT INTO purchase_order_item_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item_lang` WHERE (SUBSTRING(purchase_item_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_item_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'INSERT INTO purchase_order_addr_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_addr` WHERE (SUBSTRING(purchase_order_addr_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_addr_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_4; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i,j INT; + SET i = 0; + SET j = 4; + WHILE i<64 DO + SET @create_refund_info_table = CONCAT( + 'INSERT INTO order_refund_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_refund_info_table FROM @create_refund_info_table; + EXECUTE create_refund_info_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'INSERT INTO order_refund_intervention_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_intervention` WHERE (SUBSTRING(refund_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(refund_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'INSERT INTO order_refund_addr_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_addr` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'INSERT INTO order_refund_settlement_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_settlement` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET @create_purchase_order_table = CONCAT( + 'INSERT INTO purchase_order_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'INSERT INTO purchase_order_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_lang` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'INSERT INTO purchase_order_item_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'INSERT INTO purchase_order_item_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item_lang` WHERE (SUBSTRING(purchase_item_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_item_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'INSERT INTO purchase_order_addr_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_addr` WHERE (SUBSTRING(purchase_order_addr_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_addr_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_5; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i,j INT; + SET i = 0; + SET j = 5; + WHILE i<64 DO + SET @create_refund_info_table = CONCAT( + 'INSERT INTO order_refund_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_refund_info_table FROM @create_refund_info_table; + EXECUTE create_refund_info_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'INSERT INTO order_refund_intervention_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_intervention` WHERE (SUBSTRING(refund_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(refund_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'INSERT INTO order_refund_addr_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_addr` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'INSERT INTO order_refund_settlement_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_settlement` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET @create_purchase_order_table = CONCAT( + 'INSERT INTO purchase_order_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'INSERT INTO purchase_order_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_lang` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'INSERT INTO purchase_order_item_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'INSERT INTO purchase_order_item_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item_lang` WHERE (SUBSTRING(purchase_item_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_item_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'INSERT INTO purchase_order_addr_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_addr` WHERE (SUBSTRING(purchase_order_addr_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_addr_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_6; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i,j INT; + SET i = 0; + SET j = 6; + WHILE i<64 DO + SET @create_refund_info_table = CONCAT( + 'INSERT INTO order_refund_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_refund_info_table FROM @create_refund_info_table; + EXECUTE create_refund_info_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'INSERT INTO order_refund_intervention_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_intervention` WHERE (SUBSTRING(refund_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(refund_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'INSERT INTO order_refund_addr_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_addr` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'INSERT INTO order_refund_settlement_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_settlement` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET @create_purchase_order_table = CONCAT( + 'INSERT INTO purchase_order_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'INSERT INTO purchase_order_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_lang` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'INSERT INTO purchase_order_item_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'INSERT INTO purchase_order_item_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item_lang` WHERE (SUBSTRING(purchase_item_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_item_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'INSERT INTO purchase_order_addr_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_addr` WHERE (SUBSTRING(purchase_order_addr_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_addr_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_7; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i,j INT; + SET i = 0; + SET j = 7; + WHILE i<64 DO + SET @create_refund_info_table = CONCAT( + 'INSERT INTO order_refund_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_refund_info_table FROM @create_refund_info_table; + EXECUTE create_refund_info_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'INSERT INTO order_refund_intervention_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_intervention` WHERE (SUBSTRING(refund_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(refund_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'INSERT INTO order_refund_addr_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_addr` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'INSERT INTO order_refund_settlement_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_settlement` WHERE (SUBSTRING(user_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(user_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET @create_purchase_order_table = CONCAT( + 'INSERT INTO purchase_order_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'INSERT INTO purchase_order_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_lang` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'INSERT INTO purchase_order_item_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'INSERT INTO purchase_order_item_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item_lang` WHERE (SUBSTRING(purchase_item_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_item_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'INSERT INTO purchase_order_addr_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_addr` WHERE (SUBSTRING(purchase_order_addr_id, -3) + 0) % 8 = ', j, ' + AND ((SUBSTRING(purchase_order_addr_id, -3) + 0) DIV 8) % 64 = ', i, ' )' + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + + +# ============================== 5.修改nacos配置 ============================== +USE `mall4cloud_nacos`; +# ① 修改mall4cloud-order.yml配置,注意修改mongodb的host,将原本的mysql连接改为连接shardingSphere-proxy +UPDATE config_info +SET content= '# 数据源\nspring:\n datasource:\n url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3307}/${MYSQL_DATABASE:mall4cloud_order}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true\n username: ${MYSQL_USERNAME:sharding}\n password: ${MYSQL_PASSWORD:hn02le.34lkdLKD}\n data:\n mongodb:\n host: 192.168.193.128\n port: 27017\n database: mall4cloud\n username: mall4cloud\n password: mall4cloud\n authentication-database: mall4cloud\n\n\nmall4cloud:\n order:\n thread:\n coreSize: 0\n maxSize: 200\n keepAliveTime: 60\n\nmanagement:\n health:\n db:\n enabled: false' +WHERE data_id = 'mall4cloud-order.yml'; + +# ② 修改mall4cloud-payment.yml配置,注意修改domainUrl回调域名,将原本的mysql连接改为连接shardingSphere-proxy +UPDATE config_info +SET content= '# 数据源\nspring:\n datasource:\n url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3307}/${MYSQL_DATABASE:mall4cloud_payment}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true\n username: ${MYSQL_USERNAME:sharding}\n password: ${MYSQL_PASSWORD:hn02le.34lkdLKD}\n\napplication:\n domainUrl: https://cloud-api.mall4j.com/mall4cloud_payment' +WHERE data_id = 'mall4cloud-payment.yml'; + +# ③ 部署shardingSphere中间件,具体参考mall4cloud-doc项目下文档/src/branch/master/开发环境搭建/中间件docker-compose一键安装中新增的shardingSphere内容 + +# ④ 修改application.yml配置 +# 1.将原配置中seata配置删除,如下部分删除 +# seata: +# config: +# type: nacos +# nacos: +# namespace: 05b1150e-9306-474c-90e1-ed4852c21475 +# dataId: "seataServer.properties" +# server-addr: ${spring.cloud.nacos.discovery.server-addr} +# password: ${spring.cloud.nacos.discovery.password} +# username: ${spring.cloud.nacos.discovery.username} +# registry: +# type: nacos +# nacos: +# server-addr: ${spring.cloud.nacos.discovery.server-addr} +# password: ${spring.cloud.nacos.discovery.password} +# username: ${spring.cloud.nacos.discovery.username} +# namespace: ${seata.config.nacos.namespace} + +# 2.新增新的seata配置,注意修改ip +# seata: +# service: +# grouplist: +# default: 192.168.193.128:8091 +# vgroupMapping: +# default_tx_group: default + + +# ⑤ 删除原seata在nacos中的配置 +DELETE FROM `config_info` WHERE data_id = 'seataServer.properties' AND group_id = 'SEATA_GROUP'; +DELETE FROM `tenant_info` WHERE tenant_id = '4b70485d-72dd-44df-a76a-7a3f578a3001'; + +# ⑥ 更新seata表,更新结束后重新部署seata,升级版本 +# 具体参考mall4cloud-doc项目中 开发环境搭建--中间件docker-compose一键安装中seata的application.yml配置并且更新docker-compose.yml中seata部分 +# 重新部署一个seata 2.0.0版本 +USE `mall4cloud_seata`; +DROP TABLE IF EXISTS `global_table`; +CREATE TABLE IF NOT EXISTS `global_table` +( + `xid` VARCHAR(128) NOT NULL, + `transaction_id` BIGINT, + `status` TINYINT NOT NULL, + `application_id` VARCHAR(32), + `transaction_service_group` VARCHAR(32), + `transaction_name` VARCHAR(128), + `timeout` INT, + `begin_time` BIGINT, + `application_data` VARCHAR(2000), + `gmt_create` DATETIME, + `gmt_modified` DATETIME, + PRIMARY KEY (`xid`), + KEY `idx_status_gmt_modified` (`status` , `gmt_modified`), + KEY `idx_transaction_id` (`transaction_id`) +) ENGINE = INNODB + DEFAULT CHARSET = utf8mb4; + +-- the table to store BranchSession data +DROP TABLE IF EXISTS `branch_table`; +CREATE TABLE IF NOT EXISTS `branch_table` +( + `branch_id` BIGINT NOT NULL, + `xid` VARCHAR(128) NOT NULL, + `transaction_id` BIGINT, + `resource_group_id` VARCHAR(32), + `resource_id` VARCHAR(256), + `branch_type` VARCHAR(8), + `status` TINYINT, + `client_id` VARCHAR(64), + `application_data` VARCHAR(2000), + `gmt_create` DATETIME(6), + `gmt_modified` DATETIME(6), + PRIMARY KEY (`branch_id`), + KEY `idx_xid` (`xid`) +) ENGINE = INNODB + DEFAULT CHARSET = utf8mb4; + +-- the table to store lock data +DROP TABLE IF EXISTS `lock_table`; +CREATE TABLE `lock_table` +( + `row_key` VARCHAR(128) NOT NULL, + `xid` VARCHAR(128), + `transaction_id` BIGINT, + `branch_id` BIGINT NOT NULL, + `resource_id` VARCHAR(256), + `table_name` VARCHAR(32), + `pk` VARCHAR(36), + `status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking', + `gmt_create` DATETIME, + `gmt_modified` DATETIME, + PRIMARY KEY (`row_key`), + KEY `idx_status` (`status`), + KEY `idx_branch_id` (`branch_id`), + KEY `idx_xid` (`xid`) +) ENGINE = INNODB + DEFAULT CHARSET = utf8mb4; + +CREATE TABLE IF NOT EXISTS `distributed_lock` +( + `lock_key` CHAR(20) NOT NULL, + `lock_value` VARCHAR(20) NOT NULL, + `expire` BIGINT, + PRIMARY KEY (`lock_key`) +) ENGINE = INNODB + DEFAULT CHARSET = utf8mb4; + +INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0); +INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0); +INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0); +INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0); + + +# ============================== 6.删除总表中数据 ============================== +# 确保6.7.执行 成功 执行一次后,检查是否数据已经同步到各个分表中去,再执行下面的sql +USE mall4cloud_order; +DROP TABLE IF EXISTS `order_refund`; +DROP TABLE IF EXISTS `order_refund_intervention`; +DROP TABLE IF EXISTS `order_refund_addr`; +DROP TABLE IF EXISTS `order_refund_settlement`; +DROP TABLE IF EXISTS `purchase_order`; +DROP TABLE IF EXISTS `purchase_order_lang`; +DROP TABLE IF EXISTS `purchase_order_item`; +DROP TABLE IF EXISTS `purchase_order_item_lang`; +DROP TABLE IF EXISTS `purchase_order_addr`; + + + + + +# ============================== 7.移除order_item_lang多余国际化信息 ============================== + +USE mall4cloud_order_0; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @delete_lang_data = CONCAT( + 'delete from order_item_lang_', i,' WHERE lang = 2' + ); + PREPARE delete_lang_data FROM @delete_lang_data; + EXECUTE delete_lang_data; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + + +USE mall4cloud_order_1; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @delete_lang_data = CONCAT( + 'delete from order_item_lang_', i,' WHERE lang = 2' + ); + PREPARE delete_lang_data FROM @delete_lang_data; + EXECUTE delete_lang_data; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_2; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @delete_lang_data = CONCAT( + 'delete from order_item_lang_', i,' WHERE lang = 2' + ); + PREPARE delete_lang_data FROM @delete_lang_data; + EXECUTE delete_lang_data; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_3; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @delete_lang_data = CONCAT( + 'delete from order_item_lang_', i,' WHERE lang = 2' + ); + PREPARE delete_lang_data FROM @delete_lang_data; + EXECUTE delete_lang_data; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_4; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @delete_lang_data = CONCAT( + 'delete from order_item_lang_', i,' WHERE lang = 2' + ); + PREPARE delete_lang_data FROM @delete_lang_data; + EXECUTE delete_lang_data; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_5; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @delete_lang_data = CONCAT( + 'delete from order_item_lang_', i,' WHERE lang = 2' + ); + PREPARE delete_lang_data FROM @delete_lang_data; + EXECUTE delete_lang_data; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_6; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @delete_lang_data = CONCAT( + 'delete from order_item_lang_', i,' WHERE lang = 2' + ); + PREPARE delete_lang_data FROM @delete_lang_data; + EXECUTE delete_lang_data; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_7; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @delete_lang_data = CONCAT( + 'delete from order_item_lang_', i,' WHERE lang = 2' + ); + PREPARE delete_lang_data FROM @delete_lang_data; + EXECUTE delete_lang_data; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + + + +# ======================================= 8.改变主键 ======================================= + + +USE mall4cloud_order_0; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @change_item_key = CONCAT( + 'ALTER TABLE order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`order_item_id`)' + ); + PREPARE change_item_key FROM @change_item_key; + EXECUTE change_item_key; + + SET @change_purchase_item_key = CONCAT( + 'ALTER TABLE purchase_order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_item_id`)' + ); + PREPARE change_purchase_item_key FROM @change_purchase_item_key; + EXECUTE change_purchase_item_key; + + SET @change_purchase_order_key = CONCAT( + 'ALTER TABLE purchase_order_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_order_id`)' + ); + PREPARE change_purchase_order_key FROM @change_purchase_order_key; + EXECUTE change_purchase_order_key; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + + +USE mall4cloud_order_1; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @change_item_key = CONCAT( + 'ALTER TABLE order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`order_item_id`)' + ); + PREPARE change_item_key FROM @change_item_key; + EXECUTE change_item_key; + + SET @change_purchase_item_key = CONCAT( + 'ALTER TABLE purchase_order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_item_id`)' + ); + PREPARE change_purchase_item_key FROM @change_purchase_item_key; + EXECUTE change_purchase_item_key; + + SET @change_purchase_order_key = CONCAT( + 'ALTER TABLE purchase_order_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_order_id`)' + ); + PREPARE change_purchase_order_key FROM @change_purchase_order_key; + EXECUTE change_purchase_order_key; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_2; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @change_item_key = CONCAT( + 'ALTER TABLE order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`order_item_id`)' + ); + PREPARE change_item_key FROM @change_item_key; + EXECUTE change_item_key; + + SET @change_purchase_item_key = CONCAT( + 'ALTER TABLE purchase_order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_item_id`)' + ); + PREPARE change_purchase_item_key FROM @change_purchase_item_key; + EXECUTE change_purchase_item_key; + + SET @change_purchase_order_key = CONCAT( + 'ALTER TABLE purchase_order_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_order_id`)' + ); + PREPARE change_purchase_order_key FROM @change_purchase_order_key; + EXECUTE change_purchase_order_key; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_3; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @change_item_key = CONCAT( + 'ALTER TABLE order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`order_item_id`)' + ); + PREPARE change_item_key FROM @change_item_key; + EXECUTE change_item_key; + + SET @change_purchase_item_key = CONCAT( + 'ALTER TABLE purchase_order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_item_id`)' + ); + PREPARE change_purchase_item_key FROM @change_purchase_item_key; + EXECUTE change_purchase_item_key; + + SET @change_purchase_order_key = CONCAT( + 'ALTER TABLE purchase_order_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_order_id`)' + ); + PREPARE change_purchase_order_key FROM @change_purchase_order_key; + EXECUTE change_purchase_order_key; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_4; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @change_item_key = CONCAT( + 'ALTER TABLE order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`order_item_id`)' + ); + PREPARE change_item_key FROM @change_item_key; + EXECUTE change_item_key; + + SET @change_purchase_item_key = CONCAT( + 'ALTER TABLE purchase_order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_item_id`)' + ); + PREPARE change_purchase_item_key FROM @change_purchase_item_key; + EXECUTE change_purchase_item_key; + + SET @change_purchase_order_key = CONCAT( + 'ALTER TABLE purchase_order_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_order_id`)' + ); + PREPARE change_purchase_order_key FROM @change_purchase_order_key; + EXECUTE change_purchase_order_key; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_5; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @change_item_key = CONCAT( + 'ALTER TABLE order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`order_item_id`)' + ); + PREPARE change_item_key FROM @change_item_key; + EXECUTE change_item_key; + + SET @change_purchase_item_key = CONCAT( + 'ALTER TABLE purchase_order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_item_id`)' + ); + PREPARE change_purchase_item_key FROM @change_purchase_item_key; + EXECUTE change_purchase_item_key; + + SET @change_purchase_order_key = CONCAT( + 'ALTER TABLE purchase_order_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_order_id`)' + ); + PREPARE change_purchase_order_key FROM @change_purchase_order_key; + EXECUTE change_purchase_order_key; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_6; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @change_item_key = CONCAT( + 'ALTER TABLE order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`order_item_id`)' + ); + PREPARE change_item_key FROM @change_item_key; + EXECUTE change_item_key; + + SET @change_purchase_item_key = CONCAT( + 'ALTER TABLE purchase_order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_item_id`)' + ); + PREPARE change_purchase_item_key FROM @change_purchase_item_key; + EXECUTE change_purchase_item_key; + + SET @change_purchase_order_key = CONCAT( + 'ALTER TABLE purchase_order_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_order_id`)' + ); + PREPARE change_purchase_order_key FROM @change_purchase_order_key; + EXECUTE change_purchase_order_key; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_order_7; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @change_item_key = CONCAT( + 'ALTER TABLE order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`order_item_id`)' + ); + PREPARE change_item_key FROM @change_item_key; + EXECUTE change_item_key; + + SET @change_purchase_item_key = CONCAT( + 'ALTER TABLE purchase_order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_item_id`)' + ); + PREPARE change_purchase_item_key FROM @change_purchase_item_key; + EXECUTE change_purchase_item_key; + + SET @change_purchase_order_key = CONCAT( + 'ALTER TABLE purchase_order_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_order_id`)' + ); + PREPARE change_purchase_order_key FROM @change_purchase_order_key; + EXECUTE change_purchase_order_key; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + + + +# ======================================= 9.移除多余的undolog ======================================= + +USE mall4cloud_order_0; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_order_1; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_order_2; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_order_3; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_order_4; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_order_5; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_order_6; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_order_7; DROP TABLE IF EXISTS `undo_log`; + +USE mall4cloud_payment; +DROP TABLE IF EXISTS `undo_log`; + +CREATE TABLE `undo_log` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `branch_id` bigint NOT NULL, + `xid` varchar(100) NOT NULL, + `context` varchar(128) NOT NULL, + `rollback_info` longblob NOT NULL, + `log_status` int NOT NULL, + `log_created` datetime NOT NULL, + `log_modified` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +USE mall4cloud_payment_0; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_payment_1; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_payment_2; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_payment_3; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_payment_4; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_payment_5; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_payment_6; DROP TABLE IF EXISTS `undo_log`; +USE mall4cloud_payment_7; DROP TABLE IF EXISTS `undo_log`; \ No newline at end of file diff --git a/db/2024-01-08 2.库存和组合商品修改(看注释).sql b/db/2024-01-08 2.库存和组合商品修改(看注释).sql new file mode 100644 index 0000000..c637054 --- /dev/null +++ b/db/2024-01-08 2.库存和组合商品修改(看注释).sql @@ -0,0 +1,393 @@ +# 添加mongodb的索引 +# 注意:这部分为mongodn的sql + +db.coupon_user.ensureIndex({"userId": 1}, {"name": "user_idx"}); +db.coupon_user.ensureIndex({"couponId": 1}, {"name": "coupon_idx"}); +db.coupon_user.ensureIndex({"shopId": 1}, {"name": "shop_idx"}); + +db.group_order.ensureIndex({"userId": 1}, {"name": "user_idx"}); +db.group_order.ensureIndex({"shopId": 1}, {"name": "shop_idx"}); +db.group_order.ensureIndex({"groupActivityId": 1}, {"name": "group_activity_idx"}); + +db.group_team.ensureIndex({"shopId": 1}, {"name": "shop_idx"}); +db.group_team.ensureIndex({"shareUserId": 1}, {"name": "share_user_idx"}); +db.group_team.ensureIndex({"groupSpuId": 1}, {"name": "group_spu_idx"}); +db.group_team.ensureIndex({"groupActivityId": 1}, {"name": "group_activity_idx"}); + +db.order.ensureIndex({"userId": 1}, {"name": "user_idx"}); +db.order.ensureIndex({"shopId": 1}, {"name": "shop_idx"}); +db.order.ensureIndex({"supplierId": 1}, {"name": "supplier_idx"}); +db.order.ensureIndex({"stationId": 1}, {"name": "station_idx"}); + +db.order_refund.ensureIndex({"orderId": 1}, {"name": "order_idx"}); +db.order_refund.ensureIndex({"payId": 1}, {"name": "pay_idx"}); +db.order_refund.ensureIndex({"userId": 1}, {"name": "user_idx"}); +db.order_refund.ensureIndex({"shopId": 1}, {"name": "shop_idx"}); +db.order_refund.ensureIndex({"supplierId": 1}, {"name": "supplier_idx"}); + +db.order_virtual_info_log.ensureIndex({"orderId": 1}, {"name": "order_idx"}); +db.order_virtual_info_log.ensureIndex({"shopId": 1}, {"name": "shop_idx"}); +db.order_virtual_info_log.ensureIndex({"stationId": 1}, {"name": "station_idx"}); + +db.purchase_order.ensureIndex({"orderId": 1}, {"name": "order_idx"}); +db.purchase_order.ensureIndex({"supplierId": 1}, {"name": "supplier_idx"}); + +db.stock_bill_log.ensureIndex({"sourceOrderNo": 1}, {"name": "source_order_no_idx"}); +db.stock_bill_log.ensureIndex({"shopId": 1}, {"name": "shop_idx"}); +db.stock_bill_log.ensureIndex({"stockBillNo": 1, "type": 1}, {"name": "id_order_no"}); + +db.supplier_wallet_log.ensureIndex({"supplierId": 1, "reason": 1}, {"name": "supplierId_reason_idx"}); +db.supplier_wallet_log.ensureIndex({"orderId": 1}, {"name": "order_idx"}); + +db.flow_regional.ensureIndex({"dateType": 1, "provinceId": 1}, {"name": "data_type_province_idx"}); +db.flow_spu.ensureIndex({"dateType": 1, "shopId": 1}, {"name": "data_type_shop_idx"}); +db.flow_spu_user.ensureIndex({"spuId": 1, "userId": 1}, {"name": "spu_user_idx"}); +db.flow_system.ensureIndex({"dateType": 1, "systemType": 1}, {"name": "date_type_system_type_idx"}); +db.flow_system.ensureIndex({"spuId": 1, "userId": 1}, {"name": "spu_user_idx"}); +db.flow_system_user.ensureIndex({"userId": 1}, {"name": "user_idx"}); +db.flow_system_user.ensureIndex({"dateType": 1, "systemType": 1}, {"name": "date_type_system_type_idx"}); +db.flow_user.ensureIndex({"dateType": 1, "type": 1}, {"name": "date_type_type_idx"}); +db.flow_user_footprint.ensureIndex({"dateType": 1}, {"name": "date_type_idx"}); +db.flow_user_operation.ensureIndex({"userId": 1}, {"name": "user_idx"}); +db.flow_user_retain.ensureIndex({"retainType": 1}, {"name": "retain_type_idx"}); + + +# 更改nacos的application.yml配置 +# 原配置 +# dubbo: +# application: +# name: ${spring.cloud.nacos.discovery.namespace}-${spring.application.name}-dubbo-server +# 更改为: +# dubbo: +# application: +# name: ${spring.cloud.nacos.discovery.namespace}-${spring.application.name}-dubbo-server +# serialize-check-status: WARN + + + + + + + + + + + + + +# 1 修改canal配置 +# 修改canal/example/instance.properties文件,在参数"canal.instance.filter.regex"中补充上"mall4cloud_order_[0-9]+.allot_order_[0-9]+:*",然后重启 + + +USE `mall4cloud_product`; +# 商品组合商品相关字段 +ALTER TABLE `spu` + MODIFY `spu_mold` tinyint NOT NULL COMMENT '商品类别 0.实物商品 1.虚拟商品 2.组合商品', + ADD COLUMN `is_all_entity` INT DEFAULT NULL COMMENT '是否为全部实物商品的组合商品 1.是 0.否'; +ALTER TABLE spu DROP COLUMN is_compose; + +CREATE TABLE `sku_combo` ( + `sku_id` bigint NOT NULL COMMENT '规格id', + `combo_sku_id` bigint NOT NULL COMMENT '组合的skuid', + `combo_spu_id` bigint NOT NULL COMMENT '组合的spuid', + `combo_count` int NOT NULL COMMENT '组合数量', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`sku_id`,`combo_sku_id`), + KEY `idx_spu_id` (`combo_spu_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='规格组合商品管理表'; + +# 实物盘点字段补充 +ALTER TABLE `take_stock` + ADD COLUMN `warehouse_id` bigint(0) NULL COMMENT '仓库id' AFTER `maker_mobile`, + ADD COLUMN `stock_point_type` tinyint(0) NULL COMMENT '库存点类型(1:仓库, 2:门店)' AFTER `warehouse_id`; + + +# 出入库原因添加系统类型字段 +ALTER TABLE `stock_change_reason` + ADD COLUMN `sys_type` tinyint(0) NULL COMMENT '系统类型'; + +# 添加库存管理表 +CREATE TABLE `stock_point_sku` ( + `stock_point_sku_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '库存商品关联skuid', + `stock_point_id` bigint NOT NULL COMMENT '库存点id', + `stock_point_type` tinyint NOT NULL COMMENT '库存点类型 1仓库 2门店', + `spu_id` bigint DEFAULT NULL COMMENT 'spuId', + `sku_id` bigint DEFAULT NULL COMMENT 'skuid', + `supplier_sku_id` bigint DEFAULT NULL COMMENT '当商品为代销商品时,供应商商品skuid', + `status` tinyint DEFAULT '0' COMMENT '状态 1:enable, 0:disable, -1:deleted', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `type` tinyint DEFAULT '1' COMMENT '仓库类型(0默认仓库,1区域仓库)', + `stock_mode` tinyint DEFAULT NULL COMMENT '库存模式 1共享总部库存 2独立销售库存', + PRIMARY KEY (`stock_point_sku_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +# 新增仓库表 +CREATE TABLE `warehouse` ( + `warehouse_id` bigint NOT NULL COMMENT '仓库id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `warehouse_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '仓库名称', + `type` tinyint DEFAULT NULL COMMENT '仓库类型(0默认仓库,1区域仓库)', + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '仓库地址', + `manage` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '管理人', + `phone` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '管理电话', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + PRIMARY KEY (`warehouse_id`), + KEY `shop_id` (`shop_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +INSERT INTO `warehouse` (`warehouse_id`,`shop_id`, `warehouse_name`, `type`, `address`, `manage`, `phone`, `sys_type`, `province_id`, `province`, `city_id`, `city`, `area_id`, `area`) +VALUES + (300000000000000,0,'默认仓库',0,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,NULL,NULL); + +CREATE TABLE `warehouse_area` ( + `warehouse_area_id` bigint NOT NULL AUTO_INCREMENT, + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `warehouse_id` bigint DEFAULT NULL COMMENT '仓库id', + `area_id` bigint DEFAULT NULL COMMENT '城市id', + PRIMARY KEY (`warehouse_area_id`) USING BTREE, + KEY `idx_warehouse_id` (`warehouse_id`) USING BTREE, + KEY `idx_city_id` (`area_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='仓库项和供货城市关联信息'; + + +INSERT INTO `leaf_alloc`(`biz_tag`, `max_id`, `step`, `update_time`, `description`) VALUES + ('mall4cloud-stock-point', 1000, 1000, '2023-12-15 17:28:15', '库存点id'); + +# 给旧门店数据创建一个门店仓库 +INSERT INTO `mall4cloud_product`.`warehouse` ( `warehouse_id`, `shop_id`, `sys_type`, `type`, `warehouse_name`, `phone`, `province_id`, `province`, `city_id`, `city`, `area_id`, `area`, `address` ) ( + SELECT + station_id warehouse_id, + station_id shop_id, + '4' sys_type, + '1' type, + station_name warehouse_name, + mobile phone, + province_id, + province, + city_id, + city, + area_id, + area, + addr address + FROM + `mall4cloud_order`.`station`); + + + + + +USE mall4cloud_order; + +INSERT INTO `leaf_alloc`(`biz_tag`, `max_id`, `step`, `update_time`, `description`) VALUES + ('mall4cloud-stock-point', 1000, 1000, '2023-12-15 17:28:15', '库存点id'); + +# 所有门店添加库存模式,并统一为共享总部库存 +ALTER TABLE `station` + ADD COLUMN `stock_mode` tinyint DEFAULT NULL COMMENT '库存模式 1共享总部库存 2独立销售库存'; + +update station set stock_mode = 1; + +# 删除店铺相关字段,修改店铺地址到同城配送 +ALTER TABLE `same_city` + ADD COLUMN `province_id` bigint(0) NULL DEFAULT NULL COMMENT '省ID' AFTER `lat`, + ADD COLUMN `province` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '省' AFTER `province_id`, + ADD COLUMN `city_id` bigint(0) NULL DEFAULT NULL COMMENT '城市ID' AFTER `province`, + ADD COLUMN `city` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '城市' AFTER `city_id`, + ADD COLUMN `area_id` bigint(0) NULL DEFAULT NULL COMMENT '区ID' AFTER `city`, + ADD COLUMN `area` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '区' AFTER `area_id`, + ADD COLUMN `detail_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细地址' AFTER `area`, + ADD COLUMN `shop_lng` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '店铺所在经度' AFTER `detail_address`, + ADD COLUMN `shop_lat` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '店铺所在维度' AFTER `shop_lng`; + +UPDATE `mall4cloud_order`.`same_city` sc + INNER JOIN ( SELECT shop_lng, shop_lat, province_id, province, city_id, city, area_id, area, detail_address, shop_id FROM `mall4cloud_admin`.`shop_detail` ) AS sd ON sc.shop_id = sd.shop_id + SET sc.shop_lng = sd.shop_lng, + sc.shop_lat = sd.shop_lat, + sc.province_id = sd.province_id, + sc.province = sd.province, + sc.city_id = sd.city_id, + sc.city = sd.city, + sc.area_id = sd.area_id, + sc.area = sd.area, + sc.detail_address = sd.detail_address; + + + + +# 新增组合商品订单相关字段,此处为了方便查看不重复写代码了,实际需要更改mall4cloud_order_0-7的8个库的分库分表!!!!! +USE mall4cloud_order_0; +DELIMITER // +DROP PROCEDURE IF EXISTS updateOrderInfo // +CREATE PROCEDURE updateOrderInfo() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @update_order_item = CONCAT("ALTER TABLE order_item_", i," + ADD COLUMN `write_off_num` INT DEFAULT NULL COMMENT '核销次数 -1.多次核销 0.无需核销 1.单次核销' AFTER `supplier_pic`, + ADD COLUMN `write_off_multiple_count` INT DEFAULT NULL COMMENT '核销次数 -1.无限次' AFTER `write_off_num`, + ADD COLUMN `write_off_start` DATETIME DEFAULT NULL COMMENT '核销开始时间' AFTER `write_off_multiple_count`, + ADD COLUMN `write_off_end` DATETIME DEFAULT NULL COMMENT '核销结束时间' AFTER `write_off_start`; + "); +PREPARE update_order_item FROM @update_order_item; +EXECUTE update_order_item; + +SET @update_order = CONCAT( "ALTER TABLE order_", i," + ADD COLUMN main_order_id BIGINT NOT NULL DEFAULT '0' COMMENT '主单号,在组合/套餐商品拆单时会存在' AFTER `write_off_count`; + "); +PREPARE update_order FROM @update_order; +EXECUTE update_order; + +SET @update_order_virtual_lang = CONCAT( "ALTER TABLE order_virtual_info_", i," + ADD COLUMN `order_item_id` bigint NOT NULL DEFAULT '0' COMMENT '订单项id' AFTER `order_id`; + "); +PREPARE update_order_virtual_lang FROM @update_order_virtual_lang; +EXECUTE update_order_virtual_lang; + +SET @add_order_item = CONCAT( "ALTER TABLE order_item_", i, " ADD COLUMN `stock_point_id` bigint DEFAULT NULL COMMENT '库存点id';" ); +PREPARE add_allot_order_item FROM @add_order_item; +EXECUTE add_allot_order_item; + +SET @add_allot_order = CONCAT( "CREATE TABLE IF NOT EXISTS `allot_order_", i, "` ( + `allot_order_id` bigint(0) NOT NULL COMMENT '调拨订单id', + `out_warehouse_id` bigint(0) NULL DEFAULT NULL COMMENT '调出点仓库id', + `out_stock_point_type` int(0) NULL DEFAULT NULL COMMENT '调出点库存点类型(1:仓库, 2:门店)', + `in_warehouse_id` bigint(0) NULL DEFAULT NULL COMMENT '调入点仓库id', + `in_stock_point_type` int(0) NULL DEFAULT NULL COMMENT '调入点库存点类型(1:仓库, 2:门店)', + `dvy_company_id` bigint(0) NULL DEFAULT NULL COMMENT '物流公司id', + `dvy_type` int(0) NULL DEFAULT NULL COMMENT '物流方式(1:快递, 2:无需快递)', + `dvy_order_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '物流单号', + `status` int(0) NULL DEFAULT NULL COMMENT '状态(0:作废, 1:待入库, 2:部分入库, 3:已完成)', + `total_allot_count` int(0) NULL DEFAULT NULL COMMENT '总调拨数量', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `shop_id` bigint(0) NULL COMMENT '店铺id', + `sys_type` int(1) NULL COMMENT '系统类型', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`allot_order_id`) USING BTREE + ); " ); +PREPARE add_allot_order FROM @add_allot_order; +EXECUTE add_allot_order; + +SET @add_allot_order_item = CONCAT( "CREATE TABLE `allot_order_item_", i, "` ( + `allot_order_item_id` bigint NOT NULL COMMENT '调拨订单商品id', + `allot_order_id` bigint NULL COMMENT '调拨订单id', + `spu_id` bigint NULL COMMENT '商品spuId', + `sku_id` bigint NULL COMMENT '商品skuId', + `allot_count` int(255) NULL COMMENT '调拨数量', + `allot_in_count` int(255) NULL COMMENT '调拨入库数量', + `create_time` datetime NULL COMMENT '创建时间', + `update_time` datetime NULL COMMENT '创建时间', + PRIMARY KEY (`allot_order_item_id`) + );" ); +PREPARE add_allot_order_item FROM @add_allot_order_item; +EXECUTE add_allot_order_item; + +SET i = i + 1; +END WHILE; + +END // +CALL updateOrderInfo() // +DROP PROCEDURE updateOrderInfo // + DELIMITER ; + + + + + +# 添加仓库菜单 +USE `mall4cloud_auth`; + +UPDATE `menu` SET `parent_id` = 424, `biz_type` = 1, `permission` = NULL, `path` = '/manage', `component` = 'inventory', `redirect` = NULL, `always_show` = NULL, `hidden` = 0, `name` = '库存管理', `title` = '库存管理', `icon` = '', `seq` = 1 WHERE `menu_id` = 426; +UPDATE `menu` SET `parent_id` = 424, `biz_type` = 1, `permission` = NULL, `path` = '/stock', `component` = 'stock', `redirect` = NULL, `always_show` = NULL, `hidden` = 0, `name` = '库存盘点', `title` = '库存盘点', `icon` = '', `seq` = 4 WHERE `menu_id` = 575; +UPDATE `menu` SET `parent_id` = 424, `biz_type` = 1, `permission` = NULL, `path` = '/rec-send-manage', `component` = 'inventory', `redirect` = NULL, `always_show` = NULL, `hidden` = 0, `name` = '出入库管理', `title` = '出入库管理', `icon` = '', `seq` = 3 WHERE `menu_id` = 432; +UPDATE `menu` SET `parent_id` = 424, `biz_type` = 1, `permission` = NULL, `path` = '/purchase-manage', `component` = 'inventory', `redirect` = NULL, `always_show` = NULL, `hidden` = 0, `name` = '采购管理', `title` = '采购管理', `icon` = '', `seq` = 2 WHERE `menu_id` = 429; +UPDATE `menu` SET `parent_id` = 0, `biz_type` = 3, `permission` = NULL, `path` = '/order', `component` = 'Layout', `redirect` = NULL, `always_show` = NULL, `hidden` = 0, `name` = 'order', `title` = '订单', `icon` = 'order', `seq` = 3 WHERE `menu_id` = 448; +UPDATE `menu` SET `parent_id` = 680, `biz_type` = 1, `permission` = NULL, `path` = 'station', `component` = 'order/delivery-manage/station', `redirect` = NULL, `always_show` = NULL, `hidden` = 0, `name` = '门店管理', `title` = '门店管理', `icon` = '', `seq` = 1 WHERE `menu_id` = 599; + + +# !!!680是仓库门店的菜单id,如果有改动需要自行根据id修改 +INSERT INTO `menu`(`menu_id`, `create_time`, `update_time`, `parent_id`, `biz_type`, `permission`, `path`, `component`, `redirect`, `always_show`, `hidden`, `name`, `title`, `icon`, `no_cache`, `breadcrumb`, `affix`, `active_menu`, `seq`) VALUES +(680, '2023-11-16 13:46:14', '2023-11-28 14:33:09', 424, 1, NULL, '/stock/warehouse-store', 'inventory', NULL, NULL, 0, '仓库门店', '仓库门店', '', NULL, NULL, NULL, NULL, 0), +(681, '2023-11-16 13:47:53', '2023-11-28 14:33:43', 680, 1, NULL, 'warehouse-manage', 'stock/warehouse-store/warehouse-manage/index', NULL, NULL, 0, '仓库管理', '仓库管理', '', NULL, NULL, NULL, NULL, 0), +(682, '2023-11-20 11:54:19', '2023-11-20 11:54:40', 0, 3, NULL, '/stock', 'Layout', NULL, NULL, 0, '库存', '库存', '', NULL, NULL, NULL, NULL, 2), +(683, '2023-11-20 11:56:35', '2023-11-20 11:56:59', 682, 3, NULL, '/stock/warehouse', '-', NULL, NULL, 0, '仓库管理', '仓库管理', '', NULL, NULL, NULL, NULL, 0), +(684, '2023-11-20 11:58:11', '2023-11-20 13:33:26', 683, 3, NULL, 'warehouse/warehouse-manage', 'stock/warehouse/warehouse-manage', NULL, NULL, 0, '仓库管理', '仓库管理', '', NULL, NULL, NULL, NULL, 0), +(685, '2023-11-23 10:06:44', '2023-11-23 10:07:23', 682, 3, NULL, '/rec-send-manage', 'inventory', NULL, NULL, 0, '出入库管理', '出入库管理', '', NULL, NULL, NULL, NULL, 1), +(686, '2023-11-23 10:08:05', '2023-11-23 10:08:33', 685, 3, NULL, 'stock-send-add-or-update', 'stock/rec-send-manage/out-stock/add-or-update', NULL, NULL, 1, '新建出库明细', '新建出库明细', '', NULL, NULL, NULL, NULL, 0), +(687, '2023-11-23 10:09:15', '2023-11-23 10:09:15', 685, 3, NULL, 'receive-list', 'stock/rec-send-manage/in-stock', NULL, NULL, 0, '入库明细', '入库明细', '', NULL, NULL, NULL, NULL, 1), +(688, '2023-11-23 10:10:03', '2023-11-23 10:10:21', 685, 3, NULL, 'receive-detail', 'stock/rec-send-manage/in-stock/components/in-detail', NULL, NULL, 1, '入库明细详情', '入库明细详情', '', NULL, NULL, NULL, NULL, 0), +(689, '2023-11-23 10:10:56', '2023-11-27 16:52:00', 685, 3, NULL, 'stock-receive-add-or-update', 'stock/rec-send-manage/in-stock/add-or-update', NULL, NULL, 1, '新建入库明细', '新建入库明细', '', NULL, NULL, NULL, NULL, 0), +(690, '2023-11-23 10:11:30', '2023-11-23 10:11:30', 685, 3, NULL, 'customize-reason', 'stock/rec-send-manage/reason', NULL, NULL, 0, '出入库原因', '出入库原因', '', NULL, NULL, NULL, NULL, 2), +(691, '2023-11-23 10:12:02', '2023-11-23 10:12:02', 685, 3, NULL, 'send-list', 'stock/rec-send-manage/out-stock', NULL, NULL, 0, '出库明细', '出库明细', '', NULL, NULL, NULL, NULL, 3), +(692, '2023-11-23 10:13:12', '2023-11-23 10:53:23', 685, 3, NULL, 'send-detail', 'stock/rec-send-manage/out-stock/components/out-detail', NULL, NULL, 1, '出库明细详情', '出库明细详情', '', NULL, NULL, NULL, NULL, 3), +(694, '2023-11-28 14:26:29', '2023-12-14 09:18:33', 680, 1, NULL, 'transfer-order', 'stock/warehouse-store/transfer-order/index', NULL, NULL, 0, '调拨订单', '调拨订单', '', NULL, NULL, NULL, NULL, 2), +(695, '2023-11-28 14:29:21', '2023-11-28 14:32:35', 680, 1, NULL, 'transfer-order-create', 'stock/warehouse-store/transfer-order-create/index', NULL, NULL, 1, '新建调拨订单', '新建调拨订单', '', NULL, NULL, NULL, NULL, 2), +(696, '2023-12-04 16:39:48', '2023-12-04 16:50:11', 683, 3, NULL, 'transfer-order', 'stock/warehouse/transfer-order/index', NULL, NULL, 0, '调拨订单', '调拨订单', '', NULL, NULL, NULL, NULL, 1), +(697, '2023-12-04 16:46:12', '2023-12-04 16:50:39', 683, 3, NULL, 'transfer-order-create', 'stock/warehouse/transfer-order-create/index', NULL, NULL, 1, '新建调拨订单', '新建调拨订单', '', NULL, NULL, NULL, NULL, 0); + + +USE `mall4cloud_seckill`; + +ALTER TABLE `seckill` + ADD COLUMN `replenish` int DEFAULT NULL COMMENT '补充库存 0不补充 1补充'; + + +CREATE TABLE `seckill_stock_point_sku` ( + `seckill_stock_point_sku_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '库存商品关联skuid', + `stock_point_id` bigint NOT NULL COMMENT '库存点id', + `stock_point_type` tinyint NOT NULL COMMENT '库存点类型 1仓库 2门店', + `sku_id` bigint DEFAULT NULL COMMENT 'sku_id', + `seckill_sku_id` bigint DEFAULT NULL COMMENT '秒杀活动skuid', + `status` tinyint DEFAULT '0' COMMENT '状态 1:enable, 0:disable, -1:deleted', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `type` tinyint DEFAULT NULL COMMENT '仓库类型(0默认仓库,1区域仓库)', + `seckill_origin_stocks` int DEFAULT NULL COMMENT '秒杀库存点原始库存', + PRIMARY KEY (`seckill_stock_point_sku_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + + + + +USE `mall4cloud_admin`; +ALTER TABLE `shop_detail` +DROP COLUMN `email`, +DROP COLUMN `detail_address`, +DROP COLUMN `shop_lng`, +DROP COLUMN `shop_lat`, +DROP COLUMN `province_id`, +DROP COLUMN `province`, +DROP COLUMN `city_id`, +DROP COLUMN `city`, +DROP COLUMN `area_id`, +DROP COLUMN `area`; + +ALTER TABLE `supplier_detail` +DROP COLUMN `email`, +DROP COLUMN `detail_address`, +DROP COLUMN `province_id`, +DROP COLUMN `province`, +DROP COLUMN `city_id`, +DROP COLUMN `city`, +DROP COLUMN `area_id`, +DROP COLUMN `area`; + + +# 将原sku库存初始化为区域库存 +USE mall4cloud_job; +# 执行sql后,到xxl-job的控制台页面执行这两个定时任务,分别在商品和秒杀模块下,执行后即可删除,尽量不要重复执行 +insert into `xxl_job_info` (`job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`, `trigger_status`, `trigger_last_time`, `trigger_next_time`) values +(4,'初始化秒杀区域库存','2023-07-10 09:51:23','2023-07-10 09:52:03','admin','','CRON','0 * * * * ?','DO_NOTHING','FIRST','initPointSeckillStock','','SERIAL_EXECUTION','0','0','BEAN','','GLUE代码初始化','2023-07-10 09:51:23','','0','0','0'), +(11,'初始化区域库存','2023-07-10 09:51:23','2023-07-10 09:52:03','admin','','CRON','0 * * * * ?','DO_NOTHING','FIRST','intiPointStock','','SERIAL_EXECUTION','0','0','BEAN','','GLUE代码初始化','2023-07-10 09:51:23','','0','0','0'); diff --git a/db/2024-01-08 3.库存和组合商品修改(大sql).sql b/db/2024-01-08 3.库存和组合商品修改(大sql).sql new file mode 100644 index 0000000..5c9f1d6 --- /dev/null +++ b/db/2024-01-08 3.库存和组合商品修改(大sql).sql @@ -0,0 +1,2007 @@ +USE mall4cloud_order; + +# 新增allotOrder分库分表key +INSERT INTO `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) VALUES +('mall4cloud-allot-order-000','1','1000','调拨订单id'), +('mall4cloud-allot-order-001','1','1000','调拨订单id'), +('mall4cloud-allot-order-002','1','1000','调拨订单id'), +('mall4cloud-allot-order-003','1','1000','调拨订单id'), +('mall4cloud-allot-order-004','1','1000','调拨订单id'), +('mall4cloud-allot-order-005','1','1000','调拨订单id'), +('mall4cloud-allot-order-006','1','1000','调拨订单id'), +('mall4cloud-allot-order-007','1','1000','调拨订单id'), +('mall4cloud-allot-order-008','1','1000','调拨订单id'), +('mall4cloud-allot-order-009','1','1000','调拨订单id'), +('mall4cloud-allot-order-010','1','1000','调拨订单id'), +('mall4cloud-allot-order-011','1','1000','调拨订单id'), +('mall4cloud-allot-order-012','1','1000','调拨订单id'), +('mall4cloud-allot-order-013','1','1000','调拨订单id'), +('mall4cloud-allot-order-014','1','1000','调拨订单id'), +('mall4cloud-allot-order-015','1','1000','调拨订单id'), +('mall4cloud-allot-order-016','1','1000','调拨订单id'), +('mall4cloud-allot-order-017','1','1000','调拨订单id'), +('mall4cloud-allot-order-018','1','1000','调拨订单id'), +('mall4cloud-allot-order-019','1','1000','调拨订单id'), +('mall4cloud-allot-order-020','1','1000','调拨订单id'), +('mall4cloud-allot-order-021','1','1000','调拨订单id'), +('mall4cloud-allot-order-022','1','1000','调拨订单id'), +('mall4cloud-allot-order-023','1','1000','调拨订单id'), +('mall4cloud-allot-order-024','1','1000','调拨订单id'), +('mall4cloud-allot-order-025','1','1000','调拨订单id'), +('mall4cloud-allot-order-026','1','1000','调拨订单id'), +('mall4cloud-allot-order-027','1','1000','调拨订单id'), +('mall4cloud-allot-order-028','1','1000','调拨订单id'), +('mall4cloud-allot-order-029','1','1000','调拨订单id'), +('mall4cloud-allot-order-030','1','1000','调拨订单id'), +('mall4cloud-allot-order-031','1','1000','调拨订单id'), +('mall4cloud-allot-order-032','1','1000','调拨订单id'), +('mall4cloud-allot-order-033','1','1000','调拨订单id'), +('mall4cloud-allot-order-034','1','1000','调拨订单id'), +('mall4cloud-allot-order-035','1','1000','调拨订单id'), +('mall4cloud-allot-order-036','1','1000','调拨订单id'), +('mall4cloud-allot-order-037','1','1000','调拨订单id'), +('mall4cloud-allot-order-038','1','1000','调拨订单id'), +('mall4cloud-allot-order-039','1','1000','调拨订单id'), +('mall4cloud-allot-order-040','1','1000','调拨订单id'), +('mall4cloud-allot-order-041','1','1000','调拨订单id'), +('mall4cloud-allot-order-042','1','1000','调拨订单id'), +('mall4cloud-allot-order-043','1','1000','调拨订单id'), +('mall4cloud-allot-order-044','1','1000','调拨订单id'), +('mall4cloud-allot-order-045','1','1000','调拨订单id'), +('mall4cloud-allot-order-046','1','1000','调拨订单id'), +('mall4cloud-allot-order-047','1','1000','调拨订单id'), +('mall4cloud-allot-order-048','1','1000','调拨订单id'), +('mall4cloud-allot-order-049','1','1000','调拨订单id'), +('mall4cloud-allot-order-050','1','1000','调拨订单id'), +('mall4cloud-allot-order-051','1','1000','调拨订单id'), +('mall4cloud-allot-order-052','1','1000','调拨订单id'), +('mall4cloud-allot-order-053','1','1000','调拨订单id'), +('mall4cloud-allot-order-054','1','1000','调拨订单id'), +('mall4cloud-allot-order-055','1','1000','调拨订单id'), +('mall4cloud-allot-order-056','1','1000','调拨订单id'), +('mall4cloud-allot-order-057','1','1000','调拨订单id'), +('mall4cloud-allot-order-058','1','1000','调拨订单id'), +('mall4cloud-allot-order-059','1','1000','调拨订单id'), +('mall4cloud-allot-order-060','1','1000','调拨订单id'), +('mall4cloud-allot-order-061','1','1000','调拨订单id'), +('mall4cloud-allot-order-062','1','1000','调拨订单id'), +('mall4cloud-allot-order-063','1','1000','调拨订单id'), +('mall4cloud-allot-order-064','1','1000','调拨订单id'), +('mall4cloud-allot-order-065','1','1000','调拨订单id'), +('mall4cloud-allot-order-066','1','1000','调拨订单id'), +('mall4cloud-allot-order-067','1','1000','调拨订单id'), +('mall4cloud-allot-order-068','1','1000','调拨订单id'), +('mall4cloud-allot-order-069','1','1000','调拨订单id'), +('mall4cloud-allot-order-070','1','1000','调拨订单id'), +('mall4cloud-allot-order-071','1','1000','调拨订单id'), +('mall4cloud-allot-order-072','1','1000','调拨订单id'), +('mall4cloud-allot-order-073','1','1000','调拨订单id'), +('mall4cloud-allot-order-074','1','1000','调拨订单id'), +('mall4cloud-allot-order-075','1','1000','调拨订单id'), +('mall4cloud-allot-order-076','1','1000','调拨订单id'), +('mall4cloud-allot-order-077','1','1000','调拨订单id'), +('mall4cloud-allot-order-078','1','1000','调拨订单id'), +('mall4cloud-allot-order-079','1','1000','调拨订单id'), +('mall4cloud-allot-order-080','1','1000','调拨订单id'), +('mall4cloud-allot-order-081','1','1000','调拨订单id'), +('mall4cloud-allot-order-082','1','1000','调拨订单id'), +('mall4cloud-allot-order-083','1','1000','调拨订单id'), +('mall4cloud-allot-order-084','1','1000','调拨订单id'), +('mall4cloud-allot-order-085','1','1000','调拨订单id'), +('mall4cloud-allot-order-086','1','1000','调拨订单id'), +('mall4cloud-allot-order-087','1','1000','调拨订单id'), +('mall4cloud-allot-order-088','1','1000','调拨订单id'), +('mall4cloud-allot-order-089','1','1000','调拨订单id'), +('mall4cloud-allot-order-090','1','1000','调拨订单id'), +('mall4cloud-allot-order-091','1','1000','调拨订单id'), +('mall4cloud-allot-order-092','1','1000','调拨订单id'), +('mall4cloud-allot-order-093','1','1000','调拨订单id'), +('mall4cloud-allot-order-094','1','1000','调拨订单id'), +('mall4cloud-allot-order-095','1','1000','调拨订单id'), +('mall4cloud-allot-order-096','1','1000','调拨订单id'), +('mall4cloud-allot-order-097','1','1000','调拨订单id'), +('mall4cloud-allot-order-098','1','1000','调拨订单id'), +('mall4cloud-allot-order-099','1','1000','调拨订单id'), +('mall4cloud-allot-order-100','1','1000','调拨订单id'), +('mall4cloud-allot-order-101','1','1000','调拨订单id'), +('mall4cloud-allot-order-102','1','1000','调拨订单id'), +('mall4cloud-allot-order-103','1','1000','调拨订单id'), +('mall4cloud-allot-order-104','1','1000','调拨订单id'), +('mall4cloud-allot-order-105','1','1000','调拨订单id'), +('mall4cloud-allot-order-106','1','1000','调拨订单id'), +('mall4cloud-allot-order-107','1','1000','调拨订单id'), +('mall4cloud-allot-order-108','1','1000','调拨订单id'), +('mall4cloud-allot-order-109','1','1000','调拨订单id'), +('mall4cloud-allot-order-110','1','1000','调拨订单id'), +('mall4cloud-allot-order-111','1','1000','调拨订单id'), +('mall4cloud-allot-order-112','1','1000','调拨订单id'), +('mall4cloud-allot-order-113','1','1000','调拨订单id'), +('mall4cloud-allot-order-114','1','1000','调拨订单id'), +('mall4cloud-allot-order-115','1','1000','调拨订单id'), +('mall4cloud-allot-order-116','1','1000','调拨订单id'), +('mall4cloud-allot-order-117','1','1000','调拨订单id'), +('mall4cloud-allot-order-118','1','1000','调拨订单id'), +('mall4cloud-allot-order-119','1','1000','调拨订单id'), +('mall4cloud-allot-order-120','1','1000','调拨订单id'), +('mall4cloud-allot-order-121','1','1000','调拨订单id'), +('mall4cloud-allot-order-122','1','1000','调拨订单id'), +('mall4cloud-allot-order-123','1','1000','调拨订单id'), +('mall4cloud-allot-order-124','1','1000','调拨订单id'), +('mall4cloud-allot-order-125','1','1000','调拨订单id'), +('mall4cloud-allot-order-126','1','1000','调拨订单id'), +('mall4cloud-allot-order-127','1','1000','调拨订单id'), +('mall4cloud-allot-order-128','1','1000','调拨订单id'), +('mall4cloud-allot-order-129','1','1000','调拨订单id'), +('mall4cloud-allot-order-130','1','1000','调拨订单id'), +('mall4cloud-allot-order-131','1','1000','调拨订单id'), +('mall4cloud-allot-order-132','1','1000','调拨订单id'), +('mall4cloud-allot-order-133','1','1000','调拨订单id'), +('mall4cloud-allot-order-134','1','1000','调拨订单id'), +('mall4cloud-allot-order-135','1','1000','调拨订单id'), +('mall4cloud-allot-order-136','1','1000','调拨订单id'), +('mall4cloud-allot-order-137','1','1000','调拨订单id'), +('mall4cloud-allot-order-138','1','1000','调拨订单id'), +('mall4cloud-allot-order-139','1','1000','调拨订单id'), +('mall4cloud-allot-order-140','1','1000','调拨订单id'), +('mall4cloud-allot-order-141','1','1000','调拨订单id'), +('mall4cloud-allot-order-142','1','1000','调拨订单id'), +('mall4cloud-allot-order-143','1','1000','调拨订单id'), +('mall4cloud-allot-order-144','1','1000','调拨订单id'), +('mall4cloud-allot-order-145','1','1000','调拨订单id'), +('mall4cloud-allot-order-146','1','1000','调拨订单id'), +('mall4cloud-allot-order-147','1','1000','调拨订单id'), +('mall4cloud-allot-order-148','1','1000','调拨订单id'), +('mall4cloud-allot-order-149','1','1000','调拨订单id'), +('mall4cloud-allot-order-150','1','1000','调拨订单id'), +('mall4cloud-allot-order-151','1','1000','调拨订单id'), +('mall4cloud-allot-order-152','1','1000','调拨订单id'), +('mall4cloud-allot-order-153','1','1000','调拨订单id'), +('mall4cloud-allot-order-154','1','1000','调拨订单id'), +('mall4cloud-allot-order-155','1','1000','调拨订单id'), +('mall4cloud-allot-order-156','1','1000','调拨订单id'), +('mall4cloud-allot-order-157','1','1000','调拨订单id'), +('mall4cloud-allot-order-158','1','1000','调拨订单id'), +('mall4cloud-allot-order-159','1','1000','调拨订单id'), +('mall4cloud-allot-order-160','1','1000','调拨订单id'), +('mall4cloud-allot-order-161','1','1000','调拨订单id'), +('mall4cloud-allot-order-162','1','1000','调拨订单id'), +('mall4cloud-allot-order-163','1','1000','调拨订单id'), +('mall4cloud-allot-order-164','1','1000','调拨订单id'), +('mall4cloud-allot-order-165','1','1000','调拨订单id'), +('mall4cloud-allot-order-166','1','1000','调拨订单id'), +('mall4cloud-allot-order-167','1','1000','调拨订单id'), +('mall4cloud-allot-order-168','1','1000','调拨订单id'), +('mall4cloud-allot-order-169','1','1000','调拨订单id'), +('mall4cloud-allot-order-170','1','1000','调拨订单id'), +('mall4cloud-allot-order-171','1','1000','调拨订单id'), +('mall4cloud-allot-order-172','1','1000','调拨订单id'), +('mall4cloud-allot-order-173','1','1000','调拨订单id'), +('mall4cloud-allot-order-174','1','1000','调拨订单id'), +('mall4cloud-allot-order-175','1','1000','调拨订单id'), +('mall4cloud-allot-order-176','1','1000','调拨订单id'), +('mall4cloud-allot-order-177','1','1000','调拨订单id'), +('mall4cloud-allot-order-178','1','1000','调拨订单id'), +('mall4cloud-allot-order-179','1','1000','调拨订单id'), +('mall4cloud-allot-order-180','1','1000','调拨订单id'), +('mall4cloud-allot-order-181','1','1000','调拨订单id'), +('mall4cloud-allot-order-182','1','1000','调拨订单id'), +('mall4cloud-allot-order-183','1','1000','调拨订单id'), +('mall4cloud-allot-order-184','1','1000','调拨订单id'), +('mall4cloud-allot-order-185','1','1000','调拨订单id'), +('mall4cloud-allot-order-186','1','1000','调拨订单id'), +('mall4cloud-allot-order-187','1','1000','调拨订单id'), +('mall4cloud-allot-order-188','1','1000','调拨订单id'), +('mall4cloud-allot-order-189','1','1000','调拨订单id'), +('mall4cloud-allot-order-190','1','1000','调拨订单id'), +('mall4cloud-allot-order-191','1','1000','调拨订单id'), +('mall4cloud-allot-order-192','1','1000','调拨订单id'), +('mall4cloud-allot-order-193','1','1000','调拨订单id'), +('mall4cloud-allot-order-194','1','1000','调拨订单id'), +('mall4cloud-allot-order-195','1','1000','调拨订单id'), +('mall4cloud-allot-order-196','1','1000','调拨订单id'), +('mall4cloud-allot-order-197','1','1000','调拨订单id'), +('mall4cloud-allot-order-198','1','1000','调拨订单id'), +('mall4cloud-allot-order-199','1','1000','调拨订单id'), +('mall4cloud-allot-order-200','1','1000','调拨订单id'), +('mall4cloud-allot-order-201','1','1000','调拨订单id'), +('mall4cloud-allot-order-202','1','1000','调拨订单id'), +('mall4cloud-allot-order-203','1','1000','调拨订单id'), +('mall4cloud-allot-order-204','1','1000','调拨订单id'), +('mall4cloud-allot-order-205','1','1000','调拨订单id'), +('mall4cloud-allot-order-206','1','1000','调拨订单id'), +('mall4cloud-allot-order-207','1','1000','调拨订单id'), +('mall4cloud-allot-order-208','1','1000','调拨订单id'), +('mall4cloud-allot-order-209','1','1000','调拨订单id'), +('mall4cloud-allot-order-210','1','1000','调拨订单id'), +('mall4cloud-allot-order-211','1','1000','调拨订单id'), +('mall4cloud-allot-order-212','1','1000','调拨订单id'), +('mall4cloud-allot-order-213','1','1000','调拨订单id'), +('mall4cloud-allot-order-214','1','1000','调拨订单id'), +('mall4cloud-allot-order-215','1','1000','调拨订单id'), +('mall4cloud-allot-order-216','1','1000','调拨订单id'), +('mall4cloud-allot-order-217','1','1000','调拨订单id'), +('mall4cloud-allot-order-218','1','1000','调拨订单id'), +('mall4cloud-allot-order-219','1','1000','调拨订单id'), +('mall4cloud-allot-order-220','1','1000','调拨订单id'), +('mall4cloud-allot-order-221','1','1000','调拨订单id'), +('mall4cloud-allot-order-222','1','1000','调拨订单id'), +('mall4cloud-allot-order-223','1','1000','调拨订单id'), +('mall4cloud-allot-order-224','1','1000','调拨订单id'), +('mall4cloud-allot-order-225','1','1000','调拨订单id'), +('mall4cloud-allot-order-226','1','1000','调拨订单id'), +('mall4cloud-allot-order-227','1','1000','调拨订单id'), +('mall4cloud-allot-order-228','1','1000','调拨订单id'), +('mall4cloud-allot-order-229','1','1000','调拨订单id'), +('mall4cloud-allot-order-230','1','1000','调拨订单id'), +('mall4cloud-allot-order-231','1','1000','调拨订单id'), +('mall4cloud-allot-order-232','1','1000','调拨订单id'), +('mall4cloud-allot-order-233','1','1000','调拨订单id'), +('mall4cloud-allot-order-234','1','1000','调拨订单id'), +('mall4cloud-allot-order-235','1','1000','调拨订单id'), +('mall4cloud-allot-order-236','1','1000','调拨订单id'), +('mall4cloud-allot-order-237','1','1000','调拨订单id'), +('mall4cloud-allot-order-238','1','1000','调拨订单id'), +('mall4cloud-allot-order-239','1','1000','调拨订单id'), +('mall4cloud-allot-order-240','1','1000','调拨订单id'), +('mall4cloud-allot-order-241','1','1000','调拨订单id'), +('mall4cloud-allot-order-242','1','1000','调拨订单id'), +('mall4cloud-allot-order-243','1','1000','调拨订单id'), +('mall4cloud-allot-order-244','1','1000','调拨订单id'), +('mall4cloud-allot-order-245','1','1000','调拨订单id'), +('mall4cloud-allot-order-246','1','1000','调拨订单id'), +('mall4cloud-allot-order-247','1','1000','调拨订单id'), +('mall4cloud-allot-order-248','1','1000','调拨订单id'), +('mall4cloud-allot-order-249','1','1000','调拨订单id'), +('mall4cloud-allot-order-250','1','1000','调拨订单id'), +('mall4cloud-allot-order-251','1','1000','调拨订单id'), +('mall4cloud-allot-order-252','1','1000','调拨订单id'), +('mall4cloud-allot-order-253','1','1000','调拨订单id'), +('mall4cloud-allot-order-254','1','1000','调拨订单id'), +('mall4cloud-allot-order-255','1','1000','调拨订单id'), +('mall4cloud-allot-order-256','1','1000','调拨订单id'), +('mall4cloud-allot-order-257','1','1000','调拨订单id'), +('mall4cloud-allot-order-258','1','1000','调拨订单id'), +('mall4cloud-allot-order-259','1','1000','调拨订单id'), +('mall4cloud-allot-order-260','1','1000','调拨订单id'), +('mall4cloud-allot-order-261','1','1000','调拨订单id'), +('mall4cloud-allot-order-262','1','1000','调拨订单id'), +('mall4cloud-allot-order-263','1','1000','调拨订单id'), +('mall4cloud-allot-order-264','1','1000','调拨订单id'), +('mall4cloud-allot-order-265','1','1000','调拨订单id'), +('mall4cloud-allot-order-266','1','1000','调拨订单id'), +('mall4cloud-allot-order-267','1','1000','调拨订单id'), +('mall4cloud-allot-order-268','1','1000','调拨订单id'), +('mall4cloud-allot-order-269','1','1000','调拨订单id'), +('mall4cloud-allot-order-270','1','1000','调拨订单id'), +('mall4cloud-allot-order-271','1','1000','调拨订单id'), +('mall4cloud-allot-order-272','1','1000','调拨订单id'), +('mall4cloud-allot-order-273','1','1000','调拨订单id'), +('mall4cloud-allot-order-274','1','1000','调拨订单id'), +('mall4cloud-allot-order-275','1','1000','调拨订单id'), +('mall4cloud-allot-order-276','1','1000','调拨订单id'), +('mall4cloud-allot-order-277','1','1000','调拨订单id'), +('mall4cloud-allot-order-278','1','1000','调拨订单id'), +('mall4cloud-allot-order-279','1','1000','调拨订单id'), +('mall4cloud-allot-order-280','1','1000','调拨订单id'), +('mall4cloud-allot-order-281','1','1000','调拨订单id'), +('mall4cloud-allot-order-282','1','1000','调拨订单id'), +('mall4cloud-allot-order-283','1','1000','调拨订单id'), +('mall4cloud-allot-order-284','1','1000','调拨订单id'), +('mall4cloud-allot-order-285','1','1000','调拨订单id'), +('mall4cloud-allot-order-286','1','1000','调拨订单id'), +('mall4cloud-allot-order-287','1','1000','调拨订单id'), +('mall4cloud-allot-order-288','1','1000','调拨订单id'), +('mall4cloud-allot-order-289','1','1000','调拨订单id'), +('mall4cloud-allot-order-290','1','1000','调拨订单id'), +('mall4cloud-allot-order-291','1','1000','调拨订单id'), +('mall4cloud-allot-order-292','1','1000','调拨订单id'), +('mall4cloud-allot-order-293','1','1000','调拨订单id'), +('mall4cloud-allot-order-294','1','1000','调拨订单id'), +('mall4cloud-allot-order-295','1','1000','调拨订单id'), +('mall4cloud-allot-order-296','1','1000','调拨订单id'), +('mall4cloud-allot-order-297','1','1000','调拨订单id'), +('mall4cloud-allot-order-298','1','1000','调拨订单id'), +('mall4cloud-allot-order-299','1','1000','调拨订单id'), +('mall4cloud-allot-order-300','1','1000','调拨订单id'), +('mall4cloud-allot-order-301','1','1000','调拨订单id'), +('mall4cloud-allot-order-302','1','1000','调拨订单id'), +('mall4cloud-allot-order-303','1','1000','调拨订单id'), +('mall4cloud-allot-order-304','1','1000','调拨订单id'), +('mall4cloud-allot-order-305','1','1000','调拨订单id'), +('mall4cloud-allot-order-306','1','1000','调拨订单id'), +('mall4cloud-allot-order-307','1','1000','调拨订单id'), +('mall4cloud-allot-order-308','1','1000','调拨订单id'), +('mall4cloud-allot-order-309','1','1000','调拨订单id'), +('mall4cloud-allot-order-310','1','1000','调拨订单id'), +('mall4cloud-allot-order-311','1','1000','调拨订单id'), +('mall4cloud-allot-order-312','1','1000','调拨订单id'), +('mall4cloud-allot-order-313','1','1000','调拨订单id'), +('mall4cloud-allot-order-314','1','1000','调拨订单id'), +('mall4cloud-allot-order-315','1','1000','调拨订单id'), +('mall4cloud-allot-order-316','1','1000','调拨订单id'), +('mall4cloud-allot-order-317','1','1000','调拨订单id'), +('mall4cloud-allot-order-318','1','1000','调拨订单id'), +('mall4cloud-allot-order-319','1','1000','调拨订单id'), +('mall4cloud-allot-order-320','1','1000','调拨订单id'), +('mall4cloud-allot-order-321','1','1000','调拨订单id'), +('mall4cloud-allot-order-322','1','1000','调拨订单id'), +('mall4cloud-allot-order-323','1','1000','调拨订单id'), +('mall4cloud-allot-order-324','1','1000','调拨订单id'), +('mall4cloud-allot-order-325','1','1000','调拨订单id'), +('mall4cloud-allot-order-326','1','1000','调拨订单id'), +('mall4cloud-allot-order-327','1','1000','调拨订单id'), +('mall4cloud-allot-order-328','1','1000','调拨订单id'), +('mall4cloud-allot-order-329','1','1000','调拨订单id'), +('mall4cloud-allot-order-330','1','1000','调拨订单id'), +('mall4cloud-allot-order-331','1','1000','调拨订单id'), +('mall4cloud-allot-order-332','1','1000','调拨订单id'), +('mall4cloud-allot-order-333','1','1000','调拨订单id'), +('mall4cloud-allot-order-334','1','1000','调拨订单id'), +('mall4cloud-allot-order-335','1','1000','调拨订单id'), +('mall4cloud-allot-order-336','1','1000','调拨订单id'), +('mall4cloud-allot-order-337','1','1000','调拨订单id'), +('mall4cloud-allot-order-338','1','1000','调拨订单id'), +('mall4cloud-allot-order-339','1','1000','调拨订单id'), +('mall4cloud-allot-order-340','1','1000','调拨订单id'), +('mall4cloud-allot-order-341','1','1000','调拨订单id'), +('mall4cloud-allot-order-342','1','1000','调拨订单id'), +('mall4cloud-allot-order-343','1','1000','调拨订单id'), +('mall4cloud-allot-order-344','1','1000','调拨订单id'), +('mall4cloud-allot-order-345','1','1000','调拨订单id'), +('mall4cloud-allot-order-346','1','1000','调拨订单id'), +('mall4cloud-allot-order-347','1','1000','调拨订单id'), +('mall4cloud-allot-order-348','1','1000','调拨订单id'), +('mall4cloud-allot-order-349','1','1000','调拨订单id'), +('mall4cloud-allot-order-350','1','1000','调拨订单id'), +('mall4cloud-allot-order-351','1','1000','调拨订单id'), +('mall4cloud-allot-order-352','1','1000','调拨订单id'), +('mall4cloud-allot-order-353','1','1000','调拨订单id'), +('mall4cloud-allot-order-354','1','1000','调拨订单id'), +('mall4cloud-allot-order-355','1','1000','调拨订单id'), +('mall4cloud-allot-order-356','1','1000','调拨订单id'), +('mall4cloud-allot-order-357','1','1000','调拨订单id'), +('mall4cloud-allot-order-358','1','1000','调拨订单id'), +('mall4cloud-allot-order-359','1','1000','调拨订单id'), +('mall4cloud-allot-order-360','1','1000','调拨订单id'), +('mall4cloud-allot-order-361','1','1000','调拨订单id'), +('mall4cloud-allot-order-362','1','1000','调拨订单id'), +('mall4cloud-allot-order-363','1','1000','调拨订单id'), +('mall4cloud-allot-order-364','1','1000','调拨订单id'), +('mall4cloud-allot-order-365','1','1000','调拨订单id'), +('mall4cloud-allot-order-366','1','1000','调拨订单id'), +('mall4cloud-allot-order-367','1','1000','调拨订单id'), +('mall4cloud-allot-order-368','1','1000','调拨订单id'), +('mall4cloud-allot-order-369','1','1000','调拨订单id'), +('mall4cloud-allot-order-370','1','1000','调拨订单id'), +('mall4cloud-allot-order-371','1','1000','调拨订单id'), +('mall4cloud-allot-order-372','1','1000','调拨订单id'), +('mall4cloud-allot-order-373','1','1000','调拨订单id'), +('mall4cloud-allot-order-374','1','1000','调拨订单id'), +('mall4cloud-allot-order-375','1','1000','调拨订单id'), +('mall4cloud-allot-order-376','1','1000','调拨订单id'), +('mall4cloud-allot-order-377','1','1000','调拨订单id'), +('mall4cloud-allot-order-378','1','1000','调拨订单id'), +('mall4cloud-allot-order-379','1','1000','调拨订单id'), +('mall4cloud-allot-order-380','1','1000','调拨订单id'), +('mall4cloud-allot-order-381','1','1000','调拨订单id'), +('mall4cloud-allot-order-382','1','1000','调拨订单id'), +('mall4cloud-allot-order-383','1','1000','调拨订单id'), +('mall4cloud-allot-order-384','1','1000','调拨订单id'), +('mall4cloud-allot-order-385','1','1000','调拨订单id'), +('mall4cloud-allot-order-386','1','1000','调拨订单id'), +('mall4cloud-allot-order-387','1','1000','调拨订单id'), +('mall4cloud-allot-order-388','1','1000','调拨订单id'), +('mall4cloud-allot-order-389','1','1000','调拨订单id'), +('mall4cloud-allot-order-390','1','1000','调拨订单id'), +('mall4cloud-allot-order-391','1','1000','调拨订单id'), +('mall4cloud-allot-order-392','1','1000','调拨订单id'), +('mall4cloud-allot-order-393','1','1000','调拨订单id'), +('mall4cloud-allot-order-394','1','1000','调拨订单id'), +('mall4cloud-allot-order-395','1','1000','调拨订单id'), +('mall4cloud-allot-order-396','1','1000','调拨订单id'), +('mall4cloud-allot-order-397','1','1000','调拨订单id'), +('mall4cloud-allot-order-398','1','1000','调拨订单id'), +('mall4cloud-allot-order-399','1','1000','调拨订单id'), +('mall4cloud-allot-order-400','1','1000','调拨订单id'), +('mall4cloud-allot-order-401','1','1000','调拨订单id'), +('mall4cloud-allot-order-402','1','1000','调拨订单id'), +('mall4cloud-allot-order-403','1','1000','调拨订单id'), +('mall4cloud-allot-order-404','1','1000','调拨订单id'), +('mall4cloud-allot-order-405','1','1000','调拨订单id'), +('mall4cloud-allot-order-406','1','1000','调拨订单id'), +('mall4cloud-allot-order-407','1','1000','调拨订单id'), +('mall4cloud-allot-order-408','1','1000','调拨订单id'), +('mall4cloud-allot-order-409','1','1000','调拨订单id'), +('mall4cloud-allot-order-410','1','1000','调拨订单id'), +('mall4cloud-allot-order-411','1','1000','调拨订单id'), +('mall4cloud-allot-order-412','1','1000','调拨订单id'), +('mall4cloud-allot-order-413','1','1000','调拨订单id'), +('mall4cloud-allot-order-414','1','1000','调拨订单id'), +('mall4cloud-allot-order-415','1','1000','调拨订单id'), +('mall4cloud-allot-order-416','1','1000','调拨订单id'), +('mall4cloud-allot-order-417','1','1000','调拨订单id'), +('mall4cloud-allot-order-418','1','1000','调拨订单id'), +('mall4cloud-allot-order-419','1','1000','调拨订单id'), +('mall4cloud-allot-order-420','1','1000','调拨订单id'), +('mall4cloud-allot-order-421','1','1000','调拨订单id'), +('mall4cloud-allot-order-422','1','1000','调拨订单id'), +('mall4cloud-allot-order-423','1','1000','调拨订单id'), +('mall4cloud-allot-order-424','1','1000','调拨订单id'), +('mall4cloud-allot-order-425','1','1000','调拨订单id'), +('mall4cloud-allot-order-426','1','1000','调拨订单id'), +('mall4cloud-allot-order-427','1','1000','调拨订单id'), +('mall4cloud-allot-order-428','1','1000','调拨订单id'), +('mall4cloud-allot-order-429','1','1000','调拨订单id'), +('mall4cloud-allot-order-430','1','1000','调拨订单id'), +('mall4cloud-allot-order-431','1','1000','调拨订单id'), +('mall4cloud-allot-order-432','1','1000','调拨订单id'), +('mall4cloud-allot-order-433','1','1000','调拨订单id'), +('mall4cloud-allot-order-434','1','1000','调拨订单id'), +('mall4cloud-allot-order-435','1','1000','调拨订单id'), +('mall4cloud-allot-order-436','1','1000','调拨订单id'), +('mall4cloud-allot-order-437','1','1000','调拨订单id'), +('mall4cloud-allot-order-438','1','1000','调拨订单id'), +('mall4cloud-allot-order-439','1','1000','调拨订单id'), +('mall4cloud-allot-order-440','1','1000','调拨订单id'), +('mall4cloud-allot-order-441','1','1000','调拨订单id'), +('mall4cloud-allot-order-442','1','1000','调拨订单id'), +('mall4cloud-allot-order-443','1','1000','调拨订单id'), +('mall4cloud-allot-order-444','1','1000','调拨订单id'), +('mall4cloud-allot-order-445','1','1000','调拨订单id'), +('mall4cloud-allot-order-446','1','1000','调拨订单id'), +('mall4cloud-allot-order-447','1','1000','调拨订单id'), +('mall4cloud-allot-order-448','1','1000','调拨订单id'), +('mall4cloud-allot-order-449','1','1000','调拨订单id'), +('mall4cloud-allot-order-450','1','1000','调拨订单id'), +('mall4cloud-allot-order-451','1','1000','调拨订单id'), +('mall4cloud-allot-order-452','1','1000','调拨订单id'), +('mall4cloud-allot-order-453','1','1000','调拨订单id'), +('mall4cloud-allot-order-454','1','1000','调拨订单id'), +('mall4cloud-allot-order-455','1','1000','调拨订单id'), +('mall4cloud-allot-order-456','1','1000','调拨订单id'), +('mall4cloud-allot-order-457','1','1000','调拨订单id'), +('mall4cloud-allot-order-458','1','1000','调拨订单id'), +('mall4cloud-allot-order-459','1','1000','调拨订单id'), +('mall4cloud-allot-order-460','1','1000','调拨订单id'), +('mall4cloud-allot-order-461','1','1000','调拨订单id'), +('mall4cloud-allot-order-462','1','1000','调拨订单id'), +('mall4cloud-allot-order-463','1','1000','调拨订单id'), +('mall4cloud-allot-order-464','1','1000','调拨订单id'), +('mall4cloud-allot-order-465','1','1000','调拨订单id'), +('mall4cloud-allot-order-466','1','1000','调拨订单id'), +('mall4cloud-allot-order-467','1','1000','调拨订单id'), +('mall4cloud-allot-order-468','1','1000','调拨订单id'), +('mall4cloud-allot-order-469','1','1000','调拨订单id'), +('mall4cloud-allot-order-470','1','1000','调拨订单id'), +('mall4cloud-allot-order-471','1','1000','调拨订单id'), +('mall4cloud-allot-order-472','1','1000','调拨订单id'), +('mall4cloud-allot-order-473','1','1000','调拨订单id'), +('mall4cloud-allot-order-474','1','1000','调拨订单id'), +('mall4cloud-allot-order-475','1','1000','调拨订单id'), +('mall4cloud-allot-order-476','1','1000','调拨订单id'), +('mall4cloud-allot-order-477','1','1000','调拨订单id'), +('mall4cloud-allot-order-478','1','1000','调拨订单id'), +('mall4cloud-allot-order-479','1','1000','调拨订单id'), +('mall4cloud-allot-order-480','1','1000','调拨订单id'), +('mall4cloud-allot-order-481','1','1000','调拨订单id'), +('mall4cloud-allot-order-482','1','1000','调拨订单id'), +('mall4cloud-allot-order-483','1','1000','调拨订单id'), +('mall4cloud-allot-order-484','1','1000','调拨订单id'), +('mall4cloud-allot-order-485','1','1000','调拨订单id'), +('mall4cloud-allot-order-486','1','1000','调拨订单id'), +('mall4cloud-allot-order-487','1','1000','调拨订单id'), +('mall4cloud-allot-order-488','1','1000','调拨订单id'), +('mall4cloud-allot-order-489','1','1000','调拨订单id'), +('mall4cloud-allot-order-490','1','1000','调拨订单id'), +('mall4cloud-allot-order-491','1','1000','调拨订单id'), +('mall4cloud-allot-order-492','1','1000','调拨订单id'), +('mall4cloud-allot-order-493','1','1000','调拨订单id'), +('mall4cloud-allot-order-494','1','1000','调拨订单id'), +('mall4cloud-allot-order-495','1','1000','调拨订单id'), +('mall4cloud-allot-order-496','1','1000','调拨订单id'), +('mall4cloud-allot-order-497','1','1000','调拨订单id'), +('mall4cloud-allot-order-498','1','1000','调拨订单id'), +('mall4cloud-allot-order-499','1','1000','调拨订单id'), +('mall4cloud-allot-order-500','1','1000','调拨订单id'), +('mall4cloud-allot-order-501','1','1000','调拨订单id'), +('mall4cloud-allot-order-502','1','1000','调拨订单id'), +('mall4cloud-allot-order-503','1','1000','调拨订单id'), +('mall4cloud-allot-order-504','1','1000','调拨订单id'), +('mall4cloud-allot-order-505','1','1000','调拨订单id'), +('mall4cloud-allot-order-506','1','1000','调拨订单id'), +('mall4cloud-allot-order-507','1','1000','调拨订单id'), +('mall4cloud-allot-order-508','1','1000','调拨订单id'), +('mall4cloud-allot-order-509','1','1000','调拨订单id'), +('mall4cloud-allot-order-510','1','1000','调拨订单id'), +('mall4cloud-allot-order-511','1','1000','调拨订单id'), +('mall4cloud-allot-order-512','1','1000','调拨订单id'), +('mall4cloud-allot-order-513','1','1000','调拨订单id'), +('mall4cloud-allot-order-514','1','1000','调拨订单id'), +('mall4cloud-allot-order-515','1','1000','调拨订单id'), +('mall4cloud-allot-order-516','1','1000','调拨订单id'), +('mall4cloud-allot-order-517','1','1000','调拨订单id'), +('mall4cloud-allot-order-518','1','1000','调拨订单id'), +('mall4cloud-allot-order-519','1','1000','调拨订单id'), +('mall4cloud-allot-order-520','1','1000','调拨订单id'), +('mall4cloud-allot-order-521','1','1000','调拨订单id'), +('mall4cloud-allot-order-522','1','1000','调拨订单id'), +('mall4cloud-allot-order-523','1','1000','调拨订单id'), +('mall4cloud-allot-order-524','1','1000','调拨订单id'), +('mall4cloud-allot-order-525','1','1000','调拨订单id'), +('mall4cloud-allot-order-526','1','1000','调拨订单id'), +('mall4cloud-allot-order-527','1','1000','调拨订单id'), +('mall4cloud-allot-order-528','1','1000','调拨订单id'), +('mall4cloud-allot-order-529','1','1000','调拨订单id'), +('mall4cloud-allot-order-530','1','1000','调拨订单id'), +('mall4cloud-allot-order-531','1','1000','调拨订单id'), +('mall4cloud-allot-order-532','1','1000','调拨订单id'), +('mall4cloud-allot-order-533','1','1000','调拨订单id'), +('mall4cloud-allot-order-534','1','1000','调拨订单id'), +('mall4cloud-allot-order-535','1','1000','调拨订单id'), +('mall4cloud-allot-order-536','1','1000','调拨订单id'), +('mall4cloud-allot-order-537','1','1000','调拨订单id'), +('mall4cloud-allot-order-538','1','1000','调拨订单id'), +('mall4cloud-allot-order-539','1','1000','调拨订单id'), +('mall4cloud-allot-order-540','1','1000','调拨订单id'), +('mall4cloud-allot-order-541','1','1000','调拨订单id'), +('mall4cloud-allot-order-542','1','1000','调拨订单id'), +('mall4cloud-allot-order-543','1','1000','调拨订单id'), +('mall4cloud-allot-order-544','1','1000','调拨订单id'), +('mall4cloud-allot-order-545','1','1000','调拨订单id'), +('mall4cloud-allot-order-546','1','1000','调拨订单id'), +('mall4cloud-allot-order-547','1','1000','调拨订单id'), +('mall4cloud-allot-order-548','1','1000','调拨订单id'), +('mall4cloud-allot-order-549','1','1000','调拨订单id'), +('mall4cloud-allot-order-550','1','1000','调拨订单id'), +('mall4cloud-allot-order-551','1','1000','调拨订单id'), +('mall4cloud-allot-order-552','1','1000','调拨订单id'), +('mall4cloud-allot-order-553','1','1000','调拨订单id'), +('mall4cloud-allot-order-554','1','1000','调拨订单id'), +('mall4cloud-allot-order-555','1','1000','调拨订单id'), +('mall4cloud-allot-order-556','1','1000','调拨订单id'), +('mall4cloud-allot-order-557','1','1000','调拨订单id'), +('mall4cloud-allot-order-558','1','1000','调拨订单id'), +('mall4cloud-allot-order-559','1','1000','调拨订单id'), +('mall4cloud-allot-order-560','1','1000','调拨订单id'), +('mall4cloud-allot-order-561','1','1000','调拨订单id'), +('mall4cloud-allot-order-562','1','1000','调拨订单id'), +('mall4cloud-allot-order-563','1','1000','调拨订单id'), +('mall4cloud-allot-order-564','1','1000','调拨订单id'), +('mall4cloud-allot-order-565','1','1000','调拨订单id'), +('mall4cloud-allot-order-566','1','1000','调拨订单id'), +('mall4cloud-allot-order-567','1','1000','调拨订单id'), +('mall4cloud-allot-order-568','1','1000','调拨订单id'), +('mall4cloud-allot-order-569','1','1000','调拨订单id'), +('mall4cloud-allot-order-570','1','1000','调拨订单id'), +('mall4cloud-allot-order-571','1','1000','调拨订单id'), +('mall4cloud-allot-order-572','1','1000','调拨订单id'), +('mall4cloud-allot-order-573','1','1000','调拨订单id'), +('mall4cloud-allot-order-574','1','1000','调拨订单id'), +('mall4cloud-allot-order-575','1','1000','调拨订单id'), +('mall4cloud-allot-order-576','1','1000','调拨订单id'), +('mall4cloud-allot-order-577','1','1000','调拨订单id'), +('mall4cloud-allot-order-578','1','1000','调拨订单id'), +('mall4cloud-allot-order-579','1','1000','调拨订单id'), +('mall4cloud-allot-order-580','1','1000','调拨订单id'), +('mall4cloud-allot-order-581','1','1000','调拨订单id'), +('mall4cloud-allot-order-582','1','1000','调拨订单id'), +('mall4cloud-allot-order-583','1','1000','调拨订单id'), +('mall4cloud-allot-order-584','1','1000','调拨订单id'), +('mall4cloud-allot-order-585','1','1000','调拨订单id'), +('mall4cloud-allot-order-586','1','1000','调拨订单id'), +('mall4cloud-allot-order-587','1','1000','调拨订单id'), +('mall4cloud-allot-order-588','1','1000','调拨订单id'), +('mall4cloud-allot-order-589','1','1000','调拨订单id'), +('mall4cloud-allot-order-590','1','1000','调拨订单id'), +('mall4cloud-allot-order-591','1','1000','调拨订单id'), +('mall4cloud-allot-order-592','1','1000','调拨订单id'), +('mall4cloud-allot-order-593','1','1000','调拨订单id'), +('mall4cloud-allot-order-594','1','1000','调拨订单id'), +('mall4cloud-allot-order-595','1','1000','调拨订单id'), +('mall4cloud-allot-order-596','1','1000','调拨订单id'), +('mall4cloud-allot-order-597','1','1000','调拨订单id'), +('mall4cloud-allot-order-598','1','1000','调拨订单id'), +('mall4cloud-allot-order-599','1','1000','调拨订单id'), +('mall4cloud-allot-order-600','1','1000','调拨订单id'), +('mall4cloud-allot-order-601','1','1000','调拨订单id'), +('mall4cloud-allot-order-602','1','1000','调拨订单id'), +('mall4cloud-allot-order-603','1','1000','调拨订单id'), +('mall4cloud-allot-order-604','1','1000','调拨订单id'), +('mall4cloud-allot-order-605','1','1000','调拨订单id'), +('mall4cloud-allot-order-606','1','1000','调拨订单id'), +('mall4cloud-allot-order-607','1','1000','调拨订单id'), +('mall4cloud-allot-order-608','1','1000','调拨订单id'), +('mall4cloud-allot-order-609','1','1000','调拨订单id'), +('mall4cloud-allot-order-610','1','1000','调拨订单id'), +('mall4cloud-allot-order-611','1','1000','调拨订单id'), +('mall4cloud-allot-order-612','1','1000','调拨订单id'), +('mall4cloud-allot-order-613','1','1000','调拨订单id'), +('mall4cloud-allot-order-614','1','1000','调拨订单id'), +('mall4cloud-allot-order-615','1','1000','调拨订单id'), +('mall4cloud-allot-order-616','1','1000','调拨订单id'), +('mall4cloud-allot-order-617','1','1000','调拨订单id'), +('mall4cloud-allot-order-618','1','1000','调拨订单id'), +('mall4cloud-allot-order-619','1','1000','调拨订单id'), +('mall4cloud-allot-order-620','1','1000','调拨订单id'), +('mall4cloud-allot-order-621','1','1000','调拨订单id'), +('mall4cloud-allot-order-622','1','1000','调拨订单id'), +('mall4cloud-allot-order-623','1','1000','调拨订单id'), +('mall4cloud-allot-order-624','1','1000','调拨订单id'), +('mall4cloud-allot-order-625','1','1000','调拨订单id'), +('mall4cloud-allot-order-626','1','1000','调拨订单id'), +('mall4cloud-allot-order-627','1','1000','调拨订单id'), +('mall4cloud-allot-order-628','1','1000','调拨订单id'), +('mall4cloud-allot-order-629','1','1000','调拨订单id'), +('mall4cloud-allot-order-630','1','1000','调拨订单id'), +('mall4cloud-allot-order-631','1','1000','调拨订单id'), +('mall4cloud-allot-order-632','1','1000','调拨订单id'), +('mall4cloud-allot-order-633','1','1000','调拨订单id'), +('mall4cloud-allot-order-634','1','1000','调拨订单id'), +('mall4cloud-allot-order-635','1','1000','调拨订单id'), +('mall4cloud-allot-order-636','1','1000','调拨订单id'), +('mall4cloud-allot-order-637','1','1000','调拨订单id'), +('mall4cloud-allot-order-638','1','1000','调拨订单id'), +('mall4cloud-allot-order-639','1','1000','调拨订单id'), +('mall4cloud-allot-order-640','1','1000','调拨订单id'), +('mall4cloud-allot-order-641','1','1000','调拨订单id'), +('mall4cloud-allot-order-642','1','1000','调拨订单id'), +('mall4cloud-allot-order-643','1','1000','调拨订单id'), +('mall4cloud-allot-order-644','1','1000','调拨订单id'), +('mall4cloud-allot-order-645','1','1000','调拨订单id'), +('mall4cloud-allot-order-646','1','1000','调拨订单id'), +('mall4cloud-allot-order-647','1','1000','调拨订单id'), +('mall4cloud-allot-order-648','1','1000','调拨订单id'), +('mall4cloud-allot-order-649','1','1000','调拨订单id'), +('mall4cloud-allot-order-650','1','1000','调拨订单id'), +('mall4cloud-allot-order-651','1','1000','调拨订单id'), +('mall4cloud-allot-order-652','1','1000','调拨订单id'), +('mall4cloud-allot-order-653','1','1000','调拨订单id'), +('mall4cloud-allot-order-654','1','1000','调拨订单id'), +('mall4cloud-allot-order-655','1','1000','调拨订单id'), +('mall4cloud-allot-order-656','1','1000','调拨订单id'), +('mall4cloud-allot-order-657','1','1000','调拨订单id'), +('mall4cloud-allot-order-658','1','1000','调拨订单id'), +('mall4cloud-allot-order-659','1','1000','调拨订单id'), +('mall4cloud-allot-order-660','1','1000','调拨订单id'), +('mall4cloud-allot-order-661','1','1000','调拨订单id'), +('mall4cloud-allot-order-662','1','1000','调拨订单id'), +('mall4cloud-allot-order-663','1','1000','调拨订单id'), +('mall4cloud-allot-order-664','1','1000','调拨订单id'), +('mall4cloud-allot-order-665','1','1000','调拨订单id'), +('mall4cloud-allot-order-666','1','1000','调拨订单id'), +('mall4cloud-allot-order-667','1','1000','调拨订单id'), +('mall4cloud-allot-order-668','1','1000','调拨订单id'), +('mall4cloud-allot-order-669','1','1000','调拨订单id'), +('mall4cloud-allot-order-670','1','1000','调拨订单id'), +('mall4cloud-allot-order-671','1','1000','调拨订单id'), +('mall4cloud-allot-order-672','1','1000','调拨订单id'), +('mall4cloud-allot-order-673','1','1000','调拨订单id'), +('mall4cloud-allot-order-674','1','1000','调拨订单id'), +('mall4cloud-allot-order-675','1','1000','调拨订单id'), +('mall4cloud-allot-order-676','1','1000','调拨订单id'), +('mall4cloud-allot-order-677','1','1000','调拨订单id'), +('mall4cloud-allot-order-678','1','1000','调拨订单id'), +('mall4cloud-allot-order-679','1','1000','调拨订单id'), +('mall4cloud-allot-order-680','1','1000','调拨订单id'), +('mall4cloud-allot-order-681','1','1000','调拨订单id'), +('mall4cloud-allot-order-682','1','1000','调拨订单id'), +('mall4cloud-allot-order-683','1','1000','调拨订单id'), +('mall4cloud-allot-order-684','1','1000','调拨订单id'), +('mall4cloud-allot-order-685','1','1000','调拨订单id'), +('mall4cloud-allot-order-686','1','1000','调拨订单id'), +('mall4cloud-allot-order-687','1','1000','调拨订单id'), +('mall4cloud-allot-order-688','1','1000','调拨订单id'), +('mall4cloud-allot-order-689','1','1000','调拨订单id'), +('mall4cloud-allot-order-690','1','1000','调拨订单id'), +('mall4cloud-allot-order-691','1','1000','调拨订单id'), +('mall4cloud-allot-order-692','1','1000','调拨订单id'), +('mall4cloud-allot-order-693','1','1000','调拨订单id'), +('mall4cloud-allot-order-694','1','1000','调拨订单id'), +('mall4cloud-allot-order-695','1','1000','调拨订单id'), +('mall4cloud-allot-order-696','1','1000','调拨订单id'), +('mall4cloud-allot-order-697','1','1000','调拨订单id'), +('mall4cloud-allot-order-698','1','1000','调拨订单id'), +('mall4cloud-allot-order-699','1','1000','调拨订单id'), +('mall4cloud-allot-order-700','1','1000','调拨订单id'), +('mall4cloud-allot-order-701','1','1000','调拨订单id'), +('mall4cloud-allot-order-702','1','1000','调拨订单id'), +('mall4cloud-allot-order-703','1','1000','调拨订单id'), +('mall4cloud-allot-order-704','1','1000','调拨订单id'), +('mall4cloud-allot-order-705','1','1000','调拨订单id'), +('mall4cloud-allot-order-706','1','1000','调拨订单id'), +('mall4cloud-allot-order-707','1','1000','调拨订单id'), +('mall4cloud-allot-order-708','1','1000','调拨订单id'), +('mall4cloud-allot-order-709','1','1000','调拨订单id'), +('mall4cloud-allot-order-710','1','1000','调拨订单id'), +('mall4cloud-allot-order-711','1','1000','调拨订单id'), +('mall4cloud-allot-order-712','1','1000','调拨订单id'), +('mall4cloud-allot-order-713','1','1000','调拨订单id'), +('mall4cloud-allot-order-714','1','1000','调拨订单id'), +('mall4cloud-allot-order-715','1','1000','调拨订单id'), +('mall4cloud-allot-order-716','1','1000','调拨订单id'), +('mall4cloud-allot-order-717','1','1000','调拨订单id'), +('mall4cloud-allot-order-718','1','1000','调拨订单id'), +('mall4cloud-allot-order-719','1','1000','调拨订单id'), +('mall4cloud-allot-order-720','1','1000','调拨订单id'), +('mall4cloud-allot-order-721','1','1000','调拨订单id'), +('mall4cloud-allot-order-722','1','1000','调拨订单id'), +('mall4cloud-allot-order-723','1','1000','调拨订单id'), +('mall4cloud-allot-order-724','1','1000','调拨订单id'), +('mall4cloud-allot-order-725','1','1000','调拨订单id'), +('mall4cloud-allot-order-726','1','1000','调拨订单id'), +('mall4cloud-allot-order-727','1','1000','调拨订单id'), +('mall4cloud-allot-order-728','1','1000','调拨订单id'), +('mall4cloud-allot-order-729','1','1000','调拨订单id'), +('mall4cloud-allot-order-730','1','1000','调拨订单id'), +('mall4cloud-allot-order-731','1','1000','调拨订单id'), +('mall4cloud-allot-order-732','1','1000','调拨订单id'), +('mall4cloud-allot-order-733','1','1000','调拨订单id'), +('mall4cloud-allot-order-734','1','1000','调拨订单id'), +('mall4cloud-allot-order-735','1','1000','调拨订单id'), +('mall4cloud-allot-order-736','1','1000','调拨订单id'), +('mall4cloud-allot-order-737','1','1000','调拨订单id'), +('mall4cloud-allot-order-738','1','1000','调拨订单id'), +('mall4cloud-allot-order-739','1','1000','调拨订单id'), +('mall4cloud-allot-order-740','1','1000','调拨订单id'), +('mall4cloud-allot-order-741','1','1000','调拨订单id'), +('mall4cloud-allot-order-742','1','1000','调拨订单id'), +('mall4cloud-allot-order-743','1','1000','调拨订单id'), +('mall4cloud-allot-order-744','1','1000','调拨订单id'), +('mall4cloud-allot-order-745','1','1000','调拨订单id'), +('mall4cloud-allot-order-746','1','1000','调拨订单id'), +('mall4cloud-allot-order-747','1','1000','调拨订单id'), +('mall4cloud-allot-order-748','1','1000','调拨订单id'), +('mall4cloud-allot-order-749','1','1000','调拨订单id'), +('mall4cloud-allot-order-750','1','1000','调拨订单id'), +('mall4cloud-allot-order-751','1','1000','调拨订单id'), +('mall4cloud-allot-order-752','1','1000','调拨订单id'), +('mall4cloud-allot-order-753','1','1000','调拨订单id'), +('mall4cloud-allot-order-754','1','1000','调拨订单id'), +('mall4cloud-allot-order-755','1','1000','调拨订单id'), +('mall4cloud-allot-order-756','1','1000','调拨订单id'), +('mall4cloud-allot-order-757','1','1000','调拨订单id'), +('mall4cloud-allot-order-758','1','1000','调拨订单id'), +('mall4cloud-allot-order-759','1','1000','调拨订单id'), +('mall4cloud-allot-order-760','1','1000','调拨订单id'), +('mall4cloud-allot-order-761','1','1000','调拨订单id'), +('mall4cloud-allot-order-762','1','1000','调拨订单id'), +('mall4cloud-allot-order-763','1','1000','调拨订单id'), +('mall4cloud-allot-order-764','1','1000','调拨订单id'), +('mall4cloud-allot-order-765','1','1000','调拨订单id'), +('mall4cloud-allot-order-766','1','1000','调拨订单id'), +('mall4cloud-allot-order-767','1','1000','调拨订单id'), +('mall4cloud-allot-order-768','1','1000','调拨订单id'), +('mall4cloud-allot-order-769','1','1000','调拨订单id'), +('mall4cloud-allot-order-770','1','1000','调拨订单id'), +('mall4cloud-allot-order-771','1','1000','调拨订单id'), +('mall4cloud-allot-order-772','1','1000','调拨订单id'), +('mall4cloud-allot-order-773','1','1000','调拨订单id'), +('mall4cloud-allot-order-774','1','1000','调拨订单id'), +('mall4cloud-allot-order-775','1','1000','调拨订单id'), +('mall4cloud-allot-order-776','1','1000','调拨订单id'), +('mall4cloud-allot-order-777','1','1000','调拨订单id'), +('mall4cloud-allot-order-778','1','1000','调拨订单id'), +('mall4cloud-allot-order-779','1','1000','调拨订单id'), +('mall4cloud-allot-order-780','1','1000','调拨订单id'), +('mall4cloud-allot-order-781','1','1000','调拨订单id'), +('mall4cloud-allot-order-782','1','1000','调拨订单id'), +('mall4cloud-allot-order-783','1','1000','调拨订单id'), +('mall4cloud-allot-order-784','1','1000','调拨订单id'), +('mall4cloud-allot-order-785','1','1000','调拨订单id'), +('mall4cloud-allot-order-786','1','1000','调拨订单id'), +('mall4cloud-allot-order-787','1','1000','调拨订单id'), +('mall4cloud-allot-order-788','1','1000','调拨订单id'), +('mall4cloud-allot-order-789','1','1000','调拨订单id'), +('mall4cloud-allot-order-790','1','1000','调拨订单id'), +('mall4cloud-allot-order-791','1','1000','调拨订单id'), +('mall4cloud-allot-order-792','1','1000','调拨订单id'), +('mall4cloud-allot-order-793','1','1000','调拨订单id'), +('mall4cloud-allot-order-794','1','1000','调拨订单id'), +('mall4cloud-allot-order-795','1','1000','调拨订单id'), +('mall4cloud-allot-order-796','1','1000','调拨订单id'), +('mall4cloud-allot-order-797','1','1000','调拨订单id'), +('mall4cloud-allot-order-798','1','1000','调拨订单id'), +('mall4cloud-allot-order-799','1','1000','调拨订单id'), +('mall4cloud-allot-order-800','1','1000','调拨订单id'), +('mall4cloud-allot-order-801','1','1000','调拨订单id'), +('mall4cloud-allot-order-802','1','1000','调拨订单id'), +('mall4cloud-allot-order-803','1','1000','调拨订单id'), +('mall4cloud-allot-order-804','1','1000','调拨订单id'), +('mall4cloud-allot-order-805','1','1000','调拨订单id'), +('mall4cloud-allot-order-806','1','1000','调拨订单id'), +('mall4cloud-allot-order-807','1','1000','调拨订单id'), +('mall4cloud-allot-order-808','1','1000','调拨订单id'), +('mall4cloud-allot-order-809','1','1000','调拨订单id'), +('mall4cloud-allot-order-810','1','1000','调拨订单id'), +('mall4cloud-allot-order-811','1','1000','调拨订单id'), +('mall4cloud-allot-order-812','1','1000','调拨订单id'), +('mall4cloud-allot-order-813','1','1000','调拨订单id'), +('mall4cloud-allot-order-814','1','1000','调拨订单id'), +('mall4cloud-allot-order-815','1','1000','调拨订单id'), +('mall4cloud-allot-order-816','1','1000','调拨订单id'), +('mall4cloud-allot-order-817','1','1000','调拨订单id'), +('mall4cloud-allot-order-818','1','1000','调拨订单id'), +('mall4cloud-allot-order-819','1','1000','调拨订单id'), +('mall4cloud-allot-order-820','1','1000','调拨订单id'), +('mall4cloud-allot-order-821','1','1000','调拨订单id'), +('mall4cloud-allot-order-822','1','1000','调拨订单id'), +('mall4cloud-allot-order-823','1','1000','调拨订单id'), +('mall4cloud-allot-order-824','1','1000','调拨订单id'), +('mall4cloud-allot-order-825','1','1000','调拨订单id'), +('mall4cloud-allot-order-826','1','1000','调拨订单id'), +('mall4cloud-allot-order-827','1','1000','调拨订单id'), +('mall4cloud-allot-order-828','1','1000','调拨订单id'), +('mall4cloud-allot-order-829','1','1000','调拨订单id'), +('mall4cloud-allot-order-830','1','1000','调拨订单id'), +('mall4cloud-allot-order-831','1','1000','调拨订单id'), +('mall4cloud-allot-order-832','1','1000','调拨订单id'), +('mall4cloud-allot-order-833','1','1000','调拨订单id'), +('mall4cloud-allot-order-834','1','1000','调拨订单id'), +('mall4cloud-allot-order-835','1','1000','调拨订单id'), +('mall4cloud-allot-order-836','1','1000','调拨订单id'), +('mall4cloud-allot-order-837','1','1000','调拨订单id'), +('mall4cloud-allot-order-838','1','1000','调拨订单id'), +('mall4cloud-allot-order-839','1','1000','调拨订单id'), +('mall4cloud-allot-order-840','1','1000','调拨订单id'), +('mall4cloud-allot-order-841','1','1000','调拨订单id'), +('mall4cloud-allot-order-842','1','1000','调拨订单id'), +('mall4cloud-allot-order-843','1','1000','调拨订单id'), +('mall4cloud-allot-order-844','1','1000','调拨订单id'), +('mall4cloud-allot-order-845','1','1000','调拨订单id'), +('mall4cloud-allot-order-846','1','1000','调拨订单id'), +('mall4cloud-allot-order-847','1','1000','调拨订单id'), +('mall4cloud-allot-order-848','1','1000','调拨订单id'), +('mall4cloud-allot-order-849','1','1000','调拨订单id'), +('mall4cloud-allot-order-850','1','1000','调拨订单id'), +('mall4cloud-allot-order-851','1','1000','调拨订单id'), +('mall4cloud-allot-order-852','1','1000','调拨订单id'), +('mall4cloud-allot-order-853','1','1000','调拨订单id'), +('mall4cloud-allot-order-854','1','1000','调拨订单id'), +('mall4cloud-allot-order-855','1','1000','调拨订单id'), +('mall4cloud-allot-order-856','1','1000','调拨订单id'), +('mall4cloud-allot-order-857','1','1000','调拨订单id'), +('mall4cloud-allot-order-858','1','1000','调拨订单id'), +('mall4cloud-allot-order-859','1','1000','调拨订单id'), +('mall4cloud-allot-order-860','1','1000','调拨订单id'), +('mall4cloud-allot-order-861','1','1000','调拨订单id'), +('mall4cloud-allot-order-862','1','1000','调拨订单id'), +('mall4cloud-allot-order-863','1','1000','调拨订单id'), +('mall4cloud-allot-order-864','1','1000','调拨订单id'), +('mall4cloud-allot-order-865','1','1000','调拨订单id'), +('mall4cloud-allot-order-866','1','1000','调拨订单id'), +('mall4cloud-allot-order-867','1','1000','调拨订单id'), +('mall4cloud-allot-order-868','1','1000','调拨订单id'), +('mall4cloud-allot-order-869','1','1000','调拨订单id'), +('mall4cloud-allot-order-870','1','1000','调拨订单id'), +('mall4cloud-allot-order-871','1','1000','调拨订单id'), +('mall4cloud-allot-order-872','1','1000','调拨订单id'), +('mall4cloud-allot-order-873','1','1000','调拨订单id'), +('mall4cloud-allot-order-874','1','1000','调拨订单id'), +('mall4cloud-allot-order-875','1','1000','调拨订单id'), +('mall4cloud-allot-order-876','1','1000','调拨订单id'), +('mall4cloud-allot-order-877','1','1000','调拨订单id'), +('mall4cloud-allot-order-878','1','1000','调拨订单id'), +('mall4cloud-allot-order-879','1','1000','调拨订单id'), +('mall4cloud-allot-order-880','1','1000','调拨订单id'), +('mall4cloud-allot-order-881','1','1000','调拨订单id'), +('mall4cloud-allot-order-882','1','1000','调拨订单id'), +('mall4cloud-allot-order-883','1','1000','调拨订单id'), +('mall4cloud-allot-order-884','1','1000','调拨订单id'), +('mall4cloud-allot-order-885','1','1000','调拨订单id'), +('mall4cloud-allot-order-886','1','1000','调拨订单id'), +('mall4cloud-allot-order-887','1','1000','调拨订单id'), +('mall4cloud-allot-order-888','1','1000','调拨订单id'), +('mall4cloud-allot-order-889','1','1000','调拨订单id'), +('mall4cloud-allot-order-890','1','1000','调拨订单id'), +('mall4cloud-allot-order-891','1','1000','调拨订单id'), +('mall4cloud-allot-order-892','1','1000','调拨订单id'), +('mall4cloud-allot-order-893','1','1000','调拨订单id'), +('mall4cloud-allot-order-894','1','1000','调拨订单id'), +('mall4cloud-allot-order-895','1','1000','调拨订单id'), +('mall4cloud-allot-order-896','1','1000','调拨订单id'), +('mall4cloud-allot-order-897','1','1000','调拨订单id'), +('mall4cloud-allot-order-898','1','1000','调拨订单id'), +('mall4cloud-allot-order-899','1','1000','调拨订单id'), +('mall4cloud-allot-order-900','1','1000','调拨订单id'), +('mall4cloud-allot-order-901','1','1000','调拨订单id'), +('mall4cloud-allot-order-902','1','1000','调拨订单id'), +('mall4cloud-allot-order-903','1','1000','调拨订单id'), +('mall4cloud-allot-order-904','1','1000','调拨订单id'), +('mall4cloud-allot-order-905','1','1000','调拨订单id'), +('mall4cloud-allot-order-906','1','1000','调拨订单id'), +('mall4cloud-allot-order-907','1','1000','调拨订单id'), +('mall4cloud-allot-order-908','1','1000','调拨订单id'), +('mall4cloud-allot-order-909','1','1000','调拨订单id'), +('mall4cloud-allot-order-910','1','1000','调拨订单id'), +('mall4cloud-allot-order-911','1','1000','调拨订单id'), +('mall4cloud-allot-order-912','1','1000','调拨订单id'), +('mall4cloud-allot-order-913','1','1000','调拨订单id'), +('mall4cloud-allot-order-914','1','1000','调拨订单id'), +('mall4cloud-allot-order-915','1','1000','调拨订单id'), +('mall4cloud-allot-order-916','1','1000','调拨订单id'), +('mall4cloud-allot-order-917','1','1000','调拨订单id'), +('mall4cloud-allot-order-918','1','1000','调拨订单id'), +('mall4cloud-allot-order-919','1','1000','调拨订单id'), +('mall4cloud-allot-order-920','1','1000','调拨订单id'), +('mall4cloud-allot-order-921','1','1000','调拨订单id'), +('mall4cloud-allot-order-922','1','1000','调拨订单id'), +('mall4cloud-allot-order-923','1','1000','调拨订单id'), +('mall4cloud-allot-order-924','1','1000','调拨订单id'), +('mall4cloud-allot-order-925','1','1000','调拨订单id'), +('mall4cloud-allot-order-926','1','1000','调拨订单id'), +('mall4cloud-allot-order-927','1','1000','调拨订单id'), +('mall4cloud-allot-order-928','1','1000','调拨订单id'), +('mall4cloud-allot-order-929','1','1000','调拨订单id'), +('mall4cloud-allot-order-930','1','1000','调拨订单id'), +('mall4cloud-allot-order-931','1','1000','调拨订单id'), +('mall4cloud-allot-order-932','1','1000','调拨订单id'), +('mall4cloud-allot-order-933','1','1000','调拨订单id'), +('mall4cloud-allot-order-934','1','1000','调拨订单id'), +('mall4cloud-allot-order-935','1','1000','调拨订单id'), +('mall4cloud-allot-order-936','1','1000','调拨订单id'), +('mall4cloud-allot-order-937','1','1000','调拨订单id'), +('mall4cloud-allot-order-938','1','1000','调拨订单id'), +('mall4cloud-allot-order-939','1','1000','调拨订单id'), +('mall4cloud-allot-order-940','1','1000','调拨订单id'), +('mall4cloud-allot-order-941','1','1000','调拨订单id'), +('mall4cloud-allot-order-942','1','1000','调拨订单id'), +('mall4cloud-allot-order-943','1','1000','调拨订单id'), +('mall4cloud-allot-order-944','1','1000','调拨订单id'), +('mall4cloud-allot-order-945','1','1000','调拨订单id'), +('mall4cloud-allot-order-946','1','1000','调拨订单id'), +('mall4cloud-allot-order-947','1','1000','调拨订单id'), +('mall4cloud-allot-order-948','1','1000','调拨订单id'), +('mall4cloud-allot-order-949','1','1000','调拨订单id'), +('mall4cloud-allot-order-950','1','1000','调拨订单id'), +('mall4cloud-allot-order-951','1','1000','调拨订单id'), +('mall4cloud-allot-order-952','1','1000','调拨订单id'), +('mall4cloud-allot-order-953','1','1000','调拨订单id'), +('mall4cloud-allot-order-954','1','1000','调拨订单id'), +('mall4cloud-allot-order-955','1','1000','调拨订单id'), +('mall4cloud-allot-order-956','1','1000','调拨订单id'), +('mall4cloud-allot-order-957','1','1000','调拨订单id'), +('mall4cloud-allot-order-958','1','1000','调拨订单id'), +('mall4cloud-allot-order-959','1','1000','调拨订单id'), +('mall4cloud-allot-order-960','1','1000','调拨订单id'), +('mall4cloud-allot-order-961','1','1000','调拨订单id'), +('mall4cloud-allot-order-962','1','1000','调拨订单id'), +('mall4cloud-allot-order-963','1','1000','调拨订单id'), +('mall4cloud-allot-order-964','1','1000','调拨订单id'), +('mall4cloud-allot-order-965','1','1000','调拨订单id'), +('mall4cloud-allot-order-966','1','1000','调拨订单id'), +('mall4cloud-allot-order-967','1','1000','调拨订单id'), +('mall4cloud-allot-order-968','1','1000','调拨订单id'), +('mall4cloud-allot-order-969','1','1000','调拨订单id'), +('mall4cloud-allot-order-970','1','1000','调拨订单id'), +('mall4cloud-allot-order-971','1','1000','调拨订单id'), +('mall4cloud-allot-order-972','1','1000','调拨订单id'), +('mall4cloud-allot-order-973','1','1000','调拨订单id'), +('mall4cloud-allot-order-974','1','1000','调拨订单id'), +('mall4cloud-allot-order-975','1','1000','调拨订单id'), +('mall4cloud-allot-order-976','1','1000','调拨订单id'), +('mall4cloud-allot-order-977','1','1000','调拨订单id'), +('mall4cloud-allot-order-978','1','1000','调拨订单id'), +('mall4cloud-allot-order-979','1','1000','调拨订单id'), +('mall4cloud-allot-order-980','1','1000','调拨订单id'), +('mall4cloud-allot-order-981','1','1000','调拨订单id'), +('mall4cloud-allot-order-982','1','1000','调拨订单id'), +('mall4cloud-allot-order-983','1','1000','调拨订单id'), +('mall4cloud-allot-order-984','1','1000','调拨订单id'), +('mall4cloud-allot-order-985','1','1000','调拨订单id'), +('mall4cloud-allot-order-986','1','1000','调拨订单id'), +('mall4cloud-allot-order-987','1','1000','调拨订单id'), +('mall4cloud-allot-order-988','1','1000','调拨订单id'), +('mall4cloud-allot-order-989','1','1000','调拨订单id'), +('mall4cloud-allot-order-990','1','1000','调拨订单id'), +('mall4cloud-allot-order-991','1','1000','调拨订单id'), +('mall4cloud-allot-order-992','1','1000','调拨订单id'), +('mall4cloud-allot-order-993','1','1000','调拨订单id'), +('mall4cloud-allot-order-994','1','1000','调拨订单id'), +('mall4cloud-allot-order-995','1','1000','调拨订单id'), +('mall4cloud-allot-order-996','1','1000','调拨订单id'), +('mall4cloud-allot-order-997','1','1000','调拨订单id'), +('mall4cloud-allot-order-998','1','1000','调拨订单id'), +('mall4cloud-allot-order-999','1','1000','调拨订单id'); + +# 新增allotOrderItem分库分表key +INSERT INTO `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) VALUES +('mall4cloud-allot-order-item-000','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-001','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-002','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-003','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-004','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-005','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-006','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-007','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-008','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-009','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-010','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-011','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-012','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-013','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-014','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-015','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-016','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-017','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-018','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-019','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-020','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-021','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-022','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-023','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-024','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-025','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-026','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-027','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-028','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-029','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-030','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-031','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-032','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-033','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-034','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-035','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-036','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-037','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-038','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-039','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-040','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-041','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-042','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-043','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-044','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-045','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-046','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-047','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-048','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-049','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-050','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-051','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-052','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-053','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-054','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-055','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-056','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-057','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-058','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-059','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-060','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-061','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-062','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-063','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-064','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-065','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-066','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-067','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-068','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-069','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-070','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-071','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-072','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-073','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-074','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-075','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-076','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-077','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-078','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-079','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-080','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-081','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-082','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-083','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-084','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-085','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-086','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-087','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-088','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-089','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-090','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-091','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-092','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-093','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-094','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-095','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-096','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-097','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-098','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-099','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-100','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-101','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-102','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-103','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-104','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-105','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-106','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-107','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-108','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-109','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-110','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-111','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-112','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-113','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-114','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-115','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-116','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-117','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-118','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-119','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-120','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-121','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-122','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-123','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-124','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-125','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-126','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-127','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-128','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-129','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-130','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-131','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-132','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-133','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-134','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-135','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-136','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-137','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-138','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-139','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-140','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-141','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-142','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-143','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-144','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-145','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-146','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-147','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-148','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-149','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-150','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-151','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-152','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-153','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-154','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-155','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-156','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-157','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-158','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-159','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-160','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-161','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-162','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-163','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-164','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-165','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-166','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-167','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-168','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-169','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-170','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-171','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-172','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-173','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-174','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-175','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-176','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-177','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-178','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-179','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-180','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-181','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-182','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-183','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-184','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-185','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-186','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-187','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-188','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-189','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-190','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-191','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-192','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-193','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-194','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-195','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-196','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-197','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-198','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-199','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-200','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-201','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-202','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-203','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-204','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-205','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-206','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-207','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-208','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-209','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-210','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-211','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-212','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-213','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-214','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-215','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-216','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-217','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-218','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-219','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-220','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-221','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-222','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-223','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-224','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-225','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-226','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-227','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-228','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-229','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-230','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-231','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-232','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-233','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-234','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-235','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-236','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-237','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-238','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-239','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-240','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-241','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-242','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-243','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-244','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-245','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-246','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-247','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-248','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-249','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-250','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-251','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-252','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-253','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-254','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-255','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-256','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-257','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-258','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-259','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-260','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-261','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-262','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-263','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-264','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-265','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-266','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-267','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-268','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-269','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-270','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-271','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-272','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-273','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-274','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-275','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-276','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-277','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-278','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-279','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-280','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-281','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-282','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-283','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-284','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-285','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-286','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-287','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-288','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-289','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-290','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-291','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-292','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-293','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-294','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-295','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-296','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-297','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-298','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-299','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-300','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-301','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-302','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-303','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-304','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-305','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-306','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-307','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-308','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-309','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-310','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-311','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-312','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-313','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-314','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-315','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-316','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-317','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-318','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-319','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-320','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-321','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-322','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-323','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-324','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-325','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-326','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-327','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-328','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-329','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-330','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-331','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-332','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-333','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-334','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-335','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-336','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-337','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-338','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-339','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-340','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-341','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-342','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-343','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-344','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-345','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-346','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-347','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-348','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-349','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-350','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-351','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-352','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-353','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-354','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-355','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-356','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-357','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-358','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-359','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-360','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-361','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-362','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-363','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-364','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-365','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-366','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-367','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-368','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-369','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-370','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-371','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-372','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-373','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-374','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-375','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-376','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-377','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-378','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-379','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-380','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-381','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-382','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-383','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-384','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-385','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-386','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-387','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-388','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-389','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-390','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-391','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-392','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-393','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-394','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-395','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-396','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-397','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-398','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-399','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-400','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-401','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-402','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-403','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-404','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-405','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-406','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-407','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-408','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-409','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-410','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-411','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-412','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-413','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-414','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-415','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-416','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-417','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-418','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-419','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-420','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-421','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-422','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-423','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-424','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-425','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-426','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-427','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-428','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-429','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-430','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-431','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-432','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-433','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-434','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-435','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-436','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-437','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-438','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-439','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-440','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-441','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-442','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-443','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-444','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-445','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-446','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-447','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-448','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-449','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-450','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-451','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-452','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-453','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-454','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-455','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-456','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-457','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-458','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-459','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-460','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-461','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-462','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-463','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-464','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-465','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-466','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-467','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-468','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-469','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-470','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-471','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-472','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-473','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-474','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-475','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-476','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-477','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-478','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-479','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-480','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-481','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-482','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-483','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-484','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-485','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-486','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-487','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-488','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-489','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-490','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-491','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-492','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-493','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-494','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-495','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-496','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-497','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-498','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-499','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-500','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-501','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-502','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-503','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-504','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-505','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-506','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-507','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-508','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-509','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-510','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-511','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-512','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-513','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-514','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-515','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-516','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-517','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-518','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-519','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-520','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-521','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-522','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-523','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-524','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-525','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-526','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-527','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-528','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-529','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-530','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-531','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-532','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-533','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-534','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-535','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-536','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-537','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-538','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-539','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-540','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-541','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-542','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-543','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-544','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-545','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-546','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-547','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-548','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-549','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-550','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-551','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-552','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-553','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-554','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-555','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-556','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-557','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-558','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-559','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-560','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-561','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-562','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-563','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-564','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-565','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-566','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-567','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-568','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-569','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-570','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-571','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-572','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-573','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-574','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-575','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-576','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-577','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-578','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-579','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-580','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-581','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-582','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-583','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-584','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-585','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-586','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-587','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-588','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-589','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-590','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-591','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-592','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-593','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-594','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-595','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-596','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-597','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-598','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-599','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-600','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-601','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-602','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-603','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-604','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-605','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-606','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-607','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-608','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-609','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-610','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-611','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-612','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-613','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-614','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-615','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-616','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-617','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-618','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-619','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-620','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-621','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-622','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-623','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-624','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-625','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-626','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-627','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-628','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-629','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-630','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-631','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-632','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-633','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-634','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-635','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-636','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-637','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-638','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-639','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-640','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-641','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-642','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-643','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-644','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-645','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-646','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-647','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-648','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-649','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-650','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-651','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-652','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-653','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-654','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-655','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-656','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-657','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-658','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-659','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-660','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-661','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-662','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-663','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-664','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-665','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-666','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-667','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-668','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-669','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-670','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-671','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-672','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-673','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-674','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-675','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-676','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-677','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-678','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-679','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-680','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-681','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-682','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-683','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-684','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-685','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-686','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-687','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-688','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-689','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-690','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-691','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-692','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-693','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-694','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-695','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-696','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-697','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-698','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-699','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-700','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-701','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-702','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-703','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-704','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-705','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-706','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-707','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-708','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-709','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-710','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-711','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-712','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-713','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-714','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-715','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-716','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-717','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-718','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-719','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-720','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-721','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-722','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-723','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-724','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-725','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-726','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-727','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-728','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-729','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-730','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-731','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-732','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-733','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-734','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-735','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-736','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-737','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-738','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-739','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-740','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-741','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-742','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-743','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-744','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-745','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-746','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-747','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-748','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-749','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-750','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-751','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-752','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-753','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-754','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-755','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-756','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-757','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-758','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-759','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-760','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-761','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-762','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-763','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-764','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-765','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-766','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-767','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-768','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-769','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-770','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-771','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-772','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-773','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-774','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-775','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-776','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-777','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-778','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-779','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-780','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-781','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-782','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-783','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-784','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-785','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-786','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-787','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-788','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-789','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-790','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-791','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-792','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-793','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-794','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-795','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-796','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-797','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-798','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-799','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-800','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-801','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-802','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-803','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-804','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-805','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-806','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-807','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-808','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-809','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-810','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-811','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-812','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-813','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-814','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-815','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-816','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-817','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-818','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-819','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-820','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-821','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-822','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-823','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-824','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-825','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-826','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-827','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-828','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-829','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-830','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-831','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-832','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-833','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-834','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-835','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-836','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-837','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-838','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-839','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-840','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-841','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-842','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-843','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-844','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-845','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-846','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-847','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-848','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-849','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-850','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-851','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-852','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-853','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-854','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-855','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-856','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-857','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-858','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-859','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-860','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-861','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-862','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-863','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-864','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-865','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-866','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-867','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-868','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-869','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-870','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-871','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-872','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-873','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-874','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-875','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-876','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-877','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-878','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-879','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-880','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-881','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-882','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-883','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-884','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-885','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-886','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-887','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-888','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-889','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-890','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-891','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-892','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-893','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-894','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-895','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-896','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-897','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-898','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-899','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-900','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-901','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-902','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-903','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-904','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-905','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-906','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-907','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-908','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-909','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-910','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-911','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-912','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-913','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-914','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-915','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-916','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-917','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-918','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-919','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-920','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-921','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-922','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-923','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-924','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-925','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-926','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-927','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-928','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-929','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-930','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-931','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-932','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-933','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-934','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-935','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-936','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-937','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-938','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-939','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-940','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-941','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-942','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-943','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-944','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-945','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-946','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-947','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-948','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-949','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-950','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-951','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-952','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-953','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-954','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-955','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-956','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-957','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-958','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-959','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-960','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-961','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-962','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-963','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-964','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-965','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-966','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-967','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-968','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-969','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-970','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-971','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-972','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-973','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-974','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-975','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-976','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-977','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-978','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-979','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-980','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-981','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-982','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-983','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-984','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-985','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-986','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-987','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-988','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-989','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-990','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-991','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-992','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-993','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-994','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-995','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-996','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-997','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-998','1','1000','调拨订单项id'), +('mall4cloud-allot-order-item-999','1','1000','调拨订单项id'); \ No newline at end of file diff --git a/db/2024-01-15 分库分表改为默认单库50表.sql b/db/2024-01-15 分库分表改为默认单库50表.sql new file mode 100644 index 0000000..2c1b419 --- /dev/null +++ b/db/2024-01-15 分库分表改为默认单库50表.sql @@ -0,0 +1,1876 @@ +# 本sql文件无法直接执行,文件内容较多,建议在IntelliJ IDEA开发工具打开,右键选择 Folding-->Collapse All 方便查看并且复制 + +# 更换采购订单语言表,订单项语言表主键 +# 为方便查看,这里只采用mall4cloud_order_0库作为演示,实际需要更改mall4cloud_order_0-7的8个库的分库分表!!!!! +USE mall4cloud_order_0; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + SET @delete_purchase_order_lang_lang_table = CONCAT( + 'delete from purchase_order_lang_', i, ' WHERE lang = 2' + ); + PREPARE delete_purchase_order_lang_lang_table FROM @delete_purchase_order_lang_lang_table; + EXECUTE delete_purchase_order_lang_lang_table; + + SET @delete_purchase_order_item_lang_lang_table = CONCAT( + 'delete from purchase_order_item_lang_', i, ' WHERE lang = 2' + ); + PREPARE delete_purchase_order_item_lang_lang_table FROM @delete_purchase_order_item_lang_lang_table; + EXECUTE delete_purchase_order_item_lang_lang_table; + + SET @change_purchase_item_key = CONCAT( + 'ALTER TABLE purchase_order_item_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_item_id`)' + ); + PREPARE change_purchase_item_key FROM @change_purchase_item_key; + EXECUTE change_purchase_item_key; + + SET @change_purchase_order_key = CONCAT( + 'ALTER TABLE purchase_order_lang_', i,' DROP PRIMARY KEY, ADD PRIMARY KEY (`purchase_order_id`)' + ); + PREPARE change_purchase_order_key FROM @change_purchase_order_key; + EXECUTE change_purchase_order_key; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +# 修改分库分表为单库50表 + +# 整体流程:将原本分库分表改为单库50表,需要将原数据都统计到总表中,再建新分表,再通过sql分配到各个分表中,最后删除总表数据 +# 按顺序执行!,执行时只按分块执行,例如第一步执行 1.在总表新建表,就只执行到 DROP TABLE IF EXISTS `purchase_order_lang`;,也即 2.统计表数据到总表,清除分库 之前, +# 确保执行成功后再执行下一步2,以此类推下述每一步 +# ============================== 1.在总表新建表 ============================== +# 这里的表结构最好将自己数据库中的0库0表中的数据结构复制过来,这里使用安装doc文档中的字段创建表结构 +# 如果修改过表结构或者sql执行时字段出现位置不一致,会产生不可预计的sql相关bug,所以建议用自己的表结构 +# 特别注意order_invoice和order_refund这两个表结构 +USE mall4cloud_order; +DROP TABLE IF EXISTS `allot_order`; +CREATE TABLE `allot_order` ( + `allot_order_id` bigint NOT NULL COMMENT '调拨订单id', + `out_warehouse_id` bigint DEFAULT NULL COMMENT '调出点仓库id', + `out_stock_point_type` int DEFAULT NULL COMMENT '调出点库存点类型(1:仓库, 2:门店)', + `in_warehouse_id` bigint DEFAULT NULL COMMENT '调入点仓库id', + `in_stock_point_type` int DEFAULT NULL COMMENT '调入点库存点类型(1:仓库, 2:门店)', + `dvy_company_id` bigint DEFAULT NULL COMMENT '物流公司id', + `dvy_type` int DEFAULT NULL COMMENT '物流方式(1:快递, 2:无需快递)', + `dvy_order_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流单号', + `status` int DEFAULT NULL COMMENT '状态(0:作废, 1:待入库, 2:部分入库, 3:已完成)', + `total_allot_count` int DEFAULT NULL COMMENT '总调拨数量', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `sys_type` int DEFAULT NULL COMMENT '系统类型', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`allot_order_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +DROP TABLE IF EXISTS `allot_order_item`; +CREATE TABLE `allot_order_item` ( + `allot_order_item_id` bigint NOT NULL COMMENT '调拨订单商品id', + `allot_order_id` bigint DEFAULT NULL COMMENT '调拨订单id', + `spu_id` bigint DEFAULT NULL COMMENT '商品spuId', + `sku_id` bigint DEFAULT NULL COMMENT '商品skuId', + `allot_count` int DEFAULT NULL COMMENT '调拨数量', + `allot_in_count` int DEFAULT NULL COMMENT '调拨入库数量', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`allot_order_item_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +DROP TABLE IF EXISTS `delivery_order`; +CREATE TABLE `delivery_order` ( + `delivery_order_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '订单物流包裹id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `order_id` bigint NOT NULL COMMENT '订单号', + `user_id` bigint NOT NULL COMMENT '用户id', + `delivery_company_id` bigint DEFAULT NULL COMMENT '快递公司id', + `delivery_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '快递单号', + `consignee_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人姓名', + `consignee_mobile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人电话(顺丰快递需要)', + `status` tinyint DEFAULT NULL COMMENT '物流状态 1正常 -1删除', + `all_count` int DEFAULT NULL COMMENT '包裹商品总数', + `delete_time` datetime DEFAULT NULL COMMENT '删除时间', + `delivery_type` int DEFAULT NULL COMMENT '发货方式(1.快递 3.无需物流)', + PRIMARY KEY (`delivery_order_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_delivery_company_id` (`delivery_company_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单快递信息'; + +DROP TABLE IF EXISTS `delivery_order_item`; +CREATE TABLE `delivery_order_item` ( + `delivery_order_item_id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `delivery_order_id` bigint DEFAULT NULL COMMENT '订单物流包裹id', + `img_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品图片', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `count` int DEFAULT '0' COMMENT '商品数量', + `supplier_img_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '供应商商品图片', + `supplier_spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '供应商商品名称', + PRIMARY KEY (`delivery_order_item_id`), + KEY `idx_order_delivery_id` (`delivery_order_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='物流订单项信息'; + +DROP TABLE IF EXISTS `order`; +CREATE TABLE `order` ( + `order_id` bigint unsigned NOT NULL COMMENT '订单ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `user_id` bigint NOT NULL COMMENT '用户ID', + `order_addr_id` bigint DEFAULT NULL COMMENT '用户订单地址Id', + `delivery_type` tinyint DEFAULT NULL COMMENT '配送类型 1:快递 2:自提 3:无需快递 4同城配送', + `pay_sys_type` tinyint NOT NULL DEFAULT '0' COMMENT '支付系统类型 0默认1通联支付', + `shop_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '店铺名称', + `total` bigint NOT NULL COMMENT '总值', + `actual_total` bigint DEFAULT NULL COMMENT '实际总值', + `freight_amount` bigint DEFAULT NULL COMMENT '订单运费', + `order_score` bigint DEFAULT NULL COMMENT '订单使用积分', + `status` tinyint NOT NULL DEFAULT '0' COMMENT '订单状态 1:待付款 2:待发货(待自提) 3:待收货(已发货) 5:成功 6:失败 7:待成团 9.待付尾款', + `pay_type` tinyint unsigned DEFAULT NULL COMMENT '支付方式 请参考枚举PayType', + `order_type` tinyint DEFAULT NULL COMMENT '订单类型 1团购订单 2秒杀订单 3积分订单', + `all_count` int DEFAULT NULL COMMENT '订单商品总数', + `reduce_amount` bigint NOT NULL DEFAULT '0' COMMENT '优惠总额', + `score_amount` bigint NOT NULL DEFAULT '0' COMMENT '积分抵扣金额', + `member_amount` bigint NOT NULL DEFAULT '0' COMMENT '会员折扣金额', + `platform_coupon_amount` bigint NOT NULL DEFAULT '0' COMMENT '平台优惠券优惠金额', + `shop_coupon_amount` bigint NOT NULL DEFAULT '0' COMMENT '商家优惠券优惠金额', + `discount_amount` bigint NOT NULL DEFAULT '0' COMMENT '满减优惠金额', + `shop_combo_amount` bigint NOT NULL DEFAULT '0' COMMENT '套餐优惠金额', + `platform_free_freight_amount` bigint NOT NULL DEFAULT '0' COMMENT '平台运费减免金额', + `free_freight_amount` bigint NOT NULL DEFAULT '0' COMMENT '商家运费减免金额', + `shop_change_free_amount` bigint NOT NULL DEFAULT '0' COMMENT '店铺改价优惠金额', + `distribution_amount` bigint NOT NULL DEFAULT '0' COMMENT '分销佣金', + `platform_amount` bigint NOT NULL DEFAULT '0' COMMENT '平台优惠金额', + `platform_commission` bigint NOT NULL DEFAULT '0' COMMENT '平台佣金', + `pay_time` datetime DEFAULT NULL COMMENT '付款时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `finally_time` datetime DEFAULT NULL COMMENT '完成时间', + `settled_time` datetime DEFAULT NULL COMMENT '结算时间', + `cancel_time` datetime DEFAULT NULL COMMENT '取消时间', + `book_time` datetime DEFAULT NULL COMMENT '预售发货时间', + `is_payed` tinyint(1) DEFAULT NULL COMMENT '是否已支付,1.已支付0.未支付', + `close_type` tinyint DEFAULT NULL COMMENT '订单关闭原因 1-超时未支付 2-退款关闭 4-买家取消 15-已通过货到付款交易', + `refund_status` tinyint DEFAULT NULL COMMENT '订单退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `shop_remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '卖家备注', + `remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '买家备注', + `delete_status` tinyint DEFAULT '0' COMMENT '用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除', + `version` int DEFAULT NULL COMMENT '订单版本号,每处理一次订单,版本号+1', + `is_settled` tinyint DEFAULT NULL COMMENT '是否已经进行结算', + `supplier_id` bigint NOT NULL DEFAULT '0' COMMENT '供应商id', + `wait_purchase` tinyint NOT NULL DEFAULT '0' COMMENT '是否待采购 1.是 0.否 2.已处理', + `supplier_delivery_type` tinyint NOT NULL DEFAULT '0' COMMENT '供应商商品发货方式 1.供应商发货 2.仓库发货', + `purchase_spread_amount` bigint NOT NULL DEFAULT '0' COMMENT '商家采购价差(需要商家从结算金额补上采购价的金额)', + `pre_sale_type` tinyint DEFAULT '-1' COMMENT '预售类型 0.全款预售类型 1.定金预售', + `order_mold` tinyint DEFAULT '0' COMMENT '是否为虚拟商品订单 1.是 0.否', + `write_off_status` tinyint(1) DEFAULT NULL COMMENT '订单核销状态 0.待核销 1.核销完成', + `write_off_num` int DEFAULT NULL COMMENT '核销次数 -1.多次核销 0.无需核销 1.单次核销', + `write_off_multiple_count` int DEFAULT NULL COMMENT '核销次数 -1.无限次', + `write_off_start` datetime DEFAULT NULL COMMENT '核销开始时间', + `write_off_end` datetime DEFAULT NULL COMMENT '核销结束时间', + `write_off_count` int(0) NULL DEFAULT NULL COMMENT '订单被核销次数', + `main_order_id` bigint NOT NULL DEFAULT '0' COMMENT '主单号,在组合/套餐商品拆单时会存在', + PRIMARY KEY (`order_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_addr_order_id` (`order_addr_id`), + KEY `idx_finally_time` (`finally_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单信息'; + +DROP TABLE IF EXISTS `order_addr`; +CREATE TABLE `order_addr` ( + `order_addr_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `user_id` bigint DEFAULT NULL COMMENT '用户ID', + `consignee` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收货人', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + `addr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `post_code` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮编', + `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机', + `lng` decimal(12,6) DEFAULT NULL COMMENT '经度', + `lat` decimal(12,6) DEFAULT NULL COMMENT '纬度', + PRIMARY KEY (`order_addr_id`), + KEY `idx_user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户订单配送地址'; + +DROP TABLE IF EXISTS `order_invoice`; +CREATE TABLE `order_invoice` ( + `order_invoice_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '订单发票ID', + `order_id` bigint NOT NULL COMMENT '订单id', + `shop_id` bigint NOT NULL COMMENT '店铺id', + `supplier_id` bigint DEFAULT NULL COMMENT '供应商id', + `invoice_type` tinyint NOT NULL DEFAULT '1' COMMENT '发票类型 1.电子普通发票', + `header_type` tinyint NOT NULL COMMENT '抬头类型 1.单位 2.个人', + `header_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '抬头名称', + `invoice_tax_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发票税号', + `invoice_context` tinyint NOT NULL DEFAULT '1' COMMENT '发票内容 1.商品明细', + `invoice_state` tinyint NOT NULL COMMENT '发票状态 1.申请中 2.已开票', + `file_id` bigint DEFAULT NULL COMMENT '文件id', + `application_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '申请时间', + `upload_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间', + PRIMARY KEY (`order_invoice_id`), + KEY `shop_idx` (`shop_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +DROP TABLE IF EXISTS `order_item`; +CREATE TABLE `order_item` ( + `order_item_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '订单项ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint NOT NULL COMMENT '店铺id', + `order_id` bigint NOT NULL COMMENT '订单id', + `category_id` bigint DEFAULT NULL COMMENT '分类id', + `spu_id` bigint unsigned NOT NULL COMMENT '产品ID', + `sku_id` bigint unsigned NOT NULL COMMENT '产品SkuID', + `user_id` bigint NOT NULL COMMENT '用户Id', + `final_refund_id` bigint DEFAULT NULL COMMENT '最终的退款id', + `distribution_user_id` bigint DEFAULT NULL COMMENT '推广员id', + `count` int DEFAULT '0' COMMENT '购物车产品个数', + `spu_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '产品名称', + `sku_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + `spu_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码', + `party_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku编码', + `pic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '产品主图片路径', + `is_comm` tinyint NOT NULL DEFAULT '0' COMMENT '是否以评价(0.未评价1.已评价)', + `comm_time` datetime DEFAULT NULL COMMENT '评论时间', + `refund_status` tinyint DEFAULT NULL COMMENT '订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `be_delivered_num` int DEFAULT NULL COMMENT '0全部发货 其他数量为剩余待发货数量', + `delivery_type` tinyint DEFAULT NULL COMMENT '单个orderItem的配送类型 1:快递 2:自提 3:无需快递 4:同城配送', + `shop_cart_time` datetime DEFAULT NULL COMMENT '加入购物车时间', + `price` bigint NOT NULL COMMENT '产品价格', + `spu_total_amount` bigint NOT NULL COMMENT '商品总金额', + `actual_total` bigint NOT NULL DEFAULT '0' COMMENT '商品实际金额 = 商品总金额 - 分摊的优惠金额', + `share_reduce` bigint NOT NULL DEFAULT '0' COMMENT '分摊的优惠金额(商家分摊 + 平台补贴)', + `platform_share_reduce` bigint NOT NULL DEFAULT '0' COMMENT '平台优惠金额', + `distribution_amount` bigint NOT NULL DEFAULT '0' COMMENT '推广员佣金', + `distribution_parent_amount` bigint NOT NULL DEFAULT '0' COMMENT '上级推广员佣金', + `use_score` bigint NOT NULL DEFAULT '0' COMMENT '使用积分', + `gain_score` bigint NOT NULL DEFAULT '0' COMMENT '获得积分', + `rate` decimal(15,6) NOT NULL DEFAULT '0.000000' COMMENT '分账比例', + `platform_commission` bigint NOT NULL DEFAULT '0' COMMENT '平台佣金(商品实际金额 * 分账比例)', + `score_amount` bigint NOT NULL DEFAULT '0' COMMENT '积分抵扣金额', + `member_amount` bigint NOT NULL DEFAULT '0' COMMENT '会员折扣金额', + `platform_coupon_amount` bigint NOT NULL DEFAULT '0' COMMENT '平台优惠券优惠金额', + `shop_coupon_amount` bigint NOT NULL DEFAULT '0' COMMENT '商家优惠券优惠金额', + `discount_amount` bigint NOT NULL DEFAULT '0' COMMENT '满减优惠金额', + `platform_free_freight_amount` bigint NOT NULL DEFAULT '0' COMMENT '平台运费减免金额', + `free_freight_amount` bigint NOT NULL DEFAULT '0' COMMENT '商家运费减免金额', + `shop_change_free_amount` bigint NOT NULL DEFAULT '0' COMMENT '店铺改价优惠金额', + `score_fee` bigint DEFAULT NULL COMMENT '积分价格(单价)', + `item_purchase_amount` bigint NOT NULL DEFAULT '0' COMMENT '采购价', + `purchase_platform_commission` bigint NOT NULL DEFAULT '0' COMMENT '供应商佣金', + `supplier_rate` decimal(15,6) NOT NULL DEFAULT '0.000000' COMMENT '供应商佣金比例', + `supplier_spu_id` bigint DEFAULT NULL COMMENT '供应商商品id', + `supplier_sku_id` bigint DEFAULT NULL COMMENT '供应商规格id', + `giveaway_amount` decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '赠品金额', + `main_giveaway` tinyint DEFAULT NULL COMMENT '主赠品', + `spu_mold` tinyint DEFAULT '0' COMMENT '商品类别 0.实物商品 1. 虚拟商品', + `is_refund` tinyint DEFAULT NULL COMMENT '是否可以退款 1.可以 0不可以', + `virtual_remark` json DEFAULT NULL COMMENT '虚拟商品的留言备注', + `combo_amount` bigint DEFAULT '0' COMMENT '套餐优惠金额', + `activity_id` bigint DEFAULT NULL COMMENT '活动id', + `activity_type` tinyint DEFAULT '0' COMMENT '活动类型 具体类型参考枚举类:OrderActivityType', + `supplier_pic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '产品供应商主图片路径', + `write_off_num` int DEFAULT NULL COMMENT '核销次数 -1.多次核销 0.无需核销 1.单次核销', + `write_off_multiple_count` int DEFAULT NULL COMMENT '核销次数 -1.无限次', + `write_off_start` datetime DEFAULT NULL COMMENT '核销开始时间', + `write_off_end` datetime DEFAULT NULL COMMENT '核销结束时间', + `stock_point_id` bigint DEFAULT NULL COMMENT '库存点id', + PRIMARY KEY (`order_item_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_spu_id` (`spu_id`), + KEY `idx_sku_id` (`sku_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_final_refund_id` (`final_refund_id`), + KEY `idx_distribution_user_id` (`distribution_user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项'; + +DROP TABLE IF EXISTS `order_item_lang`; +CREATE TABLE `order_item_lang` ( + `order_item_id` bigint NOT NULL COMMENT '订单项ID', + `lang` tinyint NOT NULL COMMENT '语言 1.中文 2.英文', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + `supplier_spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '供应商商品名称', + `supplier_sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '供应商sku名称', + PRIMARY KEY (`order_item_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项-国际化'; + +DROP TABLE IF EXISTS `order_pre_sale_info`; +CREATE TABLE `order_pre_sale_info` ( + `order_pre_sale_info_id` bigint NOT NULL AUTO_INCREMENT, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `deposit_amount` bigint DEFAULT '0' COMMENT '定金金额', + `deposit_reduce_amount` bigint DEFAULT '0' COMMENT '定金优惠金额', + `deposit_expansion_amount` bigint DEFAULT '0' COMMENT '定金膨胀金额', + `balance_amount` bigint DEFAULT '0' COMMENT '尾款金额', + `pre_sale_type` tinyint DEFAULT '0' COMMENT '预售类型 0.全款预售类型 1.定金预售', + `pay_status` tinyint DEFAULT '0' COMMENT '定金预售支付状态 1.已支付定金 2.已支付尾款', + `balance_start_time` datetime DEFAULT NULL COMMENT '尾款支付开始时间', + `balance_end_time` datetime DEFAULT NULL COMMENT '尾款支付结束时间', + `balance_pay_time` datetime DEFAULT NULL COMMENT '尾款支付时间', + `pre_sale_delivery_type` tinyint DEFAULT NULL COMMENT '预售发货类型 -1.固定时间 x.(尾款)支付后x天发货', + `pre_sale_delivery_time` datetime DEFAULT NULL COMMENT '预售发货时间', + PRIMARY KEY (`order_pre_sale_info_id`), + KEY `idx_order_id` (`order_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单预售信息'; + +DROP TABLE IF EXISTS `order_refund`; +CREATE TABLE `order_refund` ( + `refund_id` bigint NOT NULL COMMENT '记录ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint NOT NULL COMMENT '店铺ID', + `user_id` bigint NOT NULL COMMENT '买家ID', + `order_id` bigint NOT NULL COMMENT '订单号', + `order_item_id` bigint NOT NULL DEFAULT '0' COMMENT '订单项ID(0:为全部订单项)', + `refund_count` int DEFAULT '0' COMMENT '退货数量(0:为全部订单项)', + `refund_score` bigint DEFAULT NULL COMMENT '退还积分', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `platform_refund_commission` bigint DEFAULT NULL COMMENT '平台佣金退款金额', + `platform_refund_amount` bigint DEFAULT NULL COMMENT '平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)', + `distribution_total_amount` bigint DEFAULT NULL COMMENT '退款单总分销金额', + `refund_type` tinyint NOT NULL DEFAULT '0' COMMENT '退款单类型(1:整单退款,2:单个物品退款)', + `apply_type` tinyint NOT NULL COMMENT '申请类型:1,仅退款,2退款退货', + `pay_sys_type` tinyint NOT NULL DEFAULT '0' COMMENT '支付系统类型 0默认1通联支付', + `is_received` tinyint DEFAULT NULL COMMENT '是否接收到商品(1:已收到,0:未收到)', + `close_type` tinyint DEFAULT NULL COMMENT '退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)', + `return_money_sts` tinyint NOT NULL DEFAULT '0' COMMENT '处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType', + `buyer_reason` tinyint DEFAULT NULL COMMENT '申请原因(具体见BuyerReasonType)', + `buyer_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请说明', + `buyer_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式(退款时留下的手机号码)', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + `over_time` datetime DEFAULT NULL COMMENT '超时时间(超过该时间不处理,系统将自动处理)(保留字段)', + `reject_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拒绝原因', + `seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '卖家备注', + `shop_seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家备注(移交供应商处理时保存)', + `handel_time` datetime DEFAULT NULL COMMENT '受理时间', + `supplier_time` datetime DEFAULT NULL COMMENT '移交供应商时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `receive_time` datetime DEFAULT NULL COMMENT '收货时间', + `close_time` datetime DEFAULT NULL COMMENT '关闭时间', + `decision_time` datetime DEFAULT NULL COMMENT '确定时间(确定退款时间)', + `refund_time` datetime DEFAULT NULL COMMENT '退款时间', + `supplier_id` bigint NOT NULL DEFAULT '0' COMMENT '供应商id', + `supplier_handle_status` tinyint DEFAULT '-1' COMMENT '供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝', + `purchase_refund_amount` bigint DEFAULT '0' COMMENT '采购退款金额', + `pur_platform_refund_commission` bigint DEFAULT '0' COMMENT '采购的平台佣金退款金额', + `return_giveaway_ids` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款退回的赠品订单项ids', + `refund_actual_total` decimal(15,2) DEFAULT NULL COMMENT '当前退款的实付金额(实付金额减去不退回赠品的金额)', + `shop_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家/供应商文件凭证(逗号隔开)', + `platform_intervention_status` tinyint NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + `apply_intervention_reason` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由', + `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)', + `intervention_refund_type` tinyint DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款', + `after_intervention_refund_amount` bigint DEFAULT NULL COMMENT '平台介入前的退款金额', + `platform_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言', + `apply_intervention_time` datetime DEFAULT NULL COMMENT '申请介入时间', + `intervention_finish_time` datetime DEFAULT NULL COMMENT '介入完成时间', + PRIMARY KEY (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_order_item_id` (`order_item_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_shop_id` (`shop_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款记录信息'; + +DROP TABLE IF EXISTS `order_refund_addr`; +CREATE TABLE `order_refund_addr` ( + `refund_addr_id` bigint NOT NULL AUTO_INCREMENT COMMENT '物流ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `refund_id` bigint NOT NULL COMMENT '退款号', + `user_id` bigint NOT NULL COMMENT '买家ID', + `delivery_company_id` bigint DEFAULT NULL COMMENT '物流公司ID', + `delivery_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流公司名称', + `delivery_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流单号', + `consignee_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人姓名', + `consignee_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人电话(顺丰快递需要)', + `consignee_telephone` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人座机', + `consignee_post_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人邮政编码', + `consignee_addr` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人地址', + `sender_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发送人手机号码', + `sender_remarks` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '买家备注', + `imgs` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片凭证', + PRIMARY KEY (`refund_addr_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_delivery_company_id` (`delivery_company_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户退货物流地址'; + +DROP TABLE IF EXISTS `order_refund_intervention`; +CREATE TABLE `order_refund_intervention` ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_biz_id` (`biz_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录'; + +DROP TABLE IF EXISTS `order_refund_settlement`; +CREATE TABLE `order_refund_settlement` ( + `settlement_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '退款结算单据id', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `pay_id` bigint DEFAULT NULL COMMENT '订单支付单号', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `refund_id` bigint DEFAULT NULL COMMENT '退款单编号(本系统退款单号)', + `user_id` bigint DEFAULT NULL COMMENT '用户ID', + `biz_refund_no` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信/支付宝退款单号(支付平台退款单号)', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式(1:微信支付 2支付宝支付)', + `refund_status` tinyint DEFAULT NULL COMMENT '退款状态(1:申请中 2:已完成 -1失败)', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `order_total_amount` bigint DEFAULT NULL COMMENT '订单总额', + `version` int DEFAULT '0' COMMENT '版本号', + PRIMARY KEY (`settlement_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_biz_refund_no` (`biz_refund_no`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款支付结算单据'; + +DROP TABLE IF EXISTS `order_self_station`; +CREATE TABLE `order_self_station` ( + `order_self_station_id` bigint NOT NULL, + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `user_id` bigint NOT NULL COMMENT '用户id', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `station_id` bigint DEFAULT NULL COMMENT '自提点id', + `station_user_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自提人的手机', + `station_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自提人的名字', + `station_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自提时间(用户下单时选择)', + `station_code` varchar(9) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自提提货码', + `station_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '上门自提点的地址', + `station_phone` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '上门自提点的联系电话', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`order_self_station_id`), + KEY `STATION` (`station_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单自提信息'; + +DROP TABLE IF EXISTS `order_settlement`; +CREATE TABLE `order_settlement` ( + `settlement_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '支付结算单据ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `order_id` bigint DEFAULT NULL COMMENT '订单id', + `pay_id` bigint DEFAULT NULL COMMENT '支付单号', + `pay_ids` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支付单号集合,目前只有预售订单存在多条', + `user_id` bigint NOT NULL COMMENT '用户ID', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式', + `is_clearing` tinyint DEFAULT NULL COMMENT '是否清算 0:否 1:是', + `pay_score` bigint DEFAULT NULL COMMENT '支付积分', + `pay_amount` bigint DEFAULT NULL COMMENT '支付金额', + `clearing_time` datetime DEFAULT NULL COMMENT '清算时间', + `version` int DEFAULT NULL COMMENT '版本号', + `is_payed` tinyint DEFAULT NULL COMMENT '是否已支付,1.已支付0.未支付', + PRIMARY KEY (`settlement_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单结算表'; + +DROP TABLE IF EXISTS `order_virtual_info`; +CREATE TABLE `order_virtual_info` ( + `order_virtual_info_id` bigint NOT NULL, + `order_id` bigint unsigned NOT NULL COMMENT '订单ID', + `order_item_id` bigint NOT NULL DEFAULT '0' COMMENT '订单项id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `station_id` bigint DEFAULT NULL COMMENT '核销门店id', + `write_off_code` varchar(13) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '核销码', + `is_write_off` tinyint DEFAULT NULL COMMENT '是否核销 1.已核销 0.未核销', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `write_off_time` datetime DEFAULT NULL COMMENT '核销时间', + `write_off_multiple_count` int DEFAULT NULL COMMENT '剩余核销次数 -1.无限次', + PRIMARY KEY (`order_virtual_info_id`), + KEY `order_id` (`order_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单虚拟商品信息'; + +DROP TABLE IF EXISTS `purchase_order`; +CREATE TABLE `purchase_order` ( + `purchase_order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '采购id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `deliver_time` datetime DEFAULT NULL COMMENT '送达时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `supplier_id` bigint NOT NULL COMMENT '供应商id', + `total_amount` bigint NOT NULL COMMENT '总采购金额', + `total_stock` int NOT NULL COMMENT '总采购库存数量', + `actual_total_stock` int DEFAULT NULL COMMENT '实际总库存数量', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `employee_id` bigint DEFAULT NULL COMMENT '操作员工id', + `delivery_type` tinyint DEFAULT NULL COMMENT '配送类型 1:快递 2:自提 3:无需快递 4同城配送', + `purchase_order_addr_id` bigint DEFAULT NULL COMMENT '采购订单地址Id', + `voucher_img_urls` varchar(1000) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '付款凭证图片 多个图片逗号分隔', + `warehouse_id` bigint DEFAULT NULL COMMENT '仓库id', + `supplier_warehouse_id` bigint DEFAULT NULL COMMENT '供应商仓库id', + `stock_point_type` int DEFAULT NULL COMMENT '库存点类型(1:仓库, 2:门店)', + PRIMARY KEY (`purchase_order_id`), + KEY `idx_supplier_id` (`supplier_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单'; + +DROP TABLE IF EXISTS `purchase_order_addr`; +CREATE TABLE `purchase_order_addr` ( + `purchase_order_addr_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `consignee` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收货人', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + `addr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机', + PRIMARY KEY (`purchase_order_addr_id`), + KEY `idx_shop_id` (`shop_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单配送地址'; + +DROP TABLE IF EXISTS `purchase_order_item`; +CREATE TABLE `purchase_order_item` ( + `purchase_item_id` bigint NOT NULL COMMENT 'id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `purchase_order_id` bigint DEFAULT NULL COMMENT '采购订单id', + `spu_id` bigint DEFAULT NULL COMMENT '商品id', + `sku_id` bigint DEFAULT NULL COMMENT 'sku id', + `spu_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码', + `party_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku编码', + `pic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品图片', + `purchase_amount` bigint DEFAULT NULL COMMENT '采购金额', + `purchase_price` bigint DEFAULT NULL COMMENT '采购价', + `purchase_stock` int DEFAULT NULL COMMENT '采购库存数量', + `actual_stock` int DEFAULT NULL COMMENT '实际库存数量', + `delivery_type` tinyint DEFAULT NULL COMMENT '订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `be_delivered_num` int DEFAULT NULL COMMENT '0全部发货 其他数量为剩余待发货数量', + PRIMARY KEY (`purchase_item_id`), + KEY `idx_purchase_order_id` (`purchase_order_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单项'; + +DROP TABLE IF EXISTS `purchase_order_item_lang`; +CREATE TABLE `purchase_order_item_lang` ( + `purchase_item_id` bigint NOT NULL COMMENT '订单项ID', + `lang` tinyint NOT NULL COMMENT '语言 1.中文 2.英文', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + PRIMARY KEY (`purchase_item_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项-国际化'; + +DROP TABLE IF EXISTS `purchase_order_lang`; +CREATE TABLE `purchase_order_lang` ( + `purchase_order_id` bigint NOT NULL, + `lang` tinyint NOT NULL, + `spu_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`purchase_order_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单-国际化'; + +USE mall4cloud_payment; +DROP TABLE IF EXISTS `pay_info`; +CREATE TABLE `pay_info` ( + `pay_id` bigint unsigned NOT NULL COMMENT '支付单号', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `user_id` bigint DEFAULT NULL COMMENT '用户id', + `order_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '本次支付关联的多个订单号', + `biz_pay_no` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '外部订单流水号', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型 见SysTypeEnum', + `pay_entry` tinyint DEFAULT NULL COMMENT '支付入口 0下单 1余额充值', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式 1 微信支付 2 支付宝', + `pay_status` tinyint DEFAULT NULL COMMENT '支付状态', + `pay_score` bigint DEFAULT NULL COMMENT '支付积分', + `pay_amount` bigint DEFAULT NULL COMMENT '支付金额', + `version` int DEFAULT NULL COMMENT '版本号', + `callback_content` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回调内容', + `callback_time` datetime DEFAULT NULL COMMENT '回调时间', + `confirm_time` datetime DEFAULT NULL COMMENT '确认时间', + `refund_id` bigint DEFAULT NULL COMMENT '本次支付关联的退款号', + `pay_sys_type` int DEFAULT NULL COMMENT '系统支付类型 0.默认支付系统 1.通联支付', + `to_user_id` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支付给商城的用户id,通联支付独有', + `system_model` tinyint DEFAULT NULL COMMENT '支付的系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios', + `biz_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '第三方系统userid', + PRIMARY KEY (`pay_id`), + KEY `idx_biz_pay_no` (`biz_pay_no`), + KEY `idx_user_id` (`user_id`), + KEY `idx_order_ids` (`order_ids`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单支付记录'; + +DROP TABLE IF EXISTS `refund_info`; +CREATE TABLE `refund_info` ( + `refund_id` bigint unsigned NOT NULL COMMENT '退款单号', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `order_id` bigint DEFAULT NULL COMMENT '关联的支付订单id', + `pay_id` bigint NOT NULL DEFAULT '0' COMMENT '关联的支付单id', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式', + `user_id` bigint DEFAULT NULL COMMENT '用户id', + `refund_status` tinyint DEFAULT NULL COMMENT '退款状态', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `callback_content` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回调内容', + `callback_time` datetime DEFAULT NULL COMMENT '回调时间', + PRIMARY KEY (`refund_id`,`pay_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_userid` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款信息'; + +# ============================== 2.统计表数据到总表============================== +# 为方便查看,2中都只采用mall4cloud_order_0库作为演示,实际需要更改mall4cloud_order_0-7的8个库的分库分表!!!!! +# mall4cloud_payment_0库作为演示,实际需要更改mall4cloud_payment_0-7的8个库的分库分表!!!!! +USE mall4cloud_order_0; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + # 汇总到总表 + SET @create_allot_order_table = CONCAT( + 'INSERT INTO mall4cloud_order.`allot_order` + (SELECT * FROM allot_order_', i, ')' + ); + PREPARE create_allot_order_table FROM @create_allot_order_table; + EXECUTE create_allot_order_table; + + SET @create_allot_order_item_table = CONCAT( + 'INSERT INTO mall4cloud_order.`allot_order_item` + (SELECT * FROM allot_order_item_', i, ')' + ); + PREPARE create_allot_order_item_table FROM @create_allot_order_item_table; + EXECUTE create_allot_order_item_table; + + SET @create_delivery_order_table = CONCAT( + 'INSERT INTO mall4cloud_order.`delivery_order` (`create_time`,`update_time`,`order_id`,`user_id`,`delivery_company_id`,`delivery_no`,`consignee_name`,`consignee_mobile`,`status`,`all_count`,`delete_time`,`delivery_type`) + (SELECT `create_time`,`update_time`,`order_id`,`user_id`,`delivery_company_id`,`delivery_no`,`consignee_name`,`consignee_mobile`,`status`,`all_count`,`delete_time`,`delivery_type` FROM delivery_order_', i, ')' + ); + PREPARE create_delivery_order_table FROM @create_delivery_order_table; + EXECUTE create_delivery_order_table; + + SET @create_delivery_order_item_table = CONCAT( + 'INSERT INTO mall4cloud_order.`delivery_order_item` (`create_time`,`update_time`,`delivery_order_id`,`img_url`,`spu_name`,`count`,`supplier_img_url`,`supplier_spu_name`) + (SELECT `create_time`,`update_time`,`delivery_order_id`,`img_url`,`spu_name`,`count`,`supplier_img_url`,`supplier_spu_name` FROM delivery_order_item_', i, ')' + ); + PREPARE create_delivery_order_item_table FROM @create_delivery_order_item_table; + EXECUTE create_delivery_order_item_table; + + SET @create_order_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order` + (SELECT * FROM order_', i, ')' + ); + PREPARE create_order_table FROM @create_order_table; + EXECUTE create_order_table; + + SET @create_order_addr_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_addr` + (SELECT * FROM order_addr_', i, ')' + ); + PREPARE create_order_addr_table FROM @create_order_addr_table; + EXECUTE create_order_addr_table; + + SET @create_order_invoice_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_invoice` + (SELECT * FROM order_invoice_', i, ')' + ); + PREPARE create_order_invoice_table FROM @create_order_invoice_table; + EXECUTE create_order_invoice_table; + + SET @create_order_item_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_item` + (SELECT * FROM order_item_', i, ')' + ); + PREPARE create_order_item_table FROM @create_order_item_table; + EXECUTE create_order_item_table; + + SET @create_order_item_lang_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_item_lang` + (SELECT * FROM order_item_lang_', i, ')' + ); + PREPARE create_order_item_lang_table FROM @create_order_item_lang_table; + EXECUTE create_order_item_lang_table; + + SET @create_order_pre_sale_info_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_pre_sale_info` + (SELECT * FROM order_pre_sale_info_', i, ')' + ); + PREPARE create_order_pre_sale_info_table FROM @create_order_pre_sale_info_table; + EXECUTE create_order_pre_sale_info_table; + + SET @create_order_refund_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_refund` + (SELECT * FROM order_refund_', i, ')' + ); + PREPARE create_order_refund_table FROM @create_order_refund_table; + EXECUTE create_order_refund_table; + + SET @create_order_refund_addr_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_refund_addr` (`create_time`,`update_time`,`shop_id`,`refund_id`,`user_id`,`delivery_company_id`,`delivery_name`,`delivery_no`,`consignee_name`,`consignee_mobile`,`consignee_telephone`,`consignee_post_code`,`consignee_addr`,`sender_mobile`,`sender_remarks`,`imgs`) + (SELECT `create_time`,`update_time`,`shop_id`,`refund_id`,`user_id`,`delivery_company_id`,`delivery_name`,`delivery_no`,`consignee_name`,`consignee_mobile`,`consignee_telephone`,`consignee_post_code`,`consignee_addr`,`sender_mobile`,`sender_remarks`,`imgs` FROM order_refund_addr_', i, ')' + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_refund_intervention` (`refund_id`,`create_time`,`update_time`,`biz_id`,`sys_type`,`voucher_desc`,`img_urls`) + (SELECT `refund_id`,`create_time`,`update_time`,`biz_id`,`sys_type`,`voucher_desc`,`img_urls` FROM order_refund_intervention_', i, ')' + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_refund_settlement` (`create_time`,`update_time`,`pay_id`,`order_id`,`refund_id`,`user_id`,`biz_refund_no`,`pay_type`,`refund_status`,`refund_amount`,`order_total_amount`,`version`) + (SELECT `create_time`,`update_time`,`pay_id`,`order_id`,`refund_id`,`user_id`,`biz_refund_no`,`pay_type`,`refund_status`,`refund_amount`,`order_total_amount`,`version` FROM order_refund_settlement_', i, ')' + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET @create_order_self_station_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_self_station` + (SELECT * FROM order_self_station_', i, ')' + ); + PREPARE create_order_self_station_table FROM @create_order_self_station_table; + EXECUTE create_order_self_station_table; + + SET @create_order_settlement_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_settlement` + (SELECT * FROM order_settlement_', i, ')' + ); + PREPARE create_order_settlement_table FROM @create_order_settlement_table; + EXECUTE create_order_settlement_table; + + SET @create_order_virtual_info_table = CONCAT( + 'INSERT INTO mall4cloud_order.`order_virtual_info` + (SELECT * FROM order_virtual_info_', i, ')' + ); + PREPARE create_order_virtual_info_table FROM @create_order_virtual_info_table; + EXECUTE create_order_virtual_info_table; + + SET @create_purchase_order_table = CONCAT( + 'INSERT INTO mall4cloud_order.`purchase_order` + (SELECT * FROM purchase_order_', i, ')' + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'INSERT INTO mall4cloud_order.`purchase_order_lang` + (SELECT * FROM purchase_order_lang_', i, ')' + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'INSERT INTO mall4cloud_order.`purchase_order_item` + (SELECT * FROM purchase_order_item_', i, ')' + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'INSERT INTO mall4cloud_order.`purchase_order_item_lang` + (SELECT * FROM purchase_order_item_lang_', i, ')' + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'INSERT INTO mall4cloud_order.`purchase_order_addr` + (SELECT * FROM purchase_order_addr_', i, ')' + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_payment_0; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<64 DO + # 汇总到总表 + SET @create_pay_info_table = CONCAT( + 'INSERT INTO mall4cloud_payment.`pay_info` + (SELECT * FROM pay_info_', i, ')' + ); + PREPARE create_pay_info_table FROM @create_pay_info_table; + EXECUTE create_pay_info_table; + + SET @create_refund_info_table = CONCAT( + 'INSERT INTO mall4cloud_payment.`refund_info` + (SELECT * FROM refund_info_', i, ')' + ); + PREPARE create_refund_info_table FROM @create_refund_info_table; + EXECUTE create_refund_info_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +# ============================== 3.删除多余分库分表 ============================== +# 请确保1-2成功执行,并且所有分表数据成功到总表中再执行 +DROP DATABASE `mall4cloud_order_0`; +DROP DATABASE `mall4cloud_order_1`; +DROP DATABASE `mall4cloud_order_2`; +DROP DATABASE `mall4cloud_order_3`; +DROP DATABASE `mall4cloud_order_4`; +DROP DATABASE `mall4cloud_order_5`; +DROP DATABASE `mall4cloud_order_6`; +DROP DATABASE `mall4cloud_order_7`; + +DROP DATABASE `mall4cloud_payment_0`; +DROP DATABASE `mall4cloud_payment_1`; +DROP DATABASE `mall4cloud_payment_2`; +DROP DATABASE `mall4cloud_payment_3`; +DROP DATABASE `mall4cloud_payment_4`; +DROP DATABASE `mall4cloud_payment_5`; +DROP DATABASE `mall4cloud_payment_6`; +DROP DATABASE `mall4cloud_payment_7`; + +# ============================== 4.创建分表 ============================== +USE mall4cloud_order; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + + + # ============================== 订单 ============================== + + + SET i = 0; + WHILE i<50 DO + + SET @create_order_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_', i, + " + ( + `order_id` bigint unsigned NOT NULL COMMENT '订单ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `user_id` bigint NOT NULL COMMENT '用户ID', + `order_addr_id` bigint DEFAULT NULL COMMENT '用户订单地址Id', + `delivery_type` tinyint DEFAULT NULL COMMENT '配送类型 1:快递 2:自提 3:无需快递 4同城配送', + `pay_sys_type` tinyint NOT NULL DEFAULT '0' COMMENT '支付系统类型 0默认1通联支付', + `shop_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '店铺名称', + `total` bigint NOT NULL COMMENT '总值', + `actual_total` bigint DEFAULT NULL COMMENT '实际总值', + `freight_amount` bigint DEFAULT NULL COMMENT '订单运费', + `order_score` bigint DEFAULT NULL COMMENT '订单使用积分', + `status` tinyint NOT NULL DEFAULT '0' COMMENT '订单状态 1:待付款 2:待发货(待自提) 3:待收货(已发货) 5:成功 6:失败 7:待成团 9.待付尾款', + `pay_type` tinyint unsigned DEFAULT NULL COMMENT '支付方式 请参考枚举PayType', + `order_type` tinyint DEFAULT NULL COMMENT '订单类型 1团购订单 2秒杀订单 3积分订单', + `all_count` int DEFAULT NULL COMMENT '订单商品总数', + `reduce_amount` bigint NOT NULL DEFAULT '0' COMMENT '优惠总额', + `score_amount` bigint NOT NULL DEFAULT '0' COMMENT '积分抵扣金额', + `member_amount` bigint NOT NULL DEFAULT '0' COMMENT '会员折扣金额', + `platform_coupon_amount` bigint NOT NULL DEFAULT '0' COMMENT '平台优惠券优惠金额', + `shop_coupon_amount` bigint NOT NULL DEFAULT '0' COMMENT '商家优惠券优惠金额', + `discount_amount` bigint NOT NULL DEFAULT '0' COMMENT '满减优惠金额', + `shop_combo_amount` bigint NOT NULL DEFAULT '0' COMMENT '套餐优惠金额', + `platform_free_freight_amount` bigint NOT NULL DEFAULT '0' COMMENT '平台运费减免金额', + `free_freight_amount` bigint NOT NULL DEFAULT '0' COMMENT '商家运费减免金额', + `shop_change_free_amount` bigint NOT NULL DEFAULT '0' COMMENT '店铺改价优惠金额', + `distribution_amount` bigint NOT NULL DEFAULT '0' COMMENT '分销佣金', + `platform_amount` bigint NOT NULL DEFAULT '0' COMMENT '平台优惠金额', + `platform_commission` bigint NOT NULL DEFAULT '0' COMMENT '平台佣金', + `pay_time` datetime DEFAULT NULL COMMENT '付款时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `finally_time` datetime DEFAULT NULL COMMENT '完成时间', + `settled_time` datetime DEFAULT NULL COMMENT '结算时间', + `cancel_time` datetime DEFAULT NULL COMMENT '取消时间', + `book_time` datetime DEFAULT NULL COMMENT '预售发货时间', + `is_payed` tinyint(1) DEFAULT NULL COMMENT '是否已支付,1.已支付0.未支付', + `close_type` tinyint DEFAULT NULL COMMENT '订单关闭原因 1-超时未支付 2-退款关闭 4-买家取消 15-已通过货到付款交易', + `refund_status` tinyint DEFAULT NULL COMMENT '订单退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `shop_remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '卖家备注', + `remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '买家备注', + `delete_status` tinyint DEFAULT '0' COMMENT '用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除', + `version` int DEFAULT NULL COMMENT '订单版本号,每处理一次订单,版本号+1', + `is_settled` tinyint DEFAULT NULL COMMENT '是否已经进行结算', + `supplier_id` bigint NOT NULL DEFAULT '0' COMMENT '供应商id', + `wait_purchase` tinyint NOT NULL DEFAULT '0' COMMENT '是否待采购 1.是 0.否 2.已处理', + `supplier_delivery_type` tinyint NOT NULL DEFAULT '0' COMMENT '供应商商品发货方式 1.供应商发货 2.仓库发货', + `purchase_spread_amount` bigint NOT NULL DEFAULT '0' COMMENT '商家采购价差(需要商家从结算金额补上采购价的金额)', + `pre_sale_type` tinyint DEFAULT '-1' COMMENT '预售类型 0.全款预售类型 1.定金预售', + `order_mold` tinyint DEFAULT '0' COMMENT '是否为虚拟商品订单 1.是 0.否', + `write_off_status` tinyint(1) DEFAULT NULL COMMENT '订单核销状态 0.待核销 1.核销完成', + `write_off_num` int DEFAULT NULL COMMENT '核销次数 -1.多次核销 0.无需核销 1.单次核销', + `write_off_multiple_count` int DEFAULT NULL COMMENT '核销次数 -1.无限次', + `write_off_start` datetime DEFAULT NULL COMMENT '核销开始时间', + `write_off_end` datetime DEFAULT NULL COMMENT '核销结束时间', + `write_off_count` int(0) NULL DEFAULT NULL COMMENT '订单被核销次数', + main_order_id BIGINT NOT NULL DEFAULT '0' COMMENT '主单号,在组合/套餐商品拆单时会存在', + PRIMARY KEY (`order_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_addr_order_id` (`order_addr_id`), + KEY `idx_finally_time` (`finally_time`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单信息' + " + ); + PREPARE sql_create_table FROM @create_order_table; + EXECUTE sql_create_table; + + SET @create_order_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_addr_', i, + " + ( + `order_addr_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `user_id` bigint DEFAULT NULL COMMENT '用户ID', + `consignee` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收货人', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + `addr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `post_code` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮编', + `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机', + `lng` decimal(12,6) DEFAULT NULL COMMENT '经度', + `lat` decimal(12,6) DEFAULT NULL COMMENT '纬度', + PRIMARY KEY (`order_addr_id`), + KEY `idx_user_id` (`user_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户订单配送地址' + " + ); + PREPARE create_order_addr_table FROM @create_order_addr_table; + EXECUTE create_order_addr_table; + + SET @create_order_item_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_item_', i, + " + ( + `order_item_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '订单项ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint NOT NULL COMMENT '店铺id', + `order_id` bigint NOT NULL COMMENT '订单id', + `category_id` bigint DEFAULT NULL COMMENT '分类id', + `spu_id` bigint unsigned NOT NULL COMMENT '产品ID', + `sku_id` bigint unsigned NOT NULL COMMENT '产品SkuID', + `user_id` bigint NOT NULL COMMENT '用户Id', + `final_refund_id` bigint DEFAULT NULL COMMENT '最终的退款id', + `distribution_user_id` bigint DEFAULT NULL COMMENT '推广员id', + `count` int DEFAULT '0' COMMENT '购物车产品个数', + `spu_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '产品名称', + `sku_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + `spu_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码', + `party_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku编码', + `pic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '产品主图片路径', + `is_comm` tinyint NOT NULL DEFAULT '0' COMMENT '是否以评价(0.未评价1.已评价)', + `comm_time` datetime DEFAULT NULL COMMENT '评论时间', + `refund_status` tinyint DEFAULT NULL COMMENT '订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `be_delivered_num` int DEFAULT NULL COMMENT '0全部发货 其他数量为剩余待发货数量', + `delivery_type` tinyint DEFAULT NULL COMMENT '单个orderItem的配送类型 1:快递 2:自提 3:无需快递 4:同城配送', + `shop_cart_time` datetime DEFAULT NULL COMMENT '加入购物车时间', + `price` bigint NOT NULL COMMENT '产品价格', + `spu_total_amount` bigint NOT NULL COMMENT '商品总金额', + `actual_total` bigint NOT NULL DEFAULT '0' COMMENT '商品实际金额 = 商品总金额 - 分摊的优惠金额', + `share_reduce` bigint NOT NULL DEFAULT '0' COMMENT '分摊的优惠金额(商家分摊 + 平台补贴)', + `platform_share_reduce` bigint NOT NULL DEFAULT '0' COMMENT '平台优惠金额', + `distribution_amount` bigint NOT NULL DEFAULT '0' COMMENT '推广员佣金', + `distribution_parent_amount` bigint NOT NULL DEFAULT '0' COMMENT '上级推广员佣金', + `use_score` bigint NOT NULL DEFAULT '0' COMMENT '使用积分', + `gain_score` bigint NOT NULL DEFAULT '0' COMMENT '获得积分', + `rate` decimal(15,6) NOT NULL DEFAULT '0.000000' COMMENT '分账比例', + `platform_commission` bigint NOT NULL DEFAULT '0' COMMENT '平台佣金(商品实际金额 * 分账比例)', + `score_amount` bigint NOT NULL DEFAULT '0' COMMENT '积分抵扣金额', + `member_amount` bigint NOT NULL DEFAULT '0' COMMENT '会员折扣金额', + `platform_coupon_amount` bigint NOT NULL DEFAULT '0' COMMENT '平台优惠券优惠金额', + `shop_coupon_amount` bigint NOT NULL DEFAULT '0' COMMENT '商家优惠券优惠金额', + `discount_amount` bigint NOT NULL DEFAULT '0' COMMENT '满减优惠金额', + `platform_free_freight_amount` bigint NOT NULL DEFAULT '0' COMMENT '平台运费减免金额', + `free_freight_amount` bigint NOT NULL DEFAULT '0' COMMENT '商家运费减免金额', + `shop_change_free_amount` bigint NOT NULL DEFAULT '0' COMMENT '店铺改价优惠金额', + `score_fee` bigint DEFAULT NULL COMMENT '积分价格(单价)', + `item_purchase_amount` bigint NOT NULL DEFAULT '0' COMMENT '采购价', + `purchase_platform_commission` bigint NOT NULL DEFAULT '0' COMMENT '供应商佣金', + `supplier_rate` decimal(15,6) NOT NULL DEFAULT '0.000000' COMMENT '供应商佣金比例', + `supplier_spu_id` bigint DEFAULT NULL COMMENT '供应商商品id', + `supplier_sku_id` bigint DEFAULT NULL COMMENT '供应商规格id', + `giveaway_amount` decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '赠品金额', + `main_giveaway` tinyint DEFAULT NULL COMMENT '主赠品', + `spu_mold` tinyint DEFAULT '0' COMMENT '商品类别 0.实物商品 1. 虚拟商品', + `is_refund` tinyint DEFAULT NULL COMMENT '是否可以退款 1.可以 0不可以', + `virtual_remark` json DEFAULT NULL COMMENT '虚拟商品的留言备注', + `combo_amount` bigint DEFAULT '0' COMMENT '套餐优惠金额', + `activity_id` bigint DEFAULT NULL COMMENT '活动id', + `activity_type` tinyint DEFAULT '0' COMMENT '活动类型 具体类型参考枚举类:OrderActivityType', + `supplier_pic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '产品供应商主图片路径', + `write_off_num` INT DEFAULT NULL COMMENT '核销次数 -1.多次核销 0.无需核销 1.单次核销', + `write_off_multiple_count` INT DEFAULT NULL COMMENT '核销次数 -1.无限次', + `write_off_start` DATETIME DEFAULT NULL COMMENT '核销开始时间', + `write_off_end` DATETIME DEFAULT NULL COMMENT '核销结束时间', + `stock_point_id` bigint DEFAULT NULL COMMENT '库存点id', + PRIMARY KEY (`order_item_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_spu_id` (`spu_id`), + KEY `idx_sku_id` (`sku_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_final_refund_id` (`final_refund_id`), + KEY `idx_distribution_user_id` (`distribution_user_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项' + " + ); + PREPARE create_order_item_table FROM @create_order_item_table; + EXECUTE create_order_item_table; + + SET @create_order_item_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_item_lang_', i, + " + ( + `order_item_id` bigint NOT NULL COMMENT '订单项ID', + `lang` tinyint NOT NULL COMMENT '语言 1.中文 2.英文', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + `supplier_spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '供应商商品名称', + `supplier_sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '供应商sku名称', + PRIMARY KEY (`order_item_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项-国际化' + " + ); + PREPARE create_order_item_lang_table FROM @create_order_item_lang_table; + EXECUTE create_order_item_lang_table; + + SET @create_order_settlement_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_settlement_', i, + " + ( + `settlement_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '支付结算单据ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `order_id` bigint DEFAULT NULL COMMENT '订单id', + `pay_id` bigint DEFAULT NULL COMMENT '支付单号', + `pay_ids` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支付单号集合,目前只有预售订单存在多条', + `user_id` bigint NOT NULL COMMENT '用户ID', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式', + `is_clearing` tinyint DEFAULT NULL COMMENT '是否清算 0:否 1:是', + `pay_score` bigint DEFAULT NULL COMMENT '支付积分', + `pay_amount` bigint DEFAULT NULL COMMENT '支付金额', + `clearing_time` datetime DEFAULT NULL COMMENT '清算时间', + `version` int DEFAULT NULL COMMENT '版本号', + `is_payed` tinyint DEFAULT NULL COMMENT '是否已支付,1.已支付0.未支付', + PRIMARY KEY (`settlement_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单结算表' + " + ); + PREPARE create_order_settlement_table FROM @create_order_settlement_table; + EXECUTE create_order_settlement_table; + + SET @create_order_pre_sale_info_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_pre_sale_info_', i, + " + ( + `order_pre_sale_info_id` bigint NOT NULL AUTO_INCREMENT, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `deposit_amount` bigint DEFAULT '0' COMMENT '定金金额', + `deposit_reduce_amount` bigint DEFAULT '0' COMMENT '定金优惠金额', + `deposit_expansion_amount` bigint DEFAULT '0' COMMENT '定金膨胀金额', + `balance_amount` bigint DEFAULT '0' COMMENT '尾款金额', + `pre_sale_type` tinyint DEFAULT '0' COMMENT '预售类型 0.全款预售类型 1.定金预售', + `pay_status` tinyint DEFAULT '0' COMMENT '定金预售支付状态 1.已支付定金 2.已支付尾款', + `balance_start_time` datetime DEFAULT NULL COMMENT '尾款支付开始时间', + `balance_end_time` datetime DEFAULT NULL COMMENT '尾款支付结束时间', + `balance_pay_time` datetime DEFAULT NULL COMMENT '尾款支付时间', + `pre_sale_delivery_type` tinyint DEFAULT NULL COMMENT '预售发货类型 -1.固定时间 x.(尾款)支付后x天发货', + `pre_sale_delivery_time` datetime DEFAULT NULL COMMENT '预售发货时间', + PRIMARY KEY (`order_pre_sale_info_id`), + KEY `idx_order_id` (`order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单预售信息' + " + ); + PREPARE create_order_pre_sale_info_table FROM @create_order_pre_sale_info_table; + EXECUTE create_order_pre_sale_info_table; + + SET @create_order_invoice_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_invoice_', i, + " + ( + `order_invoice_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '订单发票ID', + `order_id` bigint NOT NULL COMMENT '订单id', + `shop_id` bigint NOT NULL COMMENT '店铺id', + `supplier_id` bigint NULL COMMENT '供应商id', + `invoice_type` tinyint NOT NULL DEFAULT '1' COMMENT '发票类型 1.电子普通发票', + `header_type` tinyint NOT NULL COMMENT '抬头类型 1.单位 2.个人', + `header_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '抬头名称', + `invoice_tax_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发票税号', + `invoice_context` tinyint NOT NULL DEFAULT '1' COMMENT '发票内容 1.商品明细', + `invoice_state` tinyint NOT NULL COMMENT '发票状态 1.申请中 2.已开票', + `file_id` bigint DEFAULT NULL COMMENT '文件id', + `application_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '申请时间', + `upload_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间', + PRIMARY KEY (`order_invoice_id`), + KEY `shop_idx`(`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci + " + ); + PREPARE create_order_invoice_table FROM @create_order_invoice_table; + EXECUTE create_order_invoice_table; + + SET @create_order_self_station_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_self_station_', i, + " + ( + `order_self_station_id` bigint NOT NULL, + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `user_id` bigint NOT NULL COMMENT '用户id', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `station_id` bigint DEFAULT NULL COMMENT '自提点id', + `station_user_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自提人的手机', + `station_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自提人的名字', + `station_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自提时间(用户下单时选择)', + `station_code` varchar(9) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自提提货码', + `station_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '上门自提点的地址', + `station_phone` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '上门自提点的联系电话', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`order_self_station_id`), + KEY `STATION` (`station_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单自提信息' + "); + PREPARE create_order_self_station_table FROM @create_order_self_station_table; + EXECUTE create_order_self_station_table; + + SET @create_order_virtual_info_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_virtual_info_', i, + " + ( + `order_virtual_info_id` bigint NOT NULL , + `order_id` bigint unsigned NOT NULL COMMENT '订单ID', + `order_item_id` bigint NOT NULL DEFAULT '0' COMMENT '订单项id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `station_id` bigint DEFAULT NULL COMMENT '核销门店id', + `write_off_code` varchar(13) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '核销码', + `is_write_off` tinyint DEFAULT NULL COMMENT '是否核销 1.已核销 0.未核销', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `write_off_time` datetime DEFAULT NULL COMMENT '核销时间', + `write_off_multiple_count` int DEFAULT NULL COMMENT '剩余核销次数 -1.无限次', + PRIMARY KEY (`order_virtual_info_id`), + KEY `order_id` (`order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单虚拟商品信息' + "); + PREPARE create_order_virtual_info_table FROM @create_order_virtual_info_table; + EXECUTE create_order_virtual_info_table; + + SET @create_delivery_order_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS delivery_order_', i, + " + ( + `delivery_order_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '订单物流包裹id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `order_id` bigint NOT NULL COMMENT '订单号', + `user_id` bigint NOT NULL COMMENT '用户id', + `delivery_company_id` bigint DEFAULT NULL COMMENT '快递公司id', + `delivery_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '快递单号', + `consignee_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人姓名', + `consignee_mobile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人电话(顺丰快递需要)', + `status` tinyint DEFAULT NULL COMMENT '物流状态 1正常 -1删除', + `all_count` int DEFAULT NULL COMMENT '包裹商品总数', + `delete_time` datetime DEFAULT NULL COMMENT '删除时间', + `delivery_type` int DEFAULT NULL COMMENT '发货方式(1.快递 3.无需物流)', + PRIMARY KEY (`delivery_order_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_delivery_company_id` (`delivery_company_id`) + ) ENGINE=InnoDB AUTO_INCREMENT=96 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单快递信息' + " + ); + PREPARE create_delivery_order_table FROM @create_delivery_order_table; + EXECUTE create_delivery_order_table; + + SET @create_delivery_order_item_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS delivery_order_item_', i, + " + ( + `delivery_order_item_id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `delivery_order_id` bigint DEFAULT NULL COMMENT '订单物流包裹id', + `img_url` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品图片', + `spu_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `count` int DEFAULT '0' COMMENT '商品数量', + `supplier_img_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '供应商商品图片', + `supplier_spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '供应商商品名称', + PRIMARY KEY (`delivery_order_item_id`), + KEY `idx_order_delivery_id` (`delivery_order_id`) + ) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='物流订单项信息' + " + ); + PREPARE create_delivery_order_item_table FROM @create_delivery_order_item_table; + EXECUTE create_delivery_order_item_table; + + + SET @create_order_refund_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_', i, + " + ( + `refund_id` bigint NOT NULL COMMENT '记录ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint NOT NULL COMMENT '店铺ID', + `user_id` bigint NOT NULL COMMENT '买家ID', + `order_id` bigint NOT NULL COMMENT '订单号', + `order_item_id` bigint NOT NULL DEFAULT '0' COMMENT '订单项ID(0:为全部订单项)', + `refund_count` int DEFAULT '0' COMMENT '退货数量(0:为全部订单项)', + `refund_score` bigint DEFAULT NULL COMMENT '退还积分', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `platform_refund_commission` bigint DEFAULT NULL COMMENT '平台佣金退款金额', + `platform_refund_amount` bigint DEFAULT NULL COMMENT '平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)', + `distribution_total_amount` bigint DEFAULT NULL COMMENT '退款单总分销金额', + `refund_type` tinyint NOT NULL DEFAULT '0' COMMENT '退款单类型(1:整单退款,2:单个物品退款)', + `apply_type` tinyint NOT NULL COMMENT '申请类型:1,仅退款,2退款退货', + `pay_sys_type` tinyint NOT NULL DEFAULT '0' COMMENT '支付系统类型 0默认1通联支付', + `is_received` tinyint DEFAULT NULL COMMENT '是否接收到商品(1:已收到,0:未收到)', + `close_type` tinyint DEFAULT NULL COMMENT '退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)', + `return_money_sts` tinyint NOT NULL DEFAULT '0' COMMENT '处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType', + `buyer_reason` tinyint DEFAULT NULL COMMENT '申请原因(具体见BuyerReasonType)', + `buyer_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请说明', + `buyer_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式(退款时留下的手机号码)', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + `over_time` datetime DEFAULT NULL COMMENT '超时时间(超过该时间不处理,系统将自动处理)(保留字段)', + `reject_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拒绝原因', + `seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '卖家备注', + `shop_seller_msg` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家备注(移交供应商处理时保存)', + `handel_time` datetime DEFAULT NULL COMMENT '受理时间', + `supplier_time` datetime DEFAULT NULL COMMENT '移交供应商时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `receive_time` datetime DEFAULT NULL COMMENT '收货时间', + `close_time` datetime DEFAULT NULL COMMENT '关闭时间', + `decision_time` datetime DEFAULT NULL COMMENT '确定时间(确定退款时间)', + `refund_time` datetime DEFAULT NULL COMMENT '退款时间', + `supplier_id` bigint NOT NULL DEFAULT '0' COMMENT '供应商id', + `supplier_handle_status` tinyint DEFAULT '-1' COMMENT '供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝', + `purchase_refund_amount` bigint DEFAULT '0' COMMENT '采购退款金额', + `pur_platform_refund_commission` bigint DEFAULT '0' COMMENT '采购的平台佣金退款金额', + `return_giveaway_ids` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款退回的赠品订单项ids', + `refund_actual_total` decimal(15,2) DEFAULT NULL COMMENT '当前退款的实付金额(实付金额减去不退回赠品的金额)', + `shop_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家/供应商文件凭证(逗号隔开)', + `platform_intervention_status` tinyint NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + `apply_intervention_reason` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由', + `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)', + `intervention_refund_type` tinyint DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款', + `after_intervention_refund_amount` bigint DEFAULT NULL COMMENT '平台介入前的退款金额', + `platform_message` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言', + `apply_intervention_time` datetime DEFAULT NULL COMMENT '申请介入时间', + `intervention_finish_time` datetime DEFAULT NULL COMMENT '介入完成时间', + PRIMARY KEY (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_order_item_id` (`order_item_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款记录信息' + " + ); + PREPARE create_order_refund_table FROM @create_order_refund_table; + EXECUTE create_order_refund_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_addr_', i, + " + ( + `refund_addr_id` bigint NOT NULL AUTO_INCREMENT COMMENT '物流ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `refund_id` bigint NOT NULL COMMENT '退款号', + `user_id` bigint NOT NULL COMMENT '买家ID', + `delivery_company_id` bigint DEFAULT NULL COMMENT '物流公司ID', + `delivery_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流公司名称', + `delivery_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '物流单号', + `consignee_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人姓名', + `consignee_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人电话(顺丰快递需要)', + `consignee_telephone` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人座机', + `consignee_post_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人邮政编码', + `consignee_addr` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件人地址', + `sender_mobile` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发送人手机号码', + `sender_remarks` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '买家备注', + `imgs` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片凭证', + PRIMARY KEY (`refund_addr_id`), + KEY `idx_shop_id` (`shop_id`), + KEY `idx_refund_id` (`refund_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_delivery_company_id` (`delivery_company_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户退货物流地址' + " + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_settlement_', i, + " + ( + `settlement_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '退款结算单据id', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `pay_id` bigint DEFAULT NULL COMMENT '订单支付单号', + `order_id` bigint DEFAULT NULL COMMENT '订单编号', + `refund_id` bigint DEFAULT NULL COMMENT '退款单编号(本系统退款单号)', + `user_id` bigint DEFAULT NULL COMMENT '用户ID', + `biz_refund_no` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信/支付宝退款单号(支付平台退款单号)', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式(1:微信支付 2支付宝支付)', + `refund_status` tinyint DEFAULT NULL COMMENT '退款状态(1:申请中 2:已完成 -1失败)', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `order_total_amount` bigint DEFAULT NULL COMMENT '订单总额', + `version` int DEFAULT '0' COMMENT '版本号', + PRIMARY KEY (`settlement_id`), + UNIQUE KEY `uni_refund_id` (`refund_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_biz_refund_no` (`biz_refund_no`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款支付结算单据' + " + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET @create_purchase_order_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_', i, + " + ( + `purchase_order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '采购id', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `deliver_time` datetime DEFAULT NULL COMMENT '送达时间', + `delivery_time` datetime DEFAULT NULL COMMENT '发货时间', + `supplier_id` bigint NOT NULL COMMENT '供应商id', + `total_amount` bigint NOT NULL COMMENT '总采购金额', + `total_stock` int NOT NULL COMMENT '总采购库存数量', + `actual_total_stock` int DEFAULT NULL COMMENT '实际总库存数量', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `employee_id` bigint DEFAULT NULL COMMENT '操作员工id', + `delivery_type` tinyint DEFAULT NULL COMMENT '配送类型 1:快递 2:自提 3:无需快递 4同城配送', + `purchase_order_addr_id` bigint DEFAULT NULL COMMENT '采购订单地址Id', + `voucher_img_urls` VARCHAR(1000) DEFAULT NULL COMMENT '付款凭证图片 多个图片逗号分隔', + `warehouse_id` bigint(0) NULL COMMENT '仓库id', + `supplier_warehouse_id` bigint(0) NULL COMMENT '供应商仓库id', + `stock_point_type` int(1) NULL COMMENT '库存点类型(1:仓库, 2:门店)', + PRIMARY KEY (`purchase_order_id`), + KEY `idx_supplier_id` (`supplier_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单' + " + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_lang_', i, + " + ( + `purchase_order_id` bigint NOT NULL, + `lang` tinyint NOT NULL, + `spu_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单-国际化' + " + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET @create_purchase_order_item_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT 'id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `purchase_order_id` bigint DEFAULT NULL COMMENT '采购订单id', + `spu_id` bigint DEFAULT NULL COMMENT '商品id', + `sku_id` bigint DEFAULT NULL COMMENT 'sku id', + `spu_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码', + `party_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku编码', + `pic` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品图片', + `purchase_amount` bigint DEFAULT NULL COMMENT '采购金额', + `purchase_price` bigint DEFAULT NULL COMMENT '采购价', + `purchase_stock` int DEFAULT NULL COMMENT '采购库存数量', + `actual_stock` int DEFAULT NULL COMMENT '实际库存数量', + `delivery_type` tinyint DEFAULT NULL COMMENT '订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)', + `status` tinyint DEFAULT NULL COMMENT '状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成', + `be_delivered_num` int DEFAULT NULL COMMENT '0全部发货 其他数量为剩余待发货数量', + PRIMARY KEY (`purchase_item_id`), + KEY `idx_purchase_order_id` (`purchase_order_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单项' + " + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_item_lang_', i, + " + ( + `purchase_item_id` bigint NOT NULL COMMENT '订单项ID', + `lang` tinyint NOT NULL COMMENT '语言 1.中文 2.英文', + `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `sku_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sku名称', + PRIMARY KEY (`purchase_item_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单项-国际化' + " + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS purchase_order_addr_', i, + " + ( + `purchase_order_addr_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺ID', + `consignee` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收货人', + `province_id` bigint DEFAULT NULL COMMENT '省ID', + `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省', + `city_id` bigint DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `area_id` bigint DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区', + `addr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址', + `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机', + PRIMARY KEY (`purchase_order_addr_id`), + KEY `idx_shop_id` (`shop_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='采购订单配送地址' + " + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET @add_allot_order = CONCAT( + 'CREATE TABLE IF NOT EXISTS `allot_order_', i, "` + ( + `allot_order_id` bigint(0) NOT NULL COMMENT '调拨订单id', + `out_warehouse_id` bigint(0) NULL DEFAULT NULL COMMENT '调出点仓库id', + `out_stock_point_type` int(0) NULL DEFAULT NULL COMMENT '调出点库存点类型(1:仓库, 2:门店)', + `in_warehouse_id` bigint(0) NULL DEFAULT NULL COMMENT '调入点仓库id', + `in_stock_point_type` int(0) NULL DEFAULT NULL COMMENT '调入点库存点类型(1:仓库, 2:门店)', + `dvy_company_id` bigint(0) NULL DEFAULT NULL COMMENT '物流公司id', + `dvy_type` int(0) NULL DEFAULT NULL COMMENT '物流方式(1:快递, 2:无需快递)', + `dvy_order_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '物流单号', + `status` int(0) NULL DEFAULT NULL COMMENT '状态(0:作废, 1:待入库, 2:部分入库, 3:已完成)', + `total_allot_count` int(0) NULL DEFAULT NULL COMMENT '总调拨数量', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `shop_id` bigint(0) NULL COMMENT '店铺id', + `sys_type` int(1) NULL COMMENT '系统类型', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`allot_order_id`) USING BTREE + ) + " ); + + PREPARE add_allot_order FROM @add_allot_order; + EXECUTE add_allot_order; + + SET @add_allot_order_item = CONCAT( + 'CREATE TABLE `allot_order_item_', i, + "` ( + `allot_order_item_id` bigint NOT NULL COMMENT '调拨订单商品id', + `allot_order_id` bigint NULL COMMENT '调拨订单id', + `spu_id` bigint NULL COMMENT '商品spuId', + `sku_id` bigint NULL COMMENT '商品skuId', + `allot_count` int(255) NULL COMMENT '调拨数量', + `allot_in_count` int(255) NULL COMMENT '调拨入库数量', + `create_time` datetime NULL COMMENT '创建时间', + `update_time` datetime NULL COMMENT '创建时间', + PRIMARY KEY (`allot_order_item_id`) + ) + " ); + PREPARE add_allot_order_item FROM @add_allot_order_item; + EXECUTE add_allot_order_item; + + SET i = i+1; + END WHILE; + + +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_payment; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<50 DO + SET @create_pay_info_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS pay_info_', i, + " + ( + `pay_id` bigint unsigned NOT NULL COMMENT '支付单号', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `user_id` bigint DEFAULT NULL COMMENT '用户id', + `order_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '本次支付关联的多个订单号', + `biz_pay_no` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '外部订单流水号', + `sys_type` tinyint DEFAULT NULL COMMENT '系统类型 见SysTypeEnum', + `pay_entry` tinyint DEFAULT NULL COMMENT '支付入口 0下单 1余额充值', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式 1 微信支付 2 支付宝', + `pay_status` tinyint DEFAULT NULL COMMENT '支付状态', + `pay_score` bigint DEFAULT NULL COMMENT '支付积分', + `pay_amount` bigint DEFAULT NULL COMMENT '支付金额', + `version` int DEFAULT NULL COMMENT '版本号', + `callback_content` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回调内容', + `callback_time` datetime DEFAULT NULL COMMENT '回调时间', + `confirm_time` datetime DEFAULT NULL COMMENT '确认时间', + `refund_id` bigint DEFAULT NULL COMMENT '本次支付关联的退款号', + `pay_sys_type` int DEFAULT NULL COMMENT '系统支付类型 0.默认支付系统 1.通联支付', + `to_user_id` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支付给商城的用户id,通联支付独有', + `system_model` tinyint DEFAULT NULL COMMENT '支付的系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios', + `biz_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '第三方系统userid', + PRIMARY KEY (`pay_id`), + KEY `idx_biz_pay_no` (`biz_pay_no`), + KEY `idx_user_id` (`user_id`), + KEY `idx_order_ids` (`order_ids`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单支付记录' + " + ); + PREPARE create_pay_info_table FROM @create_pay_info_table; + EXECUTE create_pay_info_table; + + + + + SET @create_refund_info_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS refund_info_', i, + " + ( + `refund_id` bigint unsigned NOT NULL COMMENT '退款单号', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `order_id` bigint DEFAULT NULL COMMENT '关联的支付订单id', + `pay_id` bigint NOT NULL DEFAULT '0' COMMENT '关联的支付单id', + `pay_type` tinyint DEFAULT NULL COMMENT '支付方式', + `user_id` bigint DEFAULT NULL COMMENT '用户id', + `refund_status` tinyint DEFAULT NULL COMMENT '退款状态', + `refund_amount` bigint DEFAULT NULL COMMENT '退款金额', + `callback_content` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回调内容', + `callback_time` datetime DEFAULT NULL COMMENT '回调时间', + PRIMARY KEY (`refund_id`,`pay_id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_pay_id` (`pay_id`), + KEY `idx_userid` (`user_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款信息' + " + ); + PREPARE create_refund_info_table FROM @create_refund_info_table; + EXECUTE create_refund_info_table; + + SET i = i+1; + END WHILE; + + +END// +CALL createTable()// +DELIMITER ; + + +# ============================== 5.统计数据到各个分表 ============================== +USE mall4cloud_order; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<50 DO + SET @create_allot_order_table = CONCAT( + 'INSERT INTO allot_order_', i, ' + (SELECT * FROM mall4cloud_order.`allot_order` WHERE (SUBSTRING(allot_order_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_allot_order_table FROM @create_allot_order_table; + EXECUTE create_allot_order_table; + + SET @create_allot_order_item_table = CONCAT( + 'INSERT INTO allot_order_item_', i, ' + (SELECT * FROM mall4cloud_order.`allot_order_item` WHERE (SUBSTRING(allot_order_item_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_allot_order_item_table FROM @create_allot_order_item_table; + EXECUTE create_allot_order_item_table; + + SET @create_delivery_order_table = CONCAT( + 'INSERT INTO delivery_order_', i, ' + (SELECT * FROM mall4cloud_order.`delivery_order` WHERE (SUBSTRING(delivery_order_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_delivery_order_table FROM @create_delivery_order_table; + EXECUTE create_delivery_order_table; + + SET @create_delivery_order_item_table = CONCAT( + 'INSERT INTO delivery_order_item_', i, ' + (SELECT * FROM mall4cloud_order.`delivery_order_item` WHERE (SUBSTRING(delivery_order_item_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_delivery_order_item_table FROM @create_delivery_order_item_table; + EXECUTE create_delivery_order_item_table; + + SET @create_order_table = CONCAT( + 'INSERT INTO order_', i, ' + (SELECT * FROM mall4cloud_order.`order` WHERE (SUBSTRING(order_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_order_table FROM @create_order_table; + EXECUTE create_order_table; + + SET @create_order_addr_table = CONCAT( + 'INSERT INTO order_addr_', i, ' + (SELECT * FROM mall4cloud_order.`order_addr` WHERE (SUBSTRING(order_addr_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_order_addr_table FROM @create_order_addr_table; + EXECUTE create_order_addr_table; + + SET @create_order_invoice_table = CONCAT( + 'INSERT INTO order_invoice_', i, ' + (SELECT * FROM mall4cloud_order.`order_invoice` WHERE (SUBSTRING(order_invoice_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_order_invoice_table FROM @create_order_invoice_table; + EXECUTE create_order_invoice_table; + + SET @create_order_item_table = CONCAT( + 'INSERT INTO order_item_', i, ' + (SELECT * FROM mall4cloud_order.`order_item` WHERE (SUBSTRING(order_item_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_order_item_table FROM @create_order_item_table; + EXECUTE create_order_item_table; + + SET @create_order_item_lang_table = CONCAT( + 'INSERT INTO order_item_lang_', i, ' + (SELECT * FROM mall4cloud_order.`order_item_lang` WHERE (SUBSTRING(order_item_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_order_item_lang_table FROM @create_order_item_lang_table; + EXECUTE create_order_item_lang_table; + + SET @create_order_pre_sale_info_table = CONCAT( + 'INSERT INTO order_pre_sale_info_', i, ' + (SELECT * FROM mall4cloud_order.`order_pre_sale_info` WHERE (SUBSTRING(order_pre_sale_info_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_order_pre_sale_info_table FROM @create_order_pre_sale_info_table; + EXECUTE create_order_pre_sale_info_table; + + SET @create_refund_info_table = CONCAT( + 'INSERT INTO order_refund_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund` WHERE (SUBSTRING(user_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_refund_info_table FROM @create_refund_info_table; + EXECUTE create_refund_info_table; + + SET @create_order_refund_addr_table = CONCAT( + 'INSERT INTO order_refund_addr_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_addr` WHERE (SUBSTRING(user_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_order_refund_addr_table FROM @create_order_refund_addr_table; + EXECUTE create_order_refund_addr_table; + + SET @create_order_refund_intervention_table = CONCAT( + 'INSERT INTO order_refund_intervention_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_intervention` WHERE (SUBSTRING(refund_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; + EXECUTE create_order_refund_intervention_table; + + SET @create_order_refund_settlement_table = CONCAT( + 'INSERT INTO order_refund_settlement_', i, ' + (SELECT * FROM mall4cloud_order.`order_refund_settlement` WHERE (SUBSTRING(user_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_order_refund_settlement_table FROM @create_order_refund_settlement_table; + EXECUTE create_order_refund_settlement_table; + + SET @create_order_self_station_table = CONCAT( + 'INSERT INTO order_self_station_', i, ' + (SELECT * FROM mall4cloud_order.`order_self_station` WHERE (SUBSTRING(order_self_station_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_order_self_station_table FROM @create_order_self_station_table; + EXECUTE create_order_self_station_table; + + SET @create_order_settlement_table = CONCAT( + 'INSERT INTO order_settlement_', i, ' + (SELECT * FROM mall4cloud_order.`order_settlement` WHERE (SUBSTRING(settlement_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_order_settlement_table FROM @create_order_settlement_table; + EXECUTE create_order_settlement_table; + + SET @create_order_virtual_info_table = CONCAT( + 'INSERT INTO order_virtual_info_', i, ' + (SELECT * FROM mall4cloud_order.`order_virtual_info` WHERE (SUBSTRING(order_virtual_info_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_order_virtual_info_table FROM @create_order_virtual_info_table; + EXECUTE create_order_virtual_info_table; + + SET @create_purchase_order_table = CONCAT( + 'INSERT INTO purchase_order_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_purchase_order_table FROM @create_purchase_order_table; + EXECUTE create_purchase_order_table; + + SET @create_purchase_order_addr_table = CONCAT( + 'INSERT INTO purchase_order_addr_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_addr` WHERE (SUBSTRING(purchase_order_addr_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_purchase_order_addr_table FROM @create_purchase_order_addr_table; + EXECUTE create_purchase_order_addr_table; + + SET @create_purchase_order_item_table = CONCAT( + 'INSERT INTO purchase_order_item_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_purchase_order_item_table FROM @create_purchase_order_item_table; + EXECUTE create_purchase_order_item_table; + + SET @create_purchase_order_item_lang_table = CONCAT( + 'INSERT INTO purchase_order_item_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_item_lang` WHERE (SUBSTRING(purchase_item_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_purchase_order_item_lang_table FROM @create_purchase_order_item_lang_table; + EXECUTE create_purchase_order_item_lang_table; + + SET @create_purchase_order_lang_table = CONCAT( + 'INSERT INTO purchase_order_lang_', i, ' + (SELECT * FROM mall4cloud_order.`purchase_order_lang` WHERE (SUBSTRING(purchase_order_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_purchase_order_lang_table FROM @create_purchase_order_lang_table; + EXECUTE create_purchase_order_lang_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +USE mall4cloud_payment; +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<25 DO + SET @create_pay_info_table = CONCAT( + 'INSERT INTO pay_info_', i, ' + (SELECT * FROM mall4cloud_payment.`pay_info` WHERE (SUBSTRING(pay_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_pay_info_table FROM @create_pay_info_table; + EXECUTE create_pay_info_table; + + SET @create_refund_info_table = CONCAT( + 'INSERT INTO refund_info_', i, ' + (SELECT * FROM mall4cloud_payment.`refund_info` WHERE (SUBSTRING(refund_id, -3) + 0) % 50 = ', i, ' )' + ); + PREPARE create_refund_info_table FROM @create_refund_info_table; + EXECUTE create_refund_info_table; + + SET i = i+1; + END WHILE; +END// +CALL createTable()// +DELIMITER ; + +# ============================== 6.修改shardingsphere、canal配置 ============================== +# 1.修改shardingsphere配置,具体参考mall4cloud-doc文档/开发环境搭建/中间件docker-compse一键安装/shardingsphere/conf + +# 2.修改canal配置 +# 修改canal下/conf/example/instance.properties文件中的canal.instance.filter.regex,替换成下述内容 +# canal.instance.filter.regex=mall4cloud_product.spu:*,mall4cloud_product.category:*,mall4cloud_product.brand:*,mall4cloud_product.spu_tag_reference:*,mall4cloud_admin.shop_detail:*,mall4cloud_product.spu_extension:*,mall4cloud_product.sku:*,mall4cloud_product.sku_stock:*,mall4cloud_marketing.distribution_spu:*,mall4cloud_order+.order_[0-9]+:*,mall4cloud_order+.order_refund_[0-9]+:*,mall4cloud_order+.purchase_order_[0-9]+:*,mall4cloud_order+.order_invoice_[0-9]+:*,mall4cloud_order+.allot_order_[0-9]+:*,\ +# 修改后重启canal + +# ============================== 7.删除总表中数据 ============================== +# 确保6.7.执行 成功 执行一次后,检查是否数据已经同步到各个分表中去,再执行下面的sql +USE mall4cloud_order; +DROP TABLE IF EXISTS `allot_order`; +DROP TABLE IF EXISTS `allot_order_item`; +DROP TABLE IF EXISTS `delivery_order`; +DROP TABLE IF EXISTS `delivery_order_item`; +DROP TABLE IF EXISTS `order`; +DROP TABLE IF EXISTS `order_addr`; +DROP TABLE IF EXISTS `order_invoice`; +DROP TABLE IF EXISTS `order_item`; +DROP TABLE IF EXISTS `order_item_lang`; +DROP TABLE IF EXISTS `order_pre_sale_info`; +DROP TABLE IF EXISTS `order_refund`; +DROP TABLE IF EXISTS `order_refund_addr`; +DROP TABLE IF EXISTS `order_refund_intervention`; +DROP TABLE IF EXISTS `order_refund_settlement`; +DROP TABLE IF EXISTS `order_self_station`; +DROP TABLE IF EXISTS `order_settlement`; +DROP TABLE IF EXISTS `order_virtual_info`; +DROP TABLE IF EXISTS `purchase_order`; +DROP TABLE IF EXISTS `purchase_order_addr`; +DROP TABLE IF EXISTS `purchase_order_item`; +DROP TABLE IF EXISTS `purchase_order_item_lang`; +DROP TABLE IF EXISTS `purchase_order_lang`; + +USE mall4cloud_payment; +DROP TABLE IF EXISTS `pay_info`; +DROP TABLE IF EXISTS `refund_info`; \ No newline at end of file diff --git a/db/stock-vue3更新.sql b/db/stock-vue3更新.sql new file mode 100644 index 0000000..c52cc5c --- /dev/null +++ b/db/stock-vue3更新.sql @@ -0,0 +1,199 @@ +# 本次更新修改了很多东西 +# 1. 更新到springboot3,spring cloud 2022, 使用jdk17。vue从vue2更新到vue3。 +# 2. 将数据分析的数据全部存入到mongodb,而不是mysql +# +# 3. 使用dubbo代替openfeign +# 3.1 在nacos中的 application.yml的移除所有关于openfeign的配置 +# 3.2 在nacos中的 application.yml的增加关于dubbo的配置(dubbo因为要本地调试,所以在开发环境可以加多个dubbo本地的负载均衡配置dubbo.consumer.loadbalance=dev) +# dubbo: +# application: +# name: ${spring.cloud.nacos.discovery.namespace}-${spring.application.name}-dubbo-server +# register-mode: instance +# service-discovery: +# migration: FORCE_APPLICATION +# protocol: +# name: dubbo +# serialization: fastjson2 +# provider: +# token: true +# registry: +# # 配置dubbo的注册中心为nacos +# address: nacos://${spring.cloud.nacos.discovery.server-addr} +# # group: ${spring.cloud.nacos.discovery.namespace}-dubbo +# username: ${spring.cloud.nacos.discovery.username} +# password: ${spring.cloud.nacos.discovery.password} +# timeout: 50000 +# parameters: +# namespace: ${spring.cloud.nacos.discovery.namespace} +# consumer: +# check: false +# timeout: 50000 +# #指定服务提供者的namespace +# provider-namespace: ${spring.cloud.nacos.discovery.namespace} +# +# 4. 删除所有数据库关于库存的记录,统一存在redis,增加一台redis机器,专门用来存商品库存的。一定要有个额外的redis,不然清理缓存之后库存数据再也找不回来了。 +# 4.1 在nacos的mall4cloud-seckill.yml 加入如下配置(可以为秒杀增加多台redis) +# redis: +# multi: +# enable: true +# password: hn02le.34lkdLKD +# database: 0 +# redisAddrs: +# - 192.168.193.128:31377 +# 4.2 在nacos的mall4cloud-product.yml 加入如下配置 (只能增加一台用于aof的redis) +# redis: +# aof: +# enable: true +# password: hn02le.34lkdLKD +# database: 0 +# redisAddr: 192.168.193.128:31377 +# +# 在服务器增加一台redis-aof的机器,并且配置aof的配置,详细见一键安装的部署文档docker-compose +# +# 5. 移除@ParameterObject 的注解,需要在nacos中的 application.yml的增加关于springdoc的配置。 +# springdoc: +# # 默认是false,需要设置为true +# default-flat-param-object: true +# +# 6. 支付证书从路径的形式改成读取证书内容的形式 +# 6.1.平台端 -> 系统 -> 系统设置 -> 支付配置 -> (微信配置 or 支付宝配置) +# 6.2.将支付宝支付 or 微信v3支付的对应证书的路径,修改为对应证书的内容(鼠标右键 -> 打开方式 -> 记事本打开 -> 将内容复制并填写进对应的输入框) +# +# 7. rocketmq使用rocketmq5.0 在阿里云服务器购买rocketmq5价格巨量降低 +# +# +# +# 8.修改knife4j版本到4.3.0,移除nacos当中gateway.yml 的openapi配置 +# - id: openapi +# uri: lb://mall4cloud-gateway +# predicates: +# - Path=/v3/api-docs/** +# filters: +# - RewritePath=/v3/api-docs/(?.*), /$\{path}/v3/api-docs +# - AddBasePath +# 增加knife4j配置 +# knife4j: +# gateway: +# enabled: true +# strategy: discover +# discover: +# version: openapi3 +# enabled: true +# 增加application.yml的springdoc配置 +#springdoc: +# api-docs: +# path: /v3/api-docs/default +# 9.数据分析的数据放入mongodb。在mall4cloud-flow.yml加入以下配置 +# data: +# mongodb: +# host: 192.168.193.128 +# port: 27017 +# database: mall4cloud +# username: mall4cloud +# password: mall4cloud +# authentication-database: mall4cloud +# 10. 直播使用阿里云直播。未开通小程序直播插件可以在app和h5进行直播。开通小程序直播插件后可以在app、h5以及小程序进行直播。 + + + + + +USE mall4cloud_product; + +ALTER TABLE `sku` ADD COLUMN `stock_warning_status` tinyint NOT NULL DEFAULT '0' COMMENT '库存预警状态 0:库存充足 1:库存预警'; +ALTER TABLE `sku` MODIFY `stock_warning` BIGINT DEFAULT NULL COMMENT '设置库存预警的数量'; + + + +USE mall4cloud_nacos; +UPDATE config_info +set content = '# 数据源\nspring:\n profiles:\n active: dev\n #避免nacos取网卡出错\n cloud:\n inetutils:\n preferred-networks: 10.1.\n datasource:\n driver-class-name: com.mysql.cj.jdbc.Driver\n type: com.zaxxer.hikari.HikariDataSource\n hikari:\n minimum-idle: 0\n maximum-pool-size: 20\n idle-timeout: 25000\n auto-commit: true\n connection-test-query: SELECT 1\n data:\n redis:\n host: 192.168.193.128\n password: hn02le.34lkdLKD\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n\nspringdoc:\n # 默认是false,需要设置为true\n default-flat-param-object: true\n \n#mybatis的相关配置\nmybatis:\n #mapper配置文件\n mapper-locations: classpath:mapper/*Mapper.xml\n type-aliases-package: com.moyuer.cloud.**.model\n #开启驼峰命名\n configuration:\n map-underscore-to-camel-case: true\n\nseata:\n config:\n type: nacos\n nacos:\n namespace: 05b1150e-9306-474c-90e1-ed4852c21475\n dataId: \"seataServer.properties\"\n server-addr: ${spring.cloud.nacos.discovery.server-addr}\n password: ${spring.cloud.nacos.discovery.password}\n username: ${spring.cloud.nacos.discovery.username}\n registry:\n type: nacos\n nacos:\n server-addr: ${spring.cloud.nacos.discovery.server-addr}\n password: ${spring.cloud.nacos.discovery.password}\n username: ${spring.cloud.nacos.discovery.username}\n namespace: ${seata.config.nacos.namespace}\n\nlogging:\n level:\n root: info\n com:\n mall4j:\n cloud: debug\n\n# 分页合理化,当查询到页码大于最后一页的时候,返回最后一页的数据,防止vue在最后一页删除时,数据不对的问题\npagehelper:\n reasonable: true\n\nbiz:\n oss:\n # 文件上传类型 0.阿里云 1.minio\n type: 1\n # 资源url,图片域名(阿里云的resources-url是带有bucket的那个url)\n # resources-url: http://mall4cloud.oss-cn-shenzhen.aliyuncs.com\n # endpoint: https://oss-cn-shenzhen.aliyuncs.com\n # bucket: mall4cloud\n # access-key-id: key\n # access-key-secret: secret\n # resources-url是带有bucket的\n resources-url: http://192.168.193.128:9000/mall4cloud\n endpoint: http://192.168.193.128:9000\n bucket: mall4cloud\n access-key-id: admin\n access-key-secret: admin123456\n\n\ndubbo:\n application:\n name: ${spring.cloud.nacos.discovery.namespace}-${spring.application.name}-dubbo-server\n register-mode: instance\n service-discovery:\n migration: FORCE_APPLICATION\n protocol:\n name: dubbo\n serialization: fastjson2\n registry:\n # 配置dubbo的注册中心为nacos\n address: nacos://${spring.cloud.nacos.discovery.server-addr}\n username: ${spring.cloud.nacos.discovery.username}\n password: ${spring.cloud.nacos.discovery.password}\n consumer:\n check: false\n loadbalance: dev\n\nmall4cloud:\n job:\n accessToken: default_token\n logPath: /data/applogs/xxl-job/jobhandler\n admin:\n addresses: http://192.168.193.128:8080/xxl-job-admin\n expose:\n permission: true\n\nrocketmq:\n name-server: 192.168.193.128:9876\n\nsa-token:\n # token名称 (同时也是cookie名称)\n token-name: authorization\n # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)\n is-concurrent: true\n # 在多人登录同一账号时,是否共用一个token(不共用,避免登出时导致其他用户也登出)\n is-share: false\n # token风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)\n token-style: uuid\n # 是否输出操作日志\n is-log: false' +where data_id = "application.yml"; + + +UPDATE config_info +set content = PERLACE(content, 'elastic:\n # elastic的地址\n address:', 'spring:\n elasticsearch:\n uris:') +where data_id = "mall4cloud-search.yml"; + + + + + +USE mall4cloud_leaf; + +insert into `leaf_alloc` (`biz_tag`, `max_id`, `step`, `update_time`, `description`, `random_step`) values +('mall4cloud-flow-user-id','1','100','2023-08-01 10:01:43','mall4cloud-flow的用户操作编号','10'); + + + +USE mall4cloud_job; + +insert into `xxl_job_info` (`job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`, `trigger_status`, `trigger_last_time`, `trigger_next_time`) values +(11,'处理sku库存的变化','2023-08-16 09:56:14','2023-08-16 09:56:20','admin','','CRON','0/5 * * * * ?','DO_NOTHING','FIRST','handleSkuStockChange','','DISCARD_LATER','0','0','BEAN','','GLUE代码初始化','2023-08-16 09:56:14','',1,1692234575000,1692234580000), +(11,'初始化库存','2023-07-10 09:51:23','2023-07-10 09:52:03','admin','','CRON','0 * * * * ?','DO_NOTHING','FIRST','intiStock','','SERIAL_EXECUTION','0','0','BEAN','','GLUE代码初始化','2023-07-10 09:51:23','','0','0','0'); + +# 如需配置阿里直播,需要看下mall4cloud-doc这个项目下的 基本开发文档-阿里视频直播配置文档,参照文档进行配置 +# 清除微信直播的定时任务 +DELETE +FROM xxl_job_info +WHERE executor_handler IN + ('synchronousWxLiveProds', 'offShelfLiveProds', 'synchronousWxLiveRoom', 'synchronousWxLiveUsers'); +# 新增阿里直播定时任务 +insert into `xxl_job_info`(`job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, + `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, + `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, + `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`, + `trigger_status`, `trigger_last_time`, `trigger_next_time`) +values (5, '定时改变直播间状态', '2023-07-21 17:08:16', '2023-07-24 10:24:59', 'admin', '', 'CRON', '0 0/30 * * * ? ', + 'DO_NOTHING', 'FIRST', 'changeLiveRoomStatus', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', + '2023-07-21 17:08:16', '', 1, 0, 0); + +USE mall4cloud_marketing; +# 清除没有用的直播相关表格 +DROP TABLE IF EXISTS `live_user`; +DROP TABLE IF EXISTS `live_log`; +DROP TABLE IF EXISTS `live_prod_log`; +DROP TABLE IF EXISTS `live_prod_store`; +DROP TABLE IF EXISTS `live_room_back`; + +# 更改直播间和直播商品表,请注意,当前直播间信息将会全部删除! +DROP TABLE IF EXISTS `live_room`; +CREATE TABLE `live_room` +( + `room_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '直播间信息', + `shop_id` BIGINT DEFAULT NULL COMMENT '店铺id', + `name` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '直播间名称', + `user_id` BIGINT DEFAULT NULL COMMENT '主播用户id', + `live_status` TINYINT NOT NULL COMMENT '直播间状态 0.未开始 1.直播中 2.已结束 3.暂停中 -1.违规下架', + `cover_img` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '直播背景图', + `share_img` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主播分享图', + `feeds_img` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '直播封面图', + `room_top` TINYINT DEFAULT '0' COMMENT '是否置顶 1.是 0.不是', + `start_time` DATETIME DEFAULT NULL COMMENT '直播开始时间', + `end_time` DATETIME DEFAULT NULL COMMENT '直播结束时间', + `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `remark` VARCHAR(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '下线备注', + PRIMARY KEY (`room_id`) +) ENGINE = INNODB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci COMMENT ='直播间'; + +DROP TABLE IF EXISTS `live_room_prod`; +CREATE TABLE `live_room_prod` +( + `room_prod_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '直播间商品信息', + `spu_id` BIGINT NOT NULL COMMENT '商品id', + `room_id` BIGINT NOT NULL COMMENT '房间id', + `explain_status` TINYINT DEFAULT '0' COMMENT '讲解状态 0未讲解 1讲解中', + PRIMARY KEY (`room_prod_id`) +) ENGINE = INNODB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci COMMENT ='直播商品'; + +USE mall4cloud_admin; +# 添加阿里直播配置 +INSERT INTO `sys_config` (`param_key`, `param_value`, `remark`) +VALUES ('ALI_LIVE_CONFIG', + '{\"pushDomain\":\"\",\"pullDomain\":\"\",\"appName\":\"\",\"pushAuthKey\":\"\",\"pullAuthKey\":\"\",\"isHttps\":\"\"}', + '直播配置'); diff --git a/es/2023-10-16-订单退款平台介入字段.md b/es/2023-10-16-订单退款平台介入字段.md new file mode 100644 index 0000000..8be2141 --- /dev/null +++ b/es/2023-10-16-订单退款平台介入字段.md @@ -0,0 +1,40 @@ +# 增加订单退款相关平台介入字段 + +``` +PUT order-refund/_mapping/_doc?include_type_name=true +{ + "properties": { + "shopImgUrls": { + "type": "keyword", + "index": false, + "doc_values": false + }, + "applyInterventionImgUrls": { + "type": "keyword", + "index": false, + "doc_values": false + }, + "platformInterventionStatus": { + "type": "integer" + }, + "applyInterventionReason": { + "type": "text" + }, + "interventionRefundType": { + "type": "integer" + }, + "afterInterventionRefundAmount": { + "type": "long" + }, + "platformMessage": { + "type": "text" + }, + "applyInterventionTime": { + "type": "date" + }, + "interventionFinishTime": { + "type": "date" + } + } +} +``` diff --git a/es/2023-12-18-商品名称模糊搜索字段.md b/es/2023-12-18-商品名称模糊搜索字段.md new file mode 100644 index 0000000..1fcb200 --- /dev/null +++ b/es/2023-12-18-商品名称模糊搜索字段.md @@ -0,0 +1,15 @@ +# 增加订单退款相关平台介入字段 + +``` +PUT product/_mapping/_doc?include_type_name=true +{ + "properties": { + "spuNameLikeZh" : { + "type" : "wildcard" + }, + "spuNameLikeEn" : { + "type" : "wildcard" + } + } +} +``` diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4e46c6d --- /dev/null +++ b/pom.xml @@ -0,0 +1,482 @@ + + + 4.0.0 + + com.moyuer.cloud + tmerclub + 0.0.1 + + tmerclub-gateway + tmerclub-auth + tmerclub-common + tmerclub-api + tmerclub-admin + tmerclub-biz + tmerclub-product + tmerclub-search + tmerclub-user + tmerclub-order + tmerclub-marketing + tmerclub-payment + tmerclub-group + tmerclub-seckill + tmerclub-flow + tmerclub-im + + + pom + + + + UTF-8 + 3.12.0 + 3.3.1 + 17 + + + 3.1.7 + 2022.0.4 + 2022.0.0.0 + 3.2.10 + + + 2.0.0 + 2.2.4 + + 2.4.0 + + + 5.8.24 + 3.0.3 + 2.1.0 + 1.3.0 + 4.3.0 + 7.17.5 + 3.25.2 + 2.2.3 + 3.3.3 + 5.2.3 + 33.0.0-jre + 4.6.0 + 4.6.4 + 4.38.183.ALL + 3.9.43 + 1.2.83 + 2.0.44 + 2.7.0 + 2.14.3 + 2.20.0 + 1.37.0 + 3.23.4 + 2.2.0 + 2.0.4 + 3.0.6 + 2.21.5 + + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring-cloud-alibaba.version} + pom + import + + + org.apache.dubbo + dubbo-bom + ${dubbo.version} + pom + import + + + com.alibaba.nacos + nacos-client + ${nacos.version} + + + io.seata + seata-spring-boot-starter + ${seata.version} + + + com.alibaba + druid + + + + + com.xuxueli + xxl-job-core + ${xxl-job.version} + + + + com.google.guava + guava + ${guava.version} + + + com.github.binarywang + weixin-java-miniapp + ${weixin.version} + + + com.github.binarywang + weixin-java-mp + ${weixin.version} + + + com.github.binarywang + weixin-java-pay + ${weixin.version} + + + javax.servlet + javax.servlet-api + + + + + com.aliyun + aliyun-java-sdk-core + ${aliyun-core.version} + + + com.alipay.sdk + alipay-sdk-java + ${alipay.version} + + + com.aliyun + aliyun-java-sdk-live + ${alilive.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + com.alibaba.fastjson2 + fastjson2 + ${fastjson2.version} + + + cn.hutool + hutool-core + ${hutool.version} + + + cn.hutool + hutool-crypto + ${hutool.version} + + + cn.hutool + hutool-http + ${hutool.version} + + + cn.hutool + hutool-extra + ${hutool.version} + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis-spring-boot-starter.version} + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper-spring-boot-starter.version} + + + com.anji-plus + captcha + ${captcha.version} + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + ${knife4j.version} + + + org.projectlombok + lombok + + + + + com.github.xiaoymin + knife4j-gateway-spring-boot-starter + ${knife4j.version} + + + org.projectlombok + lombok + + + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + ${elasticsearch.version} + + + org.elasticsearch + elasticsearch + ${elasticsearch.version} + + + org.redisson + redisson-spring-boot-starter + ${redisson-version} + + + org.elasticsearch.client + elasticsearch-rest-client + ${elasticsearch.version} + + + commons-logging + commons-logging + + + + + org.apache.rocketmq + rocketmq-spring-boot-starter + ${rocketmq-springboot.version} + + + com.alibaba + easyexcel + ${easyexcel.version} + + + org.apache.poi + poi + + + org.apache.poi + poi-ooxml + + + org.apache.poi + poi-ooxml-schemas + + + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-ooxml + ${poi.version} + + + org.apache.poi + poi-ooxml-schemas + ${poi.version} + + + com.alibaba + transmittable-thread-local + ${transmittable-thread-local.version} + + + org.apache.logging.log4j + log4j-to-slf4j + ${log4j.version} + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + org.apache.logging.log4j + log4j-api + ${log4j.version} + + + org.springframework.boot + spring-boot-starter-data-mongodb + ${spring-boot.version} + + + org.lionsoul + ip2region + ${ip2region.version} + + + cn.dev33 + sa-token-spring-boot3-starter + ${satoken.version} + + + cn.dev33 + sa-token-redis-fastjson2 + ${satoken.version} + + + cn.dev33 + sa-token-dubbo3 + ${satoken.version} + + + com.google.protobuf + protobuf-java + ${protobuf.version} + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + ${springdoc.version} + + + org.springdoc + springdoc-openapi-starter-common + ${springdoc.version} + + + org.springdoc + springdoc-openapi-starter-webflux-ui + ${springdoc-webflux.version} + + + software.amazon.awssdk + s3 + ${aws-s3.version} + + + + com.lzhpo + logging-tracer-dubbo-adapter + ${logging-tracer.version} + + + org.projectlombok + lombok + + + cn.hutool + hutool-all + + + + + + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + + aliyun-plugin + https://maven.aliyun.com/repository/public + + true + + + false + + + + + + + + aliyun + aliyun + https://maven.aliyun.com/nexus/content/groups/public + + + + + ${project.name} + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + true + + + + + + repackage + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + ${project.encoding} + true + true + + + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-plugin.version} + + ${project.encoding} + + xdb + + + + + + + src/main/resources + true + + + + diff --git a/system-test/pom.xml b/system-test/pom.xml new file mode 100644 index 0000000..37e4f7c --- /dev/null +++ b/system-test/pom.xml @@ -0,0 +1,98 @@ + + + 4.0.0 + + com.moyuer.cloud + mall4cloud + 0.0.1 + + + system-test + mall4cloud test服务 用于做系统测试的模块 + jar + + + + + com.moyuer.cloud + mall4cloud-user + ${project.version} + compile + + + com.moyuer.cloud + mall4cloud-search + ${project.version} + compile + + + com.moyuer.cloud + mall4cloud-marketing + ${project.version} + compile + + + com.moyuer.cloud + mall4cloud-admin + ${project.version} + compile + + + com.moyuer.cloud + mall4cloud-biz + ${project.version} + compile + + + com.moyuer.cloud + mall4cloud-order + ${project.version} + compile + + + com.moyuer.cloud + mall4cloud-product + ${project.version} + compile + + + org.testng + testng + 7.5 + + + + org.uncommons + reportng + 1.1.2 + test + + + + org.testng + testng + + + + + com.moyuer.cloud + mall4cloud-group + 0.0.1 + compile + + + com.moyuer.cloud + mall4cloud-payment + ${project.version} + compile + + + com.moyuer.cloud + mall4cloud-seckill + 0.0.1 + compile + + + \ No newline at end of file diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/AddrApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/AddrApi.java new file mode 100644 index 0000000..c4d7671 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/AddrApi.java @@ -0,0 +1,51 @@ +package com.tmerclub.cloud.systemtest.api.amount; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.common.order.vo.UserAddrVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; +import com.tmerclub.cloud.user.dto.UserAddrDTO; + +import java.util.List; + +/** + * @author lanhai + */ +public class AddrApi { + public static void addAddr(UserAddrDTO userAddrDTO){ + String url = Constant.API_URL + "/mall4cloud_user/user_addr"; + HttpUtil.post(url, userAddrDTO, UrlEnum.API); + } + + public static List dvyList(){ + String url = Constant.API_URL + "/mall4cloud_user/user_addr/list"; + List list = HttpUtil.get(url, List.class, UrlEnum.API); + return JSON.parseArray(JSON.toJSONString(list), UserAddrVO.class); + } +// public static UserAddrVO addrInfo(Long addrId) { +// String url = Constant.API_URL + "/mall4cloud_user/user_addr?addrId=" + addrId; +// return HttpUtil.get(url, UserAddrVO.class, UrlEnum.API); +// } + + public static void updateAddr(UserAddrDTO userAddrDTO){ + String url = Constant.API_URL + "/mall4cloud_user/user_addr"; + HttpUtil.put(url, userAddrDTO, UrlEnum.API); + } + +// public static void deleteDvy(Long addrId){ +// String url = Constant.API_URL +"/p/address/deleteAddr/{addrId}"; +// HttpUtil.delete(url); +// } +// +// public static List refundAddrList(){ +// String url = Constant.SHOP_URL + "/shop/refundAddr/list"; +// List list = HttpUtil.get(url, List.class); +// return JSON.parseArray(JSON.toJSONString(list), RefundAddr.class); +// } +// +// public static void addRefundAddr(RefundAddr refundAddr){ +// String url = Constant.SHOP_URL + "/shop/refundAddr"; +// HttpUtil.post(url,refundAddr); +// } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/GiveawayApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/GiveawayApi.java new file mode 100644 index 0000000..3e18964 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/GiveawayApi.java @@ -0,0 +1,58 @@ +//package com.tmerclub.cloud.systemtest.api.amount; +// +//import com.alibaba.fastjson2.JSON; +//import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +//import com.yami.shop.bean.model.Giveaway; +//import com.yami.shop.common.util.Json; +//import com.yami.shop.systemtest.constants.Constant; +//import com.yami.shop.systemtest.util.HttpUtil; +// +//import java.util.List; +// +///** +// * @author lpj +// */ +//public class GiveawayApi { +// +// /** +// * 分页获取赠品信息 +// */ +// public static List getGiveawayPage() { +// String url = Constant.SHOP_URL + "/shop/giveaway/page"; +// return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, Page.class)), Page.class).getRecords()), Giveaway.class); +// } +// +// /** +// * 通过id查询赠品 +// */ +// public static Giveaway getGiveawayInfo(Long giveawayId) { +// String url = Constant.SHOP_URL + "/shop/giveaway/info/" + giveawayId; +// return HttpUtil.get(url, Giveaway.class); +// } +// +// /** +// * 新增赠品 +// */ +// public static void addGiveaway(Giveaway giveaway) { +// String url = Constant.SHOP_URL + "/shop/giveaway"; +// HttpUtil.post(url, giveaway); +// } +// +// /** +// * 修改赠品 +// */ +// public static void updateGiveaway(Giveaway giveaway) { +// String url = Constant.SHOP_URL + "/shop/giveaway"; +// HttpUtil.put(url, giveaway); +// } +// +// +// /** +// * 修改赠品活动状态(失效/删除赠品活动) +// */ +// public static void updateGiveawayStatus(Integer status, Long giveawayId) { +// String url = Constant.SHOP_URL + "/shop/giveaway/changeStatus?status=" + status + "&giveawayId=" + giveawayId; +// HttpUtil.put(url); +// } +// +//} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/PayApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/PayApi.java new file mode 100644 index 0000000..0a52025 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/PayApi.java @@ -0,0 +1,46 @@ +package com.tmerclub.cloud.systemtest.api.amount; + + +import com.tmerclub.cloud.payment.dto.PayInfoDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.data.order.PayParamData; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author Tu + */ +public class PayApi { + public static Long pay(PayInfoDTO payParam){ + String uri = Constant.API_URL+"/mall4cloud_payment/pay/order"; + Long payId = HttpUtil.post(uri,payParam, UrlEnum.API,Long.class); + return payId; + } + + public static void balancePay(Long payId){ + String uri = Constant.API_URL+"/mall4cloud_user/user_balance/balance_pay"; + HttpUtil.post(uri,payId, UrlEnum.API); + } + + public static void orderPay(Long orderNum){ + balancePay(pay(PayParamData.getPayParamData(orderNum))); + } + + public static void orderPay(List orderNums) { + balancePay(pay(PayParamData.getPayParamData(orderNums))); + } + + public static Long payBalance(PayInfoDTO payParam){ + String uri = Constant.API_URL+"/mall4cloud_payment/pay/pay_balance"; + Long payId = HttpUtil.post(uri,payParam, UrlEnum.API,Long.class); + return payId; + } + + public static void orderPayBalance(Long orderNum){ + balancePay(payBalance(PayParamData.getPayParamData(orderNum))); + } + + +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/ProductApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/ProductApi.java new file mode 100644 index 0000000..92d3552 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/ProductApi.java @@ -0,0 +1,118 @@ +package com.tmerclub.cloud.systemtest.api.amount; + +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.app.SpuAppVO; +import com.tmerclub.cloud.product.dto.SpuPageSearchDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author Tu + */ +public class ProductApi { + + + public static Long createProduct(SpuDTO spuDTO, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_product/mp/spu"; + if(isMainShop) { + return HttpUtil.post(url, spuDTO, UrlEnum.SHOP,Long.class); + } else { + return HttpUtil.post(url, spuDTO, UrlEnum.SHOP_OTHER,Long.class); + } + } + + public static SpuVO info(Long spuId, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_product/mp/spu?spuId=" + spuId; + if(isMainShop) { + return HttpUtil.get(url, SpuVO.class, UrlEnum.SHOP); + } else { + return HttpUtil.get(url, SpuVO.class, UrlEnum.SHOP_OTHER); + } + } + + public static void delete(Long spuId, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_product/mp/spu?spuId=" + spuId; + if(isMainShop) { + HttpUtil.delete(url,UrlEnum.SHOP); + } else { + HttpUtil.delete(url,UrlEnum.SHOP_OTHER); + } + } + + /** + *获取商品详情 + */ + public static SpuAppVO getProductInfo(Long spuId){ + String url = Constant.API_URL + "/mall4cloud_product/ma/spu/prod_info?spuId="+spuId+"&userId=&addrId="; + return HttpUtil.get(url, SpuAppVO.class,UrlEnum.API); + } + + public static List addSupplierProduct(List supplierSpuId, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_product/mp/spu/importSupplierSpu"; + if(isMainShop) { + return HttpUtil.post(url, supplierSpuId, UrlEnum.SHOP,List.class); + } else { + return HttpUtil.post(url, supplierSpuId, UrlEnum.SHOP_OTHER,List.class); + } + } + + + public static void onlineProduct(SpuPageSearchDTO spuDTO, Boolean isMainShop){ + String url = Constant.API_URL + "/mall4cloud_product/mp/spu/prod_status"; + if(isMainShop) { + HttpUtil.put(url, spuDTO, UrlEnum.SHOP); + } else { + HttpUtil.put(url, spuDTO, UrlEnum.SHOP_OTHER); + } + } + + /** + * 修改商品信息 + */ + public static void update(SpuDTO spuDTO, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_product/mp/spu"; + if(isMainShop) { + HttpUtil.put(url, spuDTO, UrlEnum.SHOP); + } else { + HttpUtil.put(url, spuDTO, UrlEnum.SHOP_OTHER); + } + } + + /** + * 商品列表修改商品信息 + */ + public static void updateProductData(SpuDTO spuDTO) { + String url = Constant.API_URL + "/mall4cloud_product/mp/spu/update_spu_data"; + HttpUtil.put(url, spuDTO, UrlEnum.SHOP); + } + + /** + * 修改商品状态-上架 1, 下架 0 + */ + public static void changeProductStatus(SpuPageSearchDTO spuPageSearchDTO){ + String url = Constant.API_URL + "/mall4cloud_product/mp/spu/prod_status"; + HttpUtil.put(url,spuPageSearchDTO,UrlEnum.SHOP); + } + + /** + * 商家获取最新下架信息 + */ + public static OfflineHandleEventVO shopGetOfflineHandleEvent(Long productId) { + String url = Constant.API_URL + "/mall4cloud_product/mp/spu/get_offline_handle_event/" + productId; + return HttpUtil.get(url, OfflineHandleEventVO.class, UrlEnum.SHOP); + } + + /** + * 商家申请上架,提交审核 + */ + public static void apply(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_product/mp/spu/audit_apply"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.SHOP); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/MemberShipApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/MemberShipApi.java new file mode 100644 index 0000000..4e554d4 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/MemberShipApi.java @@ -0,0 +1,22 @@ +//package com.tmerclub.cloud.systemtest.api.login; +// +//import com.alibaba.fastjson2.JSON; +//import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +//import com.yami.shop.bean.param.UserManagerReqParam; +//import com.yami.shop.common.util.Json; +//import com.yami.shop.systemtest.constants.Constant; +//import com.yami.shop.systemtest.util.HttpUtil; +// +//import java.util.List; +// +///** +// * @author Tu +// */ +//public class MemberShipApi { +// public static List lishUser(){ +// String url = Constant.PLATFORM_URL+"admin/user/userPage"; +// return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, Page.class)), Page.class).getRecords()), UserManagerReqParam.class); +// } +// +// +//} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/UserLoginApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/UserLoginApi.java new file mode 100644 index 0000000..b27facd --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/UserLoginApi.java @@ -0,0 +1,18 @@ +//package com.tmerclub.cloud.systemtest.api.login; +// +//import com.yami.shop.bean.app.param.SendSmsParam; +//import com.yami.shop.common.response.ServerResponseEntity; +//import com.yami.shop.systemtest.constants.Constant; +//import com.yami.shop.systemtest.util.HttpUtil; +// +///** +// * @author Tu +// */ +//public class UserLoginApi { +// public static ServerResponseEntity register(SendSmsParam sendSmsParam){ +// String url = Constant.API_URL+"/user/sendRegisterSms"; +// ServerResponseEntity serverResponseEntity = HttpUtil.puts(url, sendSmsParam); +// return serverResponseEntity; +// } +// +//} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/ComboApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/ComboApi.java new file mode 100644 index 0000000..7a67405 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/ComboApi.java @@ -0,0 +1,58 @@ +package com.tmerclub.cloud.systemtest.api.marketing; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.combo.vo.ComboVO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.ComboDTO; +import com.tmerclub.cloud.common.util.Json; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author lpj + */ +public class ComboApi { + /** + * 获取套餐列表 + */ + public static List getComboPage() { + String url = Constant.API_URL + "/mall4cloud_marketing/m/combo/page?pageNum=1&pageSize=10&name=&status=&mainSpuName=&matchSpuName"; + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.SHOP)), PageVO.class).getList()), ComboVO.class); + } + + /** + * 新增套餐 + */ + public static void save(ComboDTO comboDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/m/combo"; + HttpUtil.post(url, comboDTO, UrlEnum.SHOP); + } + + /** + * 获取套餐详情 + */ + public static ComboVO getComboInfo(Long comboId) { + String url = Constant.API_URL + "/mall4cloud_marketing/m/combo?comboId=" + comboId; + return HttpUtil.get(url, ComboVO.class, UrlEnum.SHOP); + } + + /** + * 修改套餐 + */ + public static void update(ComboDTO comboDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/m/combo"; + HttpUtil.put(url, comboDTO, UrlEnum.SHOP); + } + + /** + * 修改商品状态 + * @param comboDTO status 0-失效 -1-删除 + */ + public static void updateComboStatus(ComboDTO comboDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/m/combo/updateComboStatus"; + HttpUtil.put(url, comboDTO, UrlEnum.SHOP); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/DiscountApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/DiscountApi.java new file mode 100644 index 0000000..d39e699 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/DiscountApi.java @@ -0,0 +1,113 @@ +package com.tmerclub.cloud.systemtest.api.marketing; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.discount.dto.DiscountDTO; +import com.tmerclub.cloud.discount.vo.DiscountVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author lpj + */ +public class DiscountApi { + /** + * 商家获取满减列表 + */ + public static List getDiscountPage(Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/discount/page?pageSize=10&pageNum=1&name="; + if(isMainShop) { + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.SHOP)), PageVO.class).getList()), DiscountVO.class); + } else { + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.SHOP_OTHER)), PageVO.class).getList()), DiscountVO.class); + } + } + + /** + * 新增满减 + */ + public static void save(DiscountDTO discountDTO, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/discount"; + if(isMainShop) { + HttpUtil.post(url, discountDTO, UrlEnum.SHOP); + } else { + HttpUtil.post(url, discountDTO, UrlEnum.SHOP_OTHER); + } + } + + /** + * 通过id获取满减 + */ + public static DiscountVO getDiscountInfo(Long discountId) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/discount/info/" + discountId; + return HttpUtil.get(url, DiscountVO.class, UrlEnum.SHOP); + } + + /** + * 修改满减 + */ + public static void update(DiscountDTO discountDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/discount"; + HttpUtil.put(url, discountDTO, UrlEnum.SHOP); + } + + /** + * 删除满减 + */ + public static void delete(Long discountId, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/discount/" + discountId; + if(isMainShop) { + HttpUtil.delete(url, UrlEnum.SHOP); + } else { + HttpUtil.delete(url, UrlEnum.SHOP_OTHER); + } + } + + /** + * 平台违规下架平台活动 + */ + public static void offline(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/discount/offline"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.PLATFORM); + } + + /** + * 商家获取最新下架信息 + */ + public static OfflineHandleEventVO shopGetOfflineHandleEvent(Long discountId) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/discount/get_offline_handle_event/" + discountId; + return HttpUtil.get(url, OfflineHandleEventVO.class, UrlEnum.SHOP); + } + + /** + * 商家申请上架,提交审核 + */ + public static void applyDiscount(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/discount/audit_apply"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.SHOP); + } + + /** + * 平台获取最新下架信息 + */ + public static OfflineHandleEventVO platformGetOfflineHandleEvent(Long discountId) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/discount/get_offline_handle_event/" + discountId; + return HttpUtil.get(url, OfflineHandleEventVO.class, UrlEnum.PLATFORM); + } + + /** + * 平台审核平台活动 + */ + public static void auditDiscount(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/discount/audit"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.PLATFORM); + } + + +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/GiveawayApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/GiveawayApi.java new file mode 100644 index 0000000..584a444 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/GiveawayApi.java @@ -0,0 +1,57 @@ +package com.tmerclub.cloud.systemtest.api.marketing; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.product.dto.GiveawayDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author lpj + */ +public class GiveawayApi { + /** + * 获取赠品活动列表 + */ + public static List getGiveawayPage() { + String url = Constant.API_URL + "/mall4cloud_product/m/giveaway/page?pageNum=1&pageSize=10&name=&spuName=&status=&giveawaySpuName="; + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.SHOP)), PageVO.class).getList()), GiveawayVO.class); + } + + /** + * 新增赠品活动 + */ + public static void save(GiveawayDTO giveawayDTO) { + String url = Constant.API_URL + "/mall4cloud_product/m/giveaway"; + HttpUtil.post(url, giveawayDTO, UrlEnum.SHOP); + } + + /** + * 根据id获取赠品活动信息 + */ + public static GiveawayVO getGiveawayInfo(Long giveawayId) { + String url = Constant.API_URL + "/mall4cloud_product/m/giveaway?giveawayId=" + giveawayId; + return HttpUtil.get(url, GiveawayVO.class, UrlEnum.SHOP); + } + + /** + * 修改赠品活动 + */ + public static void update(GiveawayDTO giveawayDTO) { + String url = Constant.API_URL + "/mall4cloud_product/m/giveaway"; + HttpUtil.put(url, giveawayDTO, UrlEnum.SHOP); + } + + /** + * 修改赠品状态 + */ + public static void updateGiveawayStatus(Integer status, Long giveawayId) { + String url = Constant.API_URL + "/mall4cloud_product/m/giveaway/changeStatus?status=" + status + "&giveawayId=" + giveawayId; + HttpUtil.put(url, UrlEnum.SHOP); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/GroupApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/GroupApi.java new file mode 100644 index 0000000..520a1bf --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/GroupApi.java @@ -0,0 +1,171 @@ +package com.tmerclub.cloud.systemtest.api.marketing; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.util.Json; +import com.moyuer.cloud.group.dto.GroupActivityDTO; +import com.moyuer.cloud.group.dto.GroupOrderDTO; +import com.moyuer.cloud.group.dto.SubmitGroupOrderDTO; +import com.moyuer.cloud.group.vo.GroupActivityVO; +import com.moyuer.cloud.group.vo.app.AppGroupActivityVO; +import com.moyuer.cloud.group.vo.app.AppGroupTeamVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author lpj + */ +public class GroupApi { + + + /** + * 新增拼团活动 + */ + public static void save(GroupActivityDTO groupActivityDTO) { + String url = Constant.API_URL + "/mall4cloud_group/mp/group_activity"; + HttpUtil.post(url, groupActivityDTO, UrlEnum.SHOP ); + } + + /** + * 商家获取拼团活动列表 + */ + public static List getGroupActivityPage() { + String url = Constant.API_URL + "/mall4cloud_group/mp/group_activity/page?pageSize=10&pageNum=1&activityName=&spuName=&status="; + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.SHOP)), PageVO.class).getList()), GroupActivityVO.class); + } + + /** + *通过id获取拼团活动 + */ + public static GroupActivityVO getGroupActivity(Long groupActivityId) { + String url = Constant.API_URL + "/mall4cloud_group/mp/group_activity?groupActivityId=" + groupActivityId; + return HttpUtil.get(url, GroupActivityVO.class, UrlEnum.SHOP); + } + + /** + * 修改拼团活动 + */ + public static void updateGroupActivity(GroupActivityDTO groupActivityDTO) { + String url = Constant.API_URL + "/mall4cloud_group/mp/group_activity"; + HttpUtil.put(url, groupActivityDTO, UrlEnum.SHOP); + } + + /** + * 启用拼团活动 + */ + public static void activeGroupActivity(GroupActivityDTO groupActivityDTO) { + String url = Constant.API_URL + "/mall4cloud_group/mp/group_activity/active"; + HttpUtil.put(url, groupActivityDTO, UrlEnum.SHOP); + } + + /** + * 失效拼团活动 + */ + public static void invalidActivity(GroupActivityDTO groupActivityDTO) { + String url = Constant.API_URL + "/mall4cloud_group/mp/group_activity/invalid"; + HttpUtil.put(url, groupActivityDTO, UrlEnum.SHOP); + } + + /** + * 删除拼团活动 + */ + public static void deleteGroupActivity(Long groupActivityId) { + String url = Constant.API_URL + "/mall4cloud_group/mp/group_activity?groupActivityId=" + groupActivityId; + HttpUtil.delete(url, UrlEnum.SHOP); + } + + /** + * 平台违规下架平台活动 + */ + public static void offline(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_group/mp/group_activity/offline"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.PLATFORM); + } + + /** + * 商家获取最新下架信息 + */ + public static OfflineHandleEventVO shopGetOfflineHandleEvent(Long groupActivityId) { + String url = Constant.API_URL + "/mall4cloud_group/mp/group_activity/get_offline_handle_event/" + groupActivityId; + return HttpUtil.get(url, OfflineHandleEventVO.class, UrlEnum.SHOP); + } + + /** + * 商家申请上架,提交审核 + */ + public static void applyGroupActivity(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_group/mp/group_activity/audit_apply"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.SHOP); + } + + /** + * 平台获取最新下架信息 + */ + public static OfflineHandleEventVO platformGetOfflineHandleEvent(Long groupActivityId) { + String url = Constant.API_URL + "/mall4cloud_group/mp/group_activity/get_offline_handle_event/" + groupActivityId; + return HttpUtil.get(url, OfflineHandleEventVO.class, UrlEnum.PLATFORM); + } + + /** + * 平台审核平台活动 + */ + public static void auditGroupActivity(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_group/mp/group_activity/audit"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.PLATFORM); + } + + /** + * 用户获取团购商品信息 + */ + public static AppGroupActivityVO getGroupActivityInfo(Long productId) { + String url = Constant.API_URL + "/mall4cloud_group/ua/group_activity/info?spuId=" + productId; + return HttpUtil.get(url, AppGroupActivityVO.class, UrlEnum.API); + } + + /** + * 用户开团 + */ + public static void openGroup(GroupOrderDTO groupOrderDTO) { + String url = Constant.API_URL + "/mall4cloud_group/group_order/confirm"; + HttpUtil.post(url, groupOrderDTO, UrlEnum.API); + } + + /** + * 开团用户提交拼团订单 + */ + public static List submitGroupOrder(SubmitGroupOrderDTO submitGroupOrderDTO) { + String url = Constant.API_URL + "/mall4cloud_group/group_order/submit"; + return HttpUtil.post(url, submitGroupOrderDTO, UrlEnum.API, List.class); + } + + /** + * 用户获取可参团列表 + */ + public static List getJoinGroupList(Long groupActivityId) { + String url = Constant.API_URL + "/mall4cloud_group/ua/group_activity/join_group_list?groupActivityId=" + groupActivityId; + return HttpUtil.get(url, List.class, UrlEnum.API_OTHER); + } + + /** + * 用户立即参团 + */ + public static void joinGroup(GroupOrderDTO groupOrderDTO) { + String url = Constant.API_URL + "/mall4cloud_group/group_order/confirm"; + HttpUtil.post(url, groupOrderDTO, UrlEnum.API_OTHER); + } + + /** + * 参团用户提交拼团订单 + */ + public static List submitJoinGroupOrder(SubmitGroupOrderDTO submitGroupOrderDTO) { + String url = Constant.API_URL + "/mall4cloud_group/group_order/submit"; + return HttpUtil.post(url, submitGroupOrderDTO, UrlEnum.API_OTHER, List.class); + } + + +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/LiveApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/LiveApi.java new file mode 100644 index 0000000..7a5449e --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/LiveApi.java @@ -0,0 +1,100 @@ +//package com.tmerclub.cloud.systemtest.api.marketing; +// +//import com.alibaba.fastjson2.JSON; +//import com.tmerclub.cloud.common.database.vo.PageVO; +//import com.tmerclub.cloud.common.util.Json; +//import com.tmerclub.cloud.live.dto.LiveProdStoreDTO; +//import com.tmerclub.cloud.live.model.LiveProdStore; +//import com.tmerclub.cloud.live.model.LiveRoom; +//import com.tmerclub.cloud.live.model.LiveUser; +//import com.moyuer.cloud.systemtest.constants.Constant; +//import com.moyuer.cloud.systemtest.util.HttpUtil; +//import com.moyuer.cloud.systemtest.util.UrlEnum; +// +//import java.util.List; +// +///** +// * @author lpj +// */ +//public class LiveApi { +// /** +// * 商家获取直播商品列表 +// */ +// public static List getLiveProdStorePage() { +// String url = Constant.API_URL + "/mall4cloud_marketing/m/live_prod_store/page?pageNum=1&pageSize=10&name="; +// return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.SHOP)), PageVO.class).getList()), LiveProdStore.class); +// } +// +// /** +// * 新增直播商品 +// */ +// public static void saveLiveProdStore(LiveProdStoreDTO liveProdStoreDTO) { +// String url = Constant.API_URL + "/mall4cloud_marketing/m/live_prod_store"; +// HttpUtil.post(url, liveProdStoreDTO, UrlEnum.SHOP); +// } +// +// /** +// * 获取直播商品信息 +// */ +// public static LiveProdStore getLiveProdStore(Long liveProdStoreId) { +// String url = Constant.API_URL + "/mall4cloud_marketing/m/live_prod_store/info/" + liveProdStoreId; +// return HttpUtil.get(url, LiveProdStore.class, UrlEnum.SHOP); +// } +// +// /** +// * 修改直播商品 +// */ +// public static void updateLiveProdStore(LiveProdStoreDTO liveProdStoreDTO) { +// String url = Constant.API_URL + "/mall4cloud_marketing/m/live_prod_store"; +// HttpUtil.put(url, liveProdStoreDTO, UrlEnum.SHOP); +// } +// +// /** +// * 提交审核 +// */ +// public static void submitVerify(LiveProdStore liveProdStore) { +// String url = Constant.API_URL + "/mall4cloud_marketing/m/live_prod_store/submitVerify"; +// HttpUtil.put(url, liveProdStore, UrlEnum.SHOP); +// } +// +// /** +// * 删除直播商品 +// */ +// public static void deleteLiveProdStore(Long liveProdStoreId) { +// String url = Constant.API_URL + "/mall4cloud_marketing/m/live_prod_store/" + liveProdStoreId; +// HttpUtil.delete(url, UrlEnum.SHOP); +// } +// +// /** +// * 商家获取直播间列表 +// */ +// public static List getLiveRoomPage() { +// String url = Constant.API_URL + "/mall4cloud_marketing/m/live_room/page?pageNum=1&pageSize=10&name=&anchorName=&liveStatus=&roomTop="; +// return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.SHOP)), PageVO.class).getList()), LiveRoom.class); +// } +// +// /** +// * 新增直播间 +// */ +// public static void saveLiveRoom(LiveRoom liveRoom) { +// String url = Constant.API_URL + "/mall4cloud_marketing/m/live_room"; +// HttpUtil.post(url, liveRoom, UrlEnum.SHOP); +// } +// +// /** +// * 删除直播间 +// */ +// public static void deleteLiveRoom(Long liveRoomId) { +// String url = Constant.API_URL + "/mall4cloud_marketing/m/live_room?id=" + liveRoomId; +// HttpUtil.delete(url, UrlEnum.SHOP); +// } +// +// /** +// * 获取直播成员 +// */ +// public static List getLiveUserPage() { +// String url = Constant.API_URL + "/mall4cloud_marketing/p/live_user/page?pageNum=1&pageSize=10&nickName=&anchorWechat=&roles="; +// return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.PLATFORM)), PageVO.class).getList()), LiveUser.class); +// } +// +//} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/MyOrderApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/MyOrderApi.java new file mode 100644 index 0000000..deb566d --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/MyOrderApi.java @@ -0,0 +1,71 @@ +package com.tmerclub.cloud.systemtest.api.order; + + +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.order.dto.SubmitOrderDTO; +import com.tmerclub.cloud.common.order.vo.OrderSelfStationVO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.order.dto.OrderStationDTO; +import com.tmerclub.cloud.order.vo.OrderShopVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author Tu + */ + +public class MyOrderApi { + public static ShopCartOrderMergerVO confirm(OrderDTO orderParam){ + String url = Constant.API_URL+"/mall4cloud_order/order/confirm"; + return HttpUtil.post(url, orderParam, UrlEnum.API, ShopCartOrderMergerVO.class); + } + + public static void confirmScoreOrder(OrderDTO orderParam){ + String url = Constant.API_URL+"/mall4cloud_order/score_order/confirm"; + HttpUtil.post(url, orderParam, UrlEnum.API); + } + + public static List submit(SubmitOrderDTO submitOrderDTO){ + String url = Constant.API_URL+"/mall4cloud_order/order/submit"; + return HttpUtil.post(url, submitOrderDTO,UrlEnum.API, List.class); + } + + public static void cancel(Long orderNumber){ + String url = Constant.API_URL+"/mall4cloud_order/my_order/cancel/"+orderNumber; + HttpUtil.put(url,UrlEnum.API); + } + + public static void receipt(Long orderNumber){ + String url = Constant.API_URL + "/mall4cloud_order/my_order/receipt/"+orderNumber; + HttpUtil.put(url,UrlEnum.API); + } + + public static OrderShopVO orderDetail(Long orderNumber){ + String url = Constant.API_URL + "/mall4cloud_order/my_order/order_detail?orderId="+orderNumber; + return HttpUtil.get(url,OrderShopVO.class,UrlEnum.API); + } + + public static void delete(Long orderNumber){ + String url = Constant.API_URL + "/mall4cloud_order/my_order/"+orderNumber; + HttpUtil.delete(url,UrlEnum.API); + } + + /** + * 自提订单门店详情 + */ + public static OrderSelfStationVO stationOrderDetail(Long orderId) { + String url = Constant.API_URL + "/mall4cloud_order/my_station_order/station_detail?orderId=" + orderId + "&lat=22.943953938872706&lng=113.39070900424778"; + return HttpUtil.get(url, OrderSelfStationVO.class, UrlEnum.API); + } + + /** + * 用户扫商家码核销订单 + */ + public static void orderStationByOrderId(OrderStationDTO orderStationDTO) { + String url = Constant.API_URL + "/mall4cloud_order/my_station_order/order_station_by_order_id"; + HttpUtil.put(url, orderStationDTO, UrlEnum.API); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/OrderApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/OrderApi.java new file mode 100644 index 0000000..e2781db --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/OrderApi.java @@ -0,0 +1,97 @@ +package com.tmerclub.cloud.systemtest.api.order; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.tmerclub.cloud.common.order.dto.OrderSelfStationDTO; +import com.tmerclub.cloud.common.order.dto.OrderVirtualInfoDTO; +import com.tmerclub.cloud.common.order.vo.OrderAddrVO; +import com.tmerclub.cloud.common.order.vo.OrderSelfStationVO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.tmerclub.cloud.order.dto.OrderAddrDTO; +import com.tmerclub.cloud.order.dto.multishop.OrderAdminDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + + +/** + * @author Tu + */ +public class OrderApi { + public static OrderVO getOrderItemAndAddress(Long orderNumber){ + String url = Constant.API_URL+"/mall4cloud_order/mp/order/order_item_and_address/"+orderNumber; + return HttpUtil.get(url, OrderVO.class,UrlEnum.SHOP); + } + + public static void delivery(DeliveryOrderDTO deliveryOrderParam){ + String url = Constant.API_URL + "/mall4cloud_order/mp/order/delivery"; + HttpUtil.post(url,deliveryOrderParam,UrlEnum.SHOP); + } + + public static OrderVO infoOrder(Long orderNumber){ + String url = Constant.API_URL + "/mall4cloud_order/mp/order/order_info/"+orderNumber; + return HttpUtil.get(url, OrderVO.class,UrlEnum.SHOP); + } + public static void changeOrderAmount(OrderAdminDTO orderAdminDTO){ + String url = Constant.API_URL + "/mall4cloud_order/mp/order/change_amount"; + HttpUtil.put(url, orderAdminDTO, UrlEnum.SHOP); + } + public static OrderAddrVO infoOrderAddr(Long orderNumber){ + String url = Constant.API_URL + "/mall4cloud_order/mp/order/order_addr/"+orderNumber; + return HttpUtil.get(url,OrderAddrVO.class,UrlEnum.SHOP); + } + + public static void changeOrderAddrCheck(Long orderNumber){ + String url = Constant.API_URL + "/mall4cloud_order/mp/order/get_change_amount?orderId="+orderNumber+"&areaId=130203"; + HttpUtil.get(url,UrlEnum.SHOP); + } + public static void changeOrderAddr(OrderAddrDTO orderAddrDTO){ + String url = Constant.API_URL + "/mall4cloud_order/mp/order/change_user_addr"; + HttpUtil.put(url,orderAddrDTO,UrlEnum.SHOP); + } + + public static List infoOrderDelivery(Long orderNumber){ + String url = Constant.API_URL+"/mall4cloud_order/mp/order_delivery/info?orderId="+orderNumber; + List deliveryOrderFeignVos = HttpUtil.get(url, List.class,UrlEnum.SHOP); + return deliveryOrderFeignVos; + } + + public static void updateOrderDelivery(List list){ + String url = Constant.API_URL + "/mall4cloud_order/mp/order_delivery/update"; + HttpUtil.put(url,list,UrlEnum.SHOP); + } + + /** + * 自提订单商家端提货 + */ + public static void changeStatusAndOrderStation(OrderSelfStationDTO orderSelfStationDTO){ + String url = Constant.API_URL + "/mall4cloud_order/m/order_self_station/change_status_and_order_station"; + HttpUtil.put(url, orderSelfStationDTO, UrlEnum.SHOP); + } + + /** + * 订单自提信息详情 + */ + public static OrderSelfStationVO getOrderItemAndStationInfo(Long orderId) { + String url = Constant.API_URL + "/mall4cloud_order/m/order_self_station/get_order_item_and_station_info?orderId=" + orderId; + return HttpUtil.get(url, OrderSelfStationVO.class, UrlEnum.SHOP); + } + + /** + * 根据订单ID和核销码核销虚拟订单 + */ + public static void orderWriteOffByOrderId(OrderVirtualInfoDTO orderVirtualInfoDTO) { + String url = Constant.API_URL + "/mall4cloud_order/m/order_virtual_info/order_write_off_by_order_id"; + HttpUtil.put(url, orderVirtualInfoDTO, UrlEnum.SHOP); + } + + /** + * 根据订单ID采购订单 + * */ + public static void sourcingOrder(OrderAdminDTO orderDTO) { + String url = Constant.API_URL + "/mall4cloud_order/mp/order/sourcing_order"; + HttpUtil.put(url, orderDTO, UrlEnum.SHOP); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/OrderRefundApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/OrderRefundApi.java new file mode 100644 index 0000000..32d2f56 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/OrderRefundApi.java @@ -0,0 +1,40 @@ +package com.tmerclub.cloud.systemtest.api.order; + + +import com.tmerclub.cloud.order.dto.app.OrderRefundDTO; +import com.tmerclub.cloud.order.dto.app.OrderRefundDeliveryDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + + +/** + * @author Tu + */ +public class OrderRefundApi { + /** + * 申请退款 + */ + public static Long apply(OrderRefundDTO orderRefundParam){ + String url = Constant.API_URL+"/mall4cloud_order/order_refund/apply"; + return HttpUtil.post(url,orderRefundParam, UrlEnum.API, Long.class); + } + + /** + * 用户提交退款订单物流填写信息 + */ + public static void submitExpress(OrderRefundDeliveryDTO orderRefundExpressParam){ + String url = Constant.API_URL+"/mall4cloud_order/order_refund/submit_express"; + HttpUtil.post(url,orderRefundExpressParam,UrlEnum.API); + } + +// public static ApiOrderRefundDto infoUserByRefundSn(String refundSn){ +// String url = Constant.API_URL+"/p/orderRefund/info?refundSn="+refundSn; +// return HttpUtil.get(url,ApiOrderRefundDto.class); +// } +// +// public static void cancel(String refundSn){ +// String url = Constant.API_URL+"/p/orderRefund/cancel"; +// HttpUtil.put(url,refundSn); +// } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/SettlementApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/SettlementApi.java new file mode 100644 index 0000000..20c4073 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/SettlementApi.java @@ -0,0 +1,22 @@ +//package com.tmerclub.cloud.systemtest.api.order; +// +// +//import com.alibaba.fastjson2.JSON; +//import com.yami.shop.bean.model.ShopWalletLog; +//import com.yami.shop.systemtest.constants.Constant; +//import com.yami.shop.systemtest.util.HttpUtil; +// +//import java.util.List; +// +///** +// * @author Tu +// */ +//public class SettlementApi { +// public static List infoSettlement(String orderNumber, String refundSn){ +// String url = Constant.SHOP_URL+"/shop/shopWalletLog/page?ioType=&amountType=&orderNumber="+orderNumber+ +// "&refundSn="+refundSn+"&reason=&startTime=&endTime=¤t=1&size=10"; +// // 返回集合用JSON.parseArray(HttpUtil.gets(url), ShopWalletLog.class); +// // 返回单个用 JSON.parseObject(HttpUtil.gets(url), ShopWalletLog.class); +// return JSON.parseArray(HttpUtil.gets(url), ShopWalletLog.class); +// } +//} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/ShopCartApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/ShopCartApi.java new file mode 100644 index 0000000..2e2d69c --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/ShopCartApi.java @@ -0,0 +1,17 @@ +package com.tmerclub.cloud.systemtest.api.order; + +import com.tmerclub.cloud.product.dto.shopcart.ChangeShopCartItemDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +/** + * @author Tu + */ +public class ShopCartApi { + public static void addItem(ChangeShopCartItemDTO param) { + String url = Constant.API_URL+"/mall4cloud_product/shop_cart/change_item"; + HttpUtil.post(url,param,UrlEnum.API); + } + +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/StationApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/StationApi.java new file mode 100644 index 0000000..7457016 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/StationApi.java @@ -0,0 +1,55 @@ +package com.tmerclub.cloud.systemtest.api.order; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.dto.OrderVirtualInfoDTO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.tmerclub.cloud.common.util.Json; +import com.moyuer.cloud.delivery.vo.StationDetailVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author Tu + */ +public class StationApi { + public static List getStationList(Long shopId){ + String url = Constant.API_URL+"/mall4cloud_order/station/user_station?pageNum=1&pageSize=7&lat=22.943953938872706&lng=113.39070900424778&stationName=&shopId="+shopId; + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.API)), PageVO.class).getList()), StationDetailVO.class); + } + + /** + * 获取门店首页数据 + */ + public static StationVO getStationIndexInfo() { + String url = Constant.API_URL + "/mall4cloud_order/station/get_station_index_info"; + return HttpUtil.get(url, StationVO.class, UrlEnum.STATION); + } + + /** + * 在门店端查询订单信息 + * */ + public static OrderVO getStationOrderByCode(String code){ + String url = Constant.API_URL+"/mall4cloud_order/station/get_station_order_by_code?code="+code; + return HttpUtil.get(url,OrderVO.class, UrlEnum.STATION); + } + + /** + * 在门店端核销自提订单 + * */ + public static void orderStationById(String orderIds) { + String url = Constant.API_URL + "/mall4cloud_order/station/order_station_by_order_id"; + HttpUtil.put(url, orderIds, UrlEnum.STATION); + } + /** + * 在门店端核销虚拟商品订单 + * */ + public static void orderWriteOffByOrderNumber(OrderVirtualInfoDTO orderVirtualInfoDTO){ + String url = Constant.API_URL + "/mall4cloud_order/station/order_write_off_by_order_id"; + HttpUtil.put(url, orderVirtualInfoDTO, UrlEnum.STATION); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/PlatformTransportApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/PlatformTransportApi.java new file mode 100644 index 0000000..baa6294 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/PlatformTransportApi.java @@ -0,0 +1,25 @@ +package com.tmerclub.cloud.systemtest.api.platform; + +import com.alibaba.fastjson2.JSON; +import com.moyuer.cloud.delivery.dto.TransportDTO; +import com.moyuer.cloud.delivery.vo.TransportVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author lpj + */ +public class PlatformTransportApi { + public static void platformAddTransport(TransportDTO transportDTO){ + String url = Constant.API_URL + "/mall4cloud_order/mp/transport"; + HttpUtil.post(url,transportDTO, UrlEnum.PLATFORM); + } + + public static List platformInfoTransport(){ + String url = Constant.API_URL + "/mall4cloud_order/mp/transport/page?pageSize=10&pageNum=1&transName="; + return JSON.parseArray(HttpUtil.gets(url,UrlEnum.PLATFORM), TransportVO.class); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/PlatformWalletApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/PlatformWalletApi.java new file mode 100644 index 0000000..7b17101 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/PlatformWalletApi.java @@ -0,0 +1,41 @@ +package com.tmerclub.cloud.systemtest.api.platform; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.order.vo.OrderDetailVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author lpj + */ +public class PlatformWalletApi { + /** + * 根据订单号查询结算记录 + */ + public static List getMongoShopWalletLogBO(Long orderId) { + String url = Constant.API_URL + "/mall4cloud_admin/mp/shop_wallet/page?platformIoType=&amountType=&orderId=" + orderId + "&refundId=&reason=&pageNum=1&pageSize=10"; + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.PLATFORM)), PageVO.class).getList()), MongoShopWalletLogBO.class); + } + + /** + * 根据订单号查询结算明细 + */ + public static OrderDetailVO getOrderDetailVO(Long orderId) { + String url = Constant.API_URL + "/mall4cloud_order/mp/order_item/get_order_detail?orderId=" + orderId + "&refundId"; + return HttpUtil.get(url, OrderDetailVO.class, UrlEnum.PLATFORM); + } + + /** + * 根据订单号与退款单号查询结算明细 + */ + public static OrderDetailVO getOrderDetailVO(Long orderId, Long refundId) { + String url = Constant.API_URL + "/mall4cloud_order/mp/order_item/get_order_detail?orderId=" + orderId + "&refundId=" + refundId; + return HttpUtil.get(url, OrderDetailVO.class, UrlEnum.PLATFORM); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/ScoreProductApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/ScoreProductApi.java new file mode 100644 index 0000000..a9af0bd --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/ScoreProductApi.java @@ -0,0 +1,36 @@ +package com.tmerclub.cloud.systemtest.api.platform; + +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.app.SpuAppVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +/** + * @author lpj + */ +public class ScoreProductApi { + /** + * 发布积分商品 + */ + public static Long createScoreProduct(SpuDTO spuDTO) { + String url = Constant.API_URL + "/mall4cloud_product/p/spu/score_save"; + return HttpUtil.post(url, spuDTO, UrlEnum.PLATFORM,Long.class); + } + + /** + * 删除积分商品 + */ + public static void deleteScoreProduct(Long spuId) { + String url = Constant.API_URL + "/mall4cloud_product/mp/spu?spuId=" + spuId; + HttpUtil.delete(url,UrlEnum.PLATFORM); + } + + /** + * 获取积分商品详情 + */ + public static SpuAppVO getScoreProductInfo(Long spuId, Long userId){ + String url = Constant.API_URL + "/mall4cloud_product/ma/spu/score_prod_info?spuId="+spuId+"&&userId="+userId; + return HttpUtil.get(url, SpuAppVO.class,UrlEnum.API); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/UserLevelApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/UserLevelApi.java new file mode 100644 index 0000000..a49e558 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/UserLevelApi.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.systemtest.api.platform; + +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; +import com.tmerclub.cloud.user.dto.UserLevelDTO; +import com.tmerclub.cloud.user.vo.UserLevelVO; + +/** + * @author lpj + */ +public class UserLevelApi { + /** + * 获取用户等级信息 + */ + public static UserLevelVO info(Long userLevelId) { + String url = Constant.API_URL + "/mall4cloud_user/p/user_level?userLevelId=" + userLevelId; + return HttpUtil.get(url, UserLevelVO.class, UrlEnum.PLATFORM); + } + + /** + * 更新用户等级 + */ + public static void update(UserLevelDTO userLevelDTO) { + String url = Constant.API_URL + "/mall4cloud_user/p/user_level"; + HttpUtil.put(url, userLevelDTO, UrlEnum.PLATFORM); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/UserRightsApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/UserRightsApi.java new file mode 100644 index 0000000..974d7c2 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/UserRightsApi.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.systemtest.api.platform; + +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; +import com.tmerclub.cloud.user.dto.UserRightsDTO; + +/** + * @author lpj + */ +public class UserRightsApi { + /** + * 新增用户权益 + */ + public static Long save(UserRightsDTO userRightsDTO) { + String url = Constant.API_URL + "/mall4cloud_user/p/user_rights"; + return HttpUtil.post(url, userRightsDTO, UrlEnum.PLATFORM, Long.class); + } + + /** + * 删除用户权益 + */ + public static void delete(Long rightsId) { + String url = Constant.API_URL + "/mall4cloud_user/p/user_rights?rightsId=" + rightsId; + HttpUtil.delete(url, UrlEnum.PLATFORM); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/SameCityApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/SameCityApi.java new file mode 100644 index 0000000..184e3b8 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/SameCityApi.java @@ -0,0 +1,22 @@ +package com.tmerclub.cloud.systemtest.api.store; + +import com.tmerclub.cloud.api.delivery.vo.SameCityVO; +import com.moyuer.cloud.delivery.dto.SameCityDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +/** + * @author lpj + */ +public class SameCityApi { + public static SameCityVO getSameCityInfo() { + String url = Constant.API_URL + "/mall4cloud_order/m/same_city/get_same_city_info"; + return HttpUtil.get(url, SameCityVO.class, UrlEnum.SHOP); + } + + public static void saveSameCity(SameCityDTO sameCityDTO) { + String url = Constant.API_URL + "/mall4cloud_order/m/same_city"; + HttpUtil.post(url, sameCityDTO, UrlEnum.SHOP); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopNoticeApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopNoticeApi.java new file mode 100644 index 0000000..6e4d835 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopNoticeApi.java @@ -0,0 +1,19 @@ +//package com.tmerclub.cloud.systemtest.api.store; +// +// +//import com.yami.shop.bean.app.dto.NoticeDto; +//import com.yami.shop.systemtest.util.HttpUtil; +// +///** +// * 商家公告管理 +// * @author Zuo +// */ +// +//public class ShopNoticeApi { +// +// public static void save(String url, NoticeDto noticeDto){ +// HttpUtil.post(url,noticeDto); +// } +// +//} +// diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopWalletApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopWalletApi.java new file mode 100644 index 0000000..c232ccb --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopWalletApi.java @@ -0,0 +1,53 @@ +package com.tmerclub.cloud.systemtest.api.store; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.order.vo.OrderDetailVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author lpj + */ +public class ShopWalletApi { + /** + * 根据订单号查询结算记录 + */ + public static List getMongoShopWalletLogBO(Long orderId, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_admin/mp/shop_wallet/page?shopIoType=&amountType=&orderId=" + orderId + "&refundId=&reason=&pageNum=1&pageSize=10"; + if(isMainShop) { + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.SHOP)), PageVO.class).getList()), MongoShopWalletLogBO.class); + } else { + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.SHOP_OTHER)), PageVO.class).getList()), MongoShopWalletLogBO.class); + } + } + + /** + * 根据订单号查询结算明细 + */ + public static OrderDetailVO getOrderDetailVO(Long orderId, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_order/mp/order_item/get_order_detail?orderId=" + orderId + "&refundId"; + if(isMainShop) { + return HttpUtil.get(url, OrderDetailVO.class, UrlEnum.SHOP); + } else { + return HttpUtil.get(url, OrderDetailVO.class, UrlEnum.SHOP_OTHER); + } + } + + /** + * 根据订单号与退款单号查询结算明细 + */ + public static OrderDetailVO getOrderDetailVO(Long orderId, Long refundId, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_order/mp/order_item/get_order_detail?orderId=" + orderId + "&refundId=" + refundId; + if(isMainShop) { + return HttpUtil.get(url, OrderDetailVO.class, UrlEnum.SHOP); + } else { + return HttpUtil.get(url, OrderDetailVO.class, UrlEnum.SHOP_OTHER); + } + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierOrderApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierOrderApi.java new file mode 100644 index 0000000..846c8f6 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierOrderApi.java @@ -0,0 +1,35 @@ +package com.tmerclub.cloud.systemtest.api.supplier; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.tmerclub.cloud.order.dto.OrderAddrDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author Tu + */ +public class SupplierOrderApi { + public static void updateOrderDelivery(OrderAddrDTO orderAddrDTO){ + String url = Constant.API_URL + "/mall4cloud_order/s/order/change_user_addr"; + HttpUtil.put(url,orderAddrDTO, UrlEnum.SUPPLIER); + } + + public static OrderVO info(Long orderNumber){ + String url = Constant.API_URL + "/mall4cloud_order/s/order/order_info/"+orderNumber; + return HttpUtil.get(url,OrderVO.class, UrlEnum.SUPPLIER); + } + + public static void delivery(DeliveryOrderDTO deliveryOrderParam){ + String url = Constant.API_URL + "/mall4cloud_order/s/order/delivery"; + HttpUtil.post(url,deliveryOrderParam,UrlEnum.SUPPLIER); + } + + public static void updateOrderDelivery(List list){ + String url = Constant.API_URL + "/mall4cloud_order/mp/order_delivery/update"; + HttpUtil.put(url,list,UrlEnum.SUPPLIER); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierProductApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierProductApi.java new file mode 100644 index 0000000..d2498c7 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierProductApi.java @@ -0,0 +1,89 @@ +package com.tmerclub.cloud.systemtest.api.supplier; + +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.product.dto.SpuPageSearchDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +/** + * @author Tu + */ +public class SupplierProductApi { + public static Long createProduct(SpuDTO spuDTO, Boolean isMainSupplier) { + String url = Constant.API_URL + "/mall4cloud_product/s/spu"; + if(isMainSupplier) { + return HttpUtil.post(url, spuDTO, UrlEnum.SUPPLIER,Long.class); + } else { + return HttpUtil.post(url, spuDTO, UrlEnum.SUPPLIER_OTHER,Long.class); + } + } + + public static void delete(Long spuId, Boolean isMainSupplier) { + String url = Constant.API_URL + "/mall4cloud_product/s/spu/batch?spuIds=" + spuId; + if(isMainSupplier) { + HttpUtil.delete(url,UrlEnum.SUPPLIER); + } else { + HttpUtil.delete(url,UrlEnum.SUPPLIER_OTHER); + } + } + + /** + * 获取商品详情 + */ + public static SpuVO info(Long spuId, Boolean isMainSupplier) { + String url = Constant.API_URL + "/mall4cloud_product/s/spu?spuId=" + spuId; + if(isMainSupplier) { + return HttpUtil.get(url, SpuVO.class, UrlEnum.SUPPLIER); + } else { + return HttpUtil.get(url, SpuVO.class, UrlEnum.SUPPLIER_OTHER); + } + } + + /** + * 修改商品信息 + */ + public static void update(SpuDTO spuDTO, Boolean isMainSupplier) { + String url = Constant.API_URL + "/mall4cloud_product/s/spu"; + if(isMainSupplier) { + HttpUtil.put(url, spuDTO, UrlEnum.SUPPLIER); + } else { + HttpUtil.put(url, spuDTO, UrlEnum.SUPPLIER_OTHER); + } + } + + /** + * 商品列表修改商品信息 + */ + public static void updateProductData(SpuDTO spuDTO) { + String url = Constant.API_URL + "/mall4cloud_product/s/spu/update_spu_data"; + HttpUtil.put(url, spuDTO, UrlEnum.SUPPLIER); + } + + /** + * 修改商品状态-上架 1, 下架 0 + */ + public static void changeProductStatus(SpuPageSearchDTO spuPageSearchDTO){ + String url = Constant.API_URL + "/mall4cloud_product/s/spu/prod_status"; + HttpUtil.put(url,spuPageSearchDTO,UrlEnum.SUPPLIER); + } + + /** + * 商家获取最新下架信息 + */ + public static OfflineHandleEventVO getOfflineHandleEvent(Long productId) { + String url = Constant.API_URL + "/mall4cloud_product/s/spu/get_offline_handle_event/" + productId; + return HttpUtil.get(url, OfflineHandleEventVO.class, UrlEnum.SUPPLIER); + } + + /** + * 商家申请上架,提交审核 + */ + public static void apply(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_product/s/spu/audit_apply"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.SUPPLIER); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/OfflineHandleEventDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/OfflineHandleEventDtoData.java new file mode 100644 index 0000000..2f231e5 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/OfflineHandleEventDtoData.java @@ -0,0 +1,30 @@ +package com.tmerclub.cloud.systemtest.data.amount; + +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; + +/** + * @author lpj + */ +public class OfflineHandleEventDtoData { + + /** + * 违规下架数据 + * @param eventId 事件id + * @param handleId 违规下架的活动id + * @param offlineReason 违规下线原因 + * @param reapplyReason 申请上架原因 + * @param refuseReason 拒绝原因 + * @param status 状态 + */ + public static OfflineHandleEventDTO getOfflineHandleEventDTO(Long eventId, Long handleId, String offlineReason, String reapplyReason, String refuseReason, Integer status) { + OfflineHandleEventDTO offlineHandleEventDTO = new OfflineHandleEventDTO(); + offlineHandleEventDTO.setEventId(eventId); + offlineHandleEventDTO.setHandleId(handleId); + offlineHandleEventDTO.setOfflineReason(offlineReason); + offlineHandleEventDTO.setReapplyReason(reapplyReason); + offlineHandleEventDTO.setRefuseReason(refuseReason); + offlineHandleEventDTO.setStatus(status); + return offlineHandleEventDTO; + } + +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/PreSaleSpuData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/PreSaleSpuData.java new file mode 100644 index 0000000..baec351 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/PreSaleSpuData.java @@ -0,0 +1,118 @@ +package com.tmerclub.cloud.systemtest.data.amount; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.common.order.bo.DeliveryModeBO; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.dto.SpuLangDTO; +import com.tmerclub.cloud.common.util.Json; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * @author lpj + */ +public class PreSaleSpuData { + public static SpuDTO getDepositPreSaleSpu(Long categoryId, Long shopCategoryId, Long deliveryTemplateId, Long priceFee){ + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setCategoryId(categoryId); + spuDTO.setShopCategoryId(shopCategoryId); + spuDTO.setName("接口自动化定金预售商品"); + spuDTO.setSellingPoint("商品卖点"); + spuDTO.setDetail("测试商品详情"); + spuDTO.setDeliveryTemplateId(deliveryTemplateId); + spuDTO.setMainImgUrl("/test.png"); + spuDTO.setImgUrls("/test.png"); + spuDTO.setMarketPriceFee(8800L); + spuDTO.setPriceFee(priceFee); + spuDTO.setHasSkuImg(0); + spuDTO.setSkuList(getSkuList(priceFee)); + spuDTO.setSupplierSpuType(0); + + spuDTO.setPreSaleType(1); + spuDTO.setDepositType(1); + spuDTO.setDepositValue(BigDecimal.valueOf(8)); + spuDTO.setDepositExpansionValue(BigDecimal.valueOf(18)); + spuDTO.setDepositStartTime(DateUtil.parse("2023-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + spuDTO.setDepositEndTime(DateUtil.parse("2026-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + spuDTO.setBalanceStartTime(DateUtil.parse("2023-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + spuDTO.setBalanceEndTime(DateUtil.parse("2026-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + + spuDTO.setPreSaleDeliveryType(-1); + spuDTO.setPreSaleDeliveryTime(DateUtil.parse("2026-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + + List spuLangDTOList = new ArrayList<>(); + SpuLangDTO spuLangDTO = new SpuLangDTO(); + spuLangDTO.setLang(1); + spuLangDTO.setSpuName("接口自动化定金预售商品"); + spuLangDTOList.add(spuLangDTO); + spuDTO.setSpuLangList(spuLangDTOList); + + spuDTO.setTotalStock(100); + DeliveryModeBO deliveryModeBO = new DeliveryModeBO(); + deliveryModeBO.setHasShopDelivery(true); + deliveryModeBO.setHasUserPickUp(true); + deliveryModeBO.setHasCityDelivery(true); + spuDTO.setDeliveryMode(Json.toJsonString(deliveryModeBO)); + + spuDTO.setSpuMold(0); + spuDTO.setSpuOrigin(0); + + return spuDTO; + } + + public static SpuDTO getFullPreSaleSpu(Long categoryId, Long shopCategoryId, Long deliveryTemplateId, Long priceFee){ + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setCategoryId(categoryId); + spuDTO.setShopCategoryId(shopCategoryId); + spuDTO.setName("接口自动化全款预售商品"); + spuDTO.setSellingPoint("商品卖点"); + spuDTO.setDetail("测试商品详情"); + spuDTO.setDeliveryTemplateId(deliveryTemplateId); + spuDTO.setMainImgUrl("/test.png"); + spuDTO.setImgUrls("/test.png"); + spuDTO.setMarketPriceFee(8800L); + spuDTO.setPriceFee(priceFee); + spuDTO.setHasSkuImg(0); + spuDTO.setSkuList(getSkuList(priceFee)); + spuDTO.setSupplierSpuType(0); + + spuDTO.setPreSaleType(0); + spuDTO.setPreSaleDeliveryType(2); + + List spuLangDTOList = new ArrayList<>(); + SpuLangDTO spuLangDTO = new SpuLangDTO(); + spuLangDTO.setLang(1); + spuLangDTO.setSpuName("接口自动化全款预售商品"); + spuLangDTOList.add(spuLangDTO); + spuDTO.setSpuLangList(spuLangDTOList); + + spuDTO.setTotalStock(100); + DeliveryModeBO deliveryModeBO = new DeliveryModeBO(); + deliveryModeBO.setHasShopDelivery(true); + deliveryModeBO.setHasUserPickUp(true); + deliveryModeBO.setHasCityDelivery(true); + spuDTO.setDeliveryMode(Json.toJsonString(deliveryModeBO)); + + spuDTO.setSpuMold(0); + spuDTO.setSpuOrigin(0); + + return spuDTO; + } + + public static List getSkuList(Long priceFee){ + List skuList = new ArrayList<>(); + SkuDTO skuDTO = new SkuDTO(); + skuDTO.setChangeStock(100); + skuDTO.setPriceFee(priceFee); + skuDTO.setMarketPriceFee(8800L); + skuDTO.setStock(100); + skuDTO.setStatus(1); + skuDTO.setWeight(0.0); + skuDTO.setVolume(0.0); + skuList.add(skuDTO); + return skuList; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/CouponData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/CouponData.java new file mode 100644 index 0000000..fb5042d --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/CouponData.java @@ -0,0 +1,69 @@ +package com.tmerclub.cloud.systemtest.data.marketing; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.coupon.dto.CouponDTO; +import com.tmerclub.cloud.coupon.vo.CouponVO; +import org.springframework.beans.BeanUtils; + +import java.util.List; + +/** + * @author lpj + */ +public class CouponData { + /** + * 优惠券数据 + * @param putonStatus 状态 + * @param getWay 领取方式 + * @param couponType 优惠券类型 + * @param cashCondition 使用条件 + * @param reduceAmount 减免金额 + * @param couponDiscount 减免折扣 + * @param validTimeType 生效类型 + * @param limitNum 每人限领 + * @param stocks 库存 + * @param suitableProdType 适用商品 + * @param spuIds 适用商品id + */ + public static CouponDTO getCouponDTO(Integer putonStatus, Integer getWay, Integer couponType, Long cashCondition, Long reduceAmount, Double couponDiscount, + Integer validTimeType, Integer limitNum, Integer stocks, Integer suitableProdType, List spuIds) { + CouponDTO couponDTO = new CouponDTO(); + couponDTO.setCouponId(0L); + couponDTO.setCouponName("测试自动化优惠券"); + couponDTO.setSubTitle(null); + couponDTO.setPutonStatus(putonStatus); + couponDTO.setLaunchTime(null); + couponDTO.setGetWay(getWay); + couponDTO.setCouponType(couponType); + couponDTO.setCashCondition(cashCondition); + couponDTO.setReduceAmount(reduceAmount); + couponDTO.setCouponDiscount(couponDiscount); + couponDTO.setValidTimeType(validTimeType); + couponDTO.setAfterReceiveDays(0); + couponDTO.setValidDays(1); + couponDTO.setStartTime(DateUtil.parse("2023-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + couponDTO.setEndTime(DateUtil.parse("2026-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + couponDTO.setLimitNum(limitNum); + couponDTO.setStocks(stocks); + couponDTO.setSuitableProdType(suitableProdType); + couponDTO.setSpuIds(spuIds); + couponDTO.setShopId(null); + couponDTO.setTotalStock(1); + couponDTO.setVersion(null); + couponDTO.setStatus(1); + + return couponDTO; + } + + /** + * 修改优惠券数据 + */ + public static CouponDTO getUpdateCouponDTO(CouponVO couponVO) { + CouponDTO couponDTO = new CouponDTO(); + BeanUtils.copyProperties(couponVO, couponDTO); + //修改为投放状态 + couponDTO.setPutonStatus(4); + + return couponDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/LiveData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/LiveData.java new file mode 100644 index 0000000..0b6436a --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/LiveData.java @@ -0,0 +1,79 @@ +//package com.tmerclub.cloud.systemtest.data.marketing; +// +//import cn.hutool.core.date.DateUtil; +//import com.tmerclub.cloud.live.dto.LiveProdStoreDTO; +//import com.tmerclub.cloud.live.model.LiveProdStore; +//import com.tmerclub.cloud.live.model.LiveRoom; +//import com.moyuer.cloud.systemtest.api.marketing.LiveApi; +//import org.springframework.beans.BeanUtils; +// +///** +// * @author lpj +// */ +//public class LiveData { +// /** +// * 直播商品数据 +// */ +// public static LiveProdStoreDTO getLiveProdStoreDTO(Long prodId, Integer priceType, Double price, Double price2, Integer prodType) { +// LiveProdStoreDTO liveProdStoreDTO = new LiveProdStoreDTO(); +// liveProdStoreDTO.setCoverPic("/2023/07/05/e405632be59343a1bb8fa4fff5cf9b16"); +// liveProdStoreDTO.setLiveProdStoreId(0L); +// liveProdStoreDTO.setName("直播商品"); +// liveProdStoreDTO.setPrice(price); +// liveProdStoreDTO.setPrice2(price2); +// liveProdStoreDTO.setPriceType(priceType); +// liveProdStoreDTO.setProdId(prodId); +// liveProdStoreDTO.setProdType(prodType); +// liveProdStoreDTO.setUrl("pages/detail/detail?spuId=" + prodId); +// +// return liveProdStoreDTO; +// } +// +// /** +// * 修改为价格区间的直播商品更新数据 +// */ +// public static LiveProdStoreDTO getUpdateLiveProdStoreDTO(LiveProdStore liveProdStore) { +// LiveProdStoreDTO liveProdStoreDTO = new LiveProdStoreDTO(); +// BeanUtils.copyProperties(liveProdStore, liveProdStoreDTO); +// liveProdStoreDTO.setPriceType(2); +// liveProdStoreDTO.setPrice2(188.0); +// +// return liveProdStoreDTO; +// } +// +// /** +// * 直播间数据 +// */ +// public static LiveRoom getLiveRoom() { +// LiveRoom liveRoom = new LiveRoom(); +// liveRoom.setAnchorName("直播昵称"); +// liveRoom.setAnchorWechat(LiveApi.getLiveUserPage().get(0).getAnchorWechat()); +// liveRoom.setApplyTime(null); +// liveRoom.setCoverImg("/2023/07/05/e405632be59343a1bb8fa4fff5cf9b16"); +// //每3个月需要修改一次时间 +// liveRoom.setStartTime(DateUtil.parse("2023-10-1 00:00:00","yyyy-MM-dd HH:mm:ss")); +// liveRoom.setEndTime(DateUtil.parse("2023-10-2 00:00:00","yyyy-MM-dd HH:mm:ss")); +// liveRoom.setFeedsImg("/2023/07/05/e405632be59343a1bb8fa4fff5cf9b16"); +// liveRoom.setId(0L); +// liveRoom.setIsFeedsPublic(1); +// liveRoom.setLiveStatus(null); +// liveRoom.setName("直播间"); +// liveRoom.setRoomId(null); +// liveRoom.setRoomTools("{\"closeLike\":0,\"closeGoods\":0,\"closeComment\":0,\"closeReplay\":0,\"closeShare\":1,\"closeKf\":1}"); +// +// LiveRoom.RoomToolsVO roomToolsVO = new LiveRoom.RoomToolsVO(); +// roomToolsVO.setCloseComment(0); +// roomToolsVO.setCloseGoods(0); +// roomToolsVO.setCloseKf(1); +// roomToolsVO.setCloseLike(0); +// roomToolsVO.setCloseReplay(0); +// roomToolsVO.setCloseShare(1); +// liveRoom.setRoomToolsVo(roomToolsVO); +// +// liveRoom.setScreenType(0); +// liveRoom.setShareImg("/2023/07/05/e405632be59343a1bb8fa4fff5cf9b16"); +// liveRoom.setType(0); +// +// return liveRoom; +// } +//} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/SeckillData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/SeckillData.java new file mode 100644 index 0000000..cbec3ef --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/SeckillData.java @@ -0,0 +1,56 @@ +package com.tmerclub.cloud.systemtest.data.marketing; + +import cn.hutool.core.bean.BeanUtil; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.seckill.dto.SeckillCategoryDTO; +import com.tmerclub.cloud.seckill.dto.SeckillDTO; +import com.tmerclub.cloud.seckill.dto.SeckillSkuDTO; +import com.moyuer.cloud.systemtest.api.marketing.SeckillApi; +import com.moyuer.cloud.systemtest.api.store.SkuApi; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author lpj + */ +public class SeckillData { + /** + * 秒杀分类数据 + */ + public static SeckillCategoryDTO getSeckillCategoryDTO() { + SeckillCategoryDTO seckillCategoryDTO = new SeckillCategoryDTO(); + seckillCategoryDTO.setCategoryId(null); + seckillCategoryDTO.setName("测试秒杀分类" + new Date()); + + return seckillCategoryDTO; + } + + /** + * 秒杀活动数据 + */ + public static SeckillDTO getSeckillDTO(Long productId, Long seckillCategoryId, Long startTimestamps) { + SeckillDTO seckillDTO = new SeckillDTO(); + seckillDTO.setCategoryId(seckillCategoryId); + seckillDTO.setEndTime(null); + seckillDTO.setMaxNum(10); + seckillDTO.setMaxCancelTime(2); + seckillDTO.setSeckillId(0L); + seckillDTO.setSeckillName("测试秒杀活动"); + seckillDTO.setSeckillTag(null); + seckillDTO.setSelectedLot(SeckillApi.getSeckillList().get(1).getSelectedLot()); + seckillDTO.setSpuId(productId); + seckillDTO.setStartTime(null); + seckillDTO.setStartTimestamps(startTimestamps); + + List skuList = SkuApi.getAllSkuList(productId); + List skuDtos = skuList.stream().map(i -> BeanUtil.copyProperties(i, SeckillSkuDTO.class)).collect(Collectors.toList()); + skuDtos.forEach(i->i.setSeckillPrice(6600L)); + skuDtos.forEach(i->i.setSeckillStocks(100)); + + seckillDTO.setSeckillSkuList(skuDtos); + + return seckillDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderAdminDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderAdminDtoData.java new file mode 100644 index 0000000..8a861eb --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderAdminDtoData.java @@ -0,0 +1,45 @@ +package com.tmerclub.cloud.systemtest.data.order; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.tmerclub.cloud.order.dto.multishop.OrderAdminDTO; +import com.tmerclub.cloud.order.dto.multishop.OrderItemDTO; +import com.moyuer.cloud.systemtest.api.order.OrderApi; + +import java.util.List; + +/** + * @author Tu + */ +public class OrderAdminDtoData { + + public static OrderAdminDTO getOrderAdminDto(Long orderNum, Long changeAmount, Long freightAmount){ + OrderAdminDTO orderAdminDTO = new OrderAdminDTO(); + orderAdminDTO.setOrderId(orderNum); + orderAdminDTO.setOrderAddrDTO(OrderAddrDtoData.getOrderAddrDTO(orderNum)); + OrderVO orderVO = OrderApi.infoOrder(orderNum); + orderAdminDTO.setShopId(orderVO.getShopId()); + orderAdminDTO.setFreightAmount(orderVO.getFreightAmount()); + + List orderItemDTOList = JSON.parseArray(JSON.toJSONString(orderVO.getOrderItems()), OrderItemDTO.class); + orderItemDTOList.get(0).setChangeAmount(changeAmount); + orderAdminDTO.setFreightAmount(freightAmount); + orderAdminDTO.setOrderItems(orderItemDTOList); + return orderAdminDTO; + } + + public static OrderAdminDTO getOrderAdminDto(Long orderNum){ + OrderVO orderVO = OrderApi.infoOrder(orderNum); + OrderAdminDTO orderAdminDTO = getOrderAdminDto(orderNum,5100L,orderVO.getFreightAmount()); + return orderAdminDTO; + } + + /** + * 采购订单 + * */ + public static OrderAdminDTO getSourcingOrderAdminDto(Long orderNum){ + OrderAdminDTO orderAdminDTO = new OrderAdminDTO(); + orderAdminDTO.setOrderId(orderNum); + return orderAdminDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderDtoData.java new file mode 100644 index 0000000..6e64212 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderDtoData.java @@ -0,0 +1,174 @@ +package com.tmerclub.cloud.systemtest.data.order; + +import com.tmerclub.cloud.common.order.dto.DvyTypeDTO; +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.order.dto.ShopCartItemDTO; +import com.tmerclub.cloud.common.product.vo.app.SpuAppVO; +import com.moyuer.cloud.systemtest.api.amount.AddrApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.data.amount.UserAddrDtoData; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Tu + */ +public class OrderDtoData { + public static OrderDTO getOrderDtoData(Long spuId) { + OrderDTO orderDTO = new OrderDTO(); + Long areaId = 440103L; + Long shopId = ProductApi.getProductInfo(spuId).getShopId(); + if (AddrApi.dvyList().isEmpty()) { + AddrApi.addAddr(UserAddrDtoData.getUserAddrDTO()); + } else if (!AddrApi.dvyList().get(0).getAreaId().equals(areaId)) { + AddrApi.updateAddr(UserAddrDtoData.getUpdataUserAddrDTO()); + } + orderDTO.setAddrId(0L); + orderDTO.setCouponIds(new ArrayList<>()); + + DvyTypeDTO dvyTypeDTO = new DvyTypeDTO(); + dvyTypeDTO.setDvyType(1); + dvyTypeDTO.setShopId(shopId); + ArrayList dvyTypeDTOList = new ArrayList<>(); + dvyTypeDTOList.add(dvyTypeDTO); + + orderDTO.setIsScorePay(0); + orderDTO.setUserChangeCoupon(0); + orderDTO.setUserUseScore(0L); + orderDTO.setDvyTypes(dvyTypeDTOList); + return orderDTO; + } + + /** + * 多店铺商品确认订单数据 + */ + public static OrderDTO getOrderDtoData(List shopIds) { + OrderDTO orderDTO = new OrderDTO(); + Long areaId = 440103L; + if (AddrApi.dvyList().isEmpty()) { + AddrApi.addAddr(UserAddrDtoData.getUserAddrDTO()); + } else if (!AddrApi.dvyList().get(0).getAreaId().equals(areaId)) { + AddrApi.updateAddr(UserAddrDtoData.getUpdataUserAddrDTO()); + } + orderDTO.setAddrId(0L); + orderDTO.setCouponIds(new ArrayList<>()); + + ArrayList dvyTypeDTOList = new ArrayList<>(); + for (Long shopId : shopIds) { + DvyTypeDTO dvyTypeDTO = new DvyTypeDTO(); + dvyTypeDTO.setDvyType(1); + dvyTypeDTO.setShopId(shopId); + dvyTypeDTOList.add(dvyTypeDTO); + } + + orderDTO.setIsScorePay(0); + orderDTO.setUserChangeCoupon(0); + orderDTO.setUserUseScore(0L); + orderDTO.setDvyTypes(dvyTypeDTOList); + return orderDTO; + } + + /** + *立即购买,快递配送 + */ + public static OrderDTO getOrderDtoData(Long spuId, Integer count) { + OrderDTO orderDTO = new OrderDTO(); + SpuAppVO product = ProductApi.getProductInfo(spuId); + orderDTO.setAddrId(0L); + orderDTO.setCouponIds(new ArrayList<>()); + + DvyTypeDTO dvyTypeDTO = new DvyTypeDTO(); + dvyTypeDTO.setDvyType(1); + dvyTypeDTO.setShopId(product.getShopId()); + ArrayList dvyTypeDTOList = new ArrayList<>(); + dvyTypeDTOList.add(dvyTypeDTO); + orderDTO.setDvyTypes(dvyTypeDTOList); + + orderDTO.setIsScorePay(0); + orderDTO.setUserChangeCoupon(0); + orderDTO.setUserUseScore(0L); + + ShopCartItemDTO shopCartItemDTO = new ShopCartItemDTO(); + shopCartItemDTO.setCount(count); + shopCartItemDTO.setDistributionUserId(0L); + shopCartItemDTO.setShopId(product.getShopId()); + shopCartItemDTO.setSkuId(product.getSkus().get(0).getSkuId()); + shopCartItemDTO.setSpuId(spuId); + + orderDTO.setShopCartItem(shopCartItemDTO); + + return orderDTO; + } + + /** + * 立即购买,自提 + */ + public static OrderDTO getPickUpOrderDtoData(Long spuId, Integer count) { + OrderDTO orderDTO = new OrderDTO(); + SpuAppVO product = ProductApi.getProductInfo(spuId); + if (AddrApi.dvyList().isEmpty()) { + AddrApi.addAddr(UserAddrDtoData.getUserAddrDTO()); + } + orderDTO.setAddrId(AddrApi.dvyList().get(0).getAddrId()); + orderDTO.setCouponIds(new ArrayList<>()); + + DvyTypeDTO dvyTypeDTO = new DvyTypeDTO(); + dvyTypeDTO.setDvyType(2); + dvyTypeDTO.setShopId(product.getShopId()); + ArrayList dvyTypeDTOList = new ArrayList<>(); + dvyTypeDTOList.add(dvyTypeDTO); + orderDTO.setDvyTypes(dvyTypeDTOList); + + orderDTO.setIsScorePay(0); + orderDTO.setUserChangeCoupon(0); + orderDTO.setUserUseScore(0L); + + ShopCartItemDTO shopCartItemDTO = new ShopCartItemDTO(); + shopCartItemDTO.setCount(count); + shopCartItemDTO.setDistributionUserId(0L); + shopCartItemDTO.setShopId(product.getShopId()); + shopCartItemDTO.setSkuId(product.getSkus().get(0).getSkuId()); + shopCartItemDTO.setSpuId(spuId); + + orderDTO.setShopCartItem(shopCartItemDTO); + + return orderDTO; + } + + /** + * 立即购买,同城 + */ + public static OrderDTO getSameCityOrderDtoData(Long spuId, Integer count) { + OrderDTO orderDTO = new OrderDTO(); + SpuAppVO product = ProductApi.getProductInfo(spuId); + if (AddrApi.dvyList().isEmpty()) { + AddrApi.addAddr(UserAddrDtoData.getUserAddrDTO()); + } + AddrApi.updateAddr(UserAddrDtoData.getUpdateUserAddrDTO(AddrApi.dvyList().get(0).getAddrId())); + orderDTO.setAddrId(AddrApi.dvyList().get(0).getAddrId()); + orderDTO.setCouponIds(new ArrayList<>()); + + DvyTypeDTO dvyTypeDTO = new DvyTypeDTO(); + dvyTypeDTO.setDvyType(4); + dvyTypeDTO.setShopId(product.getShopId()); + ArrayList dvyTypeDTOList = new ArrayList<>(); + dvyTypeDTOList.add(dvyTypeDTO); + orderDTO.setDvyTypes(dvyTypeDTOList); + + orderDTO.setIsScorePay(0); + orderDTO.setUserChangeCoupon(0); + orderDTO.setUserUseScore(0L); + + ShopCartItemDTO shopCartItemDTO = new ShopCartItemDTO(); + shopCartItemDTO.setCount(count); + shopCartItemDTO.setDistributionUserId(0L); + shopCartItemDTO.setShopId(product.getShopId()); + shopCartItemDTO.setSkuId(product.getSkus().get(0).getSkuId()); + shopCartItemDTO.setSpuId(spuId); + + orderDTO.setShopCartItem(shopCartItemDTO); + + return orderDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderRefundDeliveryDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderRefundDeliveryDtoData.java new file mode 100644 index 0000000..1522bb1 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderRefundDeliveryDtoData.java @@ -0,0 +1,21 @@ +package com.tmerclub.cloud.systemtest.data.order; + +import com.tmerclub.cloud.order.dto.app.OrderRefundDeliveryDTO; + +/** + * @author Tu + */ +public class OrderRefundDeliveryDtoData { + public static OrderRefundDeliveryDTO getOrderRefundDeliveryDTO(Long refundId){ + OrderRefundDeliveryDTO orderRefundDeliveryDTO = new OrderRefundDeliveryDTO(); + orderRefundDeliveryDTO.setRefundId(refundId); + orderRefundDeliveryDTO.setDeliveryCompanyId(60L); + orderRefundDeliveryDTO.setDeliveryName("申通快递"); + orderRefundDeliveryDTO.setDeliveryNo("123123123123"); + + orderRefundDeliveryDTO.setImgs(""); + orderRefundDeliveryDTO.setMobile("13333333333"); + orderRefundDeliveryDTO.setSenderRemarks("自动化测试"); + return orderRefundDeliveryDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderSelfStationDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderSelfStationDtoData.java new file mode 100644 index 0000000..4b0e5a3 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderSelfStationDtoData.java @@ -0,0 +1,15 @@ +package com.tmerclub.cloud.systemtest.data.order; + +import com.tmerclub.cloud.common.order.dto.OrderSelfStationDTO; + +/** + * @author lpj + */ +public class OrderSelfStationDtoData { + public static OrderSelfStationDTO getOrderSelfStationDTO(Long orderId, Long stationId) { + OrderSelfStationDTO orderSelfStationDTO = new OrderSelfStationDTO(); + orderSelfStationDTO.setOrderId(orderId); + orderSelfStationDTO.setStationId(stationId); + return orderSelfStationDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/ShopOrderRefundDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/ShopOrderRefundDtoData.java new file mode 100644 index 0000000..f517503 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/ShopOrderRefundDtoData.java @@ -0,0 +1,76 @@ +package com.tmerclub.cloud.systemtest.data.order; + + +import com.tmerclub.cloud.order.dto.multishop.OrderRefundDTO; +import com.moyuer.cloud.systemtest.api.store.ShopRefundAddrApi; +import com.moyuer.cloud.systemtest.data.store.ShopRefundAddrDtoData; + +/** + * @author Tu + */ +public class ShopOrderRefundDtoData { + /** + * 拒绝退款 + * **/ + public static OrderRefundDTO getRufuseOrderRefundDTO(Long refundId){ + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setRefundId(refundId); + orderRefundDTO.setRefundSts(3); + orderRefundDTO.setRejectMessage("自动化测试拒绝退款"); + orderRefundDTO.setSupplierHandleStatus(-1); + return orderRefundDTO; + } + + /** + * 退货退款第一次同意 + * **/ + public static OrderRefundDTO getReceiveRefundDTO(Long refundId){ + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setRefundId(refundId); + orderRefundDTO.setRefundSts(2); + orderRefundDTO.setSupplierHandleStatus(-1); + if (ShopRefundAddrApi.listShopRefundAddr().isEmpty()){ + orderRefundDTO.setShopRefundAddrId(ShopRefundAddrApi.addShopRefundAddr(ShopRefundAddrDtoData.getShopRefundAddrDTO())); + }else { + orderRefundDTO.setShopRefundAddrId(ShopRefundAddrApi.listShopRefundAddr().get(0).getShopRefundAddrId()); + } + + return orderRefundDTO; + } + /** + * 退货申请用户已发货拒绝退款 + * **/ + public static OrderRefundDTO getRefuseDeliveryRefundDTO(Long refundId){ + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setIsReceived(true); + orderRefundDTO.setRefundId(refundId); + orderRefundDTO.setRefundSts(3); + orderRefundDTO.setRejectMessage("自动化测试拒绝退款"); + orderRefundDTO.setSupplierHandleStatus(-1); + return orderRefundDTO; + } + + /** + * 同意退货退款第二步 + * */ + public static OrderRefundDTO getReceiveDeliveryRefundDTO(Long refundId){ + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setShopRefundAddrId(ShopRefundAddrApi.listShopRefundAddr().get(0).getShopRefundAddrId()); + orderRefundDTO.setRefundId(refundId); + orderRefundDTO.setRefundSts(2); + orderRefundDTO.setRejectMessage("自动化测试同意退货退款"); + orderRefundDTO.setSupplierHandleStatus(-1); + orderRefundDTO.setIsReceived(true); + return orderRefundDTO; + } + + public static OrderRefundDTO getSupplierRefundDTO(Long refundId){ + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setRefundId(refundId); + orderRefundDTO.setRefundSts(4); + orderRefundDTO.setRejectMessage("转移供应商处理"); + orderRefundDTO.setSupplierHandleStatus(0); + orderRefundDTO.setIsReceived(false); + return orderRefundDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/SpuCommDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/SpuCommDtoData.java new file mode 100644 index 0000000..3d2eba2 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/SpuCommDtoData.java @@ -0,0 +1,20 @@ +package com.tmerclub.cloud.systemtest.data.order; + +import com.tmerclub.cloud.product.dto.SpuCommDTO; + +/** + * @author Tu + */ +public class SpuCommDtoData { + public static SpuCommDTO getSpuCommDtoData(Long orderItemId) { + SpuCommDTO spuCommDTO = new SpuCommDTO(); + spuCommDTO.setContent("自动化评价"); + spuCommDTO.setEvaluate(0); + spuCommDTO.setIsAnonymous(1); + spuCommDTO.setOrderItemId(orderItemId); + spuCommDTO.setScore(5); + spuCommDTO.setPics(""); + + return spuCommDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/SubmitOrderDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/SubmitOrderDtoData.java new file mode 100644 index 0000000..1c76488 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/SubmitOrderDtoData.java @@ -0,0 +1,85 @@ +package com.tmerclub.cloud.systemtest.data.order; + +import com.tmerclub.cloud.common.order.dto.OrderSelfStationDTO; +import com.tmerclub.cloud.common.order.dto.OrderShopDTO; +import com.tmerclub.cloud.common.order.dto.SubmitOrderDTO; +import com.moyuer.cloud.systemtest.api.amount.AddrApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.order.ShopStationApi; +import com.moyuer.cloud.systemtest.api.order.StationApi; +import com.moyuer.cloud.systemtest.data.store.ShopStationDtoData; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Tu + */ +public class SubmitOrderDtoData { + public static SubmitOrderDTO getSubmitOrderDtoData(Long productId) { + SubmitOrderDTO submitOrderDTO = new SubmitOrderDTO(); + + OrderShopDTO orderShopParam = new OrderShopDTO(); + Long shopId = ProductApi.getProductInfo(productId).getShopId(); + orderShopParam.setShopId(shopId); + orderShopParam.setRemarks(""); + ArrayList orderShopDTOList = new ArrayList<>(); + orderShopDTOList.add(orderShopParam); + + submitOrderDTO.setOrderInvoiceList(null); + submitOrderDTO.setOrderSelfStationDto(new OrderSelfStationDTO()); + submitOrderDTO.setVirtualRemarkList(new ArrayList<>()); + submitOrderDTO.setOrderShopParam(orderShopDTOList); + return submitOrderDTO; + } + + /** + * 多店铺订单提交订单 + */ + public static SubmitOrderDTO getSubmitOrderDtoData(List shopIds) { + SubmitOrderDTO submitOrderDTO = new SubmitOrderDTO(); + + ArrayList orderShopDTOList = new ArrayList<>(); + for(Long shopId : shopIds) { + OrderShopDTO orderShopParam = new OrderShopDTO(); + orderShopParam.setShopId(shopId); + orderShopParam.setRemarks(""); + orderShopDTOList.add(orderShopParam); + } + + submitOrderDTO.setOrderInvoiceList(null); + submitOrderDTO.setOrderSelfStationDto(new OrderSelfStationDTO()); + submitOrderDTO.setVirtualRemarkList(new ArrayList<>()); + submitOrderDTO.setOrderShopParam(orderShopDTOList); + return submitOrderDTO; + } + + /** + * 提交自提订单 + */ + public static SubmitOrderDTO getPickUpSubmitOrderDtoData(Long productId) { + SubmitOrderDTO submitOrderDTO = new SubmitOrderDTO(); + + OrderShopDTO orderShopParam = new OrderShopDTO(); + Long shopId = ProductApi.getProductInfo(productId).getShopId(); + orderShopParam.setShopId(shopId); + orderShopParam.setRemarks(""); + ArrayList orderShopDTOList = new ArrayList<>(); + orderShopDTOList.add(orderShopParam); + submitOrderDTO.setOrderShopParam(orderShopDTOList); + + submitOrderDTO.setOrderInvoiceList(null); + submitOrderDTO.setVirtualRemarkList(new ArrayList<>()); + + OrderSelfStationDTO orderSelfStationDTO = new OrderSelfStationDTO(); + if (StationApi.getStationList(shopId).isEmpty()) { + ShopStationApi.addStation(ShopStationDtoData.getStationDTO()); + } + orderSelfStationDTO.setStationId(StationApi.getStationList(shopId).get(0).getStationId()); + orderSelfStationDTO.setStationUserName(AddrApi.dvyList().get(0).getConsignee()); + orderSelfStationDTO.setStationUserMobile(AddrApi.dvyList().get(0).getMobile()); + submitOrderDTO.setOrderSelfStationDto(orderSelfStationDTO); + + return submitOrderDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/WalletAssert.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/WalletAssert.java new file mode 100644 index 0000000..cfa0564 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/WalletAssert.java @@ -0,0 +1,133 @@ +package com.tmerclub.cloud.systemtest.data.order; + +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.order.vo.OrderDetailVO; +import com.tmerclub.cloud.order.vo.OrderItemDetailVO; +import org.testng.Assert; + +/** + * @author lpj + */ +public class WalletAssert { + /** + * 商家店铺结算记录验证 + * @param mongoShopWalletLogBO 店铺结算记录 + * @param amountType 金额类型 0 待结算金额 1 店铺余额 2 冻结金额 + * @param shopIoType 收支类型 0 支出 1 收入 + * @param shopChangeAmount 改变金额 + * @param userAmount 操作金额 + * @param platformAmount 平台优惠金额 + * @param shopReduceAmount 商家优惠金额 + * @param distributionAmount 分销占用金额 + * @param shopPlatformCommission 平台佣金 + * @param reason 资金变化原因 0 用户支付 1 订单结算 2 用户申请退款成功 4 提现申请 5 提现申请被拒绝 6 提现申请通过 9 扣除订单分销金额 + * 11 充值成功 12 扣除订单采购金额 13 商家自行处理采购价差 14 超时未支付尾款 + */ + public static void shopWalletLogAssert(MongoShopWalletLogBO mongoShopWalletLogBO, Integer amountType, Integer shopIoType, Long shopChangeAmount, Long userAmount, + Long platformAmount, Long shopReduceAmount, Long distributionAmount, Long shopPlatformCommission, Integer reason) { + //金额类型 + Assert.assertEquals(mongoShopWalletLogBO.getAmountType(), amountType); + //收支类型 + Assert.assertEquals(mongoShopWalletLogBO.getShopIoType(), shopIoType); + //改变金额 + Assert.assertEquals(mongoShopWalletLogBO.getShopChangeAmount(), shopChangeAmount); + //操作金额 + Assert.assertEquals(mongoShopWalletLogBO.getUserAmount(), userAmount); + //平台优惠金额 + Assert.assertEquals(mongoShopWalletLogBO.getPlatformAmount(), platformAmount); + //商家优惠金额 + Assert.assertEquals(mongoShopWalletLogBO.getShopReduceAmount(), shopReduceAmount); + //分销占用金额 + Assert.assertEquals(mongoShopWalletLogBO.getDistributionAmount(), distributionAmount); + //平台佣金 + Assert.assertEquals(mongoShopWalletLogBO.getShopPlatformCommission(), shopPlatformCommission); + //资金变化原因 + Assert.assertEquals(mongoShopWalletLogBO.getReason(), reason); + } + + /** + * 商家结算明细数据验证 + * @param orderItemDetailVO 店铺结算单条数据 + * @param spuTotalAmount 商品总金额 + * @param actualTotal 用户支付金额 + * @param itemPurchaseAmount 供货价 + * @param multiShopReduce 商家优惠金额 + * @param platformShareReduce 平台优惠金额 + * @param distributionAmount 分销金额 + * @param useScore 使用积分 + * @param rate 平台分账 + * @param platformCommission 平台佣金 + * @param scoreAmount 积分抵扣金额 + * @param memberAmount 会员折扣金额 + * @param platformCouponAmount 平台优惠券优惠金额 + * @param shopCouponAmount 店铺优惠券优惠金额 + * @param discountAmount 满减优惠金额 + * @param seckillAmount 秒杀优惠金额 + * @param groupAmount 拼团优惠金额 + * @param shopChangeFreeAmount 商家改价金额 + * @param refundAmount 退款金额 + * @param count 商品数量 + * @param refundCount 退款数量 + */ + public static void shopOrderDetailAssert(OrderItemDetailVO orderItemDetailVO, Long spuTotalAmount, Long actualTotal, Long itemPurchaseAmount, Long multiShopReduce, + Long platformShareReduce, Long distributionAmount, Long useScore, Double rate, Long platformCommission, Long scoreAmount, + Long memberAmount, Long platformCouponAmount, Long shopCouponAmount, Long discountAmount, Long seckillAmount, + Long groupAmount, Long shopChangeFreeAmount, Long refundAmount, Integer count, Integer refundCount) { + //商品总金额 + Assert.assertEquals(orderItemDetailVO.getSpuTotalAmount(), spuTotalAmount); + //用户支付金额 + Assert.assertEquals(orderItemDetailVO.getActualTotal(), actualTotal); + //供货价 + Assert.assertEquals(orderItemDetailVO.getItemPurchaseAmount(), itemPurchaseAmount); + //商家优惠金额 + Assert.assertEquals(orderItemDetailVO.getMultishopReduce(), multiShopReduce); + //平台优惠金额 + Assert.assertEquals(orderItemDetailVO.getPlatformShareReduce(), platformShareReduce); + //分销金额 + Assert.assertEquals(orderItemDetailVO.getDistributionAmount(), distributionAmount); + //使用积分 + Assert.assertEquals(orderItemDetailVO.getUseScore(), useScore); + //平台分账 + Assert.assertEquals(orderItemDetailVO.getRate(), rate); + //平台佣金 + Assert.assertEquals(orderItemDetailVO.getPlatformCommission(), platformCommission); + //积分抵扣金额 + Assert.assertEquals(orderItemDetailVO.getScoreAmount(), scoreAmount); + //会员折扣金额 + Assert.assertEquals(orderItemDetailVO.getMemberAmount(), memberAmount); + //平台优惠券优惠金额 + Assert.assertEquals(orderItemDetailVO.getPlatformCouponAmount(), platformCouponAmount); + //店铺优惠券优惠金额 + Assert.assertEquals(orderItemDetailVO.getShopCouponAmount(), shopCouponAmount); + //满减优惠金额 + Assert.assertEquals(orderItemDetailVO.getDiscountAmount(),discountAmount); + //秒杀优惠金额 + Assert.assertEquals(orderItemDetailVO.getSeckillAmount(), seckillAmount); + //拼团优惠金额 + Assert.assertEquals(orderItemDetailVO.getGroupAmount(), groupAmount); + //商家改价金额 + Assert.assertEquals(orderItemDetailVO.getShopChangeFreeAmount(), shopChangeFreeAmount); + //退款金额 + Assert.assertEquals(orderItemDetailVO.getRefundAmount(), refundAmount); + //商品数量 + Assert.assertEquals(orderItemDetailVO.getCount(), count); + //退款数量 + Assert.assertEquals(orderItemDetailVO.getRefundCount(), refundCount); + } + + /** + * 商家订单运费验证 + * @param orderDetailVO 订单结算明细 + * @param freightAmount 订单运费 + * @param freeFreightAmount 商家减免运费 + * @param platformFreeFreightAmount 平台减免运费 + */ + public static void shopOrderFreightAssert(OrderDetailVO orderDetailVO, Long freightAmount, Long freeFreightAmount, Long platformFreeFreightAmount) { + //订单运费 + Assert.assertEquals(orderDetailVO.getFreightAmount(), freightAmount); + //商家减免运费 + Assert.assertEquals(orderDetailVO.getFreeFreightAmount(), freeFreightAmount); + //平台减免运费 + Assert.assertEquals(orderDetailVO.getPlatformFreeFreightAmount(), platformFreeFreightAmount); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/DeliveryScoreOrderDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/DeliveryScoreOrderDtoData.java new file mode 100644 index 0000000..b3491e1 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/DeliveryScoreOrderDtoData.java @@ -0,0 +1,63 @@ +package com.tmerclub.cloud.systemtest.data.platform; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.moyuer.cloud.systemtest.api.platform.ScoreOrderApi; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author lpj + */ +public class DeliveryScoreOrderDtoData { + /** + * 积分订单快递发货数据 + */ + public static DeliveryOrderDTO getDeliveryScoreOrderDtoData(Long orderNum) { + DeliveryOrderDTO deliveryOrderDTO = new DeliveryOrderDTO(); + deliveryOrderDTO.setOrderId(orderNum); + deliveryOrderDTO.setOrderAddrId(orderNum); + deliveryOrderDTO.setDeliveryCompanyId(16L); + deliveryOrderDTO.setDeliveryNo("123456789"); + deliveryOrderDTO.setDeliveryType(1); + + OrderItemVO orderItem = ScoreOrderApi.getScoreOrderItemAndAddress(orderNum).getOrderItems().get(0); + + OrderVO address = ScoreOrderApi.getScoreOrderItemAndAddress(orderNum); + + List deliveryOrderItemDTOList = new ArrayList<>(); + DeliveryOrderItemDTO deliveryOrderItemDTO = new DeliveryOrderItemDTO(); + deliveryOrderDTO.setDeliveryOrderId(orderItem.getOrderItemId()); + deliveryOrderItemDTO.setOrderItemId(orderItem.getOrderItemId()); + deliveryOrderItemDTO.setChangeNum(1); + deliveryOrderItemDTOList.add(deliveryOrderItemDTO); + deliveryOrderDTO.setSelectOrderItems(deliveryOrderItemDTOList); + deliveryOrderDTO.setOrderAddrId(address.getOrderAddrId()); + return deliveryOrderDTO; + } + + /** + * 积分订单无需快递发货数据 + */ + public static DeliveryOrderDTO getNoDeliveryScoreOrderDtoData(Long orderNum) { + DeliveryOrderDTO deliveryOrderDTO = new DeliveryOrderDTO(); + deliveryOrderDTO.setOrderId(orderNum); + deliveryOrderDTO.setOrderAddrId(orderNum); + deliveryOrderDTO.setDeliveryType(3); + + List deliveryOrderItemDTOList = new ArrayList<>(); + DeliveryOrderItemDTO deliveryOrderItemDTO = new DeliveryOrderItemDTO(); + OrderItemVO orderItem = ScoreOrderApi.getScoreOrderItemAndAddress(orderNum).getOrderItems().get(0); + OrderVO address = ScoreOrderApi.getScoreOrderItemAndAddress(orderNum); + deliveryOrderDTO.setDeliveryOrderId(orderItem.getOrderItemId()); + deliveryOrderItemDTO.setOrderItemId(orderItem.getOrderItemId()); + deliveryOrderItemDTO.setChangeNum(1); + deliveryOrderItemDTOList.add(deliveryOrderItemDTO); + deliveryOrderDTO.setSelectOrderItems(deliveryOrderItemDTOList); + deliveryOrderDTO.setOrderAddrId(address.getOrderAddrId()); + return deliveryOrderDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/UserLevelDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/UserLevelDtoData.java new file mode 100644 index 0000000..9d6ff42 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/UserLevelDtoData.java @@ -0,0 +1,31 @@ +package com.tmerclub.cloud.systemtest.data.platform; + +import cn.hutool.core.bean.BeanUtil; +import com.moyuer.cloud.systemtest.api.platform.UserLevelApi; +import com.tmerclub.cloud.user.dto.UserLevelDTO; +import com.tmerclub.cloud.user.dto.UserLevelTermDTO; +import com.tmerclub.cloud.user.vo.UserLevelTermVO; +import com.tmerclub.cloud.user.vo.UserLevelVO; +import org.springframework.beans.BeanUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author lpj + */ +public class UserLevelDtoData { + public static UserLevelDTO getUserLevelDTO(Long userLevelId, List userRightsIds) { + UserLevelVO userLevelVO = UserLevelApi.info(userLevelId); + UserLevelDTO userLevelDTO = new UserLevelDTO(); + BeanUtils.copyProperties(userLevelVO, userLevelDTO); + + List userLevelTerms = userLevelVO.getUserLevelTerms(); + List userLevelTermDTOList = userLevelTerms.stream().map(i -> BeanUtil.copyProperties(i, UserLevelTermDTO.class)).collect(Collectors.toList()); + userLevelDTO.setUserLevelTerms(userLevelTermDTOList); + + userLevelDTO.setUserRightsIds(userRightsIds); + + return userLevelDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/UserRightsDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/UserRightsDtoData.java new file mode 100644 index 0000000..968f8b7 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/UserRightsDtoData.java @@ -0,0 +1,54 @@ +package com.tmerclub.cloud.systemtest.data.platform; + +import com.tmerclub.cloud.user.dto.UserRightsDTO; + +import java.util.ArrayList; + +/** + * @author lpj + */ +public class UserRightsDtoData { + /** + * 平台打8折 + */ + public static UserRightsDTO getDiscounttUserRightsDTO(Integer discount) { + UserRightsDTO userRightsDTO = new UserRightsDTO(); + userRightsDTO.setCouponIds(new ArrayList<>()); + userRightsDTO.setDescription("自动化打8折"); + userRightsDTO.setDetails("

自动化打8折

"); + userRightsDTO.setDiscount(discount); + userRightsDTO.setDiscountRange(0); + userRightsDTO.setFreeFeeType(2); + userRightsDTO.setIcon("/test.png"); + userRightsDTO.setPresScore(0L); + userRightsDTO.setRateScore(0); + userRightsDTO.setRightsId(null); + userRightsDTO.setRightsName("自动化打8折"); + userRightsDTO.setRightsType(4); + userRightsDTO.setSeq(1); + + return userRightsDTO; + } + + /** + * 平台包邮 + */ + public static UserRightsDTO getFreeFeeUserRightsDTO() { + UserRightsDTO userRightsDTO = new UserRightsDTO(); + userRightsDTO.setCouponIds(new ArrayList<>()); + userRightsDTO.setDescription("平台包邮"); + userRightsDTO.setDetails("

平台包邮

"); + userRightsDTO.setDiscount(null); + userRightsDTO.setDiscountRange(0); + userRightsDTO.setFreeFeeType(1); + userRightsDTO.setIcon("/test.png"); + userRightsDTO.setPresScore(0L); + userRightsDTO.setRateScore(0); + userRightsDTO.setRightsId(null); + userRightsDTO.setRightsName("平台包邮"); + userRightsDTO.setRightsType(5); + userRightsDTO.setSeq(1); + + return userRightsDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/SameCityDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/SameCityDtoData.java new file mode 100644 index 0000000..2d221b6 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/SameCityDtoData.java @@ -0,0 +1,58 @@ +package com.tmerclub.cloud.systemtest.data.store; + +import com.tmerclub.cloud.common.bean.BmapPoint; +import com.moyuer.cloud.delivery.dto.SameCityDTO; +import com.moyuer.cloud.systemtest.api.store.SameCityApi; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author lpj + */ +public class SameCityDtoData { + public static SameCityDTO getSameCityDTO() { + SameCityDTO sameCityDTO = new SameCityDTO(); + sameCityDTO.setChargeType(1); + sameCityDTO.setDefaultDistance(0.0); + sameCityDTO.setDeliveryFee(100L); + sameCityDTO.setFreeWeight(1.0); + sameCityDTO.setLat(22.943853); + sameCityDTO.setLng(113.390465); + sameCityDTO.setOverDistance(0.0); + sameCityDTO.setOverDistanceFee(0L); + sameCityDTO.setOverWeight(1.0); + sameCityDTO.setOverWeightFee(100L); + sameCityDTO.setPositionInfo(null); + sameCityDTO.setSamecityId(SameCityApi.getSameCityInfo().getSamecityId()); + sameCityDTO.setShopId(SameCityApi.getSameCityInfo().getShopId()); + sameCityDTO.setStartFee(1L); + sameCityDTO.setStatus(1); + + List polygonPath = new ArrayList<>(); + BmapPoint upperLeft = new BmapPoint(); + upperLeft.setLat(22.760551); + upperLeft.setLng(113.199306); + polygonPath.add(upperLeft); + + BmapPoint upperRight = new BmapPoint(); + upperRight.setLat(22.755218); + upperRight.setLng(113.541955); + polygonPath.add(upperRight); + + BmapPoint lowerLeft = new BmapPoint(); + lowerLeft.setLat(23.096059); + lowerLeft.setLng(113.573001); + polygonPath.add(lowerLeft); + + BmapPoint lowerRight = new BmapPoint(); + lowerRight.setLat(23.06095); + lowerRight.setLng(113.161361); + polygonPath.add(lowerRight); + + sameCityDTO.setPolygonPath(polygonPath); + sameCityDTO.setPositionInfo("[{\"lat\":0.068656,\"lng\":44.169773},{\"lat\":40.685259,\"lng\":147.930527},{\"lat\":54.342124,\"lng\":166.916358},{\"lat\":53.909883,\"lng\":82.436151}]"); + + return sameCityDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/ShopStationDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/ShopStationDtoData.java new file mode 100644 index 0000000..e647020 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/ShopStationDtoData.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.systemtest.data.store; + +import com.moyuer.cloud.delivery.dto.StationDTO; + +/** + * @author lpj + */ +public class ShopStationDtoData { + public static StationDTO getStationDTO() { + StationDTO stationDTO = new StationDTO(); + stationDTO.setAddr("清河东路319号"); + stationDTO.setArea("番禺区"); + stationDTO.setAreaId(440113L); + stationDTO.setCity("广州市"); + stationDTO.setCityId(4401L); + stationDTO.setLat(22.93772); + stationDTO.setLng(113.39424); + stationDTO.setMobile("18888888888"); + stationDTO.setProvince("广东省"); + stationDTO.setProvinceId(44L); + stationDTO.setStationId(0L); + stationDTO.setStationName("自动化测试门店"); + stationDTO.setStatus(1); + stationDTO.setTimeInfo("{\"shopTime\":[1580515200000,1580558400000]}"); + + return stationDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/SpuPageSearchDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/SpuPageSearchDtoData.java new file mode 100644 index 0000000..5fdf676 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/SpuPageSearchDtoData.java @@ -0,0 +1,19 @@ +package com.tmerclub.cloud.systemtest.data.store; + +import com.tmerclub.cloud.product.dto.SpuPageSearchDTO; + +import java.util.List; + +/** + * @author lpj + */ +public class SpuPageSearchDtoData { + public static SpuPageSearchDTO getSpuPageSearchDTO(Long productId, List productIds, Integer status) { + SpuPageSearchDTO spuPageSearchDTO = new SpuPageSearchDTO(); + spuPageSearchDTO.setSpuId(productId); + spuPageSearchDTO.setSpuIds(productIds); + spuPageSearchDTO.setStatus(status); + + return spuPageSearchDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/supplier/SupplierOrderRefundDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/supplier/SupplierOrderRefundDtoData.java new file mode 100644 index 0000000..75a5fd4 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/supplier/SupplierOrderRefundDtoData.java @@ -0,0 +1,57 @@ +package com.tmerclub.cloud.systemtest.data.supplier; + +import com.tmerclub.cloud.order.dto.multishop.OrderRefundDTO; +import com.moyuer.cloud.systemtest.api.store.ShopRefundAddrApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierRefundAddrApi; + +/** + * @author Tu + */ +public class SupplierOrderRefundDtoData { + + public static OrderRefundDTO getRufuseOrderRefundDTO(Long refundId){ + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setRefundId(refundId); + orderRefundDTO.setRefundSts(3); + orderRefundDTO.setRejectMessage("自动化测试拒绝退款"); + orderRefundDTO.setSupplierHandleStatus(2); + return orderRefundDTO; + } + /** + * 接受退货退款申请 + * */ + public static OrderRefundDTO getSupplierReceiveRefundDTO(Long refundId){ + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setRefundId(refundId); + orderRefundDTO.setRefundSts(2); + orderRefundDTO.setSupplierHandleStatus(1); + if (SupplierRefundAddrApi.listSupplierRefundAddr().isEmpty()){ + orderRefundDTO.setShopRefundAddrId(SupplierRefundAddrApi.addSupplierRefundAddr(SupplierRefundAddrDtoData.getSupplierRefundAddrDTO())); + }else { + orderRefundDTO.setShopRefundAddrId(SupplierRefundAddrApi.listSupplierRefundAddr().get(0).getSupplierRefundAddrId()); + } + + return orderRefundDTO; + } + + public static OrderRefundDTO getRefuseDeliveryRefundDTO(Long refundId){ + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setIsReceived(true); + orderRefundDTO.setRefundId(refundId); + orderRefundDTO.setRefundSts(3); + orderRefundDTO.setRejectMessage("自动化测试拒绝退货退款"); + orderRefundDTO.setSupplierHandleStatus(2); + return orderRefundDTO; + } + + public static OrderRefundDTO getReceiveDeliveryRefundDTO(Long refundId){ + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setShopRefundAddrId(ShopRefundAddrApi.listShopRefundAddr().get(0).getShopRefundAddrId()); + orderRefundDTO.setRefundId(refundId); + orderRefundDTO.setRefundSts(2); + orderRefundDTO.setRejectMessage("自动化测试同意退货退款"); + orderRefundDTO.setSupplierHandleStatus(1); + orderRefundDTO.setIsReceived(true); + return orderRefundDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/supplier/SupplierProductData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/supplier/SupplierProductData.java new file mode 100644 index 0000000..e5863e9 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/supplier/SupplierProductData.java @@ -0,0 +1,122 @@ +package com.tmerclub.cloud.systemtest.data.supplier; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.product.dto.CategoryShopDTO; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.product.dto.SpuPageSearchDTO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.store.ShopSubstituteSalesApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierProductApi; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.platform.CategoryDtoData; +import com.moyuer.cloud.systemtest.data.store.ShopSubstituteSalesDtoData; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @author Tu + */ +public class SupplierProductData { + private static final Integer SUPPLIER_DELIVERY = 1; + private static final Integer SHOP_DELIVERY = 2; + + /** + * 供应商发布商品 + * @param supplyPrice 供货价 + * @param deliverTemplateId 运费模板id + * @param isMainSupplier 是否是主供应商:supplier_token + */ + public static Long getSupplierProductId(Long supplyPrice, Long deliverTemplateId, Boolean isMainSupplier) { + List supplierCategoryList = CategoryApi.listSupplierCategory(isMainSupplier); + if (supplierCategoryList.size() == 0) { + CategoryApi.addSupplierCategory(getCategoryShopDtoList(CategoryApi.listSupplierApplyCategory(isMainSupplier).get(0).getCategoryId()), isMainSupplier); + } + Long categoryId = CategoryApi.listSupplierCategory(isMainSupplier).get(0).getCategoryId(); + + double deductionRateTemp = 1.99; + if (CategoryApi.getCategoryInfo(categoryId).getDeductionRate() != deductionRateTemp) { + CategoryApi.update(CategoryDtoData.getCategoryDTO(categoryId)); + } + return SupplierProductApi.createProduct(SpuData.getSupplierSpu(categoryId, deliverTemplateId, supplyPrice), isMainSupplier); + } + + /** + * 商家代销供应商商品 + * @param supplierProductId 供应商商品id + * @param priceFee 销售价 + * @param supplierDeliveryType 发货方式 1 供应商发货 2 商家发货 + * @param deliverTemplateId 商家发货时运费模板id + * @param isMainSupplier 是否是主供应商的商品:supplier_token + * @param isMainShop 是否是主商家 :shop_token + */ + public static Long getProductId(Long supplierProductId, Long priceFee, Integer supplierDeliveryType, Long deliverTemplateId, Boolean isMainSupplier, Boolean isMainShop) { + //修改代销设置为手动设置,直接转为待采购订单 + ShopSubstituteSalesApi.updateShopSubstituteSales(ShopSubstituteSalesDtoData.getShopSubstituteSalesDTO(1, 0, null, 0), true); + + //如果商家端没有签约即将发布商品的分类,则签约 + Long categoryId = SupplierProductApi.info(supplierProductId, isMainSupplier).getCategoryId(); + List categoryAppVOList = CategoryApi.listSigningCategory(isMainShop); + List collect = categoryAppVOList.stream().map(CategoryAppVO::getCategoryId).toList(); + if(!collect.contains(categoryId)) { + CategoryApi.addSigningCategory(getCategoryShopDtoList(categoryId), isMainShop); + } + Object obj = ProductApi.addSupplierProduct(Collections.singletonList(supplierProductId), isMainShop).get(0); + Long productId; + if (obj instanceof Integer) { + Integer ob = (Integer) obj; + productId = ob.longValue(); + } else { + productId = (Long) obj; + } + SpuVO spuVO = ProductApi.info(productId, isMainShop); + SpuDTO spuDTO = JSON.parseObject(JSON.toJSONString(spuVO), SpuDTO.class); + List skuDTOList = JSON.parseArray(JSON.toJSONString(spuVO.getSkus()), SkuDTO.class); + if (supplierDeliveryType.equals(SUPPLIER_DELIVERY) && ShopSubstituteSalesApi.getShopSubstituteSales().getSalesType().equals(0)) { + spuDTO.setSkuList(skuDTOList); + } + if (supplierDeliveryType.equals(SUPPLIER_DELIVERY) && ShopSubstituteSalesApi.getShopSubstituteSales().getSalesType().equals(1)) { + skuDTOList.forEach(i->i.setPriceFee(priceFee)); + spuDTO.setSkuList(skuDTOList); + } + if (supplierDeliveryType.equals(SHOP_DELIVERY)) { + skuDTOList.forEach(i->i.setPriceFee(priceFee)); + skuDTOList.forEach(i->i.setStock(100)); + skuDTOList.forEach(i->i.setChangeStock(100)); + spuDTO.setSkuList(skuDTOList); + } + spuDTO.setSkuList(skuDTOList); + Long shopCategoryId = CategoryApi.listShopCategory(isMainShop).get(1).getCategoryId(); + spuDTO.setShopCategoryId(shopCategoryId); + spuDTO.setPriceFee(priceFee); + spuDTO.setSupplierDeliveryType(supplierDeliveryType); + if (supplierDeliveryType.equals(SHOP_DELIVERY)) { + spuDTO.setDeliveryTemplateId(deliverTemplateId); + } + + ProductApi.update(spuDTO, isMainShop); + ProductApi.onlineProduct(getSpuPageSearchDTO(productId), isMainShop); + return productId; + } + + public static List getCategoryShopDtoList(Long categoryId) { + List categoryShopDTOList= new ArrayList<>(); + CategoryShopDTO categoryShopDTO = new CategoryShopDTO(); + categoryShopDTO.setCategoryId(categoryId); + categoryShopDTO.setQualifications(null); + categoryShopDTOList.add(categoryShopDTO); + return categoryShopDTOList; + } + public static SpuPageSearchDTO getSpuPageSearchDTO(Long productId) { + SpuPageSearchDTO spuPageSearchDTO = new SpuPageSearchDTO(); +// spuPageSearchDTO.setIsCommission(1); + spuPageSearchDTO.setSpuId(productId); + spuPageSearchDTO.setStatus(1); + return spuPageSearchDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/supplier/SupplierRefundAddrDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/supplier/SupplierRefundAddrDtoData.java new file mode 100644 index 0000000..9c7bc83 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/supplier/SupplierRefundAddrDtoData.java @@ -0,0 +1,24 @@ +package com.tmerclub.cloud.systemtest.data.supplier; + +import com.tmerclub.cloud.supplier.dto.SupplierRefundAddrDTO; + +/** + * @author Tu + */ +public class SupplierRefundAddrDtoData { + public static SupplierRefundAddrDTO getSupplierRefundAddrDTO(){ + SupplierRefundAddrDTO supplierRefundAddrDTO = new SupplierRefundAddrDTO(); + supplierRefundAddrDTO.setAddr("自动化测试地址"); + supplierRefundAddrDTO.setArea("天河区"); + supplierRefundAddrDTO.setCity("广州市"); + supplierRefundAddrDTO.setCityId(4401L); + supplierRefundAddrDTO.setIsDefault(0); + supplierRefundAddrDTO.setMobile("12345678901"); + supplierRefundAddrDTO.setAreaId(440106L); + supplierRefundAddrDTO.setProvince("广东省"); + supplierRefundAddrDTO.setProvinceId(44L); + supplierRefundAddrDTO.setConsignee("自动化测试收货人"); + supplierRefundAddrDTO.setSupplierRefundAddrId(0L); + return supplierRefundAddrDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/amount/FreightTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/amount/FreightTest.java new file mode 100644 index 0000000..f82f873 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/amount/FreightTest.java @@ -0,0 +1,199 @@ +package com.tmerclub.cloud.systemtest.test.amount; + +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.order.MyOrderApi; +import com.moyuer.cloud.systemtest.api.order.ShopCartApi; +import com.moyuer.cloud.systemtest.api.store.ShopWalletApi; +import com.moyuer.cloud.systemtest.api.store.TransportApi; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.order.OrderDtoData; +import com.moyuer.cloud.systemtest.data.order.ShopCartData; +import com.moyuer.cloud.systemtest.data.order.SubmitOrderDtoData; +import com.moyuer.cloud.systemtest.data.platform.CategoryDtoData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author lpj + */ +public class FreightTest { + private static List getCategoryId(Boolean isMainShop) { + List categoryAppVOList = CategoryApi.listShopCategory(isMainShop); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(isMainShop).get(0).getCategoryId(); + CategoryApi.update(CategoryDtoData.getCategoryDTO(categoryId)); + return Stream.of(categoryId, shopCategoryId).collect(Collectors.toList()); + } + + @Test(description = "按件计算运费,购买多件相同商品,运费是否正确") + public void sameProductsFreightWithCount() { + //运费模板-首件2运费10,续件1运费5 + TransportApi.addTransport(DeliveryData.getTransportDTO(0, 2D, 1000L, 1D, 500L, 0, null, null, null), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + sameProductFreight(transportId); + } + + @Test(description = "按件计算运费,购买多件不同商品,运费是否正确") + public void differentProductsFreightWithCount() { + //运费模板-首件2运费10,续件1运费5 + TransportApi.addTransport(DeliveryData.getTransportDTO(0, 2D, 1000L, 1D, 500L, 0, null, null, null), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + differentProducts(transportId); + } + + @Test(description = "按重量计算运费,购买多件相同商品,运费是否正确") + public void sameProductsFreightWithWeight() { + //运费模板-首千克2运费10,续件1运费5 + TransportApi.addTransport(DeliveryData.getTransportDTO(1, 2D, 1000L, 1D, 500L, 0, null, null, null), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + sameProductFreight(transportId); + } + + @Test(description = "按重量计算运费,购买多件不同商品,运费是否正确") + public void differentProductsFreightWithWeight() { + //运费模板-首千克2运费10,续件1运费5 + TransportApi.addTransport(DeliveryData.getTransportDTO(1, 2D, 1000L, 1D, 500L, 0, null, null, null), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + differentProducts(transportId); + } + + @Test(description = "按体积计算运费,购买多件相同商品,运费是否正确") + public void sameProductsFreightWithVolume() { + //运费模板-首立方2运费10,续件1运费5 + TransportApi.addTransport(DeliveryData.getTransportDTO(2, 2D, 1000L, 1D, 500L, 0, null, null, null), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + sameProductFreight(transportId); + } + + @Test(description = "按体积计算运费,购买多件不同商品,运费是否正确") + public void differentProductsFreightWithVolume() { + //运费模板-首立方2运费10,续件1运费5 + TransportApi.addTransport(DeliveryData.getTransportDTO(2, 2D, 1000L, 1D, 500L, 0, null, null, null), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + differentProducts(transportId); + } + + @Test(description = "同一运费模板,不同商品,运费是否正确") + public void differentProductsWithSameTransport() { + List categoryIds = getCategoryId(true); + //运费模板-首件2运费10,续件1运费5 + TransportApi.addTransport(DeliveryData.getTransportDTO(0, 2D, 1000L, 1D, 500L, 0, null, null, null), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productIdA = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 10000L), true); + Long productIdB = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 10000L), true); + + //第一笔订单,购买2件不同的商品 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productIdA)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA)).get(0); + PayApi.orderPay(orderNum); + + ProductApi.delete(productIdB, true); + ProductApi.delete(productIdA, true); + TransportApi.deleteTransport(transportId, true); + + //验证订单运费是否正确 + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreightAmount(), 1000); + } + + @Test(description = "多商品多运费模板,运费是否正确") + public void differentProductsWithDifferentTransport() throws InterruptedException { + List categoryIds = getCategoryId(true); + //运费模板-首件2运费10,续件1运费5 + TransportApi.addTransport(DeliveryData.getTransportDTO(0, 2D, 1000L, 1D, 500L, 0, null, null, null), true); + Long transportIdA = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productIdA = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportIdA, 10000L), true); + //运费模板2-首件2运费10,续件1运费5 + TimeUnit.SECONDS.sleep(2L); + TransportApi.addTransport(DeliveryData.getTransportDTO(0, 2D, 1000L, 1D, 500L, 0, null, null, null), true); + Long transportIdB = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productIdB = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportIdB, 10000L), true); + + //第一笔订单,购买2件不同的商品 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productIdA)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA)).get(0); + PayApi.orderPay(orderNum); + + ProductApi.delete(productIdB, true); + TransportApi.deleteTransport(transportIdB, true); + ProductApi.delete(productIdA, true); + TransportApi.deleteTransport(transportIdA, true); + + //验证订单运费是否正确 + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreightAmount(), 2000); + } + + private static void sameProductFreight(Long transportId) { + List categoryIds = getCategoryId(true); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 10000L), true); + + //第一笔订单,购买1件商品 + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNumFirst = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNumFirst); + + //第二笔订单,购买2件商品 + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 2)); + Long orderNumSec = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNumSec); + + //第三笔订单,购买3件商品 + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 3)); + Long orderNumThird = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNumThird); + + ProductApi.delete(productId, true); + TransportApi.deleteTransport(transportId, true); + + //第一笔订单运费验证 + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumFirst, true).getFreightAmount(), 1000); + //第二笔订单运费验证 + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumSec, true).getFreightAmount(), 1000); + //第三笔订单运费验证 + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumThird, true).getFreightAmount(), 1500); + } + + private static void differentProducts(Long transportId) { + List categoryIds = getCategoryId(true); + Long productIdA = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 10000L), true); + Long productIdB = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 10000L), true); + Long productIdC = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 10000L), true); + + //第一笔订单,购买2件不同的商品 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productIdA)); + Long orderNumFirst = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA)).get(0); + PayApi.orderPay(orderNumFirst); + + //第一笔订单,购买3件不同的商品 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdC)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productIdA)); + Long orderNumSec = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA)).get(0); + PayApi.orderPay(orderNumSec); + + ProductApi.delete(productIdC, true); + ProductApi.delete(productIdB, true); + ProductApi.delete(productIdA, true); + TransportApi.deleteTransport(transportId, true); + + //第一笔订单运费验证 + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumFirst, true).getFreightAmount(), 1000); + //第二笔订单运费验证 + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumSec, true).getFreightAmount(), 1500); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/amount/MemberAmountTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/amount/MemberAmountTest.java new file mode 100644 index 0000000..149ac38 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/amount/MemberAmountTest.java @@ -0,0 +1,89 @@ +package com.tmerclub.cloud.systemtest.test.amount; + +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.order.vo.OrderDetailVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.login.UserApi; +import com.moyuer.cloud.systemtest.api.order.MyOrderApi; +import com.moyuer.cloud.systemtest.api.platform.UserLevelApi; +import com.moyuer.cloud.systemtest.api.platform.UserRightsApi; +import com.moyuer.cloud.systemtest.api.store.ShopWalletApi; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.order.OrderDtoData; +import com.moyuer.cloud.systemtest.data.order.SubmitOrderDtoData; +import com.moyuer.cloud.systemtest.data.order.WalletAssert; +import com.moyuer.cloud.systemtest.data.platform.CategoryDtoData; +import com.moyuer.cloud.systemtest.data.platform.UserLevelDtoData; +import com.moyuer.cloud.systemtest.data.platform.UserRightsDtoData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import org.testng.annotations.Test; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author lpj + */ +public class MemberAmountTest { + private static List getCategoryId(Boolean isMainShop) { + List categoryAppVOList = CategoryApi.listShopCategory(isMainShop); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(isMainShop).get(0).getCategoryId(); + CategoryApi.update(CategoryDtoData.getCategoryDTO(categoryId)); + return Stream.of(categoryId, shopCategoryId).collect(Collectors.toList()); + } + + @Test(description = "会员折扣优惠金额是否正确") + public void memberAmountTest() { + List categoryIds = getCategoryId(true); + Long transportId = DeliveryData.getFreeFeeDelivery(true); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 7337L), true); + + //新增打8折权益 + Long discountUserRightsId = UserRightsApi.save(UserRightsDtoData.getDiscounttUserRightsDTO(70)); + //用户会员等级添加包邮和打8折权益 + UserLevelApi.update(UserLevelDtoData.getUserLevelDTO(UserApi.getUserInfo().getUserLevelId(), Collections.singletonList(discountUserRightsId))); + + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + + UserRightsApi.delete(discountUserRightsId); + ProductApi.delete(productId, true); + + //验证数据 + WalletAssert.shopWalletLogAssert(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).get(0), 0, 1, 7191L, 5136L, 2201L, 0L, 0L, 146L, 0); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, true); + WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(0), 7337L, 5136L, 0L, 0L, 2201L, 0L, 0L, 1.99, 146L, + 0L, 2201L, 0L, 0L, 0L, null, null, 0L, null, 1, null); + } + + @Test(description = "商品金额为小数额,会员折扣优惠金额数据是否正确") + public void minPriceMemberAmountTest() { + List categoryIds = getCategoryId(true); + Long transportId = DeliveryData.getFreeFeeDelivery(true); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 1L), true); + + //新增打8折权益 + Long discountUserRightsId = UserRightsApi.save(UserRightsDtoData.getDiscounttUserRightsDTO(10)); + //用户会员等级添加包邮和打8折权益 + UserLevelApi.update(UserLevelDtoData.getUserLevelDTO(UserApi.getUserInfo().getUserLevelId(), Collections.singletonList(discountUserRightsId))); + + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + + UserRightsApi.delete(discountUserRightsId); + ProductApi.delete(productId, true); + + //验证数据 + WalletAssert.shopWalletLogAssert(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).get(0), 0, 1, 1L, 1L, 0L, 0L, 0L, 0L, 0); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, true); + WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(0), 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1.99, 0L, + 0L, 0L, 0L, 0L, 0L, null, null, 0L, null, 1, null); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/ComboTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/ComboTest.java new file mode 100644 index 0000000..cfe0f3c --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/ComboTest.java @@ -0,0 +1,97 @@ +package com.tmerclub.cloud.systemtest.test.marketing; + +import com.tmerclub.cloud.combo.vo.ComboVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.marketing.ComboApi; +import com.moyuer.cloud.systemtest.api.order.MyOrderApi; +import com.moyuer.cloud.systemtest.api.order.OrderApi; +import com.moyuer.cloud.systemtest.api.store.ShopWalletApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierProductApi; +import com.moyuer.cloud.systemtest.data.amount.PreSaleSpuData; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.marketing.ComboData; +import com.moyuer.cloud.systemtest.data.order.SubmitOrderDtoData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import com.moyuer.cloud.systemtest.data.supplier.SupplierProductData; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author lpj + */ +public class ComboTest { + + @DataProvider(name = "productProvider") + private Object[][] productProvider() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long mainProductId = ProductApi.createProduct(SpuData.getRealSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + Long realProductId = ProductApi.createProduct(SpuData.getRealSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + Long virtualProductId = ProductApi.createProduct(SpuData.getUnRealSpu(categoryId,shopCategoryId,8800L, 1), true); + Long fullPreSaleProductId = ProductApi.createProduct(PreSaleSpuData.getFullPreSaleSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + Long supplierProductId = SupplierProductData.getSupplierProductId(6600L, DeliveryData.getSupplierFreeFeeDelivery(true), true); + Long productId = SupplierProductData.getProductId(supplierProductId, 8800L, 1, null, true, true); + return new Object[][]{{mainProductId, Arrays.asList(realProductId, virtualProductId, fullPreSaleProductId, productId), supplierProductId}}; + } + + @Test(description = "套餐基本流程", dataProvider = "productProvider") + public void comboFlow(Long mainProductId, List matchingProductIds, Long supplierProductId) throws InterruptedException { + //新增套餐 + ComboApi.save(ComboData.getComboDTO(mainProductId, matchingProductIds)); + //获取套餐id + Long comboId = ComboApi.getComboPage().get(0).getComboId(); + //购买套餐 + MyOrderApi.confirm(ComboData.getComboOrderDTO(comboId, 2)); + //提交订单获取订单id + TimeUnit.SECONDS.sleep(2L); + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(mainProductId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //获取套餐信息 + ComboVO comboVO = ComboApi.getComboInfo(comboId); + //修改套餐信息,去掉搭配商品 + ComboApi.update(ComboData.getUpdateComboDTO(comboVO)); + //失效套餐 + ComboApi.updateComboStatus(ComboData.getUpdateStatusData(comboId, 0)); + //删除套餐 + ComboApi.updateComboStatus(ComboData.getUpdateStatusData(comboId, -1)); + //删除商品 + ProductApi.delete(mainProductId, true); + for (Long matchingProductId : matchingProductIds) { + ProductApi.delete(matchingProductId, true); + } + SupplierProductApi.delete(supplierProductId, true); + + //对订单进行退款并验证数据是否正确 + for (Long orderNumber : orderNumberList) { + if (OrderApi.infoOrder(orderNumber).getSupplierDeliveryType().equals(1)){ + Long refundId = OrderRefund.supplierOrderRefund(orderNumber); + //验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(1L); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumber, true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumber, refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 26400); + }else if (MyOrderApi.orderDetail(orderNumber).getOrderMold().equals(0)) { + Long refundId = OrderRefund.realOrderRefund(orderNumber); + //验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(1L); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumber, true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumber, refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 26400); + } else { + Long refundId = OrderRefund.virtualOrderRefund(orderNumber); + //验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(1L); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumber, true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumber, refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 26400); + } + } + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/CouponTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/CouponTest.java new file mode 100644 index 0000000..a687f09 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/CouponTest.java @@ -0,0 +1,493 @@ +package com.tmerclub.cloud.systemtest.test.marketing; + +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.coupon.vo.CouponVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.marketing.CouponApi; +import com.moyuer.cloud.systemtest.api.order.MyOrderApi; +import com.moyuer.cloud.systemtest.api.store.ShopWalletApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierProductApi; +import com.moyuer.cloud.systemtest.data.amount.OfflineHandleEventDtoData; +import com.moyuer.cloud.systemtest.data.amount.PreSaleSpuData; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.marketing.CouponData; +import com.moyuer.cloud.systemtest.data.order.OrderDtoData; +import com.moyuer.cloud.systemtest.data.order.SubmitOrderDtoData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import com.moyuer.cloud.systemtest.data.supplier.SupplierProductData; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author lpj + */ +public class CouponTest { + @DataProvider(name = "realProduct") + private Object[][] realProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "virtualProduct") + private Object[][] virtualProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getUnRealSpu(categoryId, shopCategoryId, 8800L, 1), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "fullPreSaleProduct") + private Object[][] fullPreSaleProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(PreSaleSpuData.getFullPreSaleSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "depositPreSaleProduct") + private Object[][] depositPreSaleProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(PreSaleSpuData.getDepositPreSaleSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "supplierProduct") + private Object[][] supplierProduct() { + Long supplierProductId = SupplierProductData.getSupplierProductId(6600L, DeliveryData.getSupplierFreeFeeDelivery(true), true); + Long productId = SupplierProductData.getProductId(supplierProductId, 8800L, 1, null, true, true); + return new Object[][]{{productId, supplierProductId}}; + } + + @Test(description = "店铺优惠券基本流程", dataProvider = "realProduct") + public void shopCouponFlow(Long productId) throws InterruptedException { + //新建代金券 + List productIds = Collections.singletonList(productId); + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 1, productIds)); + //获取优惠券id + Long couponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + //用户提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + Long refundId = OrderRefund.realOrderRefund(orderNumberList.get(0)); + TimeUnit.SECONDS.sleep(1L); + //用户删除领取的优惠券 + CouponApi.deleteUserCoupon(CouponApi.getUserCouponPage().get(0).getCouponUserId()); + //平台违规下架活动 + CouponApi.offline(OfflineHandleEventDtoData.getOfflineHandleEventDTO(null, couponId, "违规下架原因", null, null, null)); + //申请上架,审核失败 + //商家根据活动id获取下架信息 + OfflineHandleEventVO offlineHandleEventVO = CouponApi.shopGetOfflineHandleEvent(couponId); + //商家申请上架 + CouponApi.apply(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = CouponApi.platformGetOfflineHandleEvent(couponId); + //平台审核失败 + CouponApi.audit(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, "审核失败原因", 4)); + //申请上架,审核成功 + //商家根据活动id获取下架信息 + offlineHandleEventVO = CouponApi.shopGetOfflineHandleEvent(couponId); + //商家申请上架 + CouponApi.apply(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = CouponApi.platformGetOfflineHandleEvent(couponId); + //平台审核成功 + CouponApi.audit(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, null, 3)); + //根据优惠券id获取优惠券信息 + CouponVO couponVO = CouponApi.getShopCouponInfo(couponId); + //修改优惠券为暂不投放 + CouponApi.updateShopCoupon(CouponData.getUpdateCouponDTO(couponVO)); + //删除店铺代金券 + CouponApi.deleteShopCoupon(couponId); + //新建商家发放折扣券-全部商品适用 + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 1, 2, 1000L, null, 8.33, 1, 10, 100, 0, null)); + //获取优惠券id + couponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + //删除店铺折扣券 + CouponApi.deleteShopCoupon(couponId); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getShopCouponAmount(), 300); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 8500); + } + + @Test(description = "虚拟商品参与店铺优惠券完整流程", dataProvider = "virtualProduct") + public void shopCouponFlowWithVirtualProduct(Long productId) throws InterruptedException { + //新建代金券 + List productIds = Collections.singletonList(productId); + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 1, productIds)); + //获取优惠券id + Long couponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + //用户提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + Long refundId = OrderRefund.virtualOrderRefund(orderNumberList.get(0)); + TimeUnit.SECONDS.sleep(1L); + //用户删除领取的优惠券 + CouponApi.deleteUserCoupon(CouponApi.getUserCouponPage().get(0).getCouponUserId()); + //根据优惠券id获取优惠券信息 + CouponVO couponVO = CouponApi.getShopCouponInfo(couponId); + //修改优惠券为暂不投放 + CouponApi.updateShopCoupon(CouponData.getUpdateCouponDTO(couponVO)); + //删除店铺代金券 + CouponApi.deleteShopCoupon(couponId); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getShopCouponAmount(), 300); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 8500); + } + + @Test(description = "全款预售商品参与店铺优惠券完整流程", dataProvider = "fullPreSaleProduct") + public void shopCouponFlowWithFullPreSaleProduct(Long productId) throws InterruptedException { + //新建代金券 + List productIds = Collections.singletonList(productId); + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 1, productIds)); + //获取优惠券id + Long couponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + //用户提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + Long refundId = OrderRefund.realOrderRefund(orderNumberList.get(0)); + TimeUnit.SECONDS.sleep(1L); + //用户删除领取的优惠券 + CouponApi.deleteUserCoupon(CouponApi.getUserCouponPage().get(0).getCouponUserId()); + //根据优惠券id获取优惠券信息 + CouponVO couponVO = CouponApi.getShopCouponInfo(couponId); + //修改优惠券为暂不投放 + CouponApi.updateShopCoupon(CouponData.getUpdateCouponDTO(couponVO)); + //删除店铺代金券 + CouponApi.deleteShopCoupon(couponId); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getShopCouponAmount(), 300); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 8500); + } + + @Test(description = "定金预售商品参与店铺优惠券完整流程", dataProvider = "depositPreSaleProduct") + public void shopCouponFlowWithDepositPreSaleProduct(Long productId) throws InterruptedException { + //新建代金券 + List productIds = Collections.singletonList(productId); + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 1, productIds)); + //获取优惠券id + Long couponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + //用户提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付定金 + PayApi.orderPay(orderNumberList); + //根据订单id支付尾款 + TimeUnit.SECONDS.sleep(2L); + PayApi.orderPayBalance(orderNumberList.get(0)); + //对订单进行退款 + TimeUnit.SECONDS.sleep(2L); + Long refundId = OrderRefund.realOrderRefund(orderNumberList.get(0)); + TimeUnit.SECONDS.sleep(1L); + //用户删除领取的优惠券 + CouponApi.deleteUserCoupon(CouponApi.getUserCouponPage().get(0).getCouponUserId()); + //根据优惠券id获取优惠券信息 + CouponVO couponVO = CouponApi.getShopCouponInfo(couponId); + //修改优惠券为暂不投放 + CouponApi.updateShopCoupon(CouponData.getUpdateCouponDTO(couponVO)); + //删除店铺代金券 + CouponApi.deleteShopCoupon(couponId); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getShopCouponAmount(), 300); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 7500); + } + + @Test(description = "供应商发货的供应商商品参与店铺优惠券完整流程", dataProvider = "supplierProduct") + public void shopCouponFlowWithSupplierProduct(Long productId, Long supplierProductId) throws InterruptedException { + //新建代金券 + List productIds = Collections.singletonList(productId); + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 1, productIds)); + //获取优惠券id + Long couponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + //用户提交订单 + TimeUnit.SECONDS.sleep(2L); + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + TimeUnit.SECONDS.sleep(2L); + Long refundId = OrderRefund.supplierOrderRefund(orderNumberList.get(0)); + TimeUnit.SECONDS.sleep(1L); + //用户删除领取的优惠券 + CouponApi.deleteUserCoupon(CouponApi.getUserCouponPage().get(0).getCouponUserId()); + //根据优惠券id获取优惠券信息 + CouponVO couponVO = CouponApi.getShopCouponInfo(couponId); + //修改优惠券为暂不投放 + CouponApi.updateShopCoupon(CouponData.getUpdateCouponDTO(couponVO)); + //删除店铺代金券 + CouponApi.deleteShopCoupon(couponId); + //删除商品 + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getShopCouponAmount(), 300); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 8500); + } + + /** + * 平台优惠券基本流程 + */ + @Test(description = "平台优惠券基本流程", dataProvider = "realProduct") + public void platformCouponFlow(Long productId) throws InterruptedException { + List productIds = Collections.singletonList(productId); + //新建平台代金券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 0, productIds)); + //获取优惠券id + Long couponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + //用户提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + Long refundId = OrderRefund.realOrderRefund(orderNumberList.get(0)); + //根据优惠券id获取优惠券信息 + CouponVO couponVO = CouponApi.getPlatformCouponInfo(couponId); + //修改优惠券为暂不投放 + CouponApi.updatePlatformCoupon(CouponData.getUpdateCouponDTO(couponVO)); + //删除平台代金券券 + CouponApi.deletePlatformCoupon(couponId); + //新建平台发放的折扣券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 1, 2, 1000L, null, 8.33, 1, 10, 100, 0, null)); + //获取优惠券id + couponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //删除平台折扣券 + CouponApi.deletePlatformCoupon(couponId); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getPlatformCouponAmount(), 300); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 8500); + } + + @Test(description = "虚拟商品参与平台优惠券", dataProvider = "virtualProduct") + public void platformCouponFlowWithVirtualProduct(Long productId) throws InterruptedException { + List productIds = Collections.singletonList(productId); + //新建平台代金券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 0, productIds)); + //获取优惠券id + Long couponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + //用户提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + Long refundId = OrderRefund.virtualOrderRefund(orderNumberList.get(0)); + //根据优惠券id获取优惠券信息 + CouponVO couponVO = CouponApi.getPlatformCouponInfo(couponId); + //修改优惠券为暂不投放 + CouponApi.updatePlatformCoupon(CouponData.getUpdateCouponDTO(couponVO)); + //删除平台代金券券 + CouponApi.deletePlatformCoupon(couponId); + //新建平台发放的折扣券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 1, 2, 1000L, null, 8.33, 1, 10, 100, 0, null)); + //获取优惠券id + couponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //删除平台折扣券 + CouponApi.deletePlatformCoupon(couponId); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getPlatformCouponAmount(), 300); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 8500); + } + + @Test(description = "全款预售商品参与平台优惠券", dataProvider = "fullPreSaleProduct") + public void platformCouponFlowWithFullPreSaleProduct(Long productId) throws InterruptedException { + List productIds = Collections.singletonList(productId); + //新建平台代金券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 0, productIds)); + //获取优惠券id + Long couponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + //用户提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + Long refundId = OrderRefund.realOrderRefund(orderNumberList.get(0)); + //根据优惠券id获取优惠券信息 + CouponVO couponVO = CouponApi.getPlatformCouponInfo(couponId); + //修改优惠券为暂不投放 + CouponApi.updatePlatformCoupon(CouponData.getUpdateCouponDTO(couponVO)); + //删除平台代金券券 + CouponApi.deletePlatformCoupon(couponId); + //新建平台发放的折扣券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 1, 2, 1000L, null, 8.33, 1, 10, 100, 0, null)); + //获取优惠券id + couponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //删除平台折扣券 + CouponApi.deletePlatformCoupon(couponId); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getPlatformCouponAmount(), 300); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 8500); + } + + @Test(description = "定金预售商品参与平台优惠券", dataProvider = "depositPreSaleProduct") + public void platformCouponFlowDepositPreSaleProductProduct(Long productId) throws InterruptedException { + List productIds = Collections.singletonList(productId); + //新建平台代金券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 0, productIds)); + //获取优惠券id + Long couponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + //用户提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + TimeUnit.SECONDS.sleep(2L); + //根据订单id支付订单尾款 + PayApi.orderPayBalance(orderNumberList.get(0)); + //对订单进行退款 + TimeUnit.SECONDS.sleep(2L); + Long refundId = OrderRefund.realOrderRefund(orderNumberList.get(0)); + //根据优惠券id获取优惠券信息 + CouponVO couponVO = CouponApi.getPlatformCouponInfo(couponId); + //修改优惠券为暂不投放 + CouponApi.updatePlatformCoupon(CouponData.getUpdateCouponDTO(couponVO)); + //删除平台代金券券 + CouponApi.deletePlatformCoupon(couponId); + //新建平台发放的折扣券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 1, 2, 1000L, null, 8.33, 1, 10, 100, 0, null)); + //获取优惠券id + couponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //删除平台折扣券 + CouponApi.deletePlatformCoupon(couponId); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getPlatformCouponAmount(), 300); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 7500); + } + + @Test(description = "供应商发货的供应商商品参与平台优惠券", dataProvider = "supplierProduct") + public void platformCouponFlowWithSupplierProduct(Long productId, Long supplierProductId) throws InterruptedException { + List productIds = Collections.singletonList(productId); + //新建平台代金券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 0, productIds)); + //获取优惠券id + Long couponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + //用户提交订单 + TimeUnit.SECONDS.sleep(2L); + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + Long refundId = OrderRefund.supplierOrderRefund(orderNumberList.get(0)); + //根据优惠券id获取优惠券信息 + CouponVO couponVO = CouponApi.getPlatformCouponInfo(couponId); + //修改优惠券为暂不投放 + CouponApi.updatePlatformCoupon(CouponData.getUpdateCouponDTO(couponVO)); + //删除平台代金券券 + CouponApi.deletePlatformCoupon(couponId); + //新建平台发放的折扣券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 1, 2, 1000L, null, 8.33, 1, 10, 100, 0, null)); + //获取优惠券id + couponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //删除平台折扣券 + CouponApi.deletePlatformCoupon(couponId); + //删除商品 + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getPlatformCouponAmount(), 300); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 8500); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/DistributionProdTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/DistributionProdTest.java new file mode 100644 index 0000000..eb8cc4d --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/DistributionProdTest.java @@ -0,0 +1,137 @@ +package com.tmerclub.cloud.systemtest.test.marketing; + +import com.tmerclub.cloud.api.distribution.vo.DistributionSpuVO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.marketing.DistributionProdApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierProductApi; +import com.moyuer.cloud.systemtest.data.amount.OfflineHandleEventDtoData; +import com.moyuer.cloud.systemtest.data.amount.PreSaleSpuData; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.marketing.DistributionProdData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import com.moyuer.cloud.systemtest.data.supplier.SupplierProductData; +import org.springframework.beans.BeanUtils; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author lpj + */ +public class DistributionProdTest { + @DataProvider(name = "realProduct") + private Object[][] realProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "virtualProduct") + private Object[][] virtualProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getUnRealSpu(categoryId, shopCategoryId, 8800L, 1), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "fullPreSaleProduct") + private Object[][] fullPreSaleProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(PreSaleSpuData.getFullPreSaleSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "depositPreSaleProduct") + private Object[][] depositPreSaleProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(PreSaleSpuData.getDepositPreSaleSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "supplierProduct") + private Object[][] supplierProduct() { + Long supplierProductId = SupplierProductData.getSupplierProductId(6600L, DeliveryData.getSupplierFreeFeeDelivery(true), true); + Long productId = SupplierProductData.getProductId(supplierProductId, 8800L, 1, null, true, true); + return new Object[][]{{productId, supplierProductId}}; + } + + @Test(description = "实物分销商品基本流程", dataProvider = "realProduct") + public void realDistributionProdFlow(Long productId) throws InterruptedException { + distributionProdFlow(productId); + } + + @Test(description = "虚拟分销商品基本流程", dataProvider = "virtualProduct") + public void virtualDistributionProdFlow(Long productId) throws InterruptedException { + distributionProdFlow(productId); + } + + @Test(description = "全款预售分销商品基本流程", dataProvider = "fullPreSaleProduct") + public void fullPreSaleDistributionProdFlow(Long productId) throws InterruptedException { + distributionProdFlow(productId); + } + + @Test(description = "定金预售分销商品基本流程", dataProvider = "depositPreSaleProduct") + public void depositPreSaleDistributionProdFlow(Long productId) throws InterruptedException { + distributionProdFlow(productId); + } + + @Test(description = "供应商发货的供应商分销商品基本流程", dataProvider = "supplierProduct") + public void supplierDistributionProdFlow(Long productId, Long supplierProductId) throws InterruptedException { + distributionProdFlow(productId); + SupplierProductApi.delete(supplierProductId, true); + } + + /** + * 分销商品基本流程 + */ + private void distributionProdFlow(Long productId) throws InterruptedException { + //新增分销商品 + DistributionProdApi.save(DistributionProdData.getDistributionSpuDTO(productId, 0, 2000L, 0, 1000L, 1), true); + //等待保存 + TimeUnit.SECONDS.sleep(2L); + //获取分销商品id + Long distributionProdId = DistributionProdApi.getDistributionProdPage(true).get(0).getDistributionInfo().getDistributionSpuId(); + //获取分销商品详情 + DistributionSpuVO distributionProdVO = new DistributionSpuVO(); + BeanUtils.copyProperties(DistributionProdApi.getDistributionProdPage(true).get(0).getDistributionInfo(), distributionProdVO); + distributionProdVO.setSpuId(productId); + //修改分销商品 + DistributionProdApi.update(DistributionProdData.getUpdateDistributionSpuDTO(distributionProdVO)); + //平台违规下架活动 + DistributionProdApi.offline(OfflineHandleEventDtoData.getOfflineHandleEventDTO(null, distributionProdId, "违规下架原因", null, null, null)); + //申请上架,审核失败 + //商家根据活动id获取下架信息 + OfflineHandleEventVO offlineHandleEventVO = DistributionProdApi.shopGetOfflineHandleEvent(distributionProdId); + //商家申请上架 + DistributionProdApi.apply(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = DistributionProdApi.platformGetOfflineHandleEvent(distributionProdId); + //平台审核失败 + DistributionProdApi.audit(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, "审核失败原因", 4)); + //申请上架,审核成功 + //商家根据活动id获取下架信息 + offlineHandleEventVO = DistributionProdApi.shopGetOfflineHandleEvent(distributionProdId); + //商家申请上架 + DistributionProdApi.apply(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = DistributionProdApi.platformGetOfflineHandleEvent(distributionProdId); + //平台审核成功 + DistributionProdApi.audit(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, null, 3)); + //删除分销商品 + DistributionProdApi.delete(distributionProdId, true); + //删除商品 + ProductApi.delete(productId, true); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/GiveawayTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/GiveawayTest.java new file mode 100644 index 0000000..4676f30 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/GiveawayTest.java @@ -0,0 +1,213 @@ +package com.tmerclub.cloud.systemtest.test.marketing; + +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.order.vo.OrderItemDetailVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.marketing.GiveawayApi; +import com.moyuer.cloud.systemtest.api.order.MyOrderApi; +import com.moyuer.cloud.systemtest.api.order.OrderApi; +import com.moyuer.cloud.systemtest.api.order.OrderRefundApi; +import com.moyuer.cloud.systemtest.api.order.ShopOrderRefundApi; +import com.moyuer.cloud.systemtest.api.store.ShopWalletApi; +import com.moyuer.cloud.systemtest.data.amount.PreSaleSpuData; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.marketing.GiveawayData; +import com.moyuer.cloud.systemtest.data.order.*; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author lpj + */ +public class GiveawayTest { + @DataProvider(name = "realProduct") + private Object[][] realProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long mainProductId = ProductApi.createProduct(SpuData.getRealSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + Long matchingProductId = ProductApi.createProduct(SpuData.getRealSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{mainProductId, Collections.singletonList(matchingProductId)}}; + } + + @DataProvider(name = "fullPreSaleProduct") + private Object[][] fullPreSaleProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long mainProductId = ProductApi.createProduct(PreSaleSpuData.getFullPreSaleSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + Long matchingProductId = ProductApi.createProduct(SpuData.getRealSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{mainProductId, Collections.singletonList(matchingProductId)}}; + } + + @DataProvider(name = "depositPreSaleProduct") + private Object[][] depositPreSaleProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long mainProductId = ProductApi.createProduct(PreSaleSpuData.getDepositPreSaleSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + Long matchingProductId = ProductApi.createProduct(SpuData.getRealSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{mainProductId, Collections.singletonList(matchingProductId)}}; + } + + @Test(description = "实物商品作为主商品的赠品活动基本流程", dataProvider = "realProduct") + public void giveawayFlowWithRealProduct(Long mainProductId, List matchingProductIds) throws InterruptedException { + //新增赠品活动 + GiveawayApi.save(GiveawayData.getGiveawayDTO(mainProductId, matchingProductIds)); + //获取赠品活动id + Long giveawayId = GiveawayApi.getGiveawayPage().get(0).getGiveawayId(); + //获取赠品活动信息 + GiveawayVO giveawayVO = GiveawayApi.getGiveawayInfo(giveawayId); + //修改赠品活动信息 + GiveawayApi.update(GiveawayData.getUpdateGiveawayDTO(giveawayVO)); + //购买五件主商品,赠送赠品 + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(mainProductId, 5)); + //提交订单,获取订单id + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(mainProductId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + Long refundId = realOrderRefund(orderNumberList.get(0)); + //失效赠品活动 + GiveawayApi.updateGiveawayStatus(0, giveawayId); + //删除赠品活动 + GiveawayApi.updateGiveawayStatus(-1, giveawayId); + //删除商品 + ProductApi.delete(mainProductId, true); + for (Long matchingProductId : matchingProductIds) { + ProductApi.delete(matchingProductId, true); + } + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 3); + for (OrderItemDetailVO orderItemDetailVO : ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList()) { + if (orderItemDetailVO.getCount().equals(5)) { + Assert.assertEquals(orderItemDetailVO.getActualTotal(), 44000); + Assert.assertEquals(orderItemDetailVO.getRefundAmount(), 42900); + } + } + } + + @Test(description = "全款预售商品作为主商品的赠品活动基本流程", dataProvider = "fullPreSaleProduct") + public void giveawayFlowWithFullPreSaleProduct(Long mainProductId, List matchingProductIds) throws InterruptedException { + //新增赠品活动 + GiveawayApi.save(GiveawayData.getGiveawayDTO(mainProductId, matchingProductIds)); + //获取赠品活动id + Long giveawayId = GiveawayApi.getGiveawayPage().get(0).getGiveawayId(); + //获取赠品活动信息 + GiveawayVO giveawayVO = GiveawayApi.getGiveawayInfo(giveawayId); + //修改赠品活动信息 + GiveawayApi.update(GiveawayData.getUpdateGiveawayDTO(giveawayVO)); + //购买五件主商品,赠送赠品 + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(mainProductId, 5)); + //提交订单,获取订单id + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(mainProductId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + Long refundId = realOrderRefund(orderNumberList.get(0)); + //失效赠品活动 + GiveawayApi.updateGiveawayStatus(0, giveawayId); + //删除赠品活动 + GiveawayApi.updateGiveawayStatus(-1, giveawayId); + //删除商品 + ProductApi.delete(mainProductId, true); + for (Long matchingProductId : matchingProductIds) { + ProductApi.delete(matchingProductId, true); + } + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 3); + for (OrderItemDetailVO orderItemDetailVO : ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList()) { + if (orderItemDetailVO.getCount().equals(5)) { + Assert.assertEquals(orderItemDetailVO.getActualTotal(), 44000); + Assert.assertEquals(orderItemDetailVO.getRefundAmount(), 42900); + } + } + } + + @Test(description = "定金预售商品作为主商品的赠品活动基本流程", dataProvider = "depositPreSaleProduct") + public void giveawayFlowWithDepositProduct(Long mainProductId, List matchingProductIds) throws InterruptedException { + //新增赠品活动 + GiveawayApi.save(GiveawayData.getGiveawayDTO(mainProductId, matchingProductIds)); + //获取赠品活动id + Long giveawayId = GiveawayApi.getGiveawayPage().get(0).getGiveawayId(); + //获取赠品活动信息 + GiveawayVO giveawayVO = GiveawayApi.getGiveawayInfo(giveawayId); + //修改赠品活动信息 + GiveawayApi.update(GiveawayData.getUpdateGiveawayDTO(giveawayVO)); + //购买五件主商品,赠送赠品 + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(mainProductId, 5)); + //提交订单,获取订单id + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(mainProductId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //根据订单id支付尾款 + TimeUnit.SECONDS.sleep(1L); + PayApi.orderPayBalance(orderNumberList.get(0)); + //对订单进行退款 + Long refundId = realOrderRefund(orderNumberList.get(0)); + //失效赠品活动 + GiveawayApi.updateGiveawayStatus(0, giveawayId); + //删除赠品活动 + GiveawayApi.updateGiveawayStatus(-1, giveawayId); + //删除商品 + ProductApi.delete(mainProductId, true); + for (Long matchingProductId : matchingProductIds) { + ProductApi.delete(matchingProductId, true); + } + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 3); + for (OrderItemDetailVO orderItemDetailVO : ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList()) { + if (orderItemDetailVO.getCount().equals(5)) { + Assert.assertEquals(orderItemDetailVO.getActualTotal(), 39000); + Assert.assertEquals(orderItemDetailVO.getRefundAmount(), 37900); + } + } + } + + private static Long realOrderRefund(Long orderNum) throws InterruptedException { + //申请第一次退款,部分退款 等待保存 + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirst= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirst); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdFirst)); + + //申请第二次退款,整单退款 + TimeUnit.SECONDS.sleep(2L); + Long refundIdSec= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdSec); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdSec)); + //发货后对订单进行部分退款仅退款 & 整单退货退款:先同意退款申请,发货后拒绝退款 + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNum)); + TimeUnit.SECONDS.sleep(2L); + Long refundIdTir= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdTir); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdTir)); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdFourth= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdFourth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundIdFourth)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdFourth)); + TimeUnit.SECONDS.sleep(1L); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getRefuseDeliveryRefundDTO(refundIdFourth)); + //确认收货后,对订单进行部分退款仅退款 & 整单退货退款且同意 + MyOrderApi.receipt(orderNum); + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirth= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDtoRemoveGiveaway(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundIdFirth)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdFirth)); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdFirth)); + + return refundIdFirth; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/GroupTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/GroupTest.java new file mode 100644 index 0000000..b74d4b9 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/GroupTest.java @@ -0,0 +1,293 @@ +package com.tmerclub.cloud.systemtest.test.marketing; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.common.product.vo.app.SpuAppVO; +import com.moyuer.cloud.group.dto.GroupActivityDTO; +import com.moyuer.cloud.group.vo.GroupActivityVO; +import com.moyuer.cloud.group.vo.app.AppGroupTeamVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.marketing.GroupApi; +import com.moyuer.cloud.systemtest.api.store.ShopWalletApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierProductApi; +import com.moyuer.cloud.systemtest.data.amount.OfflineHandleEventDtoData; +import com.moyuer.cloud.systemtest.data.amount.PreSaleSpuData; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.marketing.GroupData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import com.moyuer.cloud.systemtest.data.supplier.SupplierProductData; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author lpj + */ +public class GroupTest { + @DataProvider(name = "realProduct") + private Object[][] realProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "virtualProduct") + private Object[][] virtualProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getUnRealSpu(categoryId, shopCategoryId, 8800L, 1), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "fullPreSaleProduct") + private Object[][] fullPreSaleProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(PreSaleSpuData.getFullPreSaleSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "supplierProduct") + private Object[][] supplierProduct() { + Long supplierProductId = SupplierProductData.getSupplierProductId(6600L, DeliveryData.getSupplierFreeFeeDelivery(true), true); + Long productId = SupplierProductData.getProductId(supplierProductId, 8800L, 1, null, true, true); + return new Object[][]{{productId, supplierProductId}}; + } + + @Test(description = "实物商品拼团活动基本流程", dataProvider = "realProduct") + public void groupFlowWithRealProduct(Long productId) throws InterruptedException { + //新建拼团活动 + GroupApi.save(GroupData.getGroupActivityDTO(productId)); + //获取拼团活动id + Long groupActivityId = GroupApi.getGroupActivityPage().get(0).getGroupActivityId(); + //根据id获取拼团活动信息 + GroupActivityVO groupActivityVO = GroupApi.getGroupActivity(groupActivityId); + //修改信息后,更新拼团活动 + GroupApi.updateGroupActivity(GroupData.getUpdateGroupActivityDTO(groupActivityVO)); + //平台违规下架活动 + GroupApi.offline(OfflineHandleEventDtoData.getOfflineHandleEventDTO(null, groupActivityId, "违规下架原因", null, null, null)); + //申请上架,审核失败 + //商家根据活动id获取下架信息 + OfflineHandleEventVO offlineHandleEventVO = GroupApi.shopGetOfflineHandleEvent(groupActivityId); + //商家申请上架 + GroupApi.applyGroupActivity(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = GroupApi.platformGetOfflineHandleEvent(groupActivityId); + //平台审核失败 + GroupApi.auditGroupActivity(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, "审核失败原因", 4)); + //申请上架,审核成功 + //商家根据活动id获取下架信息 + offlineHandleEventVO = GroupApi.shopGetOfflineHandleEvent(groupActivityId); + //商家申请上架 + GroupApi.applyGroupActivity(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = GroupApi.platformGetOfflineHandleEvent(groupActivityId); + //平台审核成功 + GroupApi.auditGroupActivity(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, null, 3)); + //商家启用活动 + GroupActivityDTO groupActivityDTO = new GroupActivityDTO(); + groupActivityDTO.setGroupActivityId(groupActivityId); + GroupApi.activeGroupActivity(groupActivityDTO); + //获取商品详情 + SpuAppVO productInfo = ProductApi.getProductInfo(productId); + //获取店铺id + Long shopId = productInfo.getShopId(); + //用户A开团 + GroupApi.openGroup(GroupData.getGroupOrderDTO(productId, 1)); + //用户A提交订单,获取订单id + List orderNumberListA = GroupApi.submitGroupOrder(GroupData.getSubmitGroupOrderDTO(0L, shopId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberListA); + //等待保存 + TimeUnit.SECONDS.sleep(2L); + //获取可参团列表 + List joinGroupList = JSON.parseArray(GroupApi.getJoinGroupList(groupActivityId).toString(), AppGroupTeamVO.class); + //获取团队id + Long groupTeamId = joinGroupList.get(0).getGroupTeamId(); + //用户B参团 + GroupApi.joinGroup(GroupData.getGroupOrderDTO(productId, 1)); + //用户A提交订单,获取订单id + List orderNumberListB = GroupApi.submitJoinGroupOrder(GroupData.getSubmitGroupOrderDTO(groupTeamId, shopId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberListB); + //用户A对订单进行退款 + TimeUnit.SECONDS.sleep(2L); + Long refundId = OrderRefund.realOrderRefund(orderNumberListA.get(0)); + //商家失效活动 + GroupApi.invalidActivity(groupActivityDTO); + //删除拼团活动 + GroupApi.deleteGroupActivity(groupActivityId); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberListA.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberListA.get(0), true).getOrderItemDetailList().get(0).getGroupAmount(), 2200); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberListA.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 6600); + } + + @Test(description = "虚拟商品拼团活动基本流程", dataProvider = "virtualProduct") + public void groupFlowWithVirtualProduct(Long productId) throws InterruptedException { + //新建拼团活动 + GroupApi.save(GroupData.getGroupActivityDTO(productId)); + //获取拼团活动id + Long groupActivityId = GroupApi.getGroupActivityPage().get(0).getGroupActivityId(); + //根据id获取拼团活动信息 + GroupActivityVO groupActivityVO = GroupApi.getGroupActivity(groupActivityId); + //修改信息后,更新拼团活动 + GroupApi.updateGroupActivity(GroupData.getUpdateGroupActivityDTO(groupActivityVO)); + //商家启用活动 + GroupActivityDTO groupActivityDTO = new GroupActivityDTO(); + groupActivityDTO.setGroupActivityId(groupActivityId); + GroupApi.activeGroupActivity(groupActivityDTO); + //获取商品详情 + SpuAppVO productInfo = ProductApi.getProductInfo(productId); + //获取店铺id + Long shopId = productInfo.getShopId(); + //用户A开团 + GroupApi.openGroup(GroupData.getGroupOrderDTO(productId, 1)); + //用户A提交订单,获取订单id + List orderNumberListA = GroupApi.submitGroupOrder(GroupData.getSubmitGroupOrderDTO(0L, shopId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberListA); + //等待保存 + TimeUnit.SECONDS.sleep(2L); + //获取可参团列表 + List joinGroupList = JSON.parseArray(GroupApi.getJoinGroupList(groupActivityId).toString(), AppGroupTeamVO.class); + //获取团队id + Long groupTeamId = joinGroupList.get(0).getGroupTeamId(); + //用户B参团 + GroupApi.joinGroup(GroupData.getGroupOrderDTO(productId, 1)); + //用户A提交订单,获取订单id + List orderNumberListB = GroupApi.submitJoinGroupOrder(GroupData.getSubmitGroupOrderDTO(groupTeamId, shopId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberListB); + //用户A对订单进行退款 + TimeUnit.SECONDS.sleep(2L); + Long refundId = OrderRefund.virtualOrderRefund(orderNumberListA.get(0)); + //商家失效活动 + GroupApi.invalidActivity(groupActivityDTO); + //删除拼团活动 + GroupApi.deleteGroupActivity(groupActivityId); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberListA.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberListA.get(0), true).getOrderItemDetailList().get(0).getGroupAmount(), 2200); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberListA.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 6600); + } + + @Test(description = "全款预售商品拼团活动基本流程", dataProvider = "fullPreSaleProduct") + public void groupFlowWithFullPreSaleProduct(Long productId) throws InterruptedException { + //新建拼团活动 + GroupApi.save(GroupData.getGroupActivityDTO(productId)); + //获取拼团活动id + Long groupActivityId = GroupApi.getGroupActivityPage().get(0).getGroupActivityId(); + //根据id获取拼团活动信息 + GroupActivityVO groupActivityVO = GroupApi.getGroupActivity(groupActivityId); + //修改信息后,更新拼团活动 + GroupApi.updateGroupActivity(GroupData.getUpdateGroupActivityDTO(groupActivityVO)); + //商家启用活动 + GroupActivityDTO groupActivityDTO = new GroupActivityDTO(); + groupActivityDTO.setGroupActivityId(groupActivityId); + GroupApi.activeGroupActivity(groupActivityDTO); + //获取商品详情 + SpuAppVO productInfo = ProductApi.getProductInfo(productId); + //获取店铺id + Long shopId = productInfo.getShopId(); + //用户A开团 + GroupApi.openGroup(GroupData.getGroupOrderDTO(productId, 1)); + //用户A提交订单,获取订单id + List orderNumberListA = GroupApi.submitGroupOrder(GroupData.getSubmitGroupOrderDTO(0L, shopId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberListA); + //等待保存 + TimeUnit.SECONDS.sleep(2L); + //获取可参团列表 + List joinGroupList = JSON.parseArray(GroupApi.getJoinGroupList(groupActivityId).toString(), AppGroupTeamVO.class); + //获取团队id + Long groupTeamId = joinGroupList.get(0).getGroupTeamId(); + //用户B参团 + GroupApi.joinGroup(GroupData.getGroupOrderDTO(productId, 1)); + //用户A提交订单,获取订单id + List orderNumberListB = GroupApi.submitJoinGroupOrder(GroupData.getSubmitGroupOrderDTO(groupTeamId, shopId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberListB); + //用户A对订单进行退款 + TimeUnit.SECONDS.sleep(2L); + Long refundId = OrderRefund.virtualOrderRefund(orderNumberListA.get(0)); + //商家失效活动 + GroupApi.invalidActivity(groupActivityDTO); + //删除拼团活动 + GroupApi.deleteGroupActivity(groupActivityId); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberListA.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberListA.get(0), true).getOrderItemDetailList().get(0).getGroupAmount(), 2200); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberListA.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 6600); + } + + @Test(description = "供应商发货的供应商商品拼团活动基本流程", dataProvider = "supplierProduct") + public void groupFlowWithSupplierProduct(Long productId, Long supplierProductId) throws InterruptedException { + //新建拼团活动 + GroupApi.save(GroupData.getGroupActivityDTO(productId)); + //获取拼团活动id + Long groupActivityId = GroupApi.getGroupActivityPage().get(0).getGroupActivityId(); + //根据id获取拼团活动信息 + GroupActivityVO groupActivityVO = GroupApi.getGroupActivity(groupActivityId); + //修改信息后,更新拼团活动 + GroupApi.updateGroupActivity(GroupData.getUpdateGroupActivityDTO(groupActivityVO)); + //商家启用活动 + GroupActivityDTO groupActivityDTO = new GroupActivityDTO(); + groupActivityDTO.setGroupActivityId(groupActivityId); + GroupApi.activeGroupActivity(groupActivityDTO); + //获取商品详情 + SpuAppVO productInfo = ProductApi.getProductInfo(productId); + //获取店铺id + Long shopId = productInfo.getShopId(); + //用户A开团 + GroupApi.openGroup(GroupData.getGroupOrderDTO(productId, 1)); + //用户A提交订单,获取订单id + TimeUnit.SECONDS.sleep(2L); + List orderNumberListA = GroupApi.submitGroupOrder(GroupData.getSubmitGroupOrderDTO(0L, shopId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberListA); + //等待保存 + TimeUnit.SECONDS.sleep(2L); + //获取可参团列表 + List joinGroupList = JSON.parseArray(GroupApi.getJoinGroupList(groupActivityId).toString(), AppGroupTeamVO.class); + //获取团队id + Long groupTeamId = joinGroupList.get(0).getGroupTeamId(); + //用户B参团 + GroupApi.joinGroup(GroupData.getGroupOrderDTO(productId, 1)); + //用户A提交订单,获取订单id + List orderNumberListB = GroupApi.submitJoinGroupOrder(GroupData.getSubmitGroupOrderDTO(groupTeamId, shopId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberListB); + //用户A对订单进行退款 + TimeUnit.SECONDS.sleep(2L); + Long refundId = OrderRefund.supplierOrderRefund(orderNumberListA.get(0)); + //商家失效活动 + GroupApi.invalidActivity(groupActivityDTO); + //删除拼团活动 + GroupApi.deleteGroupActivity(groupActivityId); + //删除商品 + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberListA.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberListA.get(0), true).getOrderItemDetailList().get(0).getSupplyPriceFee(), 6600); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberListA.get(0), true).getOrderItemDetailList().get(0).getGroupAmount(), 2200); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberListA.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 6600); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/LiveTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/LiveTest.java new file mode 100644 index 0000000..4e88703 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/LiveTest.java @@ -0,0 +1,56 @@ +//package com.tmerclub.cloud.systemtest.test.marketing; +// +//import com.tmerclub.cloud.live.model.LiveProdStore; +//import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +//import com.moyuer.cloud.systemtest.api.amount.ProductApi; +//import com.moyuer.cloud.systemtest.api.marketing.LiveApi; +//import com.moyuer.cloud.systemtest.data.amount.SpuData; +//import com.moyuer.cloud.systemtest.data.marketing.LiveData; +//import com.moyuer.cloud.systemtest.data.store.DeliveryData; +//import org.testng.annotations.Test; +// +///** +// * @author lpj +// */ +//public class LiveTest { +// /** +// * 直播商品基本流程 +// */ +// @Test(description = "直播商品基本流程") +// public void liveProdStoreFlow() { +// //新建实物商品作为直播商品 +// Long shopCategoryId = CategoryApi.listShopCategory().get(CategoryApi.listShopCategory().size()-1).getCategoryId(); +// Long categoryId = CategoryApi.listSigningCategory().get(0).getCategoryId(); +// Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(),8800L)); +// +// //新增直播商品 +// LiveApi.saveLiveProdStore(LiveData.getLiveProdStoreDTO(productId, 1, 88.0, 0.0, 0)); +// //获取直播商品id +// Long liveProdStoreId = LiveApi.getLiveProdStorePage().get(0).getLiveProdStoreId(); +// //获取直播商品信息 +// LiveProdStore liveProdStore = LiveApi.getLiveProdStore(liveProdStoreId); +// //修改直播商品的价格类型为价格区间 +// LiveApi.updateLiveProdStore(LiveData.getUpdateLiveProdStoreDTO(liveProdStore)); +// +// //提交审核 +// LiveApi.submitVerify(liveProdStore); +// +// //删除直播商品 +// LiveApi.deleteLiveProdStore(liveProdStoreId); +// //删除商品 +// ProductApi.delete(productId); +// } +// +// /** +// * 直播间基本流程 +// */ +// @Test(description = "直播间基本流程") +// public void liveRoomFlow() { +// //新增直播间 +// LiveApi.saveLiveRoom(LiveData.getLiveRoom()); +// //获取直播间id +// Long liveRoomId = LiveApi.getLiveRoomPage().get(0).getId(); +// //删除直播间 +// LiveApi.deleteLiveRoom(liveRoomId); +// } +//} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/OrderRefund.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/OrderRefund.java new file mode 100644 index 0000000..137a3a2 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/OrderRefund.java @@ -0,0 +1,72 @@ +package com.tmerclub.cloud.systemtest.test.marketing; + +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.order.dto.app.OrderRefundDTO; +import com.moyuer.cloud.systemtest.api.order.MyOrderApi; +import com.moyuer.cloud.systemtest.api.order.OrderApi; +import com.moyuer.cloud.systemtest.api.order.OrderRefundApi; +import com.moyuer.cloud.systemtest.api.order.ShopOrderRefundApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierOrderApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierRefundApi; +import com.moyuer.cloud.systemtest.data.order.DeliveryOrderDtoData; +import com.moyuer.cloud.systemtest.data.order.OrderRefundDeliveryDtoData; +import com.moyuer.cloud.systemtest.data.order.OrderRefundDtoData; +import com.moyuer.cloud.systemtest.data.order.ShopOrderRefundDtoData; +import com.moyuer.cloud.systemtest.data.supplier.SupplierOrderRefundDtoData; + +import java.util.concurrent.TimeUnit; + +/** + * @author lpj + */ +public class OrderRefund { + /** + * 商家发货的实物订单退款 + */ + public static Long realOrderRefund(Long orderNum) throws InterruptedException { + //发货 + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNum)); + //确认收货后,对订单进行整单退货退款且同意 + MyOrderApi.receipt(orderNum); + TimeUnit.SECONDS.sleep(2L); + OrderRefundDTO orderRefundDTO = OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum); + orderRefundDTO.setRefundAmount((long) Arith.sub(MyOrderApi.orderDetail(orderNum).getCanRefundAmount(), MyOrderApi.orderDetail(orderNum).getTransfee())); + Long refundId= OrderRefundApi.apply(orderRefundDTO); + ShopOrderRefundApi.infoByRefundSn(refundId); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundId)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundId)); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundId)); + + return refundId; + } + + /** + * 虚拟订单退款 + */ + public static Long virtualOrderRefund(Long orderNum) throws InterruptedException { + //部分退款,同意退款 + TimeUnit.SECONDS.sleep(2L); + Long refundId= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundId); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundId)); + + return refundId; + } + + /** + * 供应商订单退款 + */ + public static Long supplierOrderRefund(Long orderNum) throws InterruptedException { + //供应商发货 + SupplierOrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNum)); + //确认收货后,对订单进行整单退货退款且同意 + MyOrderApi.receipt(orderNum); + TimeUnit.SECONDS.sleep(2L); + Long refundId= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum)); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getSupplierRefundDTO(refundId)); + SupplierRefundApi.processRefundOrder(SupplierOrderRefundDtoData.getSupplierReceiveRefundDTO(refundId)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundId)); + SupplierRefundApi.returnMoneyRefundOrder(SupplierOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundId)); + return refundId; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/SupplierOrderTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/SupplierOrderTest.java new file mode 100644 index 0000000..e159ae4 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/SupplierOrderTest.java @@ -0,0 +1,882 @@ +package com.tmerclub.cloud.systemtest.test.order; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.order.vo.OrderAddrVO; +import com.tmerclub.cloud.order.dto.OrderAddrDTO; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.order.*; +import com.moyuer.cloud.systemtest.api.store.TransportApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierOrderApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierProductApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierRefundApi; +import com.moyuer.cloud.systemtest.data.order.*; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import com.moyuer.cloud.systemtest.data.supplier.SupplierOrderRefundDtoData; +import com.moyuer.cloud.systemtest.data.supplier.SupplierProductData; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; + + + +/** + * @author Tu + */ +public class SupplierOrderTest { + + @Test(description = "JK_20,取消删除订单流程",dataProvider = "freeProductId") + public void cancelOrderTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + TimeUnit.SECONDS.sleep(2L); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + MyOrderApi.cancel(orderNum); + deleteProduct(productId,supplierProductId,transportId); + MyOrderApi.delete(orderNum); + + } + + @Test(description = "JK_21,商家修改订单金额,供应商修改用户收货信息和修改物流信息完成流程",dataProvider = "freeProductId") + public void changeAmountOrderTest(Long productId,Long supplierProductId,Long transportId)throws InterruptedException{ + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + TimeUnit.SECONDS.sleep(2L); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNum)); + PayApi.orderPay(orderNum); + OrderAddrVO orderAddrVO = SupplierOrderApi.info(orderNum).getOrderAddr(); + orderAddrVO.setAddr("供应商修改收货地址"); + OrderAddrDTO orderAddrDTO = JSON.parseObject(JSON.toJSONString(orderAddrVO), OrderAddrDTO.class); + orderAddrDTO.setOrderId(orderNum); + SupplierOrderApi.updateOrderDelivery(orderAddrDTO); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNum)); + + List delivery = OrderApi.infoOrderDelivery(orderNum); + List deliveryOrderDTOList = JSON.parseArray(JSON.toJSONString(delivery), DeliveryOrderDTO.class); + deliveryOrderDTOList.forEach(s -> s.setDeliveryNo("xgh123123123123")); + SupplierOrderApi.updateOrderDelivery(deliveryOrderDTOList); + + deleteProduct(productId,supplierProductId,transportId); + MyOrderApi.receipt(orderNum); + } + + @Test(description = "JK_22,无需快递发货订单完整流程",dataProvider = "freeTransportOrderNum") + public void noDeliveryOrderTest(Long orderNum,Long productId,Long supplierProductId,Long transportId)throws InterruptedException{ + SupplierOrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNum)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNum); + + deleteProduct(productId,supplierProductId,transportId); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + } + + @Test(description = "JK_23,多次退款失败,退货成功订单",dataProvider = "freeTransportOrderNum") + public void multiRefundOrderTest(Long orderNum,Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + TimeUnit.SECONDS.sleep(2L); + //第一次 整单退款,商家直接拒绝 + refuseRefund(orderNum,false,1L,0L); + + //第二次 部分退款,供应商拒绝后发货 + refuseRefund(orderNum,true,2L,0L); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNum)); + //第三次 部分退款仅退款,商家直接拒绝 + refuseRefund(orderNum,true,1L,0L); + //第四次 整单退款仅退款,供应商拒绝 + refuseRefund(orderNum,false,2L,0L); + TimeUnit.SECONDS.sleep(2L); + //第五次 部分退款 退货退货退款,商家自行处理,同意退款后用户发货,拒绝退款 + shopRefundDeliveryRefuse(orderNum,true,2L,0L); + + TimeUnit.SECONDS.sleep(2L); + //第六次 整单退款 退货退款,转移供应商,同意退款后用户发货,拒绝退款,用户确认收货 + supplierRefundDeliveryRefuse(orderNum,false,2L,0L); + + MyOrderApi.receipt(orderNum); + + //第七次 整单退款 仅退款,商家直接拒绝 + refuseRefund(orderNum,false,1L,0L); + //第八次 部分退款仅退款,供应商拒绝 + refuseRefund(orderNum,true,2L,0L); + //第九次 整单退款 退货退款,商家自行处理,同意退款后用户发货,拒绝退款 + shopRefundDeliveryRefuse(orderNum,true,1L,0L); + //第十次 部分退款 退货退款,转移供应商,退货退款成功 + receiveDeliveryRefund(orderNum,true,2L,0L); + + deleteProduct(productId,supplierProductId,transportId); + } + @Test(description = "JK_24,未发货订单申请退款成功-商家自行处理",dataProvider = "productId") + public void unDeliveryShopReceiveRefundOrderTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumFirst,false,1L,0L); + + //第二笔订单部分退款 + Long orderNumSec = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumSec,true,1L,0L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_25,未发货订单申请退款成功-移交供应商处理",dataProvider = "productId") + public void unDeliverySupplierReceiveRefundOrderTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumFirst,false,2L,0L); + + //第二笔订单部分退款 + Long orderNumSec = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumSec,true,2L,0L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_26,已发货订单申请仅退款成功-商家自行处理",dataProvider = "productId") + public void deliveredShopReceiveRefundOrderTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = payOrder(productId); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumFirst)); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumFirst,false,1L,0L); + + //第二笔订单部分退款 + Long orderNumSec = payOrder(productId); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumSec,true,1L,0L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_27,已发货订单申请仅退款成功-移交供应商处理",dataProvider = "productId") + public void deliveredSupplierReceiveRefundOrderTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = payOrder(productId); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumFirst)); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumFirst,false,2L,0L); + + //第二笔订单部分退款 + Long orderNumSec = payOrder(productId); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumSec,true,2L,0L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_28,已发货订单申请退货退款成功-商家自行处理",dataProvider = "productId") + public void deliveredShopReceiveRefundDeliveryTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = payOrder(productId); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumFirst)); + TimeUnit.SECONDS.sleep(2L); + receiveDeliveryRefund(orderNumFirst,false,1L,0L); + + //第二笔订单部分退款 + Long orderNumSec = payOrder(productId); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + TimeUnit.SECONDS.sleep(2L); + receiveDeliveryRefund(orderNumSec,true,1L,0L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_29,已发货订单申请退货退款成功-移交供应商处理",dataProvider = "productId") + public void deliveredSupplierReceiveRefundDeliveryTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = payOrder(productId); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumFirst)); + TimeUnit.SECONDS.sleep(2L); + receiveDeliveryRefund(orderNumFirst,false,2L,0L); + + //第二笔订单部分退款 + Long orderNumSec = payOrder(productId); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + TimeUnit.SECONDS.sleep(2L); + receiveDeliveryRefund(orderNumSec,true,2L,0L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_30,已完成订单申请仅退款成功-商家自行处理",dataProvider = "productId") + public void receivedShopReceiveRefundTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = payOrder(productId); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumFirst)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumFirst,false,1L,0L); + + //第二笔订单部分退款 + Long orderNumSec = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + MyOrderApi.receipt(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumSec,true,1L,0L); + TimeUnit.SECONDS.sleep(2L); + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_31,已完成订单申请仅退款成功-移交供应商处理",dataProvider = "productId") + public void receivedSupplierReceiveRefundTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumFirst)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumFirst,false,2L,0L); + + //第二笔订单部分退款 + Long orderNumSec = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumSec,true,2L,0L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_32,已完成订单申请退货退款成功-商家自行处理",dataProvider = "productId") + public void receivedShopReceiveRefundDeliveryTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = payOrder(productId); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumFirst)); + MyOrderApi.receipt(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + receiveDeliveryRefund(orderNumFirst,false,1L,0L); + + //第二笔订单部分退款 + Long orderNumSec = payOrder(productId); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + MyOrderApi.receipt(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + receiveDeliveryRefund(orderNumSec,true,1L,0L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_33,已完成订单申请退货退款成功-移交供应商处理",dataProvider = "productId") + public void receivedSupplierReceiveRefundDeliveryTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = payOrder(productId); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumFirst)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + receiveDeliveryRefund(orderNumFirst,false,2L,0L); + + //第二笔订单部分退款 + Long orderNumSec = payOrder(productId); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + MyOrderApi.receipt(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + receiveDeliveryRefund(orderNumSec,true,2L,0L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_34,未发货有运费订单部分金额退款-商家自行处理",dataProvider = "productId") + public void unDeliverySupplierDeliveryTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumFirst,true,1L,2077L); + + //第二笔订单部分退款 + Long orderNumSec = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumSec,true,1L,293L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_35,未发货有运费订单部分金额退款-转移供应商处理",dataProvider = "productId") + public void unDeliverySupplierReceiveTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumFirst,true,2L,2077L); + + //第二笔订单部分退款 + Long orderNumSec = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumSec,true,2L,293L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_36,已完成有运费订单部分金额仅退款-商家自行处理",dataProvider = "productId") + public void completedShopReceiveTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + Long orderNum = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNum)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNum); + receiveRefund(orderNum,true,1L,1099L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_37,已完成有运费订单部分金额仅退款-商家自行处理",dataProvider = "productId") + public void completedSupplierReceiveTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + Long orderNum = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNum)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNum); + receiveRefund(orderNum,true,2L,1099L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_38,已完成有运费订单部分金额退货退款-商家自行处理",dataProvider = "productId") + public void completedRefundDeliveryShopReceiveTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + Long orderNum = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNum)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNum); + receiveRefund(orderNum,true,1L,1099L); + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_39,已完成有运费订单部分金额退货退款-商家自行处理",dataProvider = "productId") + public void completedRefundDeliverySupplierReceiveTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + Long orderNum = payOrder(productId); + TimeUnit.SECONDS.sleep(2L); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNum)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNum); + receiveRefund(orderNum,true,2L,1099L); + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "JK_40,待采购订单采购完整流程",dataProvider = "productId") + public void unBuySupplierTest(Long productId,Long supplierProductId,Long transportId) throws InterruptedException { + Long orderNum = getOrderNum(productId); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNum,877L,800L)); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + OrderApi.sourcingOrder(OrderAdminDtoData.getSourcingOrderAdminDto(orderNum)); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNum)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNum); + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "采购订单退款成功完整流程", dataProvider = "productId") + public void unBuySupplierRefundTest(Long productId, Long supplierProductId, Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = getOrderNum(productId); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumFirst,888L,800L)); + PayApi.orderPay(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumFirst, false, 1L, null); + + //第二笔订单部分退款-修改退款金额为5.33 + Long orderNumSec = getOrderNum(productId); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumSec,888L,800L)); + PayApi.orderPay(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumSec, true, 1L, 533L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "采购订单退款成功-商家自行处理完整流程", dataProvider = "productId") + public void buySupplierRefundShopReceiveTest(Long productId, Long supplierProductId, Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = getOrderNum(productId); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumFirst,888L,800L)); + PayApi.orderPay(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + OrderApi.sourcingOrder(OrderAdminDtoData.getSourcingOrderAdminDto(orderNumFirst)); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumFirst, false, 1L, null); + + //第二笔订单部分退款-修改退款金额为5.33 + Long orderNumSec = getOrderNum(productId); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumSec,888L,800L)); + PayApi.orderPay(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + OrderApi.sourcingOrder(OrderAdminDtoData.getSourcingOrderAdminDto(orderNumSec)); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumSec, true, 1L, 533L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "采购订单退款成功-移交供应商处理完整流程", dataProvider = "productId") + public void buySupplierRefundSupplierReceiveTest(Long productId, Long supplierProductId, Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = getOrderNum(productId); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumFirst,888L,800L)); + PayApi.orderPay(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + OrderApi.sourcingOrder(OrderAdminDtoData.getSourcingOrderAdminDto(orderNumFirst)); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumFirst, false, 2L, null); + + //第二笔订单部分退款-修改退款金额为5.33 + Long orderNumSec = getOrderNum(productId); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumSec,888L,800L)); + PayApi.orderPay(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + OrderApi.sourcingOrder(OrderAdminDtoData.getSourcingOrderAdminDto(orderNumSec)); + TimeUnit.SECONDS.sleep(2L); + receiveRefund(orderNumSec, true, 2L, 533L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "已完成采购订单退货退款成功-商家自行处理完整流程", dataProvider = "productId") + public void completeBuySupplierRefundShopReceiveTest(Long productId, Long supplierProductId, Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = getOrderNum(productId); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumFirst,888L,800L)); + PayApi.orderPay(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + OrderApi.sourcingOrder(OrderAdminDtoData.getSourcingOrderAdminDto(orderNumFirst)); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumFirst)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + receiveDeliveryRefund(orderNumFirst, false, 1L, null); + + //第二笔订单部分退款-修改退款金额为5.33 + Long orderNumSec = getOrderNum(productId); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumSec,888L,800L)); + PayApi.orderPay(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + OrderApi.sourcingOrder(OrderAdminDtoData.getSourcingOrderAdminDto(orderNumSec)); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + receiveDeliveryRefund(orderNumSec, true, 1L, 533L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "已完成采购订单退货退款成功-移交供应商处理完整流程", dataProvider = "productId") + public void completeBuySupplierRefundSupplierReceiveTest(Long productId, Long supplierProductId, Long transportId) throws InterruptedException { + //第一笔订单整单退款 + Long orderNumFirst = getOrderNum(productId); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumFirst,888L,800L)); + PayApi.orderPay(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + OrderApi.sourcingOrder(OrderAdminDtoData.getSourcingOrderAdminDto(orderNumFirst)); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumFirst)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + receiveDeliveryRefund(orderNumFirst, false, 2L, null); + + //第二笔订单部分退款-修改退款金额为5.33 + Long orderNumSec = getOrderNum(productId); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumSec,888L,800L)); + PayApi.orderPay(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + OrderApi.sourcingOrder(OrderAdminDtoData.getSourcingOrderAdminDto(orderNumSec)); + SupplierOrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + receiveDeliveryRefund(orderNumSec, true, 2L, 533L); + + deleteProduct(productId,supplierProductId,transportId); + } + + @Test(description = "商家代销供应商多商品订单完整流程") + public void differentSupplerProductOrderTest() throws InterruptedException { + Long supplierProductIdA = SupplierProductData.getSupplierProductId(6600L, DeliveryData.getSupplierFreeFeeDelivery(true), true); + Long supplierProductIdB = SupplierProductData.getSupplierProductId(6600L, DeliveryData.getSupplierFreeFeeDelivery(true), true); + + Long productIdA = SupplierProductData.getProductId(supplierProductIdA, 8800L, 1, null, true, true); + Long productIdB = SupplierProductData.getProductId(supplierProductIdB, 8800L, 1, null, true, true); + + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productIdA)); + TimeUnit.SECONDS.sleep(2L); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA)).get(0); + PayApi.orderPay(orderNum); + + ProductApi.delete(productIdB, true); + SupplierProductApi.delete(supplierProductIdB, true); + ProductApi.delete(productIdA, true); + SupplierProductApi.delete(supplierProductIdA, true); + } + + @Test(description = "商家发货的供应商商品订单退款完整流程") + public void shopDeliverySupplierProductOrderTest() throws InterruptedException { + Long supplierProductId = SupplierProductData.getSupplierProductId(6600L, DeliveryData.getSupplierFreeFeeDelivery(true), true); + + Long productId = SupplierProductData.getProductId(supplierProductId, 8800L, 2, DeliveryData.getFreeFeeDelivery(true), true, true); + + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + TimeUnit.SECONDS.sleep(2L); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + + //申请第一次退款,部分退款 等待保存 + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirst= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirst); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdFirst)); + + //申请第二次退款,整单退款 + TimeUnit.SECONDS.sleep(2L); + Long refundIdSec= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdSec); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdSec)); + //发货后对订单进行部分退款仅退款 & 整单退货退款:先同意退款申请,发货后拒绝退款 + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNum)); + TimeUnit.SECONDS.sleep(2L); + Long refundIdTir= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdTir); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdTir)); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdFourth= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdFourth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundIdFourth)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdFourth)); + TimeUnit.SECONDS.sleep(1L); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getRefuseDeliveryRefundDTO(refundIdFourth)); + //确认收货后,对订单进行部分退款仅退款 & 整单退货退款且同意 + MyOrderApi.receipt(orderNum); + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirth= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdFirth)); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdSixth= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdSixth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundIdSixth)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdSixth)); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdSixth)); + + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + } + + @Test(description = "多商家代销同一供应商商品订单完整流程") + public void multipleShopSameSupplerProductOrderTest() { + Long transportId = DeliveryData.getSupplierFreeFeeDelivery(true); + Long supplierProductId = SupplierProductData.getSupplierProductId(6600L, transportId, true); + //A店铺代销商品A + Long productIdA = SupplierProductData.getProductId(supplierProductId, 8800L, 1, null, true, true); + //B店铺代销商品B + Long productIdB = SupplierProductData.getProductId(supplierProductId, 8800L, 1, null, true, false); + + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB, 1)); + //确认订单数据 + Long shopIdA = ProductApi.getProductInfo(productIdA).getShopId(); + Long shopIdB = ProductApi.getProductInfo(productIdB).getShopId(); + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(Arrays.asList(shopIdA, shopIdB)); + //确认订单 + MyOrderApi.confirm(orderDTO); + //提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(Arrays.asList(shopIdA, shopIdB))); + //支付订单 + PayApi.orderPay(orderNumberList); + + ProductApi.delete(productIdB, false); + ProductApi.delete(productIdA, true); + SupplierProductApi.delete(supplierProductId, true); + } + + @Test(description = "商家代销多供应商商品订单完整流程") + public void sameShopMultipleSupplerProductOrderTest() throws InterruptedException { + Long transportId = DeliveryData.getSupplierFreeFeeDelivery(true); + //A供应商发布供应商商品A + Long supplierProductIdA = SupplierProductData.getSupplierProductId(6600L, transportId, true); + //B供应商发布供应商商品B + Long supplierProductIdB = SupplierProductData.getSupplierProductId(6600L, transportId, false); + //A店铺代销商品A + Long productIdA = SupplierProductData.getProductId(supplierProductIdA, 8800L, 1, null, true, true); + //A店铺代销商品B + Long productIdB = SupplierProductData.getProductId(supplierProductIdB, 8800L, 1, null, false, true); + + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB, 1)); + //确认订单数据 + Long shopId = ProductApi.getProductInfo(productIdA).getShopId(); + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(Collections.singletonList(shopId)); + //确认订单 + MyOrderApi.confirm(orderDTO); + //提交订单 + TimeUnit.SECONDS.sleep(2L); + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(Collections.singletonList(shopId))); + //支付订单 + PayApi.orderPay(orderNumberList); + + ProductApi.delete(productIdB, true); + ProductApi.delete(productIdA, true); + SupplierProductApi.delete(supplierProductIdB, false); + SupplierProductApi.delete(supplierProductIdA, true); + } + + @Test(description = "多商家代销多供应商商品订单完整流程") + public void multipleShopMultipleSupplerProductOrderTest() throws InterruptedException { + //A供应商包邮运费模板 + Long feeTransportIdA = DeliveryData.getSupplierFreeFeeDelivery(true); + //A供应商运费模板8元/件 + TransportApi.addSupplierTransport(DeliveryData.getTransportDTO(0, 1D, 800L, 1D, 800L, 0, null, null, null), true); + Long transportIdA = TransportApi.supplierTransportPage(true).get(0).getTransportId(); + //A供应商发布包邮商品A1 + Long supplierProductIdA1 = SupplierProductData.getSupplierProductId(6600L, feeTransportIdA, true); + //A供应商发货有运费商品A2 + Long supplierProductIdA2 = SupplierProductData.getSupplierProductId(6600L, transportIdA, true); + + //B供应商包邮运费模板 + Long feeTransportIdB = DeliveryData.getSupplierFreeFeeDelivery(false); + //A供应商运费模板8元/件 + TransportApi.addSupplierTransport(DeliveryData.getTransportDTO(0, 1D, 800L, 1D, 800L, 0, null, null, null), false); + Long transportIdB = TransportApi.supplierTransportPage(false).get(0).getTransportId(); + //A供应商发布包邮商品A1 + Long supplierProductIdB1 = SupplierProductData.getSupplierProductId(6600L, feeTransportIdB, false); + //A供应商发货有运费商品A2 + Long supplierProductIdB2 = SupplierProductData.getSupplierProductId(6600L, transportIdB, false); + + + //A店铺代销商品A1 + Long productIdA1 = SupplierProductData.getProductId(supplierProductIdA1, 8800L, 1, null, true, true); + //A店铺代销商品A2 + Long productIdA2 = SupplierProductData.getProductId(supplierProductIdA2, 8800L, 1, null, true, true); + //A店铺代销商品B1 + Long productIdA3 = SupplierProductData.getProductId(supplierProductIdB1, 8800L, 1, null, false, true); + //A店铺代销商品B2 + Long productIdA4 = SupplierProductData.getProductId(supplierProductIdB2, 8800L, 1, null, false, true); + + //B店铺代销商品A1 + Long productIdB1 = SupplierProductData.getProductId(supplierProductIdA1, 8800L, 1, null, true, false); + //B店铺代销商品A2 + Long productIdB2 = SupplierProductData.getProductId(supplierProductIdA2, 8800L, 1, null, true, false); + //B店铺代销商品B1 + Long productIdB3 = SupplierProductData.getProductId(supplierProductIdB1, 8800L, 1, null, false, false); + //B店铺代销商品B2 + Long productIdB4 = SupplierProductData.getProductId(supplierProductIdB2, 8800L, 1, null, false, false); + + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA1, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA2, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA3, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA4, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB1, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB2, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB3, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB4, 1)); + //确认订单数据 + Long shopIdA = ProductApi.getProductInfo(productIdA1).getShopId(); + Long shopIdB = ProductApi.getProductInfo(productIdB1).getShopId(); + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(Arrays.asList(shopIdA, shopIdB)); + //确认订单 + MyOrderApi.confirm(orderDTO); + //提交订单 + TimeUnit.SECONDS.sleep(2L); + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(Arrays.asList(shopIdA, shopIdB))); + //支付订单 + PayApi.orderPay(orderNumberList); + + ProductApi.delete(productIdB4, false); + ProductApi.delete(productIdB3, false); + ProductApi.delete(productIdB2, false); + ProductApi.delete(productIdB1, false); + SupplierProductApi.delete(supplierProductIdB2, false); + SupplierProductApi.delete(supplierProductIdB1, false); + TransportApi.deleteSupplierTransport(transportIdB, false); + ProductApi.delete(productIdA4, true); + ProductApi.delete(productIdA3, true); + ProductApi.delete(productIdA2, true); + ProductApi.delete(productIdA1, true); + SupplierProductApi.delete(supplierProductIdA2, true); + SupplierProductApi.delete(supplierProductIdA1, true); + TransportApi.deleteSupplierTransport(transportIdA, true); + } + + @DataProvider(name = "freeTransportOrderNum") + private Object[][] freeTransportOrderNum() throws InterruptedException { + Long transportId = DeliveryData.getSupplierFreeFeeDelivery(true); + Long supplierProductId = SupplierProductData.getSupplierProductId(1099L, transportId, true); + Long productId = SupplierProductData.getProductId(supplierProductId, 8888L, 1, null, true, true); + Long orderNum = payOrder(productId); + return new Object[][]{{orderNum,productId,supplierProductId,transportId}}; + } + @DataProvider(name = "orderNum") + private Object[][] orderNum() throws InterruptedException { + TransportApi.addSupplierTransport(DeliveryData.getTransportDTO(), true); + Long transportId = TransportApi.supplierTransportPage(true).get(0).getTransportId(); + Long supplierProductId = SupplierProductData.getSupplierProductId(1099L, transportId, true); + Long productId = SupplierProductData.getProductId(supplierProductId, 8888L, 1, null, true, true); + Long orderNum = payOrder(productId); + return new Object[][]{{orderNum,productId,supplierProductId,transportId}}; + } + + @DataProvider(name = "freeProductId") + private Object[][] freeProductId(){ + Long transportId = DeliveryData.getSupplierFreeFeeDelivery(true); + Long supplierProductId = SupplierProductData.getSupplierProductId(1099L, transportId, true); + Long productId = SupplierProductData.getProductId(supplierProductId, 8888L, 1, null, true, true); + return new Object[][]{{productId,supplierProductId,transportId}}; + } + @DataProvider(name = "productId") + private Object[][] productId(){ + TransportApi.addSupplierTransport(DeliveryData.getTransportDTO(), true); + Long transportId = TransportApi.supplierTransportPage(true).get(0).getTransportId(); + Long supplierProductId = SupplierProductData.getSupplierProductId(1099L, transportId, true); + Long productId = SupplierProductData.getProductId(supplierProductId, 8888L, 1, null, true, true); + return new Object[][]{{productId,supplierProductId,transportId}}; + } + + private Long getOrderNum(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + TimeUnit.SECONDS.sleep(2L); + return MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + } + + private Long payOrder(Long productId) throws InterruptedException { + Long orderNum = getOrderNum(productId); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + return orderNum; + } + + private void deleteProduct(Long productId,Long supplierProductId,Long transportId) { + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + if (TransportApi.info(transportId, true).getIsFreeFee().equals(0)) { + TransportApi.deleteSupplierTransport(transportId, true); + } + } + /** + * type==true时,部分退款,否则为整单退款 + * role==1时,为商家,否者为供应商 + * 仅退款申请 + * */ + private void refuseRefund(Long orderNum,Boolean type,Long role,Long refundAmount) { + Long refundId; + if (type){ + refundId = OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,refundAmount)); + } else { + refundId = OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDTO(orderNum)); + } + ShopOrderRefundApi.infoByRefundSn(refundId); + if(role == 1){ + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundId)); + }else { + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getSupplierRefundDTO(refundId)); + SupplierRefundApi.processRefundOrder(SupplierOrderRefundDtoData.getRufuseOrderRefundDTO(refundId)); + } + } + + /** + * type==true时,部分退款,否则为整单退款 + * role==1时,为商家,否者为供应商 + * 仅退款申请 + * */ + private void receiveRefund(Long orderNum,Boolean type,Long role,Long refundAmount) { + Long refundId; + if (type){ + refundId = OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,refundAmount)); + } else { + refundId = OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDTO(orderNum)); + } + + ShopOrderRefundApi.infoByRefundSn(refundId); + if(role == 1){ + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundId)); + }else { + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getSupplierRefundDTO(refundId)); + SupplierRefundApi.processRefundOrder(SupplierOrderRefundDtoData.getSupplierReceiveRefundDTO(refundId)); + } + } + + /** + * type==true时,部分退款,否则为整单退款 + * 商家自行处理退货退款申请 + * */ + private void shopRefundDeliveryRefuse(Long orderNum,Boolean type,Long step,Long refundAmount) { + Long refundId; + if (type){ + refundId = OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDeliveryDTO(orderNum,refundAmount)); + } else {refundId = OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum)); + } + ShopOrderRefundApi.infoByRefundSn(refundId); + if (step == 1){ + //商家在第一步拒绝退货退款申请 + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundId)); + }else { + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundId)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundId)); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getRefuseDeliveryRefundDTO(refundId)); + } + } + /** + * type==true时,部分退款,否则为整单退款 + * step==1时,在申请退货退款的第一步拒绝退款 否则,在申请退货退款的第二步拒绝退款 + * 供应商 在第二步拒绝退货退款申请 + * */ + private void supplierRefundDeliveryRefuse(Long orderNum,Boolean type,Long step,Long refundAmount) { + Long refundId; + if (type){ + refundId = OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDeliveryDTO(orderNum,refundAmount)); + } else {refundId = OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum)); + } + ShopOrderRefundApi.infoByRefundSn(refundId); + if (step == 1){ + //供应商在第一步拒绝退货退款申请 + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getSupplierRefundDTO(refundId)); + SupplierRefundApi.processRefundOrder(SupplierOrderRefundDtoData.getRufuseOrderRefundDTO(refundId)); + }else { + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getSupplierRefundDTO(refundId)); + SupplierRefundApi.processRefundOrder(SupplierOrderRefundDtoData.getSupplierReceiveRefundDTO(refundId)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundId)); + SupplierRefundApi.returnMoneyRefundOrder(SupplierOrderRefundDtoData.getRefuseDeliveryRefundDTO(refundId)); + }} + /** + * 同意退货退款 + * type==true时,部分退款,否则为整单退款 + * role=1,商家同意,否则,供应商同意 + * */ + private void receiveDeliveryRefund(Long orderNum,Boolean type,Long role,Long refundAmount){ + Long refundId; + if (type){ + refundId = OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDeliveryDTO(orderNum,refundAmount)); + } else {refundId = OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum)); + } + ShopOrderRefundApi.infoByRefundSn(refundId); + if (role == 1){ + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundId)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundId)); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundId)); + }else { + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getSupplierRefundDTO(refundId)); + SupplierRefundApi.processRefundOrder(SupplierOrderRefundDtoData.getSupplierReceiveRefundDTO(refundId)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundId)); + SupplierRefundApi.returnMoneyRefundOrder(SupplierOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundId)); + } + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/TransFeeFreesOrderTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/TransFeeFreesOrderTest.java new file mode 100644 index 0000000..059126f --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/TransFeeFreesOrderTest.java @@ -0,0 +1,277 @@ +package com.tmerclub.cloud.systemtest.test.order; + +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.login.UserApi; +import com.moyuer.cloud.systemtest.api.order.MyOrderApi; +import com.moyuer.cloud.systemtest.api.order.ShopCartApi; +import com.moyuer.cloud.systemtest.api.platform.UserLevelApi; +import com.moyuer.cloud.systemtest.api.platform.UserRightsApi; +import com.moyuer.cloud.systemtest.api.store.ShopWalletApi; +import com.moyuer.cloud.systemtest.api.store.TransportApi; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.order.OrderDtoData; +import com.moyuer.cloud.systemtest.data.order.ShopCartData; +import com.moyuer.cloud.systemtest.data.order.SubmitOrderDtoData; +import com.moyuer.cloud.systemtest.data.platform.CategoryDtoData; +import com.moyuer.cloud.systemtest.data.platform.UserLevelDtoData; +import com.moyuer.cloud.systemtest.data.platform.UserRightsDtoData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author lpj + */ +public class TransFeeFreesOrderTest { + private static List getCategoryId(Boolean isMainShop) { + List categoryAppVOList = CategoryApi.listShopCategory(isMainShop); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(isMainShop).get(0).getCategoryId(); + CategoryApi.update(CategoryDtoData.getCategoryDTO(categoryId)); + return Stream.of(categoryId, shopCategoryId).collect(Collectors.toList()); + } + + @Test(description = "运费模板满金额包邮订单,运费是否正确") + public void fullAmountFreeFreight() { + List categoryIds = getCategoryId(true); + //运费模板-8元/件,满100元包邮 + TransportApi.addTransport(DeliveryData.getTransportDTO(0, 1D, 800L, 1D, 800L, 1, 1, null, 10000L), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 10000L), true); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + ProductApi.delete(productId, true); + TransportApi.deleteTransport(transportId, true); + + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreightAmount(), 0); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreeFreightAmount(), 800); + } + + @Test(description = "运费模板满件包邮订单,运费是否正确") + public void fullPriceFreeFreight() { + List categoryIds = getCategoryId(true); + //运费模板-8元/件,满1件包邮 + TransportApi.addTransport(DeliveryData.getTransportDTO(0, 1D, 800L, 1D, 800L,1, 0, 1D, null), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 10000L), true); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + ProductApi.delete(productId, true); + TransportApi.deleteTransport(transportId, true); + + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreightAmount(), 0); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreeFreightAmount(), 800); + } + + @Test(description = "运费模板满件和满金额包邮订单,运费是否正确") + public void fullPriceAndAmountFreeFreight() { + List categoryIds = getCategoryId(true); + //运费模板-8元/件,满1件和满100元时包邮 + TransportApi.addTransport(DeliveryData.getTransportDTO(0, 1D, 800L, 1D, 800L,1, 2, 1D, 10000L), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 10000L), true); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + ProductApi.delete(productId, true); + TransportApi.deleteTransport(transportId, true); + + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreightAmount(), 0); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreeFreightAmount(), 800); + } + + @Test(description = "平台会员权益-全平台包邮与运费模板满条件包邮订单,运费是否正确") + public void fullConditionFreeFreightAndFreeFeeUserRight() { + List categoryIds = getCategoryId(true); + //用户会员等级添加包邮权益 + Long freeFeeUserRightsId = UserRightsApi.save(UserRightsDtoData.getFreeFeeUserRightsDTO()); + UserLevelApi.update(UserLevelDtoData.getUserLevelDTO(UserApi.getUserInfo().getUserLevelId(), Collections.singletonList(freeFeeUserRightsId))); + + //运费模板-8元/件,满1件和满100元时包邮 + TransportApi.addTransport(DeliveryData.getTransportDTO(0, 1D, 800L, 1D, 800L,1, 2, 1D, 10000L), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 10000L), true); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + ProductApi.delete(productId, true); + TransportApi.deleteTransport(transportId, true); + UserRightsApi.delete(freeFeeUserRightsId); + + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreightAmount(), 0); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreeFreightAmount(), 800); + } + + @Test(description = "运费模板满条件包邮商品与运费模板不包邮商品的订单,运费是否正确") + public void fullConditionFreeFreightAndNotFreeFreight() throws InterruptedException { + List categoryIds = getCategoryId(true); + //运费模板-运费8元/件,满1件包邮 + TransportApi.addTransport(DeliveryData.getTransportDTO(0, 1D, 800L, 1D, 800L,1, 0, 1D, null), true); + Long transportIdA = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productIdA = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportIdA, 10000L), true); + + //运费模板-运费8元/件 + TimeUnit.SECONDS.sleep(2L); + TransportApi.addTransport(DeliveryData.getTransportDTO(), true); + Long transportIdB = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productIdB = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportIdB, 10000L), true); + + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productIdA)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA)).get(0); + PayApi.orderPay(orderNum); + + ProductApi.delete(productIdB, true); + TransportApi.deleteTransport(transportIdB, true); + ProductApi.delete(productIdA, true); + TransportApi.deleteTransport(transportIdA, true); + + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreightAmount(), 800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreeFreightAmount(), 800); + } + + @Test(description = "使用同一运费模板的不同商品满足包邮条件,运费是否正确") + public void differentProductFullConditionFreeFreight() { + List categoryIds = getCategoryId(true); + //运费模板,运费8元/件,满2件包邮 + TransportApi.addTransport(DeliveryData.getTransportDTO(0, 1D, 800L, 1D, 800L,1, 0, 1D, null), true); + Long transportIdA = TransportApi.infoTransport(true).get(0).getTransportId(); + //商品A + Long productIdA = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportIdA, 10000L), true); + //商品B + Long productIdB = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportIdA, 10000L), true); + + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productIdA)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA)).get(0); + PayApi.orderPay(orderNum); + + ProductApi.delete(productIdB, true); + ProductApi.delete(productIdA, true); + TransportApi.deleteTransport(transportIdA, true); + + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreightAmount(), 0); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreeFreightAmount(), 1600); + } + + @Test(description = "平台会员权益-全平台包邮、运费模板满条件包邮商品与运费模板不包邮商品的订单,运费是否正确") + public void fullConditionFreeFreightAndNotFreeFreightAndFreeFeeUserRight() throws InterruptedException { + List categoryIds = getCategoryId(true); + //用户会员等级添加包邮权益 + Long freeFeeUserRightsId = UserRightsApi.save(UserRightsDtoData.getFreeFeeUserRightsDTO()); + UserLevelApi.update(UserLevelDtoData.getUserLevelDTO(UserApi.getUserInfo().getUserLevelId(), Collections.singletonList(freeFeeUserRightsId))); + + //运费模板-运费8元/件,满1件包邮 + TransportApi.addTransport(DeliveryData.getTransportDTO(0, 1D, 800L, 1D, 800L,1, 0, 1D, null), true); + Long transportIdA = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productIdA = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportIdA, 10000L), true); + + //运费模板-运费8元/件 + TimeUnit.SECONDS.sleep(2L); + TransportApi.addTransport(DeliveryData.getTransportDTO(), true); + Long transportIdB = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productIdB = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportIdB, 10000L), true); + + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productIdA)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA)).get(0); + PayApi.orderPay(orderNum); + + ProductApi.delete(productIdB, true); + TransportApi.deleteTransport(transportIdB, true); + ProductApi.delete(productIdA, true); + TransportApi.deleteTransport(transportIdA, true); + UserRightsApi.delete(freeFeeUserRightsId); + + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreightAmount(), 800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreeFreightAmount(), 800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getPlatformFreeFreightAmount(), 800); + } + + @Test(description = "平台会员包邮订单,运费是否正确") + public void freeFeeUserRight() { + List categoryIds = getCategoryId(true); + //用户会员等级添加包邮权益 + Long freeFeeUserRightsId = UserRightsApi.save(UserRightsDtoData.getFreeFeeUserRightsDTO()); + UserLevelApi.update(UserLevelDtoData.getUserLevelDTO(UserApi.getUserInfo().getUserLevelId(), Collections.singletonList(freeFeeUserRightsId))); + + //运费模板-8元/件 + TransportApi.addTransport(DeliveryData.getTransportDTO(), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 10000L), true); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + ProductApi.delete(productId, true); + TransportApi.deleteTransport(transportId, true); + UserRightsApi.delete(freeFeeUserRightsId); + + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreightAmount(), 800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getPlatformFreeFreightAmount(), 800); + } + + @Test(description = "多商家商品订单平台会员包邮,运费是否正确") + public static void multipleShopProductWithFreeFeeUserRight() { + //用户会员等级添加包邮权益 + Long freeFeeUserRightsId = UserRightsApi.save(UserRightsDtoData.getFreeFeeUserRightsDTO()); + UserLevelApi.update(UserLevelDtoData.getUserLevelDTO(UserApi.getUserInfo().getUserLevelId(), Collections.singletonList(freeFeeUserRightsId))); + + //A店铺运费模板-8元/件 + TransportApi.addTransport(DeliveryData.getTransportDTO(), true); + Long transportIdA = TransportApi.infoTransport(true).get(0).getTransportId(); + List categoryIdsA = getCategoryId(true); + Long productIdA = ProductApi.createProduct(SpuData.getRealSpu(categoryIdsA.get(0), categoryIdsA.get(1), transportIdA, 10000L), true); + + //B店铺运费模板-8元/件 + TransportApi.addTransport(DeliveryData.getTransportDTO(), false); + Long transportIdB = TransportApi.infoTransport(false).get(0).getTransportId(); + List categoryIdsB = getCategoryId(false); + Long productIdB = ProductApi.createProduct(SpuData.getRealSpu(categoryIdsB.get(0), categoryIdsB.get(1), transportIdB, 10000L), false); + + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB, 1)); + //确认订单数据 + Long shopIdA = ProductApi.getProductInfo(productIdA).getShopId(); + Long shopIdB = ProductApi.getProductInfo(productIdB).getShopId(); + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(Arrays.asList(shopIdA, shopIdB)); + //确认订单 + MyOrderApi.confirm(orderDTO); + //提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(Arrays.asList(shopIdA, shopIdB))); + //支付订单 + PayApi.orderPay(orderNumberList); + + ProductApi.delete(productIdB, false); + TransportApi.deleteTransport(transportIdB, false); + ProductApi.delete(productIdA, true); + TransportApi.deleteTransport(transportIdA, true); + UserRightsApi.delete(freeFeeUserRightsId); + + for(Long orderNum : orderNumberList) { + if (MyOrderApi.orderDetail(orderNum).getShopId().equals(shopIdA)) { + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreightAmount(), 800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getPlatformFreeFreightAmount(), 800); + } + if (MyOrderApi.orderDetail(orderNum).getShopId().equals(shopIdB)) { + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreightAmount(), 800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getPlatformFreeFreightAmount(), 800); + } + } + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/VirtualOrderTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/VirtualOrderTest.java new file mode 100644 index 0000000..b277bb0 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/VirtualOrderTest.java @@ -0,0 +1,338 @@ +package com.tmerclub.cloud.systemtest.test.order; + +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.order.dto.OrderStationDTO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.login.UserApi; +import com.moyuer.cloud.systemtest.api.order.*; +import com.moyuer.cloud.systemtest.api.store.ShopWalletApi; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.order.*; +import com.moyuer.cloud.systemtest.data.platform.CategoryDtoData; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author lpj + */ +public class VirtualOrderTest { + private List getCategoryId() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + CategoryApi.update(CategoryDtoData.getCategoryDTO(categoryId)); + return Stream.of(categoryId, shopCategoryId).collect(Collectors.toList()); + } + + @DataProvider(name = "noWriteNumVirtualProduct") + public Object[][] noWriteNumVirtualProduct(){ + List categoryIds = getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getUnRealSpu(categoryIds.get(0), categoryIds.get(1), 100L, 0), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "singleWriteNumVirtualProduct") + public Object[][] singleWriteNumVirtualProduct(){ + List categoryIds = getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getUnRealSpu(categoryIds.get(0), categoryIds.get(1), 100L, 1), true); + return new Object[][]{{productId}}; + } + @DataProvider(name = "tripleWriteNumVirtualProduct") + public Object[][] tripleWriteNumVirtualProduct(){ + List categoryIds = getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getUnRealSpu(categoryIds.get(0), categoryIds.get(1), 100L, -1), true); + return new Object[][]{{productId}}; + } + + @Test(description = "JK_43,虚拟订单取消删除", dataProvider = "noWriteNumVirtualProduct") + public void noWriteNumVirtualProductTestCase(Long productId) { + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + MyOrderApi.cancel(orderNum); + ProductApi.delete(productId, true); + MyOrderApi.delete(orderNum); + } + + @Test(description = "JK_44,无需核销虚拟订单完整流程", dataProvider = "noWriteNumVirtualProduct") + public void noWriteNumVirtualOrderTestCase(Long productId) throws InterruptedException { + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(1L); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 1); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 100); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 2); + } + + @Test(description = "JK_45,虚拟商品订单,单次核销订单完整流程" ,dataProvider = "singleWriteNumVirtualProduct") + public void singleWriteNumVirtualProductTestCase(Long productId) throws InterruptedException { + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(1L); + String writeOffCode = MyOrderApi.orderDetail(orderNum).getVirtualInfoList().get(0).getWriteOffCode(); + StationApi.orderWriteOffByOrderNumber(OrderVirtualInfoDtoData.getOrderVirtualInfoDTO(orderNum, writeOffCode)); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 1); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 100); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 2); + } + + @Test(description = "JK_46,三次核销虚拟订单完整流程" ,dataProvider = "tripleWriteNumVirtualProduct") + public void tripleWriteNumVirtualTestCase(Long productId) throws InterruptedException { + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(1L); + String writeOffCode = MyOrderApi.orderDetail(orderNum).getVirtualInfoList().get(0).getWriteOffCode(); + for (int i=0; i skuVOList = SupplierProductApi.info(supplierProductId, true).getSkus(); + List skuDTOList = skuVOList.stream().map(i -> BeanUtil.copyProperties(i, SkuDTO.class)).collect(Collectors.toList()); + skuDTOList.forEach(i->i.setPriceFee(2000L)); + spuDTO.setSkuList(skuDTOList); + SupplierProductApi.updateProductData(spuDTO); + //根据商品ID获取商品销售价,判断销售价是否为40 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ProductApi.info(productId, true).getSkus().get(0).getPriceFee(), 4000); + + //删除商品 + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/store/ProductTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/store/ProductTest.java new file mode 100644 index 0000000..32f56ea --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/store/ProductTest.java @@ -0,0 +1,157 @@ +package com.tmerclub.cloud.systemtest.test.store; + +import cn.hutool.core.bean.BeanUtil; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.dto.SpuLangDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuLangVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.platform.PlatformProductApi; +import com.moyuer.cloud.systemtest.data.amount.OfflineHandleEventDtoData; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import com.moyuer.cloud.systemtest.data.store.SpuPageSearchDtoData; +import org.springframework.beans.BeanUtils; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author lpj + */ +public class ProductTest { + private List getCategoryId() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + return Stream.of(categoryId, shopCategoryId).collect(Collectors.toList()); + } + + @DataProvider(name = "realProduct") + private Object[][] realProduct() { + Long transportId = DeliveryData.getFreeFeeDelivery(true); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(getCategoryId().get(0), getCategoryId().get(1), transportId, 1000L), true); + return new Object[][]{{productId}}; + } + + @Test(description = "商品管理基本流程", dataProvider = "realProduct") + public void productFlow(Long productId) throws InterruptedException { + //下架 + ProductApi.changeProductStatus(SpuPageSearchDtoData.getSpuPageSearchDTO(productId, null, 0)); + //上架 + ProductApi.changeProductStatus(SpuPageSearchDtoData.getSpuPageSearchDTO(productId, null, 1)); + //批量下架 + ProductApi.changeProductStatus(SpuPageSearchDtoData.getSpuPageSearchDTO(null, Collections.singletonList(productId), 0)); + //批量上架 + ProductApi.changeProductStatus(SpuPageSearchDtoData.getSpuPageSearchDTO(null, Collections.singletonList(productId), 1)); + + //平台置顶商品 + PlatformProductApi.toTop(productId); + //平台取消置顶商品 + PlatformProductApi.toTop(productId); + + //平台违规下架商品 + OfflineHandleEventDTO offlineHandleEventDTO = OfflineHandleEventDtoData.getOfflineHandleEventDTO(null, productId, "违规下架原因", null, null, null); + offlineHandleEventDTO.setHandleIds(Collections.singletonList(productId)); + PlatformProductApi.offline(offlineHandleEventDTO); + //申请上架,审核失败 + //商家根据活动id获取下架信息 + OfflineHandleEventVO offlineHandleEventVO = ProductApi.shopGetOfflineHandleEvent(productId); + //商家申请上架 + ProductApi.apply(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = PlatformProductApi.platformGetOfflineHandleEvent(productId); + //平台审核失败 + TimeUnit.SECONDS.sleep(2L); + PlatformProductApi.audit(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, "审核失败原因", 4)); + //申请上架,审核成功 + //商家根据活动id获取下架信息 + offlineHandleEventVO = ProductApi.shopGetOfflineHandleEvent(productId); + //商家申请上架 + ProductApi.apply(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = PlatformProductApi.platformGetOfflineHandleEvent(productId); + //平台审核成功 + TimeUnit.SECONDS.sleep(2L); + PlatformProductApi.audit(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, null, 3)); + + //平台删除商品 + PlatformProductApi.platformDeleteProduct(productId); + } + + @Test(description = "修改商品信息", dataProvider = "realProduct") + public void updateProduct(Long productId) { + SpuVO spuVO = ProductApi.info(productId, true); + SpuDTO spuDTO = new SpuDTO(); + + BeanUtils.copyProperties(spuVO, spuDTO); + + List skuVOList = spuVO.getSkus(); + List skuDTOList = skuVOList.stream().map(i -> BeanUtil.copyProperties(i, SkuDTO.class)).collect(Collectors.toList()); + spuDTO.setSkuList(skuDTOList); + + List spuLangVOList = ProductApi.info(productId, true).getSpuLangList(); + List spuLangDTOList = spuLangVOList.stream().map(i -> BeanUtil.copyProperties(i, SpuLangDTO.class)).collect(Collectors.toList()); + spuLangDTOList.forEach(i->i.setSpuName("修改后的商品名称")); + spuDTO.setSpuLangList(spuLangDTOList); + + ProductApi.update(spuDTO, true); + ProductApi.delete(productId, true); + } + + @Test(description = "商品列表修改商品名称", dataProvider = "realProduct") + public void updateProductName(Long productId) { + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setSpuId(productId); + List spuLangVOList = ProductApi.info(productId, true).getSpuLangList(); + List spuLangDTOList = spuLangVOList.stream().map(i -> BeanUtil.copyProperties(i, SpuLangDTO.class)).collect(Collectors.toList()); + spuLangDTOList.forEach(i->i.setSpuName("修改后的商品名称")); + spuDTO.setSpuLangList(spuLangDTOList); + ProductApi.updateProductData(spuDTO); + ProductApi.delete(productId, true); + } + + @Test(description = "商品列表修改商品价格", dataProvider = "realProduct") + public void updateProductPrice(Long productId) { + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setSpuId(productId); + List skuVOList = ProductApi.info(productId, true).getSkus(); + List skuDTOList = skuVOList.stream().map(i -> BeanUtil.copyProperties(i, SkuDTO.class)).collect(Collectors.toList()); + skuDTOList.forEach(i->i.setPriceFee(2000L)); + spuDTO.setSkuList(skuDTOList); + ProductApi.updateProductData(spuDTO); + ProductApi.delete(productId, true); + } + + @Test(description = "商品列表修改商品库存", dataProvider = "realProduct") + public void updateProductStock(Long productId) { + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setSpuId(productId); + List skuVOList = ProductApi.info(productId, true).getSkus(); + List skuDTOList = skuVOList.stream().map(i -> BeanUtil.copyProperties(i, SkuDTO.class)).collect(Collectors.toList()); + skuDTOList.forEach(i->i.setChangeStock(1)); + spuDTO.setSkuList(skuDTOList); + ProductApi.updateProductData(spuDTO); + ProductApi.delete(productId, true); + } + + @Test(description = "商品列表修改商品序号", dataProvider = "realProduct") + public void updateProductSeq(Long productId) { + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setSpuId(productId); + spuDTO.setSeq(1); + ProductApi.updateProductData(spuDTO); + ProductApi.delete(productId, true); + } +} diff --git a/system-test/src/main/resources/Marketing.xml b/system-test/src/main/resources/Marketing.xml new file mode 100644 index 0000000..5b9ce04 --- /dev/null +++ b/system-test/src/main/resources/Marketing.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system-test/src/main/resources/ProductTest.xml b/system-test/src/main/resources/ProductTest.xml new file mode 100644 index 0000000..157cd40 --- /dev/null +++ b/system-test/src/main/resources/ProductTest.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/system-test/src/main/resources/SupplierOrderTest.xml b/system-test/src/main/resources/SupplierOrderTest.xml new file mode 100644 index 0000000..60704e4 --- /dev/null +++ b/system-test/src/main/resources/SupplierOrderTest.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tmerclub-admin/Dockerfile b/tmerclub-admin/Dockerfile new file mode 100644 index 0000000..0b93728 --- /dev/null +++ b/tmerclub-admin/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms512m", "-Xmx512m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-admin/pom.xml b/tmerclub-admin/pom.xml new file mode 100644 index 0000000..edec86e --- /dev/null +++ b/tmerclub-admin/pom.xml @@ -0,0 +1,101 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-admin + tmerclub 管理端 + jar + + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + com.moyuer.cloud + tmerclub-common-security + ${project.version} + + + com.moyuer.cloud + tmerclub-common-leaf + ${project.version} + + + com.moyuer.cloud + tmerclub-api-product + ${project.version} + + + com.moyuer.cloud + tmerclub-api-search + ${project.version} + + + com.moyuer.cloud + tmerclub-api-order + ${project.version} + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.moyuer.cloud + tmerclub-api-user + ${project.version} + + + com.moyuer.cloud + tmerclub-common-rocketmq + ${project.version} + + + com.moyuer.cloud + tmerclub-api-biz + ${project.version} + + + com.moyuer.cloud + tmerclub-common-mongodb + ${project.version} + + + com.moyuer.cloud + tmerclub-api-seckill + ${project.version} + + + com.xuxueli + xxl-job-core + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + com.aliyun + aliyun-java-sdk-core + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/config/RocketMqConfig.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/config/RocketMqConfig.java new file mode 100644 index 0000000..1e5df99 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/config/RocketMqConfig.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.config; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqAdapter; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * @author FrozenWatermelon + * @date 2021/3/30 + */ +@RefreshScope +@Configuration +public class RocketMqConfig { + + @Autowired + private RocketMqAdapter rocketMqAdapter; + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate shopWalletNotifyServiceTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SHOP_WALLET_NOTIFY_SERVICE_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate refundShopNotifyServiceTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.REFUND_SHOP_NOTIFY_SERVICE_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate refundSuccessNotifySupplierTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_REFUND_SUCCESS_SETTLEMENT_SUPPLIER_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate addShopWalletLogTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.ADD_SHOP_WALLET_LOG_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate updateShopRechargeSuccessTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.UPDATE_SHOP_RECHARGE_SUCCESS_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate addSupplierWalletLogTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.ADD_SUPPLIER_WALLET_LOG_TOPIC); + } + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate openAllinPayRocketMQTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.OPEN_ALLINPAY_TOPIC); + } + + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/HomeStatus.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/HomeStatus.java new file mode 100644 index 0000000..375db16 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/HomeStatus.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.constant; + +/** + * @Author lth + * @Date 2021/5/20 20:34 + */ +public enum HomeStatus { + /** + * 是主页 + */ + YES(1), + /** + * 不是主页 + */ + NO(0); + + private final Integer num; + + public Integer value() { + return num; + } + + HomeStatus(Integer num) { + this.num = num; + } + + public static HomeStatus instance(Integer value) { + HomeStatus[] enums = values(); + for (HomeStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/HotSearchType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/HotSearchType.java new file mode 100644 index 0000000..73168df --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/HotSearchType.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.constant; + +/** + * 热搜状态 + * + * @author YXF + */ +public enum HotSearchType { + + /** + * 商品热搜 + */ + PROD(1), + /** + * 店铺热搜 + */ + SHOP(2); + + private final Integer num; + + public Integer value() { + return num; + } + + HotSearchType(Integer num) { + this.num = num; + } + + public static HotSearchType instance(Integer value) { + HotSearchType[] enums = values(); + for (HotSearchType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/IsDefault.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/IsDefault.java new file mode 100644 index 0000000..5960dd4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/IsDefault.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.constant; + +/** + * @Author lth + * @Date 2021/6/16 9:14 + */ +public enum IsDefault { + /** + * 是默认 + */ + YES(1), + /** + * 不是默认 + */ + NO(0); + + private final Integer num; + + public Integer value() { + return num; + } + + IsDefault(Integer num) { + this.num = num; + } + + public static IsDefault instance(Integer value) { + IsDefault[] enums = values(); + for (IsDefault statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWalletAmountType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWalletAmountType.java new file mode 100644 index 0000000..46243b4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWalletAmountType.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.constant; + +/** + * 店铺钱包金额类型 + * 金额类型 0 未结算金额 1可提现金额 2冻结金额 + * + * @author FrozenWatermelon + */ +public enum ShopWalletAmountType { + + /** + * 未结算金额 + */ + UNSETTLED_AMOUNT(0, "未结算金额"), + + /** + * 可提现金额 + */ + SETTLED_AMOUNT(1, "可提现金额"), + + /** + * 冻结金额 + */ + FREEZE_AMOUNT(2, "冻结金额"), + + ; + + private final Integer num; + + private final String shopWalletAmountType; + + public Integer value() { + return num; + } + + public String getShopWalletAmountType() { + return shopWalletAmountType; + } + + ShopWalletAmountType(Integer num, String shopWalletAmountType) { + this.num = num; + this.shopWalletAmountType = shopWalletAmountType; + } + + public static ShopWalletAmountType instance(Integer value) { + ShopWalletAmountType[] enums = values(); + for (ShopWalletAmountType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static String getAmountTypeName(Integer value) { + ShopWalletAmountType[] enums = values(); + for (ShopWalletAmountType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum.shopWalletAmountType; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWalletIoType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWalletIoType.java new file mode 100644 index 0000000..663f9a4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWalletIoType.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.constant; + +/** + * 收支类型 0支出 1收入 + * + * @Author lth + * @Date 2021/6/10 14:12 + */ +public enum ShopWalletIoType { + /** + * 0.支出 + */ + EXPENDITURE(0, "支出"), + /** + * 1. 收入 + */ + INCOME(1, "收入"), + ; + + private final Integer num; + private final String str; + + public Integer value() { + return num; + } + + public String str() { + return str; + } + + ShopWalletIoType(Integer num, String str) { + this.num = num; + this.str = str; + } + + public static ShopWalletIoType instance(Integer value) { + ShopWalletIoType[] enums = values(); + for (ShopWalletIoType typeEnum : enums) { + if (typeEnum.value().equals(value)) { + return typeEnum; + } + } + return null; + } + + public static String getIoName(Integer value) { + ShopWalletIoType[] enums = values(); + for (ShopWalletIoType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum.str; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/IndexImgController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/IndexImgController.java new file mode 100644 index 0000000..50b7b5c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/IndexImgController.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.admin; + +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.dto.IndexImgDTO; +import com.tmerclub.cloud.multishop.model.IndexImg; +import com.tmerclub.cloud.multishop.service.IndexImgService; +import com.tmerclub.cloud.multishop.vo.IndexImgVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 轮播图 + * + * @author YXF + * @date 2020-11-24 16:38:32 + */ +@RestController("adminIndexImgController") +@RequestMapping("/mp/index_img") +@Tag(name = "admin-轮播图") +public class IndexImgController { + + @Autowired + private IndexImgService indexImgService; + @DubboReference + private SpuFeignClient spuFeignClient; + + @GetMapping("/page") + @Operation(summary = "获取轮播图列表", description = "分页获取轮播图列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, IndexImgDTO indexImgDTO) { + indexImgDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO indexImgPage = indexImgService.page(pageDTO, indexImgDTO); + return ServerResponseEntity.success(indexImgPage); + } + + @GetMapping + @Operation(summary = "获取轮播图", description = "根据imgId获取轮播图") + public ServerResponseEntity getByImgId(@RequestParam Long imgId) { + IndexImgVO indexImg = indexImgService.getByImgId(imgId); + if (Objects.nonNull(indexImg.getSpuId())) { + // 已被删除的商品不显示 + ServerResponseEntity spuResponse = spuFeignClient.getById(indexImg.getSpuId()); + SpuVO spuVO; + if (spuResponse.isSuccess() + && (spuVO = spuResponse.getData()) != null + && spuVO.getStatus() != -1) { + indexImg.setSpu(spuVO); + } else { + indexImg.setSpuId(null); + } + } + return ServerResponseEntity.success(indexImg); + } + + @PostMapping + @Operation(summary = "保存轮播图", description = "保存轮播图") + public ServerResponseEntity save(@Valid @RequestBody IndexImgDTO indexImgDTO) { + IndexImg indexImg = BeanUtil.map(indexImgDTO, IndexImg.class); + indexImg.setImgId(null); + indexImg.setShopId(AuthUserContext.get().getTenantId()); + if (Objects.isNull(indexImgDTO.getStatus())) { + indexImg.setStatus(StatusEnum.ENABLE.value()); + } else { + indexImg.setStatus(indexImgDTO.getStatus()); + } + indexImgService.save(indexImg); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新轮播图", description = "更新轮播图") + public ServerResponseEntity update(@Valid @RequestBody IndexImgDTO indexImgDTO) { + IndexImg indexImg = BeanUtil.map(indexImgDTO, IndexImg.class); + indexImg.setShopId(AuthUserContext.get().getTenantId()); + indexImgService.update(indexImg); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除轮播图", description = "根据轮播图id删除轮播图") + public ServerResponseEntity delete(@RequestParam Long imgId) { + Integer imgType = indexImgService.getByImgId(imgId).getImgType(); + indexImgService.deleteById(imgId, AuthUserContext.get().getTenantId(), imgType); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/NoticeController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/NoticeController.java new file mode 100644 index 0000000..c36790e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/NoticeController.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.admin; + +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.constant.NoticeType; +import com.tmerclub.cloud.multishop.dto.NoticeDTO; +import com.tmerclub.cloud.multishop.model.Notice; +import com.tmerclub.cloud.multishop.service.NoticeService; +import com.tmerclub.cloud.multishop.vo.NoticeVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 公告 + * @author YXF + * @date 2020-11-25 17:57:56 + */ +@RestController("adminNoticeController") +@RequestMapping("/mp/notice") +@Tag(name = "admin-公告") +public class NoticeController { + + @Autowired + private NoticeService noticeService; + + + @GetMapping("/page") + @Operation(summary = "获取公告列表", description = "分页获取公告列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, NoticeDTO noticeDTO) { + noticeDTO.setShopId(AuthUserContext.get().getTenantId()); + noticeDTO.setAccountId(AuthUserContext.get().getTenantId()); + PageVO noticePage = noticeService.page(pageDTO, noticeDTO); + return ServerResponseEntity.success(noticePage); + } + + @GetMapping("/p/pagePlatformNotice") + @Operation(summary = "获取平台公告分页列表(商家端或供应商端)", description = "获取平台公告分页列表(商家端或供应商端)") + public ServerResponseEntity> pagePlatformNotice(@Valid PageDTO pageDTO, NoticeDTO noticeDTO) { + Integer sysType = AuthUserContext.get().getSysType(); + noticeDTO.setShopId(Constant.PLATFORM_SHOP_ID); + noticeDTO.setType(Objects.equals(sysType, SysTypeEnum.MULTISHOP.value()) ? NoticeType.TO_MULTISHOP.value() : NoticeType.TO_SUPPLIER.value()); + noticeDTO.setAccountId(AuthUserContext.get().getTenantId()); + noticeDTO.setSendTime(new Date()); + noticeDTO.setStatus(StatusEnum.ENABLE.value()); + PageVO notices = noticeService.pagePlatformNotice(pageDTO, noticeDTO); + + return ServerResponseEntity.success(notices); + } + + @GetMapping + @Operation(summary = "获取公告", description = "根据id获取公告") + public ServerResponseEntity getById(@RequestParam Long id) { + return ServerResponseEntity.success(noticeService.getById(id)); + } + + @PostMapping + @Operation(summary = "保存公告", description = "保存公告") + public ServerResponseEntity save(@Valid @RequestBody NoticeDTO noticeDTO) { + Notice notice = BeanUtil.map(noticeDTO, Notice.class); + Long shopId = AuthUserContext.get().getTenantId(); + //商家端创建公告 + if (!Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + notice.setTypes(NoticeType.TO_USER.value().toString()); + notice.setImmediatelySend(1); + } + notice.setShopId(shopId); + noticeService.save(notice); + noticeService.removeCacheByShopIdAndType(shopId, NoticeType.TO_USER.value()); + removeCache(notice.getTypes(), shopId); + + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新公告", description = "更新公告") + public ServerResponseEntity update(@Valid @RequestBody NoticeDTO noticeDTO) { + Notice notice = BeanUtil.map(noticeDTO, Notice.class); + Long shopId = AuthUserContext.get().getTenantId(); + NoticeVO dbNotice = noticeService.getById(notice.getId()); + if (!Objects.equals(dbNotice.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + boolean isPublish = Objects.equals(dbNotice.getStatus(), StatusEnum.DISABLE.value()) && Objects.equals(notice.getStatus(), StatusEnum.ENABLE.value()); + if (isPublish) { + notice.setPublishTime(new Date()); + } else { + notice.setPublishTime(null); + } + + noticeService.update(notice); + removeCache(notice.getTypes(), shopId); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除公告", description = "根据公告id删除公告") + @Parameter(name = "id", description = "公告id", required = true) + public ServerResponseEntity delete(@RequestParam("id") Long id) { + NoticeVO dbNotice = noticeService.getById(id); + Long shopId = AuthUserContext.get().getTenantId(); + if (Objects.isNull(dbNotice)) { + return ServerResponseEntity.success(); + } else if (!Objects.equals(dbNotice.getShopId(), shopId)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + noticeService.deleteById(id); + removeCache(dbNotice.getTypes(), shopId); + return ServerResponseEntity.success(); + } + + private void removeCache(String dbNotice, Long shopId) { + List typeList = Arrays.stream(dbNotice.split(",")).map(s -> Integer.parseInt(s.trim())).collect(Collectors.toList()); + for (Integer type : typeList) { + noticeService.removeCacheByShopIdAndType(shopId, type); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopCompanyController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopCompanyController.java new file mode 100644 index 0000000..d9d055c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopCompanyController.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.admin; + +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.IdCardCollectProcessStatus; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.constant.AuditStatus; +import com.tmerclub.cloud.multishop.dto.ShopCompanyDTO; +import com.tmerclub.cloud.multishop.model.ShopCompany; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.service.ShopCompanyService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.vo.ShopCompanyVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/8/14 16:53 + */ +@RestController("adminShopCompanyController") +@RequestMapping("/mp/shop_company") +@Tag(name = "admin-商家工商信息") +public class ShopCompanyController { + + @Autowired + private ShopCompanyService shopCompanyService; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @Autowired + private ShopAllinpayService shopAllinpayService; + @Autowired + private ShopDetailService shopDetailService; + + @GetMapping("/check_credit_code") + @Operation(summary = "检查统一信用码是否已存在", description = "检查统一信用码是否已存在") + public ServerResponseEntity checkCreditCode(@RequestParam("creditCode") String creditCode, @RequestParam("shopId") Long shopId) { + Boolean res = shopCompanyService.checkCreditCode(creditCode, shopId); + return ServerResponseEntity.success(res); + } + + @PutMapping("/update_id_card_status") + @Operation(summary = "更新影印件状态", description = "通联独有") + public ServerResponseEntity updateIdCardStatus(@RequestParam("shopId") Long shopId) { + if (!shopAllinpayService.getIsAllinpay()) { + return ServerResponseEntity.success(); + } + if (Objects.isNull(shopId)) { + throw new LuckException("店铺id不能为空"); + } + ShopCompanyVO shopCompanyVO = shopCompanyService.getShopCompanyByShopIdAndStatus(shopId, AuditStatus.WAITAUDIT.value()); + if (Objects.isNull(shopCompanyVO)) { + shopCompanyVO = shopCompanyService.getShopCompanyByShopIdAndStatus(shopId, AuditStatus.SUCCESSAUDIT.value()); + } + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + if (Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + // 更新下更新时间 + shopCompanyService.updateById(BeanUtil.map(shopCompanyVO, ShopCompany.class)); + // 已经审核通过不用更新 + return ServerResponseEntity.success(shopDetailVO.getIdCardCollectProcessStatus()); + } + // 可能回调有问题导致这里没刷新,所以多给一个接口 + ServerResponseEntity idCardStatus = allinpayFeignClient.getIdCardStatus(AllinpayConstant.SHOP + shopId); + if (!idCardStatus.isSuccess()) { + throw new LuckException(idCardStatus.getMsg()); + } + if (Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), idCardStatus.getData())) { + // 更新下更新时间 + shopCompanyService.updateById(BeanUtil.map(shopCompanyVO, ShopCompany.class)); + // 状态一致不用更新 + return ServerResponseEntity.success(idCardStatus.getData()); + } + shopDetailService.updateAllinpayIdCardStatus(AllinpayConstant.SHOP + shopId, idCardStatus.getData()); + shopDetailService.removeCacheByShopId(shopId); + return ServerResponseEntity.success(idCardStatus.getData()); + } + + @PutMapping("/upload_id_card") + @Operation(summary = "重新上传影印件", description = "通联独有") + public ServerResponseEntity uploadIdCard(@RequestBody ShopCompanyDTO shopCompanyDTO) { + if (!shopAllinpayService.getIsAllinpay()) { + return ServerResponseEntity.success("非通联环境"); + } + Long shopId = shopCompanyDTO.getShopId(); + if (Objects.isNull(shopId)) { + throw new LuckException("店铺id不能为空"); + } + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + ServerResponseEntity idCardStatus = allinpayFeignClient.getIdCardStatus(AllinpayConstant.SHOP + shopId); + if (!idCardStatus.isSuccess()) { + throw new LuckException(idCardStatus.getMsg()); + } + String result = shopCompanyService.uploadIdCard(shopCompanyDTO, shopDetailVO, idCardStatus.getData()); + shopDetailService.removeCacheByShopId(shopId); + if (!Objects.equals(result, AllinpayConstant.ALLINPAY_AUDIT_SUCCESS) || Objects.equals(result, AllinpayConstant.ID_CARD_UPDATE_SUCCESS)) { + return ServerResponseEntity.showFailMsg(result); + } + return ServerResponseEntity.success(result); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopDetailController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopDetailController.java new file mode 100644 index 0000000..3e97871 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopDetailController.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.admin; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Author lth + * @Date 2021/8/14 16:45 + */ +@RestController("adminShopDetailController") +@RequestMapping("/mp/shop_detail") +@Tag(name = "admin-店铺信息") +public class ShopDetailController { + + @Autowired + private ShopDetailService shopDetailService; + + @GetMapping("/check_shop_name") + @Operation(summary = "检查店铺名称是否已存在", description = "检查店铺名称是否已存在") + public ServerResponseEntity checkShopName(@RequestParam("shopName") String shopName) { + Boolean res = shopDetailService.checkShopName(shopName); + return ServerResponseEntity.success(res); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopOfflineHandleEventController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopOfflineHandleEventController.java new file mode 100644 index 0000000..913ca64 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopOfflineHandleEventController.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.admin; + +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + + +/** + * 下线处理事件 + * + * @author YXF + * @date 2021-01-15 17:46:26 + */ +@RestController("shopOfflineHandleEventController") +@RequestMapping("/mp/shop_offline_handle_event") +@Tag(name = "admin-下线处理事件") +public class ShopOfflineHandleEventController { + + @DubboReference + private OfflineHandleEventFeignClient offlineHandleEventFeignClient; + @Autowired + private ShopDetailService shopDetailService; + + + @PostMapping("/offline") + @Operation(summary = "下线店铺", description = "下线店铺") + public ServerResponseEntity offline(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + ShopDetailVO shopDetail = shopDetailService.getByShopId(offlineHandleEventDto.getHandleId()); + if (shopDetail == null) { + throw new LuckException("该店铺不存在或者已删除"); + } + + // 添加下线处理记录 + offlineHandleEventDto.setHandleType(OfflineHandleEventType.PROD.getValue()); + offlineHandleEventDto.setHandleId(shopDetail.getShopId()); + offlineHandleEventDto.setSysType(SysTypeEnum.MULTISHOP.value()); + offlineHandleEventFeignClient.save(offlineHandleEventDto); + // 更新店铺状态为下线 + shopDetailService.changeSpuStatus(shopDetail.getShopId(), StatusEnum.OFFLINE.value()); + + // 移除缓存 + shopDetailService.removeCacheByShopId(shopDetail.getShopId()); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_offline_handle_event_by_prodId/{prodId}") + @Operation(summary = "获取最新下线店铺的事件", description = "通过prodId获取最新下线店铺的事件") + public ServerResponseEntity getOfflineHandleEventByProdId(@PathVariable Long prodId) { + ServerResponseEntity offlineHandleEventResponse = + offlineHandleEventFeignClient.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.SHOP.getValue(), prodId, null); + return ServerResponseEntity.success(offlineHandleEventResponse.getData()); + } + + @PostMapping("/shop_audit") + @Operation(summary = "审核店铺", description = "审核店铺") + public ServerResponseEntity prodAudit(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + offlineHandleEventFeignClient.auditOfflineEvent(offlineHandleEventDto); + Long shopId = offlineHandleEventDto.getHandleId(); + // 审核通过,更新店铺为营业状态 + if (Objects.equals(offlineHandleEventDto.getStatus(), OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue())) { + shopDetailService.changeSpuStatus(shopId, StatusEnum.ENABLE.value()); + } else if (Objects.equals(offlineHandleEventDto.getStatus(), OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue())) { + shopDetailService.changeSpuStatus(shopId, StatusEnum.OFFLINE.value()); + } + + // 移除缓存 + shopDetailService.removeCacheByShopId(shopId); + return ServerResponseEntity.success(); + } + + @PostMapping("/audit_apply") + @Operation(summary = "违规店铺提交审核", description = "违规店铺提交审核") + public ServerResponseEntity auditApply(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + Long shopId = offlineHandleEventDto.getHandleId(); + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(offlineHandleEventDto.getHandleId()); + if (shopDetailVO == null) { + // 店铺信息不存在 + throw new LuckException("店铺信息不存在"); + } + offlineHandleEventFeignClient.updateToApply(offlineHandleEventDto); + // 更新店铺为待审核状态 + shopDetailService.changeSpuStatus(shopId, StatusEnum.WAIT_AUDIT.value()); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopRenovationUpDelController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopRenovationUpDelController.java new file mode 100644 index 0000000..b022ba7 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopRenovationUpDelController.java @@ -0,0 +1,121 @@ +package com.tmerclub.cloud.multishop.controller.admin; + +import cn.hutool.core.util.BooleanUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.constant.RenovationType; +import com.tmerclub.cloud.multishop.dto.ShopRenovationDTO; +import com.tmerclub.cloud.multishop.model.ShopRenovation; +import com.tmerclub.cloud.multishop.service.ShopRenovationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author 菠萝凤梨 + */ +@RestController("adminShopRenovationUpDelController") +@RequestMapping("/mp/shop_renovation") +@Tag(name = "店铺页面-修改、删除、设为主页") +public class ShopRenovationUpDelController { + + @Autowired + private ShopRenovationService shopRenovationService; + + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + + @PutMapping("/update_pc") + @Operation(summary = "更新店铺pc端装修信息", description = "更新店铺装修信息") + public ServerResponseEntity update(@Valid @RequestBody ShopRenovationDTO shopRenovationDTO) { + shopRenovationDTO.setRenovationType(RenovationType.PC.value()); + updateShopRenovation(shopRenovationDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_h5") + @Operation(summary = "更新店铺移动端装修信息", description = "更新店铺装修信息") + public ServerResponseEntity updateH5(@Valid @RequestBody ShopRenovationDTO shopRenovationDTO) { + shopRenovationDTO.setRenovationType(RenovationType.H5.value()); + updateShopRenovation(shopRenovationDTO); + return ServerResponseEntity.success(); + } + + @DeleteMapping("/delete_pc") + @Operation(summary = "删除pc店铺装修信息", description = "根据店铺装修信息id删除店铺pc装修信息") + public ServerResponseEntity delete(@RequestParam Long renovationId) { + deleteRenovation(renovationId); + return ServerResponseEntity.success(); + } + + @DeleteMapping("/delete_h5") + @Operation(summary = "删除h5店铺装修信息", description = "根据店铺装修信息id删除店铺h5装修信息") + public ServerResponseEntity deleteH5(@RequestParam Long renovationId) { + deleteRenovation(renovationId); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_home_status_pc") + @Operation(summary = "PC端修改主页标识", description = "PC端修改主页标识") + public ServerResponseEntity updateHomeStatus(@RequestParam Long renovationId) { + updateShopRenovationStatus(renovationId); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_h5_home_status") + @Operation(summary = "移动端修改主页标识", description = "移动端修改主页标识") + public ServerResponseEntity updateH5HomeStatus(@RequestParam Long renovationId) { + updateShopRenovationStatus(renovationId); + return ServerResponseEntity.success(); + } + + private void updateShopRenovationStatus(Long renovationId) { + if (BooleanUtil.isFalse(permission)) { + throw new LuckException("抱歉,当前无操作权限"); + } + ShopRenovation shopRenovation = shopRenovationService.getByRenovationId(renovationId); + if (!Objects.equals(shopRenovation.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + shopRenovationService.updateToHomePage(shopRenovation); + shopRenovationService.removeCache(shopRenovation.getShopId(), shopRenovation.getRenovationType(), shopRenovation.getRenovationId()); + } + + private void updateShopRenovation(ShopRenovationDTO shopRenovationDTO) { + if (BooleanUtil.isFalse(permission)) { + throw new LuckException("抱歉,当前无操作权限"); + } + ShopRenovation shopRenovation = BeanUtil.map(shopRenovationDTO, ShopRenovation.class); + ShopRenovation shopRenovationDb = shopRenovationService.getByRenovationId(shopRenovation.getRenovationId()); + if (Objects.isNull(shopRenovationDb)) { + throw new LuckException("该装修不存在,请刷新页面重试"); + } + if (!Objects.equals(shopRenovationDb.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + shopRenovationService.update(shopRenovation); + shopRenovationService.removeCache(shopRenovationDb.getShopId(), shopRenovationDTO.getRenovationType(), shopRenovationDb.getRenovationId()); + } + + private void deleteRenovation(Long renovationId) { + if (BooleanUtil.isFalse(permission)) { + throw new LuckException("抱歉,当前无操作权限"); + } + ShopRenovation shopRenovation = shopRenovationService.getByRenovationId(renovationId); + if (!Objects.equals(shopRenovation.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + shopRenovationService.deleteById(renovationId, shopRenovation.getRenovationType(), shopRenovation.getShopId()); + shopRenovationService.removeCache(shopRenovation.getShopId(), shopRenovation.getRenovationType(), shopRenovation.getRenovationId()); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopTemplateController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopTemplateController.java new file mode 100644 index 0000000..c83d32f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopTemplateController.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.admin; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.constant.TemplateType; +import com.tmerclub.cloud.multishop.dto.ShopTemplateDTO; +import com.tmerclub.cloud.multishop.model.ShopTemplate; +import com.tmerclub.cloud.multishop.service.ShopTemplateService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.Objects; + +/** + * 商品装修模板表 + * @author Orange + */ +@RestController("multishopShopTemplateController") +@RequestMapping("/mp/shop_template") +@Tag(name = "店铺装修模板") +public class ShopTemplateController { + + @Autowired + private ShopTemplateService shopTemplateService; + + + @GetMapping("/page") + @Operation(summary = "根据类型获取商品装修模板表列表", description = "根据类型分页获取商品装修模板表列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, ShopTemplateDTO shopTemplateDTO) { + shopTemplateDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO shopTemplatePage = shopTemplateService.page(pageDTO, BeanUtil.map(shopTemplateDTO, ShopTemplate.class)); + return ServerResponseEntity.success(shopTemplatePage); + } + + @GetMapping("/page_h5") + @Operation(summary = "根据类型获取商品装修模板表列表", description = "根据类型分页获取商品装修模板表列表") + public ServerResponseEntity> pageH5(@Valid PageDTO pageDTO, ShopTemplateDTO shopTemplateDTO) { + shopTemplateDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO shopTemplatePage = shopTemplateService.page(pageDTO, BeanUtil.map(shopTemplateDTO, ShopTemplate.class)); + return ServerResponseEntity.success(shopTemplatePage); + } + + @GetMapping + @Operation(summary = "获取商品装修模板表", description = "根据templateId获取商品装修模板表") + public ServerResponseEntity getByTemplateId(@RequestParam Long templateId) { + return ServerResponseEntity.success(shopTemplateService.getByTemplateId(templateId)); + } + + @GetMapping("/get_h5") + @Operation(summary = "获取商品装修模板表", description = "根据templateId获取商品装修模板表") + public ServerResponseEntity getH5ByTemplateId(@RequestParam Long templateId) { + return ServerResponseEntity.success(shopTemplateService.getByTemplateId(templateId)); + } + + @PostMapping("/save_pc") + @Operation(summary = "保存商品pc装修模板表", description = "保存商品pc装修模板表") + public ServerResponseEntity save(@Valid @RequestBody ShopTemplateDTO shopTemplateDTO) { + ShopTemplate shopTemplate = BeanUtil.map(shopTemplateDTO, ShopTemplate.class); + shopTemplate.setShopId(AuthUserContext.get().getTenantId()); + shopTemplate.setType(TemplateType.PC.value()); + shopTemplate.setTemplateId(null); + shopTemplateService.save(shopTemplate); + return ServerResponseEntity.success(shopTemplate.getTemplateId()); + } + + @PostMapping("/save_h5") + @Operation(summary = "保存商品h5装修模板表", description = "保存商品h5装修模板表") + public ServerResponseEntity saveH5(@Valid @RequestBody ShopTemplateDTO shopTemplateDTO) { + ShopTemplate shopTemplate = BeanUtil.map(shopTemplateDTO, ShopTemplate.class); + shopTemplate.setShopId(AuthUserContext.get().getTenantId()); + shopTemplate.setType(TemplateType.H5.value()); + shopTemplate.setTemplateId(null); + shopTemplateService.save(shopTemplate); + return ServerResponseEntity.success(shopTemplate.getTemplateId()); + } + + @PostMapping("/copy_pc") + @Operation(summary = "PC端复制模板信息", description = "PC端复制模板信息") + public ServerResponseEntity copy(@RequestParam Long templateId) { + ShopTemplate shopTemplate = copyTemplate(templateId); + return ServerResponseEntity.success(shopTemplate.getTemplateId()); + } + + @PostMapping("/copy_h5") + @Operation(summary = "移动端复制模板信息", description = "移动端复制模板信息") + public ServerResponseEntity copyH5(@RequestParam Long templateId) { + ShopTemplate shopTemplate = copyTemplate(templateId); + return ServerResponseEntity.success(shopTemplate.getTemplateId()); + } + + private ShopTemplate copyTemplate(Long templateId) { + ShopTemplate shopTemplate = shopTemplateService.getByTemplateId(templateId); + if (Objects.isNull(shopTemplate)) { + throw new LuckException("模板不存在,请刷新页面重试"); + } + if (!Objects.equals(shopTemplate.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + shopTemplate.setTemplateId(null); + shopTemplate.setName(shopTemplate.getName() + "副本"); + shopTemplate.setCreateTime(new Date()); + shopTemplate.setUpdateTime(new Date()); + shopTemplateService.save(shopTemplate); + return shopTemplate; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopWithdrawCashController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopWithdrawCashController.java new file mode 100644 index 0000000..f25fed9 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopWithdrawCashController.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.admin; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.dto.ShopWithdrawCashDTO; +import com.tmerclub.cloud.multishop.service.ShopWithdrawCashService; +import com.tmerclub.cloud.multishop.vo.ShopWithdrawCashVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Objects; + +/** + * 商家提现申请信息 + * + * @Author lth + * @Date 2021/6/11 9:23 + */ +@RestController("adminShopWithdrawCashController") +@RequestMapping("/mp/shop_withdraw_cash") +@Tag(name = "admin-商家提现申请信息") +public class ShopWithdrawCashController { + + @Autowired + private ShopWithdrawCashService shopWithdrawCashService; + + @GetMapping("/page") + @Operation(summary = "分页获取商家提现记录信息", description = "分页获取商家提现记录信息") + public ServerResponseEntity> page(PageDTO pageDTO, ShopWithdrawCashDTO shopWithdrawCashDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + shopWithdrawCashDTO.setShopId(shopId); + } + PageVO pageVO = shopWithdrawCashService.pageByParam(pageDTO, shopWithdrawCashDTO); + return ServerResponseEntity.success(pageVO); + } + + @GetMapping("/info") + @Operation(summary = "根据提现记录id查看提现记录", description = "根据提现记录id查看提现记录") + public ServerResponseEntity getById(@RequestParam("cashId") Long cashId) { + ShopWithdrawCashVO shopWithdrawCashVO = shopWithdrawCashService.getDetailByCashId(cashId); + return ServerResponseEntity.success(shopWithdrawCashVO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/IndexImgController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/IndexImgController.java new file mode 100644 index 0000000..9ff50c3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/IndexImgController.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.app; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.service.IndexImgService; +import com.tmerclub.cloud.multishop.vo.IndexImgVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 轮播图 + * + * @author YXF + * @date 2020-11-24 16:38:32 + */ +@RestController("appIndexImgController") +@RequestMapping("/ua/index_img") +@Tag(name = "app-轮播图") +public class IndexImgController { + + @Autowired + private IndexImgService indexImgService; + + @GetMapping("/list") + @Operation(summary = "获取轮播图列表", description = "分页获取轮播图列表") + @Parameters({ + @Parameter(name = "shopId", description = "店铺id(平台:0)"), + @Parameter(name = "imgType", description = "图片类型,0app,1pc") + }) + public ServerResponseEntity> getList(@RequestParam("shopId") Long shopId, @RequestParam("imgType") Integer imgType) { + List indexImgPage = indexImgService.getListByShopId(shopId, imgType); + return ServerResponseEntity.success(indexImgPage); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/NoticeController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/NoticeController.java new file mode 100644 index 0000000..51e1ae7 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/NoticeController.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.app; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.constant.NoticeType; +import com.tmerclub.cloud.multishop.dto.NoticeDTO; +import com.tmerclub.cloud.multishop.service.NoticeService; +import com.tmerclub.cloud.multishop.vo.NoticeVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 公告 + * + * @author YXF + * @date 2020-11-25 17:57:56 + */ +@RestController("appNoticeController") +@RequestMapping("/ma/notice") +@Tag(name = "app-公告") +public class NoticeController { + + @Autowired + private NoticeService noticeService; + + @GetMapping("/list") + @Operation(summary = "获取公告列表", description = "获取公告列表") + @Parameter(name = "shopId", description = "店铺id") + public ServerResponseEntity> list(@RequestParam("shopId") Long shopId) { + List notices; + List result; + Long accountId; + UidInfoBO uidInfoBO = AuthUserContext.get(); + notices = noticeService.getlistByShopId(shopId, NoticeType.TO_USER.value()); + //筛选出立即发送和到时间定时发送的公告 + List list = notices.stream().filter(noticeVO -> Objects.equals(noticeVO.getImmediatelySend(), 1) || (Objects.equals(noticeVO.getImmediatelySend(), 0) && noticeVO.getSendTime().before(new Date()))).collect(Collectors.toList()); + //登录状态显示 指定全部用户和指定用户可见的公告 + if (Objects.nonNull(uidInfoBO)) { + accountId = AuthUserContext.get().getUserId(); + String userId = String.valueOf(accountId); + result = list.stream().filter(notice -> Objects.isNull(notice.getUserIds()) || (Objects.nonNull(notice.getUserIds()) && notice.getUserIds().contains(userId))).collect(Collectors.toList()); + } else { + //未登录状态只显示 全部用户可见的公告 + result = list.stream().filter(notice -> Objects.isNull(notice.getUserIds())).collect(Collectors.toList()); + } + + return ServerResponseEntity.success(result); + } + + @GetMapping + @Operation(summary = "获取公告分页列表", description = "获取公告分页列表") + @Parameter(name = "shopId", description = "店铺id") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, @RequestParam("shopId") Long shopId) { + NoticeDTO noticeDTO = new NoticeDTO(); + noticeDTO.setShopId(shopId); + noticeDTO.setType(NoticeType.TO_USER.value()); + noticeDTO.setStatus(StatusEnum.ENABLE.value()); + noticeDTO.setSendTime(new Date()); + noticeDTO.setAccountId(Objects.nonNull(AuthUserContext.get()) ? AuthUserContext.get().getUserId() : null); + PageVO noticePage = noticeService.pagePlatformNotice(pageDTO, noticeDTO); + return ServerResponseEntity.success(noticePage); + } + + @GetMapping("/info") + @Operation(summary = "获取公告", description = "根据id获取公告并更新为已读状态") + public ServerResponseEntity getById(@RequestParam Long id) { + noticeService.updateIsLearning(id); + NoticeVO noticeVO = noticeService.getById(id); + if (Objects.isNull(noticeVO)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + List typeList = Arrays.stream(noticeVO.getTypes().split(",")).map(s -> Integer.parseInt(s.trim())).collect(Collectors.toList()); + for (Integer type : typeList) { + noticeService.removeCacheByShopIdAndType(noticeVO.getShopId(), type); + } + return ServerResponseEntity.success(noticeVO); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ApplyShopUserController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ApplyShopUserController.java new file mode 100644 index 0000000..9d4c673 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ApplyShopUserController.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.multishop; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.dto.ShopUserDTO; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.service.ShopUserService; +import com.tmerclub.cloud.multishop.vo.ShopUserSimpleVO; +import com.tmerclub.cloud.multishop.vo.ShopUserVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +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.util.List; +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/5/12 20:27 + */ +@RequestMapping("/m/apply_shop/shop_user") +@RestController("multishopShopUserController") +@Tag(name = "multishop-店铺用户信息") +public class ApplyShopUserController { + + @Autowired + private ShopDetailService shopDetailService; + + @Autowired + private ShopUserService shopUserService; + + @DubboReference + private AccountFeignClient accountFeignClient; + + @GetMapping("/info") + @Operation(summary = "登陆店铺用户信息", description = "获取当前登陆店铺用户的用户信息") + public ServerResponseEntity info() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + ShopUserSimpleVO shopUserSimple = new ShopUserSimpleVO(); + shopUserSimple.setIsAdmin(uidInfoBO.getIsAdmin()); + shopUserSimple.setIsPassShop(uidInfoBO.getIsPassShop()); + shopUserSimple.setTenantId(uidInfoBO.getTenantId()); + shopUserSimple.setUserId(uidInfoBO.getUserId()); + shopUserSimple.setUserName(uidInfoBO.getUsername()); + if (!Objects.equals(uidInfoBO.getTenantId(), Constant.DEFAULT_SHOP_ID)) { + ShopDetailVO shopDetail = shopDetailService.getByShopId(uidInfoBO.getTenantId()); + shopUserSimple.setAvatar(shopDetail.getShopLogo()); + shopUserSimple.setShopName(shopDetail.getShopName()); + } + return ServerResponseEntity.success(shopUserSimple); + } + + @GetMapping("/list") + @Operation(summary = "获取店铺下的所有员工列表", description = "获取店铺下的所有员工列表") + public ServerResponseEntity> list() { + ShopUserDTO shopUserDTO = new ShopUserDTO(); + shopUserDTO.setShopId(AuthUserContext.get().getTenantId()); + List shopUserVOList = shopUserService.listByShopId(shopUserDTO); + return ServerResponseEntity.success(shopUserVOList); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopApplyController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopApplyController.java new file mode 100644 index 0000000..00eb405 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopApplyController.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.multishop; + +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.constant.AuditStatus; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.service.ShopAuditingService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.vo.ShopAuditingVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.util.Objects; + +/** + * @author person + */ +@RestController("multishopShopApplyController") +@RequestMapping("/m/apply_shop/shop_apply") +@Tag(name = "multishop-店铺申请") +public class ShopApplyController { + + private final Logger LOGGER = LoggerFactory.getLogger(ShopApplyController.class); + + @Autowired + private ShopDetailService shopDetailService; + + @Autowired + private ShopAuditingService shopAuditingService; + + @DubboReference + private AccountFeignClient accountFeignClient; + + @Autowired + private ShopAllinpayService shopAllinpayService; + + @GetMapping("/get_auditing_info") + @Operation(summary = "获取店铺审核状态信息", description = "获取店铺审核状态信息,返回值为空代表该店铺没有提交过审核信息") + public ServerResponseEntity getAuditingInfo() { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + if (Objects.equals(shopId, Constant.DEFAULT_SHOP_ID)) { + LOGGER.info("获取店铺审核状态信息,该店铺没有提交过审核信息"); + return ServerResponseEntity.success(null); + } + ShopAuditingVO shopAuditingVO = shopAuditingService.getByshopId(shopId); + if (Objects.isNull(shopAuditingVO)) { + return ServerResponseEntity.success(null); + } + ServerResponseEntity responseEntity = accountFeignClient.getAccountInfoByTenantId(shopId, sysType); + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + if (Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.OFFLINE.value())) { + shopAuditingVO.setStatus(AuditStatus.OFFLINE.value()); + } else if (Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.OFFLINE_AWAIT_AUDIT.value()) || Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.OPEN_AWAIT_AUDIT.value())) { + if (!shopAllinpayService.getIsAllinpay()) { + shopAuditingVO.setStatus(AuditStatus.WAITAUDIT.value()); + } + } + if (responseEntity.isSuccess() && Objects.nonNull(responseEntity.getData())) { + AuthAccountVO authAccountVO = responseEntity.getData(); + shopDetailVO.setMerchantAccount(authAccountVO.getPhone()); + shopDetailVO.setAccountStatus(authAccountVO.getStatus()); + } + shopAuditingVO.setShopDetail(shopDetailVO); + shopAuditingVO.setUserId(null); + shopAuditingVO.setShopId(null); + shopAuditingVO.setAuditorId(null); + return ServerResponseEntity.success(shopAuditingVO); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopCompanyController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopCompanyController.java new file mode 100644 index 0000000..09b1922 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopCompanyController.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.multishop; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.IdCardCollectProcessStatus; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.constant.AuditStatus; +import com.tmerclub.cloud.multishop.dto.ShopCompanyDTO; +import com.tmerclub.cloud.multishop.mapper.ShopDetailMapper; +import com.tmerclub.cloud.multishop.model.ShopCompany; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.service.ShopCompanyService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.vo.ShopCompanyVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/4/25 16:31 + */ +@RestController +@RequestMapping("/m/apply_shop/shop_company") +@Tag(name = "multishop-店铺工商信息") +public class ShopCompanyController { + + @Autowired + private ShopCompanyService shopCompanyService; + @Autowired + private ShopDetailMapper shopDetailMapper; + @Autowired + private ShopAllinpayService shopAllinpayService; + @Autowired + private ShopDetailService shopDetailService; + + @PostMapping + @Operation(summary = "新增店铺工商信息", description = "新增店铺工商信息") + public ServerResponseEntity save(@Valid @RequestBody ShopCompanyDTO shopCompanyDTO) { + Long shopId = this.getShopId(); + checkAllinpay(shopCompanyDTO); + ShopCompany shopCompany = BeanUtil.map(shopCompanyDTO, ShopCompany.class); + shopCompany.setShopId(shopId); + shopCompany.setStatus(AuditStatus.WAITAUDIT.value()); + shopCompanyService.save(shopCompany, true); + return ServerResponseEntity.success(); + } + + private void checkAllinpay(ShopCompanyDTO shopCompanyDTO) { + boolean needInfo = Objects.isNull(shopCompanyDTO.getLegalIds()) || Objects.isNull(shopCompanyDTO.getLegalPhone()); + if (shopAllinpayService.getIsAllinpay() && needInfo) { + throw new LuckException("开店所需要提交的信息有所变更,请重新填写"); + } + } + + @PutMapping + @Operation(summary = "商家端更新店铺工商信息,仅在申请开店时调用", description = "更新店铺工商信息") + public ServerResponseEntity update(@Valid @RequestBody ShopCompanyDTO shopCompanyDTO) { + checkAllinpay(shopCompanyDTO); + ShopCompany shopCompany = BeanUtil.map(shopCompanyDTO, ShopCompany.class); + shopCompany.setStatus(AuditStatus.WAITAUDIT.value()); + shopCompanyService.checkInfo(shopCompany, false, null); + shopCompanyService.update(shopCompany); + return ServerResponseEntity.success(); + } + + @PostMapping("/storage") + @Operation(summary = "存储店铺工商信息", description = "存储店铺工商信息,已存在则更新,不存在则新增") + public ServerResponseEntity storage(@Valid @RequestBody ShopCompanyDTO shopCompanyDTO) { + Long shopId = this.getShopId(); + checkAllinpay(shopCompanyDTO); + ShopCompanyVO shopCompanyVO = shopCompanyService.getShopCompanyByShopIdAndStatus(shopId, AuditStatus.WAITAUDIT.value()); + ShopCompany shopCompany = BeanUtil.map(shopCompanyDTO, ShopCompany.class); + shopCompany.setShopId(shopId); + shopCompany.setStatus(AuditStatus.WAITAUDIT.value()); + if (Objects.isNull(shopCompanyVO)) { + // 不存在,新增 + shopCompanyService.save(shopCompany, true); + } else { + // 已存在,更新 + shopCompany.setShopCompanyId(shopCompanyVO.getShopCompanyId()); + shopCompanyService.checkInfo(shopCompany, false, null); + shopCompanyService.update(shopCompany); + } + return ServerResponseEntity.success(); + } + + @GetMapping + @Operation(summary = "获取店铺工商信息") + @Parameter(name = "status", description = "审核状态:1:已通过 0待审核 -1未通过") + public ServerResponseEntity getShopCompanyByShopId(@RequestParam(value = "status", required = false, defaultValue = "1") Integer status) { + Long shopId = this.getShopId(); + Integer isPassShop = AuthUserContext.get().getIsPassShop(); + if (Objects.equals(isPassShop, StatusEnum.DISABLE.value())) { + status = AuditStatus.WAITAUDIT.value(); + } + if (shopAllinpayService.getIsAllinpay()) { + // 影印件还没通过审核 + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + if (!Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + status = AuditStatus.WAITAUDIT.value(); + } + } + ShopCompanyVO shopCompanyVO = shopCompanyService.getShopCompanyByShopIdAndStatus(shopId, status); + if (Objects.nonNull(shopCompanyVO) && StrUtil.isNotBlank(shopCompanyVO.getLegalPhone())) { + shopCompanyVO.setLegalPhone(PhoneUtil.hideBetween(shopCompanyVO.getLegalPhone()).toString()); + } + return ServerResponseEntity.success(shopCompanyVO); + } + + @PutMapping("/update_acct_protocol_no") + @Operation(summary = "更新店铺账户协议编号") + @Parameters({ + @Parameter(name = "signAcctType", description = "签约类型 1.个人 2.法人 3.企业"), + @Parameter(name = "acctProtocolNo", description = "账户提现协议编号") + }) + public ServerResponseEntity updateAcctProtocolNo(@RequestParam("signAcctType") Integer signAcctType, + @RequestParam("acctProtocolNo") String acctProtocolNo) { + Long shopId = this.getShopId(); + // 企业会员-“企业名称”“法人姓名”变更后,需重新签约。 + shopDetailMapper.updateAcctProtocolNoByType(shopId, signAcctType, acctProtocolNo); + shopDetailService.removeCacheByShopId(shopId); + return ServerResponseEntity.success(); + } + + private Long getShopId() { + Long shopId = AuthUserContext.get().getTenantId(); + if (Objects.equals(shopId, Constant.DEFAULT_SHOP_ID)) { + throw new LuckException("店铺不存在"); + } + return shopId; + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopUserController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopUserController.java new file mode 100644 index 0000000..1cca0bc --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopUserController.java @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.multishop; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.multishop.dto.ShopUserDTO; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.service.ShopUserService; +import com.tmerclub.cloud.multishop.vo.ShopUserSimpleVO; +import com.tmerclub.cloud.multishop.vo.ShopUserVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/09/02 + */ +@RequestMapping("/m/shop_user") +@RestController +@Tag(name = "店铺用户信息") +public class ShopUserController { + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + @Autowired + private ShopUserService shopUserService; + + @Autowired + private ShopDetailService shopDetailService; + + @DubboReference + private NotifyFeignClient notifyFeignClient; + + @DubboReference + private AccountFeignClient accountFeignClient; + + @GetMapping("/info") + @Operation(summary = "登陆店铺用户信息", description = "获取当前登陆店铺用户的用户信息") + public ServerResponseEntity info() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + ShopUserSimpleVO shopUserSimple = new ShopUserSimpleVO(); + shopUserSimple.setIsAdmin(uidInfoBO.getIsAdmin()); + shopUserSimple.setUserName(uidInfoBO.getUsername()); + if (!Objects.equals(uidInfoBO.getTenantId(), Constant.DEFAULT_SHOP_ID)) { + ShopDetailVO shopDetail = shopDetailService.getByShopId(uidInfoBO.getTenantId()); + shopUserSimple.setShopName(shopDetail.getShopName()); + shopUserSimple.setAvatar(shopDetail.getShopLogo()); + } + return ServerResponseEntity.success(shopUserSimple); + } + + @GetMapping("/page") + @Operation(summary = "店铺用户列表", description = "获取店铺用户列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, ShopUserDTO shopUserDTO) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + shopUserDTO.setShopId(uidInfoBO.getTenantId()); + PageVO shopUserPage = shopUserService.pageByShopId(pageDTO, shopUserDTO); + return ServerResponseEntity.success(shopUserPage); + } + + @GetMapping + @Operation(summary = "获取店铺用户信息", description = "根据用户id获取店铺用户信息") + public ServerResponseEntity detail(@RequestParam Long shopUserId) { + ShopUserVO shopUserVO = shopUserService.getByUserId(shopUserId); + if (StrUtil.isNotBlank(shopUserVO.getPhone())) { + shopUserVO.setPhone(PhoneUtil.hideBetween(shopUserVO.getPhone()).toString()); + } + if (StrUtil.isNotBlank(shopUserVO.getPhoneNum())) { + shopUserVO.setPhoneNum(PhoneUtil.hideBetween(shopUserVO.getPhoneNum()).toString()); + } + return ServerResponseEntity.success(shopUserVO); + } + + @PostMapping + @Operation(summary = "保存店铺用户信息", description = "保存店铺用户信息") + public ServerResponseEntity save(@Valid @RequestBody ShopUserDTO shopUserDTO) { + if (!PrincipalUtil.isMobile(shopUserDTO.getPhone())) { + throw new LuckException("请输入正确格式的手机号!"); + } + if (StrUtil.isBlank(shopUserDTO.getValidCode())) { + throw new LuckException("请输入验证码"); + } + shopUserDTO.setShopId(AuthUserContext.get().getTenantId()); + checkCode(shopUserDTO); + shopUserService.saveAccount(shopUserDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新店铺用户信息", description = "更新店铺用户信息") + public ServerResponseEntity update(@Valid @RequestBody ShopUserDTO shopUserDTO) { + // 暂时的home账号id + Long home = 109707L; + if (Objects.equals(shopUserDTO.getShopUserId(), home) && BooleanUtil.isFalse(permission)) { + throw new LuckException("暂无权限修改该用户信息"); + } + ShopUserVO dbShopUser = shopUserService.getByUserId(shopUserDTO.getShopUserId()); + if (!Objects.equals(dbShopUser.getShopId(), AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + if (!PrincipalUtil.isDbPhone(shopUserDTO.getPhone(), dbShopUser.getPhone(), false)) { + throw new LuckException("请输入正确的手机号"); + } + if (shopUserDTO.getPhone().contains(Constant.ASTERISK)) { + shopUserDTO.setPhone(dbShopUser.getPhone()); + } + // 如果修改了手机号码,就需要校验验证码 + if (!StrUtil.equals(dbShopUser.getPhone(), shopUserDTO.getPhone())) { + if (StrUtil.isBlank(shopUserDTO.getValidCode())) { + throw new LuckException("修改了手机号,请输入验证码校验"); + } + checkCode(shopUserDTO); + } + shopUserDTO.setShopId(dbShopUser.getShopId()); + ServerResponseEntity authAccountEntity = accountFeignClient.getByUserIdAndType(dbShopUser.getShopUserId(), SysTypeEnum.MULTISHOP.value()); + if (!authAccountEntity.isSuccess()) { + throw new LuckException(authAccountEntity.getMsg()); + } + AuthAccountVO authAccountVO = authAccountEntity.getData(); + if (Objects.equals(authAccountVO.getIsAdmin(), 1) && !Objects.equals(dbShopUser.getShopUserId(), AuthUserContext.get().getUserId())) { + return ServerResponseEntity.showFailMsg("您没有权限修改管理员信息"); + } + shopUserService.updateAccount(shopUserDTO); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除店铺用户信息", description = "根据店铺用户id删除店铺用户信息") + public ServerResponseEntity delete(@RequestParam Long shopUserId) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + ShopUserVO dbShopUser = shopUserService.getByUserId(shopUserId); + if (!Objects.equals(dbShopUser.getShopId(), uidInfoBO.getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } else if (Objects.equals(uidInfoBO.getUserId(), shopUserId)) { + throw new LuckException("您正在使用当前账号,无法进行删除操作"); + } + shopUserService.deleteById(shopUserId); + return ServerResponseEntity.success(); + } + + @GetMapping("/verify_account") + @Operation(summary = "验证店铺账号", description = "根据用户id获取店铺用户信息") + public ServerResponseEntity verifyAccount(ShopUserDTO shopUserDTO) { + // 验证手机号/邮箱/用户名在数据库中是否已经存在 + return shopUserService.verifyShopUserAccount(shopUserDTO); + } + + /** + * 校验验证码 + * @param shopUserDTO + * @return + */ + private void checkCode(ShopUserDTO shopUserDTO) { + // 手机号验证码 + String phone = shopUserDTO.getPhone(); + if (StrUtil.isNotBlank(phone)) { + ServerResponseEntity sendNotifyResponse = notifyFeignClient.checkValidCode(phone, shopUserDTO.getValidCode(), SendTypeEnum.VALID); + Boolean data = sendNotifyResponse.getData(); + if (Objects.equals(sendNotifyResponse.getCode(), ResponseEnum.OK.value()) && Objects.nonNull(data) && !data) { + throw new LuckException("验证码有误或已过期!"); + } + } + //邮箱验证码 + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/CompanyAuditingController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/CompanyAuditingController.java new file mode 100644 index 0000000..2932e67 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/CompanyAuditingController.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.platform; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.dto.ShopCompanyAuditingDTO; +import com.tmerclub.cloud.multishop.service.CompanyAuditingService; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.vo.ShopCompanyAuditingVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author chiley + * @date 2022/9/14 14:32 + */ +@RestController("platformCompanyAuditingController") +@RequestMapping("/p/shop_company_auditing") +@Tag(name = "platform-审核店铺工商信息") +public class CompanyAuditingController { + + @Autowired + private CompanyAuditingService companyAuditingService; + @Autowired + private ShopAllinpayService shopAllinpayService; + + @GetMapping("/page") + @Operation(summary = "分页获取待审核的工商信息", description = "分页获取待审核的工商信息") + public ServerResponseEntity> getCompanyAuditingPage(PageDTO pageDTO, ShopCompanyAuditingDTO shopCompanyAuditingDTO) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + return ServerResponseEntity.success(companyAuditingService.page(pageDTO, shopCompanyAuditingDTO)); + + } + + @PutMapping("/audit") + @Operation(summary = "审核签约信息", description = "审核签约信息") + public ServerResponseEntity audit(@Valid @RequestBody ShopCompanyAuditingDTO shopCompanyAuditingDTO) { + if (shopAllinpayService.getIsAllinpay()) { + throw new LuckException("开启通联后,平台无需审核商家工商信息"); + } + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + shopCompanyAuditingDTO.setAuditorId(AuthUserContext.get().getUserId()); + companyAuditingService.audit(shopCompanyAuditingDTO); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopCompanyController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopCompanyController.java new file mode 100644 index 0000000..b299873 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopCompanyController.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.platform; + +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.common.constant.IdCardCollectProcessStatus; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.constant.AuditStatus; +import com.tmerclub.cloud.multishop.dto.ShopCompanyDTO; +import com.tmerclub.cloud.multishop.model.ShopCompany; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.service.ShopCompanyService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.vo.ShopCompanyVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 商家工商信息 + * + * @author lth + */ +@RestController("platformShopCompanyController") +@RequestMapping("/p/shop_company") +@Tag(name = "platform-商家工商信息") +public class ShopCompanyController { + + @Autowired + private ShopCompanyService shopCompanyService; + + + @Autowired + private ShopAllinpayService shopAllinpayService; + + @Autowired + private ShopDetailService shopDetailService; + + @GetMapping + @Operation(summary = "根据店铺id获取店铺工商信息", description = "根据店铺id获取店铺工商信息") + @Parameter(name = "status", description = "审核状态:1:已通过 0待审核 -1未通过") + public ServerResponseEntity getShopCompanyByShopId(@RequestParam("shopId") Long shopId, @RequestParam(value = "status", required = false, defaultValue = "1") Integer status) { + if (shopAllinpayService.getIsAllinpay()) { + // 影印件还没通过审核 + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + if (!Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + status = AuditStatus.WAITAUDIT.value(); + } + } + return ServerResponseEntity.success(shopCompanyService.getShopCompanyByShopIdAndStatus(shopId, status)); + } + + @PutMapping + @Operation(summary = "更新店铺工商信息", description = "更新店铺工商信息") + public ServerResponseEntity editShopCompany(@RequestBody @Valid ShopCompanyDTO shopCompanyDTO) { + boolean isAllinpay = shopAllinpayService.getIsAllinpay(); + if (Objects.isNull(shopCompanyDTO.getShopId())) { + throw new LuckException("店铺id不能为空"); + } + shopCompanyService.batchUpdateStatus(shopCompanyDTO.getShopId(), AuditStatus.FAILAUDIT.value(), null); + ShopCompany shopCompany = BeanUtil.map(shopCompanyDTO, ShopCompany.class); + shopCompany.setStatus(isAllinpay ? AuditStatus.WAITAUDIT.value() : AuditStatus.SUCCESSAUDIT.value()); + if (isAllinpay) { + shopCompanyService.platformUpdateShopCompany(shopCompany, shopCompany.getShopId()); + } else { + shopCompanyService.updateByShopId(shopCompany, shopCompany.getShopId(), 0); + } + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/supplier/ApplyShopUserController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/supplier/ApplyShopUserController.java new file mode 100644 index 0000000..2027b34 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/supplier/ApplyShopUserController.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.supplier; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.dto.SupplierUserDTO; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.service.SupplierUserService; +import com.tmerclub.cloud.supplier.vo.SupplierUserSimpleVO; +import com.tmerclub.cloud.supplier.vo.SupplierUserVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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.util.List; +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/5/12 20:27 + */ +@RequestMapping("/s/apply_shop/shop_user") +@RestController("supplierShopUserController") +@Tag(name = "supplier-店铺用户信息") +public class ApplyShopUserController { + + @Autowired + private SupplierDetailService supplierDetailService; + + @Autowired + private SupplierUserService supplierUserService; + + @GetMapping("/info") + @Operation(summary = "登陆店铺用户信息", description = "获取当前登陆店铺用户的用户信息") + public ServerResponseEntity info() { + UidInfoBO userInfoInTokenBO = AuthUserContext.get(); + SupplierUserSimpleVO shopUserSimple = new SupplierUserSimpleVO(); + shopUserSimple.setIsAdmin(userInfoInTokenBO.getIsAdmin()); + shopUserSimple.setIsPassShop(userInfoInTokenBO.getIsPassShop()); + shopUserSimple.setTenantId(userInfoInTokenBO.getTenantId()); + shopUserSimple.setUserId(userInfoInTokenBO.getUserId()); + shopUserSimple.setUserName(userInfoInTokenBO.getUsername()); + if (!Objects.equals(userInfoInTokenBO.getTenantId(), Constant.DEFAULT_SUPPLIER_ID)) { + SupplierApiDetailVO apiDetailVO = supplierDetailService.getBySupplierId(userInfoInTokenBO.getTenantId()); + shopUserSimple.setAvatar(apiDetailVO.getSupplierLogo()); + shopUserSimple.setSupplierName(apiDetailVO.getSupplierName()); + } + return ServerResponseEntity.success(shopUserSimple); + } + + @GetMapping("/list") + @Operation(summary = "获取店铺下的所有员工列表", description = "获取店铺下的所有员工列表") + public ServerResponseEntity> list() { + SupplierUserDTO supplierUserDTO = new SupplierUserDTO(); + supplierUserDTO.setSupplierId(AuthUserContext.get().getTenantId()); + List shopUserVOList = supplierUserService.listBySupplierId(supplierUserDTO); + return ServerResponseEntity.success(shopUserVOList); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/AllinpayRechargeDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/AllinpayRechargeDTO.java new file mode 100644 index 0000000..47f7d82 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/AllinpayRechargeDTO.java @@ -0,0 +1,43 @@ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class AllinpayRechargeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "充值订单号") + private String bizOrderNo; + + @Schema(description = "短信验证码") + private String verificationCode; + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + @Override + public String toString() { + return "AllinpayRechargeDTO{" + + "bizOrderNo='" + bizOrderNo + '\'' + + ", verificationCode='" + verificationCode + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/IndexImgDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/IndexImgDTO.java new file mode 100644 index 0000000..ba10805 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/IndexImgDTO.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 轮播图DTO + * + * @author YXF + * @date 2020-11-24 16:38:32 + */ +public class IndexImgDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键") + private Long imgId; + + @Schema(description = "店铺ID") + private Long shopId; + + @NotNull(message = "图片不能为空") + @Schema(description = "图片") + private String imgUrl; + + @Schema(description = "状态") + private Integer status; + + @NotNull(message = "序号不能为空") + @Schema(description = "顺序") + private Integer seq; + + @Schema(description = "关联商品id") + private Long spuId; + + @NotNull(message = "图片类型不能为空") + @Schema(description = "图片类型 0:小程序 1:pc") + private Integer imgType; + + public Long getImgId() { + return imgId; + } + + public void setImgId(Long imgId) { + this.imgId = imgId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getImgType() { + return imgType; + } + + public void setImgType(Integer imgType) { + this.imgType = imgType; + } + + @Override + public String toString() { + return "IndexImgDTO{" + + "imgId=" + imgId + + ",shopId=" + shopId + + ",imgUrl=" + imgUrl + + ",status=" + status + + ",seq=" + seq + + ",spuId=" + spuId + + ",imgType=" + imgType + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/NoticeDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/NoticeDTO.java new file mode 100644 index 0000000..d5814ac --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/NoticeDTO.java @@ -0,0 +1,258 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 公告DTO + * + * @author YXF + * @date 2020-11-25 17:57:56 + */ +public class NoticeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "公告id") + private Long id; + + @Schema(description = "店铺id") + private Long shopId; + + @NotNull(message = "标题不能为空") + @Schema(description = "公告标题") + private String title; + + @NotNull(message = "内容不能为空") + @Schema(description = "公告内容") + private String content; + + @Schema(description = "是否立即发送 1:立即发送 0:定时发送") + private Integer immediatelySend; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date sendTime; + + @Schema(description = "类型(1:在商家端展示 2:在用户端展示 3:在供应商端展示)") + private Integer type; + + @Schema(description = "类型不能为空(平台端同时创建多类型公告,用逗号隔开)(1:在商家端展示 2:在用户端展示 3:在供应商端展示)") + private String types; + + @Schema(description = "商家可见范围 (为空则全部可见)") + private String multiShopIds; + + @Schema(description = "用户可见范围 (为空则全部可见)") + private String userIds; + + @Schema(description = "供应商可见范围 (为空则全部可见)") + private String supplierIds; + + @Schema(description = "当前账号id(商家:租户id 用户:userId)") + private Long accountId; + + @NotNull(message = "状态不能为空") + @Schema(description = "状态(1:公布 0:撤回)") + private Integer status; + + @NotNull(message = "是否置顶不能为空") + @Schema(description = "是否置顶") + private Integer isTop; + + @Schema(description = "发布时间") + private Date publishTime; + + @Schema(description = "是否已读(1:已读 0:未读)") + private Integer isLearning; + + @Schema(description = "发布开始日期") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Schema(description = "发布结束日期") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getIsLearning() { + return isLearning; + } + + public void setIsLearning(Integer isLearning) { + this.isLearning = isLearning; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getTypes() { + return types; + } + + public void setTypes(String types) { + this.types = types; + } + + + public void setUserIds(String userIds) { + this.userIds = userIds; + } + + public void setSupplierIds(String supplierIds) { + this.supplierIds = supplierIds; + } + + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public Date getPublishTime() { + return publishTime; + } + + public void setPublishTime(Date publishTime) { + this.publishTime = publishTime; + } + + public Long getAccountId() { + return accountId; + } + + public void setAccountId(Long accountId) { + this.accountId = accountId; + } + + public Integer getImmediatelySend() { + return immediatelySend; + } + + public void setImmediatelySend(Integer immediatelySend) { + this.immediatelySend = immediatelySend; + } + + public Date getSendTime() { + return sendTime; + } + + public void setSendTime(Date sendTime) { + this.sendTime = sendTime; + } + + public String getMultiShopIds() { + return multiShopIds; + } + + public void setMultiShopIds(String multiShopIds) { + this.multiShopIds = multiShopIds; + } + + public String getUserIds() { + return userIds; + } + + public String getSupplierIds() { + return supplierIds; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "NoticeDTO{" + + "id=" + id + + ", shopId=" + shopId + + ", title='" + title + '\'' + + ", content='" + content + '\'' + + ", immediatelySend=" + immediatelySend + + ", sendTime=" + sendTime + + ", type=" + type + + ", types='" + types + '\'' + + ", multiShopIds='" + multiShopIds + '\'' + + ", userIds='" + userIds + '\'' + + ", supplierIds='" + supplierIds + '\'' + + ", accountId=" + accountId + + ", status=" + status + + ", isTop=" + isTop + + ", publishTime=" + publishTime + + ", isLearning=" + isLearning + + ", startTime=" + startTime + + ", endTime=" + endTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopAuditingDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopAuditingDTO.java new file mode 100644 index 0000000..f2d9f60 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopAuditingDTO.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商家审核信息DTO + * + * @author YXF + * @date 2021-02-01 17:10:35 + */ +public class ShopAuditingDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺审核id") + private Long shopAuditingId; + + @Schema(description = "申请人id") + private Long userId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "审核人id") + private Long auditorId; + + @Schema(description = "店铺类型1自营店 2普通店") + private Integer shopType; + + @Schema(description = "0 未审核 1已通过 -1未通过 2平台下线 3 平台下线待审核") + private Integer status; + + @Schema(description = "备注") + private String remarks; + + @Schema(description = "签约起始时间") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public Integer getShopType() { + return shopType; + } + + public void setShopType(Integer shopType) { + this.shopType = shopType; + } + + public Long getShopAuditingId() { + return shopAuditingId; + } + + public void setShopAuditingId(Long shopAuditingId) { + this.shopAuditingId = shopAuditingId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "ShopAuditingDTO{" + + "shopAuditingId=" + shopAuditingId + + ", userId=" + userId + + ", shopId=" + shopId + + ", auditorId=" + auditorId + + ", shopType=" + shopType + + ", status=" + status + + ", remarks='" + remarks + '\'' + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopCompanyDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopCompanyDTO.java new file mode 100644 index 0000000..b1a8d7a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopCompanyDTO.java @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 店铺工商信息DTO + * + * @author lth + */ +public class ShopCompanyDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "统一社会信用代码") + @NotBlank(message = "统一社会信用代码不能为空") + private String creditCode; + + @Schema(description = "企业名称") + @NotBlank(message = "企业名称不能为空") + @Length(max = 50, message = "企业名称字符长度不能超过50") + private String firmName; + + @Schema(description = "住所") + @Length(max = 50, message = "住所字符长度不能超过50") + private String residence; + + @Schema(description = "法定代表人") + @Length(max = 20, message = "法定代表人字符长度不能超过20") + private String representative; + + @Schema(description = "法人身份证号") + private String legalIds; + + @Schema(description = "法人手机号码") + private String legalPhone; + + @Schema(description = "注册资本(万元)") + private Double capital; + + @Schema(description = "成立日期") + private Date foundTime; + + @Schema(description = "营业起始日期") + @NotNull(message = "营业起始日期不能为空") + private Date startTime; + + @Schema(description = "营业终止时间") + private Date endTime; + + @Schema(description = "经营范围") + @NotBlank(message = "经营范围不能为空") + @Length(max = 500, message = "经营范围字符长度不能超过500") + private String businessScope; + + @Schema(description = "营业执照") + @NotBlank(message = "营业执照不能为空") + private String businessLicense; + + @Schema(description = "身份证正面") + private String identityCardFront; + + @Schema(description = "身份证反面") + private String identityCardLater; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getCreditCode() { + return creditCode; + } + + public void setCreditCode(String creditCode) { + this.creditCode = creditCode; + } + + public String getFirmName() { + return firmName; + } + + public void setFirmName(String firmName) { + this.firmName = firmName; + } + + public String getResidence() { + return residence; + } + + public void setResidence(String residence) { + this.residence = residence; + } + + public String getRepresentative() { + return representative; + } + + public void setRepresentative(String representative) { + this.representative = representative; + } + + public String getLegalIds() { + return legalIds; + } + + public void setLegalIds(String legalIds) { + this.legalIds = legalIds; + } + + public String getLegalPhone() { + return legalPhone; + } + + public void setLegalPhone(String legalPhone) { + this.legalPhone = legalPhone; + } + + public Double getCapital() { + return capital; + } + + public void setCapital(Double capital) { + this.capital = capital; + } + + public Date getFoundTime() { + return foundTime; + } + + public void setFoundTime(Date foundTime) { + this.foundTime = foundTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getBusinessScope() { + return businessScope; + } + + public void setBusinessScope(String businessScope) { + this.businessScope = businessScope; + } + + public String getBusinessLicense() { + return businessLicense; + } + + public void setBusinessLicense(String businessLicense) { + this.businessLicense = businessLicense; + } + + public String getIdentityCardFront() { + return identityCardFront; + } + + public void setIdentityCardFront(String identityCardFront) { + this.identityCardFront = identityCardFront; + } + + public String getIdentityCardLater() { + return identityCardLater; + } + + public void setIdentityCardLater(String identityCardLater) { + this.identityCardLater = identityCardLater; + } + + @Override + public String toString() { + return "ShopCompanyDTO{" + + "shopId=" + shopId + + ", creditCode='" + creditCode + '\'' + + ", firmName='" + firmName + '\'' + + ", residence='" + residence + '\'' + + ", representative='" + representative + '\'' + + ", legalIds='" + legalIds + '\'' + + ", legalPhone='" + legalPhone + '\'' + + ", capital=" + capital + + ", foundTime=" + foundTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", businessScope='" + businessScope + '\'' + + ", businessLicense='" + businessLicense + '\'' + + ", identityCardFront='" + identityCardFront + '\'' + + ", identityCardLater='" + identityCardLater + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopDetailDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopDetailDTO.java new file mode 100644 index 0000000..b5558fe --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopDetailDTO.java @@ -0,0 +1,314 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.*; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 店铺详情DTO + * + * @author FrozenWatermelon + * @date 2020-12-05 15:50:25 + */ +public class ShopDetailDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺类型1自营店 2普通店") + @Max(value = 2, message = "只能为1或2") + @Min(value = 1, message = "只能为1或2") + private Integer type; + + @Schema(description = "商家名称") + @NotBlank(message = "商家名称不能为空") + @Length(min = 2, max = 10, message = "商家名称需要在2到10个字符之间") + private String merchantName; + + @Schema(description = "店铺名称") + @NotBlank(message = "店铺名称不能为空") + @Length(min = 2, max = 20, message = "店铺名称需要在2到20个字符之间") + private String shopName; + + @Schema(description = "联系人姓名") + @NotBlank(message = "联系人不能为空") + @Length(min = 2, max = 10, message = "联系人姓名需要在2到10个字符之间") + private String contactName; + + @Schema(description = "联系方式") + @NotBlank(message = "联系方式不能为空") + private String contactPhone; + + @Schema(description = "店铺简介") + @Length(max = 200, message = "店铺简介字符不能超过200") + private String intro; + + @Schema(description = "接收短信号码") + private String noticeMobile; + + @Schema(description = "店铺logo(可修改)") + private String shopLogo; + + @Schema(description = "店铺状态(-1:已删除 0: 停业中 1:营业中 2:平台下线 3:开店申请待审核 4:店铺申请中 5:上线申请待审核 6.审核失败(通联))") + private Integer shopStatus; + + @Schema(description = "备注信息") + private String remarks; + + @Schema(description = "是否优选好店 1.是 0.不是") + @Max(value = 1, message = "只能为0或1") + @Min(value = 0, message = "只能为0或1") + private Integer isPreferred; + + @Schema(description = "账号名", requiredMode = Schema.RequiredMode.REQUIRED) + private String username; + + @Size(max = 64) + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED) + private String password; + + @Size(max = 15) + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED) + private String phone; + + @Schema(description = "验证码", requiredMode = Schema.RequiredMode.REQUIRED) + private String code; + + @Schema(description = "移动端背景图") + private String mobileBackgroundPic; + + @Schema(description = "pc背景图") + private String pcBackgroundPic; + + @Schema(description = "店铺中的商品数量") + @Max(value = 5, message = "最多只能返回5个商品") + @Min(value = 0, message = "spuNum不能小于0") + private Integer spuNum; + + @Schema(description = "签约起始时间") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + @Schema(description = "支付系统类型") + private Integer paySysType; + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + public String getMobileBackgroundPic() { + return mobileBackgroundPic; + } + + public void setMobileBackgroundPic(String mobileBackgroundPic) { + this.mobileBackgroundPic = mobileBackgroundPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + public Integer getIsPreferred() { + return isPreferred; + } + + public void setIsPreferred(Integer isPreferred) { + this.isPreferred = isPreferred; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public String getNoticeMobile() { + return noticeMobile; + } + + public void setNoticeMobile(String noticeMobile) { + this.noticeMobile = noticeMobile; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Integer getSpuNum() { + return spuNum; + } + + public void setSpuNum(Integer spuNum) { + this.spuNum = spuNum; + } + + public String getMerchantName() { + return merchantName; + } + + public void setMerchantName(String merchantName) { + this.merchantName = merchantName; + } + + public String getContactName() { + return contactName; + } + + public void setContactName(String contactName) { + this.contactName = contactName; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "ShopDetailDTO{" + + "shopId=" + shopId + + ", type=" + type + + ", merchantName='" + merchantName + '\'' + + ", shopName='" + shopName + '\'' + + ", contactName='" + contactName + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", intro='" + intro + '\'' + + ", noticeMobile='" + noticeMobile + '\'' + + ", shopLogo='" + shopLogo + '\'' + + ", remarks='" + remarks + '\'' + + ", shopStatus=" + shopStatus + + ", isPreferred=" + isPreferred + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", phone='" + phone + '\'' + + ", code='" + code + '\'' + + ", mobileBackgroundPic='" + mobileBackgroundPic + '\'' + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", spuNum=" + spuNum + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + ", paySysType=" + paySysType + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopRechargeInfoDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopRechargeInfoDTO.java new file mode 100644 index 0000000..8dd7071 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopRechargeInfoDTO.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author TRACK + */ +public class ShopRechargeInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "充值金额") + private BigDecimal rechargeAmount; + + @Schema(description = "支付后,跳转的前台页面") + private String returnUrl; + + public BigDecimal getRechargeAmount() { + return rechargeAmount; + } + + public void setRechargeAmount(BigDecimal rechargeAmount) { + this.rechargeAmount = rechargeAmount; + } + + public String getReturnUrl() { + return returnUrl; + } + + public void setReturnUrl(String returnUrl) { + this.returnUrl = returnUrl; + } + + @Override + public String toString() { + return "ShopRechargeInfoDTO{" + + "rechargeAmount=" + rechargeAmount + + ", returnUrl='" + returnUrl + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopSigningInfoDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopSigningInfoDTO.java new file mode 100644 index 0000000..d01c08f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopSigningInfoDTO.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @Author lth + * @Date 2021/7/16 8:43 + */ +public class ShopSigningInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "签约起始时间") + @NotNull(message = "签约起始时间不能为空") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + @Schema(description = "店铺类型 1自营店 2普通店") + @Max(value = 2, message = "只能为1或2") + @Min(value = 1, message = "只能为1或2") + private Integer type; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "ShopSigningInfoDTO{" + + "shopId=" + shopId + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + ", shopType=" + type + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopUserDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopUserDTO.java new file mode 100644 index 0000000..b52c4db --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopUserDTO.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/9/8 + */ +public class ShopUserDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺用户id") + private Long shopUserId; + + @Schema(description = "店铺id") + private Long shopId; + + @NotBlank(message = "昵称不能为空") + @Schema(description = "昵称") + private String nickName; + + @Schema(description = "员工编号") + private String code; + + @Schema(description = "联系方式") + private String phoneNum; + + @Schema(description = "角色id列表") + private List roleIds; + + @NotBlank(message = "用户名不能为空") + @Schema(description = "用户名") + private String username; + + @Schema(description = "密码") + private String password; + + @NotNull(message = "状态不能为空") + @Schema(description = "状态 1启用 0禁用") + private Integer status; + + @Schema(description = "邮箱") + private String email; + + @NotBlank(message = "手机号不能为空") + @Schema(description = "手机号") + private String phone; + + @Schema(description = "验证码") + private String validCode; + + public Long getShopUserId() { + return shopUserId; + } + + public void setShopUserId(Long shopUserId) { + this.shopUserId = shopUserId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPhoneNum() { + return phoneNum; + } + + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } + + public List getRoleIds() { + return roleIds; + } + + public void setRoleIds(List roleIds) { + this.roleIds = roleIds; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getValidCode() { + return validCode; + } + + public void setValidCode(String validCode) { + this.validCode = validCode; + } + + @Override + public String toString() { + return "ShopUserDTO{" + + "shopUserId=" + shopUserId + + ", shopId=" + shopId + + ", nickName='" + nickName + '\'' + + ", code='" + code + '\'' + + ", phoneNum='" + phoneNum + '\'' + + ", roleIds=" + roleIds + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", status=" + status + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + ", validCode='" + validCode + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopUserRegisterDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopUserRegisterDTO.java new file mode 100644 index 0000000..3725ca1 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopUserRegisterDTO.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lth + */ +@Schema(description = "商家注册信息") +public class ShopUserRegisterDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "密码") + @NotBlank(message = "密码不能为空") + private String password; + + @Schema(description = "手机号") + @NotBlank(message = "手机号不能为空") + private String mobile; + + @Schema(description = "用户名") + @NotBlank(message = "用户名不能为空") + private String username; + + @Schema(description = "验证码") + @NotBlank(message = "验证码不能为空") + private String validCode; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getValidCode() { + return validCode; + } + + public void setValidCode(String validCode) { + this.validCode = validCode; + } + + @Override + public String toString() { + return "ShopUserRegisterDTO{" + + "password='" + password + '\'' + + ", mobile='" + mobile + '\'' + + ", userName='" + username + '\'' + + ", validCode='" + validCode + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWalletDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWalletDTO.java new file mode 100644 index 0000000..6d40d49 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWalletDTO.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商家钱包信息DTO + * + * @author lhd + * @date 2021-01-04 13:55:51 + */ +public class ShopWalletDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺钱包id") + private Long shopWalletId; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "未结算金额(用户支付)") + private Long unsettledAmount; + + @Schema(description = "已结算金额(用户确认收货后,可以提现)") + private Long settledAmount; + + @Schema(description = "冻结金额(用户确认收货)") + private Long freezeAmount; + + @Schema(description = "累积结算金额") + private Long totalSettledAmount; + + @Schema(description = "可用短信数量") + private Integer smsNum; + + @Schema(description = "乐观锁") + private Long version; + + public Long getShopWalletId() { + return shopWalletId; + } + + public void setShopWalletId(Long shopWalletId) { + this.shopWalletId = shopWalletId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getFreezeAmount() { + return freezeAmount; + } + + public void setFreezeAmount(Long freezeAmount) { + this.freezeAmount = freezeAmount; + } + + public Long getTotalSettledAmount() { + return totalSettledAmount; + } + + public void setTotalSettledAmount(Long totalSettledAmount) { + this.totalSettledAmount = totalSettledAmount; + } + + public Integer getSmsNum() { + return smsNum; + } + + public void setSmsNum(Integer smsNum) { + this.smsNum = smsNum; + } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } + + @Override + public String toString() { + return "ShopWalletVO{" + + "shopWalletId=" + shopWalletId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",shopId=" + shopId + + ",unsettledAmount=" + unsettledAmount + + ",settledAmount=" + settledAmount + + ",freezeAmount=" + freezeAmount + + ",totalSettledAmount=" + totalSettledAmount + + ",smsNum=" + smsNum + + ",version=" + version + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/UsernameAndPasswordDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/UsernameAndPasswordDTO.java new file mode 100644 index 0000000..108193e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/UsernameAndPasswordDTO.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lhd + * @date 2020/12/30 + */ +@Schema(description = "用户名和密码参数") +public class UsernameAndPasswordDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotBlank(message = "用户名不能为空") + @Size(max = 30) + @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED) + private String username; + + + @Size(max = 30) + @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED) + private String email; + + @Size(max = 15) + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED) + private String phone; + + @NotBlank(message = "密码不能为空") + @Size(max = 64) + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED) + private String password; + + @NotBlank(message = "验证码不能为空") + @Size(max = 50) + @Schema(description = "验证码", requiredMode = Schema.RequiredMode.REQUIRED) + private String code; + + @Schema(description = "店铺id") + private Long shopId; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "UsernameAndPasswordDTO{" + + "username='" + username + '\'' + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + ", password='" + password + '\'' + + ", code='" + code + '\'' + + ", shopId='" + shopId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/IndexImgFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/IndexImgFeignController.java new file mode 100644 index 0000000..c52c32c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/IndexImgFeignController.java @@ -0,0 +1,22 @@ +package com.tmerclub.cloud.multishop.feign; + +import com.tmerclub.cloud.api.multishop.feign.IndexImgFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.multishop.service.IndexImgService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author + */ +@DubboService +public class IndexImgFeignController implements IndexImgFeignClient { + @Autowired + private IndexImgService indexImgService; + + @Override + public void udpateIndexImgBySpuId(Long spuId, Long shopId) { + indexImgService.batchUpdate(spuId, shopId); + indexImgService.batchUpdate(spuId, Constant.PLATFORM_SHOP_ID); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopDetailFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopDetailFeignController.java new file mode 100644 index 0000000..d891799 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopDetailFeignController.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.feign; + +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.bo.ShopSimpleBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.multishop.vo.ShopUserVO; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.mapper.ShopDetailMapper; +import com.tmerclub.cloud.multishop.model.ShopDetail; +import com.tmerclub.cloud.multishop.service.CompanyAuditingService; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.service.ShopUserService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +@DubboService +public class ShopDetailFeignController implements ShopDetailFeignClient { + @Autowired + private ShopDetailService shopDetailService; + @Autowired + private ShopUserService shopUserService; + @Autowired + private ShopDetailMapper shopDetailMapper; + @Autowired + private ShopAllinpayService shopAllinpayService; + @Autowired + private CompanyAuditingService companyAuditingService; + + @Override + public ServerResponseEntity getShopByShopId(Long shopId) { + if (Objects.isNull(shopId)) { + return ServerResponseEntity.success(new EsShopDetailBO()); + } + ShopDetailVO shopDetail = shopDetailService.getByShopId(shopId); + if (Objects.isNull(shopDetail)) { + return ServerResponseEntity.success(new EsShopDetailBO()); + } + return ServerResponseEntity.success(BeanUtil.map(shopDetail, EsShopDetailBO.class)); + } + + @Override + public ServerResponseEntity getShopDetailByShopId(Long shopId) { + ShopDetailVO shopDetail = shopDetailService.getByShopId(shopId); + if (Objects.isNull(shopDetail)) { + return ServerResponseEntity.success(new ShopDetailVO()); + } + return ServerResponseEntity.success(shopDetail); + } + + + @Override + public ServerResponseEntity> listByShopIds(List shopIds) { + List shopDetail = shopDetailService.listByShopIds(shopIds); + return ServerResponseEntity.success(BeanUtil.mapAsList(shopDetail, ShopDetailVO.class)); + } + + @Override + public ServerResponseEntity shopExtensionData(Long shopId) { + return ServerResponseEntity.success(shopDetailService.shopExtensionData(shopId)); + } + + @Override + public ServerResponseEntity> getShopDetailByShopIdAndShopName(String shopName) { + return ServerResponseEntity.success(shopDetailService.getShopDetailByShopIdsShopName(null, shopName)); + } + + @Override + public ServerResponseEntity> listSimple(ShopSimpleBO shopSimpleBO) { + return ServerResponseEntity.success(shopDetailService.listSimple(shopSimpleBO)); + } + + @Override + public ServerResponseEntity getShopUserByShopUserId(Long shopUserId) { + return ServerResponseEntity.success(BeanUtil.map(shopUserService.getSimpleByUserId(shopUserId), ShopUserVO.class)); + } + + @Override + public ServerResponseEntity> getShopIdsByShopStatus(Integer shopStatus) { + return ServerResponseEntity.success(shopDetailService.getShopIdByShopStatus(shopStatus)); + } + + @Override + public ServerResponseEntity> getShopIdsByLikeShopName(String shopName) { + return ServerResponseEntity.success(shopDetailService.getShopIdsLikeName(shopName.trim())); + } + + @Override + public ServerResponseEntity updateAllinpayIdCardStatus(String bizUserId, Integer status) { + shopDetailService.updateAllinpayIdCardStatus(bizUserId, status); + shopDetailService.removeCacheByShopId(Long.valueOf(bizUserId.substring(AllinpayConstant.SHOP_LENGTH))); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity updateAllinpayBindPhoneStatus(String bizUserId, Integer status) { + shopDetailMapper.updateShopBindPhone(Long.valueOf(bizUserId.substring(AllinpayConstant.SHOP_LENGTH)), status); + shopDetailService.removeCacheByShopId(Long.valueOf(bizUserId.substring(AllinpayConstant.SHOP_LENGTH))); + return ServerResponseEntity.success(); + } + + @Override + public void deleteAllinpayCache() { + shopAllinpayService.deleteAllinpayCache(); + } + + @Override + public ServerResponseEntity updateCompanyInfoResult(String bizUserId, Integer status, Integer result, String failReason) { + companyAuditingService.updateCompanyInfoResult(bizUserId, status, result, failReason); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity updateAcctProtocolNoByType(Long shopId, Integer signAcctType, String acctProtocolNo) { + shopDetailMapper.updateAcctProtocolNoByType(shopId, signAcctType, acctProtocolNo); + shopDetailService.removeCacheByShopId(shopId); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> listShopIds() { + return ServerResponseEntity.success(shopDetailService.listShopIds()); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopRefundAddrController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopRefundAddrController.java new file mode 100644 index 0000000..8aafc90 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopRefundAddrController.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.feign; + +import com.tmerclub.cloud.api.multishop.feign.ShopRefundAddrFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopRefundAddrVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.service.ShopRefundAddrService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +@DubboService +public class ShopRefundAddrController implements ShopRefundAddrFeignClient { + + @Autowired + private ShopRefundAddrService shopRefundAddrService; + + @Override + public ServerResponseEntity getShopRefundAddrByRefundAddrId(Long refundAddrId) { + Long shopId = AuthUserContext.get().getTenantId(); + ShopRefundAddrVO shopRefundAddr = shopRefundAddrService.getByShopRefundAddrId(refundAddrId, shopId); + return ServerResponseEntity.success(shopRefundAddr); + } + + @Override + public ServerResponseEntity> listByShopId(Long shopId) { + List list = shopRefundAddrService.listByShopId(shopId); + return ServerResponseEntity.success(list); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopSubstituteSalesFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopSubstituteSalesFeignController.java new file mode 100644 index 0000000..527d078 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopSubstituteSalesFeignController.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.feign; + +import com.tmerclub.cloud.api.multishop.feign.ShopSubstituteSalesFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.product.constant.SalesType; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.multishop.mapper.ShopSubstituteSalesMapper; +import com.tmerclub.cloud.multishop.model.ShopSubstituteSales; +import com.tmerclub.cloud.multishop.service.ShopSubstituteSalesService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author xxw + * @date 2022/6/24 15:38 + */ +@DubboService +public class ShopSubstituteSalesFeignController implements ShopSubstituteSalesFeignClient { + @Autowired + private ShopSubstituteSalesMapper shopSubstituteSalesMapper; + + @Autowired + private ShopSubstituteSalesService shopSubstituteSalesService; + + @Override + public ServerResponseEntity getByShopSubstituteSalesId(Long shopId) { + ShopSubstituteSalesVO byShopSubstituteSalesId = shopSubstituteSalesService.getByShopSubstituteSalesId(shopId); + return ServerResponseEntity.success(byShopSubstituteSalesId); + } + + @Override + public ServerResponseEntity> shopSubstituteSalesList(List shopIdList) { + List shopSubstituteSalesList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.isNull(shopIdList) || shopIdList.size() == 0) { + return ServerResponseEntity.success(shopSubstituteSalesList); + } + shopSubstituteSalesList = shopSubstituteSalesMapper.listByShopIds(shopIdList); + return ServerResponseEntity.success(shopSubstituteSalesList); + } + + @Override + public void saveDefault(Long shopId) { + // 保存店铺代销设置默认值 + ShopSubstituteSales shopSubstituteSales = new ShopSubstituteSales(); + shopSubstituteSales.setShopId(shopId); + shopSubstituteSales.setSalesType(SalesType.MANUAL_OPERATION_PRICE.value()); + shopSubstituteSales.setOrderShape(0); + shopSubstituteSalesService.save(shopSubstituteSales); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopWalletLogFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopWalletLogFeignController.java new file mode 100644 index 0000000..cdd8a52 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopWalletLogFeignController.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.feign; + +import com.tmerclub.cloud.api.multishop.feign.ShopWalletLogFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.constant.ShopWalletChangeReason; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.multishop.service.ShopWalletLogService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Objects; + +/** + * @author chiley + * @date 2022/6/30 16:55 + */ +@DubboService +public class ShopWalletLogFeignController implements ShopWalletLogFeignClient { + + @Autowired + private ShopWalletLogService shopWalletLogService; + + + @Override + public ServerResponseEntity getPayAmount(Long shopWalletLogId) { + MongoShopWalletLogBO shopWalletLog = shopWalletLogService.getByWalletLogId(shopWalletLogId); + return ServerResponseEntity.success(shopWalletLog.getShopChangeAmount()); + } + + @Override + public ServerResponseEntity getIsPay(Long shopWalletLogId) { + MongoShopWalletLogBO shopWalletLog = shopWalletLogService.getByWalletLogId(shopWalletLogId); + return ServerResponseEntity.success(Objects.equals(ShopWalletChangeReason.SUCCESS_RECHARGE.value(), shopWalletLog.getReason()) ? 1 : 0); + } + + @Override + public ServerResponseEntity getShopBalancePayIsPay(Long orderId) { + List mongoShopWalletLogList = shopWalletLogService.listByOrderIdAndReason(orderId, ShopWalletChangeReason.PURCHASE_SPREAD_AMOUNT.value()); + return ServerResponseEntity.success(CollectionUtils.isNotEmpty(mongoShopWalletLogList) ? 1 : 0); + } + + @Override + public ServerResponseEntity getRefundShopBalancePayIsPay(Long orderId) { + List mongoShopWalletLogList = shopWalletLogService.listByOrderIdAndReason(orderId, ShopWalletChangeReason.REFUND_SPREAD_AMOUNT.value()); + return ServerResponseEntity.success(CollectionUtils.isNotEmpty(mongoShopWalletLogList) ? 1 : 0); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/WalletLogOperationFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/WalletLogOperationFeignController.java new file mode 100644 index 0000000..82adc87 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/WalletLogOperationFeignController.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.feign; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.multishop.feign.WalletLogOperationFeignClient; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.vo.OrderSimpleAmountInfoBO; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.multishop.service.ShopSubstituteSalesService; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +import com.tmerclub.cloud.multishop.service.WalletLogOperationService; +import com.tmerclub.cloud.multishop.vo.ShopWalletVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author chiley + * @date 2022/6/30 16:55 + */ +@DubboService +public class WalletLogOperationFeignController implements WalletLogOperationFeignClient { + private static final Logger LOGGER = LoggerFactory.getLogger(WalletLogOperationFeignController.class); + + @Autowired + private MongoTemplate mongoTemplate; + @DubboReference + private OrderFeignClient orderFeignClient; + @Autowired + private WalletLogOperationService walletLogOperationService; + @Autowired + private ShopWalletService shopWalletService; + @Autowired + private ShopSubstituteSalesService shopSubstituteSalesService; + + @Override + public void addSupplierLog(String st) { + List orderBOList = JSON.parseArray(st, EsOrderBO.class); + Set shopIds = orderBOList.stream().map(EsOrderBO::getShopId).collect(Collectors.toSet()); + // 根据shopIds获取商家的代销配置 + List shopSubstituteSalesList = shopSubstituteSalesService.listByShopIds(new ArrayList<>(shopIds)); + Map salesMap = shopSubstituteSalesList.stream().collect(Collectors.toMap(ShopSubstituteSalesVO::getShopId, ShopSubstituteSalesVO::getOrderShape)); + + for (EsOrderBO esOrderBO : orderBOList) { + try { + PayNotifyBO message = new PayNotifyBO(); + message.setOrderIds(Collections.singletonList(esOrderBO.getOrderId())); + // 添加未结算记录 + // 采购订单不分账 + if (Objects.equals(message.getPurchaseOrder(), Boolean.TRUE)) { + continue; + } + // 定金预售订单付定金时不用全部分账 + boolean isPreSale = Objects.nonNull(message.getPreSaleType()) && Objects.equals(message.getPreSaleType(), PreSaleType.DEPOSIT.value()) + && Objects.equals(message.getOrderStatus(), OrderStatus.UNPAY.value()); + if (isPreSale) { + continue; + } + + ServerResponseEntity> ordersShopWalletInfoResponse = orderFeignClient.getOrdersSimpleAmountInfo(message.getOrderIds()); + if (!ordersShopWalletInfoResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + List orderShopWalletInfos = ordersShopWalletInfoResponse.getData(); + // 获取店铺已结算金额map + List shopWalletList = shopWalletService.listByShopIds(new ArrayList<>(shopIds), esOrderBO.getPaySysType()); + Map settledAmountMap = shopWalletList.stream().collect(Collectors.toMap(ShopWalletVO::getShopId, ShopWalletVO::getSettledAmount)); + // 筛选掉需要采购和采购完成的 + orderShopWalletInfos = orderShopWalletInfos.stream().filter(orderSimpleAmountInfoBO -> Objects.equals(orderSimpleAmountInfoBO.getWaitPurchase(), 0)).collect(Collectors.toList()); + message.setAgreePurchase(1); + walletLogOperationService.addAmountByOrder(orderShopWalletInfos, message, settledAmountMap, salesMap); + + + // ============================================已结算记录============================================ + + if (Objects.equals(esOrderBO.getIsSettled(), 1)) { + walletLogOperationService.addAmountBySettledOrder(esOrderBO.getOrderId()); + } + } catch (Exception e) { + LOGGER.error("异常", e); + } + + } + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OpenAllinpayShopConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OpenAllinpayShopConsumer.java new file mode 100644 index 0000000..cd7fbfe --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OpenAllinpayShopConsumer.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author TRACK + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.OPEN_ALLINPAY_TOPIC,consumerGroup = RocketMqConstant.OPEN_ALLINPAY_SHOP_TOPIC) +public class OpenAllinpayShopConsumer implements RocketMQListener { + private static final Logger LOGGER = LoggerFactory.getLogger(OpenAllinpayShopConsumer.class); + @Autowired + private ShopDetailService shopDetailService; + + /** + * 开启通联,店铺批量创建会员 + */ + @Override + public void onMessage(Integer paySysType) { + LOGGER.info("店铺开始批量创建会员"); + shopDetailService.createAllinpayMember(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderPreSaleSettlementShopConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderPreSaleSettlementShopConsumer.java new file mode 100644 index 0000000..641b14e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderPreSaleSettlementShopConsumer.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.listener; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author lhd + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_PRE_SALE_FAIL_SETTLEMENT_TOPIC, consumerGroup = RocketMqConstant.ORDER_PRE_SALE_FAIL_SETTLEMENT_TOPIC) +public class OrderPreSaleSettlementShopConsumer implements RocketMQListener { + + @Autowired + private ShopWalletService shopWalletService; + + /** + * 订单超时未支付尾款 商家结算操作 + */ + @Override + public void onMessage(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + shopWalletService.settlementShopAmountByPreSaleFail(orderChangeShopWalletAmountBO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderReceiptShopByAllinpayConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderReceiptShopByAllinpayConsumer.java new file mode 100644 index 0000000..e07f67f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderReceiptShopByAllinpayConsumer.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.listener; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_SETTLED_SHOP_BY_ALLINPAY_TOPIC, consumerGroup = RocketMqConstant.ORDER_SETTLED_SHOP_BY_ALLINPAY_TOPIC) +public class OrderReceiptShopByAllinpayConsumer implements RocketMQListener> { + + @Autowired + private ShopWalletService shopWalletService; + + /** + * 结束周期完成,结算给商家(通联分账) + */ + @Override + public void onMessage(List changeShopWalletAmountList) { + for (OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO : changeShopWalletAmountList) { + // 如果是待采购,则使用待采购金额计算 + if (Objects.equals(orderChangeShopWalletAmountBO.getWaitPurchase(), 1)) { + shopWalletService.settlementByRefundAndWaitPurAndAllinpay(orderChangeShopWalletAmountBO); + } else { + shopWalletService.addAmountSettlementOrderByAllinPay(orderChangeShopWalletAmountBO); + } + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/RechargeNotifyConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/RechargeNotifyConsumer.java new file mode 100644 index 0000000..3a0ddc5 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/RechargeNotifyConsumer.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.listener; + +import com.tmerclub.cloud.api.user.bo.RechargeNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 余额充值回调 + * + * @author chiley + * @date 2022/07/01 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SHOP_RECHARGE_NOTIFY_TOPIC, consumerGroup = RocketMqConstant.SHOP_RECHARGE_NOTIFY_TOPIC) +public class RechargeNotifyConsumer implements RocketMQListener { + + @Autowired + private ShopWalletService shopWalletService; + + private static final Logger LOG = LoggerFactory.getLogger(RechargeNotifyConsumer.class); + + @Override + public void onMessage(RechargeNotifyBO message) { + LOG.info("商家余额充值回调开始... message: {}", Json.toJsonString(message)); + shopWalletService.rechargeSuccess(message); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/CompanyAuditingMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/CompanyAuditingMapper.java new file mode 100644 index 0000000..9234aab --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/CompanyAuditingMapper.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.multishop.dto.ShopCompanyAuditingDTO; +import com.tmerclub.cloud.multishop.model.ShopCompanyAuditing; +import com.tmerclub.cloud.multishop.vo.ShopCompanyAuditingVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author chiley + * @date 2022/9/13 14:42 + */ + +public interface CompanyAuditingMapper { + + /** + * 根据信息id获取店铺工商审核信息 + * + * @param shopCompanyAuditingId 店铺工商审核信息id + * @return 店铺工商审核信息 + */ + ShopCompanyAuditing getById(@Param("shopCompanyAuditingId") Long shopCompanyAuditingId); + + /** + * 新增店铺工商审核信息 + * @param shopCompanyAuditing 店铺工商审核信息 + * @return companyAuditingId + */ + Long insert(@Param("shopCompanyAuditing") ShopCompanyAuditing shopCompanyAuditing); + + /** + * 更新店铺工商审核信息 + * @param shopCompanyAuditing 店铺工商审核信息 + */ + void update(@Param("shopCompanyAuditing") ShopCompanyAuditing shopCompanyAuditing); + + /** + * 根据店铺工商信息id删除店铺工商信息 + * @param shopCompanyAuditingId + */ + void deleteById(@Param("shopCompanyAuditingId") Long shopCompanyAuditingId); + + /** + * 根据店铺id获取最近一条工商审核信息 + * @param shopId + * @return + */ + ShopCompanyAuditingVO getLatestAuditingByShopId(@Param("shopId") Long shopId); + + /** + * 获取待审核的工商信息审核列表 + * + * @param shopCompanyAuditingDTO 搜索参数 + * @return 工商信息审核列表 + */ + List list(@Param("shopCompanyAuditingDTO") ShopCompanyAuditingDTO shopCompanyAuditingDTO); + + /** + * 获取需要审核驳回的工商申请 + * @return + */ + List getNeedAuditList(); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/HotSearchMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/HotSearchMapper.java new file mode 100644 index 0000000..0ea3c2e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/HotSearchMapper.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.multishop.dto.HotSearchDTO; +import com.tmerclub.cloud.multishop.model.HotSearch; +import com.tmerclub.cloud.multishop.vo.HotSearchVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 热搜 + * + * @author YXF + * @date 2021-01-27 09:10:00 + */ +public interface HotSearchMapper { + + /** + * 获取热搜列表 + * + * @param hotSearchDTO 搜索参数 + * @return 热搜列表 + */ + List list(@Param("hotSearchDTO") HotSearchDTO hotSearchDTO); + + /** + * 根据热搜id获取热搜 + * + * @param hotSearchId 热搜id + * @return 热搜 + */ + HotSearchVO getByHotSearchId(@Param("hotSearchId") Long hotSearchId); + + /** + * 保存热搜 + * + * @param hotSearch 热搜 + */ + void save(@Param("hotSearch") HotSearch hotSearch); + + /** + * 更新热搜 + * + * @param hotSearch 热搜 + */ + void update(@Param("hotSearch") HotSearch hotSearch); + + /** + * 根据热搜id删除热搜 + * + * @param hotSearchId + * @param shopId + */ + void deleteById(@Param("hotSearchId") Long hotSearchId, @Param("shopId") Long shopId); + + /** + * 根据店铺id获取热搜列表 + * + * @param shopId + * @param type + * @return + */ + List listByShopId(@Param("shopId") Long shopId, @Param("type") Integer type); + + /** + * 根据店铺id和热搜标题获取热搜数量 + * + * @param shopId + * @param title + * @param type + * @return + */ + int countExist(@Param("shopId") Long shopId, @Param("title") String title, @Param("type") Integer type); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/IndexImgMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/IndexImgMapper.java new file mode 100644 index 0000000..4a2c7b3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/IndexImgMapper.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.multishop.dto.IndexImgDTO; +import com.tmerclub.cloud.multishop.model.IndexImg; +import com.tmerclub.cloud.multishop.vo.IndexImgVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 轮播图 + * + * @author YXF + * @date 2020-11-24 16:38:32 + */ +public interface IndexImgMapper { + + /** + * 获取轮播图列表 + * + * @param indexImgDTO + * @return 轮播图列表 + */ + List list(@Param("indexImg") IndexImgDTO indexImgDTO); + + /** + * 根据轮播图id获取轮播图 + * + * @param imgId 轮播图id + * @return 轮播图 + */ + IndexImgVO getByImgId(@Param("imgId") Long imgId); + + /** + * 保存轮播图 + * + * @param indexImg 轮播图 + */ + void save(@Param("indexImg") IndexImg indexImg); + + /** + * 更新轮播图 + * + * @param indexImg 轮播图 + */ + void update(@Param("indexImg") IndexImg indexImg); + + /** + * 根据轮播图id删除轮播图 + * + * @param imgId 轮播图id + * @param shopId 店铺id + */ + void deleteByIdAndShopId(@Param("imgId") Long imgId, @Param("shopId") Long shopId); + + /** + * 根据店铺id,获取轮播图列表 + * + * @param shopId 店铺id + * @param imgType 图片类型 + * @return 轮播图列表 + */ + List getListByShopId(@Param("shopId") Long shopId, @Param("imgType") Integer imgType); + + /** + * 解绑轮播图商品 + * + * @param shopId + * @param spuIds + */ + void offlineSpuBySpuIds(@Param("shopId") Long shopId, @Param("spuIds") List spuIds); + + /** + * 根据参数获取轮播图数量 + * @param indexImg 轮播图 + * @return 轮播图数量 + */ + int countByParam(@Param("indexImg") IndexImg indexImg); + + /** + * 根据商品id,切换轮播图类型 + * @param spuId 商品id + * @return 轮播图列表 + */ + void batchUpdate(@Param("spuId") Long spuId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopAuditingMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopAuditingMapper.java new file mode 100644 index 0000000..6819fc2 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopAuditingMapper.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.multishop.dto.AuditingInfoDTO; +import com.tmerclub.cloud.multishop.model.ShopAuditing; +import com.tmerclub.cloud.multishop.vo.ShopAuditingInfoVO; +import com.tmerclub.cloud.multishop.vo.ShopAuditingVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商家审核信息 + * + * @author YXF + * @date 2021-02-01 17:10:35 + */ +public interface ShopAuditingMapper { + + /** + * 获取商家审核信息列表 + * + * @return 商家审核信息列表 + */ + List list(); + + /** + * 根据商家审核信息id获取商家审核信息 + * + * @param shopAuditingId 商家审核信息id + * @return 商家审核信息 + */ + ShopAuditingVO getByShopAuditingId(@Param("shopAuditingId") Long shopAuditingId); + + /** + * 保存商家审核信息 + * + * @param shopAuditing 商家审核信息 + */ + void save(@Param("shopAuditing") ShopAuditing shopAuditing); + + /** + * 更新商家审核信息 + * + * @param shopAuditing 商家审核信息 + */ + void update(@Param("shopAuditing") ShopAuditing shopAuditing); + + /** + * 根据商家审核信息id删除商家审核信息 + * + * @param shopAuditingId + */ + void deleteById(@Param("shopAuditingId") Long shopAuditingId); + + /** + * 获取指定店铺的申请信息 + * + * @param shopId + * @return + */ + ShopAuditingVO getByshopId(@Param("shopId") Long shopId); + + /** + * 获取店铺申请列表 + * @param auditingInfoDTO + * @return + */ + List auditingInfoList(@Param("auditingInfo") AuditingInfoDTO auditingInfoDTO); + + /** + * 更新商家申请开店为审核失败 + * @param shopIds + */ + void updateToFail(@Param("shopIds") List shopIds); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopBankCardMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopBankCardMapper.java new file mode 100644 index 0000000..77de344 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopBankCardMapper.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.api.multishop.vo.ShopBankCardVO; +import com.tmerclub.cloud.multishop.dto.ShopBankCardDTO; +import com.tmerclub.cloud.multishop.model.ShopBankCard; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Author lth + * @Date 2021/4/25 17:06 + */ +public interface ShopBankCardMapper { + + /** + * 根据银行卡信息id获取银行卡信息 + * + * @param shopBankCardId 银行卡信息id + * @return 银行卡信息 + */ + ShopBankCardVO getByShopBankCardId(@Param("shopBankCardId") Long shopBankCardId); + + /** + * 保存银行卡信息 + * @param shopBankCard 银行卡信息 + */ + void save(@Param("shopBankCard") ShopBankCard shopBankCard); + + /** + * 更新银行卡信息 + * @param shopBankCard 银行卡信息 + */ + void update(@Param("shopBankCard") ShopBankCard shopBankCard); + + /** + * 根据银行卡信息id删除银行卡信息 + * @param shopBankCardId + */ + void deleteById(@Param("shopBankCardId") Long shopBankCardId); + + /** + * 根据店铺id获取银行卡列表 + * @param shopId + * @return + */ + List listByShopId(@Param("shopId") Long shopId); + + /** + * 批量插入店铺银行卡信息 + * @param shopBankCardDTOList + * @param shopId + */ + void insertBatch(@Param("shopBankCardList") List shopBankCardDTOList, @Param("shopId") Long shopId); + + /** + * 根据店铺id批量删除该店铺下的银行卡信息 + * @param shopId + */ + void deleteByShopId(@Param("shopId") Long shopId); + + /** + * 设置银行卡为主账号 + * @param shopBankCardId + * @param shopId + */ + void setPrimary(@Param("shopBankCardId") Long shopBankCardId, @Param("shopId") Long shopId); + + /** + * 设置银行卡不为主账号 + * @param shopBankCardId + * @param shopId + */ + void setNotPrimary(@Param("shopBankCardId") Long shopBankCardId, @Param("shopId") Long shopId); + + /** + * 根据店铺id统计银行卡数量 + * @param shopId + * @return + */ + int countByShopId(Long shopId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopCollectionMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopCollectionMapper.java new file mode 100644 index 0000000..ff14b2b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopCollectionMapper.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.multishop.model.ShopCollection; +import com.tmerclub.cloud.multishop.vo.ShopCollectionVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户店铺收藏记录 + * + * @author lhd + * @date 2021-02-23 14:41:42 + */ +public interface ShopCollectionMapper { + + /** + * 根据用户店铺收藏记录id获取用户店铺收藏记录 + * + * @param collectionId 用户店铺收藏记录id + * @return 用户店铺收藏记录 + */ + ShopCollectionVO getByCollectionId(@Param("collectionId") Long collectionId); + + /** + * 保存用户店铺收藏记录 + * @param userCollectionShop 用户店铺收藏记录 + */ + void save(@Param("userCollectionShop") ShopCollection userCollectionShop); + + /** + * 更新用户店铺收藏记录 + * @param userCollectionShop 用户店铺收藏记录 + */ + void update(@Param("userCollectionShop") ShopCollection userCollectionShop); + + /** + * 根据用户id获取收藏店铺分页列表 + * @param userId 用户id + * @param shopName 店铺名称 + * @return 分页列表 + */ + List listUserCollectionShopPageByUserIdAndShopName(@Param("userId") Long userId, @Param("shopName") String shopName); + + /** + * 根据用户id和店铺id获取收藏数量 + * @param userId 用户id + * @param shopId 店铺id + * @return 收藏数量 + */ + int countByShopIdAndUserId(@Param("shopId") Long shopId, @Param("userId") Long userId); + + /** + * 根据用户id和店铺id删除用户店铺收藏记录 + * @param shopId 店铺id + * @param userId 用户id + * @return 删除结果 + */ + boolean deleteByShopIdAndUserId(@Param("shopId") Long shopId, @Param("userId") Long userId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopExtensionMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopExtensionMapper.java new file mode 100644 index 0000000..7a92b17 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopExtensionMapper.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.multishop.model.ShopExtension; +import com.tmerclub.cloud.multishop.vo.ShopExtensionVO; +import org.apache.ibatis.annotations.Param; + +/** + * 店铺扩张信息 + * + * @author YXF + * @date 2021-02-05 15:36:12 + */ +public interface ShopExtensionMapper { + + /** + * 保存店铺扩张信息 + * @param shopExtension 店铺扩张信息 + */ + void save(@Param("shopExtension") ShopExtension shopExtension); + + /** + * 更新店铺扩张信息 + * @param shopExtension 店铺扩张信息 + */ + void update(@Param("shopExtension") ShopExtensionVO shopExtension); + + /** + * 根据店铺id获取商家用户信息 + * + * @param shopId 店铺id + * @return 商家扩展信息 + */ + ShopExtensionVO getByShopId(@Param("shopId") Long shopId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopRefundAddrMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopRefundAddrMapper.java new file mode 100644 index 0000000..27a910b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopRefundAddrMapper.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.api.multishop.vo.ShopRefundAddrVO; +import com.tmerclub.cloud.multishop.dto.ShopRefundAddrDTO; +import com.tmerclub.cloud.multishop.model.ShopRefundAddr; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商家退货地址 + * + * @author FrozenWatermelon + * @date 2021-03-09 15:03:18 + */ +public interface ShopRefundAddrMapper { + + /** + * 获取商家退货地址列表 + * @param shopRefundAddrDTO + * @return 商家退货地址列表 + */ + List list(@Param("shopRefundAddr") ShopRefundAddrDTO shopRefundAddrDTO); + + /** + * 根据商家退货地址id获取商家退货地址 + * + * @param shopRefundAddrId 商家退货地址id + * @param shopId + * @return 商家退货地址 + */ + ShopRefundAddrVO getByShopRefundAddrId(@Param("shopRefundAddrId") Long shopRefundAddrId, @Param("shopId") Long shopId); + + /** + * 保存商家退货地址 + * + * @param shopRefundAddr 商家退货地址 + */ + void save(@Param("shopRefundAddr") ShopRefundAddr shopRefundAddr); + + /** + * 更新商家退货地址 + * + * @param shopRefundAddr 商家退货地址 + */ + void update(@Param("shopRefundAddr") ShopRefundAddr shopRefundAddr); + + /** + * 根据商家退货地址id删除商家退货地址 + * + * @param shopRefundAddrId + */ + void deleteById(@Param("shopRefundAddrId") Long shopRefundAddrId); + + /** + * 获取店铺退货地址 + * + * @param shopId 店铺id + * @return 店铺退货地址 + */ + List listByShopId(@Param("shopId") Long shopId); + + /** + * 清除默认地址 + * + * @param shopId + */ + void cancelDefaultAddr(@Param("shopId") Long shopId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopWalletMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopWalletMapper.java new file mode 100644 index 0000000..7e74778 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopWalletMapper.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.multishop.dto.ShopWalletLogSearchDTO; +import com.tmerclub.cloud.multishop.model.ShopWallet; +import com.tmerclub.cloud.multishop.vo.ShopWalletVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商家钱包信息 + * + * @author FrozenWatermelon + * @date 2021-01-07 16:41:03 + */ +public interface ShopWalletMapper { + + /** + * 根据店铺ids获取商家钱包信息列表 + * + * @param shopIds 店铺ids + * @param paySysType + * @return 商家钱包信息列表 + */ + List listByShopIds(@Param("shopIds") List shopIds, @Param("paySysType") Integer paySysType); + + /** + * 保存商家钱包信息 + * + * @param shopWallet 商家钱包信息 + */ + void save(@Param("shopWallet") ShopWallet shopWallet); + + /** + * 更新商家钱包信息 + * + * @param shopWallet 商家钱包信息 + * @return int + */ + int update(@Param("shopWallet") ShopWallet shopWallet); + + /** + * 根据店铺id获取钱包信息 + * + * @param shopId 店铺id + * @param paySysType 支付系统 + * @return 钱包信息 + */ + ShopWalletVO getByShopId(@Param("shopId") Long shopId, @Param("paySysType") Integer paySysType); + + /** + * 给商家钱包,添加未结算金额 + * + * @param shopId + * @param changeAmount + * @param paySysType 支付系统 0默认1通联 + * @return + */ + int addUnsettledAmount(@Param("shopId") Long shopId, @Param("changeAmount") Long changeAmount, @Param("paySysType") Integer paySysType); + + /** + * 锁定未结算金额 + * + * @param shopId + * @param shopRealRefundAmount + * @param paySysType 支付系统 0默认1通联 + * @return + */ + int subUnsettledAmount(@Param("shopId") Long shopId, @Param("shopRealRefundAmount") Long shopRealRefundAmount, @Param("paySysType") Integer paySysType); + + /** + * 进行结算 + * 添加结算金额可用金额、结算总金额 + * + * @param shopId + * @param settledAmount + * @param paySysType 支付系统 0默认1通联 + * @param isUpdateTotal 是否更新总结算金额 + * @return + */ + int addSettledAmount(@Param("shopId") Long shopId, + @Param("settledAmount") Long settledAmount, + @Param("paySysType") Integer paySysType, + @Param("isUpdateTotal") boolean isUpdateTotal); + + /** + * 给商家钱包,减少结算金额 + * + * @param shopId + * @param changeAmount + * @param paySysType 支付系统 0默认1通联 + * @return + */ + int subSettledAmount(@Param("shopId") Long shopId, @Param("changeAmount") Long changeAmount, @Param("paySysType") Integer paySysType); + + /** + * 提现申请的时候增加冻结金额 + * + * @param shopId + * @param changeAmount + * @param paySysType 支付系统 0默认1通联 + * @return + */ + int addFreezeAmount(@Param("shopId") Long shopId, @Param("changeAmount") Long changeAmount, @Param("paySysType") Integer paySysType); + + /** + * 提现申请通过的时候/提现申请被拒绝的时候减少冻结金额 + * + * @param shopId + * @param changeAmount + * @param paySysType 支付系统 0默认1通联 + * @return + */ + int subFreezeAmount(@Param("shopId") Long shopId, @Param("changeAmount") Long changeAmount, @Param("paySysType") Integer paySysType); + + /** + * 获取所有商家钱包信息 + * + * @param shopWalletLogSearchDTO + * @param paySysType + * @return 钱包信息 + */ + ShopWalletVO getAllShop(@Param("shopWalletLogSearchDTO") ShopWalletLogSearchDTO shopWalletLogSearchDTO, @Param("paySysType") Integer paySysType); + + /** + * 获取所有店铺的钱包信息 + * + * @param shopWalletLogSearchDTO + * @param paySysType + * @return + */ + List listAllShopWallet(@Param("shopWalletLogSearchDTO") ShopWalletLogSearchDTO shopWalletLogSearchDTO, @Param("paySysType") Integer paySysType); + + /** + * 获取店铺余额,不含分片 + * + * @param shopId 店铺id + * @param paySysType 支付系统 0默认1通联 + * @return + */ + Long getSettlementAmountByShopId(@Param("shopId") Long shopId, @Param("paySysType") Integer paySysType); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/HotSearch.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/HotSearch.java new file mode 100644 index 0000000..6345d5e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/HotSearch.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 热搜 + * + * @author YXF + * @date 2021-01-27 09:10:00 + */ +public class HotSearch extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 主键 + */ + private Long hotSearchId; + + /** + * 店铺ID 0为全局热搜 + */ + private Long shopId; + + /** + * 内容 + */ + private String content; + + /** + * 顺序 + */ + private Integer seq; + + /** + * 状态 0下线 1上线 + */ + private Integer status; + + /** + * 热搜标题 + */ + private String title; + + /** + * 1:商品热搜 2:店铺热搜 + */ + private Integer type; + + public Long getHotSearchId() { + return hotSearchId; + } + + public void setHotSearchId(Long hotSearchId) { + this.hotSearchId = hotSearchId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "HotSearch{" + + "hotSearchId=" + hotSearchId + + ", shopId=" + shopId + + ", content='" + content + '\'' + + ", seq=" + seq + + ", status=" + status + + ", title='" + title + '\'' + + ", type='" + type + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopBankCard.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopBankCard.java new file mode 100644 index 0000000..0374ca3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopBankCard.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 银行卡信息 + * + * @author FrozenWatermelon + * @date 2021-04-29 10:22:13 + */ +public class ShopBankCard extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 银行卡自增id + */ + private Long shopBankCardId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 银行名称 + */ + private String bankName; + + /** + * 银行开户行 + */ + private String openingBank; + + /** + * 收款方户名 + */ + private String recipientName; + + /** + * 收款方账户 + */ + private String cardNo; + + /** + * 支行名称 + */ + private String branchName; + + /** + * 是否默认 1:默认 0:非默认 + */ + private Integer isDefault; + + /** + * 银行卡号 + */ + private String bankCardNo; + + /** + * 银行卡/账户属性 0个人银行卡 1企业对公账户 + */ + private Integer bankCardPro; + + /** + * 支付行号 + */ + private String unionBank; + + /** + * 1.正常,-1.已删除 + */ + private Integer status; + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getShopBankCardId() { + return shopBankCardId; + } + + public void setShopBankCardId(Long shopBankCardId) { + this.shopBankCardId = shopBankCardId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getOpeningBank() { + return openingBank; + } + + public void setOpeningBank(String openingBank) { + this.openingBank = openingBank; + } + + public String getRecipientName() { + return recipientName; + } + + public void setRecipientName(String recipientName) { + this.recipientName = recipientName; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getBranchName() { + return branchName; + } + + public void setBranchName(String branchName) { + this.branchName = branchName; + } + + public String getBankCardNo() { + return bankCardNo; + } + + public void setBankCardNo(String bankCardNo) { + this.bankCardNo = bankCardNo; + } + + public Integer getBankCardPro() { + return bankCardPro; + } + + public void setBankCardPro(Integer bankCardPro) { + this.bankCardPro = bankCardPro; + } + + public String getUnionBank() { + return unionBank; + } + + public void setUnionBank(String unionBank) { + this.unionBank = unionBank; + } + + @Override + public String toString() { + return "ShopBankCard{" + + "shopBankCardId=" + shopBankCardId + + ", shopId=" + shopId + + ", bankName='" + bankName + '\'' + + ", openingBank='" + openingBank + '\'' + + ", recipientName='" + recipientName + '\'' + + ", cardNo='" + cardNo + '\'' + + ", branchName='" + branchName + '\'' + + ", isDefault=" + isDefault + + ", bankCardNo='" + bankCardNo + '\'' + + ", bankCardPro=" + bankCardPro + + ", unionBank=" + unionBank + + ", status=" + status + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopCompany.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopCompany.java new file mode 100644 index 0000000..79e92af --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopCompany.java @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 店铺工商信息 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:16:03 + */ +public class ShopCompany extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺工商信息id + */ + private Long shopCompanyId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 统一社会信用代码 + */ + private String creditCode; + + /** + * 企业名称 + */ + private String firmName; + + /** + * 住所 + */ + private String residence; + + /** + * 法定代表人 + */ + private String representative; + + /** + * 法人身份证号 + */ + private String legalIds; + + /** + * 法人手机号 + */ + private String legalPhone; + + /** + * 注册资本(万元) + */ + private Double capital; + + /** + * 成立日期 + */ + private Date foundTime; + + /** + * 营业起始日期 + */ + private Date startTime; + + /** + * 营业终止日期 + */ + private Date endTime; + + /** + * 经营范围 + */ + private String businessScope; + + /** + * 营业执照 + */ + private String businessLicense; + + /** + * 身份证正面 + */ + private String identityCardFront; + + /** + * 身份证反面 + */ + private String identityCardLater; + + /** + * 审核状态:1:已通过 0待审核 -1未通过 + */ + private Integer status; + + public ShopCompany() { + } + + public ShopCompany(Integer status, Long shopCompanyId) { + this.status = status; + this.shopCompanyId = shopCompanyId; + } + + public Long getShopCompanyId() { + return shopCompanyId; + } + + public void setShopCompanyId(Long shopCompanyId) { + this.shopCompanyId = shopCompanyId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getCreditCode() { + return creditCode; + } + + public void setCreditCode(String creditCode) { + this.creditCode = creditCode; + } + + public String getFirmName() { + return firmName; + } + + public void setFirmName(String firmName) { + this.firmName = firmName; + } + + public String getResidence() { + return residence; + } + + public void setResidence(String residence) { + this.residence = residence; + } + + public String getRepresentative() { + return representative; + } + + public void setRepresentative(String representative) { + this.representative = representative; + } + + public String getLegalIds() { + return legalIds; + } + + public void setLegalIds(String legalIds) { + this.legalIds = legalIds; + } + + public String getLegalPhone() { + return legalPhone; + } + + public void setLegalPhone(String legalPhone) { + this.legalPhone = legalPhone; + } + + public Double getCapital() { + return capital; + } + + public void setCapital(Double capital) { + this.capital = capital; + } + + public Date getFoundTime() { + return foundTime; + } + + public void setFoundTime(Date foundTime) { + this.foundTime = foundTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getBusinessScope() { + return businessScope; + } + + public void setBusinessScope(String businessScope) { + this.businessScope = businessScope; + } + + public String getBusinessLicense() { + return businessLicense; + } + + public void setBusinessLicense(String businessLicense) { + this.businessLicense = businessLicense; + } + + public String getIdentityCardFront() { + return identityCardFront; + } + + public void setIdentityCardFront(String identityCardFront) { + this.identityCardFront = identityCardFront; + } + + public String getIdentityCardLater() { + return identityCardLater; + } + + public void setIdentityCardLater(String identityCardLater) { + this.identityCardLater = identityCardLater; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "ShopCompany{" + + "shopCompanyId=" + shopCompanyId + + ", shopId=" + shopId + + ", creditCode='" + creditCode + '\'' + + ", firmName='" + firmName + '\'' + + ", residence='" + residence + '\'' + + ", representative='" + representative + '\'' + + ", legalIds='" + legalIds + '\'' + + ", legalPhone='" + legalPhone + '\'' + + ", capital=" + capital + + ", foundTime=" + foundTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", businessScope='" + businessScope + '\'' + + ", businessLicense='" + businessLicense + '\'' + + ", identityCardFront='" + identityCardFront + '\'' + + ", identityCardLater='" + identityCardLater + '\'' + + ", status=" + status + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopRefundAddr.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopRefundAddr.java new file mode 100644 index 0000000..5067f87 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopRefundAddr.java @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商家退货地址 + * + * @author FrozenWatermelon + * @date 2021-03-09 15:03:18 + */ +public class ShopRefundAddr extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商家退货地址id + */ + private Long shopRefundAddrId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 手机 + */ + private String mobile; + + /** + * 是否默认地址 1是 + */ + private Integer isDefault; + + /** + * 收货人 + */ + private String consignee; + + /** + * 省ID + */ + private Long provinceId; + + /** + * 省 + */ + private String province; + + /** + * 城市ID + */ + private Long cityId; + + /** + * 城市 + */ + private String city; + + /** + * 区ID + */ + private Long areaId; + + /** + * 区 + */ + private String area; + + /** + * 邮编 + */ + private String postCode; + + /** + * 地址 + */ + private String addr; + + /** + * 经度 + */ + private Double lng; + + /** + * 纬度 + */ + private Double lat; + + public Long getShopRefundAddrId() { + return shopRefundAddrId; + } + + public void setShopRefundAddrId(Long shopRefundAddrId) { + this.shopRefundAddrId = shopRefundAddrId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "ShopRefundAddr{" + + "shopRefundAddrId=" + shopRefundAddrId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",shopId=" + shopId + + ",mobile=" + mobile + + ",isDefault=" + isDefault + + ",consignee=" + consignee + + ",provinceId=" + provinceId + + ",province=" + province + + ",cityId=" + cityId + + ",city=" + city + + ",areaId=" + areaId + + ",area=" + area + + ",postCode=" + postCode + + ",addr=" + addr + + ",lng=" + lng + + ",lat=" + lat + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopRenovation.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopRenovation.java new file mode 100644 index 0000000..d4c4d66 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopRenovation.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 店铺装修信息 + * + * @author Orange + * @date 2022-08-12 11:27:18 + */ +public class ShopRenovation extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺装修id + */ + private Long renovationId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 装修名称 + */ + private String name; + + /** + * 装修内容 + */ + private String content; + + /** + * 是否主页 1.是 0.不是 + */ + private Integer homeStatus; + + /** + * 装修类型 1.pc 2.移动端 + */ + private Integer renovationType; + + public Long getRenovationId() { + return renovationId; + } + + public void setRenovationId(Long renovationId) { + this.renovationId = renovationId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(Integer homeStatus) { + this.homeStatus = homeStatus; + } + + public Integer getRenovationType() { + return renovationType; + } + + public void setRenovationType(Integer renovationType) { + this.renovationType = renovationType; + } + + @Override + public String toString() { + return "ShopRenovation{" + + "renovationId=" + renovationId + + ",shopId=" + shopId + + ",name=" + name + + ",content=" + content + + ",homeStatus=" + homeStatus + + ",renovationType=" + renovationType + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopSubstituteSales.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopSubstituteSales.java new file mode 100644 index 0000000..cf0dcc8 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopSubstituteSales.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 代销设置表 + * + * @author lhd + * @date 2022-06-22 17:09:12 + */ +public class ShopSubstituteSales extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 代销设置id + */ + private Long shopSubstituteSalesId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 代销设置类型 0.智能设价 1.手动设价 + */ + private Integer salesType; + + /** + * 默认加价比例 0.按比例加价 1.按固定数值加价 + */ + private Integer salesPriceType; + + /** + * 默认加价比例为0时,代表百分比*100,为1时代表实际奖励金额*100 + */ + private Long salesPrice; + + /** + * 商家收入低于供货价订单形式默认0 0.直接转换为待采购订单 1.通过商家已结算金额扣除差价 + */ + private Integer orderShape; + + /** + * 操作人id + */ + private Long modifier; + + /** + * 代销设置类型为1才有:供货价高于代销价时是否自动下架:1.是,0.否 + */ + private Integer automaticOff; + + public Integer getAutomaticOff() { + return automaticOff; + } + + public void setAutomaticOff(Integer automaticOff) { + this.automaticOff = automaticOff; + } + + public Integer getOrderShape() { + return orderShape; + } + + public void setOrderShape(Integer orderShape) { + this.orderShape = orderShape; + } + + public Long getShopSubstituteSalesId() { + return shopSubstituteSalesId; + } + + public void setShopSubstituteSalesId(Long shopSubstituteSalesId) { + this.shopSubstituteSalesId = shopSubstituteSalesId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSalesType() { + return salesType; + } + + public void setSalesType(Integer salesType) { + this.salesType = salesType; + } + + public Integer getSalesPriceType() { + return salesPriceType; + } + + public void setSalesPriceType(Integer salesPriceType) { + this.salesPriceType = salesPriceType; + } + + public Long getSalesPrice() { + return salesPrice; + } + + public void setSalesPrice(Long salesPrice) { + this.salesPrice = salesPrice; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + @Override + public String toString() { + return "ShopSubstituteSales{" + + "shopSubstituteSalesId=" + shopSubstituteSalesId + + ", shopId=" + shopId + + ", salesType=" + salesType + + ", salesPriceType=" + salesPriceType + + ", salesPrice=" + salesPrice + + ", orderShape=" + orderShape + + ", modifier=" + modifier + + ", automaticOff=" + automaticOff + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopTemplate.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopTemplate.java new file mode 100644 index 0000000..97910fb --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopTemplate.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品装修模板表 + * + * @author Orange + * @date 2022-08-12 14:04:57 + */ +public class ShopTemplate extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺模板表 + */ + private Long templateId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 名称 + */ + private String name; + + /** + * 装修内容 + */ + private String content; + + /** + * 图片 + */ + private String image; + + /** + * 类型 1.pc 2.移动端 + */ + private Integer type; + + /** + * 备注 + */ + private String remark; + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "ShopTemplate{" + + "templateId=" + templateId + + ",shopId=" + shopId + + ",name=" + name + + ",content=" + content + + ",image=" + image + + ",type=" + type + + ",remark=" + remark + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopUser.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopUser.java new file mode 100644 index 0000000..3353755 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopUser.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商家用户 + * + * @author FrozenWatermelon + * @date 2020-12-05 15:50:25 + */ +public class ShopUser extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商家用户id + */ + private Long shopUserId; + + /** + * 关联店铺id + */ + private Long shopId; + + /** + * 昵称 + */ + private String nickName; + + /** + * 员工编号 + */ + private String code; + + /** + * 联系方式 + */ + private String phoneNum; + + /** + * 是否已经设置账号 + */ + private Integer hasAccount; + + public Long getShopUserId() { + return shopUserId; + } + + public void setShopUserId(Long shopUserId) { + this.shopUserId = shopUserId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPhoneNum() { + return phoneNum; + } + + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } + + public Integer getHasAccount() { + return hasAccount; + } + + public void setHasAccount(Integer hasAccount) { + this.hasAccount = hasAccount; + } + + @Override + public String toString() { + return "ShopUser{" + + "shopUserId=" + shopUserId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",shopId=" + shopId + + ",nickName=" + nickName + + ",code=" + code + + ",phoneNum=" + phoneNum + + ",hasAccount=" + hasAccount + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopWalletLog.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopWalletLog.java new file mode 100644 index 0000000..41b1b07 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopWalletLog.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商家钱包记录 + * + * @author FrozenWatermelon + * @date 2021-01-07 16:41:03 + */ +public class ShopWalletLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺钱包id + */ + private Long walletLogId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 关联订单id + */ + private Long orderId; + + /** + * 关联退款单id + */ + private Long refundId; + + /** + * 收支类型 0支出 1收入 + */ + private Integer ioType; + + /** + * 金额类型 0 未结算金额 1可提现金额 2冻结金额 + */ + private Integer amountType; + + /** + * 改变金额 + */ + private Long changeAmount; + + /** + * 原因 0用户支付 1用户确认收货 2 用户退款申请 3 拒绝用户退款申请 4 提现申请 5 提现申请被拒绝 + */ + private Integer reason; + + /** + * 用户金额(支付实付金额,退款实际申请金额) + */ + private Long userAmount; + + /** + * 平台补贴金额 + */ + private Long platformAmount; + + /** + * 分销占用金额 + */ + private Long distributionAmount; + + /** + * 平台佣金 + */ + private Long platformCommission; + + /** + * 商家优惠金额 + */ + private Long shopReduceAmount; + + public Long getWalletLogId() { + return walletLogId; + } + + public void setWalletLogId(Long walletLogId) { + this.walletLogId = walletLogId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public Integer getAmountType() { + return amountType; + } + + public void setAmountType(Integer amountType) { + this.amountType = amountType; + } + + public Integer getReason() { + return reason; + } + + public void setReason(Integer reason) { + this.reason = reason; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(Long changeAmount) { + this.changeAmount = changeAmount; + } + + public Long getUserAmount() { + return userAmount; + } + + public void setUserAmount(Long userAmount) { + this.userAmount = userAmount; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getShopReduceAmount() { + return shopReduceAmount; + } + + public void setShopReduceAmount(Long shopReduceAmount) { + this.shopReduceAmount = shopReduceAmount; + } + + @Override + public String toString() { + return "ShopWalletLog{" + + "walletLogId=" + walletLogId + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", refundId=" + refundId + + ", ioType=" + ioType + + ", amountType=" + amountType + + ", changeAmount=" + changeAmount + + ", reason=" + reason + + ", userAmount=" + userAmount + + ", platformAmount=" + platformAmount + + ", distributionAmount=" + distributionAmount + + ", platformCommission=" + platformCommission + + ", shopReduceAmount=" + shopReduceAmount + + "} " + super.toString(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopWithdrawCash.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopWithdrawCash.java new file mode 100644 index 0000000..5c76f09 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopWithdrawCash.java @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商家提现申请信息 + * @author FrozenWatermelon + * @date 2021-01-07 16:41:03 + */ +public class ShopWithdrawCash extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 提现id + */ + private Long cashId; + + /** + * 支付系统类型 0默认1通联 + */ + private Integer paySysType; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 审核人id + */ + private Long auditorId; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 审核时间 + */ + private Date auditingTime; + + /** + * 状态(0:未审核、1:已通过 -1:未通过 2:发放成功 3:发放失败) + */ + private Integer status; + + /** + * 平台备注 + */ + private String remarks; + + /** + * 店铺备注 + */ + private String shopRemarks; + + /** + * 付款户名 + */ + private String payingAccount; + + /** + * 汇款账户 + */ + private String payingCardNo; + + /** + * 汇款时间 + */ + private Date payingTime; + + /** + * 收款银行卡id + */ + private Long shopBankCardId; + + /** + * 通联提现状态 0.待支付 1.申请成功(还没确认) 2.提现成功 3.提现失败 + */ + private Integer allinpayStatus; + + /** + * 通联提现订单号 + */ + private String bizOrderNo; + + /** + * 提现失败原因 + */ + private String payFailMessage; + + public Long getCashId() { + return cashId; + } + + public void setCashId(Long cashId) { + this.cashId = cashId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Date getAuditingTime() { + return auditingTime; + } + + public void setAuditingTime(Date auditingTime) { + this.auditingTime = auditingTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getShopRemarks() { + return shopRemarks; + } + + public void setShopRemarks(String shopRemarks) { + this.shopRemarks = shopRemarks; + } + + public String getPayingAccount() { + return payingAccount; + } + + public void setPayingAccount(String payingAccount) { + this.payingAccount = payingAccount; + } + + public String getPayingCardNo() { + return payingCardNo; + } + + public void setPayingCardNo(String payingCardNo) { + this.payingCardNo = payingCardNo; + } + + public Date getPayingTime() { + return payingTime; + } + + public void setPayingTime(Date payingTime) { + this.payingTime = payingTime; + } + + public Long getShopBankCardId() { + return shopBankCardId; + } + + public void setShopBankCardId(Long shopBankCardId) { + this.shopBankCardId = shopBankCardId; + } + + public Integer getAllinpayStatus() { + return allinpayStatus; + } + + public void setAllinpayStatus(Integer allinpayStatus) { + this.allinpayStatus = allinpayStatus; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getPayFailMessage() { + return payFailMessage; + } + + public void setPayFailMessage(String payFailMessage) { + this.payFailMessage = payFailMessage; + } + + @Override + public String toString() { + return "ShopWithdrawCash{" + + "cashId=" + cashId + + ", paySysType=" + paySysType + + ", shopId=" + shopId + + ", auditorId=" + auditorId + + ", amount=" + amount + + ", auditingTime=" + auditingTime + + ", status=" + status + + ", remarks='" + remarks + '\'' + + ", shopRemarks='" + shopRemarks + '\'' + + ", payingAccount='" + payingAccount + '\'' + + ", payingCardNo='" + payingCardNo + '\'' + + ", payingTime=" + payingTime + + ", shopBankCardId=" + shopBankCardId + + ", allinpayStatus=" + allinpayStatus + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", payFailMessage='" + payFailMessage + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/IndexImgService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/IndexImgService.java new file mode 100644 index 0000000..9763fd3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/IndexImgService.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.dto.IndexImgDTO; +import com.tmerclub.cloud.multishop.model.IndexImg; +import com.tmerclub.cloud.multishop.vo.IndexImgVO; + +import java.util.List; + +/** + * 轮播图 + * + * @author YXF + * @date 2020-11-24 16:38:32 + */ +public interface IndexImgService { + + /** + * 分页获取轮播图列表 + * @param pageDTO 分页参数 + * @param indexImgDTO + * @return 轮播图列表分页数据 + */ + PageVO page(PageDTO pageDTO, IndexImgDTO indexImgDTO); + + /** + * 根据轮播图id获取轮播图 + * @param imgId 轮播图id + * @return 轮播图 + */ + IndexImgVO getByImgId(Long imgId); + + /** + * 保存轮播图 + * @param indexImg 轮播图 + */ + void save(IndexImg indexImg); + + /** + * 更新轮播图 + * @param indexImg 轮播图 + */ + void update(IndexImg indexImg); + + /** + * 根据轮播图id删除轮播图 + * @param imgId + * @param shopId + * @param imgType + */ + void deleteById(Long imgId, Long shopId, Integer imgType); + + /** + * 根据店铺id,获取轮播图列表 + * @param shopId 店铺id + * @param imgType 图片类型 + * @return 轮播图列表 + */ + List getListByShopId(Long shopId, Integer imgType); + + /** + * 解绑轮播图商品 + * @param shopId + * @param spuIds + */ + void offlineSpuBySpuIds(Long shopId, List spuIds); + + /** + * 批量更新 + * @param spuId + * @param shopId + */ + void batchUpdate(Long spuId, Long shopId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopApplyService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopApplyService.java new file mode 100644 index 0000000..270e76f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopApplyService.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +/** + * @Author lth + * @Date 2021/4/29 17:23 + */ +public interface ShopApplyService { + + /** + * 申请开店 + * @param shopId + */ + void apply(Long shopId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopAuditingService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopAuditingService.java new file mode 100644 index 0000000..4ca2a14 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopAuditingService.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.dto.AuditingInfoDTO; +import com.tmerclub.cloud.multishop.model.ShopAuditing; +import com.tmerclub.cloud.multishop.vo.ShopAuditingInfoVO; +import com.tmerclub.cloud.multishop.vo.ShopAuditingVO; + +import java.util.List; + +/** + * 商家审核信息 + * + * @author YXF + * @date 2021-02-01 17:10:35 + */ +public interface ShopAuditingService { + + /** + * 分页获取商家审核信息列表 + * @param pageDTO 分页参数 + * @return 商家审核信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据商家审核信息id获取商家审核信息 + * + * @param shopAuditingId 商家审核信息id + * @return 商家审核信息 + */ + ShopAuditingVO getByShopAuditingId(Long shopAuditingId); + + /** + * 保存商家审核信息 + * @param shopAuditing 商家审核信息 + */ + void save(ShopAuditing shopAuditing); + + /** + * 更新商家审核信息 + * @param shopAuditing 商家审核信息 + */ + void update(ShopAuditing shopAuditing); + + /** + * 根据商家审核信息id删除商家审核信息 + * @param shopAuditingId + */ + void deleteById(Long shopAuditingId); + + /** + * 获取指定店铺的申请信息 + * @param shopId + * @return + */ + ShopAuditingVO getByshopId(Long shopId); + + /** + * 获取店铺审请分页 + * @param pageDTO + * @param auditingInfoDTO + * @return + */ + PageVO auditingInfoPage(PageDTO pageDTO, AuditingInfoDTO auditingInfoDTO); + + /** + * 更新商家的开店申请为失败 + * @param shopIds + */ + void updateToFail(List shopIds); + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopRechargeService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopRechargeService.java new file mode 100644 index 0000000..1e61b43 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopRechargeService.java @@ -0,0 +1,41 @@ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.multishop.dto.AllinpayRechargeDTO; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.multishop.vo.ShopRechargeVO; + +/** + * @author TRACK + */ +public interface ShopRechargeService { + + /** + * 商家充值 + * @param shopWalletLog + * @param returnUrl + * @return + */ + ShopRechargeVO shopRecharge(MongoShopWalletLogBO shopWalletLog, String returnUrl); + + /** + * 确认支付提现订单 + * @param rechargeDTO + * @param shopId + */ + void confirmRechargePay(AllinpayRechargeDTO rechargeDTO, Long shopId); + + /** + * 重新发送验证码 + * @param bizOrderNo + * @param shopId + */ + void resendPaySms(String bizOrderNo, Long shopId); + + /** + * 充值通联回调 + * @param bizOrderNo + * @param payStatus + * @param bizUserId + */ + void rechargeBack(String bizOrderNo, String payStatus, String bizUserId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopRenovationService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopRenovationService.java new file mode 100644 index 0000000..f76029d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopRenovationService.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.model.ShopRenovation; + +/** + * 店铺装修信息 + * + * @author Orange + * @date 2022-08-12 11:27:18 + */ +public interface ShopRenovationService { + + /** + * 分页获取店铺装修信息列表 + * @param pageDTO 分页参数 + * @param shopRenovation + * @return 店铺装修信息列表分页数据 + */ + PageVO page(PageDTO pageDTO, ShopRenovation shopRenovation); + + /** + * 根据店铺装修信息id获取店铺装修信息 + * + * @param renovationId 店铺装修信息id + * @return 店铺装修信息 + */ + ShopRenovation getByRenovationId(Long renovationId); + + /** + * 根据店铺id和装修类型获取当前设置为主页的装修信息 + * @param shopId + * @param renovationType + * @return + */ + ShopRenovation getShopHomeRenovation(Long shopId, Integer renovationType); + + /** + * 保存店铺装修信息 + * @param shopRenovation 店铺装修信息 + */ + void save(ShopRenovation shopRenovation); + + /** + * 更新店铺装修信息 + * @param shopRenovation 店铺装修信息 + */ + void update(ShopRenovation shopRenovation); + + /** + * 根据店铺装修信息id删除店铺装修信息 + * @param renovationId 店铺装修信息id + * @param renovationType + * @param shopId + */ + void deleteById(Long renovationId, Integer renovationType, Long shopId); + + /** + * 移除缓存 + * @param shopId + * @param renovationType + * @param renovationId + */ + void removeCache(Long shopId, Integer renovationType, Long renovationId); + + /** + * 修改店铺装修信息 + * @param shopRenovation 装修 + */ + void updateToHomePage(ShopRenovation shopRenovation); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopTemplateService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopTemplateService.java new file mode 100644 index 0000000..c7ea4bc --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopTemplateService.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.model.ShopTemplate; + +/** + * 商品装修模板表 + * + * @author Orange + * @date 2022-08-12 14:04:57 + */ +public interface ShopTemplateService { + + /** + * 分页获取商品装修模板表列表 + * @param pageDTO 分页参数 + * @param shopTemplate + * @return 商品装修模板表列表分页数据 + */ + PageVO page(PageDTO pageDTO, ShopTemplate shopTemplate); + + /** + * 根据商品装修模板表id获取商品装修模板表 + * + * @param templateId 商品装修模板表id + * @return 商品装修模板表 + */ + ShopTemplate getByTemplateId(Long templateId); + + /** + * 保存商品装修模板表 + * @param shopTemplate 商品装修模板表 + */ + void save(ShopTemplate shopTemplate); + + /** + * 更新商品装修模板表 + * @param shopTemplate 商品装修模板表 + */ + void update(ShopTemplate shopTemplate); + + /** + * 根据商品装修模板表id删除商品装修模板表 + * @param templateId 商品装修模板表id + */ + void deleteById(Long templateId); + + /** + * 删除缓存 + * @param templateId + */ + void removeCache(Long templateId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopWalletLogService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopWalletLogService.java new file mode 100644 index 0000000..cf815c7 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopWalletLogService.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.dto.ShopWalletLogSearchDTO; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.multishop.vo.ShopWalletLogExcelVO; +import com.tmerclub.cloud.multishop.vo.ShopWalletVO; + +import java.util.List; + +/** + * 商家钱包记录 + * + * @author FrozenWatermelon + * @date 2021-01-07 16:41:03 + */ +public interface ShopWalletLogService { + + /** + * 分页获取商家钱包记录列表 + * @param pageDTO 分页参数 + * @param shopWalletLogSearchDTO 钱包日志搜索参数 + * @return 商家钱包记录列表分页数据 + */ + PageVO pageByParam(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO); + + /** + * 根据商家钱包记录id获取商家钱包记录 + * + * @param walletLogId 商家钱包记录id + * @return 商家钱包记录 + */ + MongoShopWalletLogBO getByWalletLogId(Long walletLogId); + + /** + * 根据订单号获取商家钱包记录 + * + * @param orderIds 商家钱包记录id + * @param shopWalletChangeReason + * @return 商家钱包记录 + */ + List listByOrderIdAndReason(Long orderIds, Integer shopWalletChangeReason); + + /** + * 根据订单号查询店铺钱包日志 + * @param shopWalletLogSearchDTO + * @return + */ + List listByParam(ShopWalletLogSearchDTO shopWalletLogSearchDTO); + + /** + * 保存钱包日志到MongoDB 注意事务 + * @param mongoShopWalletLogBO 日志 + * @return id + */ + void saveMongo(MongoShopWalletLogBO mongoShopWalletLogBO); + + /** + * 批量保存mongo日志 注意事务 + * 这里保存必须要有钱包日志的id,在前文代码必须传 + * @param list + */ + void saveMongoBatch(List list); + + /** + * 查询所有店铺的日志 + * @param pageDTO 分页 + * @param shopWalletLogSearchDTO 查询参数 + * @return 所有店铺的日志 + */ + PageVO pageAllShop(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO); + + /** + * 获取导出列表 + * @param shopWalletLogSearchDTO + * @return + */ + List listShopWalletLogExcel(ShopWalletLogSearchDTO shopWalletLogSearchDTO); + + /** + * 分页查询某个店铺的充值余额记录 + * @param pageDTO 分页参数 + * @param shopId 店铺Id + * @return + */ + PageVO getRechargePageByShopId(PageDTO pageDTO, Long shopId); + + /** + * 计算商家从订单获取金额的数量 + * + * @param orderId 订单id + * @param shopWalletChangeReason 钱包改变原因 + * @return 数量 + */ + long countInAmountByOrderId(Long orderId, Integer shopWalletChangeReason); + + + /** + * 计算商家从订单获取金额的数量 + * + * @param orderIds 订单id列表 + * @param shopWalletChangeReason 钱包改变原因 + * @return 数量 + */ + Long countInAmountByOrderIds(List orderIds, Integer shopWalletChangeReason); + + /** + * 计算商家从退款失去金额的数量 + * + * @param refundId 退款编号 + * @param shopWalletChangeReason 钱包改变原因 + * @return 数量 + */ + long countOutAmountByRefundId(Long refundId, Integer shopWalletChangeReason); + + /** + * 商家充值成功的更新 + * @param shopWalletLog + * @param orderId + */ + void updateRechargeSuccess(Long shopWalletLog, Long orderId); + + /** + * 根据时间和店铺名称获取店铺钱包信息 + * @param shopWalletLogSearchDTO + * @return + */ + ShopWalletVO getShopWalletByTime(ShopWalletLogSearchDTO shopWalletLogSearchDTO); + + /** + * 分页根据时间获取店铺钱包信息 + * @param pageDTO + * @param shopWalletLogSearchDTO + * @return + */ + PageVO pageShopWalletByTime(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO); + + /** + * 获取平台的钱包信息 + * @return + */ + ShopWalletVO getPlatformWallet(); + + /** + * 计算商家从订单获取金额的数量 + * + * @param orderIds 订单id列表 + * @param shopWalletChangeReason 钱包改变原因 + * @return 数量 + */ + List listByOrderIdsAndChangeReason(List orderIds, Integer shopWalletChangeReason); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/IndexImgServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/IndexImgServiceImpl.java new file mode 100644 index 0000000..f3ace03 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/IndexImgServiceImpl.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.multishop.dto.IndexImgDTO; +import com.tmerclub.cloud.multishop.mapper.IndexImgMapper; +import com.tmerclub.cloud.multishop.model.IndexImg; +import com.tmerclub.cloud.multishop.service.IndexImgService; +import com.tmerclub.cloud.multishop.vo.IndexImgVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 轮播图 + * + * @author YXF + * @date 2020-11-24 16:38:32 + */ +@Service +public class IndexImgServiceImpl implements IndexImgService { + + @Autowired + private IndexImgMapper indexImgMapper; + + @Override + public PageVO page(PageDTO pageDTO, IndexImgDTO indexImgDTO) { + return PageUtil.doPage(pageDTO, () -> indexImgMapper.list(indexImgDTO)); + } + + @Override + public IndexImgVO getByImgId(Long imgId) { + return indexImgMapper.getByImgId(imgId); + } + + @Override + @CacheEvict(cacheNames = CacheNames.INDEX_IMG_KEY, key = "#indexImg.shopId+ ':' + #indexImg.imgType") + public void save(IndexImg indexImg) { + int count = indexImgMapper.countByParam(indexImg); + if (count >= Constant.MAX_INDEX_IMG_NUM) { + throw new LuckException("该平台的轮播图已达到最大数量,不能再进行新增操作"); + } + indexImgMapper.save(indexImg); + } + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.INDEX_IMG_KEY, key = "#indexImg.shopId+ ':' + 0"), + @CacheEvict(cacheNames = CacheNames.INDEX_IMG_KEY, key = "#indexImg.shopId+ ':' + 1") + }) + public void update(IndexImg indexImg) { + int count = indexImgMapper.countByParam(indexImg); + if (count >= Constant.MAX_INDEX_IMG_NUM) { + throw new LuckException("该平台的轮播图已达到最大数量,不能再进行新增操作"); + } + indexImgMapper.update(indexImg); + } + + @Override + @CacheEvict(cacheNames = CacheNames.INDEX_IMG_KEY, key = "#shopId + ':' + #imgType") + public void deleteById(Long imgId, Long shopId, Integer imgType) { + indexImgMapper.deleteByIdAndShopId(imgId, shopId); + } + + @Override + @Cacheable(cacheNames = CacheNames.INDEX_IMG_KEY, key = "#shopId + ':' + #imgType", sync = true) + public List getListByShopId(Long shopId, Integer imgType) { + return indexImgMapper.getListByShopId(shopId, imgType); + } + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.INDEX_IMG_KEY, key = "#shopId+ ':' + 0"), + @CacheEvict(cacheNames = CacheNames.INDEX_IMG_KEY, key = "#shopId+ ':' + 1") + }) + public void offlineSpuBySpuIds(Long shopId, List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return; + } + indexImgMapper.offlineSpuBySpuIds(shopId, spuIds); + } + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.INDEX_IMG_KEY, key = "#shopId+ ':' + 0"), + @CacheEvict(cacheNames = CacheNames.INDEX_IMG_KEY, key = "#shopId+ ':' + 1") + }) + public void batchUpdate(Long spuId, Long shopId) { + indexImgMapper.batchUpdate(spuId); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/NoticeServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/NoticeServiceImpl.java new file mode 100644 index 0000000..1044860 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/NoticeServiceImpl.java @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.dto.NoticeDTO; +import com.tmerclub.cloud.multishop.mapper.NoticeMapper; +import com.tmerclub.cloud.multishop.model.Notice; +import com.tmerclub.cloud.multishop.model.ShopDetail; +import com.tmerclub.cloud.multishop.service.NoticeService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.vo.NoticeVO; +import org.apache.commons.lang.StringUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 公告 + * + * @author YXF + * @date 2020-11-25 17:57:56 + */ +@Service +public class NoticeServiceImpl implements NoticeService { + + @Autowired + private NoticeMapper noticeMapper; + + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + + @DubboReference + private UserFeignClient userFeignClient; + + @Autowired + private ShopDetailService shopDetailService; + + @Override + public PageVO page(PageDTO pageDTO, NoticeDTO noticeDTO) { + return PageUtil.doPage(pageDTO, () -> noticeMapper.list(noticeDTO)); + } + + @Override + public NoticeVO getById(Long id) { + NoticeVO noticeVO = noticeMapper.getById(id); + if (StringUtils.isNotBlank(noticeVO.getMultiShopIds())) { + List multiShopIds = Arrays.stream(noticeVO.getMultiShopIds().split(",")).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList()); + List shopDetails = shopDetailService.listByShopIds(multiShopIds); + List shopDetailList = shopDetails.stream().map(shopDetail -> { + ShopDetailVO shopDetailVO = new ShopDetailVO(); + shopDetailVO.setShopId(shopDetail.getShopId()); + shopDetailVO.setShopName(shopDetail.getShopName()); + shopDetailVO.setShopStatus(shopDetail.getShopStatus()); + shopDetailVO.setContactName(shopDetail.getContactName()); + shopDetailVO.setContactPhone(shopDetail.getContactPhone()); + return shopDetailVO; + }).collect(Collectors.toList()); + noticeVO.setShopDetailVOList(shopDetailList); + } + if (StringUtils.isNotBlank(noticeVO.getUserIds())) { + List userIds = Arrays.stream(noticeVO.getUserIds().split(",")).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList()); + //可见范围的用户信息 + ServerResponseEntity> userResponese = userFeignClient.getUserByUserIds(userIds); + if (userResponese.isSuccess()) { + noticeVO.setUserDtailList(userResponese.getData()); + } + } + //可见范围的供应商信息 + if (StringUtils.isNotBlank(noticeVO.getSupplierIds())) { + List supplierIds = Arrays.stream(noticeVO.getSupplierIds().split(",")).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList()); + ServerResponseEntity> supplierResponse = supplierDetailFeignClient.listBySupplierIds(supplierIds); + if (supplierResponse.isSuccess()) { + noticeVO.setSupplierDetailList(supplierResponse.getData()); + } + } + + return noticeVO; + } + + @Override + public void updateIsLearning(Long id) { + noticeMapper.updateIsLearning(id); + } + + @Override + public void save(Notice notice) { + notice.setId(null); + if (Objects.equals(notice.getStatus(), StatusEnum.ENABLE.value())) { + notice.setPublishTime(new Date()); + } + noticeMapper.save(notice); + } + + @Override + public void update(Notice notice) { + noticeMapper.update(notice); + } + + @Override + public void deleteById(Long id) { + noticeMapper.deleteById(id); + } + + @Override + @CacheEvict(cacheNames = CacheNames.NOTICES_KEY, key = "#shopId + ':' + #type") + public void removeCacheByShopIdAndType(Long shopId, Integer type) { + + } + + @Override + @Cacheable(cacheNames = CacheNames.NOTICES_KEY, key = "#shopId + ':' + #type") + public List getlistByShopId(Long shopId, Integer type) { + NoticeDTO noticeDTO = new NoticeDTO(); + noticeDTO.setShopId(shopId); + noticeDTO.setType(type); + noticeDTO.setStatus(StatusEnum.ENABLE.value()); + return noticeMapper.listAllByTypeAndShopId(noticeDTO); + } + + @Override + public PageVO pagePlatformNotice(PageDTO pageDTO, NoticeDTO noticeDTO) { + return PageUtil.doPage(pageDTO, () -> noticeMapper.list(noticeDTO)); + } + + @Override + public void saveBatch(List noticeList) { + for (Notice notice : noticeList) { + notice.setId(null); + if (Objects.equals(notice.getStatus(), StatusEnum.ENABLE.value())) { + notice.setPublishTime(new Date()); + } + } + noticeMapper.saveBatch(noticeList); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopAllinpayServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopAllinpayServiceImpl.java new file mode 100644 index 0000000..e799a1d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopAllinpayServiceImpl.java @@ -0,0 +1,63 @@ +package com.tmerclub.cloud.multishop.service.impl; + +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.common.bean.PaySettlementConfig; +import com.tmerclub.cloud.common.cache.constant.MultishopCacheNames; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.multishop.mapper.ShopDetailMapper; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.platform.service.SysConfigService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.Objects; + +/** + * @author TRACK + */ +@Service +public class ShopAllinpayServiceImpl implements ShopAllinpayService { + + @Autowired + private ShopDetailMapper shopDetailMapper; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @Autowired + private SysConfigService sysConfigService; + + @Override + @Cacheable(cacheNames = MultishopCacheNames.ALLINPAY_CONFIG_KEY, key = "'0'") + public boolean getIsAllinpay() { + String paySettlementConfigStr = sysConfigService.getValue(Constant.PAY_SETTLEMENT_CONFIG); + PaySettlementConfig paySettlementConfig = Json.parseObject(paySettlementConfigStr, PaySettlementConfig.class); + Integer paySettlementType = paySettlementConfig.getPaySettlementType(); + return Objects.equals(paySettlementType, 1); + } + + @Override + @CacheEvict(cacheNames = MultishopCacheNames.ALLINPAY_CONFIG_KEY, key = "'0'") + public void deleteAllinpayCache() { + } + + @Override + public void createAllinpayCompanyMember(Long shopId) { + ShopAllinpayService shopAllinpayService = (ShopAllinpayService) AopContext.currentProxy(); + if (shopAllinpayService.getIsAllinpay()) { + ServerResponseEntity serverResponse = allinpayFeignClient.batchCreateMember(Collections.singletonList(AllinpayConstant.SHOP + shopId)); + if (!serverResponse.isSuccess()) { + throw new LuckException(serverResponse.getMsg()); + } + // 更新店铺为已创建会员 + shopDetailMapper.updateShopIsCreate(Collections.singletonList(shopId)); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopApplyServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopApplyServiceImpl.java new file mode 100644 index 0000000..462922f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopApplyServiceImpl.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.constant.AuditStatus; +import com.tmerclub.cloud.multishop.mapper.ShopAuditingMapper; +import com.tmerclub.cloud.multishop.mapper.ShopCompanyMapper; +import com.tmerclub.cloud.multishop.mapper.ShopDetailMapper; +import com.tmerclub.cloud.multishop.model.ShopAuditing; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.service.ShopApplyService; +import com.tmerclub.cloud.multishop.vo.ShopAuditingVO; +import com.tmerclub.cloud.multishop.vo.ShopCompanyVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.Objects; + +/** + * @author lth + * @date 2021/4/29 17:23 + */ +@Service +public class ShopApplyServiceImpl implements ShopApplyService { + + @Autowired + private ShopAuditingMapper shopAuditingMapper; + + @Autowired + private ShopDetailMapper shopDetailMapper; + + @Autowired + private ShopCompanyMapper shopCompanyMapper; + @Autowired + private ShopAllinpayService shopAllinpayService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void apply(Long shopId) { + Date now = new Date(); + boolean isAllinpay = shopAllinpayService.getIsAllinpay(); + this.checkApplyInfo(shopId); + // 插入一条开店申请审核记录 + ShopAuditingVO byshopId = shopAuditingMapper.getByshopId(shopId); + ShopAuditing shopAuditing = new ShopAuditing(); + shopAuditing.setShopId(shopId); + shopAuditing.setUserId(isAllinpay ? null : AuthUserContext.get().getUserId()); + shopAuditing.setStatus(AuditStatus.WAITAUDIT.value()); + shopAuditing.setUpdateTime(now); + if (Objects.nonNull(byshopId)) { + shopAuditing.setShopAuditingId(byshopId.getShopAuditingId()); + shopAuditingMapper.update(shopAuditing); + } else { + shopAuditing.setCreateTime(now); + shopAuditingMapper.save(shopAuditing); + } + // 更新店铺状态为待审核 + shopDetailMapper.changeShopStatus(shopId, ShopStatus.OPEN_AWAIT_AUDIT.value()); + } + + private void checkApplyInfo(Long shopId) { + ShopDetailVO shopDetailVO = shopDetailMapper.getByShopId(shopId); + if (Objects.nonNull(shopDetailVO) && Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.OPEN_AWAIT_AUDIT.value())) { + throw new LuckException("店铺审核中,请不要重复提交"); + } + ShopCompanyVO shopCompanyVO = shopCompanyMapper.getShopCompanyByShopIdAndStatus(shopId, AuditStatus.WAITAUDIT.value()); + if (Objects.isNull(shopCompanyVO)) { + throw new LuckException("店铺工商信息未填写"); + } + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopDetailServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopDetailServiceImpl.java new file mode 100644 index 0000000..44c670b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopDetailServiceImpl.java @@ -0,0 +1,1188 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.biz.feign.AttachFileFeignClient; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.coupon.feign.CouponFeignClient; +import com.tmerclub.cloud.api.delivery.feign.SameCityFeignClient; +import com.tmerclub.cloud.api.discount.feign.DiscountFeignClient; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.live.feign.LiveFeignClient; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.bo.ShopSimpleBO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.product.feign.*; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.api.user.feign.PopupFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.*; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.ShopType; +import com.tmerclub.cloud.common.product.constant.SalesPriceType; +import com.tmerclub.cloud.common.product.constant.SalesType; +import com.tmerclub.cloud.common.product.dto.ProductSearchLimitDTO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.multishop.constant.AuditStatus; +import com.tmerclub.cloud.multishop.dto.*; +import com.tmerclub.cloud.multishop.mapper.CompanyAuditingMapper; +import com.tmerclub.cloud.multishop.mapper.ShopDetailMapper; +import com.tmerclub.cloud.multishop.mapper.ShopUserMapper; +import com.tmerclub.cloud.multishop.mapper.ShopWalletMapper; +import com.tmerclub.cloud.multishop.model.*; +import com.tmerclub.cloud.multishop.service.*; +import com.tmerclub.cloud.multishop.vo.*; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 店铺详情 + * + * @author FrozenWatermelon + * @date 2020-11-23 16:24:29 + */ +@Service +public class ShopDetailServiceImpl implements ShopDetailService { + private static final Logger log = LoggerFactory.getLogger(ShopDetailServiceImpl.class); + + @Autowired + private ShopDetailMapper shopDetailMapper; + @Autowired + private ShopCompanyService shopCompanyService; + @Autowired + private ShopAuditingService shopAuditingService; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @Autowired + private ShopWalletMapper shopWalletMapper; + @Autowired + private ShopUserService shopUserService; + @Autowired + private ShopExtensionService shopExtensionService; + @DubboReference + private AccountFeignClient accountFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + @Autowired + private ShopUserMapper shopUserMapper; + @DubboReference + private BrandFeignClient brandFeignClient; + @DubboReference + private OfflineHandleEventFeignClient offlineHandleEventFeignClient; + @DubboReference + private NotifyFeignClient notifyFeignClient; + @Autowired + private ShopBankCardService shopBankCardService; + @DubboReference + private CategoryShopFeignClient categoryShopFeignClient; + @DubboReference + private BrandShopFeignClient brandShopFeignClient; + @DubboReference + private SameCityFeignClient sameCityFeignClient; + @DubboReference + private ShopCartFeignClient shopCartFeignClient; + @DubboReference + private AttachFileFeignClient attachFileFeignClient; + @DubboReference + private SeckillFeignClient seckillFeignClient; + @Autowired + private IndexImgService indexImgService; + @DubboReference + private DiscountFeignClient discountFeignClient; + @DubboReference + private CouponFeignClient couponFeignClient; + @Autowired + private ShopSubstituteSalesService shopSubstituteSalesService; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @Autowired + private ShopAllinpayService shopAllinpayService; + @Autowired + private CompanyAuditingMapper companyAuditingMapper; + @DubboReference + private LiveFeignClient liveFeignClient; + @DubboReference + private WarehouseFeignClient warehouseFeignClient; + @DubboReference + private PopupFeignClient popupFeignClient; + + private static final String DONT_HAVE = "用户不存在。"; + + @Override + public PageVO page(PageDTO pageDTO, ShopDetailDTO shopDetailDTO) { + Integer paySysType = shopAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + shopDetailDTO.setPaySysType(paySysType); + PageVO page = PageUtil.doPage(pageDTO, () -> shopDetailMapper.list(shopDetailDTO)); + if (shopAllinpayService.getIsAllinpay()) { + for (ShopDetailVO shopDetailVO : page.getList()) { + setAllinpayShopStatus(shopDetailVO); + } + } + return page; + } + + @Override + @Cacheable(cacheNames = CacheNames.SHOP_DETAIL_ID_KEY, key = "#shopId") + public ShopDetailVO getByShopId(Long shopId) { + ShopDetailVO shopDetailVO = shopDetailMapper.getByShopId(shopId); + boolean shopTypeCheck = Objects.nonNull(shopDetailVO) && !Objects.equals(shopDetailVO.getShopId(),Constant.PLATFORM_SHOP_ID); + if (shopTypeCheck && shopAllinpayService.getIsAllinpay()) { + // 通联是上线待审核的话店铺状态也做对应展示 + setAllinpayShopStatus(shopDetailVO); + } + return shopDetailVO; + } + + private static void setAllinpayShopStatus(ShopDetailVO shopDetailVO) { + if (Objects.isNull(shopDetailVO)) { + return; + } + if (Objects.equals(shopDetailVO.getAllinpayShopStatus(), AllinpayShopStatus.WAIT_AUDIT.value())) { + shopDetailVO.setShopStatus(ShopStatus.OFFLINE_AWAIT_AUDIT.value()); + } + if (Objects.equals(shopDetailVO.getAllinpayShopStatus(), AllinpayShopStatus.OPEN_WAIT_AUDIT.value())) { + shopDetailVO.setShopStatus(ShopStatus.OPEN_AWAIT_AUDIT.value()); + } + if (Objects.equals(shopDetailVO.getAllinpayShopStatus(), AllinpayShopStatus.OFFLINE.value()) || + Objects.equals(shopDetailVO.getAllinpayShopStatus(), AllinpayShopStatus.UN_AVAILABLE.value())) { + shopDetailVO.setShopStatus(ShopStatus.OFFLINE.value()); + } + if (Objects.equals(shopDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.FAIL.value()) + && Objects.equals(shopDetailVO.getAllinpayShopStatus(), AllinpayShopStatus.OFFLINE.value())) { + shopDetailVO.setShopStatus(ShopStatus.AUDIT_FAIL.value()); + } + } + + @Override + @CacheEvict(cacheNames = CacheNames.SHOP_DETAIL_ID_KEY, key = "#shopDetailDTO.shopId") + @Transactional(rollbackFor = Exception.class) + public void update(ShopDetailDTO shopDetailDTO) { + ShopDetail shopDetail = BeanUtil.map(shopDetailDTO, ShopDetail.class); + // 若经纬度数据变更,需清空同城配送中的位置信息 + ShopDetailVO dbShopDetail = shopDetailMapper.getByShopId(shopDetail.getShopId()); + if (!PrincipalUtil.isDbPhone(shopDetail.getContactPhone(), dbShopDetail.getContactPhone(), false)) { + throw new LuckException("请输入正确的手机号"); + } + if (shopDetail.getContactPhone().contains(Constant.ASTERISK)) { + shopDetail.setContactPhone(dbShopDetail.getContactPhone()); + } + // 给还没创建通联会员的商家创建 + if (shopAllinpayService.getIsAllinpay() && Objects.equals(dbShopDetail.getIsCreateMember(), 0)) { + createAllinpayMemberByShopId(shopDetail.getShopId()); + } + this.checkShopInfo(shopDetailDTO, false); + + // 更新商品 + spuFeignClient.updateSpuByShopId(shopDetail.getShopId(), SysTypeEnum.MULTISHOP.value()); + shopDetailMapper.update(shopDetail); + } + + @Override + @CacheEvict(cacheNames = CacheNames.SHOP_DETAIL_ID_KEY, key = "#shopId") + public void deleteById(Long shopId) { + shopDetailMapper.deleteById(shopId); + } + + @Override + public List listByShopIds(List shopIds) { + if (CollUtil.isEmpty(shopIds)) { + return new ArrayList<>(0); + } + return shopDetailMapper.listByShopIds(shopIds); + } + + @Override + public PageVO shopSearchPage(PageDTO pageDTO, ShopDetailDTO shopDetailDTO) { + shopDetailDTO.setPaySysType(shopAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value()); + PageVO page = PageUtil.doPage(pageDTO, () -> shopDetailMapper.shopSearchList(shopDetailDTO)); + List spuIds = page.getList().stream().map(ShopDetailAppVO::getShopId).collect(Collectors.toList()); + if (Objects.isNull(shopDetailDTO.getSpuNum()) || shopDetailDTO.getSpuNum() <= 0) { + return page; + } + ProductSearchLimitDTO productSearchLimitDTO = new ProductSearchLimitDTO(shopDetailDTO.getSpuNum()); + productSearchLimitDTO.setShopIds(spuIds); + ServerResponseEntity> spuResponse = searchSpuFeignClient.limitSpuList(productSearchLimitDTO); + if (!Objects.equals(spuResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(spuResponse.getMsg()); + } else if (CollUtil.isEmpty(spuResponse.getData())) { + return page; + } + List data = spuResponse.getData(); + Map> shopMap = data.stream().collect(Collectors.groupingBy(SpuSearchVO::getShopId)); + for (ShopDetailAppVO shopDetail : page.getList()) { + List spuSearchVOList = shopMap.get(shopDetail.getShopId()); + if (CollUtil.isEmpty(spuSearchVOList)) { + spuSearchVOList = new ArrayList<>(0); + } + shopDetail.setSpuList(spuSearchVOList); + } + return page; + } + + @Override + public ShopDetailVO getShopByShopId(Long shopId) { + return shopDetailMapper.getShopByShopId(shopId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void applyShop(ShopDetailDTO shopDetailDTO) { + checkShopInfo(shopDetailDTO, true); + ShopDetail newShopDetail = BeanUtil.map(shopDetailDTO, ShopDetail.class); + // 申请开店 + newShopDetail.setShopStatus(ShopStatus.APPLYING.value()); + newShopDetail.setType(ShopType.STOP.value()); + shopDetailMapper.save(newShopDetail); + shopDetailDTO.setShopId(newShopDetail.getShopId()); + + // 插入一条审核记录 + ShopAuditing auditing = new ShopAuditing(); + auditing.setShopId(newShopDetail.getShopId()); + auditing.setCreateTime(new Date()); + auditing.setStatus(AuditStatus.WAITAUDIT.value()); + auditing.setUpdateTime(new Date()); + auditing.setRemarks(shopDetailDTO.getRemarks()); + shopAuditingService.save(auditing); + // 创建账号 + createShopAccount(shopDetailDTO, StatusEnum.DELETE); + } + + /** + * 审核商家信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void audit(ShopAuditingDTO shopAuditingDTO) { + Date now = new Date(); + ShopAuditingVO dbShopAyditing = shopAuditingService.getByshopId(shopAuditingDTO.getShopId()); + if (Objects.isNull(dbShopAyditing)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + shopAuditingDTO.setShopAuditingId(dbShopAyditing.getShopAuditingId()); + // 非待审核的店铺,不能再进行审核 + if (!Objects.equals(dbShopAyditing.getStatus(), AuditStatus.WAITAUDIT.value())) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + // 修改店铺状态 + ShopDetailVO shopDetailVO = getByShopId(shopAuditingDTO.getShopId()); + if (shopDetailVO == null) { + // 店铺信息不存在 + throw new LuckException("店铺信息不存在"); + } + // 查询店铺账号(审核期间店铺有且仅有一个账号) + ShopUserDTO shopUserDTO = new ShopUserDTO(); + shopUserDTO.setShopId(shopDetailVO.getShopId()); + List shopUserVOList = shopUserService.listShopUser(shopUserDTO); + if (CollectionUtils.isEmpty(shopUserVOList)) { + throw new LuckException("店铺账号不存在"); + } + ShopUserVO shopUserVO = shopUserVOList.get(0); + // 修改店铺账号缓存信息 + ShopDetail shopDetail = BeanUtil.map(shopDetailVO, ShopDetail.class); + UidInfoBO uidInfoBO = new UidInfoBO(); + uidInfoBO.setUserId(shopUserVO.getShopUserId()); + uidInfoBO.setUsername(shopUserVO.getNickName()); + uidInfoBO.setSysType(SysTypeEnum.MULTISHOP.value()); + uidInfoBO.setTenantId(shopAuditingDTO.getShopId()); + uidInfoBO.setIsAdmin(UserAdminType.ADMIN.value()); + // 审核不通过 + if (Objects.equals(shopAuditingDTO.getStatus(), AuditStatus.FAILAUDIT.value())) { + if (!shopAllinpayService.getIsAllinpay() || !Objects.equals(shopDetailVO.getType(), ShopType.SELF_SHOP.value())) { + shopDetail.setShopStatus(ShopStatus.APPLYING.value()); + } + } + // 审核通过 + else { + shopDetail.setType(shopAuditingDTO.getShopType()); + if (shopAllinpayService.getIsAllinpay()) { + shopDetail.setShopStatus(ShopStatus.OPEN.value()); + } else { + handleContract(shopDetail, shopAuditingDTO.getContractStartTime(), shopAuditingDTO.getContractEndTime(), now); + } + shopDetail.setIsPreferred(IsPassShopEnum.NO.value()); + updateShopCompanyStatus(shopDetail.getShopId(), AuditStatus.SUCCESSAUDIT.value()); + if (!shopAllinpayService.getIsAllinpay()) { + uidInfoBO.setIsPassShop(IsPassShopEnum.YES.value()); + uidInfoBO.setSysType(SysTypeEnum.MULTISHOP.value()); + ServerResponseEntity updateTenantIdRes = accountFeignClient.updateNoAuditUidInfo(uidInfoBO); + if (!updateTenantIdRes.isSuccess()) { + throw new LuckException("审核失败"); + } + } + // 把商家自定义品牌添加为平台品牌 + brandFeignClient.updateCustomBrandToPlatformBrandByShopId(shopAuditingDTO.getShopId(), SysTypeEnum.MULTISHOP.value()); + // 新店初始化事件 (分销设置(暂无)), 分销设置是平台统一设置,店铺暂无分销设置 + // 创建默认仓库 + warehouseFeignClient.createWarehouseByShopId(shopAuditingDTO.getShopId(), SysTypeEnum.MULTISHOP.value(), shopDetail.getContactPhone(), shopDetail.getContactName()); + } + shopAuditingDTO.setAuditorId(Objects.isNull(AuthUserContext.get()) ? null : AuthUserContext.get().getUserId()); + shopAuditingService.update(BeanUtil.map(shopAuditingDTO, ShopAuditing.class)); + shopDetailMapper.update(shopDetail); + } + + private void handleContract(ShopDetail shopDetail, Date startTime, Date endTime, Date now) { + shopDetail.setContractStartTime(DateUtil.beginOfDay(startTime)); + shopDetail.setContractEndTime(Objects.isNull(endTime) ? endTime : getSaveEndOfDay(endTime)); + if ( now.compareTo(shopDetail.getContractStartTime()) >= 0 && (Objects.isNull(shopDetail.getContractEndTime()) || now.compareTo(shopDetail.getContractEndTime()) < 0)) { + // 如果店铺的签约时间包含当前时间,则把店铺状态置为营业中 + shopDetail.setShopStatus(ShopStatus.OPEN.value()); + } else { + // 如果店铺的签约时间不包含当前时间,则把店铺状态置为停业中 + shopDetail.setShopStatus(ShopStatus.STOP.value()); + } + } + + /** + * 更新店铺工商信息审核状态 + * @param shopId + * @param status + */ + private void updateShopCompanyStatus(Long shopId, Integer status) { + ShopCompanyVO shopCompanyWaitAudit = shopCompanyService.getShopCompanyByShopIdAndStatus(shopId, AuditStatus.WAITAUDIT.value()); + if (Objects.isNull(shopCompanyWaitAudit)) { + throw new LuckException("缺少店铺工商资料"); + } + ShopCompany shopCompany = BeanUtil.map(shopCompanyWaitAudit, ShopCompany.class); + shopCompany.setStatus(status); + shopCompanyService.updateByShopId(shopCompany, shopId, 0); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void changeSpuStatus(Long shopId, Integer shopStatus) { + shopDetailMapper.changeShopStatus(shopId, shopStatus); + // 店铺 + if (!StatusEnum.offlineOrDelete(shopStatus)) { + return; + } + // 将该店铺所有的商品下线 + ServerResponseEntity spuResponse = spuFeignClient.offlineSpuByShopId(shopId); + if (!Objects.equals(spuResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(spuResponse.getMsg()); + } + } + + @Override + @CacheEvict(cacheNames = CacheNames.SHOP_DETAIL_ID_KEY, key = "#shopId") + public void removeCacheByShopId(Long shopId) { + } + + @Override + public EsShopDetailBO shopExtensionData(Long shopId) { + return shopDetailMapper.shopExtensionData(shopId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void createShop(ShopDetailDTO shopDetailDTO) { + checkShopInfo(shopDetailDTO, true); + ShopDetail shopDetail = BeanUtil.map(shopDetailDTO, ShopDetail.class); + // 赋默认值 + shopDetail.setType(ShopType.STOP.value()); + shopDetail.setShopStatus(ShopStatus.APPLYING.value()); + shopDetailMapper.save(shopDetail); + // 通联创建企业会员 + shopAllinpayService.createAllinpayCompanyMember(shopDetail.getShopId()); + // 创建店铺数据 + addShopInfo(shopDetail.getShopId()); + + Long shopUserId = AuthUserContext.get().getUserId(); + // 更新文件记录表中shopId + ServerResponseEntity attachRes = attachFileFeignClient.updateShopIdByUid(shopDetail.getShopId()); + if (!attachRes.isSuccess()) { + throw new LuckException(attachRes.getMsg()); + } + // 保存shopId到店铺用户表 + if (shopUserMapper.updateShopIdByShopUserId(shopDetail.getShopId(), shopUserId) != 1) { + throw new LuckException("保存店铺信息错误"); + } + // 保存shopId到账号表 + UidInfoBO userInfoInTokenBO = AuthUserContext.get(); + userInfoInTokenBO.setTenantId(shopDetail.getShopId()); + ServerResponseEntity updateTenantIdRes = accountFeignClient.updateNoAuditUidInfo(userInfoInTokenBO); + if (!updateTenantIdRes.isSuccess()) { + throw new LuckException(updateTenantIdRes.getMsg()); + } + + // 保存店铺代销设置默认值 + ShopSubstituteSales shopSubstituteSales = new ShopSubstituteSales(); + shopSubstituteSales.setShopId(shopDetail.getShopId()); + shopSubstituteSales.setSalesType(SalesType.MANUAL_OPERATION_PRICE.value()); + shopSubstituteSales.setOrderShape(0); + shopSubstituteSales.setSalesPriceType(SalesPriceType.PROPORTION_PRICE.value()); + shopSubstituteSales.setSalesPrice(0L); + shopSubstituteSalesService.save(shopSubstituteSales); + } + + @Override + public List getShopDetailByShopIdsShopName(List shopIds, String shopName) { + return shopDetailMapper.getShopDetailByShopIdsShopName(null, shopName); + } + + @Override + public ShopDetailVO getShoExtensionsByShopId(Long shopId) { + ShopDetailVO shopDetailVO = shopDetailMapper.getShopExtensionsByShopId(shopId); + // 通联是上线待审核的话店铺状态也做对应展示 + setAllinpayShopStatus(shopDetailVO); + return shopDetailVO; + } + + @Override + public Integer countByMobile(String mobile) { + return shopDetailMapper.countByMobile(mobile); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.SHOP_DETAIL_ID_KEY, key = "#shopDetailVO.shopId") + @GlobalTransactional(rollbackFor = Exception.class) + public void offline(ShopDetailVO shopDetailVO, String offlineReason, Long sysUserId) { + Integer sysType = SysTypeEnum.MULTISHOP.value(); + // 添加下线处理记录 + OfflineHandleEventDTO offlineHandleEventDTO = new OfflineHandleEventDTO(); + offlineHandleEventDTO.setHandleId(shopDetailVO.getShopId()); + offlineHandleEventDTO.setHandleType(OfflineHandleEventType.SHOP.getValue()); + offlineHandleEventDTO.setOfflineReason(offlineReason); + offlineHandleEventDTO.setHandlerId(sysUserId); + offlineHandleEventDTO.setSysType(sysType); + offlineHandleEventDTO.setStatus(shopAllinpayService.getIsAllinpay() ? OfflineHandleEventStatus.APPLY_BY_SHOP.getValue() : OfflineHandleEventStatus.OFFLINE_BY_PLATFORM.getValue()); + offlineHandleEventDTO.setShopId(shopDetailVO.getShopId()); + ServerResponseEntity processingEventByHandleTypeAndHandleId = offlineHandleEventFeignClient.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.SHOP.getValue(), shopDetailVO.getShopId(), sysType); + if (processingEventByHandleTypeAndHandleId.isSuccess() && Objects.nonNull(processingEventByHandleTypeAndHandleId.getData())) { + offlineHandleEventFeignClient.update(offlineHandleEventDTO); + } else { + offlineHandleEventFeignClient.save(offlineHandleEventDTO); + } + // 更新店铺状态为下线 + shopDetailMapper.changeShopStatus(shopDetailVO.getShopId(), ShopStatus.OFFLINE.value()); + + // 将店铺所有商品下线 + ServerResponseEntity spuResponseEntity = spuFeignClient.offlineSpuByShopId(shopDetailVO.getShopId()); + if (!spuResponseEntity.isSuccess()) { + throw new LuckException(spuResponseEntity.getMsg()); + } + + // 失效秒杀活动 + ServerResponseEntity seckillResponseEntity = seckillFeignClient.offlineSeckillByShopId(shopDetailVO.getShopId()); + if (!seckillResponseEntity.isSuccess()) { + throw new LuckException(seckillResponseEntity.getMsg()); + } + + // 下线满减优惠券直播活动 + offlineShopActivity(Collections.singletonList(shopDetailVO.getShopId()), ShopStatus.STOP.value()); + + //解绑平台轮播图商品 + offlineIndexImg(shopDetailVO.getShopId()); + + // 失效弹窗 + ServerResponseEntity response = popupFeignClient.offlineShop(shopDetailVO.getShopId()); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + + private void offlineIndexImg(Long shopId) { + ServerResponseEntity> spuIdsEntity = spuFeignClient.listSpuIdsByShopId(shopId); + if (!spuIdsEntity.isSuccess()) { + throw new LuckException(spuIdsEntity.getMsg()); + } + List spuIds = spuIdsEntity.getData(); + if (CollUtil.isNotEmpty(spuIds)) { + indexImgService.offlineSpuBySpuIds(Constant.PLATFORM_SHOP_ID, spuIds); + } + } + + @Override + public Long countByShopStatus(Integer shopStatus) { + return shopDetailMapper.countByShopStatus(shopStatus); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void platformCreateShop(ShopCreateInfoDTO shopCreateInfoDTO) { + boolean isAllinpay = shopAllinpayService.getIsAllinpay(); + // 1、校验验证码信息 + ShopUserRegisterDTO shopUserRegisterInfo = shopCreateInfoDTO.getShopUserRegisterInfo(); + ServerResponseEntity sendNotifyResponse = notifyFeignClient.checkValidCode(shopUserRegisterInfo.getMobile(), shopUserRegisterInfo.getValidCode(), SendTypeEnum.VALID); + Boolean data = sendNotifyResponse.getData(); + if (Objects.equals(sendNotifyResponse.getCode(), ResponseEnum.OK.value()) && Objects.nonNull(data) && !data) { + throw new LuckException("验证码有误或已过期!"); + } + // 2、保存店铺基本信息 + Date now = new Date(); + ShopDetailDTO shopDetailDTO = shopCreateInfoDTO.getShopDetail(); + this.checkShopInfo(shopDetailDTO, true); + ShopDetail shopDetail = saveAndGetShopDetail(now, shopDetailDTO, isAllinpay); + // 通联创建企业会员 + shopAllinpayService.createAllinpayCompanyMember(shopDetail.getShopId()); + Long shopId = shopDetail.getShopId(); + // 3、保存店铺账号信息 + ShopUser shopUser = new ShopUser(); + shopUser.setNickName(shopUserRegisterInfo.getUsername()); + shopUser.setPhoneNum(shopUserRegisterInfo.getMobile()); + shopUser.setHasAccount(1); + shopUser.setShopId(shopId); + shopUserService.save(shopUser, null); + // 4、初始化店铺数据 + addShopInfo(shopId); + // 5、初始化店铺审核信息,平台端创建店铺默认为审核成功 + ShopAuditing shopAuditing = new ShopAuditing(); + shopAuditing.setShopId(shopId); + shopAuditing.setUserId(shopUser.getShopUserId()); + shopAuditing.setAuditorId(AuthUserContext.get().getUserId()); + shopAuditing.setStatus(isAllinpay ? AuditStatus.WAITAUDIT.value() : AuditStatus.SUCCESSAUDIT.value()); + shopAuditingService.save(shopAuditing); + // 6、保存店铺工商信息 + ShopCompanyDTO shopCompanyDTO = shopCreateInfoDTO.getShopCompany(); + shopCompanyDTO.setShopId(shopDetail.getShopId()); + ShopCompany shopCompany = BeanUtil.map(shopCompanyDTO, ShopCompany.class); + shopCompany.setStatus(isAllinpay ? AuditStatus.WAITAUDIT.value() : AuditStatus.SUCCESSAUDIT.value()); + shopCompanyService.save(shopCompany, true); + + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setPhone(shopUserRegisterInfo.getMobile()); + authAccountDTO.setPassword(shopUserRegisterInfo.getPassword()); + authAccountDTO.setStatus(StatusEnum.ENABLE.value()); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + authAccountDTO.setIsAdmin(UserAdminType.ADMIN.value()); + authAccountDTO.setTenantId(shopId); + authAccountDTO.setIsPassShop(isAllinpay ? IsPassShopEnum.NO.value() : IsPassShopEnum.YES.value()); + authAccountDTO.setUsername(shopUserRegisterInfo.getUsername()); + authAccountDTO.setUserId(shopUser.getShopUserId()); + ServerResponseEntity save = accountFeignClient.save(authAccountDTO); + if (!Objects.equals(save.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(save.getMsg()); + } + // 8、保存分类签约信息 + ServerResponseEntity categoryRes = categoryShopFeignClient.insertBatchByShopId(shopCreateInfoDTO.getCategorySigningList(), shopId, SysTypeEnum.MULTISHOP.value()); + if (!categoryRes.isSuccess()) { + throw new LuckException(categoryRes.getMsg()); + } + // 9、保存品牌签约信息 + ServerResponseEntity brandRes = brandShopFeignClient.insertBatchByShopId(shopCreateInfoDTO.getBrandSigningList(), shopId, SysTypeEnum.MULTISHOP.value()); + if (!brandRes.isSuccess()) { + throw new LuckException(brandRes.getMsg()); + } + + // 保存店铺代销设置默认值 + ShopSubstituteSales shopSubstituteSales = new ShopSubstituteSales(); + shopSubstituteSales.setShopId(shopDetail.getShopId()); + shopSubstituteSales.setSalesType(SalesType.MANUAL_OPERATION_PRICE.value()); + shopSubstituteSales.setOrderShape(0); + shopSubstituteSalesService.save(shopSubstituteSales); + // 7、保存店铺银行卡信息 + saveShopBankCard(shopCreateInfoDTO, shopId, shopCompany); + + // 10、保存仓库信息 + ServerResponseEntity warehouseRes = warehouseFeignClient.createWarehouseByShopId(shopId, SysTypeEnum.MULTISHOP.value(), shopDetailDTO.getContactPhone(), shopDetailDTO.getContactName()); + if (!warehouseRes.isSuccess()) { + throw new LuckException(warehouseRes.getMsg()); + } + } + + private ShopDetail saveAndGetShopDetail(Date now, ShopDetailDTO shopDetailDTO, boolean isAllinpay) { + ShopDetail shopDetail = BeanUtil.map(shopDetailDTO, ShopDetail.class); + if (!isAllinpay) { + if (Objects.isNull(shopDetail.getContractStartTime())) { + throw new LuckException("店铺签约时间不能为空"); + } + handleContract(shopDetail, shopDetail.getContractStartTime(), shopDetail.getContractEndTime(), now); + } else { + shopDetail.setShopStatus(ShopStatus.OPEN.value()); + shopDetail.setType(ShopType.SELF_SHOP.value()); + } + shopDetail.setIsPreferred(IsPassShopEnum.NO.value()); + shopDetailMapper.save(shopDetail); + return shopDetail; + } + + private void saveShopBankCard(ShopCreateInfoDTO shopCreateInfoDTO, Long shopId, ShopCompany shopCompany) { + if (shopAllinpayService.getIsAllinpay()) { + AllinpayShopBankCardDTO allinpayShopBankCardDTO = shopCreateInfoDTO.getAllinpayShopBankCardDTO(); + if (Objects.isNull(allinpayShopBankCardDTO)) { + throw new LuckException("至少绑定一个对公户账户"); + } + // 设置企业信息 + shopBankCardService.insertAndSetCompanyInfo(allinpayShopBankCardDTO, shopId, BeanUtil.map(shopCompany, ShopCompanyVO.class)); + } else { + shopBankCardService.insertBatch(shopCreateInfoDTO.getShopBankCardList(), shopId); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void changeShopStatusByContractTime(Date now) { + // 获取状态需要改变为停业状态的店铺id列表 + List shopIdsToStop = shopDetailMapper.listShopIdsOfStatusChangeToStopByContractTime(now); + // 获取状态需要改变为营业状态的店铺id列表 + List shopIdsToOpen = shopDetailMapper.listShopIdsOfStatusChangeToOpenByContractTime(now); + if (CollUtil.isEmpty(shopIdsToStop) && CollUtil.isEmpty(shopIdsToOpen)) { + // 没有店铺状态需要改变 + return; + } + // 根据签约时间修改店铺状态 + shopDetailMapper.changeShopStatusByContractTime(now); + if (CollUtil.isNotEmpty(shopIdsToStop)) { + // 失效商品活动信息,不需要下架商品 + spuFeignClient.offlineSpuActivityByShopIds(shopIdsToStop); + // 下架店铺商品 + spuFeignClient.offlineSpuByShopIds(shopIdsToStop); + } + // 修改购物车项中店铺是否停业属性 + ServerResponseEntity shopCartToStopRes = shopCartFeignClient.updateIsClosedByShopIds(shopIdsToStop, 0); + if (!shopCartToStopRes.isSuccess()) { + throw new LuckException(shopCartToStopRes.getMsg()); + } + ServerResponseEntity shopCartToOpenRes = shopCartFeignClient.updateIsClosedByShopIds(shopIdsToOpen, 1); + if (!shopCartToOpenRes.isSuccess()) { + throw new LuckException(shopCartToOpenRes.getMsg()); + } + // 下线优惠券满减活动 + offlineShopActivity(shopIdsToStop, ShopStatus.STOP.value()); + if (CollUtil.isNotEmpty(shopIdsToStop)) { + ServerResponseEntity response = popupFeignClient.deleteShopLinkBatch(shopIdsToOpen); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.SHOP_DETAIL_ID_KEY, key = "#shopSigningInfoDTO.shopId") + public void updateSigningInfo(ShopSigningInfoDTO shopSigningInfoDTO) { + ShopDetailVO oldShopDetail = shopDetailMapper.getByShopId(shopSigningInfoDTO.getShopId()); + ShopDetail newShopDetail = BeanUtil.map(oldShopDetail, ShopDetail.class); + // 赋值 + newShopDetail.setType(shopSigningInfoDTO.getType()); + newShopDetail.setContractStartTime(DateUtil.beginOfDay(shopSigningInfoDTO.getContractStartTime())); + newShopDetail.setContractEndTime(Objects.isNull(shopSigningInfoDTO.getContractEndTime()) ? null : getSaveEndOfDay(shopSigningInfoDTO.getContractEndTime())); + // 当店铺状态处于营业中或者停业中时,店铺状态会受签约时间改变 + if (Objects.equals(newShopDetail.getShopStatus(), ShopStatus.OPEN.value()) || Objects.equals(newShopDetail.getShopStatus(), ShopStatus.STOP.value())) { + Date now = new Date(); + // 记录店铺状态是否发生改变 + boolean isChangeStatus = false; + boolean isContain = now.compareTo(newShopDetail.getContractStartTime()) >= 0 && (Objects.isNull(newShopDetail.getContractEndTime()) || now.compareTo(newShopDetail.getContractEndTime()) < 0); + if (isContain || shopAllinpayService.getIsAllinpay()) { + // 如果店铺的签约时间包含当前时间,则把店铺状态置为营业中 + isChangeStatus = Objects.equals(oldShopDetail.getShopStatus(), ShopStatus.STOP.value()); + newShopDetail.setShopStatus(ShopStatus.OPEN.value()); + shopDetailMapper.update(newShopDetail); + } else if (now.compareTo(newShopDetail.getContractStartTime()) < 0 || now.compareTo(newShopDetail.getContractEndTime()) >= 0) { + // 如果店铺的签约时间不包含当前时间,则把店铺状态置为停业中 + isChangeStatus = Objects.equals(oldShopDetail.getShopStatus(), ShopStatus.OPEN.value()); + newShopDetail.setShopStatus(ShopStatus.STOP.value()); + shopDetailMapper.update(newShopDetail); + } + ServerResponseEntity spuRes = spuFeignClient.updateSpuUpdateTimeByShopIds(Collections.singletonList(shopSigningInfoDTO.getShopId()), SysTypeEnum.MULTISHOP.value()); + if (!spuRes.isSuccess()) { + throw new LuckException(spuRes.getMsg()); + } + // 如果店铺状态发生变化 + if (isChangeStatus) { + // 更新购物车项店铺是否停业状态 + ServerResponseEntity shopCartRes = shopCartFeignClient.updateIsClosedByShopIds(Collections.singletonList(newShopDetail.getShopId()), Objects.equals(newShopDetail.getShopStatus(), ShopStatus.STOP.value()) ? 0 : 1); + if (!shopCartRes.isSuccess()) { + throw new LuckException(shopCartRes.getMsg()); + } + if (Objects.equals(oldShopDetail.getShopStatus(), ShopStatus.OPEN.value())) { + // 店铺营业状态变为停业,需要下架商品活动 + ServerResponseEntity offlineSpuActivityResp = spuFeignClient.offlineSpuActivityByShopIds(Collections.singletonList(newShopDetail.getShopId())); + if (!offlineSpuActivityResp.isSuccess()) { + log.info("店铺营业状态变为停业,下架商品活动失败,店铺id:{}", newShopDetail.getShopId()); + throw new LuckException(offlineSpuActivityResp.getMsg()); + } + // 下架店铺商品 + ServerResponseEntity offlineSpuResp = spuFeignClient.offlineSpuByShopIds(Collections.singletonList(newShopDetail.getShopId())); + if (!offlineSpuResp.isSuccess()) { + log.info("店铺营业状态变为停业,下架店铺商品失败,店铺id:{}", newShopDetail.getShopId()); + throw new LuckException(offlineSpuResp.getMsg()); + } + // 下线满减和优惠券活动 + offlineShopActivity(Collections.singletonList(newShopDetail.getShopId()), ShopStatus.STOP.value()); + } + } + } + // 店铺违规下线、违规提交审核时,修改签约时间和店铺类型,不修改状态 + else { + shopDetailMapper.update(newShopDetail); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.SHOP_DETAIL_ID_KEY, key = "#offlineHandleEventDTO.handleId") + public void auditApply(OfflineHandleEventDTO offlineHandleEventDTO) { + ShopDetailVO shopDetailVO = getByShopId(offlineHandleEventDTO.getHandleId()); + if (Objects.isNull(shopDetailVO)) { + throw new LuckException("店铺不存在"); + } + if (!Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.OFFLINE.value())) { + throw new LuckException("店铺状态已发生变化,请刷新后重试"); + } + // 更新事件状态 + ServerResponseEntity offlineRes = offlineHandleEventFeignClient.updateToApply(offlineHandleEventDTO); + if (!offlineRes.isSuccess()) { + throw new LuckException(offlineRes.getMsg()); + } + // 更改店铺状态为上线申请待审核 + shopDetailMapper.changeShopStatus(offlineHandleEventDTO.getHandleId(), ShopStatus.OFFLINE_AWAIT_AUDIT.value()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.SHOP_DETAIL_ID_KEY, key = "#offlineHandleEventDTO.handleId") + public void onlineAudit(OfflineHandleEventDTO offlineHandleEventDTO) { + ShopDetailVO shopDetail = getByShopId(offlineHandleEventDTO.getHandleId()); + if (Objects.isNull(shopDetail)) { + throw new LuckException("店铺不存在"); + } + if (!Objects.equals(shopDetail.getShopStatus(), ShopStatus.OFFLINE_AWAIT_AUDIT.value())) { + throw new LuckException("店铺状态已发生变化,请刷新后重试"); + } + // 审核 + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.auditOfflineEvent(offlineHandleEventDTO); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + Long shopId = offlineHandleEventDTO.getHandleId(); + // 审核通过 + if (Objects.equals(offlineHandleEventDTO.getStatus(), OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue())) { + Date now = new Date(); + auditSuccess(shopDetail, now, shopId); + } + // 审核不通过 + else if (Objects.equals(offlineHandleEventDTO.getStatus(), OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue())) { + shopDetailMapper.changeShopStatus(shopId, ShopStatus.OFFLINE.value()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.SHOP_DETAIL_ID_KEY, key = "#offlineHandleEventDTO.handleId") + public void onlineOpenShop(OfflineHandleEventDTO offlineHandleEventDTO) { + if (!shopAllinpayService.getIsAllinpay()) { + throw new LuckException("开通通联支付后才可以直接上线商家"); + } + ShopDetailService shopDetailService = (ShopDetailService) AopContext.currentProxy(); + ShopDetailVO shopDetail = shopDetailService.getByShopId(offlineHandleEventDTO.getHandleId()); + if (Objects.isNull(shopDetail)) { + throw new LuckException("店铺不存在"); + } + if (!Objects.equals(shopDetail.getShopStatus(), ShopStatus.OFFLINE_AWAIT_AUDIT.value()) && !Objects.equals(shopDetail.getShopStatus(), ShopStatus.OFFLINE.value())) { + throw new LuckException("店铺状态已发生变化,请刷新后重试"); + } + // 审核 + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.auditOfflineEvent(offlineHandleEventDTO); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + // 审核通过 + auditSuccess(shopDetail, new Date(), offlineHandleEventDTO.getHandleId()); + } + + private void auditSuccess(ShopDetailVO shopDetail, Date now, Long shopId) { + if (shopAllinpayService.getIsAllinpay()) { + // 把店铺状态置为营业中 + shopDetailMapper.changeShopStatus(shopId, ShopStatus.OPEN.value()); + // 更新购物车项店铺是否停业状态 + shopCartFeignClient.updateIsClosedByShopIds(Collections.singletonList(shopDetail.getShopId()), 1); + spuFeignClient.updateSpuUpdateTimeByShopIds(Collections.singletonList(shopId), SysTypeEnum.MULTISHOP.value()); + return; + } + if (now.compareTo(shopDetail.getContractStartTime()) >= 0 && (Objects.isNull(shopDetail.getContractEndTime()) || now.compareTo(shopDetail.getContractEndTime()) < 0)) { + // 如果店铺的签约时间包含当前时间,则把店铺状态置为营业中 + shopDetailMapper.changeShopStatus(shopId, ShopStatus.OPEN.value()); + // 更新购物车项店铺是否停业状态 + shopCartFeignClient.updateIsClosedByShopIds(Collections.singletonList(shopDetail.getShopId()), 1); + } else { + // 如果店铺的签约时间不包含当前时间,则把店铺状态置为停业中 + shopDetailMapper.changeShopStatus(shopId, ShopStatus.STOP.value()); + // 更新购物车项店铺是否停业状态 + shopCartFeignClient.updateIsClosedByShopIds(Collections.singletonList(shopDetail.getShopId()), 0); + } + spuFeignClient.updateSpuUpdateTimeByShopIds(Collections.singletonList(shopId), SysTypeEnum.MULTISHOP.value()); + } + + @Override + public List listSimple(ShopSimpleBO shopSimpleBO) { + return shopDetailMapper.listSimple(shopSimpleBO); + } + + @Override + public Boolean checkShopName(String shopName) { + return shopDetailMapper.countShopName(shopName, null) > 0; + } + + @Override + public List getShopIdByShopStatus(Integer shopStatus) { + return shopDetailMapper.getShopIdsByShopStatus(shopStatus); + } + + @Override + public void offlineShopActivity(List shopIds, Integer shopStatus) { + if (!Objects.equals(shopStatus, ShopStatus.STOP.value()) && Objects.equals(shopStatus, ShopStatus.OFFLINE.value())) { + return; + } + //下线满减活动 + ServerResponseEntity handleDiscountOffline = discountFeignClient.handleShopOffline(shopIds); + if (!handleDiscountOffline.isSuccess()) { + throw new LuckException(handleDiscountOffline.getMsg()); + } + //下线优惠券 + ServerResponseEntity handleCouponOffline = couponFeignClient.handleShopOffline(shopIds); + if (!handleCouponOffline.isSuccess()) { + throw new LuckException(handleCouponOffline.getMsg()); + } + //下线直播间 + ServerResponseEntity liveResponse = liveFeignClient.endLiveRoom(shopIds); + if (!liveResponse.isSuccess()) { + throw new LuckException(liveResponse.getMsg()); + } + } + + @Override + public List getShopIdsLikeName(String name) { + return shopDetailMapper.selectShopIdsLikeName(name); + } + + @Override + public PageVO renovationShopPage(PageDTO pageDTO, ShopSearchDTO shopSearchDTO, Integer sysType) { + shopSearchDTO.setPaySysType(shopAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value()); + if (Objects.equals(sysType, SysTypeEnum.ORDINARY.value())) { + PageUtil.doPage(pageDTO, () -> shopDetailMapper.apiSearchShops(shopSearchDTO)); + } + return PageUtil.doPage(pageDTO, () -> shopDetailMapper.searchShops(shopSearchDTO)); + } + + @Override + public List listRenovationShop(ShopSearchDTO shopSearchDTO) { + if (CollUtil.isEmpty(shopSearchDTO.getShopIds())) { + return new ArrayList<>(0); + } + return shopDetailMapper.listRenovationShop(shopSearchDTO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createAllinpayMember() { + // 获取还没创建通联会员的商家id列表 + List shopIds = shopDetailMapper.listUnCreateMemberShopIds(); + if (CollUtil.isEmpty(shopIds)) { + return; + } + + shopDetailMapper.updateShopIsCreate(shopIds); + // 已经开店的 + // 更新商家信息并且将对应商家的通联商家改完平台下线,等绑定了手机,设置了企业信息,影印件审核通过后,通联审核通过即可恢复原状态 + shopDetailMapper.updateShopToStop(shopIds); + + // 提交开店申请的 + // 找出已经提交申请的商家的审核信息给予驳回,然后更改状态为申请中 + shopDetailMapper.updateShopToApplying(shopIds); + shopAuditingService.updateToFail(shopIds); + + // 修改工商信息的 + // 给予驳回,更改最后成功的工商信息为待审核 + List needAuditList = companyAuditingMapper.getNeedAuditList(); + if (CollUtil.isNotEmpty(needAuditList)) { + for (ShopCompanyAuditingVO companyAuditing : needAuditList) { + companyAuditing.setStatus(AuditStatus.FAILAUDIT.value()); + companyAuditing.setRemarks("通联信息待完善"); + companyAuditingMapper.update(BeanUtil.map(companyAuditing, ShopCompanyAuditing.class)); + // 把对应的工商信息设置为审核未通过状态 + ShopCompany shopCompany = new ShopCompany(); + shopCompany.setShopCompanyId(companyAuditing.getShopCompanyId()); + shopCompany.setStatus(AuditStatus.FAILAUDIT.value()); + shopCompanyService.updateById(shopCompany); + } + } + shopCompanyService.updateStatusToWaitAudit(); + + // 给所有商家都新增一个通联的钱包 + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long shopId : shopIds) { + saveShopWallet(shopId, true); + // 删除商家的银行卡,需要重新绑定 + shopBankCardService.deleteByShopId(shopId); + keys.add(CacheNames.SHOP_DETAIL_ID_KEY + CacheNames.UNION + shopId); + + // 将该店铺所有的商品下线 + ServerResponseEntity spuResponse = spuFeignClient.offlineSpuByShopId(shopId); + if (!Objects.equals(spuResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(spuResponse.getMsg()); + } + } + RedisUtil.del(keys); + + List bizUserIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long shopId : shopIds) { + bizUserIds.add(AllinpayConstant.SHOP + shopId); + } + // 批量创建会员 + ServerResponseEntity response = allinpayFeignClient.batchCreateMember(bizUserIds); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createAllinpayMemberByShopId(Long shopId) { + // 该方法通联独有,可能平台开启通联支付的时候参数没配好,所以导致商家没能创建成功会员,那么在商家端登录的时候就要给商家无感创建一个 + if (!shopAllinpayService.getIsAllinpay()) { + return; + } + // 确保商家还没有创建 + ShopDetailVO shopDetail = shopDetailMapper.getShopByShopId(shopId); + if (Objects.equals(shopDetail.getIsCreateMember(), 1)) { + return; + } + shopDetailMapper.updateShopIsCreate(Collections.singletonList(shopId)); + Integer shopStatus = shopDetail.getShopStatus(); + if (Objects.equals(shopStatus, ShopStatus.OPEN.value()) + || Objects.equals(shopStatus, ShopStatus.STOP.value()) + || Objects.equals(shopStatus, ShopStatus.OFFLINE.value()) + || Objects.equals(shopStatus, ShopStatus.OFFLINE_AWAIT_AUDIT.value())) { + // 已经开店的 + // 更新商家信息并且将对应商家的通联商家改完平台下线,等绑定了手机,设置了企业信息,影印件审核通过后,通联审核通过即可恢复原状态 + shopDetailMapper.updateShopToStop(Collections.singletonList(shopId)); + } else if (Objects.equals(shopStatus, ShopStatus.OPEN_AWAIT_AUDIT.value())) { + // 提交开店申请的 + // 找出已经提交申请的商家的审核信息给予驳回,然后更改状态为申请中 + shopDetailMapper.updateShopToApplying(Collections.singletonList(shopId)); + shopAuditingService.updateToFail(Collections.singletonList(shopId)); + } + ShopCompanyAuditingVO companyAuditingVO = companyAuditingMapper.getLatestAuditingByShopId(shopId); + if (Objects.nonNull(companyAuditingVO)) { + if (Objects.equals(companyAuditingVO.getStatus(), AuditStatus.WAITAUDIT.value())) { + // 修改工商信息的 + // 给予驳回,更改最后成功的工商信息为待审核 + companyAuditingVO.setRemarks("通联信息待完善"); + companyAuditingVO.setStatus(AuditStatus.FAILAUDIT.value()); + companyAuditingMapper.update(BeanUtil.map(companyAuditingVO, ShopCompanyAuditing.class)); + // 把对应的工商信息设置为审核未通过状态 + ShopCompany shopCompany = new ShopCompany(); + shopCompany.setStatus(AuditStatus.FAILAUDIT.value()); + shopCompany.setShopCompanyId(companyAuditingVO.getShopCompanyId()); + shopCompanyService.updateById(shopCompany); + } + } + // 修改商家成功的工商信息为待审核 + shopCompanyService.batchUpdateStatus(shopId, AuditStatus.WAITAUDIT.value(), AuditStatus.SUCCESSAUDIT.value()); + + // 给商家新增一个通联的钱包 + saveShopWallet(shopId, true); + // 删除商家的银行卡,需要重新绑定 + shopBankCardService.deleteByShopId(shopId); + // 将该店铺所有的商品下线 + ServerResponseEntity spuResponse = spuFeignClient.offlineSpuByShopId(shopId); + if (!Objects.equals(spuResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(spuResponse.getMsg()); + } + // 创建会员 + ServerResponseEntity response = allinpayFeignClient.batchCreateMember(Collections.singletonList(AllinpayConstant.SHOP + shopId)); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateAllinpayIdCardStatus(String bizUserId, Integer status) { + Long shopId = Long.valueOf(bizUserId.substring(AllinpayConstant.SHOP_LENGTH)); + log.info("店铺{}影印件更新,影印件状态为{}", shopId, Objects.requireNonNull(IdCardCollectProcessStatus.instance(status)).str()); + // 影印件回调只会在企业审核通过后,所以这里再次更新一下,可能之前设置企业信息回调失败了 + shopBankCardService.updateShopAllinpayStatusToSuccess(shopId); + shopDetailMapper.updateAllinpayIdCardStatus(shopId, status); + if (!Objects.equals(status, IdCardCollectProcessStatus.ALL.value())) { + log.info("店铺{}影印件更新,影印件状态为{},未全部通过审核", shopId, Objects.requireNonNull(IdCardCollectProcessStatus.instance(status)).str()); + return; + } + // 如果审核都通过,将对应店铺上线 + shopDetailMapper.updateShopToOpen(shopId); + ShopAuditingVO shopAuditing = shopAuditingService.getByshopId(shopId); + if (!Objects.equals(shopAuditing.getStatus(), AuditStatus.SUCCESSAUDIT.value())) { + log.info("店铺{}影印件更新,全部通过审核,进行开店回调,自动审核店铺", shopId); + // 审核还没成功代表这是开店的回调 + ShopAuditingDTO shopAuditingDTO = BeanUtil.map(shopAuditing, ShopAuditingDTO.class); + shopAuditingDTO.setStatus(AuditStatus.SUCCESSAUDIT.value()); + // 自动审核店铺 + audit(shopAuditingDTO); + } else { + log.info("店铺{}影印件更新,全部通过审核,进行修改工商信息回调,自动审核工商信息", shopId); + // 修改工商信息回调 + ShopCompanyAuditingVO companyAuditing = companyAuditingMapper.getLatestAuditingByShopId(shopId); + if (Objects.isNull(companyAuditing)) { + log.error("影印件回调,工商审核信息不存在{}", bizUserId); + return; + } + if (Objects.equals(companyAuditing.getStatus(), AuditStatus.WAITAUDIT.value())) { + log.info("店铺{}影印件更新,全部通过审核,进行修改工商信息回调,工商信息为待审核状态", shopId); + companyAuditing.setStatus(AuditStatus.SUCCESSAUDIT.value()); + companyAuditingMapper.update(BeanUtil.map(companyAuditing, ShopCompanyAuditing.class)); + + shopCompanyService.batchUpdateStatus(companyAuditing.getShopId(), AuditStatus.FAILAUDIT.value(), null); + // 把对应的工商信息设置为启用状态 + ShopCompany shopCompany = new ShopCompany(); + shopCompany.setShopCompanyId(companyAuditing.getShopCompanyId()); + shopCompany.setStatus(AuditStatus.SUCCESSAUDIT.value()); + shopCompanyService.updateById(shopCompany); + } else if (Objects.equals(companyAuditing.getStatus(), AuditStatus.FAILAUDIT.value())) { + log.info("店铺{}影印件更新,全部通过审核,进行修改工商信息回调,工商信息为失败状态", shopId); + // 审核不通过的工商信息删了 + shopCompanyService.deleteByShopIdAndStatus(shopId, AuditStatus.FAILAUDIT.value()); + } + } + } + + @Override + public List listShopIds() { + return shopDetailMapper.listShopIds(); + } + + /** + * 添加店铺钱包 + * @param shopId + * @return + */ + public void addShopInfo(Long shopId) { + ShopExtension shopExtension = new ShopExtension(); + shopExtension.setShopId(shopId); + shopExtensionService.save(shopExtension); + + saveShopWallet(shopId, shopAllinpayService.getIsAllinpay()); + } + + private void saveShopWallet(Long shopId, boolean isAllinpay) { + ShopWallet shopWallet = new ShopWallet(); + shopWallet.setVersion(0L); + shopWallet.setUnsettledAmount(0L); + shopWallet.setSettledAmount(0L); + shopWallet.setFreezeAmount(0L); + shopWallet.setTotalSettledAmount(0L); + shopWallet.setSmsNum(0); + shopWallet.setShopId(shopId); + shopWallet.setPaySysType(isAllinpay ? 1 : 0); + shopWalletMapper.save(shopWallet); + } + + /** + * 检验店铺信息是否正确 + * @param shopDetailDTO 店铺基本信息 + * @param isCreate true: 创建时校验, false: 更新时校验 + */ + private void checkShopInfo(ShopDetailDTO shopDetailDTO, Boolean isCreate) { + if (!isCreate) { + ShopAuditingVO shopAuditingVO = shopAuditingService.getByshopId(shopDetailDTO.getShopId()); + if (Objects.nonNull(shopAuditingVO) && Objects.equals(shopAuditingVO.getStatus(), AuditStatus.WAITAUDIT.value())) { + throw new LuckException("店铺处于待审核状态无法修改信息"); + } + } + // 店铺名称 + if (StrUtil.isNotBlank(shopDetailDTO.getShopName())) { + shopDetailDTO.setShopName(shopDetailDTO.getShopName().trim()); + } + if (shopDetailMapper.countShopName(shopDetailDTO.getShopName(), shopDetailDTO.getShopId()) > 0) { + throw new LuckException("店铺名称已存在"); + } + if (!isCreate) { + // 更新店铺基本信息不用校验用户信息 + return; + } + if (StrUtil.isNotBlank(shopDetailDTO.getContactPhone())) { + shopDetailDTO.setPhone(shopDetailDTO.getContactPhone().trim()); + } + } + + /** + * 创建店铺初始账号 + * @param shopDetailDTO + * @param statusEnum + */ + public void createShopAccount(ShopDetailDTO shopDetailDTO, StatusEnum statusEnum) { + ShopUser shopUser = new ShopUser(); + shopUser.setShopId(shopDetailDTO.getShopId()); + shopUser.setNickName(shopDetailDTO.getUsername()); + shopUser.setHasAccount(1); + shopUserService.save(shopUser, null); + + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setPhone(shopDetailDTO.getPhone()); + authAccountDTO.setUsername(shopDetailDTO.getUsername()); + authAccountDTO.setPassword(shopDetailDTO.getPassword().trim()); + authAccountDTO.setStatus(statusEnum.value()); + authAccountDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setTenantId(shopDetailDTO.getShopId()); + authAccountDTO.setUserId(shopUser.getShopUserId()); + authAccountDTO.setIsAdmin(UserAdminType.ADMIN.value()); + ServerResponseEntity save = accountFeignClient.save(authAccountDTO); + if (!Objects.equals(save.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(save.getMsg()); + } + } + + private Date getSaveEndOfDay(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(DateUtil.endOfDay(date)); + // 防止时间进位 + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopExtensionServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopExtensionServiceImpl.java new file mode 100644 index 0000000..ac5d4f5 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopExtensionServiceImpl.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import com.tmerclub.cloud.multishop.mapper.ShopExtensionMapper; +import com.tmerclub.cloud.multishop.model.ShopExtension; +import com.tmerclub.cloud.multishop.service.ShopExtensionService; +import com.tmerclub.cloud.multishop.vo.ShopExtensionVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 店铺扩张信息 + * + * @author YXF + * @date 2021-02-05 15:36:12 + */ +@Service +public class ShopExtensionServiceImpl implements ShopExtensionService { + + @Autowired + private ShopExtensionMapper shopExtensionMapper; + + @Override + public void save(ShopExtension shopExtension) { + shopExtensionMapper.save(shopExtension); + } + + @Override + public void update(ShopExtensionVO shopExtension) { + shopExtensionMapper.update(shopExtension); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopRenovationServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopRenovationServiceImpl.java new file mode 100644 index 0000000..703b188 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopRenovationServiceImpl.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.user.feign.PopupFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.JumpType; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.constant.HomeStatus; +import com.tmerclub.cloud.multishop.constant.RenovationType; +import com.tmerclub.cloud.multishop.mapper.ShopRenovationMapper; +import com.tmerclub.cloud.multishop.model.ShopRenovation; +import com.tmerclub.cloud.multishop.service.ShopRenovationService; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 店铺装修信息 + * + * @author Orange + * @date 2022-08-12 11:27:18 + */ +@Service +public class ShopRenovationServiceImpl implements ShopRenovationService { + + @Autowired + private ShopRenovationMapper shopRenovationMapper; + @DubboReference + private PopupFeignClient popupFeignClient; + + @Override + public PageVO page(PageDTO pageDTO, ShopRenovation shopRenovation) { + return PageUtil.doPage(pageDTO, () -> shopRenovationMapper.list(shopRenovation)); + } + + @Override + @Cacheable(cacheNames = CacheNames.GET_BY_SHOP_RENOVATION_ID_KEY, key = "#renovationId") + public ShopRenovation getByRenovationId(Long renovationId) { + return shopRenovationMapper.getByRenovationId(renovationId); + } + + @Override + @Cacheable(cacheNames = CacheNames.GET_SHOP_HOME_RENOVATION_KEY, key = "#shopId + ':' + #renovationType") + public ShopRenovation getShopHomeRenovation(Long shopId, Integer renovationType) { + return shopRenovationMapper.getByShopIdAndRenovationType(shopId, renovationType); + } + + @Override + public void save(ShopRenovation shopRenovation) { + shopRenovationMapper.save(shopRenovation); + } + + @Override + public void update(ShopRenovation shopRenovation) { + shopRenovationMapper.update(shopRenovation); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public void deleteById(Long renovationId, Integer renovationType, Long shopId) { + shopRenovationMapper.deleteById(renovationId); + if (Objects.equals(renovationType, RenovationType.H5.value())) { + // 失效弹窗 + ServerResponseEntity response = popupFeignClient.deleteLink(renovationId, shopId, JumpType.MINI_PAGE.value(), null); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + } + + @Override + public void removeCache(Long shopId, Integer renovationType, Long renovationId) { + List key = new ArrayList<>(Constant.INITIAL_CAPACITY); + key.add(CacheNames.GET_SHOP_HOME_RENOVATION_KEY + CacheNames.UNION + shopId + CacheNames.UNION_KEY + renovationType); + key.add(CacheNames.GET_BY_SHOP_RENOVATION_ID_KEY + CacheNames.UNION + renovationId); + RedisUtil.del(key); + } + + @Override + public void updateToHomePage(ShopRenovation shopRenovation) { + // 取消设置为主页 + if (Objects.equals(shopRenovation.getHomeStatus(), HomeStatus.YES.value())) { + shopRenovation.setHomeStatus(HomeStatus.NO.value()); + update(shopRenovation); + return; + } + + ShopRenovation search = new ShopRenovation(); + search.setShopId(shopRenovation.getShopId()); + search.setRenovationType(shopRenovation.getRenovationType()); + search.setHomeStatus(HomeStatus.YES.value()); + // 设为主页的装修列表 + List shopRenovationList = shopRenovationMapper.list(search); + // 先取消已有的主页 + shopRenovationMapper.updateHomeStatus(shopRenovation.getShopId(), shopRenovation.getRenovationType()); + // 设置当前模板为主页 + shopRenovation.setHomeStatus(HomeStatus.YES.value()); + update(shopRenovation); + // 清除旧的主页缓存 + if (CollUtil.isNotEmpty(shopRenovationList)) { + List key = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ShopRenovation renovation : shopRenovationList) { + key.add(CacheNames.GET_BY_SHOP_RENOVATION_ID_KEY + CacheNames.UNION + renovation.getRenovationId()); + } + RedisUtil.del(key); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopSubstituteSalesServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopSubstituteSalesServiceImpl.java new file mode 100644 index 0000000..1273286 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopSubstituteSalesServiceImpl.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.constant.SalesType; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.multishop.mapper.ShopSubstituteSalesMapper; +import com.tmerclub.cloud.multishop.model.ShopSubstituteSales; +import com.tmerclub.cloud.multishop.service.ShopSubstituteSalesService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 代销设置表 + * + * @author lhd + * @date 2022-06-22 17:09:12 + */ +@Service +public class ShopSubstituteSalesServiceImpl implements ShopSubstituteSalesService { + + @Autowired + private ShopSubstituteSalesMapper shopSubstituteSalesMapper; + + @DubboReference + private SpuFeignClient spuFeignClient; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> shopSubstituteSalesMapper.list()); + } + + @Override + @Cacheable(cacheNames = CacheNames.SHOP_SUBSTITUTE_SALES_KEY, key = "#shopId") + public ShopSubstituteSalesVO getByShopSubstituteSalesId(Long shopId) { + return shopSubstituteSalesMapper.getByShopSubstituteSalesId(shopId); + } + + @Override + public void save(ShopSubstituteSales shopSubstituteSales) { + shopSubstituteSalesMapper.save(shopSubstituteSales); + } + + @Override + public void update(ShopSubstituteSales shopSubstituteSales) { + int count = shopSubstituteSalesMapper.update(shopSubstituteSales); + RedisUtil.del(CacheNames.SHOP_SUBSTITUTE_SALES_KEY + CacheNames.UNION + shopSubstituteSales.getShopId()); + if (count > 0) { + //手动设价改成智能设价, 已导入的商品的价格要做更新;智能设价改成手动设价 已导入的商品价格不用更新; + if (Objects.equals(shopSubstituteSales.getSalesType(), SalesType.SMART_PRICE.value())) { + spuFeignClient.updateManualPriceCommissionSpuPrice(shopSubstituteSales.getShopId()); + } + } + } + + @Override + public void deleteById(Long shopSubstituteSalesId) { + shopSubstituteSalesMapper.deleteById(shopSubstituteSalesId); + } + + @Override + public List listByShopIds(List shopIds) { + if (CollUtil.isEmpty(shopIds)) { + return new ArrayList<>(0); + } + return shopSubstituteSalesMapper.listByShopIds(shopIds); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopTemplateServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopTemplateServiceImpl.java new file mode 100644 index 0000000..df998d7 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopTemplateServiceImpl.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.mapper.ShopTemplateMapper; +import com.tmerclub.cloud.multishop.model.ShopTemplate; +import com.tmerclub.cloud.multishop.service.ShopTemplateService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +/** + * 商品装修模板表 + * + * @author Orange + * @date 2022-08-12 14:04:57 + */ +@Service +public class ShopTemplateServiceImpl implements ShopTemplateService { + + @Autowired + private ShopTemplateMapper shopTemplateMapper; + + @Override + public PageVO page(PageDTO pageDTO, ShopTemplate shopTemplate) { + return PageUtil.doPage(pageDTO, () -> shopTemplateMapper.list(shopTemplate)); + } + + @Override + @Cacheable(cacheNames = CacheNames.GET_BY_SHOP_TEMPLATE_ID_KEY, key = "#templateId") + public ShopTemplate getByTemplateId(Long templateId) { + return shopTemplateMapper.getByTemplateId(templateId); + } + + @Override + public void save(ShopTemplate shopTemplate) { + shopTemplateMapper.save(shopTemplate); + } + + @Override + public void update(ShopTemplate shopTemplate) { + shopTemplateMapper.update(shopTemplate); + } + + @Override + public void deleteById(Long templateId) { + shopTemplateMapper.deleteById(templateId); + } + + @Override + public void removeCache(Long templateId) { + RedisUtil.del(CacheNames.GET_BY_SHOP_TEMPLATE_ID_KEY + CacheNames.UNION + templateId); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopUserAccountServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopUserAccountServiceImpl.java new file mode 100644 index 0000000..d092241 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopUserAccountServiceImpl.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.common.constant.IsPassShopEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.multishop.dto.ChangeAccountDTO; +import com.tmerclub.cloud.multishop.mapper.ShopUserMapper; +import com.tmerclub.cloud.multishop.model.ShopUser; +import com.tmerclub.cloud.multishop.service.ShopUserAccountService; +import io.seata.spring.annotation.GlobalTransactional; +import jakarta.annotation.Resource; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author FrozenWatermelon + * @date 2020/09/03 + */ +@Service +public class ShopUserAccountServiceImpl implements ShopUserAccountService { + + @Resource + private ShopUserMapper shopUserMapper; + @DubboReference + private AccountFeignClient accountFeignClient; + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity save(ChangeAccountDTO changeAccountDTO) { + AuthAccountDTO authAccountDTO = getAuthAccountDTO(changeAccountDTO); + authAccountDTO.setIsPassShop(IsPassShopEnum.YES.value()); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setIsAdmin(0); + // 保存 + ServerResponseEntity serverResponseEntity = accountFeignClient.save(authAccountDTO); + if (!serverResponseEntity.isSuccess()) { + return ServerResponseEntity.transform(serverResponseEntity); + } + ShopUser shopUser = new ShopUser(); + shopUser.setShopUserId(changeAccountDTO.getUserId()); + shopUser.setHasAccount(1); + shopUser.setShopId(AuthUserContext.get().getTenantId()); + shopUserMapper.update(shopUser); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity update(ChangeAccountDTO changeAccountDTO) { + + AuthAccountDTO authAccountDTO = getAuthAccountDTO(changeAccountDTO); + // 更新,不涉及分布式事务 + ServerResponseEntity serverResponseEntity = accountFeignClient.update(authAccountDTO); + if (!serverResponseEntity.isSuccess()) { + return serverResponseEntity; + } + + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity getByUserIdAndSysType(Long userId, Integer sysType) { + return accountFeignClient.getByUserIdAndSysType(userId, sysType); + } + + private AuthAccountDTO getAuthAccountDTO(ChangeAccountDTO changeAccountDTO) { + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + UidInfoBO uidInfoBO = AuthUserContext.get(); + authAccountDTO.setSysType(uidInfoBO.getSysType()); + authAccountDTO.setPassword(changeAccountDTO.getPassword()); + authAccountDTO.setUsername(changeAccountDTO.getUsername()); + authAccountDTO.setStatus(changeAccountDTO.getStatus()); + authAccountDTO.setTenantId(uidInfoBO.getTenantId()); + authAccountDTO.setUserId(changeAccountDTO.getUserId()); + authAccountDTO.setEmail(changeAccountDTO.getEmail()); + authAccountDTO.setPhone(changeAccountDTO.getPhone()); + return authAccountDTO; + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/UserCollectionShopServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/UserCollectionShopServiceImpl.java new file mode 100644 index 0000000..f831255 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/UserCollectionShopServiceImpl.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.dto.ProductSearchLimitDTO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.multishop.mapper.ShopCollectionMapper; +import com.tmerclub.cloud.multishop.mapper.ShopExtensionMapper; +import com.tmerclub.cloud.multishop.model.ShopCollection; +import com.tmerclub.cloud.multishop.service.ShopCollectionService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.vo.ShopCollectionVO; +import com.tmerclub.cloud.multishop.vo.ShopExtensionVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 用户店铺收藏记录 + * + * @author lhd + * @date 2021-02-23 14:41:42 + */ +@Service +public class UserCollectionShopServiceImpl implements ShopCollectionService { + + @Autowired + private ShopCollectionMapper shopCollectionMapper; + + @Autowired + private ShopExtensionMapper shopExtensionMapper; + + @Autowired + private ShopDetailService shopDetailService; + + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + + + @Override + public ShopCollectionVO getByCollectionId(Long collectionId) { + return shopCollectionMapper.getByCollectionId(collectionId); + } + + @Override + public void save(ShopCollection userCollectionShop) { + shopCollectionMapper.save(userCollectionShop); + } + + @Override + public void update(ShopCollection userCollectionShop) { + shopCollectionMapper.update(userCollectionShop); + } + + @Override + public PageVO getUserCollectionShopPageByUserIdAndShopName(PageDTO pageDTO, Long userId, String shopName) { + PageVO shopCollectionPage = PageUtil.doPage(pageDTO, () -> shopCollectionMapper.listUserCollectionShopPageByUserIdAndShopName(userId, shopName)); + if (CollectionUtil.isEmpty(shopCollectionPage.getList())) { + return shopCollectionPage; + } + List shopIds = shopCollectionPage.getList().stream().map(ShopCollectionVO::getShopId).collect(Collectors.toList()); + ProductSearchLimitDTO productSearchLimitDTO = new ProductSearchLimitDTO(Constant.SPU_SIZE_FIVE); + productSearchLimitDTO.setShopIds(shopIds); + List shopSpuList = searchSpuFeignClient.limitSpuList(productSearchLimitDTO).getData(); + Map> spuMap = shopSpuList.stream().collect(Collectors.groupingBy(SpuSearchVO::getShopId)); + for (ShopCollectionVO shopCollectionVO : shopCollectionPage.getList()) { + if (!spuMap.containsKey(shopCollectionVO.getShopId()) || CollectionUtil.isEmpty(spuMap.get(shopCollectionVO.getShopId()))) { + continue; + } + shopCollectionVO.setSpuSearchList(spuMap.get(shopCollectionVO.getShopId())); + } + return shopCollectionPage; + } + + @Override + public int countByShopIdAndUserId(Long shopId, Long userId) { + return shopCollectionMapper.countByShopIdAndUserId(shopId, userId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean addOrCancel(Long shopId, Long userId) { + if (Objects.isNull(shopDetailService.getByShopId(shopId))) { + // 该店铺不存在 + throw new LuckException("该店铺不存在"); + } + boolean isAdd = false; + if (countByShopIdAndUserId(shopId, userId) > 0) { + shopCollectionMapper.deleteByShopIdAndUserId(shopId, userId); + } else { + ShopCollection userCollectionShop = new ShopCollection(); + userCollectionShop.setUserId(userId); + userCollectionShop.setShopId(shopId); + shopCollectionMapper.save(userCollectionShop); + isAdd = true; + } + // 修改店铺的收藏数量 + long changeNum = isAdd ? 1L : -1L; + ShopExtensionVO shopExtensionVO = shopExtensionMapper.getByShopId(shopId); + shopExtensionVO.setCollectionNum(shopExtensionVO.getCollectionNum() + changeNum); + shopExtensionMapper.update(shopExtensionVO); + return isAdd; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean batchCancel(List shopIds, Long userId) { + boolean remove = false; + for (Long shopId : shopIds) { + // 修改店铺的收藏数量 + ShopExtensionVO shopExtensionVO = shopExtensionMapper.getByShopId(shopId); + if (Objects.isNull(shopExtensionVO)) { + continue; + } + if (countByShopIdAndUserId(shopId, userId) > 0) { + remove = shopCollectionMapper.deleteByShopIdAndUserId(shopId, userId); + shopExtensionVO.setCollectionNum(shopExtensionVO.getCollectionNum() - 1); + shopExtensionMapper.update(shopExtensionVO); + } + } + return remove; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/IndexImgVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/IndexImgVO.java new file mode 100644 index 0000000..587e494 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/IndexImgVO.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 轮播图VO + * + * @author YXF + * @date 2020-11-24 16:38:32 + */ +public class IndexImgVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键") + private Long imgId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "图片") + private String imgUrl; + + @Schema(description = "状态") + private Integer status; + + @Schema(description = "顺序") + private Integer seq; + + @Schema(description = "关联商品id") + private Long spuId; + + @Schema(description = "图片类型 0:小程序 1:pc") + private Integer imgType; + + @Schema(description = "spu信息") + private SpuVO spu; + + public Long getImgId() { + return imgId; + } + + public void setImgId(Long imgId) { + this.imgId = imgId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getImgType() { + return imgType; + } + + public void setImgType(Integer imgType) { + this.imgType = imgType; + } + + public SpuVO getSpu() { + return spu; + } + + public void setSpu(SpuVO spu) { + this.spu = spu; + } + + @Override + public String toString() { + return "IndexImgVO{" + + "imgId=" + imgId + + ",shopId=" + shopId + + ",imgUrl=" + imgUrl + + ",status=" + status + + ",seq=" + seq + + ",spuId=" + spuId + + ",imgType=" + imgType + + ",spu=" + spu + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/NoticeVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/NoticeVO.java new file mode 100644 index 0000000..b3ea56f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/NoticeVO.java @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 公告VO + * + * @author YXF + * @date 2020-11-25 17:57:56 + */ +public class NoticeVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "公告id") + private Long id; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "公告标题") + private String title; + + @Schema(description = "公告内容") + private String content; + + @Schema(description = "类型(1:在商家端展示 2:用户端展示 3:供应商端展示)") + private String types; + + @Schema(description = "状态(1:公布 0:撤回)") + private Integer status; + + @Schema(description = "是否置顶") + private Integer isTop; + + @Schema(description = "发布时间") + private Date publishTime; + + @Schema(description = "是否已读") + private Integer isLearning; + + @Schema(description = "商家可见范围 (为空则全部可见)") + private String multiShopIds; + + @Schema(description = "用户可见范围 (为空则全部可见)") + private String userIds; + + @Schema(description = "供应商可见范围 (为空则全部可见)") + private String supplierIds; + + @Schema(description = "商家可见范围 (为空则全部可见)") + private List shopDetailVOList; + + @Schema(description = "用户可见范围 (为空则全部可见)") + private List userDtailList; + + @Schema(description = "供应商可见范围 (为空则全部可见)") + private List supplierDetailList; + + @Schema(description = "是否立即发送 1:立即发送 0:定时发送") + private Integer immediatelySend; + + @Schema(description = "发送时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date sendTime; + + + public List getShopDetailVOList() { + return shopDetailVOList; + } + + public void setShopDetailVOList(List shopDetailVOList) { + this.shopDetailVOList = shopDetailVOList; + } + + public List getUserDtailList() { + return userDtailList; + } + + public void setUserDtailList(List userDtailList) { + this.userDtailList = userDtailList; + } + + public List getSupplierDetailList() { + return supplierDetailList; + } + + public void setSupplierDetailList(List supplierDetailList) { + this.supplierDetailList = supplierDetailList; + } + + public Integer getImmediatelySend() { + return immediatelySend; + } + + public void setImmediatelySend(Integer immediatelySend) { + this.immediatelySend = immediatelySend; + } + + public Date getSendTime() { + return sendTime; + } + + public void setSendTime(Date sendTime) { + this.sendTime = sendTime; + } + + public Integer getIsLearning() { + return isLearning; + } + + public void setIsLearning(Integer isLearning) { + this.isLearning = isLearning; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getTypes() { + return types; + } + + public void setTypes(String types) { + this.types = types; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public Date getPublishTime() { + return publishTime; + } + + public void setPublishTime(Date publishTime) { + this.publishTime = publishTime; + } + + public String getMultiShopIds() { + return multiShopIds; + } + + public void setMultiShopIds(String multiShopIds) { + this.multiShopIds = multiShopIds; + } + + public String getUserIds() { + return userIds; + } + + public void setUserIds(String userIds) { + this.userIds = userIds; + } + + public String getSupplierIds() { + return supplierIds; + } + + public void setSupplierIds(String supplierIds) { + this.supplierIds = supplierIds; + } + + public static long getSerialVersionUid() { + return serialVersionUID; + } + + @Override + public String toString() { + return "NoticeVO{" + + "id=" + id + + ", shopId=" + shopId + + ", title='" + title + '\'' + + ", content='" + content + '\'' + + ", types='" + types + '\'' + + ", status=" + status + + ", isTop=" + isTop + + ", publishTime=" + publishTime + + ", isLearning=" + isLearning + + ", multiShopIds='" + multiShopIds + '\'' + + ", userIds='" + userIds + '\'' + + ", supplierIds='" + supplierIds + '\'' + + ", shopDetailVOList=" + shopDetailVOList + + ", userDtailList=" + userDtailList + + ", supplierDetailList=" + supplierDetailList + + ", immediatelySend=" + immediatelySend + + ", sendTime=" + sendTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopAuditingInfoVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopAuditingInfoVO.java new file mode 100644 index 0000000..2c56fbc --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopAuditingInfoVO.java @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 审核信息 + * + * @author YXF + */ +@Schema(description = "审核信息") +public class ShopAuditingInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺审核id") + private Long shopAuditingId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "申请时间") + private Date createTime; + + @Schema(description = "审核状态 0未审核 1已通过 -1未通过") + private Integer status; + + @Schema(description = "店铺名字") + private String shopName; + + @Schema(description = "店铺详细地址") + private String shopAddress; + + @Schema(description = "店铺所在省份") + private String province; + + @Schema(description = "店铺所在城市") + private String city; + + @Schema(description = "店铺所在区域") + private String area; + + @Schema(description = "店铺logo") + private String shopLogo; + + @Schema(description = "店铺简介") + private String intro; + + @Schema(description = "店铺状态") + private Integer shopStatus; + + @Schema(description = "店铺账号") + private String mobile; + + public Long getShopAuditingId() { + return shopAuditingId; + } + + public void setShopAuditingId(Long shopAuditingId) { + this.shopAuditingId = shopAuditingId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getShopAddress() { + return shopAddress; + } + + public void setShopAddress(String shopAddress) { + this.shopAddress = shopAddress; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @Override + public String toString() { + return "ShopAuditingInfoVO{" + + "shopAuditingId=" + shopAuditingId + + ", shopId=" + shopId + + ", createTime=" + createTime + + ", status=" + status + + ", shopName='" + shopName + '\'' + + ", shopAddress='" + shopAddress + '\'' + + ", province='" + province + '\'' + + ", city='" + city + '\'' + + ", area='" + area + '\'' + + ", shopLogo='" + shopLogo + '\'' + + ", intro='" + intro + '\'' + + ", shopStatus=" + shopStatus + + ", mobile='" + mobile + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopAuditingVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopAuditingVO.java new file mode 100644 index 0000000..f1e12fd --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopAuditingVO.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家审核信息VO + * + * @author YXF + * @date 2021-02-01 17:10:35 + */ +public class ShopAuditingVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺审核id") + private Long shopAuditingId; + + @Schema(description = "申请人id") + private Long userId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "审核人id") + private Long auditorId; + + @Schema(description = "0 未审核 1已通过 -1未通过 2平台下线 3 上线待审核") + private Integer status; + + @Schema(description = "备注") + private String remarks; + + @Schema(description = "店铺信息") + private ShopDetailVO shopDetail; + + public Long getShopAuditingId() { + return shopAuditingId; + } + + public void setShopAuditingId(Long shopAuditingId) { + this.shopAuditingId = shopAuditingId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public ShopDetailVO getShopDetail() { + return shopDetail; + } + + public void setShopDetail(ShopDetailVO shopDetail) { + this.shopDetail = shopDetail; + } + + @Override + public String toString() { + return "ShopAuditingVO{" + + "shopAuditingId=" + shopAuditingId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",userId=" + userId + + ",shopId=" + shopId + + ",auditorId=" + auditorId + + ",status=" + status + + ",remarks=" + remarks + + ",shopDetail=" + shopDetail + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopCompanyAuditingVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopCompanyAuditingVO.java new file mode 100644 index 0000000..51753b6 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopCompanyAuditingVO.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 工商信息审核记录 + * + * @author chiley + * @date 2022/9/1 15:59 + */ + +public class ShopCompanyAuditingVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 工商信息审核id + */ + private Long companyAuditingId; + /** + * 申请人id + */ + @Schema(description = "申请人id") + private Long userId; + + /** + * 店铺id + */ + @Schema(description = "店铺id") + private Long shopId; + + /** + * 工商信息id + */ + @Schema(description = "工商信息id") + private Long shopCompanyId; + + /** + * 审核人id + */ + @Schema(description = "审核人id") + private Long auditorId; + + /** + * 审核状态 + */ + @Schema(description = "0 未审核 1已通过 -1未通过") + private Integer status; + + /** + * 备注 + */ + @Schema(description = "备注") + private String remarks; + + /** + * 店铺名称 + */ + @Schema(description = "店铺名称") + private String shopName; + + /** + * 店铺简介 + */ + @Schema(description = "店铺简介") + private String intro; + + /** + * 店铺工商信息 + */ + @Schema(description = "工商信息") + private ShopCompanyVO shopCompanyVO; + + public Long getCompanyAuditingId() { + return companyAuditingId; + } + + public void setCompanyAuditingId(Long companyAuditingId) { + this.companyAuditingId = companyAuditingId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getShopCompanyId() { + return shopCompanyId; + } + + public void setShopCompanyId(Long shopCompanyId) { + this.shopCompanyId = shopCompanyId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public ShopCompanyVO getShopCompanyVO() { + return shopCompanyVO; + } + + public void setShopCompanyVO(ShopCompanyVO shopCompanyVO) { + this.shopCompanyVO = shopCompanyVO; + } + + @Override + public String toString() { + return "ShopCompanyAuditingVO{" + + "companyAuditingId=" + companyAuditingId + + ", userId='" + userId + '\'' + + ", shopId=" + shopId + + ", shopCompanyId=" + shopCompanyId + + ", auditorId=" + auditorId + + ", status=" + status + + ", remarks='" + remarks + '\'' + + ", shopName='" + shopName + '\'' + + ", intro='" + intro + '\'' + + ", shopCompanyVO=" + shopCompanyVO + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopCompanyVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopCompanyVO.java new file mode 100644 index 0000000..53f978a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopCompanyVO.java @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @Author lth + * @Date 2021/4/25 15:55 + */ +public class ShopCompanyVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺工商信息id + */ + private Long shopCompanyId; + @Schema(description = "店铺id") + private Long shopId; + @Schema(description = "统一社会信用代码") + private String creditCode; + + @Schema(description = "企业名称") + private String firmName; + + @Schema(description = "住所") + private String residence; + + @Schema(description = "法定代表人") + private String representative; + + @Schema(description = "法人身份证号") + private String legalIds; + + @Schema(description = "法人手机号码") + private String legalPhone; + + @Schema(description = "注册资本") + private Double capital; + + @Schema(description = "成立日期") + private Date foundTime; + + @Schema(description = "营业起始日期") + private Date startTime; + + @Schema(description = "营业终止时间") + private Date endTime; + + @Schema(description = "经营范围") + private String businessScope; + + @Schema(description = "营业执照") + private String businessLicense; + + @Schema(description = "身份证正面") + private String identityCardFront; + + @Schema(description = "身份证反面") + private String identityCardLater; + + /** + * 审核状态:1:已通过 0待审核 -1未通过 + */ + @Schema(description = "启用状态") + private Integer status; + + @Schema(description = "是否修改过") + private Boolean edit; + + @Schema(description = "最新工商信息状态") + private Integer newStatus; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getShopCompanyId() { + return shopCompanyId; + } + + public void setShopCompanyId(Long shopCompanyId) { + this.shopCompanyId = shopCompanyId; + } + + public String getCreditCode() { + return creditCode; + } + + public void setCreditCode(String creditCode) { + this.creditCode = creditCode; + } + + public String getFirmName() { + return firmName; + } + + public void setFirmName(String firmName) { + this.firmName = firmName; + } + + public String getResidence() { + return residence; + } + + public void setResidence(String residence) { + this.residence = residence; + } + + public String getRepresentative() { + return representative; + } + + public void setRepresentative(String representative) { + this.representative = representative; + } + + public String getLegalIds() { + return legalIds; + } + + public void setLegalIds(String legalIds) { + this.legalIds = legalIds; + } + + public String getLegalPhone() { + return legalPhone; + } + + public void setLegalPhone(String legalPhone) { + this.legalPhone = legalPhone; + } + + public Double getCapital() { + return capital; + } + + public void setCapital(Double capital) { + this.capital = capital; + } + + public Date getFoundTime() { + return foundTime; + } + + public void setFoundTime(Date foundTime) { + this.foundTime = foundTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getBusinessScope() { + return businessScope; + } + + public void setBusinessScope(String businessScope) { + this.businessScope = businessScope; + } + + public String getBusinessLicense() { + return businessLicense; + } + + public void setBusinessLicense(String businessLicense) { + this.businessLicense = businessLicense; + } + + public String getIdentityCardFront() { + return identityCardFront; + } + + public void setIdentityCardFront(String identityCardFront) { + this.identityCardFront = identityCardFront; + } + + public String getIdentityCardLater() { + return identityCardLater; + } + + public void setIdentityCardLater(String identityCardLater) { + this.identityCardLater = identityCardLater; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Boolean getEdit() { + return edit; + } + + public void setEdit(Boolean edit) { + this.edit = edit; + } + + public Integer getNewStatus() { + return newStatus; + } + + public void setNewStatus(Integer newStatus) { + this.newStatus = newStatus; + } + + @Override + public String toString() { + return "ShopCompanyVO{" + + "shopCompanyId=" + shopCompanyId + + ", shopId=" + shopId + + ", creditCode='" + creditCode + '\'' + + ", firmName='" + firmName + '\'' + + ", residence='" + residence + '\'' + + ", representative='" + representative + '\'' + + ", legalIds='" + legalIds + '\'' + + ", legalPhone='" + legalPhone + '\'' + + ", capital=" + capital + + ", foundTime=" + foundTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", businessScope='" + businessScope + '\'' + + ", businessLicense='" + businessLicense + '\'' + + ", identityCardFront='" + identityCardFront + '\'' + + ", identityCardLater='" + identityCardLater + '\'' + + ", status=" + status + + ", edit=" + edit + + ", newStatus=" + newStatus + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopExtensionVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopExtensionVO.java new file mode 100644 index 0000000..9fde3bd --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopExtensionVO.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 店铺扩张信息VO + * + * @author YXF + * @date 2021-02-05 15:36:12 + */ +public class ShopExtensionVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long shopExtensionId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺商品总销量") + private Integer saleNum; + + @Schema(description = "店铺收藏数量") + private Long collectionNum; + + public Long getShopExtensionId() { + return shopExtensionId; + } + + public void setShopExtensionId(Long shopExtensionId) { + this.shopExtensionId = shopExtensionId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Long getCollectionNum() { + return collectionNum; + } + + public void setCollectionNum(Long collectionNum) { + this.collectionNum = collectionNum; + } + + @Override + public String toString() { + return "ShopExtensionVO{" + + "shopExtensionId=" + shopExtensionId + + ",shopId=" + shopId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",saleNum=" + saleNum + + ",collectionNum=" + collectionNum + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopTemplateVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopTemplateVO.java new file mode 100644 index 0000000..f053aa4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopTemplateVO.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品装修模板表VO + * + * @author Orange + * @date 2022-08-12 14:04:57 + */ +public class ShopTemplateVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺模板表") + private Long templateId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "名称") + private String name; + + @Schema(description = "装修内容") + private String content; + + @Schema(description = "图片") + private String image; + + @Schema(description = "类型 1.pc 2.移动端") + private Integer type; + + @Schema(description = "备注") + private String remark; + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "ShopTemplateVO{" + + "templateId=" + templateId + + ",shopId=" + shopId + + ",name=" + name + + ",content=" + content + + ",image=" + image + + ",type=" + type + + ",remark=" + remark + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopUserSimpleVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopUserSimpleVO.java new file mode 100644 index 0000000..4ebcec3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopUserSimpleVO.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/9/2 + */ +public class ShopUserSimpleVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺名称 + */ + @Schema(description = "店铺名称") + private String shopName; + + /** + * 头像 + */ + @Schema(description = "头像") + private String avatar; + + private Integer isAdmin; + + @Schema(description = "店铺是否已经入驻 0: 未入驻,1:已入驻") + private Integer isPassShop; + + private Long tenantId; + + private Long userId; + + /** + * 用户名称 + */ + @Schema(description = "用户名称") + private String userName; + + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public Integer getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(Integer isAdmin) { + this.isAdmin = isAdmin; + } + + public Integer getIsPassShop() { + return isPassShop; + } + + public void setIsPassShop(Integer isShop) { + this.isPassShop = isShop; + } + + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "ShopUserSimpleVO{" + + "shopName='" + shopName + '\'' + + ", avatar='" + avatar + '\'' + + ", isAdmin=" + isAdmin + + ", isPassShop=" + isPassShop + + ", tenantId=" + tenantId + + ", userId=" + userId + + ", userName='" + userName + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopUserVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopUserVO.java new file mode 100644 index 0000000..9644e44 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopUserVO.java @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/9/2 + */ +public class ShopUserVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * shopUserId + */ + @Schema(description = "店铺用户id") + private Long shopUserId; + + @Schema(description = "昵称") + private String nickName; + + @Schema(description = "员工编号") + private String code; + + @Schema(description = "联系方式") + private String phoneNum; + + @Schema(description = "是否已经有账号了") + private Integer hasAccount; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "角色id列表") + private List roleIds; + + @Schema(description = "账号") + private String username; + + @Schema(description = "密码") + private String password; + + @Schema(description = "邮箱") + private String email; + + @Schema(description = "手机号") + private String phone; + + @Schema(description = "状态 1启用 0禁用") + private Integer status; + + /** + * 是否是管理员 + */ + @Schema(description = "是否是管理员") + private Integer isAdmin; + + public Long getShopUserId() { + return shopUserId; + } + + public void setShopUserId(Long shopUserId) { + this.shopUserId = shopUserId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPhoneNum() { + return phoneNum; + } + + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } + + public Integer getHasAccount() { + return hasAccount; + } + + public void setHasAccount(Integer hasAccount) { + this.hasAccount = hasAccount; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public List getRoleIds() { + return roleIds; + } + + public void setRoleIds(List roleIds) { + this.roleIds = roleIds; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(Integer isAdmin) { + this.isAdmin = isAdmin; + } + + @Override + public String toString() { + return "ShopUserVO{" + + "shopUserId=" + shopUserId + + ", nickName='" + nickName + '\'' + + ", code='" + code + '\'' + + ", phoneNum='" + phoneNum + '\'' + + ", hasAccount=" + hasAccount + + ", shopId=" + shopId + + ", roleIds=" + roleIds + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + ", status=" + status + + ", isAdmin=" + isAdmin + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWalletVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWalletVO.java new file mode 100644 index 0000000..2c930a9 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWalletVO.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商家钱包信息VO + * + * @author lhd + * @date 2021-01-04 13:55:51 + */ +public class ShopWalletVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺钱包id") + private Long shopWalletId; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "未结算金额(用户支付)") + private Long unsettledAmount; + + @Schema(description = "已结算金额(用户确认收货后,可以提现)") + private Long settledAmount; + + @Schema(description = "冻结金额(用户确认收货)") + private Long freezeAmount; + + @Schema(description = "累积结算金额") + private Long totalSettledAmount; + + @Schema(description = "可用短信数量") + private Integer smsNum; + + @Schema(description = "乐观锁") + private Long version; + + public Long getShopWalletId() { + return shopWalletId; + } + + public void setShopWalletId(Long shopWalletId) { + this.shopWalletId = shopWalletId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getFreezeAmount() { + return freezeAmount; + } + + public void setFreezeAmount(Long freezeAmount) { + this.freezeAmount = freezeAmount; + } + + public Long getTotalSettledAmount() { + return totalSettledAmount; + } + + public void setTotalSettledAmount(Long totalSettledAmount) { + this.totalSettledAmount = totalSettledAmount; + } + + public Integer getSmsNum() { + return smsNum; + } + + public void setSmsNum(Integer smsNum) { + this.smsNum = smsNum; + } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } + + @Override + public String toString() { + return "ShopWalletVO{" + + "shopWalletId=" + shopWalletId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", freezeAmount=" + freezeAmount + + ", totalSettledAmount=" + totalSettledAmount + + ", smsNum=" + smsNum + + ", version=" + version + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWithdrawCashVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWithdrawCashVO.java new file mode 100644 index 0000000..4e658c0 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWithdrawCashVO.java @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.api.multishop.vo.ShopBankCardVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商家提现申请信息VO + * + * @author FrozenWatermelon + * @date 2021-06-10 10:28:13 + */ +public class ShopWithdrawCashVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "序号") + private Long index; + + @Schema(description = "支付系统类型") + private Integer paySysType; + + @Schema(description = "提现id") + private Long cashId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "审核人id") + private Long auditorId; + + @Schema(description = "提现金额") + private Double amount; + + @Schema(description = "审核时间") + private Date auditingTime; + + @Schema(description = "状态(0:未审核、1:已通过 -1:未通过 2:发放成功 3:发放失败)") + private Integer status; + + @Schema(description = "平台备注") + private String remarks; + + @Schema(description = "店铺备注") + private String shopRemarks; + + @Schema(description = "付款户名") + private String payingAccount; + + @Schema(description = "汇款账户") + private String payingCardNo; + + @Schema(description = "汇款时间") + private Date payingTime; + + @Schema(description = "收款银行卡id") + private Long shopBankCardId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "店铺logo") + private String shopLogo; + + @Schema(description = "提现银行卡") + private ShopBankCardVO shopBankCardVO; + + @Schema(description = "通联提现状态 0.待支付 1.申请成功(还没确认) 2.提现成功 3.提现失败") + private Integer allinpayStatus; + + @Schema(description = "通联提现订单号") + private String bizOrderNo; + + @Schema(description = "提现失败原因") + private String payFailMessage; + + public Long getIndex() { + return index; + } + + public void setIndex(Long index) { + this.index = index; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public ShopBankCardVO getShopBankCardVO() { + return shopBankCardVO; + } + + public void setShopBankCardVO(ShopBankCardVO shopBankCardVO) { + this.shopBankCardVO = shopBankCardVO; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Long getCashId() { + return cashId; + } + + public void setCashId(Long cashId) { + this.cashId = cashId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Double getAmount() { + return amount; + } + + public void setAmount(Double amount) { + this.amount = amount; + } + + public Date getAuditingTime() { + return auditingTime; + } + + public void setAuditingTime(Date auditingTime) { + this.auditingTime = auditingTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getShopRemarks() { + return shopRemarks; + } + + public void setShopRemarks(String shopRemarks) { + this.shopRemarks = shopRemarks; + } + + public String getPayingAccount() { + return payingAccount; + } + + public void setPayingAccount(String payingAccount) { + this.payingAccount = payingAccount; + } + + public String getPayingCardNo() { + return payingCardNo; + } + + public void setPayingCardNo(String payingCardNo) { + this.payingCardNo = payingCardNo; + } + + public Date getPayingTime() { + return payingTime; + } + + public void setPayingTime(Date payingTime) { + this.payingTime = payingTime; + } + + public Long getShopBankCardId() { + return shopBankCardId; + } + + public void setShopBankCardId(Long shopBankCardId) { + this.shopBankCardId = shopBankCardId; + } + + public Integer getAllinpayStatus() { + return allinpayStatus; + } + + public void setAllinpayStatus(Integer allinpayStatus) { + this.allinpayStatus = allinpayStatus; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getPayFailMessage() { + return payFailMessage; + } + + public void setPayFailMessage(String payFailMessage) { + this.payFailMessage = payFailMessage; + } + + @Override + public String toString() { + return "ShopWithdrawCashVO{" + + "index=" + index + + ", paySysType=" + paySysType + + ", cashId=" + cashId + + ", shopId=" + shopId + + ", auditorId=" + auditorId + + ", amount=" + amount + + ", auditingTime=" + auditingTime + + ", status=" + status + + ", remarks='" + remarks + '\'' + + ", shopRemarks='" + shopRemarks + '\'' + + ", payingAccount='" + payingAccount + '\'' + + ", payingCardNo='" + payingCardNo + '\'' + + ", payingTime=" + payingTime + + ", shopBankCardId=" + shopBankCardId + + ", shopName='" + shopName + '\'' + + ", shopLogo='" + shopLogo + '\'' + + ", shopBankCardVO=" + shopBankCardVO + + ", allinpayStatus=" + allinpayStatus + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", payFailMessage='" + payFailMessage + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/PublicBankController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/PublicBankController.java new file mode 100644 index 0000000..4ae35b3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/PublicBankController.java @@ -0,0 +1,61 @@ +package com.tmerclub.cloud.platform.controller; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.platform.dto.PublicBankDTO; +import com.tmerclub.cloud.platform.service.PublicBankService; +import com.tmerclub.cloud.platform.vo.PublicBankVO; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author gaozijie + * @date 2023-03-21 + */ +@RestController +@RequestMapping("/ua/public_bank") +public class PublicBankController { + + @Autowired + private PublicBankService publicBankService; + + @GetMapping("/list") + @Operation(summary = "获取对公户银行列表", description = "获取对公户银行列表") + public ServerResponseEntity> listPublicBank(PublicBankDTO publicBankDTO) { + List publicBankVOList = publicBankService.listPublicBank(publicBankDTO); + return ServerResponseEntity.success(publicBankVOList); + } + + @GetMapping("/page") + @Operation(summary = "分页获取对公户银行列表", description = "分页获取对公户银行列表") + public ServerResponseEntity> pagePublicBank(PageDTO pageDTO, + PublicBankDTO publicBankDTO) { + PageVO pageVO = publicBankService.pagePublicBank(pageDTO, publicBankDTO); + return ServerResponseEntity.success(pageVO); + } + + @PostMapping("/save") + @Operation(summary = "保存", description = "保存") + public ServerResponseEntity save(@RequestBody PublicBankDTO publicBankDTO) { + publicBankService.save(publicBankDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/update") + @Operation(summary = "更新", description = "更新") + public ServerResponseEntity update(@RequestBody PublicBankDTO publicBankDTO) { + publicBankService.update(publicBankDTO); + return ServerResponseEntity.success(); + } + + @DeleteMapping("/deleteByIds") + @Operation(summary = "批量删除", description = "批量删除") + public ServerResponseEntity deleteByIds(List bankIds) { + publicBankService.deleteByIds(bankIds); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/SysConfigController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/SysConfigController.java new file mode 100644 index 0000000..f0092fb --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/SysConfigController.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller; + +import cn.hutool.core.util.BooleanUtil; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.platform.model.SysConfig; +import com.tmerclub.cloud.platform.service.SysConfigService; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author chenlin + * @DateTime: 2020/3/19 8:29 + * @description: 支付配置、文件上传配置、短信配置、快递配置、小程序配置、公众号配置 + */ +@RestController +@RequestMapping("/p/sys_config") +public class SysConfigController { + + + @Autowired + private SysConfigService sysConfigService; + @Value("${mall4cloud.expose.permission:}") + private Boolean permission; + + /** + * 获取保存配置信息 + */ + @GetMapping("/info/{key}") + public ServerResponseEntity info(@PathVariable("key") String key) { + if (BooleanUtil.isFalse(permission)) { + return ServerResponseEntity.success(); + } + return ServerResponseEntity.success(sysConfigService.getValue(key)); + } + + /** + * 保存配置 + */ + @PostMapping("/save") + public ServerResponseEntity save(@RequestBody @Valid SysConfig sysConfig) { + if (BooleanUtil.isFalse(permission)) { + return ServerResponseEntity.showFailMsg("暂无权限进行操作"); + } + sysConfigService.saveOrUpdateSysConfig(sysConfig); + return ServerResponseEntity.success(true); + } + + @PostMapping("/saveDeliveryConfig") + @Operation(summary = "保存物流查询配置信息", description = "保存物流查询配置信息") + public ServerResponseEntity saveDeliveryConfig(@RequestBody @Valid SysConfig sysConfig) { + if (BooleanUtil.isFalse(permission)) { + return ServerResponseEntity.showFailMsg("暂无权限进行操作"); + } + List invalidKeys = sysConfigService.saveDeliveryConfig(sysConfig); + invalidKeys.forEach(key -> sysConfigService.removeSysConfig(key)); + return ServerResponseEntity.success(true); + } + + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/SysUserAccountController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/SysUserAccountController.java new file mode 100644 index 0000000..b373f39 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/SysUserAccountController.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.platform.dto.ChangeAccountDTO; +import com.tmerclub.cloud.platform.service.SysUserAccountService; +import com.tmerclub.cloud.platform.service.SysUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author lhd + * @date 2020/12/21 + */ +@RequestMapping("/p/sys_user/account") +@RestController +@Tag(name = "平台用户账号信息") +public class SysUserAccountController { + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + private final SysUserAccountService SysUserAccountService; + + private final SysUserService SysUserService; + + private final AccountFeignClient accountFeignClient; + + public SysUserAccountController(SysUserAccountService sysUserAccountService, SysUserService sysUserService, AccountFeignClient accountFeignClient) { + this.SysUserAccountService = sysUserAccountService; + this.SysUserService = sysUserService; + this.accountFeignClient = accountFeignClient; + } + + + @GetMapping + @Operation(summary = "获取账号信息", description = "获取账号信息") + public ServerResponseEntity getAccount(Long userId) { + return SysUserAccountService.getByUserIdAndSysType(userId, AuthUserContext.get().getSysType()); + } + + + @PostMapping + @Operation(summary = "添加账号", description = "添加账号") + public ServerResponseEntity addAccount(@Valid @RequestBody ChangeAccountDTO changeAccountDTO) { + SysUserVO sysUserVO = SysUserService.getByUserId(changeAccountDTO.getUserId()); + if (sysUserVO == null) { + return ServerResponseEntity.showFailMsg("无法获取平台账户信息"); + } + if (Objects.equals(sysUserVO.getHasAccount(), 1)) { + return ServerResponseEntity.showFailMsg("已有账号,无需重复添加"); + } + if (StrUtil.isBlank(changeAccountDTO.getPassword())) { + return ServerResponseEntity.showFailMsg("密码不能为空"); + } + return SysUserAccountService.save(changeAccountDTO); + } + + @PutMapping + @Operation(summary = "修改账号", description = "修改账号") + public ServerResponseEntity updateAccount(@Valid @RequestBody ChangeAccountDTO changeAccountDTO) { + if (Objects.equals(changeAccountDTO.getUserId().intValue(), Constant.SUPER_ADMIN_ID) && BooleanUtil.isFalse(permission)) { + throw new LuckException("暂无权限修改该用户的账户信息"); + } + SysUserVO sysUserVO = SysUserService.getByUserId(changeAccountDTO.getUserId()); + if (sysUserVO == null || Objects.equals(sysUserVO.getHasAccount(), 0)) { + return ServerResponseEntity.showFailMsg("无法获取账户信息"); + } + ServerResponseEntity authAccountEntity = accountFeignClient.getByUserIdAndType(sysUserVO.getSysUserId(), SysTypeEnum.PLATFORM.value()); + if (!authAccountEntity.isSuccess()) { + throw new LuckException(authAccountEntity.getMsg()); + } + AuthAccountVO authAccountVO = authAccountEntity.getData(); + if (Objects.equals(authAccountVO.getIsAdmin(), 1) && !Objects.equals(sysUserVO.getSysUserId(), AuthUserContext.get().getUserId())) { + return ServerResponseEntity.showFailMsg("您没有权限修改管理员信息"); + } + if (!PrincipalUtil.isDbPhone(changeAccountDTO.getPhone(), authAccountVO.getPhone(), true)) { + throw new LuckException("请输入正确的手机号"); + } + if (changeAccountDTO.getPhone().contains(Constant.ASTERISK)) { + changeAccountDTO.setPhone(authAccountVO.getPhone()); + } + return SysUserAccountService.update(changeAccountDTO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/WebConfigController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/WebConfigController.java new file mode 100644 index 0000000..87a4419 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/WebConfigController.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.platform.constant.WebConfigType; +import com.tmerclub.cloud.platform.service.SysConfigService; +import com.tmerclub.cloud.platform.vo.WebConfigVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Objects; + +/** + * 网站配置信息表 + * + * @author Orange + */ +@RestController("allWebConfigController") +@RequestMapping("/ua/web_config") +@Tag(name = "网站配置信息表") +public class WebConfigController { + + @Autowired + private SysConfigService sysConfigService; + + @GetMapping("/get_activity") + @Operation(summary = "获取当前激活的网站配置", description = "获取当前激活的网站配置") + @Parameter(name = "webConfigType", description = "配置类型") + public ServerResponseEntity getActivityWebConfig(@RequestParam("webConfigType") String webConfigType) { + WebConfigType paramKey = WebConfigType.instance(webConfigType); + if (Objects.isNull(paramKey)) { + return ServerResponseEntity.fail(ResponseEnum.HTTP_MESSAGE_NOT_READABLE); + } + String paramValue = sysConfigService.getValue(paramKey.value()); + WebConfigVO webConfigVO = JSON.parseObject(paramValue, WebConfigVO.class); + webConfigVO.setParamKey(webConfigType); + return ServerResponseEntity.success(webConfigVO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/multishop/OfflineHandleEventController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/multishop/OfflineHandleEventController.java new file mode 100644 index 0000000..1a775c7 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/multishop/OfflineHandleEventController.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.multishop; + +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.platform.service.OfflineHandleEventService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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.util.Objects; + +/** + * @Author lth + * @Date 2021/5/24 18:26 + */ +@RestController("multishopOfflineHandleEventController") +@RequestMapping("/m/offline_handle_event") +@Tag(name = "multishop-下线处理事件信息") +public class OfflineHandleEventController { + + @Autowired + private OfflineHandleEventService offlineHandleEventService; + + @GetMapping("/get_event_info") + @Operation(summary = "通过店铺id获取下线信息", description = "通过店铺id获取下线信息") + public ServerResponseEntity getOfflineHandleEventByShopId() { + Long shopId = AuthUserContext.get().getTenantId(); + if (Objects.equals(shopId, Constant.DEFAULT_SHOP_ID)) { + return ServerResponseEntity.success(); + } + Integer sysType = AuthUserContext.get().getSysType(); + OfflineHandleEventVO offlineHandleEvent = offlineHandleEventService.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.SHOP.getValue(), shopId, sysType); + return ServerResponseEntity.success(offlineHandleEvent); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/DistributionConfigController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/DistributionConfigController.java new file mode 100644 index 0000000..d64fbf1 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/DistributionConfigController.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.platform; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.common.constant.ConfigNameConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.DistributionAudit; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.platform.dto.DistributionConfigDTO; +import com.tmerclub.cloud.platform.dto.DistributionRecruitConfigDTO; +import com.tmerclub.cloud.platform.model.SysConfig; +import com.tmerclub.cloud.platform.service.SysConfigService; +import com.tmerclub.cloud.platform.vo.DistributionConfigVO; +import com.tmerclub.cloud.platform.vo.DistributionRecruitConfigVO; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @author cl + * @date 2021-08-06 14:18:03 + */ +@RestController +@RequestMapping("/p/distribution_config") +public class DistributionConfigController { + @Autowired + private SysConfigService sysConfigService; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + + /** + * 获取分销配置信息 + */ + @GetMapping("/info") + public ServerResponseEntity info() { + DistributionConfigVO distributionConfigVO = sysConfigService.getSysConfigObject(Constant.DISTRIBUTION_CONFIG, DistributionConfigVO.class); + List spuIdList = distributionConfigVO.getSpuIdList(); + if (CollUtil.isEmpty(spuIdList)) { + return ServerResponseEntity.success(distributionConfigVO); + } + ServerResponseEntity> spuResponse = searchSpuFeignClient.listSpuBySpuIds(spuIdList); + if (spuResponse.isSuccess()) { + distributionConfigVO.setSpuVOList(spuResponse.getData()); + } + return ServerResponseEntity.success(distributionConfigVO); + } + + /** + * 获取分销推广配置信息 + */ + @GetMapping("/recruit_info") + public ServerResponseEntity recruitInfo() { + DistributionRecruitConfigVO recruitConfigVO = sysConfigService.getSysConfigObject(Constant.DISTRIBUTION_RECRUIT_CONFIG, DistributionRecruitConfigVO.class); + return ServerResponseEntity.success(recruitConfigVO); + } + + /** + * 保存分销配置 + */ + @PostMapping + public ServerResponseEntity save(@RequestBody @Valid DistributionConfigDTO distributionConfigDTO) { + //提现发放方式: 0.无需审核直接发放,1.审核后系统发放,2.审核后人工发放 默认:审核后人工发放 + if (Objects.isNull(distributionConfigDTO.getWithdrawal())) { + distributionConfigDTO.setWithdrawal(DistributionAudit.TWithdrawals_TWO.value()); + } + SysConfig config = new SysConfig(); + String paramValue = Json.toJsonString(distributionConfigDTO); + config.setParamKey(Constant.DISTRIBUTION_CONFIG); + config.setParamValue(paramValue); + config.setRemark(ConfigNameConstant.DISTRIBUTION_REMARKS); + sysConfigService.saveOrUpdateSysConfig(config); + return ServerResponseEntity.success(); + } + + /** + * 保存分销配置 + */ + @PostMapping("/recruit") + public ServerResponseEntity saveRecruit(@RequestBody @Valid DistributionRecruitConfigDTO distributionRecruitConfigDTO) { + SysConfig config = new SysConfig(); + String paramValue = Json.toJsonString(distributionRecruitConfigDTO); + config.setParamKey(Constant.DISTRIBUTION_RECRUIT_CONFIG); + config.setParamValue(paramValue); + config.setRemark(ConfigNameConstant.DISTRIBUTION_RECRUIT_REMARKS); + sysConfigService.saveOrUpdateSysConfig(config); + return ServerResponseEntity.success(); + } + + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/GrowthConfigController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/GrowthConfigController.java new file mode 100644 index 0000000..0848e12 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/GrowthConfigController.java @@ -0,0 +1,66 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.platform; + + +import com.tmerclub.cloud.common.constant.ConfigNameConstant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.platform.dto.GrowthConfigDTO; +import com.tmerclub.cloud.platform.model.SysConfig; +import com.tmerclub.cloud.platform.service.SysConfigService; +import com.tmerclub.cloud.platform.vo.GrowthConfigVO; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + + +/** + * 成长值基本配置信息 + * @author lhd + */ +@RestController +@RequestMapping("/p/growth_config") +public class GrowthConfigController { + + @Autowired + private SysConfigService sysConfigService; + + + /** + * 配置信息 + */ + @GetMapping("/info/{key}") + public ServerResponseEntity info(@PathVariable("key") String key) { + GrowthConfigVO growthConfig = sysConfigService.getSysConfigObject(key, GrowthConfigVO.class); + if (Objects.isNull(growthConfig)) { + return ServerResponseEntity.success(); + } + return ServerResponseEntity.success(growthConfig); + } + + /** + * 保存配置 + */ + @PostMapping + public ServerResponseEntity save(@RequestBody @Valid GrowthConfigDTO growthConfig) { + SysConfig config = new SysConfig(); + String paramValue = Json.toJsonString(growthConfig); + config.setParamKey(ConfigNameConstant.GROWTH_CONFIG); + config.setParamValue(paramValue); + config.setRemark(ConfigNameConstant.GROWTH_REMARKS); + sysConfigService.saveOrUpdateSysConfig(config); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/SysAccessKeyController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/SysAccessKeyController.java new file mode 100644 index 0000000..a14bd26 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/SysAccessKeyController.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.platform; + +import com.tmerclub.cloud.api.platform.vo.SysAccessKeyVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.platform.dto.SysAccessKeyDTO; +import com.tmerclub.cloud.platform.model.SysAccessKey; +import com.tmerclub.cloud.platform.service.SysAccessKeyService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 系统密钥 + * @author TRACK + */ +@RestController("platformSysAccessKeyController") +@RequestMapping("/p/sys_access_key") +@Tag(name = "系统密钥") +public class SysAccessKeyController { + + @Autowired + private SysAccessKeyService sysAccessKeyService; + + + @GetMapping("/page") + @Operation(summary = "获取系统密钥列表", description = "分页获取系统密钥列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, SysAccessKeyDTO sysAccessKeyDTO) { + PageVO sysAccessKeyPage = sysAccessKeyService.page(pageDTO, sysAccessKeyDTO); + return ServerResponseEntity.success(sysAccessKeyPage); + } + + @GetMapping + @Operation(summary = "获取系统密钥", description = "根据sysAccessKeyId获取系统密钥") + public ServerResponseEntity getBySysAccessKeyId(@RequestParam Long sysAccessKeyId) { + return ServerResponseEntity.success(sysAccessKeyService.getBySysAccessKeyId(sysAccessKeyId)); + } + + @PostMapping + @Operation(summary = "保存系统密钥", description = "保存系统密钥") + public ServerResponseEntity save(@Valid @RequestBody SysAccessKeyDTO sysAccessKeyDTO) { + sysAccessKeyDTO.setSysAccessKeyId(null); + sysAccessKeyService.save(sysAccessKeyDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新系统密钥", description = "更新系统密钥") + public ServerResponseEntity update(@Valid @RequestBody SysAccessKeyDTO sysAccessKeyDTO) { + sysAccessKeyService.update(sysAccessKeyDTO); + sysAccessKeyService.removeCacheById(sysAccessKeyDTO.getAccessId()); + return ServerResponseEntity.success(); + } + + @PutMapping("/reset_access_key") + @Operation(summary = "重置系统访问密钥", description = "重置系统访问密钥") + @Parameter(name = "sysAccessKeyId", description = "系统访问密钥id") + public ServerResponseEntity resetAccessKey(@RequestParam("sysAccessKeyId") Long sysAccessKeyId) { + if (Objects.isNull(sysAccessKeyId)) { + throw new LuckException("sysAccessKeyId 不能为空"); + } + SysAccessKeyVO sysAccessKeyVO = sysAccessKeyService.getBySysAccessKeyId(sysAccessKeyId); + if (Objects.isNull(sysAccessKeyVO)) { + return ServerResponseEntity.success(); + } + sysAccessKeyService.resetAccessKey(sysAccessKeyId); + sysAccessKeyService.removeCacheById(sysAccessKeyVO.getAccessId()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除系统密钥", description = "根据系统密钥id删除系统密钥") + public ServerResponseEntity delete(@RequestParam Long sysAccessKeyId) { + SysAccessKeyVO sysAccessKeyVO = sysAccessKeyService.getBySysAccessKeyId(sysAccessKeyId); + if (Objects.isNull(sysAccessKeyVO)) { + return ServerResponseEntity.success(); + } + sysAccessKeyService.deleteById(sysAccessKeyId); + sysAccessKeyService.removeCacheById(sysAccessKeyVO.getAccessId()); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/SysConfigController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/SysConfigController.java new file mode 100644 index 0000000..516aeae --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/SysConfigController.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.platform; + +import com.tmerclub.cloud.common.bean.Quick100; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.platform.service.SysConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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; + +/** + * @author track + */ +@RestController("platSysConfigController") +@RequestMapping("/p/ua/sys_config") +@Tag(name = "plat-系统配置信息") +public class SysConfigController { + + @Autowired + private SysConfigService sysConfigService; + + @GetMapping("/pay_settlement_type") + @Operation(summary = "获取支付系统配置", description = "获取支付系统配置") + public ServerResponseEntity getPaySettlementType() { + return ServerResponseEntity.success(sysConfigService.getValue(Constant.PAY_SETTLEMENT_CONFIG)); + } + @GetMapping("/quick_100") + @Operation(summary = "获取快递100配置", description = "获取快递100配置") + public ServerResponseEntity getQuick100() { + Quick100 quick100 = sysConfigService.getSysConfigObject(Constant.QUICK100_CONFIG, Quick100.class); + return ServerResponseEntity.success(quick100.getIsPrint()); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/ChangeAccountDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/ChangeAccountDTO.java new file mode 100644 index 0000000..f35377d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/ChangeAccountDTO.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lhd + * @date 2020/12/22 + */ +public class ChangeAccountDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull(message = "用户id不能为空") + @Schema(description = "用户id") + private Long userId; + + @NotBlank(message = "用户名不能为空") + @Schema(description = "用户名") + private String username; + + @Schema(description = "密码") + private String password; + + @NotNull(message = "状态不能为空") + @Schema(description = "状态 1启用 0禁用") + private Integer status; + + @Schema(description = "邮箱") + private String email; + + @Schema(description = "手机号") + private String phone; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + @Override + public String toString() { + return "ChangeAccountDTO{" + + "userId=" + userId + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", status=" + status + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/GrowthConfigDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/GrowthConfigDTO.java new file mode 100644 index 0000000..2d53c8d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/GrowthConfigDTO.java @@ -0,0 +1,65 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.dto; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 成长配置信息 + * @author lhd + */ +public class GrowthConfigDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 成长值获取开关 + */ + private Boolean shopGrowthSwitch; + + private Double buyPrice; + + private Double buyOrder; + + public Boolean getShopGrowthSwitch() { + return shopGrowthSwitch; + } + + public void setShopGrowthSwitch(Boolean shopGrowthSwitch) { + this.shopGrowthSwitch = shopGrowthSwitch; + } + + public Double getBuyPrice() { + return buyPrice; + } + + public void setBuyPrice(Double buyPrice) { + this.buyPrice = buyPrice; + } + + public Double getBuyOrder() { + return buyOrder; + } + + public void setBuyOrder(Double buyOrder) { + this.buyOrder = buyOrder; + } + + @Override + public String toString() { + return "GrowthConfigDTO{" + + "shopGrowthSwitch=" + shopGrowthSwitch + + ", buyPrice=" + buyPrice + + ", buyOrder=" + buyOrder + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/OfflineHandleEventItemDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/OfflineHandleEventItemDTO.java new file mode 100644 index 0000000..43db66e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/OfflineHandleEventItemDTO.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 下线处理事件记录项DTO + * + * @author YXF + * @date 2021-01-15 17:46:26 + */ +public class OfflineHandleEventItemDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long eventItemId; + + @Schema(description = "事件id") + private Long eventId; + + @Schema(description = "重新申请上线理由") + private String reapplyReason; + + @Schema(description = "拒绝原因") + private String refuseReason; + + @Schema(description = "重新申请上线时间") + private Date reapplyTime; + + @Schema(description = "审核时间") + private Date auditTime; + + public Long getEventItemId() { + return eventItemId; + } + + public void setEventItemId(Long eventItemId) { + this.eventItemId = eventItemId; + } + + public Long getEventId() { + return eventId; + } + + public void setEventId(Long eventId) { + this.eventId = eventId; + } + + public String getReapplyReason() { + return reapplyReason; + } + + public void setReapplyReason(String reapplyReason) { + this.reapplyReason = reapplyReason; + } + + public String getRefuseReason() { + return refuseReason; + } + + public void setRefuseReason(String refuseReason) { + this.refuseReason = refuseReason; + } + + public Date getReapplyTime() { + return reapplyTime; + } + + public void setReapplyTime(Date reapplyTime) { + this.reapplyTime = reapplyTime; + } + + public Date getAuditTime() { + return auditTime; + } + + public void setAuditTime(Date auditTime) { + this.auditTime = auditTime; + } + + @Override + public String toString() { + return "OfflineHandleEventItemDTO{" + + "eventItemId=" + eventItemId + + ",eventId=" + eventId + + ",reapplyReason=" + reapplyReason + + ",refuseReason=" + refuseReason + + ",reapplyTime=" + reapplyTime + + ",auditTime=" + auditTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/ScoreConfigDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/ScoreConfigDTO.java new file mode 100644 index 0000000..6529e21 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/ScoreConfigDTO.java @@ -0,0 +1,182 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.dto; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 积分配置信息 + * @author lhd + */ +public class ScoreConfigDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long id; + + /** + * 参数名 + */ + private String paramKey; + /** + * 参数值 + */ + private String paramValue; + + /** + * 签到获取积分 + */ + private String signInScoreString; + + /** + * 签到获取积分 + */ + private List signInScore; + + /** + * 注册获取积分 + */ + private Long registerScore; + + /** + * 购物开关 + */ + private Boolean shoppingScoreSwitch; + + /** + * 购物获取积分(x元获取1积分) + */ + private Long shoppingGetScore; + + /** + * 购物使用积分抵现比例(x积分抵扣1元) + */ + private Long shoppingUseScoreRatio; + + /** + * 购物积分分类获取比例上限 + */ + private Double getRatioLimit; + + /** + * 平台使用积分分类比例上限 + */ + private Double useRatioLimit; + + public Double getUseRatioLimit() { + return useRatioLimit; + } + + public void setUseRatioLimit(Double useRatioLimit) { + this.useRatioLimit = useRatioLimit; + } + + public Double getGetRatioLimit() { + return getRatioLimit; + } + + public void setGetRatioLimit(Double getRatioLimit) { + this.getRatioLimit = getRatioLimit; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getParamKey() { + return paramKey; + } + + public void setParamKey(String paramKey) { + this.paramKey = paramKey; + } + + public String getParamValue() { + return paramValue; + } + + public void setParamValue(String paramValue) { + this.paramValue = paramValue; + } + + public String getSignInScoreString() { + return signInScoreString; + } + + public void setSignInScoreString(String signInScoreString) { + this.signInScoreString = signInScoreString; + } + + public List getSignInScore() { + return signInScore; + } + + public void setSignInScore(List signInScore) { + this.signInScore = signInScore; + } + + public Long getRegisterScore() { + return registerScore; + } + + public void setRegisterScore(Long registerScore) { + this.registerScore = registerScore; + } + + public Boolean getShoppingScoreSwitch() { + return shoppingScoreSwitch; + } + + public void setShoppingScoreSwitch(Boolean shoppingScoreSwitch) { + this.shoppingScoreSwitch = shoppingScoreSwitch; + } + + public Long getShoppingGetScore() { + return shoppingGetScore; + } + + public void setShoppingGetScore(Long shoppingGetScore) { + this.shoppingGetScore = shoppingGetScore; + } + + public Long getShoppingUseScoreRatio() { + return shoppingUseScoreRatio; + } + + public void setShoppingUseScoreRatio(Long shoppingUseScoreRatio) { + this.shoppingUseScoreRatio = shoppingUseScoreRatio; + } + + @Override + public String toString() { + return "ScoreConfigVO{" + + "id=" + id + + ", paramKey='" + paramKey + '\'' + + ", paramValue='" + paramValue + '\'' + + ", signInScoreString='" + signInScoreString + '\'' + + ", signInScore=" + signInScore + + ", registerScore=" + registerScore + + ", shoppingScoreSwitch=" + shoppingScoreSwitch + + ", shoppingGetScore=" + shoppingGetScore + + ", shoppingUseScoreRatio=" + shoppingUseScoreRatio + + ", useRatioLimit=" + useRatioLimit + + ", getRatioLimit=" + getRatioLimit + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/ScoreExpireConfigDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/ScoreExpireConfigDTO.java new file mode 100644 index 0000000..3c52860 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/ScoreExpireConfigDTO.java @@ -0,0 +1,56 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.dto; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lhd + * @date 2020/12/30 + */ +public class ScoreExpireConfigDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 过期年限 + */ + private Integer expireYear; + + /** + * 积分过期开关 + */ + private Boolean scoreExpireSwitch; + + public Integer getExpireYear() { + return expireYear; + } + + public void setExpireYear(Integer expireYear) { + this.expireYear = expireYear; + } + + public Boolean getScoreExpireSwitch() { + return scoreExpireSwitch; + } + + public void setScoreExpireSwitch(Boolean scoreExpireSwitch) { + this.scoreExpireSwitch = scoreExpireSwitch; + } + + @Override + public String toString() { + return "ScoreExpireConfigVO{" + + "expireYear=" + expireYear + + ", scoreExpireSwitch=" + scoreExpireSwitch + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/SysAccessKeyDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/SysAccessKeyDTO.java new file mode 100644 index 0000000..d6ac22b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/SysAccessKeyDTO.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 系统密钥DTO + * @author TRACK + */ +public class SysAccessKeyDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long sysAccessKeyId; + + @Schema(description = "名称") + private String name; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "账号id") + private String accessId; + + @Schema(description = "密钥") + private String accessKey; + + @Schema(description = "系统类型 0.c端用户 1.商家端 2.平台端" ) + private Integer sysType; + + @Schema(description = "密钥权限类型 0.全部权限 1.指定权限" ) + private Integer premType; + + @Schema(description = "密钥可用店铺id,如果为0则为所有店铺" ) + private Long usabilityShopId; + + @Schema(description = "菜单id列表" ) + private List menuIdList; + + @Schema(description = "菜单资源id") + private List menuPermissionId; + + public List getMenuPermissionId() { + return menuPermissionId; + } + + public void setMenuPermissionId(List menuPermissionId) { + this.menuPermissionId = menuPermissionId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Integer getPremType() { + return premType; + } + + public void setPremType(Integer premType) { + this.premType = premType; + } + + public Long getUsabilityShopId() { + return usabilityShopId; + } + + public void setUsabilityShopId(Long usabilityShopId) { + this.usabilityShopId = usabilityShopId; + } + + public List getMenuIdList() { + return menuIdList; + } + + public void setMenuIdList(List menuIdList) { + this.menuIdList = menuIdList; + } + + public Long getSysAccessKeyId() { + return sysAccessKeyId; + } + + public void setSysAccessKeyId(Long sysAccessKeyId) { + this.sysAccessKeyId = sysAccessKeyId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getAccessId() { + return accessId; + } + + public void setAccessId(String accessId) { + this.accessId = accessId; + } + + public String getAccessKey() { + return accessKey; + } + + public void setAccessKey(String accessKey) { + this.accessKey = accessKey; + } + + @Override + public String toString() { + return "SysAccessKeyDTO{" + + "sysAccessKeyId=" + sysAccessKeyId + + ",name=" + name + + ",remark=" + remark + + ",accessId=" + accessId + + ",accessKey=" + accessKey + + ",menuPermissionId=" + menuPermissionId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/SysUserDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/SysUserDTO.java new file mode 100644 index 0000000..44137d2 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/SysUserDTO.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lhd + * @date 2020/9/8 + */ +public class SysUserDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "平台用户id") + private Long sysUserId; + + @NotBlank(message = "昵称不能为空") + @Schema(description = "昵称") + private String nickName; + + @NotBlank(message = "头像不能为空") + @Schema(description = "头像") + private String avatar; + + @Schema(description = "员工编号") + private String code; + + @Schema(description = "联系方式") + private String phoneNum; + + @Schema(description = "角色id列表") + private List roleIds; + + @Schema(description = "店铺id") + private Long shopId; + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPhoneNum() { + return phoneNum; + } + + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } + + public Long getSysUserId() { + return sysUserId; + } + + public void setSysUserId(Long sysUserId) { + this.sysUserId = sysUserId; + } + + public List getRoleIds() { + return roleIds; + } + + public void setRoleIds(List roleIds) { + this.roleIds = roleIds; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "SysUserDTO{" + + "sysUserId=" + sysUserId + + ", nickName='" + nickName + '\'' + + ", avatar='" + avatar + '\'' + + ", code='" + code + '\'' + + ", phoneNum='" + phoneNum + '\'' + + ", roleIds=" + roleIds + + ", shopId=" + shopId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/ConfigFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/ConfigFeignController.java new file mode 100644 index 0000000..db429b9 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/ConfigFeignController.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.feign; + +import com.tmerclub.cloud.api.payment.vo.PaySettlementConfigVO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysConfigApiVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.platform.model.SysConfig; +import com.tmerclub.cloud.platform.service.SysConfigService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author FrozenWatermelon + * @date 2020/12/30 + */ +@DubboService +public class ConfigFeignController implements ConfigFeignClient { + + @Autowired + private SysConfigService sysConfigService; + + + @Override + public ServerResponseEntity getConfig(String key) { + return ServerResponseEntity.success(sysConfigService.getValue(key)); + } + + @Override + public ServerResponseEntity getPaySysType() { + String value = sysConfigService.getValue(Constant.PAY_SETTLEMENT_CONFIG); + PaySettlementConfigVO paySettlementConfigVO = Json.parseObject(value, PaySettlementConfigVO.class); + return ServerResponseEntity.success(paySettlementConfigVO.getPaySettlementType()); + } + + @Override + public void saveOrUpdateSysConfig(SysConfigApiVO sysConfigApiVO) { + SysConfig sysConfig = BeanUtil.map(sysConfigApiVO, SysConfig.class); + sysConfigService.saveOrUpdateSysConfig(sysConfig); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/OfflineHandleEventFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/OfflineHandleEventFeignController.java new file mode 100644 index 0000000..5f6b13c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/OfflineHandleEventFeignController.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.feign; + +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.platform.model.OfflineHandleEvent; +import com.tmerclub.cloud.platform.service.OfflineHandleEventService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/30 + */ +@DubboService +public class OfflineHandleEventFeignController implements OfflineHandleEventFeignClient { + + @Autowired + private OfflineHandleEventService offlineHandleEventService; + + @Override + public ServerResponseEntity save(OfflineHandleEventDTO offlineHandleEventDto) { + int count = offlineHandleEventService.offlineCount(offlineHandleEventDto.getHandleType(), offlineHandleEventDto.getHandleId(), offlineHandleEventDto.getSysType()); + if (count > 0) { + throw new LuckException("该活动状态异常不能下线,请刷新页面!"); + } + OfflineHandleEvent offlineHandleEvent = BeanUtil.map(offlineHandleEventDto, OfflineHandleEvent.class); + offlineHandleEventService.save(offlineHandleEvent); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity getProcessingEventByHandleTypeAndHandleId(Integer handleType, Long handleId, Integer sysType) { + OfflineHandleEventVO offlineHandleEventVO = offlineHandleEventService.getProcessingEventByHandleTypeAndHandleId(handleType, handleId, sysType); + return ServerResponseEntity.success(offlineHandleEventVO); + } + + @Override + public ServerResponseEntity auditOfflineEvent(OfflineHandleEventDTO offlineHandleEventDto) { + offlineHandleEventService.auditOfflineEvent(offlineHandleEventDto); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity updateToApply(OfflineHandleEventDTO offlineHandleEventDto) { + offlineHandleEventService.updateToApply(offlineHandleEventDto.getEventId(), offlineHandleEventDto.getReapplyReason()); + return ServerResponseEntity.success(); + } + + @Override + public void update(OfflineHandleEventDTO offlineHandleEventDto) { + offlineHandleEventService.update(offlineHandleEventDto); + } + + @Override + public ServerResponseEntity deleteByHandleTypeAndHandleId(Integer handleType, Long handleId) { + offlineHandleEventService.deleteByHandleTypeAndHandleId(handleType, handleId); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity batchSave(List offlineHandleEventList) { + for (OfflineHandleEventDTO offlineHandleEvent : offlineHandleEventList) { + offlineHandleEvent.setShopId(AuthUserContext.get().getTenantId()); + offlineHandleEvent.setHandlerId(AuthUserContext.get().getUserId()); + offlineHandleEvent.setStatus(OfflineHandleEventStatus.OFFLINE_BY_PLATFORM.getValue()); + } + offlineHandleEventService.batchSave(offlineHandleEventList); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/SysAccessKeyFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/SysAccessKeyFeignController.java new file mode 100644 index 0000000..9ca36c9 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/SysAccessKeyFeignController.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.feign; + +import com.tmerclub.cloud.api.platform.feign.SysAccessKeyFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysAccessKeyVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.platform.service.SysAccessKeyService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author TRAKC + */ +@DubboService +public class SysAccessKeyFeignController implements SysAccessKeyFeignClient { + + @Autowired + private SysAccessKeyService sysAccessKeyService; + + @Override + public ServerResponseEntity getByAccessId(String accessId) { + SysAccessKeyVO accessKeyVO = sysAccessKeyService.getByAccessId(accessId); + return ServerResponseEntity.success(accessKeyVO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/OfflineHandleEventMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/OfflineHandleEventMapper.java new file mode 100644 index 0000000..2efe845 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/OfflineHandleEventMapper.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.mapper; + +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.platform.model.OfflineHandleEvent; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 下线处理事件 + * + * @author YXF + * @date 2021-01-15 17:46:26 + */ +public interface OfflineHandleEventMapper { + + /** + * 获取下线处理事件列表 + * + * @return 下线处理事件列表 + */ + List list(); + + /** + * 根据下线处理事件id获取下线处理事件 + * + * @param eventId 下线处理事件id + * @return 下线处理事件 + */ + OfflineHandleEvent getByEventId(@Param("eventId") Long eventId); + + /** + * 保存下线处理事件 + * + * @param offlineHandleEvent 下线处理事件 + */ + void save(@Param("offlineHandleEvent") OfflineHandleEvent offlineHandleEvent); + + /** + * 更新下线处理事件 + * + * @param offlineHandleEvent 下线处理事件 + */ + void update(@Param("offlineHandleEvent") OfflineHandleEvent offlineHandleEvent); + + /** + * 更新事件为申请状态 + * + * @param eventId + */ + void updateToApply(Long eventId); + + /** + * 通过事件类型和所属id获取正在处理的下线事件信息 + * + * @param handleType + * @param handleId + * @param sysType + * @return + */ + OfflineHandleEventVO getProcessingEventByHandleTypeAndHandleId(@Param("handleType") Integer handleType, @Param("handleId") Long handleId, @Param("sysType") Integer sysType); + + /** + * 统计审核的数量 + * + * @param handleType + * @param handleId + * @param sysType + * @return + */ + int offlineCount(@Param("handleType") Integer handleType, @Param("handleId") Long handleId, @Param("sysType") Integer sysType); + + /** + * 获取事件id列表 + * + * @param handleType + * @param handleId + * @return + */ + List listIdByHandleTypeAndHandleId(@Param("handleType") Integer handleType, @Param("handleId") Long handleId); + + /** + * 删除事件 + * + * @param handleType + * @param handleId + */ + void deleteByHandleTypeAndHandleId(@Param("handleType") Integer handleType, @Param("handleId") Long handleId); + + /** + * 保存下线处理事件 + * + * @param offlineHandleEventList 下线处理事件 + */ + void batchSave(@Param("offlineHandleEventList") List offlineHandleEventList); + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysUserMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysUserMapper.java new file mode 100644 index 0000000..27aca5d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysUserMapper.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.mapper; + +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.platform.dto.SysUserDTO; +import com.tmerclub.cloud.platform.model.SysUser; +import com.tmerclub.cloud.platform.vo.SysUserSimpleVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author lhd + * @date 2020/12/22 + */ +public interface SysUserMapper { + + /** + * 根据用户id获取当前登陆的商家用户信息 + * + * @param userId 用户id + * @return 商家用户信息 + */ + SysUserSimpleVO getSimpleByUserId(@Param("userId") Long userId); + + /** + * 获取平台用户列表 + * + * @param sysUserDTO 搜索参数 + * @return 平台用户列表 + */ + List listByShopId(@Param("sysUser") SysUserDTO sysUserDTO); + + /** + * 根据用户id获取商家用户信息 + * + * @param userId 用户id + * @return 商家用户信息 + */ + SysUserVO getByUserId(@Param("userId") Long userId); + + /** + * 保存商家用户信息 + * + * @param sysUser + */ + void save(@Param("sysUser") SysUser sysUser); + + /** + * 更新平台用户信息 + * + * @param sysUser + */ + void update(@Param("sysUser") SysUser sysUser); + + /** + * 根据平台用户id删除平台用户 + * + * @param sysUserId + */ + void deleteById(@Param("sysUserId") Long sysUserId); + + /** + * 根据昵称统计已有的数量 + * + * @param nickName + * @param sysUserId + * @return + */ + int countNickName(@Param("nickName") String nickName, @Param("sysUserId") Long sysUserId); + + /** + * 根据用户id列表查名称 + * + * @param userIds 用户id列表 + * @return + */ + List getUserName(@Param("userIds") List userIds); + + /** + * 更新电话号码 + * + * @param sysUserId + * @param phoneNum + */ + void updatePhoneNum(@Param("sysUserId") Long sysUserId, @Param("phoneNum") String phoneNum); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/WebConfigMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/WebConfigMapper.java new file mode 100644 index 0000000..e0dc840 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/WebConfigMapper.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.mapper; + +import com.tmerclub.cloud.platform.dto.WebConfigDTO; +import com.tmerclub.cloud.platform.model.WebConfig; +import com.tmerclub.cloud.platform.vo.WebConfigVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 网站配置信息表 + * + * @author Orange + */ +public interface WebConfigMapper { + + /** + * 获取网站配置信息表列表 + * @param webConfig 搜索参数 + * @return 网站配置信息表列表 + */ + List list(@Param("webConfig") WebConfigDTO webConfig); + + /** + * 根据网站配置信息表id获取网站配置信息表 + * + * @param id 网站配置信息表id + * @return 网站配置信息表 + */ + WebConfig getById(@Param("id") Long id); + + /** + * 保存网站配置信息表 + * @param webConfig 网站配置信息表 + */ + void save(@Param("webConfig") WebConfig webConfig); + + /** + * 更新网站配置信息表 + * @param webConfig 网站配置信息表 + */ + void update(@Param("webConfig") WebConfig webConfig); + + /** + * 根据网站配置信息表id删除网站配置信息表 + * @param id + */ + void deleteById(@Param("id") Long id); + + /** + * 根据网站类型修改已经激活的网站为待激活 + * @param configType 配置类型(1:平台端 2:商家端 3:PC端 4:h5端) + */ + void updateActivityState(@Param("configType") Integer configType); + + /** + * 获取网站配置信息 + * @param configType 配置类型(1:平台端 2:商家端 3:PC端 4:h5端) + * @return 网站配置信息 + */ + WebConfigVO getByType(@Param("configType") Integer configType); + + /** + * 获取激活网站配置数量 + * @param configType + * @return + */ + int countByType(@Param("configType") Integer configType); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/OfflineHandleEventItem.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/OfflineHandleEventItem.java new file mode 100644 index 0000000..43342f1 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/OfflineHandleEventItem.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 下线处理事件记录项 + * + * @author YXF + * @date 2021-01-15 17:46:26 + */ +public class OfflineHandleEventItem extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long eventItemId; + + /** + * 事件id + */ + private Long eventId; + + /** + * 重新申请上线理由 + */ + private String reapplyReason; + + /** + * 拒绝原因 + */ + private String refuseReason; + + /** + * 重新申请上线时间 + */ + private Date reapplyTime; + + /** + * 审核时间 + */ + private Date auditTime; + + public Long getEventItemId() { + return eventItemId; + } + + public void setEventItemId(Long eventItemId) { + this.eventItemId = eventItemId; + } + + public Long getEventId() { + return eventId; + } + + public void setEventId(Long eventId) { + this.eventId = eventId; + } + + public String getReapplyReason() { + return reapplyReason; + } + + public void setReapplyReason(String reapplyReason) { + this.reapplyReason = reapplyReason; + } + + public String getRefuseReason() { + return refuseReason; + } + + public void setRefuseReason(String refuseReason) { + this.refuseReason = refuseReason; + } + + public Date getReapplyTime() { + return reapplyTime; + } + + public void setReapplyTime(Date reapplyTime) { + this.reapplyTime = reapplyTime; + } + + public Date getAuditTime() { + return auditTime; + } + + public void setAuditTime(Date auditTime) { + this.auditTime = auditTime; + } + + @Override + public String toString() { + return "OfflineHandleEventItem{" + + "eventItemId=" + eventItemId + + ",createTime=" + createTime + + ",eventId=" + eventId + + ",reapplyReason=" + reapplyReason + + ",refuseReason=" + refuseReason + + ",reapplyTime=" + reapplyTime + + ",auditTime=" + auditTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysAccessMenu.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysAccessMenu.java new file mode 100644 index 0000000..1d86a81 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysAccessMenu.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.model; + + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serializable; + +/** + * 密钥对应可用菜单 + * @author LGH + */ + +@Schema(description = "密钥对应可用菜单") +public class SysAccessMenu implements Serializable { + private static final long serialVersionUID = 1L; + + private Long id; + @Schema(description = "密钥id") + private Long sysAccessKeyId; + @Schema(description = "菜单ID") + private Long menuId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSysAccessKeyId() { + return sysAccessKeyId; + } + + public void setSysAccessKeyId(Long sysAccessKeyId) { + this.sysAccessKeyId = sysAccessKeyId; + } + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + @Override + public String toString() { + return "SysAccessMenu{" + + "id=" + id + + ", sysAccessKeyId=" + sysAccessKeyId + + ", menuId=" + menuId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysAccessMenuPermission.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysAccessMenuPermission.java new file mode 100644 index 0000000..ca10aa4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysAccessMenuPermission.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.model; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serializable; + +/** + * @author xxw + * @version 1.0 + * @description: + * @since 2024/1/9 10:14 + */ +@Schema(description = "密钥对应可用菜单资源") +public class SysAccessMenuPermission implements Serializable { + private static final long serialVersionUID = 1L; + private Long id; + + @Schema(description = "密钥id") + private Long sysAccessKeyId; + + @Schema(description = "菜单资源ID") + private Long menuPermissionId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSysAccessKeyId() { + return sysAccessKeyId; + } + + public void setSysAccessKeyId(Long sysAccessKeyId) { + this.sysAccessKeyId = sysAccessKeyId; + } + + public Long getMenuPermissionId() { + return menuPermissionId; + } + + public void setMenuPermissionId(Long menuPermissionId) { + this.menuPermissionId = menuPermissionId; + } + + @Override + public String toString() { + return "SysAccessMenuPermission{" + + "id=" + id + + ", sysAccessKeyId=" + sysAccessKeyId + + ", menuPermissionId=" + menuPermissionId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/WebConfig.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/WebConfig.java new file mode 100644 index 0000000..142bd02 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/WebConfig.java @@ -0,0 +1,381 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 网站配置信息表 + * + * @author Orange + */ +public class WebConfig extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 主键 + */ + private Long id; + + /** + * 配置类型(1:平台端 2:商家端 3:PC端 4:h5端 6:供应商端) + */ + private Integer configType; + + /** + * 激活(0:否 1:是) + */ + private Integer isActivity; + + /** + * 登录logo + */ + private String loginLogoImg; + + /** + * 登录背景(后台+pc) + */ + private String loginBgImg; + + /** + * 版权声明-中文(后台+pc) + */ + private String copyrightCn; + + /** + * 版权声明-英文(后台+pc) + */ + private String copyrightEn; + + /** + * 网站标题文本-中文(后台+pc+h5) + */ + private String titleContentCn; + + /** + * 网站标题文本-英文(后台+pc+h5) + */ + private String titleContentEn; + + /** + * 标题图标(后台+pc) + */ + private String titleImg; + + /** + * 后台-菜单展开时的文本-中文 + */ + private String bsMenuTitleOpenCn; + + /** + * 后台-菜单展开时的文本-英文 + */ + private String bsMenuTitleOpenEn; + + /** + * 后台-菜单缩小时的文本-中文 + */ + private String bsMenuTitleCloseCn; + + /** + * 后台-菜单缩小时的文本-英文 + */ + private String bsMenuTitleCloseEn; + + /** + * 后台-顶部栏图标 + */ + private String bsTopBarIcon; + + /** + * PC-底部二维码 + */ + private String pcQrcodeImg; + + /** + * PC-公司全名-中文 + */ + private String pcCompanyNameCn; + + /** + * PC-公司全名-英文 + */ + private String pcCompanyNameEn; + + /** + * PC-公司名简写-中文 + */ + private String pcCompanyNameShortCn; + + /** + * PC-公司名简写-英文 + */ + private String pcCompanyNameShortEn; + + /** + * PC-公司图文logo(注册、登录、改密时显示) + */ + private String pcLogoImgText; + + /** + * PC-导航栏欢迎语-中文 + */ + private String pcWelcomeCn; + + /** + * PC-导航栏欢迎语-英文 + */ + private String pcWelcomeEn; + + /** + * PC-底部公司地址等信息-中文 + */ + private String pcCompanyInfoCn; + + /** + * PC-底部公司地址等信息-英文 + */ + private String pcCompanyInfoEn; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getConfigType() { + return configType; + } + + public void setConfigType(Integer configType) { + this.configType = configType; + } + + public Integer getIsActivity() { + return isActivity; + } + + public void setIsActivity(Integer isActivity) { + this.isActivity = isActivity; + } + + public String getLoginLogoImg() { + return loginLogoImg; + } + + public void setLoginLogoImg(String loginLogoImg) { + this.loginLogoImg = loginLogoImg; + } + + public String getLoginBgImg() { + return loginBgImg; + } + + public void setLoginBgImg(String loginBgImg) { + this.loginBgImg = loginBgImg; + } + + public String getCopyrightCn() { + return copyrightCn; + } + + public void setCopyrightCn(String copyrightCn) { + this.copyrightCn = copyrightCn; + } + + public String getCopyrightEn() { + return copyrightEn; + } + + public void setCopyrightEn(String copyrightEn) { + this.copyrightEn = copyrightEn; + } + + public String getTitleContentCn() { + return titleContentCn; + } + + public void setTitleContentCn(String titleContentCn) { + this.titleContentCn = titleContentCn; + } + + public String getTitleContentEn() { + return titleContentEn; + } + + public void setTitleContentEn(String titleContentEn) { + this.titleContentEn = titleContentEn; + } + + public String getTitleImg() { + return titleImg; + } + + public void setTitleImg(String titleImg) { + this.titleImg = titleImg; + } + + public String getBsMenuTitleOpenCn() { + return bsMenuTitleOpenCn; + } + + public void setBsMenuTitleOpenCn(String bsMenuTitleOpenCn) { + this.bsMenuTitleOpenCn = bsMenuTitleOpenCn; + } + + public String getBsMenuTitleOpenEn() { + return bsMenuTitleOpenEn; + } + + public void setBsMenuTitleOpenEn(String bsMenuTitleOpenEn) { + this.bsMenuTitleOpenEn = bsMenuTitleOpenEn; + } + + public String getBsMenuTitleCloseCn() { + return bsMenuTitleCloseCn; + } + + public void setBsMenuTitleCloseCn(String bsMenuTitleCloseCn) { + this.bsMenuTitleCloseCn = bsMenuTitleCloseCn; + } + + public String getBsMenuTitleCloseEn() { + return bsMenuTitleCloseEn; + } + + public void setBsMenuTitleCloseEn(String bsMenuTitleCloseEn) { + this.bsMenuTitleCloseEn = bsMenuTitleCloseEn; + } + + public String getBsTopBarIcon() { + return bsTopBarIcon; + } + + public void setBsTopBarIcon(String bsTopBarIcon) { + this.bsTopBarIcon = bsTopBarIcon; + } + + public String getPcQrcodeImg() { + return pcQrcodeImg; + } + + public void setPcQrcodeImg(String pcQrcodeImg) { + this.pcQrcodeImg = pcQrcodeImg; + } + + public String getPcCompanyNameCn() { + return pcCompanyNameCn; + } + + public void setPcCompanyNameCn(String pcCompanyNameCn) { + this.pcCompanyNameCn = pcCompanyNameCn; + } + + public String getPcCompanyNameEn() { + return pcCompanyNameEn; + } + + public void setPcCompanyNameEn(String pcCompanyNameEn) { + this.pcCompanyNameEn = pcCompanyNameEn; + } + + public String getPcCompanyNameShortCn() { + return pcCompanyNameShortCn; + } + + public void setPcCompanyNameShortCn(String pcCompanyNameShortCn) { + this.pcCompanyNameShortCn = pcCompanyNameShortCn; + } + + public String getPcCompanyNameShortEn() { + return pcCompanyNameShortEn; + } + + public void setPcCompanyNameShortEn(String pcCompanyNameShortEn) { + this.pcCompanyNameShortEn = pcCompanyNameShortEn; + } + + public String getPcLogoImgText() { + return pcLogoImgText; + } + + public void setPcLogoImgText(String pcLogoImgText) { + this.pcLogoImgText = pcLogoImgText; + } + + public String getPcWelcomeCn() { + return pcWelcomeCn; + } + + public void setPcWelcomeCn(String pcWelcomeCn) { + this.pcWelcomeCn = pcWelcomeCn; + } + + public String getPcWelcomeEn() { + return pcWelcomeEn; + } + + public void setPcWelcomeEn(String pcWelcomeEn) { + this.pcWelcomeEn = pcWelcomeEn; + } + + public String getPcCompanyInfoCn() { + return pcCompanyInfoCn; + } + + public void setPcCompanyInfoCn(String pcCompanyInfoCn) { + this.pcCompanyInfoCn = pcCompanyInfoCn; + } + + public String getPcCompanyInfoEn() { + return pcCompanyInfoEn; + } + + public void setPcCompanyInfoEn(String pcCompanyInfoEn) { + this.pcCompanyInfoEn = pcCompanyInfoEn; + } + + @Override + public String toString() { + return "WebConfig{" + + "id=" + id + + ",configType=" + configType + + ",isActivity=" + isActivity + + ",loginLogoImg=" + loginLogoImg + + ",copyrightCn=" + copyrightCn + + ",copyrightEn=" + copyrightEn + + ",titleContentCn=" + titleContentCn + + ",titleContentEn=" + titleContentEn + + ",loginBgImg=" + loginBgImg + + ",titleImg=" + titleImg + + ",bsMenuTitleOpenCn=" + bsMenuTitleOpenCn + + ",bsMenuTitleOpenEn=" + bsMenuTitleOpenEn + + ",bsMenuTitleCloseCn=" + bsMenuTitleCloseCn + + ",bsMenuTitleCloseEn=" + bsMenuTitleCloseEn + + ",bsTopBarIcon=" + bsTopBarIcon + + ",pcQrcodeImg=" + pcQrcodeImg + + ",pcCompanyNameCn=" + pcCompanyNameCn + + ",pcCompanyNameEn=" + pcCompanyNameEn + + ",pcCompanyNameShortCn=" + pcCompanyNameShortCn + + ",pcCompanyNameShortEn=" + pcCompanyNameShortEn + + ",pcLogoImgText=" + pcLogoImgText + + ",pcWelcomeCn=" + pcWelcomeCn + + ",pcWelcomeEn=" + pcWelcomeEn + + ",pcCompanyInfoCn=" + pcCompanyInfoCn + + ",pcCompanyInfoEn=" + pcCompanyInfoEn + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/OfflineHandleEventService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/OfflineHandleEventService.java new file mode 100644 index 0000000..6a5bceb --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/OfflineHandleEventService.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service; + +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.platform.model.OfflineHandleEvent; + +import java.util.List; + +/** + * 下线处理事件 + * + * @author YXF + * @date 2021-01-15 17:46:26 + */ +public interface OfflineHandleEventService { + + /** + * 分页获取下线处理事件列表 + * @param pageDTO 分页参数 + * @return 下线处理事件列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据下线处理事件id获取下线处理事件 + * + * @param eventId 下线处理事件id + * @return 下线处理事件 + */ + OfflineHandleEventVO getByEventId(Long eventId); + + /** + * 保存下线处理事件 + * @param offlineHandleEvent 下线处理事件 + */ + void save(OfflineHandleEvent offlineHandleEvent); + + /** + * 更新事件为申请状态 + * @param eventId + * @param reapplyReason + */ + void apply(Long eventId, String reapplyReason); + + /** + * 通过事件类型和所属id获取正在处理的下线事件信息 + * @param handleType + * @param handleId + * @param sysType + * @return + */ + OfflineHandleEventVO getProcessingEventByHandleTypeAndHandleId(Integer handleType, Long handleId, Integer sysType); + + /** + * 更新下线时间为申请状态 + * @param eventId + * @param reapplyReason + */ + void updateToApply(Long eventId, String reapplyReason); + + /** + * 审核下线事件 + * @param offlineHandleEventDTO + */ + void auditOfflineEvent(OfflineHandleEventDTO offlineHandleEventDTO); + + /** + * 统计审核的数量 + * + * @param handleType + * @param handleId + * @param sysType + * @return + */ + int offlineCount(Integer handleType, Long handleId, Integer sysType); + + /** + * 更新审核事件 + * @param offlineHandleEventDto + */ + void update(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 根据事件类型与事件id删除事件 + * @param handleType + * @param handleId + */ + void deleteByHandleTypeAndHandleId(Integer handleType, Long handleId); + + /** + * 批量保存下线处理事件 + * @param offlineHandleEventList 下线处理事件 + */ + void batchSave(List offlineHandleEventList); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysConfigService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysConfigService.java new file mode 100644 index 0000000..afb933e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysConfigService.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service; + +import com.tmerclub.cloud.platform.model.SysConfig; + +import java.util.List; + +/** + * 系统配置信息表 + * + * @author lhd + * @date 2020-12-23 16:27:57 + */ +public interface SysConfigService { + /** + * 根据key,更新value + * @param key 参数key + * @param value 参数value + */ + void updateValueByKey(String key, String value); + + /** + * 删除配置信息 + * @param ids 配置项id列表 + */ + void deleteBatch(Long[] ids); + + /** + * 根据key,获取配置的value值 + * @param key 参数key + * @return value + */ + String getValue(String key); + + /** + * 根据key获取value + * @param key key + * @param clazz 泛型 + * @return 对象 + */ + T getSysConfigObject(String key, Class clazz); + + /** + * 删除配置 + * @param key key + */ + void removeSysConfig(String key); + + /** + * 保存or修改配置 + * @param sysConfig sysConfig + */ + void saveOrUpdateSysConfig(SysConfig sysConfig); + + /** + * 根据key获取配置对象 + * @param key key + * @return 配置信息 + */ + SysConfig getByKey(String key); + + /** + * 保存物流查询配置信息 + * @param sysConfig + * @return + */ + List saveDeliveryConfig(SysConfig sysConfig); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysUserAccountService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysUserAccountService.java new file mode 100644 index 0000000..3f7d013 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysUserAccountService.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service; + +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.platform.dto.ChangeAccountDTO; + +/** + * @author lhd + * @date 2020/12/22 + */ +public interface SysUserAccountService { + + /** + * 添加账户 + * @param changeAccountDTO 账户信息 + * @return void + */ + ServerResponseEntity save(ChangeAccountDTO changeAccountDTO); + + /** + * 更新账户 + * @param changeAccountDTO 账户信息 + * @return + */ + ServerResponseEntity update(ChangeAccountDTO changeAccountDTO); + + /** + * 根据用户id和系统类型获取用户信息 + * @param userId 用户id + * @param sysType 系统类型 + * @return void + */ + ServerResponseEntity getByUserIdAndSysType(Long userId, Integer sysType); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysUserService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysUserService.java new file mode 100644 index 0000000..8be5a9e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysUserService.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service; + +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.platform.dto.SysUserDTO; +import com.tmerclub.cloud.platform.model.SysUser; +import com.tmerclub.cloud.platform.vo.SysUserSimpleVO; + +import java.util.List; + +/** + * @author lhd + * @date 2020/12/22 + */ +public interface SysUserService { + + /** + * 根据用户id获取当前登陆的商家用户信息 + * @param userId 用户id + * @return 商家用户信息 + */ + SysUserSimpleVO getSimpleByUserId(Long userId); + + /** + * 分页获取平台用户列表 + * @param pageDTO 分页参数 + * @param sysUserDTO 搜索参数 + * @return 平台用户列表 + */ + PageVO pageByShopId(PageDTO pageDTO, SysUserDTO sysUserDTO); + + /** + * 根据用户id获取商家用户信息 + * + * @param userId 用户id + * @return 商家用户信息 + */ + SysUserVO getByUserId(Long userId); + + /** + * 保存平台用户信息 + * @param sysUser 平台用户id + * @param roleIds 角色id列表 + */ + void save(SysUser sysUser, List roleIds); + + /** + * 更新平台用户信息 + * @param sysUser 平台用户id + * @param roleIds 角色id列表 + */ + void update(SysUser sysUser, List roleIds); + + /** + * 根据平台用户id删除平台用户信息 + * @param sysUserId 平台用户id + */ + void deleteById(Long sysUserId); + + /** + * 根据用户id列表查名称 + * @param userIds 用户id列表 + * @return + */ + List getUserNameMap(List userIds); + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/OfflineHandleEventItemServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/OfflineHandleEventItemServiceImpl.java new file mode 100644 index 0000000..b54a965 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/OfflineHandleEventItemServiceImpl.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service.impl; + +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventItemVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.platform.mapper.OfflineHandleEventItemMapper; +import com.tmerclub.cloud.platform.model.OfflineHandleEventItem; +import com.tmerclub.cloud.platform.service.OfflineHandleEventItemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 下线处理事件记录项 + * + * @author YXF + * @date 2021-01-15 17:46:26 + */ +@Service +public class OfflineHandleEventItemServiceImpl implements OfflineHandleEventItemService { + + @Autowired + private OfflineHandleEventItemMapper offlineHandleEventItemMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> offlineHandleEventItemMapper.list()); + } + + @Override + public OfflineHandleEventItemVO getByEventItemId(Long eventItemId) { + return offlineHandleEventItemMapper.getByEventItemId(eventItemId); + } + + @Override + public void save(OfflineHandleEventItem offlineHandleEventItem) { + offlineHandleEventItemMapper.save(offlineHandleEventItem); + } + + @Override + public void update(OfflineHandleEventItem offlineHandleEventItem) { + offlineHandleEventItemMapper.update(offlineHandleEventItem); + } + + @Override + public OfflineHandleEventItem getNewOfflineHandleEventItem(Long eventId) { + return offlineHandleEventItemMapper.getNewOfflineHandleEventItem(eventId); + } + + @Override + public void deleteByEventIds(List eventIds) { + offlineHandleEventItemMapper.deleteByEventIds(eventIds); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysAccessKeyServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysAccessKeyServiceImpl.java new file mode 100644 index 0000000..1160b39 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysAccessKeyServiceImpl.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestAlgorithm; +import cn.hutool.crypto.digest.Digester; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.platform.vo.SysAccessKeyVO; +import com.tmerclub.cloud.api.platform.vo.UriPermissionVO; +import com.tmerclub.cloud.api.rbac.bo.UriPermissionBO; +import com.tmerclub.cloud.api.rbac.feign.PermissionFeignClient; +import com.tmerclub.cloud.common.cache.constant.PlatformCacheNames; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.platform.dto.SysAccessKeyDTO; +import com.tmerclub.cloud.platform.mapper.SysAccessKeyMapper; +import com.tmerclub.cloud.platform.mapper.SysAccessMenuMapper; +import com.tmerclub.cloud.platform.mapper.SysAccessMenuPermissionMapper; +import com.tmerclub.cloud.platform.model.SysAccessKey; +import com.tmerclub.cloud.platform.model.SysAccessMenuPermission; +import com.tmerclub.cloud.platform.service.SysAccessKeyService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 系统密钥 + * @author TRACK + */ +@Service +public class SysAccessKeyServiceImpl implements SysAccessKeyService { + + @Autowired + private SysAccessKeyMapper sysAccessKeyMapper; + @Autowired + private SegmentManager segmentManager; + @Autowired + private SysAccessMenuMapper sysAccessMenuMapper; + @DubboReference + private PermissionFeignClient permissionFeignClient; + @Autowired + private SysAccessMenuPermissionMapper sysAccessMenuPermissionMapper; + + @Override + public PageVO page(PageDTO pageDTO, SysAccessKeyDTO sysAccessKeyDTO) { + return PageUtil.doPage(pageDTO, () -> sysAccessKeyMapper.list(sysAccessKeyDTO)); + } + + @Override + public SysAccessKeyVO getBySysAccessKeyId(Long sysAccessKeyId) { + SysAccessKeyVO sysAccessKeyVO = sysAccessKeyMapper.getBySysAccessKeyId(sysAccessKeyId); +// //查询角色对应的菜单 +// List menuList = sysAccessMenuMapper.listMenuIdAccessId(sysAccessKeyId); +// sysAccessKey.setMenuIdList(menuList); + return sysAccessKeyVO; + } + + @Override + @CacheEvict(cacheNames = PlatformCacheNames.SYS_ACCESS_KEY, key = "#sysAccessKeyDTO.accessId") + @Transactional(rollbackFor = Exception.class) + public void save(SysAccessKeyDTO sysAccessKeyDTO) { + SysAccessKey sysAccessKey = BeanUtil.map(sysAccessKeyDTO, SysAccessKey.class); + Long accessId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_AUTHORIZATION); + sysAccessKeyDTO.setAccessId(String.valueOf(accessId)); + sysAccessKey.setAccessId(String.valueOf(accessId)); + Digester sha256 = new Digester(DigestAlgorithm.SHA256); + sysAccessKey.setAccessKey(sha256.digestHex(sysAccessKey.getAccessId() + System.currentTimeMillis())); + sysAccessKeyMapper.save(sysAccessKey); + if (Objects.isNull(sysAccessKeyDTO.getMenuIdList())) { + return; + } + // 保存与菜单关系 + sysAccessMenuMapper.insertAccessKeyAndMenu(sysAccessKey.getSysAccessKeyId(), sysAccessKeyDTO.getMenuIdList()); + sysAccessMenuPermissionMapper.saveSysAccessMenuPerms(sysAccessKey.getSysAccessKeyId(), sysAccessKeyDTO.getMenuPermissionId()); + } + + @Override + @CacheEvict(cacheNames = PlatformCacheNames.SYS_ACCESS_KEY, key = "#sysAccessKeyDTO.accessId") + @Transactional(rollbackFor = Exception.class) + public void update(SysAccessKeyDTO sysAccessKeyDTO) { + SysAccessKey sysAccessKey = BeanUtil.map(sysAccessKeyDTO, SysAccessKey.class); + SysAccessKey accessKey = new SysAccessKey(); + accessKey.setSysAccessKeyId(sysAccessKey.getSysAccessKeyId()); + accessKey.setName(sysAccessKey.getName()); + accessKey.setRemark(sysAccessKey.getRemark()); + accessKey.setSysType(sysAccessKey.getSysType()); + accessKey.setRemark(sysAccessKey.getRemark()); + accessKey.setPremType(sysAccessKey.getPremType()); + accessKey.setUsabilityShopId(sysAccessKey.getUsabilityShopId()); + if(!Objects.equals(sysAccessKey.getSysType(),SysTypeEnum.MULTISHOP.value())){ + accessKey.setUsabilityShopId(0L); + } + sysAccessKeyMapper.update(accessKey); + // 先删除角色与菜单关系 + sysAccessMenuMapper.deleteSysAccessMenuById(sysAccessKey.getSysAccessKeyId()); + // 保存与菜单关系 + sysAccessMenuMapper.insertAccessKeyAndMenu(sysAccessKey.getSysAccessKeyId(), sysAccessKeyDTO.getMenuIdList()); + // 删除密钥与菜单资源关系 + sysAccessMenuPermissionMapper.deletSysAccessMenuPermsBySysAccessKeyId(sysAccessKey.getSysAccessKeyId()); + // 保存密钥与菜单资源关系 + sysAccessMenuPermissionMapper.saveSysAccessMenuPerms(sysAccessKey.getSysAccessKeyId(), sysAccessKeyDTO.getMenuPermissionId()); + } + + @Override + public void deleteById(Long sysAccessKeyId) { + sysAccessKeyMapper.deleteById(sysAccessKeyId); + } + + @Override + @CacheEvict(cacheNames = PlatformCacheNames.SYS_ACCESS_KEY, key = "#accessId") + public void removeCacheById(String accessId) { + } + + @Override + public void resetAccessKey(Long sysAccessKeyId) { + SysAccessKeyVO sysAccessKey = sysAccessKeyMapper.getBySysAccessKeyId(sysAccessKeyId); + if (Objects.isNull(sysAccessKey)) { + throw new LuckException("此数据已被删除"); + } + Digester sha256 = new Digester(DigestAlgorithm.SHA256); + sysAccessKey.setAccessKey(sha256.digestHex(sysAccessKey.getAccessId() + System.currentTimeMillis())); + sysAccessKeyMapper.update(BeanUtil.map(sysAccessKey, SysAccessKey.class)); + } + + @Override + @Cacheable(cacheNames = PlatformCacheNames.SYS_ACCESS_KEY, key = "#accessId") + public SysAccessKeyVO getByAccessId(String accessId) { + SysAccessKeyVO sysAccessKeyVO = sysAccessKeyMapper.getByAccessId(accessId); + if (Objects.isNull(sysAccessKeyVO)) { + return new SysAccessKeyVO(); + } + + // 获取perms + List menuIdList = sysAccessMenuPermissionMapper.queryMenuPermsBySysAccessKeyId(sysAccessKeyVO.getSysAccessKeyId()); + + if(CollectionUtil.isEmpty(menuIdList)){ + return sysAccessKeyVO; + } + List premsList = permissionFeignClient.getUriPermissionListByMenuPermIdList(menuIdList).getData(); + List uriPermissionVOList = new ArrayList<>(); + for (UriPermissionBO uriPermissionBO : premsList) { + uriPermissionVOList.add(BeanUtil.map(uriPermissionBO, UriPermissionVO.class)); + } + sysAccessKeyVO.setPrems(uriPermissionVOList); + return sysAccessKeyVO; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysConfigServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..0640e9f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,281 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.feign.AuthSocialFeignClient; +import com.tmerclub.cloud.api.distribution.feign.DistributionFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.platform.vo.DistributionConfigApiVO; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.common.bean.*; +import com.tmerclub.cloud.common.cache.constant.ConfigCacheNames; +import com.tmerclub.cloud.common.cache.constant.OauthCacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.platform.mapper.SysConfigMapper; +import com.tmerclub.cloud.platform.model.SysConfig; +import com.tmerclub.cloud.platform.service.SysConfigService; +import jakarta.annotation.Resource; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.beans.PropertyDescriptor; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +/** + * 系统配置信息表 + * + * @author lhd + * @date 2020-12-23 16:27:57 + */ +@Service +public class SysConfigServiceImpl implements SysConfigService { + private static final Logger LOGGER = LoggerFactory.getLogger(SysConfigServiceImpl.class); + + @Resource + private SysConfigMapper sysConfigMapper; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + @Autowired + private StringRedisTemplate stringRedisTemplate; + @DubboReference + private UserFeignClient userFeignClient; + @DubboReference + private AuthSocialFeignClient authSocialFeignClient; + @DubboReference + private DistributionFeignClient distributionFeignClient; + @Autowired + private RocketMQTemplate openAllinPayRocketMQTemplate; + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = ConfigCacheNames.SYS_CONFIG_OBJECT, key = "#key"), + @CacheEvict(cacheNames = ConfigCacheNames.SYS_CONFIG, key = "#key") + }) + public void updateValueByKey(String key, String value) { +// sysConfigMapper.updateValueByKey(key, value); + } + + @Override + public void deleteBatch(Long[] ids) { +// sysConfigMapper.deleteBatch(ids); + } + + @Override + @Cacheable(cacheNames = ConfigCacheNames.SYS_CONFIG_VALUE, key = "#key") + public String getValue(String key) { + SysConfig config = sysConfigMapper.queryByKey(key); + return config == null ? null : config.getParamValue(); + } + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = ConfigCacheNames.SYS_CONFIG_OBJECT, key = "#key"), + @CacheEvict(cacheNames = ConfigCacheNames.SYS_CONFIG_VALUE, key = "#key"), + @CacheEvict(cacheNames = ConfigCacheNames.SYS_CONFIG, key = "#key") + }) + public void removeSysConfig(String key) { + } + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = ConfigCacheNames.SYS_CONFIG_OBJECT, key = "#sysConfig.paramKey"), + @CacheEvict(cacheNames = ConfigCacheNames.SYS_CONFIG_VALUE, key = "#sysConfig.paramKey"), + @CacheEvict(cacheNames = ConfigCacheNames.SYS_CONFIG, key = "#sysConfig.paramKey") + }) + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdateSysConfig(SysConfig sysConfig) { + if (sysConfigMapper.countByKey(sysConfig.getParamKey()) > 0) { + sysConfigMapper.update(sysConfig); + } else { + sysConfigMapper.save(sysConfig); + } + if (Objects.equals(sysConfig.getParamKey(), Constant.PAY_SETTLEMENT_CONFIG)) { + handleAllinpay(sysConfig); + } + } + + private void handleAllinpay(SysConfig sysConfig) { + PaySettlementConfig paySettlementConfig = Json.parseObject(sysConfig.getParamValue(), PaySettlementConfig.class); + String value = getValue(Constant.PAY_SETTLEMENT_CONFIG); + PaySettlementConfig dbValue = Json.parseObject(value, PaySettlementConfig.class); + if (Objects.equals(dbValue.getPaySettlementType(), 1) && Objects.equals(paySettlementConfig.getPaySettlementType(), 0)) { + throw new LuckException("通联支付开启后无法关闭"); + } + // 修改支付系统类型 + if (Objects.equals(paySettlementConfig.getPaySettlementType(), 1)) { + // 取消分销配置中分销员申请所需信息 + SysConfigService sysConfigService = (SysConfigService) AopContext.currentProxy(); + SysConfig distributionConfig = sysConfigMapper.queryByKey(Constant.DISTRIBUTION_CONFIG); + DistributionConfigApiVO configApiVO = Json.parseObject(distributionConfig.getParamValue(), DistributionConfigApiVO.class); + configApiVO.setIdentityCardNumber(false); + configApiVO.setIdentityCardPic(false); + configApiVO.setRealName(false); + distributionConfig.setParamValue(Json.toJsonString(configApiVO)); + sysConfigService.saveOrUpdateSysConfig(distributionConfig); + // 删除缓存 + deleteAllinpayCache(); + // TODO 发送事件,应该把用户相关改下,目前暂时只处理了订单、商家、供应商 + // 将待采购和待付尾款订单进行退款 + // 给商家&供应商还没有通联会员账号的添加会员账号 + SendStatus openAllinpayStatus = openAllinPayRocketMQTemplate.syncSend(RocketMqConstant.OPEN_ALLINPAY_TOPIC,new GenericMessage<>(PaySysType.ALLINPAY.value())).getSendStatus(); + if (!Objects.equals(openAllinpayStatus, SendStatus.SEND_OK)) { + LOGGER.error("通联开启发送消息失败"); + } + // 分销初始化 + ServerResponseEntity distributionResponse = distributionFeignClient.initDistributionBySwitchAllinpay(); + if (!distributionResponse.isSuccess()) { + LOGGER.error("分销初始化失败{}", distributionResponse.getMsg()); + } + // 给用户创建通联个人会员 + ServerResponseEntity userResponse = userFeignClient.createAllinpayMember(); + if (!userResponse.isSuccess()) { + LOGGER.error("用户端批量创建会员失败{}", userResponse.getMsg()); + } + // 给第三方注册账号的通联账号绑定支付标识 + ServerResponseEntity bindPayAcctResponse = authSocialFeignClient.bindAllinpayPayAcct(); + if (!bindPayAcctResponse.isSuccess()) { + LOGGER.error("给第三方注册账号的通联账号绑定支付标识失败{}", bindPayAcctResponse.getMsg()); + } + } + } + + private void deleteAllinpayCache() { + shopDetailFeignClient.deleteAllinpayCache(); + orderFeignClient.deleteAllinpayCache(); + supplierDetailFeignClient.deleteAllinpayCache(); + // 强制删除所有token,需要用户重新登录来展示通联新页面 + Set tokens = stringRedisTemplate.keys(OauthCacheNames.USER_INFO + "*"); + if (Objects.nonNull(tokens) && CollUtil.isNotEmpty(tokens)) { + stringRedisTemplate.delete(tokens); + for (String token : tokens) { + String[] values = token.split(":"); + // token格式是mall4cloud_oauth:token:user_info:6**********************0 + String value = values[values.length - 1]; + StpUtil.logoutByTokenValue(value); + } + } + } + + @Override + @Cacheable(cacheNames = ConfigCacheNames.SYS_CONFIG, key = "#key") + public SysConfig getByKey(String key) { + return sysConfigMapper.queryByKey(key); + } + + @Override + public List saveDeliveryConfig(SysConfig sysConfig) { + // 失效的缓存keys + List invalidKeys = new ArrayList<>(Constant.INITIAL_CAPACITY); + SwitchBaseModel switchBaseModel = Json.parseObject(sysConfig.getParamValue(), SwitchBaseModel.class); + if (BooleanUtil.isTrue(switchBaseModel.getIsOpen())) { + // 关闭其他物流查询配置 + if (!Objects.equals(sysConfig.getParamKey(), Constant.ALI_QUICK_CONFIG)) { + // 关闭阿里快递查询 + this.closeSwitch(Constant.ALI_QUICK_CONFIG, AliQuick.class, invalidKeys); + } + if (!Objects.equals(sysConfig.getParamKey(), Constant.QUICK100_CONFIG)) { + // 关闭快递100查询 + this.closeSwitch(Constant.QUICK100_CONFIG, Quick100.class, invalidKeys); + } + if (!Objects.equals(sysConfig.getParamKey(), Constant.QUICKBIRD_CONFIG)) { + // 关闭快递鸟查询 + this.closeSwitch(Constant.QUICKBIRD_CONFIG, QuickBird.class, invalidKeys); + } + // 如果有新增的物流查询配置,在这里补上关闭的代码 + } + // 保存当前物流查询配置 + this.saveOrUpdateSysConfig(sysConfig); + invalidKeys.add(sysConfig.getParamKey()); + return invalidKeys; + } + + /** + * 关闭激活开关 + * + * @param key 配置项key + * @param clazz 继承了SwitchBaseModel的类 + * @param invalidKeys 缓存失效的配置集合 + * @param + */ + public void closeSwitch(String key, Class clazz, List invalidKeys) { + if (!SwitchBaseModel.class.isAssignableFrom(clazz)) { + // 不是配置开关属性类的子类不能调用该方法 + return; + } + T valueObj = this.getSysConfigObject(key, clazz); + if (Objects.isNull(valueObj)) { + // 当前配置在数据库不存在 + return; + } + try { + PropertyDescriptor pd = new PropertyDescriptor("isOpen", clazz); + Method readMethod = pd.getReadMethod(); + if (BooleanUtil.isFalse((Boolean) readMethod.invoke(valueObj))) { + // isOpen已经是关闭状态,直接返回 + return; + } + Method writeMethod = pd.getWriteMethod(); + // 关闭当前配置 + writeMethod.invoke(valueObj, false); + } catch (Exception e) { + return; + } + String str = Json.toJsonString(valueObj); + sysConfigMapper.updateValueByKey(key, str); + invalidKeys.add(key); + } + + @Override + @Cacheable(cacheNames = ConfigCacheNames.SYS_CONFIG_OBJECT, key = "#key") + @SuppressWarnings("unchecked") + public T getSysConfigObject(String key, Class clazz) { + String value = getValue(key); + if (StrUtil.isBlank(value)) { + return null; + } + + if (Objects.equals(String.class, clazz)) { + return (T) value; + } else { + return Json.parseObject(value, clazz); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysUserServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..b7bffa6 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysUserServiceImpl.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.api.rbac.dto.UserRoleDTO; +import com.tmerclub.cloud.api.rbac.feign.UserRoleFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.platform.dto.SysUserDTO; +import com.tmerclub.cloud.platform.mapper.SysUserMapper; +import com.tmerclub.cloud.platform.model.SysUser; +import com.tmerclub.cloud.platform.service.SysUserService; +import com.tmerclub.cloud.platform.vo.SysUserSimpleVO; +import io.seata.spring.annotation.GlobalTransactional; +import jakarta.annotation.Resource; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author lhd + * @date 2020/12/22 + */ +@Service +public class SysUserServiceImpl implements SysUserService { + + @Resource + private SysUserMapper sysUserMapper; + @DubboReference + private AccountFeignClient accountFeignClient; + @DubboReference + private UserRoleFeignClient userRoleFeignClient; + @Autowired + private SegmentManager segmentManager; + + + @Override + @Cacheable(cacheNames = CacheNames.PLATFORM_SIMPLE_INFO_KEY, key = "#userId") + public SysUserSimpleVO getSimpleByUserId(Long userId) { + return sysUserMapper.getSimpleByUserId(userId); + } + + @Override + public PageVO pageByShopId(PageDTO pageDTO, SysUserDTO sysUserDTO) { + PageVO page = PageUtil.doPage(pageDTO, () -> sysUserMapper.listByShopId(sysUserDTO)); + if (CollUtil.isEmpty(page.getList())) { + return page; + } + List userIds = page.getList().stream().map(SysUserVO::getSysUserId).collect(Collectors.toList()); + ServerResponseEntity> responseEntity = accountFeignClient.listUserByUserIdsAndType(userIds, SysTypeEnum.PLATFORM.value()); + Map authAccountMap = responseEntity.getData().stream().collect(Collectors.toMap(AuthAccountVO::getUserId, a -> a)); + for (SysUserVO sysUserVO : page.getList()) { + AuthAccountVO authAccountVO = authAccountMap.get(sysUserVO.getSysUserId()); + if (Objects.nonNull(authAccountVO)) { + sysUserVO.setIsAdmin(authAccountVO.getIsAdmin()); + sysUserVO.setStatus(authAccountVO.getStatus()); + } + } + return page; + } + + @Override + public SysUserVO getByUserId(Long userId) { + SysUserVO sysUser = sysUserMapper.getByUserId(userId); + ServerResponseEntity> roleIds = userRoleFeignClient.getRoleIds(sysUser.getSysUserId()); + sysUser.setRoleIds(roleIds.getData()); + return sysUser; + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public void save(SysUser sysUser, List roleIds) { + checkSysUser(sysUser); + UserRoleDTO userRoleDTO = new UserRoleDTO(); + userRoleDTO.setRoleIds(roleIds); + sysUser.setSysUserId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_PLATFORM_USER)); + sysUserMapper.save(sysUser); + if (CollUtil.isEmpty(roleIds)) { + return; + } + userRoleDTO.setUserId(sysUser.getSysUserId()); + userRoleFeignClient.saveByUserIdAndSysType(userRoleDTO); + } + + private void checkSysUser(SysUser sysUser) { + // 修改,检查昵称是否重复,sys_user_id是不等于sysUserId + if (sysUserMapper.countNickName(sysUser.getNickName(), sysUser.getSysUserId()) > 0) { + throw new LuckException("该昵称已存在"); + } + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.PLATFORM_SIMPLE_INFO_KEY, key = "#sysUser.sysUserId") + public void update(SysUser sysUser, List roleIds) { + checkSysUser(sysUser); + UserRoleDTO userRoleDTO = new UserRoleDTO(); + userRoleDTO.setRoleIds(roleIds); + userRoleDTO.setUserId(sysUser.getSysUserId()); + userRoleDTO.setSysType(SysTypeEnum.PLATFORM.value()); + sysUserMapper.update(sysUser); + userRoleFeignClient.updateByUserIdAndSysType(userRoleDTO); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.PLATFORM_SIMPLE_INFO_KEY, key = "#sysUserId") + public void deleteById(Long sysUserId) { + ServerResponseEntity responseEntity = accountFeignClient.deleteByUserIdAndSysType(sysUserId); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + userRoleFeignClient.deleteByUserIdAndSysType(sysUserId); + sysUserMapper.deleteById(sysUserId); + } + + @Override + public List getUserNameMap(List userIds) { + if (CollUtil.isEmpty(userIds)) { + return new ArrayList<>(0); + } + return sysUserMapper.getUserName(userIds); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/WebConfigServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/WebConfigServiceImpl.java new file mode 100644 index 0000000..8fec777 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/WebConfigServiceImpl.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service.impl; + +import com.tmerclub.cloud.common.cache.constant.PlatformCacheNames; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.platform.dto.WebConfigDTO; +import com.tmerclub.cloud.platform.mapper.WebConfigMapper; +import com.tmerclub.cloud.platform.model.WebConfig; +import com.tmerclub.cloud.platform.service.WebConfigService; +import com.tmerclub.cloud.platform.vo.WebConfigVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +/** + * 网站配置信息表 + * + * @author Orange + * @date 2022-08-01 15:53:50 + */ +@Service +public class WebConfigServiceImpl implements WebConfigService { + + @Autowired + private WebConfigMapper webConfigMapper; + + @Override + public PageVO page(PageDTO pageDTO, WebConfigDTO webConfigDTO) { + return PageUtil.doPage(pageDTO, () -> webConfigMapper.list(webConfigDTO)); + } + + @Override + public WebConfig getById(Long id) { + return webConfigMapper.getById(id); + } + + @Override + public void save(WebConfig webConfig) { + webConfigMapper.save(webConfig); + } + + @Override + public void update(WebConfig webConfig) { + webConfigMapper.update(webConfig); + } + + @Override + public void deleteById(Long id) { + webConfigMapper.deleteById(id); + } + + @Override + public void updateActivityState(Integer configType) { + webConfigMapper.updateActivityState(configType); + } + + @Override + @Cacheable(cacheNames = PlatformCacheNames.WEB_CONFIG_ACTIVITY, key = "#configType") + public WebConfigVO getActivityWebConfig(Integer configType) { + return webConfigMapper.getByType(configType); + } + + @Override + @CacheEvict(cacheNames = PlatformCacheNames.WEB_CONFIG_ACTIVITY, key = "#configType") + public void removeActivityWebConfig(Integer configType) { + } + + @Override + public int countByType(Integer configType) { + return webConfigMapper.countByType(configType); + } + + @Override + public WebConfigVO getByConfigType(Integer configType) { + return webConfigMapper.getByType(configType); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/DistributionConfigVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/DistributionConfigVO.java new file mode 100644 index 0000000..e7a1ecc --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/DistributionConfigVO.java @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.vo; + +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author cl + * @date 2021-08-06 14:19:49 + */ +public class DistributionConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分销开关: 0:关闭 1:开启") + private Integer distributionSwitch; + + @Schema(description = "客户绑定设置-业绩归属 : 0:允许绑定,关系优先 1:不绑定 分享人优先") + private Integer attribution; + +// 申请条件配置------------------------------------------------------------- + + @Schema(description = "申请条件-条件审核判定: 0:人工判定 1:系统判定") + private Integer autoCheck; + + @Schema(description = "申请条件-条件审核判定:购买指定商品,确认收货任意一件商品后计入") + private List spuIdList; + + @Schema(description = "商品列表") + private List spuVOList; + + @Schema(description = "申请条件-条件审核判定:消费金额大于等于expenseAmount元,实付金额+积分抵扣+余额抵扣总金额,收货后计入(单位: 元)") + private BigDecimal expenseAmount; + + @Schema(description = "申请条件-条件审核判定:消费笔数大于等于expenseNumber次,下单次数,收货后计入") + private Integer expenseNumber; + + @Schema(description = "申请条件-申请所需信息:是否需要真实姓名 true 需要 false不需要") + private Boolean realName; + + @Schema(description = "申请条件-申请所需信息:是否需要身份证号码 true 需要 false不需要") + private Boolean identityCardPic; + + @Schema(description = "申请条件-申请所需信息:是否需要身份证照片 true 需要 false不需要") + private Boolean identityCardNumber; + + @Schema(description = "提现发放方式: 0.无需审核直接发放,1.审核后系统发放,2.审核后人工发放") + private Integer withdrawal; + + +// 提现申请配置------------------------------------------------------------- + + @Schema(description = "提现频率(天)") + private Integer frequency; + + @Schema(description = "单笔提现最高(元)") + private BigDecimal amountMax; + + @Schema(description = "单笔提现最低 (元)") + private BigDecimal amountMin; + + @Schema(description = "打款说明") + private String paymentExplain; + + @Schema(description = "提现次数") + private Integer number; + + public Integer getWithdrawal() { + return withdrawal; + } + + public void setWithdrawal(Integer withdrawal) { + this.withdrawal = withdrawal; + } + + public Integer getDistributionSwitch() { + return distributionSwitch; + } + + public void setDistributionSwitch(Integer distributionSwitch) { + this.distributionSwitch = distributionSwitch; + } + + public Integer getAttribution() { + return attribution; + } + + public void setAttribution(Integer attribution) { + this.attribution = attribution; + } + + public Integer getAutoCheck() { + return autoCheck; + } + + public void setAutoCheck(Integer autoCheck) { + this.autoCheck = autoCheck; + } + + public List getSpuIdList() { + return spuIdList; + } + + public void setSpuIdList(List spuIdList) { + this.spuIdList = spuIdList; + } + + public List getSpuVOList() { + return spuVOList; + } + + public void setSpuVOList(List spuVOList) { + this.spuVOList = spuVOList; + } + + public BigDecimal getExpenseAmount() { + return expenseAmount; + } + + public void setExpenseAmount(BigDecimal expenseAmount) { + this.expenseAmount = expenseAmount; + } + + public Integer getExpenseNumber() { + return expenseNumber; + } + + public void setExpenseNumber(Integer expenseNumber) { + this.expenseNumber = expenseNumber; + } + + public Boolean getRealName() { + return realName; + } + + public void setRealName(Boolean realName) { + this.realName = realName; + } + + public Boolean getIdentityCardPic() { + return identityCardPic; + } + + public void setIdentityCardPic(Boolean identityCardPic) { + this.identityCardPic = identityCardPic; + } + + public Boolean getIdentityCardNumber() { + return identityCardNumber; + } + + public void setIdentityCardNumber(Boolean identityCardNumber) { + this.identityCardNumber = identityCardNumber; + } + + public Integer getFrequency() { + return frequency; + } + + public void setFrequency(Integer frequency) { + this.frequency = frequency; + } + + public BigDecimal getAmountMax() { + return amountMax; + } + + public void setAmountMax(BigDecimal amountMax) { + this.amountMax = amountMax; + } + + public BigDecimal getAmountMin() { + return amountMin; + } + + public void setAmountMin(BigDecimal amountMin) { + this.amountMin = amountMin; + } + + public String getPaymentExplain() { + return paymentExplain; + } + + public void setPaymentExplain(String paymentExplain) { + this.paymentExplain = paymentExplain; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } + + @Override + public String toString() { + return "DistributionConfigVO{" + + "distributionSwitch=" + distributionSwitch + + ", attribution=" + attribution + + ", autoCheck=" + autoCheck + + ", spuIdList=" + spuIdList + + ", spuVOList=" + spuVOList + + ", expenseAmount=" + expenseAmount + + ", expenseNumber=" + expenseNumber + + ", realName=" + realName + + ", identityCardPic=" + identityCardPic + + ", identityCardNumber=" + identityCardNumber + + ", frequency=" + frequency + + ", amountMax=" + amountMax + + ", amountMin=" + amountMin + + ", paymentExplain='" + paymentExplain + '\'' + + ", number=" + number + + ", withdrawal=" + withdrawal + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/DistributionRecruitConfigVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/DistributionRecruitConfigVO.java new file mode 100644 index 0000000..b6e3704 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/DistributionRecruitConfigVO.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author cl + * @date 2021-08-06 14:20:02 + */ +public class DistributionRecruitConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "推广封面") + private String pic; + + @Schema(description = "推广标题") + private String title; + + @Schema(description = "推广内容") + private String content; + + /** + * 状态(0下线 1上线) + */ + @Schema(description = "状态 0关 1开") + private Integer state; + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + @Override + public String toString() { + return "DistributionRecruitConfigVO{" + + "pic='" + pic + '\'' + + ", title='" + title + '\'' + + ", content='" + content + '\'' + + ", state=" + state + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/ScoreExpireConfigVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/ScoreExpireConfigVO.java new file mode 100644 index 0000000..18835bc --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/ScoreExpireConfigVO.java @@ -0,0 +1,56 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.vo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lhd + * @date 2020/12/30 + */ +public class ScoreExpireConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 过期年限 + */ + private Integer expireYear; + + /** + * 积分过期开关 + */ + private Boolean scoreExpireSwitch; + + public Integer getExpireYear() { + return expireYear; + } + + public void setExpireYear(Integer expireYear) { + this.expireYear = expireYear; + } + + public Boolean getScoreExpireSwitch() { + return scoreExpireSwitch; + } + + public void setScoreExpireSwitch(Boolean scoreExpireSwitch) { + this.scoreExpireSwitch = scoreExpireSwitch; + } + + @Override + public String toString() { + return "ScoreExpireConfigVO{" + + "expireYear=" + expireYear + + ", scoreExpireSwitch=" + scoreExpireSwitch + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/SysConfigVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/SysConfigVO.java new file mode 100644 index 0000000..dbcec5c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/SysConfigVO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 系统配置信息表VO + * + * @author lhd + * @date 2020-12-23 16:27:57 + */ +public class SysConfigVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long id; + + @Schema(description = "key") + private String paramKey; + + @Schema(description = "value") + private String paramValue; + + @Schema(description = "备注") + private String remark; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getParamKey() { + return paramKey; + } + + public void setParamKey(String paramKey) { + this.paramKey = paramKey; + } + + public String getParamValue() { + return paramValue; + } + + public void setParamValue(String paramValue) { + this.paramValue = paramValue; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "SysConfigVO{" + + "id=" + id + + ",paramKey=" + paramKey + + ",paramValue=" + paramValue + + ",remark=" + remark + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/SysUserSimpleVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/SysUserSimpleVO.java new file mode 100644 index 0000000..2bd815a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/SysUserSimpleVO.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lhd + * @date 2020/9/2 + */ +public class SysUserSimpleVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户名 + */ + @Schema(description = "用户名") + private String userName; + + /** + * 昵称 + */ + @Schema(description = "昵称") + private String nickName; + + /** + * 头像 + */ + @Schema(description = "头像") + private String avatar; + + private Integer isAdmin; + + private Long userId; + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public Integer getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(Integer isAdmin) { + this.isAdmin = isAdmin; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + @Override + public String toString() { + return "SysUserSimpleVO{" + + "userName='" + userName + '\'' + + ", nickName='" + nickName + '\'' + + ", avatar='" + avatar + '\'' + + ", isAdmin=" + isAdmin + + ", userId=" + userId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/WebConfigVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/WebConfigVO.java new file mode 100644 index 0000000..3cdfc98 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/WebConfigVO.java @@ -0,0 +1,346 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 网站配置信息表VO + * + * @author Orange + */ +public class WebConfigVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 配置类型(PLATFROM:平台端 MULTISHOP:商家端 PC:PC端 H5:h5端 STATION:自提点端) + * @see com.tmerclub.cloud.platform.constant.WebConfigType 配置类型枚举类 + * + */ + @Schema(description = "配置类型") + private String paramKey; + + @Schema(description = "登录logo") + private String loginLogoImg; + + @Schema(description = "登录背景(后台+pc)") + private String loginBgImg; + + @Schema(description = "版权声明-中文(后台+pc)") + private String copyrightCn; + + @Schema(description = "版权声明-英文(后台+pc)") + private String copyrightEn; + + @Schema(description = "网站标题文本-中文(后台+pc+h5)") + private String titleContentCn; + + @Schema(description = "网站标题文本-英文(后台+pc+h5)") + private String titleContentEn; + + @Schema(description = "标题图标(后台+pc)") + private String titleImg; + + @Schema(description = "后台-菜单展开时的文本-中文") + private String bsMenuTitleOpenCn; + + @Schema(description = "后台-菜单展开时的文本-英文") + private String bsMenuTitleOpenEn; + + @Schema(description = "后台-菜单缩小时的文本-中文") + private String bsMenuTitleCloseCn; + + @Schema(description = "后台-菜单缩小时的文本-英文") + private String bsMenuTitleCloseEn; + + @Schema(description = "后台-顶部栏图标") + private String bsTopBarIcon; + + @Schema(description = "PC-底部二维码") + private String pcQrcodeImg; + + @Schema(description = "PC-公司全名-中文") + private String pcCompanyNameCn; + + @Schema(description = "PC-公司全名-英文") + private String pcCompanyNameEn; + + @Schema(description = "PC-公司名简写-中文") + private String pcCompanyNameShortCn; + + @Schema(description = "PC-公司名简写-英文") + private String pcCompanyNameShortEn; + + @Schema(description = "PC-公司图文logo(注册、登录、改密时显示)") + private String pcLogoImgText; + + @Schema(description = "PC-导航栏欢迎语-中文") + private String pcWelcomeCn; + + @Schema(description = "PC-导航栏欢迎语-英文") + private String pcWelcomeEn; + + @Schema(description = "PC-底部公司地址等信息-中文") + private String pcCompanyInfoCn; + + @Schema(description = "PC-底部公司地址等信息-英文") + private String pcCompanyInfoEn; + + @Schema(description = "Station-自提点登录logo") + private String stationLoginLogoImg; + + @Schema(description = "h5-欢迎语-中文" ) + private String h5WelcomeCn; + + @Schema(description = "h5-欢迎语-英文" ) + private String h5WelcomeEn; + + public String getH5WelcomeCn() { + return h5WelcomeCn; + } + + public void setH5WelcomeCn(String h5WelcomeCn) { + this.h5WelcomeCn = h5WelcomeCn; + } + + public String getH5WelcomeEn() { + return h5WelcomeEn; + } + + public void setH5WelcomeEn(String h5WelcomeEn) { + this.h5WelcomeEn = h5WelcomeEn; + } + + public String getStationLoginLogoImg() { + return stationLoginLogoImg; + } + + public void setStationLoginLogoImg(String stationLoginLogoImg) { + this.stationLoginLogoImg = stationLoginLogoImg; + } + + public String getParamKey() { + return paramKey; + } + + public void setParamKey(String paramKey) { + this.paramKey = paramKey; + } + + public String getLoginLogoImg() { + return loginLogoImg; + } + + public void setLoginLogoImg(String loginLogoImg) { + this.loginLogoImg = loginLogoImg; + } + + public String getLoginBgImg() { + return loginBgImg; + } + + public void setLoginBgImg(String loginBgImg) { + this.loginBgImg = loginBgImg; + } + + public String getCopyrightCn() { + return copyrightCn; + } + + public void setCopyrightCn(String copyrightCn) { + this.copyrightCn = copyrightCn; + } + + public String getCopyrightEn() { + return copyrightEn; + } + + public void setCopyrightEn(String copyrightEn) { + this.copyrightEn = copyrightEn; + } + + public String getTitleContentCn() { + return titleContentCn; + } + + public void setTitleContentCn(String titleContentCn) { + this.titleContentCn = titleContentCn; + } + + public String getTitleContentEn() { + return titleContentEn; + } + + public void setTitleContentEn(String titleContentEn) { + this.titleContentEn = titleContentEn; + } + + public String getTitleImg() { + return titleImg; + } + + public void setTitleImg(String titleImg) { + this.titleImg = titleImg; + } + + public String getBsMenuTitleOpenCn() { + return bsMenuTitleOpenCn; + } + + public void setBsMenuTitleOpenCn(String bsMenuTitleOpenCn) { + this.bsMenuTitleOpenCn = bsMenuTitleOpenCn; + } + + public String getBsMenuTitleOpenEn() { + return bsMenuTitleOpenEn; + } + + public void setBsMenuTitleOpenEn(String bsMenuTitleOpenEn) { + this.bsMenuTitleOpenEn = bsMenuTitleOpenEn; + } + + public String getBsMenuTitleCloseCn() { + return bsMenuTitleCloseCn; + } + + public void setBsMenuTitleCloseCn(String bsMenuTitleCloseCn) { + this.bsMenuTitleCloseCn = bsMenuTitleCloseCn; + } + + public String getBsMenuTitleCloseEn() { + return bsMenuTitleCloseEn; + } + + public void setBsMenuTitleCloseEn(String bsMenuTitleCloseEn) { + this.bsMenuTitleCloseEn = bsMenuTitleCloseEn; + } + + public String getBsTopBarIcon() { + return bsTopBarIcon; + } + + public void setBsTopBarIcon(String bsTopBarIcon) { + this.bsTopBarIcon = bsTopBarIcon; + } + + public String getPcQrcodeImg() { + return pcQrcodeImg; + } + + public void setPcQrcodeImg(String pcQrcodeImg) { + this.pcQrcodeImg = pcQrcodeImg; + } + + public String getPcCompanyNameCn() { + return pcCompanyNameCn; + } + + public void setPcCompanyNameCn(String pcCompanyNameCn) { + this.pcCompanyNameCn = pcCompanyNameCn; + } + + public String getPcCompanyNameEn() { + return pcCompanyNameEn; + } + + public void setPcCompanyNameEn(String pcCompanyNameEn) { + this.pcCompanyNameEn = pcCompanyNameEn; + } + + public String getPcCompanyNameShortCn() { + return pcCompanyNameShortCn; + } + + public void setPcCompanyNameShortCn(String pcCompanyNameShortCn) { + this.pcCompanyNameShortCn = pcCompanyNameShortCn; + } + + public String getPcCompanyNameShortEn() { + return pcCompanyNameShortEn; + } + + public void setPcCompanyNameShortEn(String pcCompanyNameShortEn) { + this.pcCompanyNameShortEn = pcCompanyNameShortEn; + } + + public String getPcLogoImgText() { + return pcLogoImgText; + } + + public void setPcLogoImgText(String pcLogoImgText) { + this.pcLogoImgText = pcLogoImgText; + } + + public String getPcWelcomeCn() { + return pcWelcomeCn; + } + + public void setPcWelcomeCn(String pcWelcomeCn) { + this.pcWelcomeCn = pcWelcomeCn; + } + + public String getPcWelcomeEn() { + return pcWelcomeEn; + } + + public void setPcWelcomeEn(String pcWelcomeEn) { + this.pcWelcomeEn = pcWelcomeEn; + } + + public String getPcCompanyInfoCn() { + return pcCompanyInfoCn; + } + + public void setPcCompanyInfoCn(String pcCompanyInfoCn) { + this.pcCompanyInfoCn = pcCompanyInfoCn; + } + + public String getPcCompanyInfoEn() { + return pcCompanyInfoEn; + } + + public void setPcCompanyInfoEn(String pcCompanyInfoEn) { + this.pcCompanyInfoEn = pcCompanyInfoEn; + } + + @Override + public String toString() { + return "WebConfigVO{" + + "paramKey='" + paramKey + '\'' + + ", loginLogoImg='" + loginLogoImg + '\'' + + ", loginBgImg='" + loginBgImg + '\'' + + ", copyrightCn='" + copyrightCn + '\'' + + ", copyrightEn='" + copyrightEn + '\'' + + ", titleContentCn='" + titleContentCn + '\'' + + ", titleContentEn='" + titleContentEn + '\'' + + ", titleImg='" + titleImg + '\'' + + ", bsMenuTitleOpenCn='" + bsMenuTitleOpenCn + '\'' + + ", bsMenuTitleOpenEn='" + bsMenuTitleOpenEn + '\'' + + ", bsMenuTitleCloseCn='" + bsMenuTitleCloseCn + '\'' + + ", bsMenuTitleCloseEn='" + bsMenuTitleCloseEn + '\'' + + ", bsTopBarIcon='" + bsTopBarIcon + '\'' + + ", pcQrcodeImg='" + pcQrcodeImg + '\'' + + ", pcCompanyNameCn='" + pcCompanyNameCn + '\'' + + ", pcCompanyNameEn='" + pcCompanyNameEn + '\'' + + ", pcCompanyNameShortCn='" + pcCompanyNameShortCn + '\'' + + ", pcCompanyNameShortEn='" + pcCompanyNameShortEn + '\'' + + ", pcLogoImgText='" + pcLogoImgText + '\'' + + ", pcWelcomeCn='" + pcWelcomeCn + '\'' + + ", pcWelcomeEn='" + pcWelcomeEn + '\'' + + ", pcCompanyInfoCn='" + pcCompanyInfoCn + '\'' + + ", pcCompanyInfoEn='" + pcCompanyInfoEn + '\'' + + ", stationLoginLogoImg='" + stationLoginLogoImg + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/HotSearchType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/HotSearchType.java new file mode 100644 index 0000000..a986346 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/HotSearchType.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.constant; + +/** + * 热搜状态 + * + * @author YXF + */ +public enum HotSearchType { + + /** + * 商品热搜 + */ + PROD(1), + /** + * 供应商热搜 + */ + SHOP(2); + + private final Integer num; + + public Integer value() { + return num; + } + + HotSearchType(Integer num) { + this.num = num; + } + + public static HotSearchType instance(Integer value) { + HotSearchType[] enums = values(); + for (HotSearchType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/IsDefault.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/IsDefault.java new file mode 100644 index 0000000..ce4cc77 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/IsDefault.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.constant; + +/** + * @Author lth + * @Date 2021/6/16 9:14 + */ +public enum IsDefault { + /** + * 是默认 + */ + YES(1), + /** + * 不是默认 + */ + NO(0); + + private final Integer num; + + public Integer value() { + return num; + } + + IsDefault(Integer num) { + this.num = num; + } + + public static IsDefault instance(Integer value) { + IsDefault[] enums = values(); + for (IsDefault statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWalletChangeReason.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWalletChangeReason.java new file mode 100644 index 0000000..3f87780 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWalletChangeReason.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.constant; + + +/** + * 供应商钱包金额发生改变的原因 + * 0用户支付 1用户确认收货 2 用户退款申请 3 拒绝用户退款申请 4 提现申请 5 提现申请被拒绝 + * + * @author FrozenWatermelon + */ +public enum SupplierWalletChangeReason { + + /** + * 用户支付 + */ + PAY(0, "用户支付"), + + /** + * 订单结算 + */ + SETTLED(1, "订单结算"), + + /** + * 用户退款申请成功 + */ + ORDER_REFUND(2, "用户退款申请成功"), + + + /** + * 提现申请 + */ + APPLY_CASH(4, "提现申请"), + + /** + * 提现申请被拒绝 + */ + REFUSE_CASH(5, "提现申请被拒绝"), + + /** + * 通过提现申请 + */ + PASS_CASH(6, "提现申请通过"), + + /** + * 系统发放成功 + */ + SUCCESS_CASH(7, "系统发放成功"), + /** + * 提现发放失败 + */ + FAIL_CASH(8, "系统发放失败"), + + /** + * 系统扣除订单中需要颁发给用户的分销金额 + */ + DISTRIBUTION_AMOUNT(9, "扣除订单分销金额"), + + ; + + private final Integer num; + + private final String supplierWalletChangeReason; + + public Integer value() { + return num; + } + + public String getSupplierWalletChangeReason() { + return supplierWalletChangeReason; + } + + SupplierWalletChangeReason(Integer num, String supplierWalletChangeReason) { + this.num = num; + this.supplierWalletChangeReason = supplierWalletChangeReason; + } + + public static SupplierWalletChangeReason instance(Integer value) { + SupplierWalletChangeReason[] enums = values(); + for (SupplierWalletChangeReason statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static String getReason(Integer value) { + SupplierWalletChangeReason[] enums = values(); + for (SupplierWalletChangeReason statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum.supplierWalletChangeReason; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWalletIoType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWalletIoType.java new file mode 100644 index 0000000..da8bf1b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWalletIoType.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.constant; + +/** + * 收支类型 0支出 1收入 + * + * @Author lth + * @Date 2021/6/10 14:12 + */ +public enum SupplierWalletIoType { + /** + * 0.支出 + */ + EXPENDITURE(0, "支出"), + /** + * 1. 收入 + */ + INCOME(1, "收入"), + ; + + private final Integer num; + private final String str; + + public Integer value() { + return num; + } + + public String str() { + return str; + } + + SupplierWalletIoType(Integer num, String str) { + this.num = num; + this.str = str; + } + + public static SupplierWalletIoType instance(Integer value) { + SupplierWalletIoType[] enums = values(); + for (SupplierWalletIoType typeEnum : enums) { + if (typeEnum.value().equals(value)) { + return typeEnum; + } + } + return null; + } + + public static String getIoName(Integer value) { + SupplierWalletIoType[] enums = values(); + for (SupplierWalletIoType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum.str; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/admin/SupplierCompanyController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/admin/SupplierCompanyController.java new file mode 100644 index 0000000..829a45c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/admin/SupplierCompanyController.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.admin; + +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.IdCardCollectProcessStatus; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.supplier.constant.AuditStatus; +import com.tmerclub.cloud.supplier.dto.SupplierCompanyDTO; +import com.tmerclub.cloud.supplier.model.SupplierCompany; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierCompanyService; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/8/14 16:53 + */ +@RestController("adminSupplierCompanyController") +@RequestMapping("/mp/supplier_company") +@Tag(name = "admin-供应商工商信息") +public class SupplierCompanyController { + + @Autowired + private SupplierCompanyService supplierCompanyService; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + @Autowired + private SupplierDetailService supplierDetailService; + + @GetMapping("/check_credit_code") + @Operation(summary = "检查统一信用码是否已存在", description = "检查统一信用码是否已存在") + public ServerResponseEntity checkCreditCode(@RequestParam("creditCode") String creditCode, @RequestParam("supplierId") Long supplierId) { + Boolean res = supplierCompanyService.checkCreditCode(creditCode, supplierId); + return ServerResponseEntity.success(res); + } + + @PutMapping("/update_id_card_status") + @Operation(summary = "更新影印件状态", description = "通联独有") + public ServerResponseEntity updateIdCardStatus(@RequestParam("supplierId") Long supplierId) { + if (!supplierAllinpayService.getIsAllinpay()) { + return ServerResponseEntity.success(); + } + if (Objects.isNull(supplierId)) { + throw new LuckException("供应商id不能为空"); + } + SupplierCompanyVO supplierCompanyVO = supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierId, AuditStatus.WAITAUDIT.value()); + if (Objects.isNull(supplierCompanyVO)) { + supplierCompanyVO = supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierId, AuditStatus.SUCCESSAUDIT.value()); + } + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(supplierId); + if (Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + // 更新下更新时间 + supplierCompanyService.updateById(BeanUtil.map(supplierCompanyVO, SupplierCompany.class)); + // 已经审核通过不用更新 + return ServerResponseEntity.success(supplierApiDetailVO.getIdCardCollectProcessStatus()); + } + // 可能回调有问题导致这里没刷新,所以多给一个接口 + ServerResponseEntity idCardStatus = allinpayFeignClient.getIdCardStatus(AllinpayConstant.SUPPLIER + supplierId); + if (!idCardStatus.isSuccess()) { + throw new LuckException(idCardStatus.getMsg()); + } + if (Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), idCardStatus.getData())) { + // 更新下更新时间 + supplierCompanyService.updateById(BeanUtil.map(supplierCompanyVO, SupplierCompany.class)); + // 状态一致不用更新 + return ServerResponseEntity.success(idCardStatus.getData()); + } + supplierDetailService.updateAllinpayIdCardStatus(AllinpayConstant.SUPPLIER + supplierId, idCardStatus.getData()); + supplierDetailService.removeCacheBySupplierId(supplierId); + return ServerResponseEntity.success(); + } + + @PutMapping("/upload_id_card") + @Operation(summary = "重新上传影印件", description = "通联独有") + public ServerResponseEntity uploadIdCard(@RequestBody SupplierCompanyDTO supplierCompanyDTO) { + if (!supplierAllinpayService.getIsAllinpay()) { + return ServerResponseEntity.success("非通联环境"); + } + Long supplierId = supplierCompanyDTO.getSupplierId(); + if (Objects.isNull(supplierId)) { + throw new LuckException("供应商id不能为空"); + } + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(supplierId); + ServerResponseEntity idCardStatus = allinpayFeignClient.getIdCardStatus(AllinpayConstant.SUPPLIER + supplierId); + if (!idCardStatus.isSuccess()) { + throw new LuckException(idCardStatus.getMsg()); + } + String result = supplierCompanyService.uploadIdCard(supplierCompanyDTO, supplierApiDetailVO, idCardStatus.getData()); + supplierDetailService.removeCacheBySupplierId(supplierId); + if (!Objects.equals(result, AllinpayConstant.ALLINPAY_AUDIT_SUCCESS) || Objects.equals(result, AllinpayConstant.ID_CARD_UPDATE_SUCCESS)) { + return ServerResponseEntity.showFailMsg(result); + } + return ServerResponseEntity.success(result); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/multishop/ShopPurchaseAmountLogController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/multishop/ShopPurchaseAmountLogController.java new file mode 100644 index 0000000..f1e6360 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/multishop/ShopPurchaseAmountLogController.java @@ -0,0 +1,71 @@ +package com.tmerclub.cloud.supplier.controller.multishop; + +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.dto.PurchaseAmountLogDTO; +import com.tmerclub.cloud.supplier.service.PurchaseAmountLogService; +import com.tmerclub.cloud.supplier.vo.ShopSupplierNameVO; +import com.tmerclub.cloud.supplier.vo.TotalPurchaseAmountVO; +import com.tmerclub.cloud.supplier.vo.mongo.MongoPurchaseAmountLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +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.util.List; + +/** + * @author gaozijie + * @date 2023-08-28 + */ +@RestController +@RequestMapping("/m/purchase_amount_log") +@Tag(name = "采购金额日志(商家)") +public class ShopPurchaseAmountLogController { + + @Autowired + private PurchaseAmountLogService purchaseAmountLogService; + + @GetMapping("/list_supplier") + @Operation(summary = "获取供应商列表") + public ServerResponseEntity> listSupplier() { + Long shopId = AuthUserContext.get().getTenantId(); + List supplierNames = purchaseAmountLogService.listSupplier(shopId); + return ServerResponseEntity.success(supplierNames); + } + + @GetMapping("/page") + @Operation(summary = "分页获取采购金额日志") + public ServerResponseEntity> pagePurchaseLog(PageDTO pageDTO, PurchaseAmountLogDTO purchaseAmountLogDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + purchaseAmountLogDTO.setShopId(shopId); + purchaseAmountLogDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + PageVO page = purchaseAmountLogService.pagePurchaseAmountLog(pageDTO, purchaseAmountLogDTO); + return ServerResponseEntity.success(page); + } + + @GetMapping("/get_total_amount") + @Operation(summary = "获取采购总金额数据") + public ServerResponseEntity getTotalAmount(PurchaseAmountLogDTO purchaseAmountLogDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + purchaseAmountLogDTO.setShopId(shopId); + purchaseAmountLogDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + TotalPurchaseAmountVO totalPurchaseAmount = purchaseAmountLogService.getTotalPurchaseAmount(purchaseAmountLogDTO); + return ServerResponseEntity.success(totalPurchaseAmount); + } + + @GetMapping("/export_excel") + @Operation(summary = "导出excel") + public void exportExcel(HttpServletResponse response, PurchaseAmountLogDTO purchaseAmountLogDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + purchaseAmountLogDTO.setShopId(shopId); + purchaseAmountLogDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + purchaseAmountLogService.exportExcel(response, purchaseAmountLogDTO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/multishop/SupplierDetailController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/multishop/SupplierDetailController.java new file mode 100644 index 0000000..e9006a5 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/multishop/SupplierDetailController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.multishop; + + +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.dto.SupplierDetailDTO; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.vo.SupplierDetailVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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; + +/** + * @author lth + */ +@RestController("supplierShopDetailController") +@RequestMapping("/m/supplier_detail") +@Tag(name = "supplier-供应商") +public class SupplierDetailController { + + @Autowired + private SupplierDetailService supplierDetailService; + + @GetMapping("/page_supplier") + @Operation(summary = "供应商列表", description = "供应商列表") + public ServerResponseEntity> pageSupplier(@Valid PageDTO pageDTO, SupplierDetailDTO supplierDetailDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + supplierDetailDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + return ServerResponseEntity.success(supplierDetailService.pageSupplier(pageDTO, supplierDetailDTO, shopId)); + } + + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/CompanyAuditingController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/CompanyAuditingController.java new file mode 100644 index 0000000..3c75951 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/CompanyAuditingController.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.platform; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.dto.SupplierCompanyAuditingDTO; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierCompanyAuditingService; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyAuditingVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author chiley + * @date 2022/9/14 14:32 + */ +@RestController("companyAuditingController") +@RequestMapping("/p/supplier_company_auditing") +@Tag(name = "platform-审核供应商工商信息") +public class CompanyAuditingController { + + + @Autowired + private SupplierCompanyAuditingService supplierCompanyAuditingService; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + + @GetMapping("/page") + @Operation(summary = "分页获取待审核的工商信息", description = "分页获取待审核的工商信息") + public ServerResponseEntity> getCompanyAuditingPage(PageDTO pageDTO, SupplierCompanyAuditingDTO supplierCompanyAuditingDTO) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + return ServerResponseEntity.success(supplierCompanyAuditingService.page(pageDTO, supplierCompanyAuditingDTO)); + + } + + @PutMapping("/audit") + @Operation(summary = "审核签约信息", description = "审核签约信息") + public ServerResponseEntity audit(@Valid @RequestBody SupplierCompanyAuditingDTO supplierCompanyAuditingDTO) { + if (supplierAllinpayService.getIsAllinpay()) { + throw new LuckException("开启通联后,平台无需审核供应商工商信息"); + } + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + supplierCompanyAuditingDTO.setAuditorId(AuthUserContext.get().getUserId()); + supplierCompanyAuditingService.audit(supplierCompanyAuditingDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/auditInfo") + @Operation(summary = "查看申请审核情况", description = "查看申请审核情况") + public ServerResponseEntity auditInfo(@RequestParam("supplierId") Long supplierId) { + return ServerResponseEntity.success(supplierCompanyAuditingService.getAuditInfo(supplierId)); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierBankCardController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierBankCardController.java new file mode 100644 index 0000000..fece6eb --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierBankCardController.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.platform; + +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.supplier.vo.SupplierBankCardVO; +import com.tmerclub.cloud.common.constant.CompanyInfoProcessStatus; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.supplier.constant.AuditStatus; +import com.tmerclub.cloud.supplier.dto.AllinpaySupplierBankCardDTO; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierBankCardService; +import com.tmerclub.cloud.supplier.service.SupplierCompanyService; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/4/26 10:09 + */ +@RestController +@RequestMapping("/p/supplier_bank_card") +@Tag(name = "platform-供应商银行卡信息") +public class SupplierBankCardController { + + @Autowired + private SupplierBankCardService supplierBankCardService; + @Autowired + private SupplierCompanyService supplierCompanyService; + @Autowired + private SupplierDetailService supplierDetailService; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + + @GetMapping("/list_by_supplier_id") + @Operation(summary = "根据供应商id批量获取银行卡信息") + public ServerResponseEntity> listBySupplierId(@RequestParam("supplierId") Long supplierId) { + List supplierBankCardVOList = supplierBankCardService.listBySupplierId(supplierId); + return ServerResponseEntity.success(supplierBankCardVOList); + } + + @PostMapping("/allinpay_save_and_apply_supplier") + @Operation(summary = "通联支付--批量保存供应商银行卡信息并提交供应商审核信息", description = "批量保存供应商银行卡信息并提交供应商审核信息") + public ServerResponseEntity allinpaySaveAndApplySupplier(@Valid @RequestBody AllinpaySupplierBankCardDTO allinpaySupplierBankCardDTO) { + Long supplierId = allinpaySupplierBankCardDTO.getSupplierId(); + if (Objects.isNull(supplierId)) { + throw new LuckException("供应商id不能为空"); + } + // 查找工商信息 + SupplierCompanyVO supplierCompanyVO = supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierId, AuditStatus.WAITAUDIT.value()); + if (Objects.isNull(supplierCompanyVO)) { + throw new LuckException("该供应商工商信息为空,请刷新页面重新填写"); + } + checkAllinpay(supplierCompanyVO); + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(supplierId); + if (Objects.equals(supplierApiDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.SUCCESS.value())) { + // 已经审核成功就不必要多次设置企业信息了 + throw new LuckException("该供应商已经审核通过"); + } + supplierBankCardService.insertAndSetCompanyInfo(allinpaySupplierBankCardDTO, supplierId, supplierCompanyVO); + supplierDetailService.removeCacheBySupplierId(supplierId); + return ServerResponseEntity.success(); + } + + private void checkAllinpay(SupplierCompanyVO supplierCompanyVO) { + boolean needInfo = Objects.isNull(supplierCompanyVO.getLegalIds()) || Objects.isNull(supplierCompanyVO.getLegalPhone()); + if (supplierAllinpayService.getIsAllinpay() && needInfo) { + throw new LuckException("工商信息需要提交的内容有所变更,请重新填写"); + } + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierCompanyController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierCompanyController.java new file mode 100644 index 0000000..2571cc8 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierCompanyController.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.platform; + +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.IdCardCollectProcessStatus; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.supplier.constant.AuditStatus; +import com.tmerclub.cloud.supplier.dto.SupplierCompanyDTO; +import com.tmerclub.cloud.supplier.model.SupplierCompany; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierCompanyService; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 供应商工商信息 + * + * @author lth + */ +@RestController("platformSupplierCompanyController") +@RequestMapping("/p/supplier_company") +@Tag(name = "platform-供应商工商信息") +public class SupplierCompanyController { + + @Autowired + private SupplierCompanyService supplierCompanyService; + + + @Autowired + private SupplierAllinpayService supplierAllinpayService; + + @Autowired + private SupplierDetailService supplierDetailService; + + @GetMapping + @Operation(summary = "根据供应商id获取供应商工商信息", description = "根据供应商id获取供应商工商信息") + @Parameter(name = "status", description = "审核状态:1:已通过 0待审核 -1未通过") + public ServerResponseEntity getSupplierCompanyBySupplierId(@RequestParam("supplierId") Long supplierId, @RequestParam(value = "status", required = false, defaultValue = "1") Integer status) { + if (supplierAllinpayService.getIsAllinpay()) { + // 影印件还没通过审核 + SupplierApiDetailVO supplierDetail = supplierDetailService.getBySupplierId(supplierId); + if (!Objects.equals(supplierDetail.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + status = AuditStatus.WAITAUDIT.value(); + } + } + return ServerResponseEntity.success(supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierId, status)); + } + + @PutMapping + @Operation(summary = "更新供应商工商信息", description = "更新供应商工商信息") + public ServerResponseEntity editSupplierCompany(@RequestBody @Valid SupplierCompanyDTO supplierCompanyDTO) { + boolean isAllinpay = supplierAllinpayService.getIsAllinpay(); + if (Objects.isNull(supplierCompanyDTO.getSupplierId())) { + throw new LuckException("供应商id不能为空"); + } + supplierCompanyService.batchUpdateStatus(supplierCompanyDTO.getSupplierId(), AuditStatus.FAILAUDIT.value(), null); + SupplierCompany supplierCompany = BeanUtil.map(supplierCompanyDTO, SupplierCompany.class); + supplierCompany.setStatus(isAllinpay ? AuditStatus.WAITAUDIT.value() : AuditStatus.SUCCESSAUDIT.value()); + if (isAllinpay) { + supplierCompanyService.platformUpdateSupplierCompany(supplierCompany, supplierCompany.getSupplierId()); + } else { + supplierCompanyService.updateBySupplierId(supplierCompany, supplierCompany.getSupplierId(), 0); + } + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierDetailController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierDetailController.java new file mode 100644 index 0000000..131e24f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierDetailController.java @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.platform; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.supplier.constant.SupplierStatus; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.supplier.constant.IsPreferred; +import com.tmerclub.cloud.supplier.dto.SupplierAccountDTO; +import com.tmerclub.cloud.supplier.dto.SupplierCreateInfoDTO; +import com.tmerclub.cloud.supplier.dto.SupplierDetailDTO; +import com.tmerclub.cloud.supplier.dto.SupplierSigningInfoDTO; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.vo.SupplierDetailVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 供应商详情 + * + * @author FrozenWatermelon + * @date 2020-12-05 15:50:25 + */ +@RestController("platformSupplierDetailController") +@RequestMapping("/p/supplier_detail") +@Tag(name = "platform-供应商信息") +public class SupplierDetailController { + + @Value("${mall4cloud.expose.permission:}") + private Boolean permission; + + @Autowired + private SupplierDetailService supplierDetailService; + @DubboReference + private AccountFeignClient accountFeignClient; + + @GetMapping("/page") + @Operation(summary = "分页查询", description = "分页查询") + public ServerResponseEntity> getSupplierAuditingPage(PageDTO pageDTO, SupplierDetailDTO supplierDetailDTO) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + return ServerResponseEntity.success(supplierDetailService.page(pageDTO, supplierDetailDTO)); + } + + @GetMapping("/info") + @Operation(summary = "获取供应商基本信息", description = "获取供应商基本信息") + public ServerResponseEntity getInfo(@RequestParam Long supplierId) { + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(supplierId); + if (StrUtil.isNotBlank(supplierApiDetailVO.getContactPhone())) { + supplierApiDetailVO.setContactPhone(PhoneUtil.hideBetween(supplierApiDetailVO.getContactPhone()).toString()); + } + ServerResponseEntity responseEntity = accountFeignClient.getAccountInfoByTenantId(supplierId, SysTypeEnum.SUPPLIER.value()); + if (responseEntity.isSuccess() && Objects.nonNull(responseEntity.getData())) { + AuthAccountVO authAccountVO = responseEntity.getData(); + supplierApiDetailVO.setSupplierAccount(PhoneUtil.hideBetween(authAccountVO.getPhone()).toString()); + supplierApiDetailVO.setAccountStatus(authAccountVO.getStatus()); + } + return ServerResponseEntity.success(supplierApiDetailVO); + } + + /** + * 新建供应商 + */ + @PostMapping("/create_supplier") + @Operation(summary = "新建供应商", description = "新建供应商") + public ServerResponseEntity createSupplier(@RequestBody SupplierCreateInfoDTO supplierCreateInfoDTO) { + supplierDetailService.platformCreateSupplier(supplierCreateInfoDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "编辑供应商基本信息", description = "编辑供应商基本信息") + public ServerResponseEntity editSupplier(@RequestBody SupplierDetailDTO supplierDetailDTO) { + if (Objects.isNull(supplierDetailDTO.getSupplierId())) { + throw new LuckException("供应商id不能为空"); + } + supplierDetailService.update(supplierDetailDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_signing_info") + @Operation(summary = "更新供应商签约信息", description = "更新供应商签约信息") + public ServerResponseEntity updateSigningInfo(@RequestBody @Valid SupplierSigningInfoDTO supplierSigningInfoDTO) { + if (Objects.isNull(supplierSigningInfoDTO.getSupplierId())) { + throw new LuckException("供应商id不能为空"); + } + supplierDetailService.updateSigningInfo(supplierSigningInfoDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_supplier_preferred") + @Operation(summary = "当前供应商为优选,则取消优选;不是优选,则设置为优选", description = "当前供应商为优选,则取消优选;不是优选,则设置为优选") + public ServerResponseEntity updateSupplierPreferred(@RequestParam("supplierId") Long supplierId) { + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(supplierId); + supplierApiDetailVO.setIsPreferred(Objects.equals(supplierApiDetailVO.getIsPreferred(), IsPreferred.YES.value()) ? IsPreferred.NO.value() : IsPreferred.YES.value()); + supplierDetailService.update(BeanUtil.map(supplierApiDetailVO, SupplierDetailDTO.class)); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_password") + @Operation(summary = "更新供应商账户的登录密码", description = "更新供应商账户的登录密码") + public ServerResponseEntity updatePassword(@RequestBody SupplierAccountDTO supplierAccountDTO) { + if (Objects.equals(supplierAccountDTO.getSupplierId(), Constant.ON_LINE_SUPPLIER_ID) && BooleanUtil.isFalse(permission)) { + throw new LuckException("没有权限进行操作"); + } + ServerResponseEntity merchantInfoByTenantId = accountFeignClient.getAccountInfoByTenantId(supplierAccountDTO.getSupplierId(), SysTypeEnum.SUPPLIER.value()); + if (!merchantInfoByTenantId.isSuccess()) { + throw new LuckException("服务异常"); + } + AuthAccountVO authAccountVO = merchantInfoByTenantId.getData(); + authAccountVO.setPassword(supplierAccountDTO.getPassword()); + accountFeignClient.update(BeanUtil.map(authAccountVO, AuthAccountDTO.class)); + return ServerResponseEntity.success(); + } + + @PutMapping("/offline") + @Operation(summary = "下线供应商", description = "下线供应商") + public ServerResponseEntity offline(@RequestBody OfflineHandleEventDTO offlineHandleEventDTO) { + Long sysUserId = AuthUserContext.get().getUserId(); + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(offlineHandleEventDTO.getHandleId()); + if (Objects.isNull(supplierApiDetailVO)) { + throw new LuckException("未找到该供应商信息"); + } + if (!Objects.equals(supplierApiDetailVO.getSupplierStatus(), SupplierStatus.OPEN.value()) && !Objects.equals(supplierApiDetailVO.getSupplierStatus(), SupplierStatus.STOP.value())) { + throw new LuckException("供应商不处于营业或者停业状态,不能进行下线"); + } + supplierDetailService.offline(supplierApiDetailVO, offlineHandleEventDTO.getOfflineReason(), sysUserId); + return ServerResponseEntity.success(); + } + + @GetMapping("/count_by_supplier_status") + @Operation(summary = "根据供应商状态查询供应商数量", description = "根据供应商状态查询供应商数量") + public ServerResponseEntity countBySupplierStatus(@RequestParam(value = "supplierStatus", required = false, defaultValue = "3") Long supplierStatus) { + Long countBySupplierStatus = supplierDetailService.countBySupplierStatus(supplierStatus); + return ServerResponseEntity.success(countBySupplierStatus); + } + + @PostMapping("/online_audit") + @Operation(summary = "供应商违规下线,重新申请上线审核", description = "供应商违规下线,重新申请上线审核") + public ServerResponseEntity onlineAudit(@RequestBody OfflineHandleEventDTO offlineHandleEventDTO) { + supplierDetailService.onlineAudit(offlineHandleEventDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/online_open_shop") + @Operation(summary = "供应商违规下线,平台直接上线供应商", description = "开通通联支付可用") + public ServerResponseEntity onlineOpenSupplier(@RequestBody OfflineHandleEventDTO offlineHandleEventDTO) { + offlineHandleEventDTO.setStatus(OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue()); + supplierDetailService.onlineOpenSupplier(offlineHandleEventDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/page_supplier") + @Operation(summary = "供应商列表", description = "供应商列表") + public ServerResponseEntity> pageSupplier(@Valid PageDTO pageDTO, SupplierDetailDTO supplierDetailDTO) { + supplierDetailDTO.setSysType(SysTypeEnum.PLATFORM.value()); + return ServerResponseEntity.success(supplierDetailService.pageSupplier(pageDTO, supplierDetailDTO, null)); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/CompanyAuditingController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/CompanyAuditingController.java new file mode 100644 index 0000000..195060d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/CompanyAuditingController.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.supplier; + + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.constant.AuditStatus; +import com.tmerclub.cloud.supplier.dto.SupplierCompanyDTO; +import com.tmerclub.cloud.supplier.service.SupplierCompanyAuditingService; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyAuditingVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author chiley + * @date 2022/9/13 14:06 + */ +@RestController("supplierCompanyAuditingController") +@RequestMapping("/s/supplier_company_auditing") +@Tag(name = "supplier-供应商变更工商信息") +public class CompanyAuditingController { + + @Autowired + private SupplierCompanyAuditingService supplierCompanyAuditingService; + + + @PostMapping("/apply_change_company_info") + @Operation(summary = "申请变更工商信息", description = "申请变更工商信息") + public ServerResponseEntity applyChangeCompanyInfo(@RequestBody @Valid SupplierCompanyDTO supplierCompanyDTO) { + Long supplierId = AuthUserContext.get().getTenantId(); + // 校验是否已经存在申请中记录 + SupplierCompanyAuditingVO latestAuditing = supplierCompanyAuditingService.getLatestAuditingBySupplierId(supplierId); + if (Objects.nonNull(latestAuditing) && Objects.equals(latestAuditing.getStatus(), AuditStatus.WAITAUDIT.value())) { + throw new LuckException("不能同时提交多次签约申请,请耐心等候平台审核,或者把上次提交申请撤销后重新申请"); + } + supplierCompanyDTO.setSupplierId(supplierId); + supplierCompanyAuditingService.applyChangeCompanyInfo(supplierCompanyDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/revoke") + @Operation(summary = "撤销申请", description = "撤销申请") + public ServerResponseEntity revoke() { + Long supplierId = AuthUserContext.get().getTenantId(); + supplierCompanyAuditingService.revoke(supplierId); + return ServerResponseEntity.success(); + } + + @GetMapping("/auditInfo") + @Operation(summary = "查看申请审核情况", description = "查看申请审核情况") + public ServerResponseEntity auditInfo() { + Long supplierId = AuthUserContext.get().getTenantId(); + return ServerResponseEntity.success(supplierCompanyAuditingService.getAuditInfo(supplierId)); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierApplyController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierApplyController.java new file mode 100644 index 0000000..1938351 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierApplyController.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.supplier; + +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.supplier.constant.SupplierStatus; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.constant.AuditStatus; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierAuditingService; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.vo.SupplierAuditingVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +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.util.Objects; + +/** + * @author person + */ +@RestController("supplierSupplierApplyController") +@RequestMapping("/s/apply_supplier/supplier_apply") +@Tag(name = "supplier-供应商申请") +public class SupplierApplyController { + + @Autowired + private SupplierDetailService supplierDetailService; + + @Autowired + private SupplierAuditingService supplierAuditingService; + + @DubboReference + private AccountFeignClient accountFeignClient; + + @Autowired + private SupplierAllinpayService supplierAllinpayService; + + @GetMapping("/get_auditing_info") + @Operation(summary = "获取供应商审核状态信息", description = "获取供应商审核状态信息,返回值为空代表该供应商没有提交过审核信息") + public ServerResponseEntity getAuditingInfo() { + Long supplierId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + if (Objects.equals(supplierId, Constant.DEFAULT_SHOP_ID)) { + return ServerResponseEntity.success(null); + } + SupplierAuditingVO supplierAuditingVO = supplierAuditingService.getBySupplierId(supplierId); + if (Objects.isNull(supplierAuditingVO)) { + return ServerResponseEntity.success(null); + } + ServerResponseEntity responseEntity = accountFeignClient.getAccountInfoByTenantId(supplierId, sysType); + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(supplierId); + if (Objects.equals(supplierApiDetailVO.getSupplierStatus(), SupplierStatus.OFFLINE.value())) { + supplierAuditingVO.setStatus(AuditStatus.OFFLINE.value()); + } else if (Objects.equals(supplierApiDetailVO.getSupplierStatus(), SupplierStatus.OFFLINE_AWAIT_AUDIT.value()) || Objects.equals(supplierApiDetailVO.getSupplierStatus(), SupplierStatus.OPEN_AWAIT_AUDIT.value())) { + if (!supplierAllinpayService.getIsAllinpay()) { + supplierAuditingVO.setStatus(AuditStatus.WAITAUDIT.value()); + } + } + if (responseEntity.isSuccess() && Objects.nonNull(responseEntity.getData())) { + AuthAccountVO authAccountVO = responseEntity.getData(); + supplierApiDetailVO.setSupplierAccount(authAccountVO.getPhone()); + supplierApiDetailVO.setAccountStatus(authAccountVO.getStatus()); + } + supplierAuditingVO.setSupplierDetail(supplierApiDetailVO); + supplierAuditingVO.setUserId(null); + supplierAuditingVO.setSupplierId(null); + supplierAuditingVO.setAuditorId(null); + return ServerResponseEntity.success(supplierAuditingVO); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierBankCardController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierBankCardController.java new file mode 100644 index 0000000..ddbc0fd --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierBankCardController.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.supplier; + +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.supplier.vo.SupplierBankCardVO; +import com.tmerclub.cloud.common.constant.CompanyInfoProcessStatus; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.constant.AuditStatus; +import com.tmerclub.cloud.supplier.dto.AllinpaySupplierBankCardDTO; +import com.tmerclub.cloud.supplier.dto.SupplierBankCardDTO; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierBankCardService; +import com.tmerclub.cloud.supplier.service.SupplierCompanyService; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @author lth + */ +@RestController("supplierSupplierBankCardController") +@RequestMapping("/s/apply_supplier/supplier_bank_card") +@Tag(name = "supplier-供应商银行卡信息") +public class SupplierBankCardController { + + @Autowired + private SupplierBankCardService supplierBankCardService; + @Autowired + private SupplierCompanyService supplierCompanyService; + @Autowired + private SupplierDetailService supplierDetailService; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + + @PostMapping("/save_and_apply_supplier") + @Operation(summary = "批量保存供应商银行卡信息并提交供应商审核信息", description = "批量保存供应商银行卡信息并提交供应商审核信息") + public ServerResponseEntity saveAndApplySupplier(@Valid @RequestBody List supplierBankCardDTOList) { + Long supplierId = AuthUserContext.get().getTenantId(); + supplierBankCardService.insertBatchAndSubmitApply(supplierBankCardDTOList, supplierId); + return ServerResponseEntity.success(); + } + + @PostMapping("/allinpay_save_and_apply_supplier") + @Operation(summary = "通联支付--批量保存供应商银行卡信息并提交供应商审核信息", description = "批量保存供应商银行卡信息并提交供应商审核信息") + public ServerResponseEntity allinpaySaveAndApplySupplier(@Valid @RequestBody AllinpaySupplierBankCardDTO allinpaySupplierBankCardDTO) { + Long supplierId = AuthUserContext.get().getTenantId(); + // 查找工商信息 + SupplierCompanyVO supplierCompanyVO = supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierId, AuditStatus.WAITAUDIT.value()); + if (Objects.isNull(supplierCompanyVO)) { + throw new LuckException("供应商工商信息为空,请刷新页面重新填写"); + } + checkAllinpay(supplierCompanyVO); + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(supplierId); + if (Objects.equals(supplierApiDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.SUCCESS.value())) { + // 已经审核成功就不必要多次设置企业信息了 + throw new LuckException("供应商已经审核通过"); + } + supplierBankCardService.insertAndSetCompanyInfo(allinpaySupplierBankCardDTO, supplierId, supplierCompanyVO); + supplierDetailService.removeCacheBySupplierId(supplierId); + return ServerResponseEntity.success(); + } + + private void checkAllinpay(SupplierCompanyVO supplierCompanyVO) { + boolean needInfo = Objects.isNull(supplierCompanyVO.getLegalIds()) || Objects.isNull(supplierCompanyVO.getLegalPhone()); + if (supplierAllinpayService.getIsAllinpay() && needInfo) { + throw new LuckException("工商信息需要提交的内容有所变更,请重新填写"); + } + } + + @GetMapping + @Operation(summary = "根据银行卡id获取银行卡信息", description = "根据银行卡id获取银行卡信息") + public ServerResponseEntity getById(@RequestParam("supplierBankCardId") Long supplierBankCardId) { + Long supplierId = AuthUserContext.get().getTenantId(); + SupplierBankCardVO supplierBankCardVO = supplierBankCardService.getBySupplierBankCardIdAndSupplierId(supplierBankCardId, supplierId); + return ServerResponseEntity.success(supplierBankCardVO); + } + + @GetMapping("/list_by_supplierId") + @Operation(summary = "获取供应商下的银行卡列表", description = "获取供应商下的银行卡列表") + public ServerResponseEntity> listBySupplierId() { + Long supplierId = AuthUserContext.get().getTenantId(); + List supplierBankCardVOList = supplierBankCardService.listBySupplierId(supplierId); + return ServerResponseEntity.success(supplierBankCardVOList); + } + + @PostMapping + @Operation(summary = "添加单个银行卡信息", description = "添加单个银行卡信息") + public ServerResponseEntity insert(@RequestBody @Valid SupplierBankCardDTO supplierBankCardDTO) { + if (supplierAllinpayService.getIsAllinpay()) { + throw new LuckException("当前不支持该接口添加银行卡"); + } + Long supplierId = AuthUserContext.get().getTenantId(); + supplierBankCardService.insertBySupplierId(supplierBankCardDTO, supplierId); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "根据银行卡id删除银行卡信息", description = "根据银行卡id删除银行卡信息") + public ServerResponseEntity deleteById(@RequestParam("supplierBankCardId") Long supplierBankCardId) { + if (supplierAllinpayService.getIsAllinpay()) { + throw new LuckException("当前不支持该接口删除银行卡"); + } + supplierBankCardService.deleteBySupplierBankCardId(supplierBankCardId, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新银行卡信息", description = "更新银行卡信息") + public ServerResponseEntity update(@RequestBody @Valid SupplierBankCardDTO supplierBankCardDTO) { + if (supplierAllinpayService.getIsAllinpay()) { + throw new LuckException("当前不支持该接口更新银行卡"); + } + supplierBankCardService.updateBySupplierId(supplierBankCardDTO, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @PutMapping("/set_primary") + @Operation(summary = "设置为主账号", description = "设置为主账号") + public ServerResponseEntity setPrimary(@RequestParam("supplierBankCardId") Long supplierBankCardId) { + supplierBankCardService.setPrimaryBySupplierId(supplierBankCardId, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @PutMapping("/set_not_primary") + @Operation(summary = "取消主账号", description = "取消主账号") + public ServerResponseEntity setNotPrimary(@RequestParam("supplierBankCardId") Long supplierBankCardId) { + supplierBankCardService.setNotPrimaryBySupplierId(supplierBankCardId, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/refresh") + @Operation(summary = "刷新银行卡列表", description = "通联独有,防止有银行卡没有同步到数据库") + public ServerResponseEntity refresh() { + Long supplierId = AuthUserContext.get().getTenantId(); + supplierBankCardService.refresh(supplierId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierDetailController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierDetailController.java new file mode 100644 index 0000000..38cd86f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierDetailController.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.supplier; + + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.supplier.constant.SupplierStatus; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.dto.SupplierDetailDTO; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.vo.SupplierStatusInfoVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author lth + */ +@RestController("supplierSupplierDetailController") +@RequestMapping("/s/apply_supplier/supplier_detail") +@Tag(name = "supplier-供应商信息") +public class SupplierDetailController { + + @Autowired + private SupplierDetailService supplierDetailService; + @DubboReference + private OfflineHandleEventFeignClient offlineHandleEventFeignClient; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + + @PostMapping + @Operation(summary = "创建供应商", description = "创建供应商") + public ServerResponseEntity createSupplier(@RequestBody @Valid SupplierDetailDTO supplierDetailDTO) { + if (!Objects.equals(AuthUserContext.get().getTenantId(), Constant.DEFAULT_SUPPLIER_ID)) { + throw new LuckException("供应商已存在,不能重复创建"); + } + this.dealWithUpdateOrCreateInfo(supplierDetailDTO); + supplierDetailService.createSupplier(supplierDetailDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新供应商基本信息", description = "更新供应商基本信息") + public ServerResponseEntity update(@RequestBody @Valid SupplierDetailDTO supplierDetailDTO) { + Long supplierId = AuthUserContext.get().getTenantId(); + if (Objects.equals(supplierId, Constant.DEFAULT_SUPPLIER_ID)) { + throw new LuckException("供应商不存在,无法更新"); + } + supplierDetailDTO.setSupplierId(supplierId); + this.dealWithUpdateOrCreateInfo(supplierDetailDTO); + supplierDetailService.update(supplierDetailDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/storage") + @Operation(summary = "存储供应商基本信息", description = "存储供应商基本信息,不存在则新增,已存在则更新") + public ServerResponseEntity storage(@RequestBody @Valid SupplierDetailDTO supplierDetailDTO) { + Long supplierId = AuthUserContext.get().getTenantId(); + this.dealWithUpdateOrCreateInfo(supplierDetailDTO); + if (Objects.equals(supplierId, Constant.DEFAULT_SUPPLIER_ID)) { + // 供应商不存在,新增 + supplierDetailService.createSupplier(supplierDetailDTO); + } else { + // 供应商已存在,更新 + supplierDetailDTO.setSupplierId(supplierId); + supplierDetailService.update(supplierDetailDTO); + } + return ServerResponseEntity.success(); + } + + @GetMapping + @Operation(summary = "获取供应商基本信息", description = "获取供应商基本信息") + public ServerResponseEntity get() { + Long supplierId = AuthUserContext.get().getTenantId(); + if (Objects.equals(supplierId, Constant.DEFAULT_SUPPLIER_ID)) { + // 供应商未创建 + return ServerResponseEntity.success(null); + } + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(supplierId); + if (Objects.nonNull(supplierApiDetailVO) && StrUtil.isNotBlank(supplierApiDetailVO.getContactPhone())) { + supplierApiDetailVO.setContactPhone(PhoneUtil.hideBetween(supplierApiDetailVO.getContactPhone()).toString()); + } + return ServerResponseEntity.success(supplierApiDetailVO); + } + + @GetMapping("/get_status_info") + @Operation(summary = "获取供应商状态信息", description = "获取供应商状态信息") + public ServerResponseEntity getSupplierStatusInfo() { + Long supplierId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(supplierId); + if (Objects.isNull(supplierApiDetailVO)) { + throw new LuckException("供应商不存在"); + } + SupplierStatusInfoVO supplierStatusInfoVO = new SupplierStatusInfoVO(); + supplierStatusInfoVO.setSupplierStatus(supplierApiDetailVO.getSupplierStatus()); + supplierStatusInfoVO.setContractStartTime(supplierApiDetailVO.getContractStartTime()); + supplierStatusInfoVO.setContractEndTime(supplierApiDetailVO.getContractEndTime()); + if (Objects.equals(supplierApiDetailVO.getSupplierStatus(), SupplierStatus.OFFLINE.value())) { + ServerResponseEntity offlineHandleEventRes = offlineHandleEventFeignClient.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.SHOP.getValue(), supplierId, sysType); + if (!offlineHandleEventRes.isSuccess()) { + throw new LuckException(offlineHandleEventRes.getMsg()); + } + OfflineHandleEventVO offlineHandleEventVO = offlineHandleEventRes.getData(); + if (Objects.nonNull(offlineHandleEventVO)) { + supplierStatusInfoVO.setOfflineStatus(offlineHandleEventVO.getStatus()); + supplierStatusInfoVO.setOfflineReason(offlineHandleEventVO.getOfflineReason()); + } else if (supplierAllinpayService.getIsAllinpay()) { + supplierStatusInfoVO.setOfflineReason("平台开启通联支付,请重新提交工商信息与财务信息"); + } + } + return ServerResponseEntity.success(supplierStatusInfoVO); + } + + @PostMapping("/create_allinpay_member") + @Operation(summary = "给还没有创建通联账户的供应商创建一个", description = "给还没有创建通联账户的供应商创建一个") + public ServerResponseEntity createAllinpayMemberBySupplierId() { + supplierDetailService.createAllinpayMemberBySupplierId(AuthUserContext.get().getTenantId()); + supplierDetailService.removeCacheBySupplierId(AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/audit_apply") + @Operation(summary = "供应商重新申请上线", description = "供应商重新申请上线") + public ServerResponseEntity auditApply(@RequestBody OfflineHandleEventDTO offlineHandleEventDTO) { + Long supplierId = AuthUserContext.get().getTenantId(); + offlineHandleEventDTO.setHandleId(supplierId); + supplierDetailService.auditApply(offlineHandleEventDTO); + return ServerResponseEntity.success(); + } + + /** + * 处理供应商信息,这些信息供应商无法直接修改 + * + * @param supplierDetailDTO + */ + private void dealWithUpdateOrCreateInfo(SupplierDetailDTO supplierDetailDTO) { + if (Objects.isNull(supplierDetailDTO)) { + return; + } + supplierDetailDTO.setContractEndTime(null); + supplierDetailDTO.setContractStartTime(null); + supplierDetailDTO.setSupplierStatus(null); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierPurchaseAmountLogController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierPurchaseAmountLogController.java new file mode 100644 index 0000000..1db7433 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierPurchaseAmountLogController.java @@ -0,0 +1,71 @@ +package com.tmerclub.cloud.supplier.controller.supplier; + +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.dto.PurchaseAmountLogDTO; +import com.tmerclub.cloud.supplier.service.PurchaseAmountLogService; +import com.tmerclub.cloud.supplier.vo.ShopSupplierNameVO; +import com.tmerclub.cloud.supplier.vo.TotalPurchaseAmountVO; +import com.tmerclub.cloud.supplier.vo.mongo.MongoPurchaseAmountLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +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.util.List; + +/** + * @author gaozijie + * @date 2023-08-28 + */ +@RestController +@RequestMapping("/s/purchase_amount_log") +@Tag(name = "采购金额日志(供应商)") +public class SupplierPurchaseAmountLogController { + + @Autowired + private PurchaseAmountLogService purchaseAmountLogService; + + @GetMapping("/list_shop") + @Operation(summary = "获取商家列表") + public ServerResponseEntity> listShop() { + Long supplierId = AuthUserContext.get().getTenantId(); + List shopNames = purchaseAmountLogService.listShop(supplierId); + return ServerResponseEntity.success(shopNames); + } + + @GetMapping("/page") + @Operation(summary = "分页获取采购金额日志") + public ServerResponseEntity> pagePurchaseLog(PageDTO pageDTO, PurchaseAmountLogDTO purchaseAmountLogDTO) { + Long supplierId = AuthUserContext.get().getTenantId(); + purchaseAmountLogDTO.setSupplierId(supplierId); + purchaseAmountLogDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + PageVO page = purchaseAmountLogService.pagePurchaseAmountLog(pageDTO, purchaseAmountLogDTO); + return ServerResponseEntity.success(page); + } + + @GetMapping("/get_total_amount") + @Operation(summary = "获取采购总金额数据") + public ServerResponseEntity getTotalAmount(PurchaseAmountLogDTO purchaseAmountLogDTO) { + Long supplierId = AuthUserContext.get().getTenantId(); + purchaseAmountLogDTO.setSupplierId(supplierId); + purchaseAmountLogDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + TotalPurchaseAmountVO totalPurchaseAmount = purchaseAmountLogService.getTotalPurchaseAmount(purchaseAmountLogDTO); + return ServerResponseEntity.success(totalPurchaseAmount); + } + + @GetMapping("/export_excel") + @Operation(summary = "导出excel") + public void exportExcel(HttpServletResponse response, PurchaseAmountLogDTO purchaseAmountLogDTO) { + Long supplierId = AuthUserContext.get().getTenantId(); + purchaseAmountLogDTO.setSupplierId(supplierId); + purchaseAmountLogDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + purchaseAmountLogService.exportExcel(response, purchaseAmountLogDTO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierRefundAddrController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierRefundAddrController.java new file mode 100644 index 0000000..0bc8f68 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierRefundAddrController.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.supplier; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiRefundAddrVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.supplier.dto.SupplierRefundAddrDTO; +import com.tmerclub.cloud.supplier.model.SupplierRefundAddr; +import com.tmerclub.cloud.supplier.service.SupplierRefundAddrService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 退货地址 + * + * @author YXF + * @date 2021-01-27 09:10:00 + */ +@RestController("adminSupplierRefundAddrController") +@RequestMapping("/s/supplier_refund_addr") +@Tag(name = "admin-供应商供应商退货地址") +public class SupplierRefundAddrController { + + @Autowired + private SupplierRefundAddrService supplierRefundAddrService; + + + @GetMapping("/page") + @Operation(summary = "分页获取退货地址列表", description = "分页获取退货地址列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, SupplierRefundAddrDTO supplierRefundAddrDTO) { + supplierRefundAddrDTO.setSupplierId(AuthUserContext.get().getTenantId()); + PageVO refundAddrPage = supplierRefundAddrService.page(pageDTO, supplierRefundAddrDTO); + for (SupplierApiRefundAddrVO supplierRefundAddrVO : refundAddrPage.getList()) { + if (StrUtil.isNotBlank(supplierRefundAddrVO.getMobile())) { + supplierRefundAddrVO.setMobile(PhoneUtil.hideBetween(supplierRefundAddrVO.getMobile()).toString()); + } + } + return ServerResponseEntity.success(refundAddrPage); + } + + @GetMapping + @Operation(summary = "获取退货地址", description = "根据supplierRefundAddrId获取退货地址") + public ServerResponseEntity getBySupplierRefundAddrId(@RequestParam Long supplierRefundAddrId) { + Long supplierId = AuthUserContext.get().getTenantId(); + SupplierApiRefundAddrVO bySupplierRefund = supplierRefundAddrService.getBySupplierRefundAddrId(supplierRefundAddrId, supplierId); + if (StrUtil.isNotBlank(bySupplierRefund.getMobile())) { + bySupplierRefund.setMobile(PhoneUtil.hideBetween(bySupplierRefund.getMobile()).toString()); + } + return ServerResponseEntity.success(bySupplierRefund); + } + + @PostMapping + @Operation(summary = "保存退货地址", description = "保存退货地址") + public ServerResponseEntity save(@Valid @RequestBody SupplierRefundAddrDTO supplierRefundAddrDTO) { + SupplierRefundAddr supplierRefundAddr = BeanUtil.map(supplierRefundAddrDTO, SupplierRefundAddr.class); + Long supplierId = AuthUserContext.get().getTenantId(); + supplierRefundAddr.setSupplierId(supplierId); + supplierRefundAddrService.save(supplierRefundAddr); + supplierRefundAddrService.removeCacheBySupplierId(supplierId); + return ServerResponseEntity.success(supplierRefundAddr.getSupplierRefundAddrId()); + } + + @PutMapping + @Operation(summary = "更新退货地址", description = "更新退货地址") + public ServerResponseEntity update(@Valid @RequestBody SupplierRefundAddrDTO supplierRefundAddrDTO) { + SupplierRefundAddr supplierRefundAddr = BeanUtil.map(supplierRefundAddrDTO, SupplierRefundAddr.class); + Long supplierId = AuthUserContext.get().getTenantId(); + supplierRefundAddr.setSupplierId(AuthUserContext.get().getTenantId()); + supplierRefundAddrService.update(supplierRefundAddr); + supplierRefundAddrService.removeCacheBySupplierId(supplierId); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除退货地址", description = "根据退货地址id删除退货地址") + public ServerResponseEntity delete(@RequestParam Long supplierRefundAddrId) { + Long supplierId = AuthUserContext.get().getTenantId(); + supplierRefundAddrService.deleteById(supplierRefundAddrId, supplierId); + supplierRefundAddrService.removeCacheBySupplierId(supplierId); + return ServerResponseEntity.success(); + } + + @GetMapping("/list") + @Operation(summary = "获取退货地址列表", description = "获取退货地址列表") + public ServerResponseEntity> list() { + return ServerResponseEntity.success(supplierRefundAddrService.listBySupplierId(AuthUserContext.get().getTenantId())); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierUserController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierUserController.java new file mode 100644 index 0000000..ce55250 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierUserController.java @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.supplier; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.supplier.dto.SupplierUserDTO; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.service.SupplierUserService; +import com.tmerclub.cloud.supplier.vo.SupplierUserSimpleVO; +import com.tmerclub.cloud.supplier.vo.SupplierUserVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/09/02 + */ +@RequestMapping("/s/supplier_user") +@RestController +@Tag(name = "供应商用户信息") +public class SupplierUserController { + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + @Autowired + private SupplierUserService supplierUserService; + + @Autowired + private SupplierDetailService supplierDetailService; + + @DubboReference + private NotifyFeignClient notifyFeignClient; + + @GetMapping("/info") + @Operation(summary = "登陆供应商用户信息", description = "获取当前登陆供应商用户的用户信息") + public ServerResponseEntity info() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + SupplierUserSimpleVO supplierUserSimple = new SupplierUserSimpleVO(); + supplierUserSimple.setIsAdmin(uidInfoBO.getIsAdmin()); + supplierUserSimple.setUserName(uidInfoBO.getUsername()); + if (!Objects.equals(uidInfoBO.getTenantId(), Constant.DEFAULT_SHOP_ID)) { + SupplierApiDetailVO supplierDetail = supplierDetailService.getBySupplierId(uidInfoBO.getTenantId()); + supplierUserSimple.setAvatar(supplierDetail.getSupplierLogo()); + supplierUserSimple.setSupplierName(supplierDetail.getSupplierName()); + } + return ServerResponseEntity.success(supplierUserSimple); + } + + @GetMapping("/page") + @Operation(summary = "供应商用户列表", description = "获取供应商用户列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, SupplierUserDTO supplierUserDTO) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + supplierUserDTO.setSupplierId(uidInfoBO.getTenantId()); + PageVO supplierUserPage = supplierUserService.pageBySupplierId(pageDTO, supplierUserDTO); + return ServerResponseEntity.success(supplierUserPage); + } + + @GetMapping + @Operation(summary = "获取供应商用户信息", description = "根据用户id获取供应商用户信息") + public ServerResponseEntity detail(@RequestParam Long supplierUserId) { + SupplierUserVO supplierUserVO = supplierUserService.getByUserId(supplierUserId); + if (StrUtil.isNotBlank(supplierUserVO.getPhone())) { + supplierUserVO.setPhone(PhoneUtil.hideBetween(supplierUserVO.getPhone()).toString()); + } + if (StrUtil.isNotBlank(supplierUserVO.getPhoneNum())) { + supplierUserVO.setPhoneNum(PhoneUtil.hideBetween(supplierUserVO.getPhoneNum()).toString()); + } + return ServerResponseEntity.success(supplierUserVO); + } + + @PostMapping + @Operation(summary = "保存供应商用户信息", description = "保存供应商用户信息") + public ServerResponseEntity save(@Valid @RequestBody SupplierUserDTO supplierUserDTO) { + if (!PrincipalUtil.isMobile(supplierUserDTO.getPhone())) { + throw new LuckException("请输入正确格式的手机号!"); + } + if (StrUtil.isBlank(supplierUserDTO.getValidCode())) { + throw new LuckException("请输入验证码"); + } + supplierUserDTO.setSupplierId(AuthUserContext.get().getTenantId()); + checkCode(supplierUserDTO); + supplierUserService.saveAccount(supplierUserDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新供应商用户信息", description = "更新供应商用户信息") + public ServerResponseEntity update(@Valid @RequestBody SupplierUserDTO supplierUserDTO) { + // 线上的supplier账户资料不可修改 + String userName = "supplier"; + // 暂时的supplier账号id + Long supplierId = 590099128320L; + if (Objects.equals(supplierUserDTO.getUsername(), userName) && Objects.equals(supplierUserDTO.getSupplierUserId(), supplierId) && BooleanUtil.isFalse(permission)) { + throw new LuckException("暂无权限修改该用户信息"); + } + SupplierUserVO dbSupplierUser = supplierUserService.getByUserId(supplierUserDTO.getSupplierUserId()); + if (!Objects.equals(dbSupplierUser.getSupplierId(), AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + if (!PrincipalUtil.isDbPhone(supplierUserDTO.getPhone(), dbSupplierUser.getPhone(), false)) { + throw new LuckException("请输入正确的手机号"); + } + if (supplierUserDTO.getPhone().contains(Constant.ASTERISK)) { + supplierUserDTO.setPhone(dbSupplierUser.getPhone()); + } + // 如果修改了手机号码,就需要校验验证码 + if (!StrUtil.equals(dbSupplierUser.getPhone(), supplierUserDTO.getPhone())) { + if (StrUtil.isBlank(supplierUserDTO.getValidCode())) { + throw new LuckException("修改了手机号,请输入验证码校验"); + } + checkCode(supplierUserDTO); + } + supplierUserDTO.setSupplierId(dbSupplierUser.getSupplierId()); + supplierUserService.updateAccount(supplierUserDTO); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除供应商用户信息", description = "根据供应商用户id删除供应商用户信息") + public ServerResponseEntity delete(@RequestParam Long supplierUserId) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + SupplierUserVO dbSupplierUser = supplierUserService.getByUserId(supplierUserId); + if (!Objects.equals(dbSupplierUser.getSupplierId(), uidInfoBO.getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } else if (Objects.equals(uidInfoBO.getUserId(), supplierUserId)) { + throw new LuckException("您正在使用当前账号,无法进行删除操作"); + } + supplierUserService.deleteById(supplierUserId); + return ServerResponseEntity.success(); + } + + @GetMapping("/verify_account") + @Operation(summary = "验证供应商账号", description = "根据用户id获取供应商用户信息") + public ServerResponseEntity verifyAccount(SupplierUserDTO supplierUserDTO) { + // 验证手机号/邮箱/用户名在数据库中是否已经存在 + return supplierUserService.verifySupplierUserAccount(supplierUserDTO); + } + + /** + * 校验验证码 + * + * @param supplierUserDTO + * @return + */ + private void checkCode(SupplierUserDTO supplierUserDTO) { + // 手机号验证码 + String phone = supplierUserDTO.getPhone(); + if (StrUtil.isNotBlank(phone)) { + ServerResponseEntity sendNotifyResponse = notifyFeignClient.checkValidCode(phone, supplierUserDTO.getValidCode(), SendTypeEnum.VALID); + Boolean data = sendNotifyResponse.getData(); + if (Objects.equals(sendNotifyResponse.getCode(), ResponseEnum.OK.value()) && Objects.nonNull(data) && !data) { + throw new LuckException("验证码有误或已过期"); + } + } + //邮箱验证码 + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierWithdrawCashController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierWithdrawCashController.java new file mode 100644 index 0000000..6f3e1af --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierWithdrawCashController.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.supplier; + + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.dto.AllinpaySupplierWithdrawCashDTO; +import com.tmerclub.cloud.supplier.dto.SupplierWithdrawCashConfigDto; +import com.tmerclub.cloud.supplier.dto.SupplierWithdrawCashDTO; +import com.tmerclub.cloud.supplier.service.SupplierWithdrawCashService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 提现申请信息 + * + * @author FrozenWatermelon + * @date 2021-06-10 10:28:13 + */ +@RestController("supplierSupplierWithdrawCashController") +@RequestMapping("/s/supplier_withdraw_cash") +@Tag(name = "supplier-提现申请信息") +public class SupplierWithdrawCashController { + + @Autowired + private SupplierWithdrawCashService supplierWithdrawCashService; + + @GetMapping("/getWithdrawCash") + public ServerResponseEntity getWithdrawCashConfig() { + return ServerResponseEntity.success(supplierWithdrawCashService.getConfig()); + } + + @PostMapping("/apply") + @Operation(summary = "供应商提交申请提现", description = "供应商提交申请提现") + public ServerResponseEntity apply(@RequestBody SupplierWithdrawCashDTO supplierWithdrawCashDTO) { + supplierWithdrawCashService.apply(supplierWithdrawCashDTO, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/allinpay_apply") + @Operation(summary = "供应商提交通联申请提现", description = "通联独有") + public ServerResponseEntity allinpayApply(@RequestBody AllinpaySupplierWithdrawCashDTO allinpaySupplierWithdrawCashDTO) { + if (Objects.isNull(allinpaySupplierWithdrawCashDTO.getAmount()) || Objects.isNull(allinpaySupplierWithdrawCashDTO.getBankCardNo())) { + throw new LuckException("提现金额和银行卡号不能为空"); + } + String bizOrderNo = supplierWithdrawCashService.allinpayApply(allinpaySupplierWithdrawCashDTO, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(bizOrderNo); + } + + @Operation(summary = "提现确认支付", description = "通联独有") + @PostMapping("/confirm_withdraw_pay") + public ServerResponseEntity confirmWithdrawPay(@RequestBody AllinpaySupplierWithdrawCashDTO allinpaySupplierWithdrawCashDTO) { + if (Objects.isNull(allinpaySupplierWithdrawCashDTO.getBizOrderNo()) || Objects.isNull(allinpaySupplierWithdrawCashDTO.getVerificationCode())) { + throw new LuckException("短信验证码和订单号不能为空"); + } + supplierWithdrawCashService.confirmWithdrawPay(allinpaySupplierWithdrawCashDTO, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @GetMapping("/check_draw_cash_amount") + @Operation(summary = "检查提现金额") + public ServerResponseEntity checkDrawCashAmount(Long amount) { + supplierWithdrawCashService.checkDrawCashAmount(amount); + return ServerResponseEntity.success(true); + } + + @Operation(summary = "重新发送提现支付验证码", description = "通联独有") + @PostMapping("/resend_pay_sms") + public ServerResponseEntity resendPaySms(@RequestBody AllinpaySupplierWithdrawCashDTO allinpaySupplierWithdrawCashDTO) { + if (Objects.isNull(allinpaySupplierWithdrawCashDTO.getBizOrderNo())) { + throw new LuckException("提现订单号不能为空"); + } + supplierWithdrawCashService.resendPaySms(allinpaySupplierWithdrawCashDTO.getBizOrderNo(), AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/AllinpaySupplierWithdrawCashDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/AllinpaySupplierWithdrawCashDTO.java new file mode 100644 index 0000000..e6e643e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/AllinpaySupplierWithdrawCashDTO.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 通联商家提现申请 + * @author TRACK + */ +public class AllinpaySupplierWithdrawCashDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "绑定银行卡号") + private String bankCardNo; + + @Schema(description = "提现金额") + private Long amount; + + @Schema(description = "提现订单号") + private String bizOrderNo; + + @Schema(description = "短信验证码") + private String verificationCode; + + public String getBankCardNo() { + return bankCardNo; + } + + public void setBankCardNo(String bankCardNo) { + this.bankCardNo = bankCardNo; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + @Override + public String toString() { + return "AllinpayShopWithdrawCashDTO{" + + "bankCardNo='" + bankCardNo + '\'' + + ", amount=" + amount + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", verificationCode='" + verificationCode + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/AuditingSupplierInfoDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/AuditingSupplierInfoDTO.java new file mode 100644 index 0000000..a485193 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/AuditingSupplierInfoDTO.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 供应商审核参数 + * + * @author LHD + * @date 2021-03-14 09:10:00 + */ +@Schema(description = "供应商审核列表参数") +public class AuditingSupplierInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "审核id)") + private Long supplierAuditingId; + + @Schema(description = "审核状态(0 未审核 1已通过 -1未通过)") + private Integer status; + + @Schema(description = "供应商名字") + private String supplierName; + + @Schema(description = "用户名字") + private String userName; + + @Schema(description = "供应商简介") + private String intro; + + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date beginTime; + + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "供应商状态 (-1:已删除 0: 停业中 1:营业中 2:平台下线 3:开店申请待审核 4:供应商申请中 5:上线申请待审核)") + private Integer supplierStatus; + + public Long getSupplierAuditingId() { + return supplierAuditingId; + } + + public void setSupplierAuditingId(Long supplierAuditingId) { + this.supplierAuditingId = supplierAuditingId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public Date getBeginTime() { + return beginTime; + } + + public void setBeginTime(Date beginTime) { + this.beginTime = beginTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getSupplierStatus() { + return supplierStatus; + } + + public void setSupplierStatus(Integer supplierStatus) { + this.supplierStatus = supplierStatus; + } + + @Override + public String toString() { + return "AuditingSupplierInfoDTO{" + + "supplierAuditingId=" + supplierAuditingId + + ", status=" + status + + ", supplierName='" + supplierName + '\'' + + ", userName='" + userName + '\'' + + ", intro='" + intro + '\'' + + ", beginTime=" + beginTime + + ", endTime=" + endTime + + ", supplierStatus=" + supplierStatus + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierBankCardDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierBankCardDTO.java new file mode 100644 index 0000000..ce0abfc --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierBankCardDTO.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 银行卡信息DTO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierBankCardDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "银行卡自增id") + private Long supplierBankCardId; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "银行名称") + private String bankName; + + @Schema(description = "银行开户行") + private String openingBank; + + @Schema(description = "收款方户名") + private String recipientName; + + @Schema(description = "收款方账户") + private String cardNo; + + @Schema(description = "是否默认 1:默认 0:非默认") + private Integer isDefault; + + @Schema(description = "支行名称") + private String branchName; + + @Schema(description = "1.正常,-1.已删除") + private Integer status; + + @Schema(description = "银行卡号") + private String bankCardNo; + + @Schema(description = "银行卡/账户属性 0个人银行卡 1企业对公账户") + private Integer bankCardPro; + + @Schema(description = "支付行号") + private String unionBank; + + public Long getSupplierBankCardId() { + return supplierBankCardId; + } + + public void setSupplierBankCardId(Long supplierBankCardId) { + this.supplierBankCardId = supplierBankCardId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getOpeningBank() { + return openingBank; + } + + public void setOpeningBank(String openingBank) { + this.openingBank = openingBank; + } + + public String getRecipientName() { + return recipientName; + } + + public void setRecipientName(String recipientName) { + this.recipientName = recipientName; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getBranchName() { + return branchName; + } + + public void setBranchName(String branchName) { + this.branchName = branchName; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getBankCardNo() { + return bankCardNo; + } + + public void setBankCardNo(String bankCardNo) { + this.bankCardNo = bankCardNo; + } + + public Integer getBankCardPro() { + return bankCardPro; + } + + public void setBankCardPro(Integer bankCardPro) { + this.bankCardPro = bankCardPro; + } + + public String getUnionBank() { + return unionBank; + } + + public void setUnionBank(String unionBank) { + this.unionBank = unionBank; + } + + @Override + public String toString() { + return "SupplierBankCardDTO{" + + "supplierBankCardId=" + supplierBankCardId + + ", supplierId=" + supplierId + + ", bankName='" + bankName + '\'' + + ", openingBank='" + openingBank + '\'' + + ", recipientName='" + recipientName + '\'' + + ", cardNo='" + cardNo + '\'' + + ", isDefault=" + isDefault + + ", branchName='" + branchName + '\'' + + ", status=" + status + + ", bankCardNo='" + bankCardNo + '\'' + + ", bankCardPro=" + bankCardPro + + ", unionBank='" + unionBank + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierCreateInfoDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierCreateInfoDTO.java new file mode 100644 index 0000000..f139162 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierCreateInfoDTO.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import com.tmerclub.cloud.api.product.dto.BrandShopDTO; +import com.tmerclub.cloud.api.product.dto.CategoryShopDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author lth + * @Date 2021/7/9 15:23 + */ +public class SupplierCreateInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商家注册信息") + private SupplierUserRegisterDTO supplierUserRegisterInfo; + + @Schema(description = "供应商基本信息") + private SupplierDetailDTO supplierDetail; + + @Schema(description = "供应商工商信息") + private SupplierCompanyDTO supplierCompany; + + @Schema(description = "签约分类列表") + private List categorySigningList; + + @Schema(description = "签约品牌列表") + private List brandSigningList; + + @Schema(description = "供应商银行卡列表") + private List supplierBankCardList; + + @Schema(description = "通联供应商银行卡") + private AllinpaySupplierBankCardDTO allinpaySupplierBankCardDTO; + + public SupplierUserRegisterDTO getSupplierUserRegisterInfo() { + return supplierUserRegisterInfo; + } + + public void setSupplierUserRegisterInfo(SupplierUserRegisterDTO supplierUserRegisterInfo) { + this.supplierUserRegisterInfo = supplierUserRegisterInfo; + } + + public SupplierDetailDTO getSupplierDetail() { + return supplierDetail; + } + + public void setSupplierDetail(SupplierDetailDTO supplierDetail) { + this.supplierDetail = supplierDetail; + } + + public SupplierCompanyDTO getSupplierCompany() { + return supplierCompany; + } + + public void setSupplierCompany(SupplierCompanyDTO supplierCompany) { + this.supplierCompany = supplierCompany; + } + + public List getCategorySigningList() { + return categorySigningList; + } + + public void setCategorySigningList(List categorySigningList) { + this.categorySigningList = categorySigningList; + } + + public List getBrandSigningList() { + return brandSigningList; + } + + public void setBrandSigningList(List brandSigningList) { + this.brandSigningList = brandSigningList; + } + + public List getSupplierBankCardList() { + return supplierBankCardList; + } + + public void setSupplierBankCardList(List supplierBankCardList) { + this.supplierBankCardList = supplierBankCardList; + } + + public AllinpaySupplierBankCardDTO getAllinpaySupplierBankCardDTO() { + return allinpaySupplierBankCardDTO; + } + + public void setAllinpaySupplierBankCardDTO(AllinpaySupplierBankCardDTO allinpaySupplierBankCardDTO) { + this.allinpaySupplierBankCardDTO = allinpaySupplierBankCardDTO; + } + + @Override + public String toString() { + return "SupplierCreateInfoDTO{" + + "supplierUserRegisterInfo=" + supplierUserRegisterInfo + + ", supplierDetail=" + supplierDetail + + ", supplierCompany=" + supplierCompany + + ", categorySigningList=" + categorySigningList + + ", brandSigningList=" + brandSigningList + + ", supplierBankCardList=" + supplierBankCardList + + ", allinpaySupplierBankCardDTO=" + allinpaySupplierBankCardDTO + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierExtensionDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierExtensionDTO.java new file mode 100644 index 0000000..ce15fa5 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierExtensionDTO.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 供应商扩张信息DTO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierExtensionDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long supplierExtensionId; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "供应商商品总销量") + private Integer saleNum; + + public Long getSupplierExtensionId() { + return supplierExtensionId; + } + + public void setSupplierExtensionId(Long supplierExtensionId) { + this.supplierExtensionId = supplierExtensionId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + @Override + public String toString() { + return "SupplierExtensionDTO{" + + "supplierExtensionId=" + supplierExtensionId + + ",supplierId=" + supplierId + + ",saleNum=" + saleNum + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierUserDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierUserDTO.java new file mode 100644 index 0000000..9058664 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierUserDTO.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 供应商用户DTO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierUserDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商用户id") + private Long supplierUserId; + + @Schema(description = "供应商id") + private Long supplierId; + + @NotBlank(message = "昵称不能为空") + @Schema(description = "昵称") + private String nickName; + + @Schema(description = "员工编号") + private String code; + + @Schema(description = "联系方式") + private String phoneNum; + + @Schema(description = "角色id列表") + private List roleIds; + + @NotBlank(message = "用户名不能为空") + @Schema(description = "用户名") + private String username; + + @Schema(description = "密码") + private String password; + + @NotNull(message = "状态不能为空") + @Schema(description = "状态 1启用 0禁用") + private Integer status; + + @Schema(description = "邮箱") + private String email; + + @NotBlank(message = "手机号不能为空") + @Schema(description = "手机号") + private String phone; + + @Schema(description = "验证码") + private String validCode; + + public Long getSupplierUserId() { + return supplierUserId; + } + + public void setSupplierUserId(Long supplierUserId) { + this.supplierUserId = supplierUserId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPhoneNum() { + return phoneNum; + } + + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } + + public List getRoleIds() { + return roleIds; + } + + public void setRoleIds(List roleIds) { + this.roleIds = roleIds; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getValidCode() { + return validCode; + } + + public void setValidCode(String validCode) { + this.validCode = validCode; + } + + @Override + public String toString() { + return "SupplierUserDTO{" + + "supplierUserId=" + supplierUserId + + ", supplierId=" + supplierId + + ", nickName='" + nickName + '\'' + + ", code='" + code + '\'' + + ", phoneNum='" + phoneNum + '\'' + + ", roleIds=" + roleIds + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", status=" + status + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + ", validCode='" + validCode + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWalletDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWalletDTO.java new file mode 100644 index 0000000..b505060 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWalletDTO.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 供应商钱包信息DTO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierWalletDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商钱包id") + private Long supplierWalletId; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "未结算金额(用户支付)") + private Long unsettledAmount; + + @Schema(description = "已结算金额(用户确认收货后,可以提现)") + private Long settledAmount; + + @Schema(description = "冻结金额(用户确认收货)") + private Long freezeAmount; + + @Schema(description = "累积结算金额") + private Long totalSettledAmount; + + @Schema(description = "乐观锁") + private Long version; + + public Long getSupplierWalletId() { + return supplierWalletId; + } + + public void setSupplierWalletId(Long supplierWalletId) { + this.supplierWalletId = supplierWalletId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getFreezeAmount() { + return freezeAmount; + } + + public void setFreezeAmount(Long freezeAmount) { + this.freezeAmount = freezeAmount; + } + + public Long getTotalSettledAmount() { + return totalSettledAmount; + } + + public void setTotalSettledAmount(Long totalSettledAmount) { + this.totalSettledAmount = totalSettledAmount; + } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } + + @Override + public String toString() { + return "SupplierWalletDTO{" + + "supplierWalletId=" + supplierWalletId + + ", supplierId=" + supplierId + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", freezeAmount=" + freezeAmount + + ", totalSettledAmount=" + totalSettledAmount + + ", version=" + version + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWalletLogDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWalletLogDTO.java new file mode 100644 index 0000000..d0ef45d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWalletLogDTO.java @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 供应商钱包记录DTO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierWalletLogDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商钱包id") + private Long walletLogId; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "关联订单id") + private Long orderId; + + @Schema(description = "关联订单项id") + private Long orderItemId; + + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "收支类型 0支出 1收入") + private Integer ioType; + + @Schema(description = "金额类型 0 未结算金额 1可提现金额 2冻结金额") + private Integer amountType; + + @Schema(description = "改变金额") + private Long changeAmount; + + @Schema(description = "原因 0用户支付 1用户确认收货 2 用户退款申请 3 拒绝用户退款申请 4 提现申请 5 提现申请被拒绝") + private Integer reason; + + @Schema(description = "用户金额(支付实付金额,退款实际申请金额)") + private Long userAmount; + + @Schema(description = "平台补贴金额") + private Long platformAmount; + + @Schema(description = "分销占用金额") + private Long distributionAmount; + + @Schema(description = "平台佣金") + private Long platformCommission; + + @Schema(description = "供应商优惠金额") + private Long supplierReduceAmount; + + @Schema(description = "商品总金额") + private Long totalAmount; + + public Long getWalletLogId() { + return walletLogId; + } + + public void setWalletLogId(Long walletLogId) { + this.walletLogId = walletLogId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public Integer getAmountType() { + return amountType; + } + + public void setAmountType(Integer amountType) { + this.amountType = amountType; + } + + public Long getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(Long changeAmount) { + this.changeAmount = changeAmount; + } + + public Integer getReason() { + return reason; + } + + public void setReason(Integer reason) { + this.reason = reason; + } + + public Long getUserAmount() { + return userAmount; + } + + public void setUserAmount(Long userAmount) { + this.userAmount = userAmount; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getSupplierReduceAmount() { + return supplierReduceAmount; + } + + public void setSupplierReduceAmount(Long supplierReduceAmount) { + this.supplierReduceAmount = supplierReduceAmount; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + @Override + public String toString() { + return "SupplierWalletLogDTO{" + + "walletLogId=" + walletLogId + + ",supplierId=" + supplierId + + ",orderId=" + orderId + + ",orderItemId=" + orderItemId + + ",refundId=" + refundId + + ",ioType=" + ioType + + ",amountType=" + amountType + + ",changeAmount=" + changeAmount + + ",reason=" + reason + + ",userAmount=" + userAmount + + ",platformAmount=" + platformAmount + + ",distributionAmount=" + distributionAmount + + ",platformCommission=" + platformCommission + + ",supplierReduceAmount=" + supplierReduceAmount + + ",totalAmount=" + totalAmount + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierDetailFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierDetailFeignController.java new file mode 100644 index 0000000..bc185a7 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierDetailFeignController.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.feign; + +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.supplier.bo.SupplierDetailBO; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.supplier.dto.SupplierDetailDTO; +import com.tmerclub.cloud.supplier.mapper.SupplierDetailMapper; +import com.tmerclub.cloud.supplier.model.SupplierDetail; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierCompanyAuditingService; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.service.SupplierUserService; +import com.tmerclub.cloud.supplier.vo.SupplierDetailVO; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +@DubboService +public class SupplierDetailFeignController implements SupplierDetailFeignClient { + private static final Logger logger = LoggerFactory.getLogger(SupplierDetailFeignController.class); + + @Autowired + private SupplierDetailService supplierDetailService; + @Autowired + private SupplierUserService supplierUserService; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + @Autowired + private SupplierDetailMapper supplierDetailMapper; + @Autowired + private SupplierCompanyAuditingService companyAuditingService; + + @Override + public ServerResponseEntity getSupplierBySupplierId(Long supplierId) { + SupplierApiDetailVO supplierDetail = supplierDetailService.getBySupplierId(supplierId); + if (Objects.isNull(supplierDetail)) { + return ServerResponseEntity.success(new SupplierDetailBO()); + } + return ServerResponseEntity.success(BeanUtil.map(supplierDetail, SupplierDetailBO.class)); + } + + @Override + public ServerResponseEntity> listBySupplierIds(List supplierIds) { + List supplierDetail = supplierDetailService.listBySupplierIds(supplierIds); + return ServerResponseEntity.success(BeanUtil.mapAsList(supplierDetail, SupplierApiDetailVO.class)); + } + + @Override + public ServerResponseEntity> getSupplierDetailBySupplierName(String supplierShopName) { + return ServerResponseEntity.success(supplierDetailService.getSupplierDetailBySupplierIdAndSupplierName(null, supplierShopName)); + } + + @Override + public ServerResponseEntity> listSupplierDetailBySupplierIds(List supplierIds) { + return ServerResponseEntity.success(supplierDetailService.listSupplierDetailBySupplierIds(supplierIds)); + } + + @Override + public ServerResponseEntity> listSupplierIdByShopIdAndSupplierName(Long shopId, String supplierName) { + SupplierDetailDTO supplierDetailDTO = new SupplierDetailDTO(); + supplierDetailDTO.setSupplierName(supplierName); + supplierDetailDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + List supplierDetailVOList = supplierDetailService.listSupplierByShopId(supplierDetailDTO, shopId); + return ServerResponseEntity.success(supplierDetailVOList.stream().map(SupplierDetailVO::getSupplierId).collect(Collectors.toList())); + + } + + @Override + public void deleteAllinpayCache() { + supplierAllinpayService.deleteAllinpayCache(); + } + + @Override + public ServerResponseEntity updateAllinpayIdCardStatus(String bizUserId, Integer status) { + supplierDetailService.updateAllinpayIdCardStatus(bizUserId, status); + supplierDetailService.removeCacheBySupplierId(Long.valueOf(bizUserId.substring(AllinpayConstant.SUPPLIER_LENGTH))); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity updateAllinpayBindPhoneStatus(String bizUserId, Integer status) { + supplierDetailMapper.updateSupplierBindPhone(Long.valueOf(bizUserId.substring(AllinpayConstant.SUPPLIER_LENGTH)), status); + supplierDetailService.removeCacheBySupplierId(Long.valueOf(bizUserId.substring(AllinpayConstant.SUPPLIER_LENGTH))); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity updateCompanyInfoResult(String bizUserId, Integer status, Integer result, String failReason) { + companyAuditingService.updateCompanyInfoResult(bizUserId, status, result, failReason); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity updateAcctProtocolNoByType(Long supplierId, Integer signAcctType, String acctProtocolNo) { + supplierDetailMapper.updateAcctProtocolNoByType(supplierId, signAcctType, acctProtocolNo); + supplierDetailService.removeCacheBySupplierId(supplierId); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> listSupplierIds() { + return ServerResponseEntity.success(supplierDetailService.listSupplierIds()); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierRefundAddrFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierRefundAddrFeignController.java new file mode 100644 index 0000000..12e221c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierRefundAddrFeignController.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.feign; + +import com.tmerclub.cloud.api.supplier.feign.SupplierRefundAddrFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiRefundAddrVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.service.SupplierRefundAddrService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +@DubboService +public class SupplierRefundAddrFeignController implements SupplierRefundAddrFeignClient { + + @Autowired + private SupplierRefundAddrService supplierRefundAddrService; + + @Override + public ServerResponseEntity getSupplierRefundAddrByRefundAddrId(Long refundAddrId) { + Long supplierId = AuthUserContext.get().getTenantId(); + SupplierApiRefundAddrVO supplierRefundAddr = supplierRefundAddrService.getBySupplierRefundAddrId(refundAddrId, supplierId); + return ServerResponseEntity.success(supplierRefundAddr); + } + + @Override + public ServerResponseEntity> getBySupplierId(Long supplierId) { + List list = supplierRefundAddrService.listBySupplierId(supplierId); + return ServerResponseEntity.success(list); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierUserFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierUserFeignController.java new file mode 100644 index 0000000..0d56fc4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierUserFeignController.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.feign; + +import com.tmerclub.cloud.api.supplier.feign.SupplierUserFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiUserVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.supplier.service.SupplierUserService; +import com.tmerclub.cloud.supplier.vo.SupplierUserVO; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author chiley + * @date 2022/7/13 15:38 + */ +@DubboService +public class SupplierUserFeignController implements SupplierUserFeignClient { + + @Autowired + private SupplierUserService supplierUserService; + + @Override + public ServerResponseEntity countAccoutByMobile(String mobile) { + return ServerResponseEntity.success(supplierUserService.countAccoutByMobile(mobile)); + + } + + @Override + public ServerResponseEntity getByUserId(Long userId) { + SupplierApiUserVO supplierApiUserVO = BeanUtil.map(supplierUserService.getByUserId(userId), SupplierApiUserVO.class); + return ServerResponseEntity.success(supplierApiUserVO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierWalletFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierWalletFeignController.java new file mode 100644 index 0000000..b4a725e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierWalletFeignController.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.feign; + +import com.tmerclub.cloud.api.payment.vo.SplitRuleVO; +import com.tmerclub.cloud.api.supplier.feign.SupplierWalletFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.supplier.service.SupplierWalletService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +@DubboService +public class SupplierWalletFeignController implements SupplierWalletFeignClient { + + @Autowired + private SupplierWalletService supplierWalletService; + + + @Override + public ServerResponseEntity calculationSupplierIncome(Long orderId) { + SplitRuleVO splitRuleVO = supplierWalletService.getSupplierSettledInfoByOrderId(orderId); + return ServerResponseEntity.success(splitRuleVO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierWalletLogOperationFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierWalletLogOperationFeignController.java new file mode 100644 index 0000000..61c5963 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierWalletLogOperationFeignController.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.feign; + + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.supplier.feign.SupplierWalletLogOperationFeignClient; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.supplier.constant.SupplierWalletChangeReason; +import com.tmerclub.cloud.supplier.mapper.SupplierWalletMapper; +import com.tmerclub.cloud.supplier.mongo.MongoSupplierWalletLogBO; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; + +import java.util.List; +import java.util.stream.Collectors; + + +/** + * @author chiley + * @date 2022/6/30 16:55 + */ +@DubboService +public class SupplierWalletLogOperationFeignController implements SupplierWalletLogOperationFeignClient { + + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private SupplierWalletMapper supplierWalletMapper; + + + @Override + public void deleteSupplierLog(String orderStr) { + List orderBOList = JSON.parseArray(orderStr, EsOrderBO.class); + List orderIds = orderBOList.stream().map(EsOrderBO::getOrderId).collect(Collectors.toList()); + Criteria criteria = Criteria.where("orderId").in(orderIds).and("reason").is(SupplierWalletChangeReason.PAY.value()); + List mongoSupplierWalletLogBOList = mongoTemplate.find(new Query(criteria), MongoSupplierWalletLogBO.class); + if (CollUtil.isNotEmpty(mongoSupplierWalletLogBOList)) { + // 删除记录 + mongoTemplate.remove(new Query(criteria), MongoSupplierWalletLogBO.class); + // 退还未结算金额-插入记录的时候增加了未结算金额,这里删除时要减去 + for (MongoSupplierWalletLogBO mongoSupplierWalletLogBO : mongoSupplierWalletLogBOList) { + supplierWalletMapper.subUnsettledAmount(mongoSupplierWalletLogBO.getSupplierId(), mongoSupplierWalletLogBO.getChangeAmount(), mongoSupplierWalletLogBO.getPaySysType()); + } + } + } + + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierWithdrawCashFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierWithdrawCashFeignController.java new file mode 100644 index 0000000..d114aa9 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierWithdrawCashFeignController.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.feign; + +import com.tmerclub.cloud.api.supplier.feign.SupplierWithdrawCashFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.supplier.service.SupplierWithdrawCashService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author track + */ +@DubboService +public class SupplierWithdrawCashFeignController implements SupplierWithdrawCashFeignClient { + + @Autowired + private SupplierWithdrawCashService supplierWithdrawCashService; + + @Override + public ServerResponseEntity withdrawBack(String bizOrderNo, String payStatus, String bizUserId, String payFailMessage) { + supplierWithdrawCashService.withdrawBack(bizOrderNo, payStatus, bizUserId, payFailMessage); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OrderNotifySupplierConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OrderNotifySupplierConsumer.java new file mode 100644 index 0000000..e6ea097 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OrderNotifySupplierConsumer.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.vo.OrderSimpleAmountInfoBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.supplier.service.SupplierWalletService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SHOP_WALLET_NOTIFY_SERVICE_TOPIC, consumerGroup = RocketMqConstant.ORDER_NOTIFY_SUPPLIER_GROUP) +public class OrderNotifySupplierConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(OrderNotifySupplierConsumer.class); + + @Autowired + private SupplierWalletService supplierWalletService; + + /** + * 供应商分账 + */ + @Override + public void onMessage(PayNotifyBO message) { + List orderSupplierAmountInfos = message.getOrderSimpleAmountInfos(); + if (Objects.isNull(orderSupplierAmountInfos) || CollUtil.isEmpty(orderSupplierAmountInfos)) { + return; + } + LOG.info("订单支付成功,供应商分账... message: {}", Json.toJsonString(message)); + supplierWalletService.addAmountByOrder(orderSupplierAmountInfos); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OrderRefundSettlementSupplierConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OrderRefundSettlementSupplierConsumer.java new file mode 100644 index 0000000..902c3a2 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OrderRefundSettlementSupplierConsumer.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.listener; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.supplier.service.SupplierWalletService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author lhd + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_REFUND_SUCCESS_SETTLEMENT_SUPPLIER_TOPIC, consumerGroup = RocketMqConstant.ORDER_REFUND_SUCCESS_SETTLEMENT_SUPPLIER_TOPIC) +public class OrderRefundSettlementSupplierConsumer implements RocketMQListener { + + @Autowired + private SupplierWalletService supplierWalletService; + + /** + * 订单部分退款导致订单关闭 商家结算操作 + */ + @Override + public void onMessage(OrderChangeShopWalletAmountBO orderChangeSupplierWalletAmountBO) { + supplierWalletService.settlementSupplierAmountByRefund(orderChangeSupplierWalletAmountBO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OrderRefundSupplierConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OrderRefundSupplierConsumer.java new file mode 100644 index 0000000..9c683ea --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OrderRefundSupplierConsumer.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.listener; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.supplier.service.SupplierWalletService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author lhd + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.REFUND_SHOP_NOTIFY_SERVICE_TOPIC, consumerGroup = RocketMqConstant.REFUND_SHOP_NOTIFY_SUPPLIER_GROUP) +public class OrderRefundSupplierConsumer implements RocketMQListener { + + private static final Logger logger = LoggerFactory.getLogger(OrderRefundSupplierConsumer.class); + + @Autowired + private SupplierWalletService supplierWalletService; + + /** + * 订单退款 供应商减少余额 + */ + @Override + public void onMessage(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + // 如果退款是商家自行处理,或者是平台介入但不是平台处理方式为商家供应商承担一起处理的情况下,供应商都不需要退款减少金额 + boolean checkPlatformRefundType = Objects.isNull(orderChangeShopWalletAmountBO.getInterventionRefundType()) || !Objects.equals(orderChangeShopWalletAmountBO.getInterventionRefundType(),2); + boolean supplierRefundCheck = Objects.isNull(orderChangeShopWalletAmountBO.getSupplierHandleStatus()) || Objects.equals(orderChangeShopWalletAmountBO.getSupplierHandleStatus(), -1); + if (checkPlatformRefundType && supplierRefundCheck) { + return; + } + logger.info("订单退款,供应商减少余额... message: {}", Json.toJsonString(orderChangeShopWalletAmountBO)); + supplierWalletService.refundSupplierAmountByRefund(orderChangeShopWalletAmountBO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierCompanyMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierCompanyMapper.java new file mode 100644 index 0000000..3f90469 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierCompanyMapper.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.mapper; + +import com.tmerclub.cloud.supplier.model.SupplierCompany; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 供应商工商信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierCompanyMapper { + /** + * 根据供应商id获取供应商工商信息 + * @param supplierId + * @param status + * @return + */ + SupplierCompanyVO getSupplierCompanyBySupplierIdAndStatus(@Param("supplierId") Long supplierId, @Param("status") Integer status); + + /** + * 根据供应商工商信息id获取供应商工商信息 + * + * @param supplierCompanyId 供应商工商信息id + * @return 供应商工商信息 + */ + SupplierCompany getBySupplierCompanyId(@Param("supplierCompanyId") Long supplierCompanyId); + + /** + * 保存供应商工商信息 + * @param supplierCompany 供应商工商信息 + */ + void save(@Param("supplierCompany") SupplierCompany supplierCompany); + + /** + * 更新供应商工商信息 + * @param supplierCompany 供应商工商信息 + */ + void update(@Param("supplierCompany") SupplierCompany supplierCompany); + + /** + * 根据供应商id更新供应商工商信息 + * @param supplierCompany + * @param supplierId + * @param temp 0代表通过审核,1代表平台修改 + */ + void updateBySupplierId(@Param("supplierCompany") SupplierCompany supplierCompany, @Param("supplierId") Long supplierId, @Param("temp") Integer temp); + + /** + * 根据信用编码查询对应的供应商Id + * @param creditCode + * @return + */ + List getSupplierIdByCreditCode(@Param("creditCode") String creditCode); + + /** + * 根据供应商id更改供应商工商信息状态 + * @param supplierId + * @param status + * @param dbStatus + */ + void batchUpdateStatus(@Param("supplierId") Long supplierId, @Param("status") Integer status, @Param("dbStatus") Integer dbStatus); + + /** + * 根据供应商id和审核状态删除供应商工商信息 + * @param supplierId + * @param status 审核状态 + * @return + */ + void deleteBySupplierIdAndStatus(@Param("supplierId") Long supplierId, @Param("status") Integer status); + + /** + * 查询供应商最近创建的工商信息 审核状态 + * @param supplierId + * @return + */ + Integer getLatestRecord(@Param("supplierId") Long supplierId); + + /** + * 根据供应商id更新供应商工商信息 + * @param supplierCompany 供应商工商信息 + */ + void updateById(@Param("supplierCompany") SupplierCompany supplierCompany); + + /** + * 更新影印件状态 + * @param supplierCompany + */ + void updateIdCardById(@Param("supplierCompany") SupplierCompanyVO supplierCompany); + + /** + * 更新正常的供应商工商信息为待审核 + */ + void updateStatusToWaitAudit(); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierDetailMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierDetailMapper.java new file mode 100644 index 0000000..b6071f2 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierDetailMapper.java @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.mapper; + +import com.tmerclub.cloud.api.supplier.bo.SupplierDetailBO; +import com.tmerclub.cloud.api.supplier.bo.SupplierSimpleBO; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.supplier.dto.SupplierDetailDTO; +import com.tmerclub.cloud.supplier.model.SupplierDetail; +import com.tmerclub.cloud.supplier.vo.SupplierDetailAppVO; +import com.tmerclub.cloud.supplier.vo.SupplierDetailVO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 供应商详情 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierDetailMapper { + + /** + * 获取供应商详情列表 + * + * @param supplierDetailDTO 供应商搜索数据 + * @return 供应商详情列表 + */ + List list(@Param("supplierDetail") SupplierDetailDTO supplierDetailDTO); + + /** + * 根据供应商详情id获取供应商详情 + * + * @param supplierId 供应商详情id + * @return 供应商详情 + */ + SupplierApiDetailVO getBySupplierId(@Param("supplierId") Long supplierId); + + /** + * 保存供应商详情 + * + * @param supplierDetail 供应商详情 + */ + void save(@Param("supplierDetail") SupplierDetail supplierDetail); + + /** + * 更新供应商详情 + * + * @param supplierDetail 供应商详情 + */ + void update(@Param("supplierDetail") SupplierDetail supplierDetail); + + /** + * 根据供应商详情id删除供应商详情 + * + * @param supplierId + */ + void deleteById(@Param("supplierId") Long supplierId); + + /** + * 根据供应商id列表,获取供应商信息 + * + * @param supplierIds 供应商id列表 + * @return 供应商列表 + */ + List listBySupplierIds(@Param("supplierIds") List supplierIds); + + /** + * 根据供应商id获取供应商详情 + * + * @param supplierId 供应商详情id + * @return 供应商详情 + */ + SupplierApiDetailVO getSupplierBySupplierId(Long supplierId); + + /** + * 供应商搜索列表 + * + * @param supplierDetailDTO + * @return + */ + List supplierSearchList(@Param("supplierDetail") SupplierDetailDTO supplierDetailDTO); + + /** + * 统计该供应商名被其他用户使用的数量 + * + * @param supplierName + * @param supplierId + * @return + */ + int countSupplierName(@Param("supplierName") String supplierName, @Param("supplierId") Long supplierId); + + /** + * 改变供应商状态 + * + * @param supplierId + * @param supplierStatus + */ + void changeSupplierStatus(@Param("supplierId") Long supplierId, @Param("supplierStatus") Integer supplierStatus); + + /** + * 获取供应商信息及扩展信息 + * + * @param supplierId + * @return + */ + SupplierDetailBO supplierExtensionData(@Param("supplierId") Long supplierId); + + /** + * 获取供应商信息及扩展信息 + * + * @param supplierIds 供应商ids + * @param supplierName 供应商名称 + * @return 供应商信息列表 + */ + List getSupplierDetailBySupplierIdAndSupplierName(@Param("supplierIds") List supplierIds, @Param("supplierName") String supplierName); + + /** + * 根据供应商id获取供应商扩展信息 + * + * @param supplierId 供应商id + * @return 供应商扩展信息 + */ + SupplierApiDetailVO getShoExtensionsBySupplierId(Long supplierId); + + /** + * 根据手机号获取存在供应商的数量 + * + * @param mobile 手机号 + * @return 数量 + */ + Integer countByMobile(String mobile); + + /** + * 根据供应商状态查询供应商数量 + * + * @param supplierStatus + * @return + */ + Long countBySupplierStatus(@Param("supplierStatus") Long supplierStatus); + + /** + * 根据签约时间修改供应商状态 + * + * @param now + */ + void changeSupplierStatusByContractTime(@Param("now") Date now); + + /** + * 根据当前时间获取状态需要改变为停业状态的供应商id列表 + * + * @param now + * @return + */ + List listSupplierIdsOfStatusChangeToStopByContractTime(@Param("now") Date now); + + /** + * 根据当前时间获取状态需要改变为营业状态的供应商id列表 + * + * @param now + * @return + */ + List listSupplierIdsOfStatusChangeToOpenByContractTime(@Param("now") Date now); + + + /** + * 根据参数获取供应商id列表 + * + * @param supplierSimpleBO + * @return + */ + List listSimple(@Param("supplierSimpleBO") SupplierSimpleBO supplierSimpleBO); + + /** + * 根据供应商状态获取供应商id列表 + * + * @param supplierStatus + * @return + */ + List getSupplierIdsBySupplierStatus(@Param("supplierStatus") Integer supplierStatus); + + /** + * 供应商列表 + * + * @param supplierDetailDTO + * @param supplierIds + * @return 供应商列表 + */ + List listSupplierDetail(@Param("supplier") SupplierDetailDTO supplierDetailDTO, @Param("supplierIds") List supplierIds); + + /** + * 获取指定供应商信息 + * + * @param supplierIds + * @return + */ + List listSupplierDetailBySupplierIds(@Param("supplierIds") List supplierIds); + + /** + * 获取还没创建会员的供应商id列表 + * @return + */ + List listUnCreateMemberSupplierIds(); + + /** + * 更新供应商为停业状态,并且更新为已经创建会员 + * @param supplierIds + */ + void updateSupplierToStop(@Param("supplierIds") List supplierIds); + + /** + * 更新供应商为开店申请中,并且更新为已经创建会员 + * @param supplierIds + */ + void updateSupplierToApplying(@Param("supplierIds") List supplierIds); + + /** + * 更新供应商已经创建会员 + * @param supplierIds + */ + void updateSupplierIsCreate(@Param("supplierIds") List supplierIds); + + /** + * 更新通联供应商状态 + * @param supplierId + * @param status + */ + void updateAllinpaySupplierStatus(@Param("supplierId") Long supplierId, @Param("status") Integer status); + + /** + * 更新供应商为通联审核成功 + * @param supplierId + */ + void updateSupplierAuditSuccess(@Param("supplierId") Long supplierId); + + /** + * 更新供应商为通联审核失败 + * @param supplierId + */ + void updateSupplierAuditFail(@Param("supplierId") Long supplierId); + + /** + * 更新供应商影印件采集状态 + * @param supplierId + * @param status + */ + void updateAllinpayIdCardStatus(@Param("supplierId") Long supplierId, @Param("status") Integer status); + + /** + * 更新供应商为通联开业 + * @param supplierId + */ + void updateSupplierToOpen(@Param("supplierId") Long supplierId); + + /** + * 更新供应商为通联上线待审核 + * @param supplierId + */ + void updateSupplierToWaitAudit(@Param("supplierId") Long supplierId); + + /** + * 更新供应商绑定通联手机号码状态 + * @param supplierId + * @param status 0否1是 + */ + void updateSupplierBindPhone(@Param("supplierId") Long supplierId, @Param("status") Integer status); + + /** + * 保存编号 + * @param supplierId + * @param signAcctType + * @param acctProtocolNo + */ + void updateAcctProtocolNoByType(@Param("supplierId") Long supplierId, @Param("type") Integer signAcctType, @Param("acctProtocolNo") String acctProtocolNo); + + /** + * 获取未删除的供应商id + * @return + */ + List listSupplierIds(); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierUserMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierUserMapper.java new file mode 100644 index 0000000..0cd8dec --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierUserMapper.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.mapper; + +import com.tmerclub.cloud.supplier.dto.SupplierUserDTO; +import com.tmerclub.cloud.supplier.model.SupplierUser; +import com.tmerclub.cloud.supplier.vo.SupplierUserVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 供应商用户 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierUserMapper { + + /** + * 获取供应商用户列表 + * + * @param supplierUserDTO 搜索参数 + * @return 供应商用户列表 + */ + List listBySupplierId(@Param("supplierUser") SupplierUserDTO supplierUserDTO); + + /** + * 根据用户id获取商家用户信息 + * + * @param userId 用户id + * @return 商家用户信息 + */ + SupplierUserVO getByUserId(@Param("userId") Long userId); + + /** + * 保存商家用户信息 + * + * @param supplierUser + */ + void save(@Param("supplierUser") SupplierUser supplierUser); + + /** + * 更新供应商用户信息 + * + * @param supplierUser + */ + void update(@Param("supplierUser") SupplierUser supplierUser); + + /** + * 根据供应商用户id删除供应商用户 + * + * @param supplierUserId + */ + void deleteById(@Param("supplierUserId") Long supplierUserId); + + /** + * 获取店主账号的用户id-第一个创建的账号(仅用于审核供应商) + * + * @param supplierId + * @return + */ + Long getUserIdBySupplierId(@Param("supplierId") Long supplierId); + + /** + * 根据用户id更新供应商id + * @param supplierId + * @param supplierUserId + * @return + */ + int updateSupplierIdBySupplierUserId(@Param("supplierId") Long supplierId, @Param("supplierUserId") Long supplierUserId); + + /** + * 根据手机号码查用户数量 + * @param mobile 手机号码 + * @return 数量 + */ + int countAccoutByMobile(@Param("mobile") String mobile); + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierDetail.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierDetail.java new file mode 100644 index 0000000..de02e2e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierDetail.java @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.model; + +import com.tmerclub.cloud.common.constant.CompanyInfoProcessStatus; +import com.tmerclub.cloud.common.constant.IdCardCollectProcessStatus; +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 供应商详情 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierDetail extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 供应商ID + */ + private Long supplierId; + + /** + * 供应商名称 + */ + private String supplierName; + + /** + * 供应商简介 + */ + private String intro; + + /** + * 接收短信号码 + */ + private String noticeMobile; + + /** + * 供应商logo(可修改) + */ + private String supplierLogo; + + /** + * 供应商移动端背景图 + */ + private String mobileBackgroundPic; + + /** + * 供应商pc背景图 + */ + private String pcBackgroundPic; + + /** + * 供应商状态(-1:已删除 0: 停业中 1:营业中 2:平台下线 3:开店待审核 4:开店申请中 5:上线待审核) + */ + private Integer supplierStatus; + + /** + * 供应商类型1自营店 2普通店 + */ + private Integer type; + + /** + * 是否优选好店 1.是 0.不是 + */ + private Integer isPreferred; + + /** + * 供应商供应商名称 + */ + private String supplierShopName; + + /** + * 联系人 + */ + private String contactName; + + /** + * 联系方式 + */ + private String contactPhone; + + /** + * 签约起始时间 + */ + private Date contractStartTime; + + /** + * 签约终止时间 + */ + private Date contractEndTime; + /** + * 是否在通联创建了企业会员 0否1是 + */ + private Integer isCreateMember; + + /** + * 是否在通联绑定了手机号 0否1是 + */ + private Integer isBindPhone; + + /** + * 企业信息审核状态 0.未提交 1.待审核 2.审核成功 3.审核失败 + * @see CompanyInfoProcessStatus + */ + private Integer companyInfoProcessStatus; + + /** + * 影印件采集审核状态 0.未上传 1.待审核 2.只有工商认证通过 3.只有法人信息通过 4.均审核通过 + * @see IdCardCollectProcessStatus + */ + private Integer idCardCollectProcessStatus; + + /** + * 通联供应商状态 0未开通 1营业中 2平台下线 3上线待审核 4开店待审核 + * @see com.tmerclub.cloud.common.constant.AllinpayShopStatus + */ + private Integer allinpaySupplierStatus; + + /** + * 企业账户提现协议编号 + */ + private String companyAcctProtocolNo; + + /** + * 法人账户提现协议编号 + */ + private String legalAcctProtocolNo; + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public String getNoticeMobile() { + return noticeMobile; + } + + public void setNoticeMobile(String noticeMobile) { + this.noticeMobile = noticeMobile; + } + + public String getSupplierLogo() { + return supplierLogo; + } + + public void setSupplierLogo(String supplierLogo) { + this.supplierLogo = supplierLogo; + } + + public String getMobileBackgroundPic() { + return mobileBackgroundPic; + } + + public void setMobileBackgroundPic(String mobileBackgroundPic) { + this.mobileBackgroundPic = mobileBackgroundPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + public Integer getSupplierStatus() { + return supplierStatus; + } + + public void setSupplierStatus(Integer supplierStatus) { + this.supplierStatus = supplierStatus; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getIsPreferred() { + return isPreferred; + } + + public void setIsPreferred(Integer isPreferred) { + this.isPreferred = isPreferred; + } + + public String getSupplierShopName() { + return supplierShopName; + } + + public void setSupplierShopName(String supplierShopName) { + this.supplierShopName = supplierShopName; + } + + public String getContactName() { + return contactName; + } + + public void setContactName(String contactName) { + this.contactName = contactName; + } + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public Integer getIsCreateMember() { + return isCreateMember; + } + + public void setIsCreateMember(Integer isCreateMember) { + this.isCreateMember = isCreateMember; + } + + public Integer getCompanyInfoProcessStatus() { + return companyInfoProcessStatus; + } + + public void setCompanyInfoProcessStatus(Integer companyInfoProcessStatus) { + this.companyInfoProcessStatus = companyInfoProcessStatus; + } + + public Integer getIdCardCollectProcessStatus() { + return idCardCollectProcessStatus; + } + + public void setIdCardCollectProcessStatus(Integer idCardCollectProcessStatus) { + this.idCardCollectProcessStatus = idCardCollectProcessStatus; + } + + public Integer getIsBindPhone() { + return isBindPhone; + } + + public void setIsBindPhone(Integer isBindPhone) { + this.isBindPhone = isBindPhone; + } + + public Integer getAllinpaySupplierStatus() { + return allinpaySupplierStatus; + } + + public void setAllinpaySupplierStatus(Integer allinpaySupplierStatus) { + this.allinpaySupplierStatus = allinpaySupplierStatus; + } + + public String getCompanyAcctProtocolNo() { + return companyAcctProtocolNo; + } + + public void setCompanyAcctProtocolNo(String companyAcctProtocolNo) { + this.companyAcctProtocolNo = companyAcctProtocolNo; + } + + public String getLegalAcctProtocolNo() { + return legalAcctProtocolNo; + } + + public void setLegalAcctProtocolNo(String legalAcctProtocolNo) { + this.legalAcctProtocolNo = legalAcctProtocolNo; + } + + @Override + public String toString() { + return "SupplierDetail{" + + "supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", intro='" + intro + '\'' + + ", supplierLogo='" + supplierLogo + '\'' + + ", noticeMobile='" + noticeMobile + '\'' + + ", mobileBackgroundPic='" + mobileBackgroundPic + '\'' + + ", supplierStatus=" + supplierStatus + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", type=" + type + + ", supplierShopName='" + supplierShopName + '\'' + + ", isPreferred=" + isPreferred + + ", contactName='" + contactName + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + ", isCreateMember=" + isCreateMember + + ", isBindPhone=" + isBindPhone + + ", companyInfoProcessStatus=" + companyInfoProcessStatus + + ", idCardCollectProcessStatus=" + idCardCollectProcessStatus + + ", allinpaySupplierStatus=" + allinpaySupplierStatus + + ", companyAcctProtocolNo='" + companyAcctProtocolNo + '\'' + + ", legalAcctProtocolNo='" + legalAcctProtocolNo + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierUser.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierUser.java new file mode 100644 index 0000000..aa91fa7 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierUser.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 供应商用户 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierUser extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 供应商用户id + */ + private Long supplierUserId; + + /** + * 关联供应商ID(-1代表还没有申请创建供应商) + */ + private Long supplierId; + + /** + * 昵称 + */ + private String nickName; + + /** + * 员工编号 + */ + private String code; + + /** + * 联系方式 + */ + private String phoneNum; + + /** + * 是否已经设置账号 0:未设置 1:已设置 + */ + private Integer hasAccount; + + public Long getSupplierUserId() { + return supplierUserId; + } + + public void setSupplierUserId(Long supplierUserId) { + this.supplierUserId = supplierUserId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPhoneNum() { + return phoneNum; + } + + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } + + public Integer getHasAccount() { + return hasAccount; + } + + public void setHasAccount(Integer hasAccount) { + this.hasAccount = hasAccount; + } + + @Override + public String toString() { + return "SupplierUser{" + + "supplierUserId=" + supplierUserId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",supplierId=" + supplierId + + ",nickName=" + nickName + + ",code=" + code + + ",phoneNum=" + phoneNum + + ",hasAccount=" + hasAccount + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierWallet.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierWallet.java new file mode 100644 index 0000000..13f936f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierWallet.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import com.tmerclub.cloud.api.payment.constant.PaySysType; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 供应商钱包信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierWallet extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 供应商钱包id + */ + private Long supplierWalletId; + + /** + * 供应商ID + */ + private Long supplierId; + + /** + * 支付系统类型 + * @see PaySysType + */ + private Integer paySysType; + + /** + * 未结算金额(用户支付) + */ + private Long unsettledAmount; + + /** + * 已结算金额(用户确认收货后,可以提现) + */ + private Long settledAmount; + + /** + * 冻结金额(用户确认收货) + */ + private Long freezeAmount; + + /** + * 累积结算金额 + */ + private Long totalSettledAmount; + + /** + * 乐观锁 + */ + private Long version; + + public Long getSupplierWalletId() { + return supplierWalletId; + } + + public void setSupplierWalletId(Long supplierWalletId) { + this.supplierWalletId = supplierWalletId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getFreezeAmount() { + return freezeAmount; + } + + public void setFreezeAmount(Long freezeAmount) { + this.freezeAmount = freezeAmount; + } + + public Long getTotalSettledAmount() { + return totalSettledAmount; + } + + public void setTotalSettledAmount(Long totalSettledAmount) { + this.totalSettledAmount = totalSettledAmount; + } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } + + @Override + public String toString() { + return "SupplierWallet{" + + "supplierWalletId=" + supplierWalletId + + ", supplierId=" + supplierId + + ", paySysType=" + paySysType + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", freezeAmount=" + freezeAmount + + ", totalSettledAmount=" + totalSettledAmount + + ", version=" + version + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierWalletLog.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierWalletLog.java new file mode 100644 index 0000000..9f39f39 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierWalletLog.java @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 供应商钱包记录 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierWalletLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 供应商钱包id + */ + private Long walletLogId; + + /** + * 供应商ID + */ + private Long supplierId; + + /** + * 关联订单id + */ + private Long orderId; + + /** + * 关联订单项id + */ + private Long orderItemId; + + /** + * 退款单号 + */ + private Long refundId; + + /** + * 收支类型 0支出 1收入 + */ + private Integer ioType; + + /** + * 金额类型 0 未结算金额 1可提现金额 2冻结金额 + */ + private Integer amountType; + + /** + * 改变金额 + */ + private Long changeAmount; + /** + * 运费 + */ + private Long freightAmount; + + /** + * 原因 0用户支付 1用户确认收货 2 用户退款申请 3 拒绝用户退款申请 4 提现申请 5 提现申请被拒绝 + */ + private Integer reason; + + /** + * 用户金额(支付实付金额,退款实际申请金额) + */ + private Long userAmount; + + /** + * 平台补贴金额 + */ + private Long platformAmount; + + /** + * 分销占用金额 + */ + private Long distributionAmount; + + /** + * 平台佣金 + */ + private Long platformCommission; + + /** + * 供应商优惠金额 + */ + private Long supplierReduceAmount; + + /** + * 商品总金额 + */ + private Long totalAmount; + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Long getWalletLogId() { + return walletLogId; + } + + public void setWalletLogId(Long walletLogId) { + this.walletLogId = walletLogId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public Integer getAmountType() { + return amountType; + } + + public void setAmountType(Integer amountType) { + this.amountType = amountType; + } + + public Long getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(Long changeAmount) { + this.changeAmount = changeAmount; + } + + public Integer getReason() { + return reason; + } + + public void setReason(Integer reason) { + this.reason = reason; + } + + public Long getUserAmount() { + return userAmount; + } + + public void setUserAmount(Long userAmount) { + this.userAmount = userAmount; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getSupplierReduceAmount() { + return supplierReduceAmount; + } + + public void setSupplierReduceAmount(Long supplierReduceAmount) { + this.supplierReduceAmount = supplierReduceAmount; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + @Override + public String toString() { + return "SupplierWalletLog{" + + "walletLogId=" + walletLogId + + ", supplierId=" + supplierId + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", refundId=" + refundId + + ", ioType=" + ioType + + ", amountType=" + amountType + + ", changeAmount=" + changeAmount + + ", freightAmount=" + freightAmount + + ", reason=" + reason + + ", userAmount=" + userAmount + + ", platformAmount=" + platformAmount + + ", distributionAmount=" + distributionAmount + + ", platformCommission=" + platformCommission + + ", supplierReduceAmount=" + supplierReduceAmount + + ", totalAmount=" + totalAmount + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierWithdrawCash.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierWithdrawCash.java new file mode 100644 index 0000000..e3d97ef --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierWithdrawCash.java @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 供应商提现申请信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierWithdrawCash extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 提现id + */ + private Long cashId; + + + /** + * 支付系统类型 0默认1通联 + */ + private Integer paySysType; + + /** + * 供应商ID + */ + private Long supplierId; + + /** + * 审核人id + */ + private Long auditorId; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 审核时间 + */ + private Date auditingTime; + + /** + * 状态(0:未审核、1:已通过 -1:未通过 2:发放成功 3:发放失败) + */ + private Integer status; + + /** + * 平台备注 + */ + private String remarks; + + /** + * 供应商备注 + */ + private String supplierRemarks; + + /** + * 付款户名 + */ + private String payingAccount; + + /** + * 汇款账户 + */ + private String payingCardNo; + + /** + * 汇款时间 + */ + private Date payingTime; + + /** + * 收款银行卡id + */ + private Long supplierBankCardId; + + /** + * 通联提现状态 0.待支付 1.申请成功(还没确认) 2.提现成功 3.提现失败 + */ + private Integer allinpayStatus; + + /** + * 通联提现订单号 + */ + private String bizOrderNo; + + /** + * 提现失败原因 + */ + private String payFailMessage; + + public Long getCashId() { + return cashId; + } + + public void setCashId(Long cashId) { + this.cashId = cashId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Date getAuditingTime() { + return auditingTime; + } + + public void setAuditingTime(Date auditingTime) { + this.auditingTime = auditingTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getSupplierRemarks() { + return supplierRemarks; + } + + public void setSupplierRemarks(String supplierRemarks) { + this.supplierRemarks = supplierRemarks; + } + + public String getPayingAccount() { + return payingAccount; + } + + public void setPayingAccount(String payingAccount) { + this.payingAccount = payingAccount; + } + + public String getPayingCardNo() { + return payingCardNo; + } + + public void setPayingCardNo(String payingCardNo) { + this.payingCardNo = payingCardNo; + } + + public Date getPayingTime() { + return payingTime; + } + + public void setPayingTime(Date payingTime) { + this.payingTime = payingTime; + } + + public Long getSupplierBankCardId() { + return supplierBankCardId; + } + + public void setSupplierBankCardId(Long supplierBankCardId) { + this.supplierBankCardId = supplierBankCardId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Integer getAllinpayStatus() { + return allinpayStatus; + } + + public void setAllinpayStatus(Integer allinpayStatus) { + this.allinpayStatus = allinpayStatus; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getPayFailMessage() { + return payFailMessage; + } + + public void setPayFailMessage(String payFailMessage) { + this.payFailMessage = payFailMessage; + } + + @Override + public String toString() { + return "SupplierWithdrawCash{" + + "cashId=" + cashId + + ", paySysType=" + paySysType + + ", supplierId=" + supplierId + + ", auditorId=" + auditorId + + ", amount=" + amount + + ", auditingTime=" + auditingTime + + ", status=" + status + + ", remarks='" + remarks + '\'' + + ", supplierRemarks='" + supplierRemarks + '\'' + + ", payingAccount='" + payingAccount + '\'' + + ", payingCardNo='" + payingCardNo + '\'' + + ", payingTime=" + payingTime + + ", supplierBankCardId=" + supplierBankCardId + + ", allinpayStatus=" + allinpayStatus + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", payFailMessage='" + payFailMessage + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mongo/MongoPurchaseAmountLogBO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mongo/MongoPurchaseAmountLogBO.java new file mode 100644 index 0000000..63820b3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mongo/MongoPurchaseAmountLogBO.java @@ -0,0 +1,140 @@ +package com.tmerclub.cloud.supplier.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.time.LocalDateTime; + +/** + * Mongo采购日志 + * @author gaozijie + * @date 2023-08-28 + */ +@Document("purchase_amount_log") +@CompoundIndexes({ + @CompoundIndex(name = "shop_idx", def = "{'shopId':1, 'supplierId':1}"), + @CompoundIndex(name = "supplier_index", def = "{'supplierId':1, 'shopId':1}") +}) +public class MongoPurchaseAmountLogBO { + + @Id + @Schema(description = "采购日志Id") + private Long purchaseLogId; + + @Schema(description = "商家Id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + + @Schema(description = "供应商Id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long supplierId; + + @Schema(description = "采购金额类型", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer purchaseAmountType; + + @Schema(description = "采购订单编号") + private Long purchaseOrderId; + + @Schema(description = "改变金额") + private Long changeAmount; + + @Schema(description = "采购总价") + private Long purchaseTotalAmount; + + @Schema(description = "采购商品数量") + private Integer prodCount; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + public MongoPurchaseAmountLogBO() { + } + + public Long getPurchaseLogId() { + return purchaseLogId; + } + + public void setPurchaseLogId(Long purchaseLogId) { + this.purchaseLogId = purchaseLogId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getPurchaseAmountType() { + return purchaseAmountType; + } + + public void setPurchaseAmountType(Integer purchaseAmountType) { + this.purchaseAmountType = purchaseAmountType; + } + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Long getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(Long changeAmount) { + this.changeAmount = changeAmount; + } + + public Long getPurchaseTotalAmount() { + return purchaseTotalAmount; + } + + public void setPurchaseTotalAmount(Long purchaseTotalAmount) { + this.purchaseTotalAmount = purchaseTotalAmount; + } + + public Integer getProdCount() { + return prodCount; + } + + public void setProdCount(Integer prodCount) { + this.prodCount = prodCount; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "MongoPurchaseLogBO{" + + "purchaseLogId=" + purchaseLogId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", purchaseAmountType=" + purchaseAmountType + + ", purchaseOrderId=" + purchaseOrderId + + ", changeAmount=" + changeAmount + + ", purchaseTotalAmount=" + purchaseTotalAmount + + ", prodCount=" + prodCount + + ", createTime=" + createTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/PurchaseAmountLogService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/PurchaseAmountLogService.java new file mode 100644 index 0000000..16dffb0 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/PurchaseAmountLogService.java @@ -0,0 +1,63 @@ +package com.tmerclub.cloud.supplier.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.supplier.dto.PurchaseAmountLogDTO; +import com.tmerclub.cloud.supplier.mongo.MongoPurchaseAmountLogBO; +import com.tmerclub.cloud.supplier.vo.ShopSupplierNameVO; +import com.tmerclub.cloud.supplier.vo.TotalPurchaseAmountVO; +import com.tmerclub.cloud.supplier.vo.mongo.MongoPurchaseAmountLogVO; +import jakarta.servlet.http.HttpServletResponse; + +import java.util.List; + +/** + * @author gaozijie + * @date 2023-08-28 + */ +public interface PurchaseAmountLogService { + + /** + * 获取供应商名称列表 + * @param shopId 商家id + * @return 供应商名称列表 + */ + List listSupplier(Long shopId); + + /** + * 获取商家名称列表 + * @param supplierId 供应商Id + * @return 商家名称列表 + */ + List listShop(Long supplierId); + + /** + * 分页查询采购金额日志 + * @param pageDTO 分页参数 + * @param purchaseAmountLogDTO 查询参数 + * @return 采购金额日志份分页对象 + */ + PageVO pagePurchaseAmountLog(PageDTO pageDTO, + PurchaseAmountLogDTO purchaseAmountLogDTO); + + /** + * 保存采购金额日志 + * @param mongoPurchaseAmountLogBO 采购金额日志 + */ + void savePurchaseLog(MongoPurchaseAmountLogBO mongoPurchaseAmountLogBO); + + /** + * 获取总采购金额数据 + * @param purchaseAmountLogDTO 查询参数 + * @return 总采购金额对象 + */ + TotalPurchaseAmountVO getTotalPurchaseAmount(PurchaseAmountLogDTO purchaseAmountLogDTO); + + /** + * 导出excel + * @param response 响应 + * @param purchaseAmountLogDTO 查询参数 + */ + void exportExcel(HttpServletResponse response, PurchaseAmountLogDTO purchaseAmountLogDTO); + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierApplyService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierApplyService.java new file mode 100644 index 0000000..a8101f3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierApplyService.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service; + +/** + * @Author lth + * @Date 2021/4/29 17:23 + */ +public interface SupplierApplyService { + + /** + * 申请开店 + * @param shopId + */ + void apply(Long shopId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierAuditingService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierAuditingService.java new file mode 100644 index 0000000..34ec925 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierAuditingService.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.supplier.dto.AuditingSupplierInfoDTO; +import com.tmerclub.cloud.supplier.model.SupplierAuditing; +import com.tmerclub.cloud.supplier.vo.SupplierAuditingInfoVO; +import com.tmerclub.cloud.supplier.vo.SupplierAuditingVO; + +import java.util.List; + +/** + * 供应商审核信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierAuditingService { + + /** + * 分页获取商家审核信息列表 + * @param pageDTO 分页参数 + * @return 商家审核信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据商家审核信息id获取商家审核信息 + * + * @param supplierAuditingId 商家审核信息id + * @return 商家审核信息 + */ + SupplierAuditingVO getBySupplierAuditingId(Long supplierAuditingId); + + /** + * 保存商家审核信息 + * @param supplierAuditing 商家审核信息 + */ + void save(SupplierAuditing supplierAuditing); + + /** + * 更新商家审核信息 + * @param supplierAuditing 商家审核信息 + */ + void update(SupplierAuditing supplierAuditing); + + /** + * 根据商家审核信息id删除商家审核信息 + * @param supplierAuditingId + */ + void deleteById(Long supplierAuditingId); + + /** + * 获取指定供应商的申请信息 + * @param supplierId + * @return + */ + SupplierAuditingVO getBySupplierId(Long supplierId); + + /** + * 获取供应商审请分页 + * @param pageDTO + * @param auditingInfoDTO + * @return + */ + PageVO auditingInfoPage(PageDTO pageDTO, AuditingSupplierInfoDTO auditingInfoDTO); + + /** + * 更新供应商的开店申请为失败 + * @param supplierIds + */ + void updateToFail(List supplierIds); + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierCompanyAuditingService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierCompanyAuditingService.java new file mode 100644 index 0000000..2ed081d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierCompanyAuditingService.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.supplier.dto.SupplierCompanyAuditingDTO; +import com.tmerclub.cloud.supplier.dto.SupplierCompanyDTO; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyAuditingVO; + +/** + * @author chiley + * @date 2022/9/13 14:39 + */ +public interface SupplierCompanyAuditingService { + + /** + * 更新备注 + * @param supplierCompanyAuditingDTO + */ + void updateRemark(SupplierCompanyAuditingDTO supplierCompanyAuditingDTO); + + /** + * 供应商申请变更工商信息 + * + * @param supplierCompanyDTO + */ + void applyChangeCompanyInfo(SupplierCompanyDTO supplierCompanyDTO); + + /** + * 根据供应商id获取最近一条工商审核信息 + * + * @param supplierId + * @return + */ + SupplierCompanyAuditingVO getLatestAuditingBySupplierId(Long supplierId); + + + /** + * 撤销申请 + * + * @param supplierId + */ + void revoke(Long supplierId); + + /** + * 分页获取待审核的工商信息 + * + * @param pageDTO 分页参数 + * @param supplierCompanyAuditingDTO 搜索参数 + * @return + */ + PageVO page(PageDTO pageDTO, SupplierCompanyAuditingDTO supplierCompanyAuditingDTO); + + /** + * 审核公司信息 + * @param supplierCompanyAuditingDTO + */ + void audit(SupplierCompanyAuditingDTO supplierCompanyAuditingDTO); + + /** + * 获取供应商工商信息审核信息 + * @param supplierId + * @return + */ + SupplierCompanyAuditingVO getAuditInfo(Long supplierId); + + /** + * 企业信息更新回调 + * @param bizUserId + * @param status + * @param result + * @param failReason + */ + void updateCompanyInfoResult(String bizUserId, Integer status, Integer result, String failReason); + + /** + * 回调更新通联状态 + * @param bizUserId + * @param status + * @param failReason + * @param isPassShop + */ + void updateAllinpaySupplierStatus(String bizUserId, Integer status, String failReason, Integer isPassShop); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierCompanyService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierCompanyService.java new file mode 100644 index 0000000..0cb1a31 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierCompanyService.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service; + +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.supplier.dto.SupplierCompanyDTO; +import com.tmerclub.cloud.supplier.model.SupplierCompany; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyVO; + +/** + * 供应商工商信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierCompanyService { + /** + * 根据供应商id更新供应商工商信息 + * + * @param supplierCompany + * @param supplierId + * @param temp 0代表通过审核,1代表平台修改 + */ + void updateBySupplierId(SupplierCompany supplierCompany, Long supplierId, Integer temp); + + /** + * 根据供应商工商信息id获取供应商工商信息 + * + * @param supplierCompanyId 供应商工商信息id + * @return 供应商工商信息 + */ + SupplierCompanyVO getById(Long supplierCompanyId); + + /** + * 根据供应商id和审核状态获取供应商工商信息 + * + * @param supplierId + * @param status + * @return + */ + SupplierCompanyVO getSupplierCompanyBySupplierIdAndStatus(Long supplierId, Integer status); + + /** + * 保存供应商工商信息 + * + * @param supplierCompany + * @param isCreate + */ + void save(SupplierCompany supplierCompany, boolean isCreate); + + /** + * 更新供应商工商信息 + * + * @param supplierCompany 供应商工商信息 + */ + void update(SupplierCompany supplierCompany); + + /** + * 检查统一信息码是否已经存在 + * + * @param creditCode + * @param supplierId + * @return + */ + Boolean checkCreditCode(String creditCode, Long supplierId); + + /** + * 根据供应商id和审核状态删除供应商工商信息 + * + * @param supplierId + * @param status 审核状态 + * @return + */ + void deleteBySupplierIdAndStatus(Long supplierId, Integer status); + + /** + * 根据供应商id更改供应商工商信息状态 + * + * @param supplierId + * @param status + * @param dbStatus + */ + void batchUpdateStatus(Long supplierId, Integer status, Integer dbStatus); + + /** + * 校验供应商工商信息,isCreate为true代表校验新增时的信息,false代表校验更新时的信息 + * + * @param supplierCompany + * @param isCreate + * @param temp 0代表通过审核,1代表平台修改 + */ + void checkInfo(SupplierCompany supplierCompany, Boolean isCreate, Integer temp); + + /** + * 根据供应商id更新供应商工商信息 + * + * @param supplierCompany 供应商工商信息 + */ + void updateById(SupplierCompany supplierCompany); + + /** + * 影印件采集 + * @param supplierCompany + * @param supplierId + * @return + */ + String idCardCollect(SupplierCompanyVO supplierCompany, Long supplierId); + + /** + * 更新正常的供应商工商信息为待审核 + */ + void updateStatusToWaitAudit(); + + /** + * 重新单独上传影印件 + * @param supplierCompanyDTO + * @param supplierApiDetailVO + * @param status + * @return + */ + String uploadIdCard(SupplierCompanyDTO supplierCompanyDTO, SupplierApiDetailVO supplierApiDetailVO, Integer status); + + /** + * 平台更新商家工商信息 + * @param supplierCompany + * @param supplierId + */ + void platformUpdateSupplierCompany(SupplierCompany supplierCompany, Long supplierId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierDetailService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierDetailService.java new file mode 100644 index 0000000..419e0bb --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierDetailService.java @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service; + +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.supplier.bo.SupplierDetailBO; +import com.tmerclub.cloud.api.supplier.bo.SupplierSimpleBO; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.supplier.dto.SupplierAuditingDTO; +import com.tmerclub.cloud.supplier.dto.SupplierCreateInfoDTO; +import com.tmerclub.cloud.supplier.dto.SupplierDetailDTO; +import com.tmerclub.cloud.supplier.dto.SupplierSigningInfoDTO; +import com.tmerclub.cloud.supplier.model.SupplierDetail; +import com.tmerclub.cloud.supplier.vo.SupplierDetailAppVO; +import com.tmerclub.cloud.supplier.vo.SupplierDetailVO; + +import java.util.Date; +import java.util.List; + +/** + * 供应商详情 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierDetailService { + + /** + * 分页获取供应商详情列表 + * + * @param pageDTO 分页参数 + * @param supplierDetailDTO 供应商搜索数据 + * @return 供应商详情列表分页数据 + */ + PageVO page(PageDTO pageDTO, SupplierDetailDTO supplierDetailDTO); + + /** + * 根据供应商详情id获取供应商详情 + * + * @param supplierId 供应商详情id + * @return 供应商详情 + */ + SupplierApiDetailVO getBySupplierId(Long supplierId); + + /** + * 更新供应商详情 + * @param supplierDetailDTO 供应商详情 + */ + void update(SupplierDetailDTO supplierDetailDTO); + + /** + * 根据供应商详情id删除供应商详情 + * @param supplierId + */ + void deleteById(Long supplierId); + + /** + * 获取供应商列表信息 + * @param supplierIds + * @return + */ + List listBySupplierIds(List supplierIds); + + /** + * 根据供应商详情id获取供应商详情以及剩余短信额度 + * + * @param supplierId 供应商详情id + * @return 供应商详情 + */ + SupplierApiDetailVO getSupplierBySupplierId(Long supplierId); + + /** + * 申请开店 + * + * @param supplierDetailDTO 申请开店信息 + */ + void applySupplier(SupplierDetailDTO supplierDetailDTO); + + /** + * 供应商搜索分页 + * + * @param pageDTO 分页参数 + * @param supplierDetailDTO 供应商信息 + * @return 供应商信息列表 + */ + PageVO supplierSearchPage(PageDTO pageDTO, SupplierDetailDTO supplierDetailDTO); + + /** + * 审核供应商信息 + * + * @param supplierAuditingDTO 审核信息 + */ + void audit(SupplierAuditingDTO supplierAuditingDTO); + + /** + * 改变供应商状态 + * + * @param supplierId + * @param supplierStatus + */ + void changeSpuStatus(Long supplierId, Integer supplierStatus); + + /** + * 删除供应商缓存 + * + * @param supplierId + */ + void removeCacheBySupplierId(Long supplierId); + + /** + * 获取供应商信息及扩展信息 + * + * @param supplierId + * @return + */ + SupplierDetailBO supplierExtensionData(Long supplierId); + + /** + * 创建供应商 + * + * @param supplierDetailDTO + */ + void createSupplier(SupplierDetailDTO supplierDetailDTO); + + /** + * 获取供应商信息及扩展信息 + * @param supplierIds 供应商ids + * @param supplierName 供应商名称 + * @return 供应商信息列表 + */ + List getSupplierDetailBySupplierIdAndSupplierName(List supplierIds, String supplierName); + + /** + * 根据供应商id获取供应商扩展信息 + * @param supplierId 供应商id + * @return 供应商扩展信息 + */ + SupplierApiDetailVO getShoExtensionsBySupplierId(Long supplierId); + + /** + * 根据手机号获取存在供应商的数量 + * @param mobile 手机号 + * @return 数量 + */ + Integer countByMobile(String mobile); + + /** + * 平台 --下线活动商品 + * @param supplierApiDetailVO 供应商信息 + * @param offlineReason 下线原因 + * @param sysUserId 系统用户id + */ + void offline(SupplierApiDetailVO supplierApiDetailVO, String offlineReason, Long sysUserId); + + /** + * 根据供应商状态查询供应商数量 + * @param supplierStatus + * @return + */ + Long countBySupplierStatus(Long supplierStatus); + + /** + * 平台创建供应商 + * @param supplierCreateInfoDTO + */ + void platformCreateSupplier(SupplierCreateInfoDTO supplierCreateInfoDTO); + + /** + * 根据签约时间修改供应商状态 + * @param now + */ + void changeSupplierStatusByContractTime(Date now); + + /** + * 更新供应商签约信息 + * @param supplierSigningInfoDTO + */ + void updateSigningInfo(SupplierSigningInfoDTO supplierSigningInfoDTO); + + /** + * 供应商重新申请上线 + * @param offlineHandleEventDTO + */ + void auditApply(OfflineHandleEventDTO offlineHandleEventDTO); + + /** + * 供应商违规下线,重新申请上线审核 + * @param offlineHandleEventDTO + */ + void onlineAudit(OfflineHandleEventDTO offlineHandleEventDTO); + + + /** + * 根据参数获取供应商id + * @param supplierSimpleBO + * @return + */ + List listSimple(SupplierSimpleBO supplierSimpleBO); + + /** + * 检查供应商名称是否已存在 + * @param supplierName + * @return + */ + Boolean checkSupplierName(String supplierName); + + /** + * 根据供应商状态查询供应商id列表 + * @param supplierStatus + * @return + */ + List getSupplierIdBySupplierStatus(Integer supplierStatus); + + /** + * 供应商列表 + * + * @param supplierDetailDTO + * @param shopId + * @param pageDTO + * @return + */ + PageVO pageSupplier(PageDTO pageDTO, SupplierDetailDTO supplierDetailDTO, Long shopId); + + /** + * 根据供应商Id查询相关的供应商列表 + * + * @param supplierDetailDTO + * @param shopId + * @return + */ + List listSupplierByShopId(SupplierDetailDTO supplierDetailDTO, Long shopId); + + /** + * 获取指定供应商信息 + * @param supplierIds + * @return + */ + List listSupplierDetailBySupplierIds(List supplierIds); + + /** + * 给还没创建通联会员的供应商创建会员账号 + */ + void createAllinpayMember(); + + /** + * 更新通联影印件状态 + * @param bizUserId + * @param status + */ + void updateAllinpayIdCardStatus(String bizUserId, Integer status); + + /** + * 供应商违规下线,无需供应商申请,平台直接上线供应商 + * @param offlineHandleEventDTO + */ + void onlineOpenSupplier(OfflineHandleEventDTO offlineHandleEventDTO); + + /** + * 给供应商创建通联会员 + * @param supplierId + */ + void createAllinpayMemberBySupplierId(Long supplierId); + + /** + * 获取未删除的供应商id + * @return + */ + List listSupplierIds(); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierRefundAddrService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierRefundAddrService.java new file mode 100644 index 0000000..6f5a889 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierRefundAddrService.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service; + +import com.tmerclub.cloud.api.supplier.vo.SupplierApiRefundAddrVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.supplier.dto.SupplierRefundAddrDTO; +import com.tmerclub.cloud.supplier.model.SupplierRefundAddr; + +import java.util.List; + +/** + * 供应商退货地址 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierRefundAddrService { + + /** + * 分页获取商家退货地址列表 + * @param pageDTO 分页参数 + * @param supplierRefundAddrDTO 供应商退款地址 + * @return 商家退货地址列表分页数据 + */ + PageVO page(PageDTO pageDTO, SupplierRefundAddrDTO supplierRefundAddrDTO); + + /** + * 根据商家退货地址id获取商家退货地址 + * + * @param supplierRefundAddrId 商家退货地址id + * @param supplierId + * @return 商家退货地址 + */ + SupplierApiRefundAddrVO getBySupplierRefundAddrId(Long supplierRefundAddrId, Long supplierId); + + /** + * 保存商家退货地址 + * @param supplierRefundAddr 商家退货地址 + */ + void save(SupplierRefundAddr supplierRefundAddr); + + /** + * 更新商家退货地址 + * @param supplierRefundAddr 商家退货地址 + */ + void update(SupplierRefundAddr supplierRefundAddr); + + /** + * 根据商家退货地址id删除商家退货地址 + * @param supplierRefundAddrId 商家退货地址id + * @param supplierId 供应商id + */ + void deleteById(Long supplierRefundAddrId, Long supplierId); + + /** + * 获取供应商退货地址 + * @param supplierId 供应商id + * @return 供应商退货地址 + */ + List listBySupplierId(Long supplierId); + + /** + * 清除供应商缓存 + * @param supplierId + */ + void removeCacheBySupplierId(Long supplierId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierUserAccountService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierUserAccountService.java new file mode 100644 index 0000000..ae5fbb3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierUserAccountService.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service; + +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.supplier.dto.ChangeAccountDTO; + +/** + * @author FrozenWatermelon + * @date 2020/09/03 + */ +public interface SupplierUserAccountService { + + /** + * 添加账户 + * @param changeAccountDTO 账户信息 + * @return void + */ + ServerResponseEntity save(ChangeAccountDTO changeAccountDTO); + + /** + * 更新账户 + * @param changeAccountDTO 账户信息 + * @return + */ + ServerResponseEntity update(ChangeAccountDTO changeAccountDTO); + + /** + * 根据用户id和系统类型获取用户信息 + * @param userId 用户id + * @param sysType 系统类型 + * @return void + */ + ServerResponseEntity getByUserIdAndSysType(Long userId, Integer sysType); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierUserService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierUserService.java new file mode 100644 index 0000000..28e857e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierUserService.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.dto.ShopUserDTO; +import com.tmerclub.cloud.multishop.vo.ShopUserVO; +import com.tmerclub.cloud.supplier.dto.SupplierUserDTO; +import com.tmerclub.cloud.supplier.dto.SupplierUserRegisterDTO; +import com.tmerclub.cloud.supplier.model.SupplierUser; +import com.tmerclub.cloud.supplier.vo.SupplierUserVO; + +import java.util.List; + +/** + * 供应商用户 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierUserService { + + /** + * 分页获取供应商用户列表 + * + * @param pageDTO 分页参数 + * @param supplierUserDTO 搜索参数 + * @return 供应商用户列表 + */ + PageVO pageBySupplierId(PageDTO pageDTO, SupplierUserDTO supplierUserDTO); + + /** + * 根据用户id获取商家用户信息 + * + * @param userId 用户id + * @return 商家用户信息 + */ + SupplierUserVO getByUserId(Long userId); + + /** + * 根据用户id获取商家用户信息 + * + * @param userId 用户id + * @return 商家用户信息 + */ + SupplierUserVO getSimpleByUserId(Long userId); + + /** + * 保存供应商用户信息 + * + * @param supplierUser 供应商用户id + * @param roleIds 角色id列表 + */ + void save(SupplierUser supplierUser, List roleIds); + + /** + * 更新供应商用户信息 + * + * @param supplierUser 供应商用户id + * @param roleIds 角色id列表 + */ + void update(SupplierUser supplierUser, List roleIds); + + /** + * 根据供应商用户id删除供应商用户信息 + * + * @param supplierUserId 供应商用户id + */ + void deleteById(Long supplierUserId); + + /** + * 获取店主账号的用户id-第一个创建的账号(仅用于审核供应商) + * + * @param supplierId + * @return + */ + Long getUserIdBySupplierId(Long supplierId); + + /** + * 商家注册 + * + * @param supplierUserRegisterDTO + */ + void register(SupplierUserRegisterDTO supplierUserRegisterDTO); + + /** + * 验证供应商的职工手机号/邮箱/用户名是否存在 + * + * @param supplierUserDTO 供应商职工信息参数 + * @return Boolean true验证通过,该账号不存在 false验证不通过,该账号存在 + */ + ServerResponseEntity verifySupplierUserAccount(SupplierUserDTO supplierUserDTO); + + /** + * 新增供应商职工信息,以及账号 + * + * @param supplierUserDTO 供应商职工参数 + */ + void saveAccount(SupplierUserDTO supplierUserDTO); + + /** + * 修改供应商职工信息,以及账号 + * + * @param supplierUserDTO 供应商职工参数 + */ + void updateAccount(SupplierUserDTO supplierUserDTO); + + /** + * 根据用户手机号查询用户数量 + * + * @param mobile 手机号码 + * @return 用户数量 + */ + Integer countAccoutByMobile(String mobile); + + /** + * 获取员工列表 + * @param supplierUserDTO + * @return + */ + List listBySupplierId(SupplierUserDTO supplierUserDTO); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierWalletLogService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierWalletLogService.java new file mode 100644 index 0000000..f3ef261 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierWalletLogService.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.supplier.dto.SupplierWalletLogSearchDTO; +import com.tmerclub.cloud.supplier.mongo.MongoSupplierWalletLogBO; +import com.tmerclub.cloud.supplier.vo.SupplierWalletLogExcelVO; +import com.tmerclub.cloud.supplier.vo.SupplierWalletVO; + +import java.util.List; + +/** + * 供应商钱包记录 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierWalletLogService { + + /** + * 分页获取商家钱包记录列表 + * @param pageDTO 分页参数 + * @param supplierWalletLogSearchDTO 钱包日志搜索参数 + * @return 商家钱包记录列表分页数据 + */ + PageVO pageByParam(PageDTO pageDTO, SupplierWalletLogSearchDTO supplierWalletLogSearchDTO); + + /** + * 保存商家钱包记录 + * 这里需要有钱包id传进来 + * @param supplierWalletLogBOList 商家钱包记录 + */ + void saveMongoBatch(List supplierWalletLogBOList); + + /** + * 查询所有供应商的日志 + * @param pageDTO 分页 + * @param supplierWalletLogSearchDTO 查询参数 + * @return 所有供应商的日志 + */ + PageVO pageAllSupplier(PageDTO pageDTO, SupplierWalletLogSearchDTO supplierWalletLogSearchDTO); + + /** + * 计算供应商从订单获取金额的数量 + * + * @param orderId 订单id + * @param shopWalletChangeReason 钱包改变原因 + * @return 数量 + */ + long countInAmountByOrderId(Long orderId, Integer shopWalletChangeReason); + + /** + * 计算供应商从退款失去金额的数量 + * + * @param refundId 退款编号 + * @param shopWalletChangeReason 钱包改变原因 + * @return 数量 + */ + long countOutAmountByRefundId(Long refundId, Integer shopWalletChangeReason); + + /** + * 根据订单号查询供应商钱包日志 + * @param supplierWalletLogSearchDTO + * @return + */ + List listByParam(SupplierWalletLogSearchDTO supplierWalletLogSearchDTO); + + /** + * 根据时间和供应商名称获取供应商钱包信息 + * @param supplierWalletLogSearchDTO + * @return + */ + SupplierWalletVO getSupplierWalletByTime(SupplierWalletLogSearchDTO supplierWalletLogSearchDTO); + + /** + * 分页获取供应商钱包信息 + * @param pageDTO + * @param supplierWalletLogSearchDTO + * @return + */ + PageVO pageSupplierWalletByTime(PageDTO pageDTO, SupplierWalletLogSearchDTO supplierWalletLogSearchDTO); + + /** + * 获取导出列表 + * @param supplierWalletLogSearchDTO + * @return + */ + List listSupplierWalletLogExcel(SupplierWalletLogSearchDTO supplierWalletLogSearchDTO); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierWalletService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierWalletService.java new file mode 100644 index 0000000..59219ec --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierWalletService.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.api.payment.vo.SplitRuleVO; +import com.tmerclub.cloud.api.supplier.bo.SupplierWalletBO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.OrderSimpleAmountInfoBO; +import com.tmerclub.cloud.supplier.dto.SupplierWalletLogSearchDTO; +import com.tmerclub.cloud.supplier.vo.SupplierWalletVO; + +import java.util.List; + +/** + * 供应商钱包信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierWalletService { + + /** + * 通过下单添加商家待结算金额,确认收货后进行结算 + * @param orderSimpleAmountInfos 订单id和供应商id关联信息 + */ + void addAmountByOrder(List orderSimpleAmountInfos); + + /** + * 结算给商家增加结算金额 + * @param orderId 订单id + * @return 结算收入信息 + */ + void addAmountBySettledOrder(Long orderId); + + /** + * 获取供应商结算信息 + * @param orderId 订单id + * @return 结算收入信息 + */ + SplitRuleVO getSupplierSettledInfoByOrderId(Long orderId); + + /** + * 通过退款,锁定商家钱包金额 + * @param orderChangeShopWalletAmountBO 金额相关信息 + * @return + */ + void refundSupplierAmountByRefund(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO); + + /** + * 根据供应商id查询供应商钱包信息 + * @param supplierId 供应商id + * @return 供应商钱包信息 + */ + SupplierWalletVO getBySupplierId(Long supplierId); + + /** + * 获取所有供应商的钱包信息 + * @param supplierWalletLogSearchDTO + * @return 钱包信息 + */ + SupplierWalletVO getAllSupplier(SupplierWalletLogSearchDTO supplierWalletLogSearchDTO); + + /** + * 订单部分退款导致订单关闭 商家结算操作 + * @param orderChangeSupplierWalletAmountBO 金额相关信息 + */ + void settlementSupplierAmountByRefund(OrderChangeShopWalletAmountBO orderChangeSupplierWalletAmountBO); + + /** + * 修改供应商钱包的待结算金额 + * @param message 分销产生的待结算金额 + */ + void updateByDistributionAmount(List message); + + /** + * 分页获取供应商钱包信息 + * @param pageDTO + * @param supplierWalletLogSearchDTO + * @return + */ + PageVO pageSupplierWalletByTime(PageDTO pageDTO, SupplierWalletLogSearchDTO supplierWalletLogSearchDTO); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierAuditingServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierAuditingServiceImpl.java new file mode 100644 index 0000000..d7d63c6 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierAuditingServiceImpl.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.supplier.dto.AuditingSupplierInfoDTO; +import com.tmerclub.cloud.supplier.mapper.SupplierAuditingMapper; +import com.tmerclub.cloud.supplier.model.SupplierAuditing; +import com.tmerclub.cloud.supplier.service.SupplierAuditingService; +import com.tmerclub.cloud.supplier.vo.SupplierAuditingInfoVO; +import com.tmerclub.cloud.supplier.vo.SupplierAuditingVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 供应商审核信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +@Service +public class SupplierAuditingServiceImpl implements SupplierAuditingService { + + @Autowired + private SupplierAuditingMapper supplierAuditingMapper; + + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> supplierAuditingMapper.list()); + } + + @Override + public SupplierAuditingVO getBySupplierAuditingId(Long supplierAuditingId) { + return supplierAuditingMapper.getBySupplierAuditingId(supplierAuditingId); + } + + @Override + public void save(SupplierAuditing supplierAuditing) { + supplierAuditingMapper.save(supplierAuditing); + } + + @Override + public void update(SupplierAuditing supplierAuditing) { + supplierAuditingMapper.update(supplierAuditing); + } + + @Override + public void deleteById(Long supplierAuditingId) { + supplierAuditingMapper.deleteById(supplierAuditingId); + } + + @Override + public SupplierAuditingVO getBySupplierId(Long supplierId) { + return supplierAuditingMapper.getBySupplierId(supplierId); + } + + @Override + public PageVO auditingInfoPage(PageDTO pageDTO, AuditingSupplierInfoDTO auditingInfoDTO) { + return PageUtil.doPage(pageDTO, () -> supplierAuditingMapper.auditingInfoList(auditingInfoDTO)); + } + + @Override + public void updateToFail(List supplierIds) { + supplierAuditingMapper.updateToFail(supplierIds); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierDetailServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierDetailServiceImpl.java new file mode 100644 index 0000000..575d71a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierDetailServiceImpl.java @@ -0,0 +1,1096 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.biz.feign.AttachFileFeignClient; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.product.feign.WarehouseFeignClient; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.product.feign.BrandFeignClient; +import com.tmerclub.cloud.api.product.feign.BrandShopFeignClient; +import com.tmerclub.cloud.api.product.feign.CategoryShopFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.supplier.bo.SupplierDetailBO; +import com.tmerclub.cloud.api.supplier.bo.SupplierSimpleBO; +import com.tmerclub.cloud.api.supplier.constant.SupplierStatus; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.*; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.dto.ProductSearchLimitDTO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.supplier.constant.AuditStatus; +import com.tmerclub.cloud.supplier.constant.SupplierType; +import com.tmerclub.cloud.supplier.dto.*; +import com.tmerclub.cloud.supplier.mapper.SupplierCompanyAuditingMapper; +import com.tmerclub.cloud.supplier.mapper.SupplierDetailMapper; +import com.tmerclub.cloud.supplier.mapper.SupplierUserMapper; +import com.tmerclub.cloud.supplier.mapper.SupplierWalletMapper; +import com.tmerclub.cloud.supplier.model.*; +import com.tmerclub.cloud.supplier.service.*; +import com.tmerclub.cloud.supplier.vo.*; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 供应商详情 + * @author lhd + */ +@Service +public class SupplierDetailServiceImpl implements SupplierDetailService { + + private static final Logger log = LoggerFactory.getLogger(SupplierDetailServiceImpl.class); + + @Autowired + private SupplierDetailMapper supplierDetailMapper; + @DubboReference + private CategoryShopFeignClient categoryShopFeignClient; + @Autowired + private SupplierCompanyService supplierCompanyService; + @Autowired + private SupplierAuditingService supplierAuditingService; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @Autowired + private SupplierWalletMapper supplierWalletMapper; + @Autowired + private SupplierUserService supplierUserService; + @Autowired + private SupplierExtensionService supplierExtensionService; + @DubboReference + private AccountFeignClient accountFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + @Autowired + private SupplierUserMapper supplierUserMapper; + @DubboReference + private BrandFeignClient brandFeignClient; + @DubboReference + private OfflineHandleEventFeignClient offlineHandleEventFeignClient; + @DubboReference + private NotifyFeignClient notifyFeignClient; + @Autowired + private SupplierBankCardService supplierBankCardService; + @DubboReference + private BrandShopFeignClient brandSupplierFeignClient; + @DubboReference + private AttachFileFeignClient attachFileFeignClient; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + @Autowired + private SupplierCompanyAuditingMapper supplierCompanyAuditingMapper; + @DubboReference + private WarehouseFeignClient warehouseFeignClient; + + @Override + public PageVO page(PageDTO pageDTO, SupplierDetailDTO supplierDetailDTO) { + Integer paySysType = supplierAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + supplierDetailDTO.setPaySysType(paySysType); + PageVO page = PageUtil.doPage(pageDTO, () -> supplierDetailMapper.list(supplierDetailDTO)); + if (supplierAllinpayService.getIsAllinpay()) { + for (SupplierApiDetailVO supplierApiDetailVO : page.getList()) { + setAllinpaySupplierStatus(supplierApiDetailVO); + } + } + return page; + } + + @Override + @Cacheable(cacheNames = CacheNames.SUPPLIER_DETAIL_ID_KEY, key = "#supplierId") + public SupplierApiDetailVO getBySupplierId(Long supplierId) { + SupplierApiDetailVO supplierApiDetailVO = supplierDetailMapper.getBySupplierId(supplierId); + ServerResponseEntity responseEntity = accountFeignClient.getAccountInfoByTenantId(supplierId, SysTypeEnum.SUPPLIER.value()); + if (responseEntity.isSuccess() && Objects.nonNull(responseEntity.getData())) { + AuthAccountVO authAccountVO = responseEntity.getData(); + supplierApiDetailVO.setAccountStatus(authAccountVO.getStatus()); + } + if (supplierAllinpayService.getIsAllinpay()) { + setAllinpaySupplierStatus(supplierApiDetailVO); + } + return supplierApiDetailVO; + } + + private static void setAllinpaySupplierStatus(SupplierApiDetailVO supplierApiDetailVO) { + if (Objects.isNull(supplierApiDetailVO)) { + return; + } + if (Objects.equals(supplierApiDetailVO.getAllinpaySupplierStatus(), AllinpayShopStatus.WAIT_AUDIT.value())) { + supplierApiDetailVO.setSupplierStatus(ShopStatus.OFFLINE_AWAIT_AUDIT.value()); + } + if (Objects.equals(supplierApiDetailVO.getAllinpaySupplierStatus(), AllinpayShopStatus.OPEN_WAIT_AUDIT.value())) { + supplierApiDetailVO.setSupplierStatus(ShopStatus.OPEN_AWAIT_AUDIT.value()); + } + if (Objects.equals(supplierApiDetailVO.getAllinpaySupplierStatus(), AllinpayShopStatus.OFFLINE.value()) || + Objects.equals(supplierApiDetailVO.getAllinpaySupplierStatus(), AllinpayShopStatus.UN_AVAILABLE.value())) { + supplierApiDetailVO.setSupplierStatus(ShopStatus.OFFLINE.value()); + } + if (Objects.equals(supplierApiDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.FAIL.value()) + && Objects.equals(supplierApiDetailVO.getAllinpaySupplierStatus(), AllinpayShopStatus.OFFLINE.value())) { + supplierApiDetailVO.setSupplierStatus(ShopStatus.AUDIT_FAIL.value()); + } + } + + @Override + @CacheEvict(cacheNames = CacheNames.SUPPLIER_DETAIL_ID_KEY, key = "#supplierDetailDTO.supplierId") + public void update(SupplierDetailDTO supplierDetailDTO) { + SupplierDetail supplierDetail = BeanUtil.map(supplierDetailDTO, SupplierDetail.class); + // 给还没创建通联会员的供应商创建 + SupplierApiDetailVO dbSupplierDetail = supplierDetailMapper.getBySupplierId(supplierDetailDTO.getSupplierId()); + if (!PrincipalUtil.isDbPhone(supplierDetail.getContactPhone(), dbSupplierDetail.getContactPhone(), false)) { + throw new LuckException("请输入正确的手机号"); + } + if (supplierDetail.getContactPhone().contains(Constant.ASTERISK)) { + supplierDetail.setContactPhone(dbSupplierDetail.getContactPhone()); + } + if (supplierAllinpayService.getIsAllinpay() && Objects.equals(dbSupplierDetail.getIsCreateMember(), 0)) { + createAllinpayMemberBySupplierId(supplierDetail.getSupplierId()); + } + this.checkSupplierInfo(supplierDetailDTO, false); + // 更新商品 + spuFeignClient.updateSpuByShopId(supplierDetail.getSupplierId(), SysTypeEnum.SUPPLIER.value()); + supplierDetailMapper.update(supplierDetail); + } + + @Override + @CacheEvict(cacheNames = CacheNames.SUPPLIER_DETAIL_ID_KEY, key = "#supplierId") + public void deleteById(Long supplierId) { + supplierDetailMapper.deleteById(supplierId); + } + + @Override + public List listBySupplierIds(List supplierIds) { + if (CollUtil.isEmpty(supplierIds)) { + return new ArrayList<>(0); + } + return supplierDetailMapper.listBySupplierIds(supplierIds); + } + + @Override + public PageVO supplierSearchPage(PageDTO pageDTO, SupplierDetailDTO supplierDetailDTO) { + supplierDetailDTO.setPaySysType(supplierAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value()); + PageVO page = PageUtil.doPage(pageDTO, () -> supplierDetailMapper.supplierSearchList(supplierDetailDTO)); + Set spuIdSet = page.getList().stream().map(SupplierDetailAppVO::getSupplierId).collect(Collectors.toSet()); + if (Objects.isNull(supplierDetailDTO.getSpuNum()) || supplierDetailDTO.getSpuNum() <= 0) { + return page; + } + ProductSearchLimitDTO productSearchLimitDTO = new ProductSearchLimitDTO(supplierDetailDTO.getSpuNum()); + productSearchLimitDTO.setSupplierIds(new ArrayList<>(spuIdSet)); + ServerResponseEntity> spuResponse = searchSpuFeignClient.limitSpuList(productSearchLimitDTO); + if (!Objects.equals(spuResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(spuResponse.getMsg()); + } else if (CollectionUtil.isEmpty(spuResponse.getData())) { + return page; + } + List data = spuResponse.getData(); + Map> supplierMap = data.stream().collect(Collectors.groupingBy(SpuSearchVO::getSupplierId)); + for (SupplierDetailAppVO supplierDetail : page.getList()) { + List spuSearchVOList = supplierMap.get(supplierDetail.getSupplierId()); + if (CollUtil.isEmpty(spuSearchVOList)) { + spuSearchVOList = new ArrayList<>(0); + } + supplierDetail.setSpuList(spuSearchVOList); + } + return page; + } + + @Override + public SupplierApiDetailVO getSupplierBySupplierId(Long supplierId) { + return supplierDetailMapper.getSupplierBySupplierId(supplierId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void applySupplier(SupplierDetailDTO supplierDetailDTO) { + checkSupplierInfo(supplierDetailDTO, true); + SupplierDetail newSupplierDetail = BeanUtil.map(supplierDetailDTO, SupplierDetail.class); + // 申请开店 + newSupplierDetail.setSupplierStatus(SupplierStatus.APPLYING.value()); + newSupplierDetail.setType(SupplierType.STOP.value()); + supplierDetailMapper.save(newSupplierDetail); + supplierDetailDTO.setSupplierId(newSupplierDetail.getSupplierId()); + + // 插入一条审核记录 + SupplierAuditing auditing = new SupplierAuditing(); + auditing.setSupplierId(newSupplierDetail.getSupplierId()); + auditing.setCreateTime(new Date()); + auditing.setStatus(AuditStatus.WAITAUDIT.value()); + auditing.setUpdateTime(new Date()); + auditing.setRemarks(supplierDetailDTO.getRemarks()); + supplierAuditingService.save(auditing); + // 创建账号 + createSupplierAccount(supplierDetailDTO, StatusEnum.DELETE); + } + + /** + * 审核供应商信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void audit(SupplierAuditingDTO supplierAuditingDTO) { + Date now = new Date(); + SupplierAuditingVO dbSupplierAyditing = supplierAuditingService.getBySupplierId(supplierAuditingDTO.getSupplierId()); + if (Objects.isNull(dbSupplierAyditing)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + supplierAuditingDTO.setSupplierAuditingId(dbSupplierAyditing.getSupplierAuditingId()); + // 非待审核的供应商,不能再进行审核 + if (!Objects.equals(dbSupplierAyditing.getStatus(), AuditStatus.WAITAUDIT.value())) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + + // 修改供应商状态 + SupplierApiDetailVO supplierApiDetailVO = getBySupplierId(supplierAuditingDTO.getSupplierId()); + if (supplierApiDetailVO == null) { + // 供应商信息不存在 + throw new LuckException("供应商信息不存在"); + } + // 查询供应商账号信息(审核期间供应商有且仅有一个账号) + SupplierUserDTO supplierUserDTO = new SupplierUserDTO(); + supplierUserDTO.setSupplierId(supplierApiDetailVO.getSupplierId()); + List supplierUserVOList = supplierUserService.listBySupplierId(supplierUserDTO); + if (CollectionUtils.isEmpty(supplierUserVOList)) { + throw new LuckException("供应商账号不存在"); + } + SupplierUserVO supplierUserVO = supplierUserVOList.get(0); + // 修改供应商账号缓存信息 + SupplierDetail supplierDetail = BeanUtil.map(supplierApiDetailVO, SupplierDetail.class); + UidInfoBO uidInfoBO = new UidInfoBO(); + uidInfoBO.setUserId(supplierUserVO.getSupplierUserId()); + uidInfoBO.setUsername(supplierUserVO.getNickName()); + uidInfoBO.setSysType(SysTypeEnum.SUPPLIER.value()); + uidInfoBO.setTenantId(supplierAuditingDTO.getSupplierId()); + uidInfoBO.setIsAdmin(UserAdminType.ADMIN.value()); + // 审核不通过 + if (Objects.equals(supplierAuditingDTO.getStatus(), AuditStatus.FAILAUDIT.value())) { + if (!supplierAllinpayService.getIsAllinpay() || !Objects.equals(supplierApiDetailVO.getType(), SupplierType.SELF_SHOP.value())) { + supplierDetail.setSupplierStatus(SupplierStatus.APPLYING.value()); + } + } + // 审核通过 + else { + supplierDetail.setType(supplierAuditingDTO.getSupplierType()); + if (supplierAllinpayService.getIsAllinpay()) { + supplierDetail.setSupplierStatus(SupplierStatus.OPEN.value()); + } else { + handleContract(supplierDetail, supplierAuditingDTO.getContractStartTime(), supplierAuditingDTO.getContractEndTime(), now); + } + supplierDetail.setIsPreferred(IsPassShopEnum.NO.value()); + updateSupplierCompanyStatus(supplierDetail.getSupplierId(), AuditStatus.SUCCESSAUDIT.value()); + if (!supplierAllinpayService.getIsAllinpay()) { + uidInfoBO.setIsPassShop(IsPassShopEnum.NO.value()); + String uid = AuthUserContext.getUid(uidInfoBO); + uidInfoBO.setIsPassShop(IsPassShopEnum.YES.value()); + uidInfoBO.setSysType(SysTypeEnum.SUPPLIER.value()); + ServerResponseEntity updateTenantIdRes = accountFeignClient.updateNoAuditUidInfo(uidInfoBO); + if (!updateTenantIdRes.isSuccess()) { + throw new LuckException("审核失败"); + } + } + // 把商家自定义品牌添加为平台品牌 + brandFeignClient.updateCustomBrandToPlatformBrandByShopId(supplierAuditingDTO.getSupplierId(), SysTypeEnum.SUPPLIER.value()); + // 新店初始化事件 (分销设置(暂无)), 分销设置是平台统一设置,供应商暂无分销设置 + // 创建默认仓库 + warehouseFeignClient.createWarehouseByShopId(supplierAuditingDTO.getSupplierId(), SysTypeEnum.SUPPLIER.value(), supplierDetail.getContactPhone(), supplierDetail.getContactName()); + } + supplierAuditingDTO.setAuditorId(Objects.isNull(AuthUserContext.get()) ? null : AuthUserContext.get().getUserId()); + supplierAuditingService.update(BeanUtil.map(supplierAuditingDTO, SupplierAuditing.class)); + supplierDetailMapper.update(supplierDetail); + } + + private void handleContract(SupplierDetail supplierDetail, Date startTime, Date endTime, Date now) { + supplierDetail.setContractStartTime(DateUtil.beginOfDay(startTime)); + supplierDetail.setContractEndTime(Objects.isNull(endTime) ? endTime : getSaveEndOfDay(endTime)); + if (now.compareTo(supplierDetail.getContractStartTime()) >= 0 && (Objects.isNull(supplierDetail.getContractEndTime()) || now.compareTo(supplierDetail.getContractEndTime()) < 0)) { + // 如果供应商的签约时间包含当前时间,则把供应商状态置为营业中 + supplierDetail.setSupplierStatus(SupplierStatus.OPEN.value()); + } else { + // 如果供应商的签约时间不包含当前时间,则把供应商状态置为停业中 + supplierDetail.setSupplierStatus(SupplierStatus.STOP.value()); + } + } + + /** + * 更新供应商工商信息审核状态 + * @param supplierId + * @param status + */ + private void updateSupplierCompanyStatus(Long supplierId, Integer status) { + + SupplierCompanyVO supplierCompanyWaitAudit = supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierId, AuditStatus.WAITAUDIT.value()); + if (Objects.isNull(supplierCompanyWaitAudit)) { + throw new LuckException("缺少供应商工商资料"); + } + SupplierCompany supplierCompany = BeanUtil.map(supplierCompanyWaitAudit, SupplierCompany.class); + supplierCompany.setStatus(status); + supplierCompanyService.updateBySupplierId(supplierCompany, supplierId, 0); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void changeSpuStatus(Long supplierId, Integer supplierStatus) { + supplierDetailMapper.changeSupplierStatus(supplierId, supplierStatus); + // 供应商 + if (!StatusEnum.offlineOrDelete(supplierStatus)) { + return; + } + // 将该供应商所有的商品下线 + ServerResponseEntity spuResponse = spuFeignClient.offlineSpuByShopId(supplierId); + if (!Objects.equals(spuResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(spuResponse.getMsg()); + } + } + + @Override + @CacheEvict(cacheNames = CacheNames.SUPPLIER_DETAIL_ID_KEY, key = "#supplierId") + public void removeCacheBySupplierId(Long supplierId) { + } + + @Override + public SupplierDetailBO supplierExtensionData(Long supplierId) { + return supplierDetailMapper.supplierExtensionData(supplierId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void createSupplier(SupplierDetailDTO supplierDetailDTO) { + checkSupplierInfo(supplierDetailDTO, true); + SupplierDetail supplierDetail = BeanUtil.map(supplierDetailDTO, SupplierDetail.class); + // 赋默认值 + supplierDetail.setType(SupplierType.STOP.value()); + supplierDetail.setSupplierStatus(SupplierStatus.APPLYING.value()); + supplierDetailMapper.save(supplierDetail); + // 通联创建企业会员 + supplierAllinpayService.createAllinpayCompanyMember(supplierDetail.getSupplierId()); + // 创建供应商数据 + addSupplierInfo(supplierDetail.getSupplierId()); + + Long supplierUserId = AuthUserContext.get().getUserId(); + // 更新文件记录表中supplierId + ServerResponseEntity attachRes = attachFileFeignClient.updateShopIdByUid(supplierDetail.getSupplierId()); + if (!attachRes.isSuccess()) { + throw new LuckException(attachRes.getMsg()); + } + // 保存supplierId到供应商用户表 + if (supplierUserMapper.updateSupplierIdBySupplierUserId(supplierDetail.getSupplierId(), supplierUserId) != 1) { + throw new LuckException("保存供应商信息错误"); + } + // 保存supplierId到账号表 + UidInfoBO userInfoInTokenBO = AuthUserContext.get(); + userInfoInTokenBO.setTenantId(supplierDetail.getSupplierId()); + userInfoInTokenBO.setUserId(supplierUserId); + userInfoInTokenBO.setSysType(SysTypeEnum.SUPPLIER.value()); + ServerResponseEntity updateTenantIdRes = accountFeignClient.updateNoAuditUidInfo(userInfoInTokenBO); + if (!updateTenantIdRes.isSuccess()) { + throw new LuckException(updateTenantIdRes.getMsg()); + } + } + + @Override + public List getSupplierDetailBySupplierIdAndSupplierName(List supplierIds, String supplierName) { + return supplierDetailMapper.getSupplierDetailBySupplierIdAndSupplierName(supplierIds, supplierName); + } + + @Override + public SupplierApiDetailVO getShoExtensionsBySupplierId(Long supplierId) { + SupplierApiDetailVO extension = supplierDetailMapper.getShoExtensionsBySupplierId(supplierId); + // 通联是上线待审核的话供应商状态也做对应展示 + setAllinpaySupplierStatus(extension); + return extension; + } + + @Override + public Integer countByMobile(String mobile) { + return supplierDetailMapper.countByMobile(mobile); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.SUPPLIER_DETAIL_ID_KEY, key = "#supplierApiDetailVO.supplierId") + @GlobalTransactional(rollbackFor = Exception.class) + public void offline(SupplierApiDetailVO supplierApiDetailVO, String offlineReason, Long sysUserId) { + Integer sysType = SysTypeEnum.SUPPLIER.value(); + // 添加下线处理记录 + OfflineHandleEventDTO offlineHandleEventDTO = new OfflineHandleEventDTO(); + offlineHandleEventDTO.setHandleId(supplierApiDetailVO.getSupplierId()); + offlineHandleEventDTO.setHandleType(OfflineHandleEventType.SHOP.getValue()); + offlineHandleEventDTO.setOfflineReason(offlineReason); + offlineHandleEventDTO.setHandlerId(sysUserId); + offlineHandleEventDTO.setSysType(sysType); + offlineHandleEventDTO.setStatus(supplierAllinpayService.getIsAllinpay() ? OfflineHandleEventStatus.APPLY_BY_SHOP.getValue() : OfflineHandleEventStatus.OFFLINE_BY_PLATFORM.getValue()); + offlineHandleEventDTO.setShopId(supplierApiDetailVO.getSupplierId()); + ServerResponseEntity processingEventByHandleTypeAndHandleId = offlineHandleEventFeignClient.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.SHOP.getValue(), supplierApiDetailVO.getSupplierId(), sysType); + if (processingEventByHandleTypeAndHandleId.isSuccess() && Objects.nonNull(processingEventByHandleTypeAndHandleId.getData())) { + offlineHandleEventFeignClient.update(offlineHandleEventDTO); + } else { + offlineHandleEventFeignClient.save(offlineHandleEventDTO); + } + // 更新供应商状态为下线 + supplierDetailMapper.changeSupplierStatus(supplierApiDetailVO.getSupplierId(), SupplierStatus.OFFLINE.value()); + + // 将供应商所有商品下线 + ServerResponseEntity spuResponseEntity = spuFeignClient.offlineSpuBySupplierId(supplierApiDetailVO.getSupplierId()); + if (!spuResponseEntity.isSuccess()) { + throw new LuckException(spuResponseEntity); + } + } + + @Override + public Long countBySupplierStatus(Long supplierStatus) { + return supplierDetailMapper.countBySupplierStatus(supplierStatus); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void platformCreateSupplier(SupplierCreateInfoDTO supplierCreateInfoDTO) { + boolean isAllinpay = supplierAllinpayService.getIsAllinpay(); + SupplierUserRegisterDTO supplierUserRegisterInfo = supplierCreateInfoDTO.getSupplierUserRegisterInfo(); + // 1、校验验证码信息 + ServerResponseEntity sendNotifyResponse = notifyFeignClient.checkValidCode(supplierUserRegisterInfo.getMobile(), supplierUserRegisterInfo.getValidCode(), SendTypeEnum.VALID); + Boolean data = sendNotifyResponse.getData(); + if (Objects.equals(sendNotifyResponse.getCode(), ResponseEnum.OK.value()) && Objects.nonNull(data) && !data) { + throw new LuckException("供应商验证码有误或已过期"); + } + // 2、保存供应商基本信息 + Date now = new Date(); + SupplierDetailDTO supplierDetailDTO = supplierCreateInfoDTO.getSupplierDetail(); + this.checkSupplierInfo(supplierDetailDTO, true); + SupplierDetail supplierDetail = saveAndGetSupplierDetail(isAllinpay, now, supplierDetailDTO); + // 通联创建企业会员 + supplierAllinpayService.createAllinpayCompanyMember(supplierDetail.getSupplierId()); + Long supplierId = supplierDetail.getSupplierId(); + // 3、保存供应商账号信息 + SupplierUser supplierUser = new SupplierUser(); + supplierUser.setNickName(supplierUserRegisterInfo.getUsername()); + supplierUser.setPhoneNum(supplierUserRegisterInfo.getMobile()); + supplierUser.setHasAccount(1); + supplierUser.setSupplierId(supplierId); + supplierUserService.save(supplierUser, null); + // 4、初始化供应商数据 + addSupplierInfo(supplierId); + // 5、初始化供应商审核信息,平台端创建供应商默认为审核成功 + SupplierAuditing supplierAuditing = new SupplierAuditing(); + supplierAuditing.setSupplierId(supplierId); + supplierAuditing.setUserId(supplierUser.getSupplierUserId()); + supplierAuditing.setAuditorId(AuthUserContext.get().getUserId()); + supplierAuditing.setStatus(isAllinpay ? AuditStatus.WAITAUDIT.value() : AuditStatus.SUCCESSAUDIT.value()); + supplierAuditingService.save(supplierAuditing); + // 6、保存供应商工商信息 + SupplierCompanyDTO supplierCompanyDTO = supplierCreateInfoDTO.getSupplierCompany(); + supplierCompanyDTO.setSupplierId(supplierDetail.getSupplierId()); + SupplierCompany supplierCompany = BeanUtil.map(supplierCompanyDTO, SupplierCompany.class); + supplierCompany.setStatus(isAllinpay ? AuditStatus.WAITAUDIT.value() : AuditStatus.SUCCESSAUDIT.value()); + supplierCompanyService.save(supplierCompany, true); + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setPhone(supplierUserRegisterInfo.getMobile()); + authAccountDTO.setIsAdmin(UserAdminType.ADMIN.value()); + authAccountDTO.setUsername(supplierUserRegisterInfo.getUsername()); + authAccountDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + authAccountDTO.setStatus(StatusEnum.ENABLE.value()); + authAccountDTO.setTenantId(supplierId); + authAccountDTO.setUserId(supplierUser.getSupplierUserId()); + authAccountDTO.setPassword(supplierUserRegisterInfo.getPassword()); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setIsPassShop(isAllinpay ? IsPassShopEnum.NO.value() : IsPassShopEnum.YES.value()); + ServerResponseEntity save = accountFeignClient.save(authAccountDTO); + if (!Objects.equals(save.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(save.getMsg()); + } + // 8、保存分类签约信息 + ServerResponseEntity categoryRes = categoryShopFeignClient.insertBatchByShopId(supplierCreateInfoDTO.getCategorySigningList(), supplierId, SysTypeEnum.SUPPLIER.value()); + if (!categoryRes.isSuccess()) { + throw new LuckException(categoryRes.getMsg()); + } + // 9、保存品牌签约信息 + ServerResponseEntity brandRes = brandSupplierFeignClient.insertBatchByShopId(supplierCreateInfoDTO.getBrandSigningList(), supplierId, SysTypeEnum.SUPPLIER.value()); + if (!brandRes.isSuccess()) { + throw new LuckException(brandRes.getMsg()); + } + // 7、保存供应商银行卡信息 + saveSupplierBankCard(supplierCreateInfoDTO, isAllinpay, supplierId, supplierCompany); + + // 10、保存仓库信息 + ServerResponseEntity warehouseRes = warehouseFeignClient.createWarehouseByShopId(supplierId, SysTypeEnum.SUPPLIER.value(), supplierDetailDTO.getContactPhone(), supplierDetailDTO.getContactName()); + if (!warehouseRes.isSuccess()) { + throw new LuckException(warehouseRes.getMsg()); + } + } + + private void saveSupplierBankCard(SupplierCreateInfoDTO supplierCreateInfoDTO, boolean isAllinpay, Long supplierId, SupplierCompany supplierCompany) { + if (isAllinpay) { + AllinpaySupplierBankCardDTO allinpaySupplierBankCardDTO = supplierCreateInfoDTO.getAllinpaySupplierBankCardDTO(); + if (Objects.isNull(allinpaySupplierBankCardDTO)) { + throw new LuckException("至少绑定一个对公户账户"); + } + // 保存数据到数据库 + supplierBankCardService.insertAndSetCompanyInfo(allinpaySupplierBankCardDTO, supplierId, BeanUtil.map(supplierCompany, SupplierCompanyVO.class)); + } else { + supplierBankCardService.insertBatch(supplierCreateInfoDTO.getSupplierBankCardList(), supplierId); + } + } + + private SupplierDetail saveAndGetSupplierDetail(boolean isAllinpay, Date now, SupplierDetailDTO supplierDetailDTO) { + SupplierDetail supplierDetail = BeanUtil.map(supplierDetailDTO, SupplierDetail.class); + if (!isAllinpay) { + if (Objects.isNull(supplierDetail.getContractStartTime())) { + throw new LuckException("供应商签约时间不能为空"); + } + handleContract(supplierDetail, supplierDetail.getContractStartTime(), supplierDetail.getContractEndTime(), now); + } else { + supplierDetail.setSupplierStatus(SupplierStatus.OPEN.value()); + } + supplierDetail.setIsPreferred(IsPassShopEnum.NO.value()); + supplierDetail.setType(SupplierType.SELF_SHOP.value()); + supplierDetailMapper.save(supplierDetail); + return supplierDetail; + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void changeSupplierStatusByContractTime(Date now) { + // 获取状态需要改变为停业状态的供应商id列表 + List supplierIdsToStop = supplierDetailMapper.listSupplierIdsOfStatusChangeToStopByContractTime(now); + // 获取状态需要改变为营业状态的供应商id列表 + List supplierIdsToOpen = supplierDetailMapper.listSupplierIdsOfStatusChangeToOpenByContractTime(now); + if (CollUtil.isEmpty(supplierIdsToStop) && CollUtil.isEmpty(supplierIdsToOpen)) { + // 没有供应商状态需要改变 + return; + } + // 根据签约时间修改供应商状态 + supplierDetailMapper.changeSupplierStatusByContractTime(now); + if (CollUtil.isNotEmpty(supplierIdsToStop)) { + // 失效商品活动信息,不需要下架商品 + spuFeignClient.offlineSpuActivityByShopIds(supplierIdsToStop); + //供应商为停业状态,下架供应商商品 + spuFeignClient.batchChangeSpuStatusToDisableBySupplierIds(supplierIdsToStop); + } + // 状态发生变化的供应商id列表 + List changeSupplierIds = CollUtil.unionAll(supplierIdsToStop, supplierIdsToOpen); + // 清除状态发生变化的供应商缓存信息 + List keyList = new ArrayList<>(Constant.INITIAL_CAPACITY); + changeSupplierIds.forEach(supplierId -> keyList.add(CacheNames.SUPPLIER_DETAIL_ID_KEY + CacheNames.UNION + supplierId)); + if (CollUtil.isNotEmpty(keyList)) { + RedisUtil.deleteBatch(keyList); + } + // 更新供应商下的商品更新时间(用于刷新商品在es的appDisplay) + ServerResponseEntity spuRes = spuFeignClient.updateSpuUpdateTimeByShopIds(changeSupplierIds, SysTypeEnum.SUPPLIER.value()); + if (!spuRes.isSuccess()) { + throw new LuckException(spuRes.getMsg()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.SUPPLIER_DETAIL_ID_KEY, key = "#supplierSigningInfoDTO.supplierId") + public void updateSigningInfo(SupplierSigningInfoDTO supplierSigningInfoDTO) { + SupplierApiDetailVO oldSupplierDetail = supplierDetailMapper.getBySupplierId(supplierSigningInfoDTO.getSupplierId()); + SupplierDetail newSupplierDetail = BeanUtil.map(oldSupplierDetail, SupplierDetail.class); + // 赋值 + newSupplierDetail.setType(supplierSigningInfoDTO.getType()); + newSupplierDetail.setContractStartTime(DateUtil.beginOfDay(supplierSigningInfoDTO.getContractStartTime())); + newSupplierDetail.setContractEndTime(Objects.isNull(supplierSigningInfoDTO.getContractEndTime()) ? null : getSaveEndOfDay(supplierSigningInfoDTO.getContractEndTime())); + // 当供应商状态处于营业中或者停业中时,供应商状态会受签约时间改变 + if (Objects.equals(newSupplierDetail.getSupplierStatus(), SupplierStatus.OPEN.value()) || Objects.equals(newSupplierDetail.getSupplierStatus(), SupplierStatus.STOP.value())) { + Date now = new Date(); + // 记录供应商状态是否发生改变 + boolean isChangeStatus = false; + boolean isContain = now.compareTo(newSupplierDetail.getContractStartTime()) >= 0 && (Objects.isNull(newSupplierDetail.getContractEndTime()) || now.compareTo(newSupplierDetail.getContractEndTime()) < 0); + if (isContain || supplierAllinpayService.getIsAllinpay()) { + // 如果供应商的签约时间包含当前时间,则把供应商状态置为营业中 + isChangeStatus = Objects.equals(oldSupplierDetail.getSupplierStatus(), SupplierStatus.STOP.value()); + newSupplierDetail.setSupplierStatus(SupplierStatus.OPEN.value()); + supplierDetailMapper.update(newSupplierDetail); + ServerResponseEntity spuRes = spuFeignClient.updateSpuUpdateTimeByShopIds(Collections.singletonList(supplierSigningInfoDTO.getSupplierId()), SysTypeEnum.SUPPLIER.value()); + if (!spuRes.isSuccess()) { + throw new LuckException(spuRes.getMsg()); + } + } else if (now.compareTo(newSupplierDetail.getContractStartTime()) < 0 || now.compareTo(newSupplierDetail.getContractEndTime()) >= 0) { + // 如果供应商的签约时间不包含当前时间,则把供应商状态置为停业中 + isChangeStatus = Objects.equals(oldSupplierDetail.getSupplierStatus(), SupplierStatus.OPEN.value()); + newSupplierDetail.setSupplierStatus(SupplierStatus.STOP.value()); + supplierDetailMapper.update(newSupplierDetail); + } + // 供应商商品不能参加活动,不需要进行以下处理 + +// // 如果供应商状态发生变化 + if (isChangeStatus) { + // 更新购物车项供应商是否停业状态 + if (Objects.equals(oldSupplierDetail.getSupplierStatus(), SupplierStatus.OPEN.value())) { + // 供应商营业状态变为停业,需要下架供应商商品 + ServerResponseEntity toDisableRes = spuFeignClient.batchChangeSpuStatusToDisableBySupplierIds(Collections.singletonList(newSupplierDetail.getSupplierId())); + if (!toDisableRes.isSuccess()) { + throw new LuckException(toDisableRes.getMsg()); + } + } + } + } + //解绑平台轮播图商品 +// offlineIndexImg(newSupplierDetail.getSupplierId()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.SUPPLIER_DETAIL_ID_KEY, key = "#offlineHandleEventDTO.handleId") + public void auditApply(OfflineHandleEventDTO offlineHandleEventDTO) { + SupplierApiDetailVO supplierApiDetailVO = getBySupplierId(offlineHandleEventDTO.getHandleId()); + if (Objects.isNull(supplierApiDetailVO)) { + throw new LuckException("供应商不存在"); + } + if (!Objects.equals(supplierApiDetailVO.getSupplierStatus(), SupplierStatus.OFFLINE.value())) { + throw new LuckException("供应商状态已发生变化,请刷新后重试"); + } + // 更新事件状态 + ServerResponseEntity offlineRes = offlineHandleEventFeignClient.updateToApply(offlineHandleEventDTO); + if (!offlineRes.isSuccess()) { + throw new LuckException(offlineRes.getMsg()); + } + // 更改供应商状态为上线申请待审核 + supplierDetailMapper.changeSupplierStatus(offlineHandleEventDTO.getHandleId(), SupplierStatus.OFFLINE_AWAIT_AUDIT.value()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.SUPPLIER_DETAIL_ID_KEY, key = "#offlineHandleEventDTO.handleId") + public void onlineAudit(OfflineHandleEventDTO offlineHandleEventDTO) { + SupplierApiDetailVO supplierDetail = getBySupplierId(offlineHandleEventDTO.getHandleId()); + if (Objects.isNull(supplierDetail)) { + throw new LuckException("供应商不存在"); + } + if (!Objects.equals(supplierDetail.getSupplierStatus(), SupplierStatus.OFFLINE_AWAIT_AUDIT.value())) { + throw new LuckException("供应商状态已发生变化,请刷新后重试"); + } + // 审核 + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.auditOfflineEvent(offlineHandleEventDTO); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + Date now = new Date(); + Long supplierId = offlineHandleEventDTO.getHandleId(); + // 审核通过 + if (Objects.equals(offlineHandleEventDTO.getStatus(), OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue())) { + auditSuccess(supplierDetail, now, supplierId); + } + // 审核不通过 + else if (Objects.equals(offlineHandleEventDTO.getStatus(), OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue())) { + supplierDetailMapper.changeSupplierStatus(supplierId, SupplierStatus.OFFLINE.value()); + } + } + + private void auditSuccess(SupplierApiDetailVO supplierDetail, Date now, Long supplierId) { + if (supplierAllinpayService.getIsAllinpay()) { + supplierDetailMapper.changeSupplierStatus(supplierId, SupplierStatus.OPEN.value()); + spuFeignClient.updateSpuUpdateTimeByShopIds(Collections.singletonList(supplierId), SysTypeEnum.SUPPLIER.value()); + return; + } + if (now.compareTo(supplierDetail.getContractStartTime()) >= 0 && (Objects.isNull(supplierDetail.getContractEndTime()) || now.compareTo(supplierDetail.getContractEndTime()) < 0)) { + // 如果供应商的签约时间包含当前时间,则把供应商状态置为营业中 + supplierDetailMapper.changeSupplierStatus(supplierId, SupplierStatus.OPEN.value()); + } else { + // 如果供应商的签约时间不包含当前时间,则把供应商状态置为停业中 + supplierDetailMapper.changeSupplierStatus(supplierId, SupplierStatus.STOP.value()); + } + spuFeignClient.updateSpuUpdateTimeByShopIds(Collections.singletonList(supplierId), SysTypeEnum.SUPPLIER.value()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.SUPPLIER_DETAIL_ID_KEY, key = "#offlineHandleEventDTO.handleId") + public void onlineOpenSupplier(OfflineHandleEventDTO offlineHandleEventDTO) { + if (!supplierAllinpayService.getIsAllinpay()) { + throw new LuckException("开通通联支付后才可以直接上线供应商"); + } + SupplierDetailService supplierDetailService = (SupplierDetailService) AopContext.currentProxy(); + SupplierApiDetailVO supplierDetail = supplierDetailService.getBySupplierId(offlineHandleEventDTO.getHandleId()); + if (Objects.isNull(supplierDetail)) { + throw new LuckException("供应商不存在"); + } + if (!Objects.equals(supplierDetail.getSupplierStatus(), ShopStatus.OFFLINE_AWAIT_AUDIT.value()) && !Objects.equals(supplierDetail.getSupplierStatus(), ShopStatus.OFFLINE.value())) { + throw new LuckException("供应商状态已发生变化,请刷新后重试"); + } + // 审核 + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.auditOfflineEvent(offlineHandleEventDTO); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + // 审核通过 + auditSuccess(supplierDetail, new Date(), offlineHandleEventDTO.getHandleId()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createAllinpayMemberBySupplierId(Long supplierId) { + // 该方法通联独有 + if (!supplierAllinpayService.getIsAllinpay()) { + return; + } + // 确保供应商还没有创建 + SupplierApiDetailVO supplierDetail = supplierDetailMapper.getSupplierBySupplierId(supplierId); + if (Objects.equals(supplierDetail.getIsCreateMember(), 1)) { + return; + } + supplierDetailMapper.updateSupplierIsCreate(Collections.singletonList(supplierId)); + Integer supplierStatus = supplierDetail.getSupplierStatus(); + if (Objects.equals(supplierStatus, ShopStatus.OPEN.value()) + || Objects.equals(supplierStatus, ShopStatus.STOP.value()) + || Objects.equals(supplierStatus, ShopStatus.OFFLINE.value()) + || Objects.equals(supplierStatus, ShopStatus.OFFLINE_AWAIT_AUDIT.value())) { + // 已经开店的 + // 更新供应商信息并且将对应供应商的通联商家改完平台下线,等绑定了手机,设置了企业信息,影印件审核通过后,通联审核通过即可恢复原状态 + supplierDetailMapper.updateSupplierToStop(Collections.singletonList(supplierId)); + } else if (Objects.equals(supplierStatus, ShopStatus.OPEN_AWAIT_AUDIT.value())) { + // 提交开店申请的 + // 找出已经提交申请的供应商的审核信息给予驳回,然后更改状态为申请中 + supplierDetailMapper.updateSupplierToApplying(Collections.singletonList(supplierId)); + supplierAuditingService.updateToFail(Collections.singletonList(supplierId)); + } + SupplierCompanyAuditingVO companyAuditingVO = supplierCompanyAuditingMapper.getLatestAuditingBySupplierId(supplierId); + if (Objects.nonNull(companyAuditingVO)) { + if (Objects.equals(companyAuditingVO.getStatus(), AuditStatus.WAITAUDIT.value())) { + // 修改工商信息的 + // 给予驳回,更改最后成功的工商信息为待审核 + companyAuditingVO.setRemarks("通联信息待完善"); + companyAuditingVO.setStatus(AuditStatus.FAILAUDIT.value()); + supplierCompanyAuditingMapper.update(BeanUtil.map(companyAuditingVO, SupplierCompanyAuditing.class)); + // 把对应的工商信息设置为审核未通过状态 + SupplierCompany supplierCompany = new SupplierCompany(); + supplierCompany.setStatus(AuditStatus.FAILAUDIT.value()); + supplierCompany.setSupplierCompanyId(companyAuditingVO.getSupplierCompanyId()); + supplierCompanyService.updateById(supplierCompany); + } + } + // 修改供应商成功的工商信息为待审核 + supplierCompanyService.batchUpdateStatus(supplierId, AuditStatus.WAITAUDIT.value(), AuditStatus.SUCCESSAUDIT.value()); + + // 给供应商新增一个通联的钱包 + saveSupplierWallet(supplierId, true); + // 删除供应商的银行卡,需要重新绑定 + supplierBankCardService.deleteBySupplierId(supplierId); + // 将该供应商所有的商品下线 + ServerResponseEntity spuResponse = spuFeignClient.offlineSpuByShopId(supplierId); + if (!Objects.equals(spuResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(spuResponse.getMsg()); + } + // 创建会员 + ServerResponseEntity response = allinpayFeignClient.batchCreateMember(Collections.singletonList(AllinpayConstant.SUPPLIER + supplierId)); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + + @Override + public List listSimple(SupplierSimpleBO supplierSimpleBO) { + return supplierDetailMapper.listSimple(supplierSimpleBO); + } + + @Override + public Boolean checkSupplierName(String supplierName) { + return supplierDetailMapper.countSupplierName(supplierName, null) > 0; + } + + @Override + public List getSupplierIdBySupplierStatus(Integer supplierStatus) { + return supplierDetailMapper.getSupplierIdsBySupplierStatus(supplierStatus); + } + + @Override + public PageVO pageSupplier(PageDTO pageDTO, SupplierDetailDTO supplierDetailDTO, Long shopId) { + supplierDetailDTO.setPaySysType(supplierAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value()); + //商家端 只显示有相同分类的供应商 + if (Objects.equals(supplierDetailDTO.getSysType(), SysTypeEnum.MULTISHOP.value())) { + ServerResponseEntity> idsResp = categoryShopFeignClient.getSupplierIdsByShopId(shopId); + if (!idsResp.isSuccess()) { + throw new LuckException(idsResp); + } + if (CollectionUtil.isEmpty(idsResp.getData())) { + PageVO pageVO = new PageVO<>(); + pageVO.setList(new ArrayList<>(Constant.INITIAL_CAPACITY)); + pageVO.setTotal(0L); + pageVO.setPages(0); + return pageVO; + } + return PageUtil.doPage(pageDTO, () -> supplierDetailMapper.listSupplierDetail(supplierDetailDTO, idsResp.getData())); + } + //平台端 显示全部供应商 + return PageUtil.doPage(pageDTO, () -> supplierDetailMapper.listSupplierDetail(supplierDetailDTO, null)); + + } + + @Override + public List listSupplierByShopId(SupplierDetailDTO supplierDetailDTO, Long shopId) { + //商家端 只显示有相同分类的供应商 + ServerResponseEntity> supplierIdsResp = categoryShopFeignClient.getSupplierIdsByShopId(shopId); + if (!supplierIdsResp.isSuccess()) { + throw new LuckException(supplierIdsResp); + } + if (CollUtil.isEmpty(supplierIdsResp.getData())) { + return new ArrayList<>(0); + } + return supplierDetailMapper.listSupplierDetail(supplierDetailDTO, supplierIdsResp.getData()); + + } + + @Override + public List listSupplierDetailBySupplierIds(List supplierIds) { + if (CollUtil.isEmpty(supplierIds)) { + return new ArrayList<>(0); + } + return supplierDetailMapper.listSupplierDetailBySupplierIds(supplierIds); + } + + @Override + public void createAllinpayMember() { + List supplierIds = supplierDetailMapper.listUnCreateMemberSupplierIds(); + if (CollUtil.isEmpty(supplierIds)) { + return; + } + + supplierDetailMapper.updateSupplierIsCreate(supplierIds); + // 已经开店的 + // 更新供应商信息并且将对应供应商的通联商家改完平台下线,等绑定了手机,设置了企业信息,影印件审核通过后,通联审核通过即可恢复原状态 + supplierDetailMapper.updateSupplierToStop(supplierIds); + // 提交开店申请的 + // 找出已经提交申请的商家的审核信息给予驳回,然后更改状态为申请中 + supplierDetailMapper.updateSupplierToApplying(supplierIds); + supplierAuditingService.updateToFail(supplierIds); + + // 修改工商信息的 + // 给予驳回,更改最后成功的工商信息为待审核 + List needAuditList = supplierCompanyAuditingMapper.getNeedAuditList(); + if (CollUtil.isNotEmpty(needAuditList)) { + for (SupplierCompanyAuditingVO companyAuditing : needAuditList) { + companyAuditing.setStatus(AuditStatus.FAILAUDIT.value()); + companyAuditing.setRemarks("通联信息待完善"); + supplierCompanyAuditingMapper.update(BeanUtil.map(companyAuditing, SupplierCompanyAuditing.class)); + // 把对应的工商信息设置为审核未通过状态 + SupplierCompany shopCompany = new SupplierCompany(); + shopCompany.setSupplierCompanyId(companyAuditing.getSupplierCompanyId()); + shopCompany.setStatus(AuditStatus.FAILAUDIT.value()); + supplierCompanyService.updateById(shopCompany); + } + } + supplierCompanyService.updateStatusToWaitAudit(); + // 给所有商家都新增一个通联的钱包 + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long supplierId : supplierIds) { + saveSupplierWallet(supplierId, true); + // 删除商家的银行卡,需要重新绑定 + supplierBankCardService.deleteBySupplierId(supplierId); + // 将该供应商所有的商品下线 + ServerResponseEntity spuResponse = spuFeignClient.offlineSpuByShopId(supplierId); + if (!Objects.equals(spuResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(spuResponse.getMsg()); + } + keys.add(CacheNames.SUPPLIER_DETAIL_ID_KEY + CacheNames.UNION + supplierId); + } + RedisUtil.del(keys); + + List bizUserIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long supplierId : supplierIds) { + bizUserIds.add(AllinpayConstant.SUPPLIER + supplierId); + } + // 批量创建会员 + ServerResponseEntity response = allinpayFeignClient.batchCreateMember(bizUserIds); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateAllinpayIdCardStatus(String bizUserId, Integer status) { + Long supplierId = Long.valueOf(bizUserId.substring(AllinpayConstant.SUPPLIER_LENGTH)); + log.info("供应商{}影印件更新,影印件状态为{}", supplierId, Objects.requireNonNull(IdCardCollectProcessStatus.instance(status)).str()); + supplierBankCardService.updateSupplierAllinpayStatusToSuccess(supplierId); + supplierDetailMapper.updateAllinpayIdCardStatus(supplierId, status); + // 如果审核都通过,将对应供应商上线 + if (!Objects.equals(status, IdCardCollectProcessStatus.ALL.value())) { + log.info("供应商{}影印件更新,影印件状态为{},未全部通过审核", supplierId, Objects.requireNonNull(IdCardCollectProcessStatus.instance(status)).str()); + return; + } + supplierDetailMapper.updateSupplierToOpen(supplierId); + SupplierAuditingVO supplierAuditing = supplierAuditingService.getBySupplierId(supplierId); + if (!Objects.equals(supplierAuditing.getStatus(), AuditStatus.SUCCESSAUDIT.value())) { + log.info("供应商{}影印件更新,全部通过审核,进行开店回调,自动审核供应商", supplierId); + // 审核还没成功代表这是开店的回调 + SupplierAuditingDTO supplierAuditingDTO = BeanUtil.map(supplierAuditing, SupplierAuditingDTO.class); + supplierAuditingDTO.setStatus(AuditStatus.SUCCESSAUDIT.value()); + // 自动审核供应商 + audit(supplierAuditingDTO); + } else { + log.info("供应商{}影印件更新,全部通过审核,进行修改工商信息回调,自动审核工商信息", supplierId); + // 修改工商信息回调 + SupplierCompanyAuditingVO companyAuditing = supplierCompanyAuditingMapper.getLatestAuditingBySupplierId(supplierId); + if (Objects.isNull(companyAuditing)) { + log.error("影印件回调,工商审核信息不存在{}", bizUserId); + return; + } + if (Objects.equals(companyAuditing.getStatus(), AuditStatus.WAITAUDIT.value())) { + log.info("供应商{}影印件更新,全部通过审核,进行修改工商信息回调,工商信息为待审核状态", supplierId); + companyAuditing.setStatus(AuditStatus.SUCCESSAUDIT.value()); + supplierCompanyAuditingMapper.update(BeanUtil.map(companyAuditing, SupplierCompanyAuditing.class)); + + supplierCompanyService.batchUpdateStatus(companyAuditing.getSupplierId(), AuditStatus.FAILAUDIT.value(), null); + // 把对应的工商信息设置为启用状态 + SupplierCompany shopCompany = new SupplierCompany(); + shopCompany.setSupplierCompanyId(companyAuditing.getSupplierCompanyId()); + shopCompany.setStatus(AuditStatus.SUCCESSAUDIT.value()); + supplierCompanyService.updateById(shopCompany); + } else if (Objects.equals(companyAuditing.getStatus(), AuditStatus.FAILAUDIT.value())) { + log.info("供应商{}影印件更新,全部通过审核,进行修改工商信息回调,工商信息为失败状态", supplierId); + // 审核不通过的工商信息删了 + supplierCompanyService.deleteBySupplierIdAndStatus(supplierId, AuditStatus.FAILAUDIT.value()); + } + } + } + + @Override + public List listSupplierIds() { + return supplierDetailMapper.listSupplierIds(); + } + + private void saveSupplierWallet(Long supplierId, boolean isAllinpay) { + SupplierWallet supplierWallet = new SupplierWallet(); + supplierWallet.setVersion(0L); + supplierWallet.setUnsettledAmount(0L); + supplierWallet.setSettledAmount(0L); + supplierWallet.setFreezeAmount(0L); + supplierWallet.setTotalSettledAmount(0L); + supplierWallet.setSupplierId(supplierId); + supplierWallet.setPaySysType(isAllinpay ? 1 : 0); + supplierWalletMapper.save(supplierWallet); + } + + /** + * 添加供应商钱包 + * @param supplierId + * @return + */ + public void addSupplierInfo(Long supplierId) { + SupplierExtension supplierExtension = new SupplierExtension(); + supplierExtension.setSupplierId(supplierId); + supplierExtensionService.save(supplierExtension); + + saveSupplierWallet(supplierId, supplierAllinpayService.getIsAllinpay()); + } + + /** + * 检验供应商信息是否正确 + * @param supplierDetailDTO 供应商基本信息 + * @param isCreate true: 创建时校验, false: 更新时校验 + */ + private void checkSupplierInfo(SupplierDetailDTO supplierDetailDTO, Boolean isCreate) { + if (!isCreate) { + SupplierAuditingVO supplierAuditingVO = supplierAuditingService.getBySupplierId(supplierDetailDTO.getSupplierId()); + if (Objects.nonNull(supplierAuditingVO) && Objects.equals(supplierAuditingVO.getStatus(), AuditStatus.WAITAUDIT.value())) { + throw new LuckException("供应商处于待审核状态无法修改信息"); + } + } + // 供应商供应商名称 + if (StrUtil.isNotBlank(supplierDetailDTO.getSupplierName())) { + supplierDetailDTO.setSupplierName(supplierDetailDTO.getSupplierName().trim()); + } + if (supplierDetailMapper.countSupplierName(supplierDetailDTO.getSupplierName(), supplierDetailDTO.getSupplierId()) > 0) { + throw new LuckException("供应商名称已存在"); + } + if (!isCreate) { + // 更新供应商基本信息不用校验用户信息 + return; + } + if (StrUtil.isNotBlank(supplierDetailDTO.getContactPhone())) { + supplierDetailDTO.setPhone(supplierDetailDTO.getContactPhone().trim()); + } + } + + /** + * 创建供应商初始账号 + * @param supplierDetailDTO + * @param statusEnum + */ + public void createSupplierAccount(SupplierDetailDTO supplierDetailDTO, StatusEnum statusEnum) { + SupplierUser supplierUser = new SupplierUser(); + supplierUser.setSupplierId(supplierDetailDTO.getSupplierId()); + supplierUser.setHasAccount(1); + supplierUser.setNickName(supplierDetailDTO.getUsername()); + supplierUserService.save(supplierUser, null); + + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setPhone(supplierDetailDTO.getPhone()); + authAccountDTO.setUsername(supplierDetailDTO.getUsername()); + authAccountDTO.setPassword(supplierDetailDTO.getPassword().trim()); + authAccountDTO.setStatus(statusEnum.value()); + authAccountDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setTenantId(supplierDetailDTO.getSupplierId()); + authAccountDTO.setUserId(supplierUser.getSupplierUserId()); + authAccountDTO.setIsAdmin(UserAdminType.ADMIN.value()); + ServerResponseEntity save = accountFeignClient.save(authAccountDTO); + if (!Objects.equals(save.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(save.getMsg()); + } + } + + private Date getSaveEndOfDay(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(DateUtil.endOfDay(date)); + // 防止时间进位 + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierUserAccountServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierUserAccountServiceImpl.java new file mode 100644 index 0000000..91ba3d7 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierUserAccountServiceImpl.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service.impl; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.common.constant.IsPassShopEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.supplier.dto.ChangeAccountDTO; +import com.tmerclub.cloud.supplier.mapper.SupplierUserMapper; +import com.tmerclub.cloud.supplier.model.SupplierUser; +import com.tmerclub.cloud.supplier.service.SupplierUserAccountService; +import io.seata.spring.annotation.GlobalTransactional; +import jakarta.annotation.Resource; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author FrozenWatermelon + * @date 2020/09/03 + */ +@Service +public class SupplierUserAccountServiceImpl implements SupplierUserAccountService { + + @Resource + private SupplierUserMapper supplierUserMapper; + @DubboReference + private AccountFeignClient accountFeignClient; + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity save(ChangeAccountDTO changeAccountDTO) { + AuthAccountDTO authAccountDTO = getAuthAccountDTO(changeAccountDTO); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setIsAdmin(0); + authAccountDTO.setIsPassShop(IsPassShopEnum.YES.value()); + // 保存 + ServerResponseEntity serverResponseEntity = accountFeignClient.save(authAccountDTO); + if (!serverResponseEntity.isSuccess()) { + return ServerResponseEntity.transform(serverResponseEntity); + } + SupplierUser supplierUser = new SupplierUser(); + supplierUser.setSupplierUserId(changeAccountDTO.getUserId()); + supplierUser.setHasAccount(1); + supplierUser.setSupplierId(AuthUserContext.get().getTenantId()); + supplierUserMapper.update(supplierUser); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity update(ChangeAccountDTO changeAccountDTO) { + + AuthAccountDTO authAccountDTO = getAuthAccountDTO(changeAccountDTO); + // 更新,不涉及分布式事务 + ServerResponseEntity serverResponseEntity = accountFeignClient.update(authAccountDTO); + if (!serverResponseEntity.isSuccess()) { + return serverResponseEntity; + } + + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity getByUserIdAndSysType(Long userId, Integer sysType) { + return accountFeignClient.getByUserIdAndSysType(userId, sysType); + } + + private AuthAccountDTO getAuthAccountDTO(ChangeAccountDTO changeAccountDTO) { + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + UidInfoBO uidInfoBO = AuthUserContext.get(); + authAccountDTO.setPassword(changeAccountDTO.getPassword()); + authAccountDTO.setUsername(changeAccountDTO.getUsername()); + authAccountDTO.setStatus(changeAccountDTO.getStatus()); + authAccountDTO.setSysType(uidInfoBO.getSysType()); + authAccountDTO.setTenantId(uidInfoBO.getTenantId()); + authAccountDTO.setUserId(changeAccountDTO.getUserId()); + authAccountDTO.setEmail(changeAccountDTO.getEmail()); + authAccountDTO.setPhone(changeAccountDTO.getPhone()); + return authAccountDTO; + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierUserServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierUserServiceImpl.java new file mode 100644 index 0000000..546eceb --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierUserServiceImpl.java @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.PhoneUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.rbac.dto.UserRoleDTO; +import com.tmerclub.cloud.api.rbac.feign.UserRoleFeignClient; +import com.tmerclub.cloud.common.constant.*; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.supplier.dto.SupplierUserDTO; +import com.tmerclub.cloud.supplier.dto.SupplierUserRegisterDTO; +import com.tmerclub.cloud.supplier.mapper.SupplierUserMapper; +import com.tmerclub.cloud.supplier.model.SupplierUser; +import com.tmerclub.cloud.supplier.service.SupplierUserService; +import com.tmerclub.cloud.supplier.vo.SupplierUserVO; +import io.seata.spring.annotation.GlobalTransactional; +import jakarta.annotation.Resource; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 供应商用户 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +@Service +public class SupplierUserServiceImpl implements SupplierUserService { + + @Resource + private SupplierUserMapper supplierUserMapper; + @DubboReference + private AccountFeignClient accountFeignClient; + @DubboReference + private UserRoleFeignClient userRoleFeignClient; + @DubboReference + private NotifyFeignClient notifyFeignClient; + @Autowired + private SegmentManager segmentManager; + + @Override + public PageVO pageBySupplierId(PageDTO pageDTO, SupplierUserDTO supplierUserDTO) { + PageVO page = PageUtil.doPage(pageDTO, () -> supplierUserMapper.listBySupplierId(supplierUserDTO)); + List userIds = page.getList().stream().map(SupplierUserVO::getSupplierUserId).collect(Collectors.toList()); + Integer sysType = Objects.equals(supplierUserDTO.getSupplierId(), Constant.PLATFORM_SHOP_ID) ? SysTypeEnum.PLATFORM.value() : SysTypeEnum.SUPPLIER.value(); + ServerResponseEntity> responseEntity = accountFeignClient.listUserByUserIdsAndType(userIds, sysType); + Map authAccountMap = responseEntity.getData().stream().collect(Collectors.toMap(AuthAccountVO::getUserId, a -> a)); + for (SupplierUserVO supplierUserVO : page.getList()) { + AuthAccountVO authAccountVO = authAccountMap.get(supplierUserVO.getSupplierUserId()); + if (Objects.isNull(authAccountVO)) { + continue; + } + supplierUserVO.setStatus(authAccountVO.getStatus()); + supplierUserVO.setUsername(authAccountVO.getUsername()); + supplierUserVO.setIsAdmin(authAccountVO.getIsAdmin()); + supplierUserVO.setPhoneNum(PhoneUtil.hideBetween(supplierUserVO.getPhoneNum()).toString()); + } + return page; + } + + @Override + public SupplierUserVO getByUserId(Long userId) { + SupplierUserVO supplierUser = supplierUserMapper.getByUserId(userId); + ServerResponseEntity> roleIds = userRoleFeignClient.getRoleIds(supplierUser.getSupplierUserId()); + supplierUser.setRoleIds(roleIds.getData()); + ServerResponseEntity accountResponse = accountFeignClient.getByUserIdAndSysType(userId, AuthUserContext.get().getSysType()); + if (!accountResponse.isSuccess()) { + throw new LuckException(accountResponse.getMsg()); + } + AuthAccountVO data = accountResponse.getData(); + if (Objects.nonNull(data)) { + supplierUser.setEmail(data.getEmail()); + supplierUser.setPhone(data.getPhone()); + supplierUser.setUsername(data.getUsername()); + supplierUser.setPassword(data.getPassword()); + supplierUser.setStatus(data.getStatus()); + supplierUser.setIsAdmin(data.getIsAdmin()); + } + return supplierUser; + } + + @Override + public SupplierUserVO getSimpleByUserId(Long userId) { + return supplierUserMapper.getByUserId(userId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(SupplierUser supplierUser, List roleIds) { + supplierUser.setSupplierUserId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SUPPLIER_USER)); + supplierUserMapper.save(supplierUser); + if (CollUtil.isEmpty(roleIds)) { + return; + } + UserRoleDTO userRoleDTO = new UserRoleDTO(); + userRoleDTO.setRoleIds(roleIds); + userRoleDTO.setUserId(supplierUser.getSupplierUserId()); + userRoleFeignClient.saveByUserIdAndSysType(userRoleDTO); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public void update(SupplierUser supplierUser, List roleIds) { + UserRoleDTO userRoleDTO = new UserRoleDTO(); + userRoleDTO.setRoleIds(roleIds); + userRoleDTO.setUserId(supplierUser.getSupplierUserId()); + userRoleDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + supplierUserMapper.update(supplierUser); + userRoleFeignClient.updateByUserIdAndSysType(userRoleDTO); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public void deleteById(Long supplierUserId) { + ServerResponseEntity responseEntity = accountFeignClient.deleteByUserIdAndSysType(supplierUserId); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + userRoleFeignClient.deleteByUserIdAndSysType(supplierUserId); + supplierUserMapper.deleteById(supplierUserId); + } + + @Override + public Long getUserIdBySupplierId(Long supplierId) { + return supplierUserMapper.getUserIdBySupplierId(supplierId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void register(SupplierUserRegisterDTO supplierUserRegisterDTO) { + // 校验注册信息 + this.checkRegisterInfo(supplierUserRegisterDTO); + // 商家端用户表保存商家信息 + SupplierUser supplierUser = new SupplierUser(); + supplierUser.setSupplierUserId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SUPPLIER_USER)); + supplierUser.setNickName(supplierUserRegisterDTO.getUsername()); + supplierUser.setPhoneNum(supplierUserRegisterDTO.getMobile()); + supplierUser.setHasAccount(1); + supplierUser.setSupplierId(Constant.DEFAULT_SUPPLIER_ID); + supplierUserMapper.save(supplierUser); + // 账号表保存商家信息 + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setPhone(supplierUserRegisterDTO.getMobile()); + authAccountDTO.setPassword(supplierUserRegisterDTO.getPassword().trim()); + authAccountDTO.setStatus(StatusEnum.ENABLE.value()); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + authAccountDTO.setUserId(supplierUser.getSupplierUserId()); + authAccountDTO.setIsAdmin(UserAdminType.ADMIN.value()); + authAccountDTO.setTenantId(Constant.DEFAULT_SHOP_ID); + authAccountDTO.setIsPassShop(IsPassShopEnum.NO.value()); + authAccountDTO.setUsername(supplierUserRegisterDTO.getUsername()); + ServerResponseEntity saveAccountRes = accountFeignClient.save(authAccountDTO); + if (!saveAccountRes.isSuccess()) { + throw new LuckException(saveAccountRes.getMsg()); + } + } + + @Override + public ServerResponseEntity verifySupplierUserAccount(SupplierUserDTO supplierUserDTO) { + // 账号表商家信息 + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setPhone(supplierUserDTO.getPhone()); + authAccountDTO.setEmail(supplierUserDTO.getEmail()); + authAccountDTO.setUsername(supplierUserDTO.getUsername()); + authAccountDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + authAccountDTO.setUserId(supplierUserDTO.getSupplierUserId()); + return accountFeignClient.verifyAccount(authAccountDTO); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public void saveAccount(SupplierUserDTO supplierUserDTO) { + SupplierUser supplierUser = BeanUtil.map(supplierUserDTO, SupplierUser.class); + supplierUser.setSupplierId(supplierUserDTO.getSupplierId()); + supplierUser.setHasAccount(1); + supplierUser.setPhoneNum(supplierUserDTO.getPhone()); + // 保存供应商职工信息 + this.save(supplierUser, supplierUserDTO.getRoleIds()); + Long supplierUserId = supplierUser.getSupplierUserId(); + // 账号表商家职工信息 + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setPhone(supplierUserDTO.getPhone()); + authAccountDTO.setEmail(supplierUserDTO.getEmail()); + authAccountDTO.setUsername(supplierUserDTO.getUsername()); + authAccountDTO.setSysType(AuthUserContext.get().getSysType()); + authAccountDTO.setUserId(supplierUserId); + authAccountDTO.setTenantId(supplierUser.getSupplierId()); + authAccountDTO.setStatus(supplierUserDTO.getStatus()); + authAccountDTO.setPassword(supplierUserDTO.getPassword()); + authAccountDTO.setIsPassShop(IsPassShopEnum.YES.value()); + authAccountDTO.setIsAdmin(0); + ServerResponseEntity accountResponseEntity = accountFeignClient.save(authAccountDTO); + if (!accountResponseEntity.isSuccess()) { + throw new LuckException(accountResponseEntity.getMsg()); + } + } + + @Override + public Integer countAccoutByMobile(String mobile) { + return supplierUserMapper.countAccoutByMobile(mobile); + + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public void updateAccount(SupplierUserDTO supplierUserDTO) { + // 修改供应商职工信息 + SupplierUser supplierUser = BeanUtil.map(supplierUserDTO, SupplierUser.class); + supplierUser.setPhoneNum(supplierUserDTO.getPhone()); + supplierUser.setHasAccount(null); + + AuthAccountDTO authAccountDTO = BeanUtil.map(supplierUserDTO, AuthAccountDTO.class); + UidInfoBO uidInfoBO = AuthUserContext.get(); + authAccountDTO.setSysType(uidInfoBO.getSysType()); + authAccountDTO.setTenantId(uidInfoBO.getTenantId()); + authAccountDTO.setUserId(supplierUserDTO.getSupplierUserId()); + // 修改供应商account信息 + ServerResponseEntity serverResponseEntity = accountFeignClient.update(authAccountDTO); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + + this.update(supplierUser, supplierUserDTO.getRoleIds()); + + } + + @Override + public List listBySupplierId(SupplierUserDTO supplierUserDTO) { + return supplierUserMapper.listBySupplierId(supplierUserDTO); + } + + /** + * 校验注册信息 + * @param supplierUserRegisterDTO + * @return + */ + public void checkRegisterInfo(SupplierUserRegisterDTO supplierUserRegisterDTO) { + // 用户名 + ServerResponseEntity usernameRes = accountFeignClient.countByUserNameAndSysType(supplierUserRegisterDTO.getUsername(), SysTypeEnum.SUPPLIER.value()); + if (!usernameRes.isSuccess()) { + throw new LuckException("服务器繁忙!"); + } + if (usernameRes.getData() > 0) { + throw new LuckException("用户名已经存在"); + } + // 手机号验证码 + ServerResponseEntity mobileRes = accountFeignClient.countByMobileAndSysType(supplierUserRegisterDTO.getMobile(), SysTypeEnum.SUPPLIER.value()); + if (!mobileRes.isSuccess()) { + throw new LuckException("服务器繁忙!"); + } + if (mobileRes.getData() > 0) { + throw new LuckException("该手机号已经被注册"); + } + ServerResponseEntity sendNotifyResponse = notifyFeignClient.checkValidCode(supplierUserRegisterDTO.getMobile(), supplierUserRegisterDTO.getValidCode(), SendTypeEnum.VALID); + Boolean data = sendNotifyResponse.getData(); + if (Objects.equals(sendNotifyResponse.getCode(), ResponseEnum.OK.value()) && Objects.nonNull(data) && !data) { + throw new LuckException("验证码有误或已过期"); + } + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierWalletLogServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierWalletLogServiceImpl.java new file mode 100644 index 0000000..f425e3d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierWalletLogServiceImpl.java @@ -0,0 +1,370 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.supplier.bo.SupplierSimpleBO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.mongodb.util.MongoPageUtil; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.supplier.constant.SupplierWalletAmountType; +import com.tmerclub.cloud.supplier.constant.SupplierWalletChangeReason; +import com.tmerclub.cloud.supplier.constant.SupplierWalletIoType; +import com.tmerclub.cloud.supplier.dto.SupplierWalletLogSearchDTO; +import com.tmerclub.cloud.supplier.mapper.SupplierWalletMapper; +import com.tmerclub.cloud.supplier.model.SupplierDetail; +import com.tmerclub.cloud.supplier.mongo.MongoSupplierWalletLogBO; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.service.SupplierWalletLogService; +import com.tmerclub.cloud.supplier.vo.SupplierWalletLogExcelVO; +import com.tmerclub.cloud.supplier.vo.SupplierWalletVO; +import com.tmerclub.cloud.supplier.vo.mongo.MongoSupplierWalletVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 供应商钱包记录 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +@Service +public class SupplierWalletLogServiceImpl implements SupplierWalletLogService { + + private static final Logger logger = LoggerFactory.getLogger(SupplierWalletLogServiceImpl.class); + + @Autowired + private MongoTemplate mongoTemplate; + + @Autowired + private MongoPageUtil mongoPageUtil; + + @Autowired + private SupplierDetailService supplierDetailService; + + @Autowired + private SupplierWalletMapper supplierWalletMapper; + + @Autowired + private SupplierAllinpayService supplierAllinpayService; + + @Override + public PageVO pageByParam(PageDTO pageDTO, SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + Criteria criteria = getCriteria(supplierWalletLogSearchDTO); + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + return mongoPageUtil.doPage(MongoSupplierWalletLogBO.class, pageDTO, query); + } + + @Override + public void saveMongoBatch(List supplierWalletLogBOList) { + if (CollUtil.isEmpty(supplierWalletLogBOList)) { + logger.info("供应商日志为空,返回"); + return; + } + // 批量操作 + logger.info("添加供应商钱包日志至mongodb{}", Json.toJsonString(supplierWalletLogBOList)); + mongoTemplate.insert(supplierWalletLogBOList, MongoSupplierWalletLogBO.class); + } + + @Override + public PageVO pageAllSupplier(PageDTO pageDTO, SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + Criteria criteria = getCriteria(supplierWalletLogSearchDTO); + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + + PageVO pageVO = mongoPageUtil.doPage(MongoSupplierWalletLogBO.class, pageDTO, query); + + // 供应商名称 + Map supplierMap = getSupplierMap(pageVO.getList().stream().map(MongoSupplierWalletLogBO::getSupplierId)); + for (MongoSupplierWalletLogBO mongoSupplierWalletLogBO : pageVO.getList()) { + if (supplierMap.containsKey(mongoSupplierWalletLogBO.getSupplierId())) { + mongoSupplierWalletLogBO.setSupplierName(supplierMap.get(mongoSupplierWalletLogBO.getSupplierId())); + } + } + return pageVO; + } + + @Override + public long countInAmountByOrderId(Long orderId, Integer shopWalletChangeReason) { + Criteria criteria = Criteria.where("orderId").is(orderId).and("reason").is(shopWalletChangeReason); + return countByMongoDb(criteria); + } + + @Override + public long countOutAmountByRefundId(Long refundId, Integer shopWalletChangeReason) { + Criteria criteria = Criteria.where("refundId").is(refundId).and("reason").is(shopWalletChangeReason); + return countByMongoDb(criteria); + } + + @Override + public List listByParam(SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + Criteria criteria = getCriteria(supplierWalletLogSearchDTO); + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + return mongoTemplate.find(query, MongoSupplierWalletLogBO.class); + } + + @Override + public SupplierWalletVO getSupplierWalletByTime(SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + Criteria criteria = getCriteria(supplierWalletLogSearchDTO); + ProjectionOperation projectionOperation = Aggregation.project() + // 待结算金额收入: 用户支付 拒绝用户退款 + .and(ConditionalOperators.when(Criteria.where("reason").in(0, 3)).then(ConditionalOperators.when(Criteria.where("amountType").is(0)).then("$changeAmount").otherwise(0)).otherwise(0)).as("inUnsettleAmount") + // 待结算金额支出: 用户退款成功 系统扣除订单中需要颁发给用户的分销金额 + .and(ConditionalOperators.when(Criteria.where("reason").in(2, 9)).then(ConditionalOperators.when(Criteria.where("amountType").is(0)).then("$changeAmount").otherwise(0)).otherwise(0)).as("outUnsettleAmount") + // 总结算金额:订单结算 余额充值成功 预售失败结算(超时未支付尾款) + .and(ConditionalOperators.when(Criteria.where("reason").in(1)).then(ConditionalOperators.when(Criteria.where("amountType").is(1)).then("$changeAmount").otherwise(0)).otherwise(0)).as("totalSettleAmount") + // 冻结金额收入:提现申请 + .and(ConditionalOperators.when(Criteria.where("reason").in(4)).then(ConditionalOperators.when(Criteria.where("amountType").is(2)).then("$changeAmount").otherwise(0)).otherwise(0)).as("inFreezeAmount") + // 冻结金额支出:提现申请被拒绝 提现申请通过 + .and(ConditionalOperators.when(Criteria.where("reason").in(5, 6)).then(ConditionalOperators.when(Criteria.where("amountType").is(2)).then("$changeAmount").otherwise(0)).otherwise(0)).as("outFreezeAmount"); + // 分组 + GroupOperation groupOperation = Aggregation.group() + .sum("inUnsettleAmount").as("inUnsettleAmount") + .sum("outUnsettleAmount").as("outUnsettleAmount") + .sum("totalSettleAmount").as("totalSettleAmount") + .sum("inFreezeAmount").as("inFreezeAmount") + .sum("outFreezeAmount").as("outFreezeAmount"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoSupplierWalletVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation + ); + + logger.info("getSupplierWalletByTime()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoSupplierWalletVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + SupplierWalletVO supplierWalletVO = new SupplierWalletVO(); + if (CollUtil.isEmpty(list)) { + return supplierWalletVO; + } + MongoSupplierWalletVO mongoSupplierWalletVO = list.get(0); + supplierWalletVO.setUnsettledAmount(mongoSupplierWalletVO.getInUnsettleAmount() - mongoSupplierWalletVO.getOutUnsettleAmount()); + supplierWalletVO.setTotalSettledAmount(mongoSupplierWalletVO.getTotalSettleAmount()); + supplierWalletVO.setFreezeAmount(mongoSupplierWalletVO.getInFreezeAmount() - mongoSupplierWalletVO.getOutFreezeAmount()); + return supplierWalletVO; + } + + @Override + public PageVO pageSupplierWalletByTime(PageDTO pageDTO, SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + Criteria criteria = getCriteria(supplierWalletLogSearchDTO); + ProjectionOperation projectionOperation = Aggregation.project("supplierId") + // 待结算金额收入: 用户支付 拒绝用户退款 + .and(ConditionalOperators.when(Criteria.where("reason").in(0, 3)).then(ConditionalOperators.when(Criteria.where("amountType").is(0)).then("$changeAmount").otherwise(0)).otherwise(0)).as("inUnsettleAmount") + // 待结算金额支出: 用户退款成功 系统扣除订单中需要颁发给用户的分销金额 + .and(ConditionalOperators.when(Criteria.where("reason").in(2, 9)).then(ConditionalOperators.when(Criteria.where("amountType").is(0)).then("$changeAmount").otherwise(0)).otherwise(0)).as("outUnsettleAmount") + // 总结算金额:订单结算 余额充值成功 预售失败结算(超时未支付尾款) + .and(ConditionalOperators.when(Criteria.where("reason").in(1)).then(ConditionalOperators.when(Criteria.where("amountType").is(1)).then("$changeAmount").otherwise(0)).otherwise(0)).as("totalSettleAmount") + // 冻结金额收入:提现申请 + .and(ConditionalOperators.when(Criteria.where("reason").in(4)).then(ConditionalOperators.when(Criteria.where("amountType").is(2)).then("$changeAmount").otherwise(0)).otherwise(0)).as("inFreezeAmount") + // 冻结金额支出:提现申请被拒绝 提现申请通过 + .and(ConditionalOperators.when(Criteria.where("reason").in(5, 6)).then(ConditionalOperators.when(Criteria.where("amountType").is(2)).then("$changeAmount").otherwise(0)).otherwise(0)).as("outFreezeAmount"); + // 分组 + GroupOperation groupOperation = Aggregation.group("supplierId") + .first("supplierId").as("supplierId") + .sum("inUnsettleAmount").as("inUnsettleAmount") + .sum("outUnsettleAmount").as("outUnsettleAmount") + .sum("totalSettleAmount").as("totalSettleAmount") + .sum("inFreezeAmount").as("inFreezeAmount") + .sum("outFreezeAmount").as("outFreezeAmount"); + + SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC, "supplierId"); + // 分页数据 + SkipOperation skipOperation = Aggregation.skip((long) pageDTO.getPageSize() * (pageDTO.getPageNum() - 1)); + LimitOperation limitOperation = Aggregation.limit(pageDTO.getPageSize()); + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoSupplierWalletVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation, + sortOperation, + skipOperation, + limitOperation + ); + + logger.info("pageSupplierWalletByTime()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoSupplierWalletVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new PageVO<>(); + } + // 总条数 + TypedAggregation aggregation = Aggregation.newAggregation( + MongoSupplierWalletVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation + ); + + // 执行聚合操作 + AggregationResults aggregate = mongoTemplate.aggregate(aggregation, MongoSupplierWalletVO.class); + // 取出最终结果 + List mappedResults = aggregate.getMappedResults(); + // 组装数据 + List result = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map supplierMap = getSupplierMap(list.stream().map(MongoSupplierWalletVO::getSupplierId)); + for (MongoSupplierWalletVO mongoSupplierWalletVO : list) { + SupplierWalletVO supplierWalletVO = new SupplierWalletVO(); + String supplierName = supplierMap.get(mongoSupplierWalletVO.getSupplierId()); + supplierWalletVO.setSupplierId(mongoSupplierWalletVO.getSupplierId()); + supplierWalletVO.setSupplierName(supplierName); + supplierWalletVO.setUnsettledAmount(mongoSupplierWalletVO.getInUnsettleAmount() - mongoSupplierWalletVO.getOutUnsettleAmount()); + supplierWalletVO.setTotalSettledAmount(mongoSupplierWalletVO.getTotalSettleAmount()); + supplierWalletVO.setFreezeAmount(mongoSupplierWalletVO.getInFreezeAmount() - mongoSupplierWalletVO.getOutFreezeAmount()); + result.add(supplierWalletVO); + } + PageVO page = new PageVO<>(); + page.setTotal((long) mappedResults.size()); + page.setList(result); + page.setPages(PageUtil.getPages(mappedResults.size(), pageDTO.getPageSize())); + return page; + } + + private Map getSupplierMap(Stream list) { + List supplierIds = list.collect(Collectors.toList()); + List shopDetails = supplierDetailService.listBySupplierIds(supplierIds); + return shopDetails.stream().collect(Collectors.toMap(SupplierDetail::getSupplierId, SupplierDetail::getSupplierName)); + } + + @Override + public List listSupplierWalletLogExcel(SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + Criteria criteria; + if (CollUtil.isNotEmpty(supplierWalletLogSearchDTO.getSupplierIds())) { + Integer paySysType = supplierAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + criteria = Criteria.where("supplierId").in(supplierWalletLogSearchDTO.getSupplierIds()).and("paySysType").is(paySysType); + } else { + criteria = getCriteria(supplierWalletLogSearchDTO); + } + ProjectionOperation project = Aggregation.project("supplierId", "orderId", "refundId", "amountType", "ioType", "changeAmount", "reason", + "userAmount", "platformAmount", "distributionAmount", "platformCommission", "createTime"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC, "supplierId").and(Sort.Direction.DESC, "createTime"); + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoSupplierWalletLogBO.class, + Aggregation.match(criteria), + project, + sortOperation + ); + + logger.info("listSupplierWalletLogExcel()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoSupplierWalletLogBO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(0); + } + Map shopMap = getSupplierMap(list.stream().map(MongoSupplierWalletLogBO::getSupplierId)); + List result = new ArrayList<>(Constant.INITIAL_CAPACITY); + int index = 1; + for (MongoSupplierWalletLogBO mongoSupplierWalletLogBO : list) { + SupplierWalletLogExcelVO supplierWalletLogExcel = new SupplierWalletLogExcelVO(); + supplierWalletLogExcel.setSeq(String.valueOf(index)); + supplierWalletLogExcel.setSupplierName(shopMap.get(mongoSupplierWalletLogBO.getSupplierId())); + supplierWalletLogExcel.setAmountType(SupplierWalletAmountType.getAmountTypeName(mongoSupplierWalletLogBO.getAmountType())); + supplierWalletLogExcel.setIoType(SupplierWalletIoType.getIoName(mongoSupplierWalletLogBO.getIoType())); + supplierWalletLogExcel.setChangeAmount(PriceUtil.toDecimalPrice(mongoSupplierWalletLogBO.getChangeAmount()).toString()); + supplierWalletLogExcel.setOrderId(Objects.isNull(mongoSupplierWalletLogBO.getOrderId()) ? "" : mongoSupplierWalletLogBO.getOrderId().toString()); + supplierWalletLogExcel.setRefundId(Objects.isNull(mongoSupplierWalletLogBO.getRefundId()) ? "" : mongoSupplierWalletLogBO.getRefundId().toString()); + supplierWalletLogExcel.setUserAmount(PriceUtil.toDecimalPrice(mongoSupplierWalletLogBO.getUserAmount()).toString()); + supplierWalletLogExcel.setPlatformAmount(PriceUtil.toDecimalPrice(mongoSupplierWalletLogBO.getPlatformAmount()).toString()); + supplierWalletLogExcel.setDistributionAmount(PriceUtil.toDecimalPrice(mongoSupplierWalletLogBO.getDistributionAmount()).toString()); + supplierWalletLogExcel.setPlatformCommission(PriceUtil.toDecimalPrice(mongoSupplierWalletLogBO.getPlatformCommission()).toString()); + supplierWalletLogExcel.setReasonStr(SupplierWalletChangeReason.getReason(mongoSupplierWalletLogBO.getReason())); + supplierWalletLogExcel.setCreateTime(mongoSupplierWalletLogBO.getCreateTime()); + result.add(supplierWalletLogExcel); + index++; + } + return result; + } + + private long countByMongoDb(Criteria criteria) { + return mongoTemplate.count(new Query(criteria), MongoSupplierWalletLogBO.class); + } + + /** + * 获取MongoDB的搜索条件 + */ + private Criteria getCriteria(SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + Criteria criteria = new Criteria(); + Integer paySysType = supplierAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + Integer sysType = Objects.nonNull(AuthUserContext.get()) ? AuthUserContext.get().getSysType() : null; + criteria.and("paySysType").is(paySysType); + if (Objects.nonNull(supplierWalletLogSearchDTO.getOrderId())) { + criteria.and("orderId").is(supplierWalletLogSearchDTO.getOrderId()); + } + if (Objects.nonNull(supplierWalletLogSearchDTO.getRefundId())) { + criteria.and("refundId").is(supplierWalletLogSearchDTO.getRefundId()); + } + if (Objects.nonNull(supplierWalletLogSearchDTO.getAmountType())) { + criteria.and("amountType").is(supplierWalletLogSearchDTO.getAmountType()); + } + + if (Objects.equals(sysType, SysTypeEnum.MULTISHOP.value()) && Objects.equals(supplierWalletLogSearchDTO.getReason(), SupplierWalletChangeReason.APPLY_CASH.value())) { + // 商家端搜索原因为提现申请的钱包记录,reason包括4,5,6 + criteria.and("reason") + .in(SupplierWalletChangeReason.APPLY_CASH.value(), SupplierWalletChangeReason.REFUSE_CASH.value(), SupplierWalletChangeReason.PASS_CASH.value()); + }else if (Objects.nonNull(supplierWalletLogSearchDTO.getReason())){ + criteria.and("reason").is(supplierWalletLogSearchDTO.getReason()); + } + if (Objects.nonNull(supplierWalletLogSearchDTO.getSupplierId())) { + criteria.and("supplierId").is(supplierWalletLogSearchDTO.getSupplierId()); + } + if (Objects.nonNull(supplierWalletLogSearchDTO.getIoType())) { + criteria.and("ioType").is(supplierWalletLogSearchDTO.getIoType()); + } + if (StrUtil.isNotBlank(supplierWalletLogSearchDTO.getSupplierName())) { + SupplierSimpleBO supplierSimpleBO = new SupplierSimpleBO(); + supplierSimpleBO.setSupplierName(supplierWalletLogSearchDTO.getSupplierName()); + List shopSimpleList = supplierDetailService.listSimple(supplierSimpleBO); + if (CollUtil.isNotEmpty(shopSimpleList)) { + List supplierIds = shopSimpleList.stream().map(SupplierSimpleBO::getSupplierId).collect(Collectors.toList()); + criteria.and("supplierId").in(supplierIds); + } + } + if (Objects.nonNull(supplierWalletLogSearchDTO.getStartTime())) { + criteria.and("createTime").gt(supplierWalletLogSearchDTO.getStartTime()).lt(supplierWalletLogSearchDTO.getEndTime()); + } + return criteria; + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierWithdrawCashServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierWithdrawCashServiceImpl.java new file mode 100644 index 0000000..d89715b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierWithdrawCashServiceImpl.java @@ -0,0 +1,543 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service.impl; + +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.WithdrawApplyResp; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysConfigApiVO; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.supplier.vo.SupplierBankCardVO; +import com.tmerclub.cloud.common.constant.*; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.DateUtils; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.supplier.constant.*; +import com.tmerclub.cloud.supplier.dto.AllinpaySupplierWithdrawCashDTO; +import com.tmerclub.cloud.supplier.dto.SupplierWithdrawCashConfigDto; +import com.tmerclub.cloud.supplier.dto.SupplierWithdrawCashDTO; +import com.tmerclub.cloud.supplier.mapper.SupplierWalletMapper; +import com.tmerclub.cloud.supplier.mapper.SupplierWithdrawCashMapper; +import com.tmerclub.cloud.supplier.model.SupplierWithdrawCash; +import com.tmerclub.cloud.supplier.mongo.MongoSupplierWalletLogBO; +import com.tmerclub.cloud.supplier.service.*; +import com.tmerclub.cloud.supplier.vo.SupplierWalletVO; +import com.tmerclub.cloud.supplier.vo.SupplierWithdrawCashVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 供应商提现申请信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +@Service +public class SupplierWithdrawCashServiceImpl implements SupplierWithdrawCashService { + + private static final Logger logger = LoggerFactory.getLogger(SupplierWithdrawCashServiceImpl.class); + + @Autowired + private SupplierWithdrawCashMapper supplierWithdrawCashMapper; + @Autowired + private SupplierDetailService supplierDetailService; + @DubboReference + private NotifyFeignClient sendNotifyFeignClient; + @DubboReference + private AccountFeignClient accountFeignClient; + @Autowired + private SupplierWalletService supplierWalletService; + @Autowired + private SupplierBankCardService supplierBankCardService; + @Autowired + private SupplierWalletMapper supplierWalletMapper; + @Autowired + private SegmentManager segmentManager; + @Autowired + private RocketMQTemplate addSupplierWalletLogTemplate; + @DubboReference + private ConfigFeignClient configFeignClient; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void apply(SupplierWithdrawCashDTO supplierWithdrawCashDTO, Long supplierId) { + Integer paySysType = supplierAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + Date now = new Date(); + this.checkWithdrawInfo(supplierWithdrawCashDTO, supplierId); + SupplierWithdrawCash supplierWithdrawCash = BeanUtil.map(supplierWithdrawCashDTO, SupplierWithdrawCash.class); + supplierWithdrawCash.setUpdateTime(now); + supplierWithdrawCash.setCreateTime(now); + supplierWithdrawCash.setStatus(SupplierWithdrawCashStatus.WAITAUDIT.value()); + supplierWithdrawCash.setSupplierId(supplierId); + supplierWithdrawCash.setPaySysType(paySysType); + this.checkConfig(supplierWithdrawCash); + SupplierWalletVO supplierWallet = supplierWalletService.getBySupplierId(supplierId); + if (supplierWithdrawCash.getAmount() > supplierWallet.getSettledAmount()) { + // 可提现金额不足 + throw new LuckException("可提现金额不足"); + } + // 插入提现申请记录 + supplierWithdrawCashMapper.save(supplierWithdrawCash); + + changeWalletAndAddLog(supplierId, paySysType, now, supplierWithdrawCash); + } + + private void changeWalletAndAddLog(Long supplierId, Integer paySysType, Date now, SupplierWithdrawCash supplierWithdrawCash) { + Long changeAmount = supplierWithdrawCash.getAmount(); + + // 更新钱包的结算金额和冻结金额 + updateSupplierWalletByApply(supplierWithdrawCash); + + List supplierWalletLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 保存提现记录 + this.saveSupplierWalletLog(changeAmount, supplierId, now, SupplierWalletChangeReason.APPLY_CASH, supplierWalletLogList, paySysType); + + // 用mq批量保存钱包日志 + SendStatus sendWalletLogStatus = addSupplierWalletLogTemplate.syncSend(RocketMqConstant.ADD_SUPPLIER_WALLET_LOG_TOPIC, new GenericMessage<>(supplierWalletLogList)).getSendStatus(); + if (!Objects.equals(sendWalletLogStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String allinpayApply(AllinpaySupplierWithdrawCashDTO supplierWithdrawCashDTO, Long supplierId) { + Long amount = supplierWithdrawCashDTO.getAmount(); + // 校验提现条件 + this.checkAllinpay(supplierId, amount); + SupplierWithdrawCash supplierWithdrawCash = new SupplierWithdrawCash(); + supplierWithdrawCash.setAmount(amount); + supplierWithdrawCash.setSupplierId(supplierId); + supplierWithdrawCash.setPayingCardNo(supplierWithdrawCashDTO.getBankCardNo()); + supplierWithdrawCash.setPaySysType(PaySysType.ALLINPAY.value()); + this.checkConfig(supplierWithdrawCash); + // 提现订单支付成功的条件为:status = OK且payStatus = success。 + String bizUserId = AllinpayConstant.SUPPLIER + supplierId; + ServerResponseEntity withdrawApplyResponse = allinpayFeignClient.withdrawApply(bizUserId, amount, supplierWithdrawCashDTO.getBankCardNo(), SysTypeEnum.MULTISHOP.value()); + if (!withdrawApplyResponse.isSuccess()) { + throw new LuckException(withdrawApplyResponse.getMsg()); + } + // 保存至数据库,确认支付后更新状态 + String bizOrderNo = withdrawApplyResponse.getData().getBizOrderNo(); + supplierWithdrawCash.setAllinpayStatus(AllinpayWithdrawCashStatusType.APPLY_SUCCESS.value()); + supplierWithdrawCash.setBizOrderNo(bizOrderNo); + supplierWithdrawCashMapper.save(supplierWithdrawCash); + // 更新钱包,添加提现日志 + changeWalletAndAddLog(supplierId, PaySysType.ALLINPAY.value(), new Date(), supplierWithdrawCash); + return bizOrderNo; + } + + @Override + public void confirmWithdrawPay(AllinpaySupplierWithdrawCashDTO supplierWithdrawCashDTO, Long supplierId) { + SupplierWithdrawCash supplierWithdrawCash = supplierWithdrawCashMapper.getByBizOrderNo(supplierWithdrawCashDTO.getBizOrderNo()); + if (Objects.isNull(supplierWithdrawCash)) { + throw new LuckException("提现记录不存在"); + } + if (!Objects.equals(supplierId, supplierWithdrawCash.getSupplierId())) { + throw new LuckException("当前提现订单号不属于该供应商"); + } + if (!Objects.equals(supplierWithdrawCash.getAllinpayStatus(), AllinpayWithdrawCashStatusType.APPLY_SUCCESS.value()) + && !Objects.equals(supplierWithdrawCash.getAllinpayStatus(), AllinpayWithdrawCashStatusType.WAIT_PAY.value())) { + throw new LuckException("申请状态异常,请刷新重试"); + } + Long amount = supplierWithdrawCash.getAmount(); + String bizUserId = AllinpayConstant.SUPPLIER + supplierId; + ServerResponseEntity payResponse = allinpayFeignClient.payByBackSms(bizUserId, supplierWithdrawCash.getBizOrderNo(), supplierWithdrawCashDTO.getVerificationCode()); + if (!payResponse.isSuccess()) { + throw new LuckException(payResponse.getMsg()); + } + PayByBackSmsResp payByBackSmsResp = payResponse.getData(); + String payStatus = payByBackSmsResp.getPayStatus(); + String payFailMessage = payByBackSmsResp.getPayFailMessage(); + if (Objects.equals(payStatus, AllinpayPayStatus.UNPAY.value())) { + // 收银宝快捷短信验证码输入错误场景,允许商户继续调用确认支付 + supplierWithdrawCash.setAllinpayStatus(AllinpayWithdrawCashStatusType.WAIT_PAY.value()); + supplierWithdrawCash.setPayFailMessage(payFailMessage); + logger.error("提现订单{}提现失败,原因为:{}", payByBackSmsResp.getBizOrderNo(), payFailMessage); + supplierWithdrawCashMapper.update(supplierWithdrawCash); + } + } + + private void allinpayFail(Long supplierId, SupplierWithdrawCash supplierWithdrawCash, Long amount, String bizOrderNo, String payFailMessage, List list) { + supplierWithdrawCash.setAllinpayStatus(AllinpayWithdrawCashStatusType.CASH_FAIL.value()); + supplierWithdrawCash.setPayFailMessage(payFailMessage); + logger.error("提现订单{}提现失败,原因为:{}", bizOrderNo, payFailMessage); + boolean subFreezeAmount = supplierWalletMapper.subFreezeAmount(supplierId, amount, supplierWithdrawCash.getPaySysType()) > 0; + if (!subFreezeAmount) { + throw new LuckException("确认支付失败,冻结金额异常"); + } + // 增加结算金额到主分片 + boolean addSettledAmount = supplierWalletMapper.addSettledAmount(supplierId, amount, supplierWithdrawCash.getPaySysType(), false) > 0; + if (!addSettledAmount) { + throw new LuckException("确认支付失败,结算金额异常"); + } + // 保存日志 + this.saveSupplierWalletLog(amount, supplierId, new Date(), SupplierWalletChangeReason.REFUSE_CASH, list, supplierWithdrawCash.getPaySysType()); + } + + private void allinpaySuccess(Long supplierId, SupplierWithdrawCash supplierWithdrawCash, Long amount, List list) { + supplierWithdrawCash.setAllinpayStatus(AllinpayWithdrawCashStatusType.CASH_SUCCESS.value()); + // 更新供应商结算金额 + boolean subFreezeAmountSuccess = supplierWalletMapper.subFreezeAmount(supplierId, amount, supplierWithdrawCash.getPaySysType()) > 0; + if (!subFreezeAmountSuccess) { + throw new LuckException("冻结金额不足,提现失败"); + } + // 保存日志 + this.saveSupplierWalletLog(amount, supplierId, new Date(), SupplierWalletChangeReason.PASS_CASH, list, supplierWithdrawCash.getPaySysType()); + } + + @Override + public void resendPaySms(String bizOrderNo, Long supplierId) { + SupplierWithdrawCash supplierWithdrawCash = supplierWithdrawCashMapper.getByBizOrderNo(bizOrderNo); + if (Objects.isNull(supplierWithdrawCash)) { + throw new LuckException("提现记录不存在"); + } + if (!Objects.equals(supplierId, supplierWithdrawCash.getSupplierId())) { + throw new LuckException("当前提现订单号不属于该供应商"); + } + if (!Objects.equals(supplierWithdrawCash.getAllinpayStatus(), AllinpayWithdrawCashStatusType.WAIT_PAY.value())) { + throw new LuckException("提现申请不在未支付状态,请刷新重试"); + } + ServerResponseEntity response = allinpayFeignClient.resendPaySms(bizOrderNo); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + + @Override + public void withdrawBack(String bizOrderNo, String payStatus, String bizUserId, String payFailMessage) { + SupplierWithdrawCash supplierWithdrawCash = supplierWithdrawCashMapper.getByBizOrderNo(bizOrderNo); + if (Objects.isNull(supplierWithdrawCash)) { + throw new LuckException("提现记录不存在"); + } + if (Objects.equals(supplierWithdrawCash.getAllinpayStatus(), AllinpayWithdrawCashStatusType.CASH_SUCCESS.value())) { + return; + } + Long supplierId = supplierWithdrawCash.getSupplierId(); + Long amount = supplierWithdrawCash.getAmount(); + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.equals(payStatus, AllinpayPayStatus.OK.value())) { + allinpaySuccess(supplierId, supplierWithdrawCash, amount, list); + } else if (Objects.equals(payStatus, AllinpayPayStatus.ERROR.value())) { + allinpayFail(supplierId, supplierWithdrawCash, amount, bizOrderNo, payFailMessage, list); + } + supplierWithdrawCashMapper.update(supplierWithdrawCash); + // 用mq批量保存钱包日志 + SendStatus sendWalletLogStatus = addSupplierWalletLogTemplate.syncSend(RocketMqConstant.ADD_SUPPLIER_WALLET_LOG_TOPIC, new GenericMessage<>(list)).getSendStatus(); + if (!Objects.equals(sendWalletLogStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + private void checkAllinpay(Long supplierId, Long amount) { + if (!supplierAllinpayService.getIsAllinpay()) { + throw new LuckException("当前不支持通联提现"); + } + if (amount < 1) { + throw new LuckException("提现金额不能少于1.00元"); + } + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(supplierId); + if (Objects.equals(supplierApiDetailVO.getIsBindPhone(), 0) || + !Objects.equals(supplierApiDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.SUCCESS.value()) || + !Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + throw new LuckException("供应商信息未通过审核,无法提现"); + } + } + + @Override + public PageVO pageByParam(PageDTO pageDTO, SupplierWithdrawCashDTO supplierWithdrawCashDTO) { + supplierWithdrawCashDTO.setPaySysType(supplierAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value()); + return PageUtil.doPage(pageDTO, () -> supplierWithdrawCashMapper.listByParam(supplierWithdrawCashDTO)); + } + + @Override + public SupplierWithdrawCashVO getDetailByCashId(Long cashId) { + return supplierWithdrawCashMapper.getDetailByCashId(cashId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void auditWithdrawCash(SupplierWithdrawCashDTO supplierWithdrawCashDTO, Long userId) { + if (supplierAllinpayService.getIsAllinpay()) { + throw new LuckException("开启通联后,平台无需审核供应商提现信息"); + } + SupplierWithdrawCashVO supplierWithdrawCashVO = supplierWithdrawCashMapper.getDetailByCashId(supplierWithdrawCashDTO.getCashId()); + if (Objects.isNull(supplierWithdrawCashVO)) { + throw new LuckException("未找到申请信息"); + } + if (!Objects.equals(supplierWithdrawCashVO.getStatus(), SupplierWithdrawCashStatus.WAITAUDIT.value())) { + throw new LuckException("该申请已被审核"); + } + this.checkAuditInfo(supplierWithdrawCashDTO, supplierWithdrawCashDTO.getSupplierId()); + SupplierWithdrawCash supplierWithdrawCash = BeanUtil.map(supplierWithdrawCashVO, SupplierWithdrawCash.class); + Date now = new Date(); + supplierWithdrawCash.setAuditingTime(now); + supplierWithdrawCash.setAuditorId(userId); + supplierWithdrawCash.setStatus(supplierWithdrawCashDTO.getStatus()); + supplierWithdrawCash.setRemarks(supplierWithdrawCashDTO.getRemarks()); + supplierWithdrawCash.setPayingAccount(supplierWithdrawCashDTO.getPayingAccount()); + supplierWithdrawCash.setPayingTime(supplierWithdrawCashDTO.getPayingTime()); + supplierWithdrawCash.setPayingCardNo(supplierWithdrawCashDTO.getPayingCardNo()); + Long supplierId = supplierWithdrawCash.getSupplierId(); + Long changeAmount = supplierWithdrawCash.getAmount(); + List supplierWalletLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + + SupplierWalletChangeReason supplierWalletChangeReason = SupplierWalletChangeReason.PASS_CASH; + if (!Objects.equals(changeAmount, 0L)) { + switch (Objects.requireNonNull(SupplierWithdrawCashStatus.instance(supplierWithdrawCash.getStatus()))) { + case SUCCESSAUDIT: + // 审核通过, 减去冻结的金额 + boolean subFreezeAmountSuccess = supplierWalletMapper.subFreezeAmount(supplierId, changeAmount, PaySysType.DEFAULT.value()) > 0; + if (!subFreezeAmountSuccess) { + throw new LuckException("冻结金额不足,提现失败"); + } + break; + case FAILAUDIT: + // 审核不通过,将冻结的金额返回到已结算金额 + boolean subFreezeAmount = supplierWalletMapper.subFreezeAmount(supplierId, changeAmount, PaySysType.DEFAULT.value()) > 0; + if (!subFreezeAmount) { + throw new LuckException("审核失败,冻结金额异常"); + } + + // 增加结算金额到主分片 + boolean addSettledAmount = supplierWalletMapper.addSettledAmount(supplierId, changeAmount, PaySysType.DEFAULT.value(), false) > 0; + if (!addSettledAmount) { + throw new LuckException("审核失败,结算金额异常"); + } + supplierWalletChangeReason = SupplierWalletChangeReason.REFUSE_CASH; + break; + default: + // 审核状态有误 + throw new LuckException("审核状态有误"); + } + } + + // 保存日志 + this.saveSupplierWalletLog(changeAmount, supplierId, now, supplierWalletChangeReason, supplierWalletLogList, PaySysType.DEFAULT.value()); + // 用mq批量保存钱包日志 + SendStatus sendWalletLogStatus = addSupplierWalletLogTemplate.syncSend(RocketMqConstant.ADD_SUPPLIER_WALLET_LOG_TOPIC, new GenericMessage<>(supplierWalletLogList)).getSendStatus(); + if (!Objects.equals(sendWalletLogStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + + if (supplierWithdrawCashMapper.updateByIdAndStatus(supplierWithdrawCash, supplierWithdrawCash.getCashId(), SupplierWithdrawCashStatus.WAITAUDIT.value()) != 1) { + throw new LuckException("该申请已被审核"); + } + } + + @Override + public void saveConfig(SupplierWithdrawCashConfigDto supplierWithdrawCashConfigDto) { + checkParam(supplierWithdrawCashConfigDto); + SysConfigApiVO sysConfigApiVO = new SysConfigApiVO(); + sysConfigApiVO.setParamKey(Constant.SUPPLIE_WITHDRWA); + sysConfigApiVO.setRemark("供应商提现配置"); + sysConfigApiVO.setParamValue(Json.toJsonString(supplierWithdrawCashConfigDto)); + configFeignClient.saveOrUpdateSysConfig(sysConfigApiVO); + } + + @Override + public SupplierWithdrawCashConfigDto getConfig() { + SupplierWithdrawCashConfigDto supplierWithdrawCashConfigDto = Json.parseObject(configFeignClient.getConfig(Constant.SUPPLIE_WITHDRWA).getData(), SupplierWithdrawCashConfigDto.class); + if (Objects.isNull(supplierWithdrawCashConfigDto)) { + supplierWithdrawCashConfigDto = new SupplierWithdrawCashConfigDto(); + supplierWithdrawCashConfigDto.setWithdrawCashLeast(100.0D); + supplierWithdrawCashConfigDto.setFrequency(1); + supplierWithdrawCashConfigDto.setNumber(1); + } + return supplierWithdrawCashConfigDto; + } + + private void checkParam(SupplierWithdrawCashConfigDto supplierWithdrawCashConfigDto) { + Double least = supplierWithdrawCashConfigDto.getWithdrawCashLeast(); + Double max = supplierWithdrawCashConfigDto.getWithdrawCashMax(); + Integer frequency = supplierWithdrawCashConfigDto.getFrequency(); + Integer number = supplierWithdrawCashConfigDto.getNumber(); + if (Objects.isNull(least) || least < 1) { + throw new LuckException("最少金额设置错误"); + } + if (Objects.nonNull(max) && max < least) { + throw new LuckException("最大金额设置错误"); + } + boolean isError = Objects.isNull(frequency) || (!frequency.equals(WithdrawCashType.WEEKEND.value()) && !frequency.equals(WithdrawCashType.MONTH.value()) && !frequency.equals(WithdrawCashType.YEAR.value())); + if (isError) { + throw new LuckException("提现频率设置错误"); + } + if (Objects.isNull(number) || number < 1) { + throw new LuckException("提现次数设置错误"); + } + } + + private void checkConfig(SupplierWithdrawCash supplierWithdrawCash) { + SupplierWithdrawCashConfigDto config = getConfig(); + if (supplierWithdrawCash.getAmount() < config.getWithdrawCashLeast()) { + throw new LuckException("提现金额过少,最低提现:" + config.getWithdrawCashLeast() / 100); + } + if (Objects.nonNull(config.getWithdrawCashMax()) && supplierWithdrawCash.getAmount() > config.getWithdrawCashMax()) { + throw new LuckException("提现金额过大,最高提现:" + config.getWithdrawCashMax() / 100); + } + Integer frequency = config.getFrequency(); + Date startTimes; + Date endTimes; + String date; + if (frequency.equals(WithdrawCashType.WEEKEND.value())) { + startTimes = DateUtils.getCurrentWeekStartTimes(new Date()); + endTimes = DateUtils.getCurrentWeekEndTimes(new Date()); + date = WithdrawCashType.WEEKEND.date(); + } else if (frequency.equals(WithdrawCashType.MONTH.value())) { + startTimes = DateUtils.getMonthFirstOrLastDay(new Date(), 0); + endTimes = DateUtils.getMonthFirstOrLastDay(new Date(), 1); + date = WithdrawCashType.MONTH.date(); + } else { + startTimes = DateUtils.getCurrentYearStartTime(new Date()); + endTimes = DateUtils.getCurrentYearEndTime(new Date()); + date = WithdrawCashType.YEAR.date(); + } + int count = checkCount(startTimes, endTimes, supplierWithdrawCash); + if (count + 1 > config.getNumber()) { + throw new LuckException("超出提现频率限制,当前频率为:" + date + " " + config.getNumber() + "次"); + } + } + + private int checkCount(Date startTimes, Date endTimes, SupplierWithdrawCash supplierWithdrawCash) { + return supplierWithdrawCashMapper.getWithdrawCashCount(startTimes, endTimes, supplierWithdrawCash); + } + + private void updateSupplierWalletByApply(SupplierWithdrawCash supplierWithdrawCash) { + Integer paySysType = supplierWithdrawCash.getPaySysType(); + if (Objects.equals(supplierWithdrawCash.getAmount(), 0L)) { + return; + } + Long supplierId = supplierWithdrawCash.getSupplierId(); + Long changeAmount = supplierWithdrawCash.getAmount(); + // 1. 增加冻结金额 + boolean addFreezeAmountSuccess = supplierWalletMapper.addFreezeAmount(supplierId, changeAmount, paySysType) > 0; + if (!addFreezeAmountSuccess) { + throw new LuckException("提现申请发生异常"); + } + // 2. 减少结算金额 + boolean settledAmountSuccess = supplierWalletMapper.subSettledAmount(supplierId, changeAmount, paySysType) > 0; + if (!settledAmountSuccess) { + throw new LuckException("可提现金额不足"); + } + } + + @Override + public void checkDrawCashAmount(Long amount) { + // 基础数值检查 + if (amount < Constant.HUNDRED) { + throw new LuckException("提现金额不能少于1.00元"); + } + // 系统配置检查 + SupplierWithdrawCash supplierWithdrawCash = new SupplierWithdrawCash(); + supplierWithdrawCash.setAmount(amount); + this.checkConfig(supplierWithdrawCash); + } + + private void saveSupplierWalletLog(Long changeAmount, Long supplierId, Date now, SupplierWalletChangeReason supplierWalletChangeReason, List supplierWalletLogList, Integer paySysType) { + + // 插入结算金额修改记录【提现申请/提现申请被拒绝】 + if (Objects.equals(supplierWalletChangeReason, SupplierWalletChangeReason.APPLY_CASH) || Objects.equals(supplierWalletChangeReason, SupplierWalletChangeReason.REFUSE_CASH)) { + MongoSupplierWalletLogBO supplierWalletLog = new MongoSupplierWalletLogBO(); + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + supplierWalletLog.setWalletLogId(walletLogId); + supplierWalletLog.setCreateTime(now); + supplierWalletLog.setUpdateTime(now); + supplierWalletLog.setSupplierId(supplierId); + supplierWalletLog.setPaySysType(paySysType); + supplierWalletLog.setReason(supplierWalletChangeReason.value()); + supplierWalletLog.setChangeAmount(Math.abs(changeAmount)); + supplierWalletLog.setUserAmount(supplierWalletLog.getChangeAmount()); + supplierWalletLog.setIoType(Objects.equals(supplierWalletChangeReason, SupplierWalletChangeReason.APPLY_CASH) ? SupplierWalletIoType.EXPENDITURE.value() : SupplierWalletIoType.INCOME.value()); + supplierWalletLog.setAmountType(SupplierWalletAmountType.SETTLED_AMOUNT.value()); + supplierWalletLogList.add(supplierWalletLog); + } + + // 插入冻结金额修改记录 + MongoSupplierWalletLogBO supplierWalletLog = new MongoSupplierWalletLogBO(); + supplierWalletLog.setCreateTime(now); + supplierWalletLog.setUpdateTime(now); + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + supplierWalletLog.setWalletLogId(walletLogId); + supplierWalletLog.setSupplierId(supplierId); + supplierWalletLog.setPaySysType(paySysType); + supplierWalletLog.setReason(supplierWalletChangeReason.value()); + supplierWalletLog.setChangeAmount(Math.abs(changeAmount)); + supplierWalletLog.setUserAmount(supplierWalletLog.getChangeAmount()); + supplierWalletLog.setIoType(!Objects.equals(supplierWalletChangeReason, SupplierWalletChangeReason.APPLY_CASH) ? SupplierWalletIoType.EXPENDITURE.value() : SupplierWalletIoType.INCOME.value()); + supplierWalletLog.setAmountType(SupplierWalletAmountType.FREEZE_AMOUNT.value()); + supplierWalletLogList.add(supplierWalletLog); + } + + private void checkWithdrawInfo(SupplierWithdrawCashDTO supplierWithdrawCashDTO, Long supplierId) { + Integer sysType = AuthUserContext.get().getSysType(); + ServerResponseEntity merchantInfoRes = accountFeignClient.getAccountInfoByTenantId(supplierId, sysType); + if (!merchantInfoRes.isSuccess() || Objects.isNull(merchantInfoRes.getData())) { + throw new LuckException("商家信息获取出错"); + } + ServerResponseEntity sendNotifyResponse = sendNotifyFeignClient.checkValidCode(merchantInfoRes.getData().getPhone(), supplierWithdrawCashDTO.getValidCode(), SendTypeEnum.VALID); + if (!sendNotifyResponse.isSuccess() || !sendNotifyResponse.getData()) { + throw new LuckException("验证码有误或已过期"); + } + SupplierApiDetailVO supplierDetailVO = supplierDetailService.getBySupplierId(supplierId); + if (Objects.isNull(supplierDetailVO)) { + throw new LuckException("供应商不存在"); + } + if (supplierWithdrawCashDTO.getAmount() < 1) { + throw new LuckException("提现金额不能少于1.00元"); + } + SupplierBankCardVO supplierBankCardVO = supplierBankCardService.getBySupplierBankCardId(supplierWithdrawCashDTO.getSupplierBankCardId()); + if (Objects.isNull(supplierBankCardVO) || !Objects.equals(supplierBankCardVO.getSupplierId(), supplierId)) { + throw new LuckException("银行卡信息错误"); + } + } + + private void checkAuditInfo(SupplierWithdrawCashDTO supplierWithdrawCashDTO, Long supplierId) { + SupplierApiDetailVO supplierDetailVO = supplierDetailService.getBySupplierId(supplierId); + if (Objects.isNull(supplierDetailVO)) { + throw new LuckException("供应商不存在"); + } + SupplierBankCardVO supplierBankCard = supplierBankCardService.getBySupplierBankCardId(supplierWithdrawCashDTO.getSupplierBankCardId()); + if (Objects.isNull(supplierBankCard) || !Objects.equals(supplierBankCard.getSupplierId(), supplierId)) { + throw new LuckException("银行卡信息错误"); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/PurchaseAmountLogShopExcelVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/PurchaseAmountLogShopExcelVO.java new file mode 100644 index 0000000..367f01f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/PurchaseAmountLogShopExcelVO.java @@ -0,0 +1,137 @@ +package com.tmerclub.cloud.supplier.vo; + +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 商家采购金额日志excel对象 + * @author gaozijie + * @date 2023-08-29 + */ +public class PurchaseAmountLogShopExcelVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "采购金额日志"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty(value = {"采购金额日志", "编号"}, index = 0) + private String seq; + + @ExcelProperty(value = {"采购金额日志", "金额类型"}, index = 1) + private String purchaseAmountType; + + @ExcelProperty(value = {"采购金额日志", "供应商名称"}, index = 2) + private String supplierName; + + @ExcelProperty(value = {"采购金额日志", "改变金额"}, index = 3) + private BigDecimal changeAmount; + + @ExcelProperty(value = {"采购金额日志", "采购编号"}, index = 4) + private String purchaseOrderId; + + @ExcelProperty(value = {"采购金额日志", "采购金额"}, index = 5) + private BigDecimal purchaseTotalAmount; + + @ExcelProperty(value = {"采购金额日志", "商品数量"}, index = 6) + private Integer prodCount; + + @ExcelProperty(value = {"采购金额日志", "创建时间"}, index = 7) + private LocalDateTime createTime; + + public PurchaseAmountLogShopExcelVO() { + } + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getPurchaseAmountType() { + return purchaseAmountType; + } + + public void setPurchaseAmountType(String purchaseAmountType) { + this.purchaseAmountType = purchaseAmountType; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public BigDecimal getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(BigDecimal changeAmount) { + this.changeAmount = changeAmount; + } + + public String getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(String purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public BigDecimal getPurchaseTotalAmount() { + return purchaseTotalAmount; + } + + public void setPurchaseTotalAmount(BigDecimal purchaseTotalAmount) { + this.purchaseTotalAmount = purchaseTotalAmount; + } + + public Integer getProdCount() { + return prodCount; + } + + public void setProdCount(Integer prodCount) { + this.prodCount = prodCount; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "PurchaseAmountLogShopExcelVO{" + + "seq='" + seq + '\'' + + ", purchaseAmountType='" + purchaseAmountType + '\'' + + ", supplierName='" + supplierName + '\'' + + ", changeAmount=" + changeAmount + + ", purchaseOrderId='" + purchaseOrderId + '\'' + + ", purchaseTotalAmount=" + purchaseTotalAmount + + ", prodCount=" + prodCount + + ", createTime=" + createTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierAuditingVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierAuditingVO.java new file mode 100644 index 0000000..5add55b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierAuditingVO.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 供应商审核信息VO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierAuditingVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商审核id") + private Long supplierAuditingId; + + @Schema(description = "申请人id") + private Long userId; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "审核人id") + private Long auditorId; + + @Schema(description = "0 未审核 1已通过 -1未通过") + private Integer status; + + @Schema(description = "备注") + private String remarks; + + @Schema(description = "供应商信息") + private SupplierApiDetailVO supplierDetail; + + public Long getSupplierAuditingId() { + return supplierAuditingId; + } + + public void setSupplierAuditingId(Long supplierAuditingId) { + this.supplierAuditingId = supplierAuditingId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public SupplierApiDetailVO getSupplierDetail() { + return supplierDetail; + } + + public void setSupplierDetail(SupplierApiDetailVO supplierDetail) { + this.supplierDetail = supplierDetail; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "SupplierAuditingVO{" + + "supplierAuditingId=" + supplierAuditingId + + ", userId=" + userId + + ", supplierId=" + supplierId + + ", auditorId=" + auditorId + + ", status=" + status + + ", remarks='" + remarks + '\'' + + ", supplierDetail=" + supplierDetail + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierBankCardVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierBankCardVO.java new file mode 100644 index 0000000..eb67b53 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierBankCardVO.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 银行卡信息VO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierBankCardVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "银行卡自增id") + private Long supplierBankCardId; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "银行名称") + private String bankName; + + @Schema(description = "银行开户行") + private String openingBank; + + @Schema(description = "收款方户名") + private String recipientName; + + @Schema(description = "收款方账户") + private String cardNo; + + @Schema(description = "是否默认 1:默认 0:非默认") + private Integer isDefault; + + @Schema(description = "支行名称") + private String branchName; + + @Schema(description = "1.正常,-1.已删除") + private Integer status; + + public Long getSupplierBankCardId() { + return supplierBankCardId; + } + + public void setSupplierBankCardId(Long supplierBankCardId) { + this.supplierBankCardId = supplierBankCardId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getOpeningBank() { + return openingBank; + } + + public void setOpeningBank(String openingBank) { + this.openingBank = openingBank; + } + + public String getRecipientName() { + return recipientName; + } + + public void setRecipientName(String recipientName) { + this.recipientName = recipientName; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getBranchName() { + return branchName; + } + + public void setBranchName(String branchName) { + this.branchName = branchName; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "SupplierBankCardVO{" + + "supplierBankCardId=" + supplierBankCardId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",supplierId=" + supplierId + + ",bankName=" + bankName + + ",openingBank=" + openingBank + + ",recipientName=" + recipientName + + ",cardNo=" + cardNo + + ",isDefault=" + isDefault + + ",branchName=" + branchName + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierCompanyAuditingVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierCompanyAuditingVO.java new file mode 100644 index 0000000..c1b2e5d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierCompanyAuditingVO.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 工商信息审核记录 + * + * @author chiley + * @date 2022/9/1 15:59 + */ + +public class SupplierCompanyAuditingVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 工商信息审核id + */ + private Long companyAuditingId; + + /** + * 申请人id + */ + @Schema(description = "申请人id") + private String userId; + + /** + * 供应商id + */ + @Schema(description = "供应商id") + private Long supplierId; + + /** + * 工商信息id + */ + @Schema(description = "工商信息id") + private Long supplierCompanyId; + + /** + * 审核人id + */ + @Schema(description = "审核人id") + private Long auditorId; + + /** + * 审核人id + */ + @Schema(description = "0 未审核 1已通过 -1未通过") + private Integer status; + + /** + * 备注 + */ + @Schema(description = "备注") + private String remarks; + + /** + * 供应商名称 + */ + @Schema(description = "供应商名称") + private String supplierName; + + /** + * 供应商简介 + */ + @Schema(description = "供应商简介") + private String intro; + + /** + * 供应商工商信息 + */ + @Schema(description = "工商信息") + private SupplierCompanyVO supplierCompanyVO; + + public Long getCompanyAuditingId() { + return companyAuditingId; + } + + public void setCompanyAuditingId(Long companyAuditingId) { + this.companyAuditingId = companyAuditingId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getSupplierCompanyId() { + return supplierCompanyId; + } + + public void setSupplierCompanyId(Long supplierCompanyId) { + this.supplierCompanyId = supplierCompanyId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public SupplierCompanyVO getSupplierCompanyVO() { + return supplierCompanyVO; + } + + public void setSupplierCompanyVO(SupplierCompanyVO supplierCompanyVO) { + this.supplierCompanyVO = supplierCompanyVO; + } + + @Override + public String toString() { + return "SupplierCompanyAuditingVO{" + + "companyAuditingId=" + companyAuditingId + + ", userId='" + userId + '\'' + + ", supplierId=" + supplierId + + ", supplierCompanyId=" + supplierCompanyId + + ", auditorId=" + auditorId + + ", status=" + status + + ", remarks='" + remarks + '\'' + + ", supplierName='" + supplierName + '\'' + + ", intro='" + intro + '\'' + + ", supplierCompanyVO=" + supplierCompanyVO + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierCompanyVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierCompanyVO.java new file mode 100644 index 0000000..7ca431b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierCompanyVO.java @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 供应商工商信息VO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierCompanyVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商工商信息id") + private Long supplierCompanyId; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "统一社会信用代码") + private String creditCode; + + @Schema(description = "企业名称") + private String firmName; + + @Schema(description = "住所") + private String residence; + + @Schema(description = "法定代表人") + private String representative; + + @Schema(description = "法人身份证号") + private String legalIds; + + @Schema(description = "法人手机号码") + private String legalPhone; + + @Schema(description = "注册资本(万元)") + private Double capital; + + @Schema(description = "成立日期") + private Date foundTime; + + @Schema(description = "营业起始日期") + private Date startTime; + + @Schema(description = "营业终止日期") + private Date endTime; + + @Schema(description = "经营范围") + private String businessScope; + + @Schema(description = "营业执照") + private String businessLicense; + + @Schema(description = "身份证正面") + private String identityCardFront; + + @Schema(description = "身份证反面") + private String identityCardLater; + + /** + * 审核状态:1:已通过 0待审核 -1未通过 + */ + @Schema(description = "启用状态") + private Integer status; + + @Schema(description = "是否修改过") + private Boolean edit; + + @Schema(description = "最新工商信息状态") + private Integer newStatus; + + public Long getSupplierCompanyId() { + return supplierCompanyId; + } + + public void setSupplierCompanyId(Long supplierCompanyId) { + this.supplierCompanyId = supplierCompanyId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getCreditCode() { + return creditCode; + } + + public void setCreditCode(String creditCode) { + this.creditCode = creditCode; + } + + public String getFirmName() { + return firmName; + } + + public void setFirmName(String firmName) { + this.firmName = firmName; + } + + public String getResidence() { + return residence; + } + + public void setResidence(String residence) { + this.residence = residence; + } + + public String getRepresentative() { + return representative; + } + + public void setRepresentative(String representative) { + this.representative = representative; + } + + public String getLegalIds() { + return legalIds; + } + + public void setLegalIds(String legalIds) { + this.legalIds = legalIds; + } + + public String getLegalPhone() { + return legalPhone; + } + + public void setLegalPhone(String legalPhone) { + this.legalPhone = legalPhone; + } + + public Double getCapital() { + return capital; + } + + public void setCapital(Double capital) { + this.capital = capital; + } + + public Date getFoundTime() { + return foundTime; + } + + public void setFoundTime(Date foundTime) { + this.foundTime = foundTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getBusinessScope() { + return businessScope; + } + + public void setBusinessScope(String businessScope) { + this.businessScope = businessScope; + } + + public String getBusinessLicense() { + return businessLicense; + } + + public void setBusinessLicense(String businessLicense) { + this.businessLicense = businessLicense; + } + + public String getIdentityCardFront() { + return identityCardFront; + } + + public void setIdentityCardFront(String identityCardFront) { + this.identityCardFront = identityCardFront; + } + + public String getIdentityCardLater() { + return identityCardLater; + } + + public void setIdentityCardLater(String identityCardLater) { + this.identityCardLater = identityCardLater; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Boolean getEdit() { + return edit; + } + + public void setEdit(Boolean edit) { + this.edit = edit; + } + + public Integer getNewStatus() { + return newStatus; + } + + public void setNewStatus(Integer newStatus) { + this.newStatus = newStatus; + } + + @Override + public String toString() { + return "SupplierCompanyVO{" + + "supplierCompanyId=" + supplierCompanyId + + ", supplierId=" + supplierId + + ", creditCode='" + creditCode + '\'' + + ", firmName='" + firmName + '\'' + + ", residence='" + residence + '\'' + + ", representative='" + representative + '\'' + + ", legalIds='" + legalIds + '\'' + + ", legalPhone='" + legalPhone + '\'' + + ", capital=" + capital + + ", foundTime=" + foundTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", businessScope='" + businessScope + '\'' + + ", businessLicense='" + businessLicense + '\'' + + ", identityCardFront='" + identityCardFront + '\'' + + ", identityCardLater='" + identityCardLater + '\'' + + ", status=" + status + + ", edit=" + edit + + ", newStatus=" + newStatus + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierDetailVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierDetailVO.java new file mode 100644 index 0000000..37cbaa8 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierDetailVO.java @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 供应商详情VO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierDetailVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "供应商简介") + private String intro; + + @Schema(description = "接收短信号码") + private String noticeMobile; + + @Schema(description = "供应商logo(可修改)") + private String supplierLogo; + + @Schema(description = "供应商移动端背景图") + private String mobileBackgroundPic; + + @Schema(description = "供应商pc背景图") + private String pcBackgroundPic; + + @Schema(description = "供应商状态(-1:已删除 0: 停业中 1:营业中 2:平台下线 3:开店待审核 4:开店申请中 5:上线待审核)") + private Integer supplierStatus; + + @Schema(description = "供应商类型1自营店 2普通店") + private Integer type; + + @Schema(description = "是否优选好店 1.是 0.不是") + private Integer isPreferred; + + @Schema(description = "供应商供应商名称") + private String supplierShopName; + + @Schema(description = "联系人") + private String contactName; + + @Schema(description = "联系方式") + private String contactPhone; + + @Schema(description = "签约起始时间") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + @Schema(description = "是否在通联创建了企业会员 0否1是") + private Integer isCreateMember; + + @Schema(description = "是否在通联绑定了手机号 0否1是") + private Integer isBindPhone; + + @Schema(description = "企业信息审核状态 0.未提交 1.待审核 2.审核成功 3.审核失败") + private Integer companyInfoProcessStatus; + + @Schema(description = "影印件采集审核状态 0.未上传 1.待审核 2.只有工商认证通过 3.只有法人信息通过 4.均审核通过") + private Integer idCardCollectProcessStatus; + + @Schema(description = "通联供应商状态 0未开通 1营业中 2平台下线 3上线待审核 4开店待审核") + private Integer allinpaySupplierStatus; + + @Schema(description = "企业账户提现协议编号") + private String companyAcctProtocolNo; + + @Schema(description = "法人账户提现协议编号") + private String legalAcctProtocolNo; + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public String getNoticeMobile() { + return noticeMobile; + } + + public void setNoticeMobile(String noticeMobile) { + this.noticeMobile = noticeMobile; + } + + public String getSupplierLogo() { + return supplierLogo; + } + + public void setSupplierLogo(String supplierLogo) { + this.supplierLogo = supplierLogo; + } + + public String getMobileBackgroundPic() { + return mobileBackgroundPic; + } + + public void setMobileBackgroundPic(String mobileBackgroundPic) { + this.mobileBackgroundPic = mobileBackgroundPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + public Integer getSupplierStatus() { + return supplierStatus; + } + + public void setSupplierStatus(Integer supplierStatus) { + this.supplierStatus = supplierStatus; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getIsPreferred() { + return isPreferred; + } + + public void setIsPreferred(Integer isPreferred) { + this.isPreferred = isPreferred; + } + + public String getSupplierShopName() { + return supplierShopName; + } + + public void setSupplierShopName(String supplierShopName) { + this.supplierShopName = supplierShopName; + } + + public String getContactName() { + return contactName; + } + + public void setContactName(String contactName) { + this.contactName = contactName; + } + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public Integer getIsCreateMember() { + return isCreateMember; + } + + public void setIsCreateMember(Integer isCreateMember) { + this.isCreateMember = isCreateMember; + } + + public Integer getIsBindPhone() { + return isBindPhone; + } + + public void setIsBindPhone(Integer isBindPhone) { + this.isBindPhone = isBindPhone; + } + + public Integer getCompanyInfoProcessStatus() { + return companyInfoProcessStatus; + } + + public void setCompanyInfoProcessStatus(Integer companyInfoProcessStatus) { + this.companyInfoProcessStatus = companyInfoProcessStatus; + } + + public Integer getIdCardCollectProcessStatus() { + return idCardCollectProcessStatus; + } + + public void setIdCardCollectProcessStatus(Integer idCardCollectProcessStatus) { + this.idCardCollectProcessStatus = idCardCollectProcessStatus; + } + + public Integer getAllinpaySupplierStatus() { + return allinpaySupplierStatus; + } + + public void setAllinpaySupplierStatus(Integer allinpaySupplierStatus) { + this.allinpaySupplierStatus = allinpaySupplierStatus; + } + + public String getCompanyAcctProtocolNo() { + return companyAcctProtocolNo; + } + + public void setCompanyAcctProtocolNo(String companyAcctProtocolNo) { + this.companyAcctProtocolNo = companyAcctProtocolNo; + } + + public String getLegalAcctProtocolNo() { + return legalAcctProtocolNo; + } + + public void setLegalAcctProtocolNo(String legalAcctProtocolNo) { + this.legalAcctProtocolNo = legalAcctProtocolNo; + } + + @Override + public String toString() { + return "SupplierDetailVO{" + + "supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", intro='" + intro + '\'' + + ", noticeMobile='" + noticeMobile + '\'' + + ", supplierLogo='" + supplierLogo + '\'' + + ", mobileBackgroundPic='" + mobileBackgroundPic + '\'' + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", supplierStatus=" + supplierStatus + + ", type=" + type + + ", isPreferred=" + isPreferred + + ", supplierShopName='" + supplierShopName + '\'' + + ", contactName='" + contactName + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + ", isCreateMember=" + isCreateMember + + ", isBindPhone=" + isBindPhone + + ", companyInfoProcessStatus=" + companyInfoProcessStatus + + ", idCardCollectProcessStatus=" + idCardCollectProcessStatus + + ", allinpaySupplierStatus=" + allinpaySupplierStatus + + ", companyAcctProtocolNo='" + companyAcctProtocolNo + '\'' + + ", legalAcctProtocolNo='" + legalAcctProtocolNo + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierRefundAddrVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierRefundAddrVO.java new file mode 100644 index 0000000..9b8142a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierRefundAddrVO.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 供应商退货地址VO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierRefundAddrVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商退货地址id") + private Long supplierRefundAddrId; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "手机") + private String mobile; + + @Schema(description = "默认地址 1:是 0:不是") + private Integer isDefault; + + @Schema(description = "收货人") + private String consignee; + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Schema(description = "地址") + private String addr; + + @Schema(description = "邮编") + private String postCode; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + public Long getSupplierRefundAddrId() { + return supplierRefundAddrId; + } + + public void setSupplierRefundAddrId(Long supplierRefundAddrId) { + this.supplierRefundAddrId = supplierRefundAddrId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "SupplierRefundAddrVO{" + + "supplierRefundAddrId=" + supplierRefundAddrId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",supplierId=" + supplierId + + ",mobile=" + mobile + + ",isDefault=" + isDefault + + ",consignee=" + consignee + + ",provinceId=" + provinceId + + ",province=" + province + + ",cityId=" + cityId + + ",city=" + city + + ",areaId=" + areaId + + ",area=" + area + + ",addr=" + addr + + ",postCode=" + postCode + + ",lng=" + lng + + ",lat=" + lat + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierStatusInfoVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierStatusInfoVO.java new file mode 100644 index 0000000..0bbcc56 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierStatusInfoVO.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @Author lth + * @Date 2021/7/15 16:42 + */ +public class SupplierStatusInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "账号状态, 1:启用 0:禁用 -1:删除") + private Integer accountStatus; + + @Schema(description = "供应商状态(-1:已删除 0: 停业中 1:营业中 2:平台下线 3:开店申请待审核 4:供应商申请中 5:上线申请待审核)") + private Integer supplierStatus; + + @Schema(description = "下线状态 1平台进行下线 2 重新申请,等待审核 3.审核通过 4 审核未通过") + private Integer offlineStatus; + + @Schema(description = "下线原因") + private String offlineReason; + + @Schema(description = "签约起始时间") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + public Integer getAccountStatus() { + return accountStatus; + } + + public void setAccountStatus(Integer accountStatus) { + this.accountStatus = accountStatus; + } + + public Integer getSupplierStatus() { + return supplierStatus; + } + + public void setSupplierStatus(Integer supplierStatus) { + this.supplierStatus = supplierStatus; + } + + public Integer getOfflineStatus() { + return offlineStatus; + } + + public void setOfflineStatus(Integer offlineStatus) { + this.offlineStatus = offlineStatus; + } + + public String getOfflineReason() { + return offlineReason; + } + + public void setOfflineReason(String offlineReason) { + this.offlineReason = offlineReason; + } + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + @Override + public String toString() { + return "SupplierStatusInfoVO{" + + "accountStatus=" + accountStatus + + ", supplierStatus=" + supplierStatus + + ", offlineStatus=" + offlineStatus + + ", offlineReason='" + offlineReason + '\'' + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierUserSimpleVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierUserSimpleVO.java new file mode 100644 index 0000000..cdee6a4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierUserSimpleVO.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/9/2 + */ +public class SupplierUserSimpleVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 供应商名称 + */ + @Schema(description = "供应商名称") + private String supplierName; + /** + * 用户名称 + */ + @Schema(description = "用户名称") + private String userName; + + /** + * 头像 + */ + @Schema(description = "头像") + private String avatar; + + private Integer isAdmin; + + @Schema(description = "供应商是否已经入驻 0: 未入驻,1:已入驻") + private Integer isPassShop; + + private Long tenantId; + + private Long userId; + + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public Integer getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(Integer isAdmin) { + this.isAdmin = isAdmin; + } + + public Integer getIsPassShop() { + return isPassShop; + } + + public void setIsPassShop(Integer isShop) { + this.isPassShop = isShop; + } + + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "SupplierUserSimpleVO{" + + "supplierName='" + supplierName + '\'' + + ", userName='" + userName + '\'' + + ", avatar='" + avatar + '\'' + + ", isAdmin=" + isAdmin + + ", isPassShop=" + isPassShop + + ", tenantId=" + tenantId + + ", userId=" + userId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierWithdrawCashVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierWithdrawCashVO.java new file mode 100644 index 0000000..f015afa --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierWithdrawCashVO.java @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import com.tmerclub.cloud.api.supplier.vo.SupplierBankCardVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 供应商提现申请信息VO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierWithdrawCashVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "序号") + private Long index; + + @Schema(description = "支付系统类型") + private Integer paySysType; + + @Schema(description = "提现id") + private Long cashId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "审核人id") + private Long auditorId; + + @Schema(description = "提现金额") + private Double amount; + + @Schema(description = "审核时间") + private Date auditingTime; + + @Schema(description = "状态(0:未审核、1:已通过 -1:未通过 2:发放成功 3:发放失败)") + private Integer status; + + @Schema(description = "平台备注") + private String remarks; + + @Schema(description = "供应商备注") + private String supplierRemarks; + + @Schema(description = "付款户名") + private String payingAccount; + + @Schema(description = "汇款账户") + private String payingCardNo; + + @Schema(description = "汇款时间") + private Date payingTime; + + @Schema(description = "收款银行卡id") + private Long supplierBankCardId; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "供应商logo") + private String supplierLogo; + + @Schema(description = "提现银行卡") + private SupplierBankCardVO supplierBankCardVO; + + public Long getIndex() { + return index; + } + + public void setIndex(Long index) { + this.index = index; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public SupplierBankCardVO getSupplierBankCardVO() { + return supplierBankCardVO; + } + + public void setSupplierBankCardVO(SupplierBankCardVO supplierBankCardVO) { + this.supplierBankCardVO = supplierBankCardVO; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getSupplierLogo() { + return supplierLogo; + } + + public void setSupplierLogo(String supplierLogo) { + this.supplierLogo = supplierLogo; + } + + public Long getCashId() { + return cashId; + } + + public void setCashId(Long cashId) { + this.cashId = cashId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Double getAmount() { + return amount; + } + + public void setAmount(Double amount) { + this.amount = amount; + } + + public Date getAuditingTime() { + return auditingTime; + } + + public void setAuditingTime(Date auditingTime) { + this.auditingTime = auditingTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getSupplierRemarks() { + return supplierRemarks; + } + + public void setSupplierRemarks(String supplierRemarks) { + this.supplierRemarks = supplierRemarks; + } + + public String getPayingAccount() { + return payingAccount; + } + + public void setPayingAccount(String payingAccount) { + this.payingAccount = payingAccount; + } + + public String getPayingCardNo() { + return payingCardNo; + } + + public void setPayingCardNo(String payingCardNo) { + this.payingCardNo = payingCardNo; + } + + public Date getPayingTime() { + return payingTime; + } + + public void setPayingTime(Date payingTime) { + this.payingTime = payingTime; + } + + public Long getSupplierBankCardId() { + return supplierBankCardId; + } + + public void setSupplierBankCardId(Long supplierBankCardId) { + this.supplierBankCardId = supplierBankCardId; + } + + @Override + public String toString() { + return "SupplierWithdrawCashVO{" + + "index=" + index + + ", paySysType=" + paySysType + + ", cashId=" + cashId + + ", supplierId=" + supplierId + + ", auditorId=" + auditorId + + ", amount=" + amount + + ", auditingTime=" + auditingTime + + ", status=" + status + + ", remarks='" + remarks + '\'' + + ", supplierRemarks='" + supplierRemarks + '\'' + + ", payingAccount='" + payingAccount + '\'' + + ", payingCardNo='" + payingCardNo + '\'' + + ", payingTime=" + payingTime + + ", supplierBankCardId=" + supplierBankCardId + + ", supplierName='" + supplierName + '\'' + + ", supplierLogo='" + supplierLogo + '\'' + + ", supplierBankCardVO=" + supplierBankCardVO + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/mongo/MongoPurchaseAmountLogVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/mongo/MongoPurchaseAmountLogVO.java new file mode 100644 index 0000000..f30ae3e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/mongo/MongoPurchaseAmountLogVO.java @@ -0,0 +1,155 @@ +package com.tmerclub.cloud.supplier.vo.mongo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.time.LocalDateTime; + +/** + * @author gaozijie + * @date 2023-08-28 + */ +public class MongoPurchaseAmountLogVO { + + @Schema(description = "采购日志Id") + private Long purchaseLogId; + + @Schema(description = "商家Id") + private Long shopId; + + @Schema(description = "商家名称") + private String shopName; + + @Schema(description = "供应商Id") + private Long supplierId; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "采购金额类型(-1:采购作废金额, 0:采购收入|支出金额)") + private Integer purchaseAmountType; + + @Schema(description = "采购订单编号") + private Long purchaseOrderId; + + @Schema(description = "改变金额") + private Long changeAmount; + + @Schema(description = "采购总价") + private Long purchaseTotalAmount; + + @Schema(description = "采购商品数量") + private Integer prodCount; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建时间") + private LocalDateTime createTime; + + public MongoPurchaseAmountLogVO() { + } + + public Long getPurchaseLogId() { + return purchaseLogId; + } + + public void setPurchaseLogId(Long purchaseLogId) { + this.purchaseLogId = purchaseLogId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Integer getPurchaseAmountType() { + return purchaseAmountType; + } + + public void setPurchaseAmountType(Integer purchaseAmountType) { + this.purchaseAmountType = purchaseAmountType; + } + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Long getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(Long changeAmount) { + this.changeAmount = changeAmount; + } + + public Long getPurchaseTotalAmount() { + return purchaseTotalAmount; + } + + public void setPurchaseTotalAmount(Long purchaseTotalAmount) { + this.purchaseTotalAmount = purchaseTotalAmount; + } + + public Integer getProdCount() { + return prodCount; + } + + public void setProdCount(Integer prodCount) { + this.prodCount = prodCount; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "MongoPurchaseLogVO{" + + "purchaseLogId=" + purchaseLogId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", purchaseAmountType=" + purchaseAmountType + + ", purchaseOrderId=" + purchaseOrderId + + ", changeAmount=" + changeAmount + + ", purchaseTotalAmount=" + purchaseTotalAmount + + ", prodCount=" + prodCount + + ", createTime=" + createTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/mongo/MongoSupplierWalletLogVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/mongo/MongoSupplierWalletLogVO.java new file mode 100644 index 0000000..2d255f9 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/mongo/MongoSupplierWalletLogVO.java @@ -0,0 +1,46 @@ +package com.tmerclub.cloud.supplier.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * mongo返回的字段 + * @author 菠萝凤梨 + */ +@Document("supplier_wallet_log") +public class MongoSupplierWalletLogVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商日志数") + private Long supplierLogCount; + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getSupplierLogCount() { + return supplierLogCount; + } + + public void setSupplierLogCount(Long supplierLogCount) { + this.supplierLogCount = supplierLogCount; + } + + @Override + public String toString() { + return "MongoShopWalletLogVO{" + + "shopId=" + supplierId + + ", shopLogCount=" + supplierLogCount + + '}'; + } +} diff --git a/tmerclub-admin/src/main/resources/bootstrap.yml b/tmerclub-admin/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..abf3dd5 --- /dev/null +++ b/tmerclub-admin/src/main/resources/bootstrap.yml @@ -0,0 +1,29 @@ +server: + port: ${MALL4CLOUD_PORT:9112} +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} +logging: + tracer: + pattern: '%5p [${spring.application.name:},%X{X-B3-Parent-SpanName},%X{X-B3-TraceId},%X{X-B3-SpanId}]' + +# dubbo端口:默认为服务端口+2000 +dubbo: + protocol: + port: ${MALL4CLOUD_DUBBO_PORT:9512} + diff --git a/tmerclub-admin/src/main/resources/mapper/CompanyAuditingMapper.xml b/tmerclub-admin/src/main/resources/mapper/CompanyAuditingMapper.xml new file mode 100644 index 0000000..a43c9f7 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/CompanyAuditingMapper.xml @@ -0,0 +1,81 @@ + + + + + + `company_auditing_id`,`user_id`,`shop_id`,`shop_company_id`,`auditor_id`,`create_time`,`update_time`,`status`,`remarks` + + + + update company_auditing + + + `user_id` = #{shopCompanyAuditing.userId}, + + + `shop_id` = #{shopCompanyAuditing.shopId}, + + + `auditor_id` = #{shopCompanyAuditing.auditorId}, + + + `status` = #{shopCompanyAuditing.status}, + + + `remarks` = #{shopCompanyAuditing.remarks}, + + + where company_auditing_id = #{shopCompanyAuditing.companyAuditingId} + + + + + insert into company_auditing(`user_id`, `shop_id`, `shop_company_id`, `auditor_id`, `status`, `remarks`) + values (#{shopCompanyAuditing.userId}, #{shopCompanyAuditing.shopId}, #{shopCompanyAuditing.shopCompanyId}, + #{shopCompanyAuditing.auditorId}, #{shopCompanyAuditing.status}, #{shopCompanyAuditing.remarks}); + + + delete + from company_auditing + where company_auditing_id = #{shopCompanyAuditingId} + + + diff --git a/tmerclub-admin/src/main/resources/mapper/OfflineHandleEventMapper.xml b/tmerclub-admin/src/main/resources/mapper/OfflineHandleEventMapper.xml new file mode 100644 index 0000000..e0edd5d --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/OfflineHandleEventMapper.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `event_id`,`create_time`,`update_time`,`handle_type`,`handle_id`,`shop_id`,`handler_id`,`status`,`offline_reason` + + + + + insert into offline_handle_event (`handle_type`,`handle_id`,`shop_id`,`sys_type`,`handler_id`,`status`,`offline_reason`) + values (#{offlineHandleEvent.handleType},#{offlineHandleEvent.handleId},#{offlineHandleEvent.shopId},#{offlineHandleEvent.sysType},#{offlineHandleEvent.handlerId},#{offlineHandleEvent.status},#{offlineHandleEvent.offlineReason}); + + + update offline_handle_event + + + `handle_type` = #{offlineHandleEvent.handleType}, + + + `handle_id` = #{offlineHandleEvent.handleId}, + + + `shop_id` = #{offlineHandleEvent.shopId}, + + + `sys_type` = #{offlineHandleEvent.sysType}, + + + `handler_id` = #{offlineHandleEvent.handlerId}, + + + `status` = #{offlineHandleEvent.status}, + + + `offline_reason` = #{offlineHandleEvent.offlineReason}, + + + where event_id = #{offlineHandleEvent.eventId} + + + delete from offline_handle_event where handle_type = #{handleType} and handle_id = #{handleId} + + + UPDATE offline_handle_event e SET e.`status` = 2 + WHERE e.`event_id` = #{eventId} + + + + + + + insert into offline_handle_event (`handle_type`,`sys_type`,`handle_id`,`shop_id`,`handler_id`,`status`,`offline_reason`) values + + (#{offlineHandleEvent.handleType},#{offlineHandleEvent.sysType},#{offlineHandleEvent.handleId},#{offlineHandleEvent.shopId},#{offlineHandleEvent.handlerId},#{offlineHandleEvent.status},#{offlineHandleEvent.offlineReason}) + + + diff --git a/tmerclub-admin/src/main/resources/mapper/PublicBankMapper.xml b/tmerclub-admin/src/main/resources/mapper/PublicBankMapper.xml new file mode 100644 index 0000000..ecba3e3 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/PublicBankMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + INSERT INTO + `public_bank` (`bank_name`, `bank_code`, `create_time`, `update_time`) + VALUES + (#{publicBankDTO.bankName}, #{publicBankDTO.bankCode}, NOW(), NOW()) + + + + UPDATE + `public_bank` + SET + + bank_name = #{publicBankDTO.bankName}, + + + bank_code = #{publicBankDTO.bankCode}, + + update_time = NOW() + WHERE + bank_id = #{publicBankDTO.bankId} + + + + DELETE FROM + `public_bank` + WHERE + bank_id IN + + #{bankId} + + + + + \ No newline at end of file diff --git a/tmerclub-admin/src/main/resources/mapper/ShopAuditingMapper.xml b/tmerclub-admin/src/main/resources/mapper/ShopAuditingMapper.xml new file mode 100644 index 0000000..aa520ae --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/ShopAuditingMapper.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + `shop_auditing_id`,`create_time`,`update_time`,`user_id`,`shop_id`,`auditor_id`,`status`,`remarks` + + + + + insert into shop_auditing (`user_id`,`shop_id`,`auditor_id`,`status`,`remarks`) + values (#{shopAuditing.userId},#{shopAuditing.shopId},#{shopAuditing.auditorId},#{shopAuditing.status},#{shopAuditing.remarks}); + + + update shop_auditing + + + `user_id` = #{shopAuditing.userId}, + + + `shop_id` = #{shopAuditing.shopId}, + + + `auditor_id` = #{shopAuditing.auditorId}, + + + `status` = #{shopAuditing.status}, + + + `remarks` = #{shopAuditing.remarks}, + + + `update_time` = #{shopAuditing.updateTime}, + + + where shop_auditing_id = #{shopAuditing.shopAuditingId} + + + delete from shop_auditing where shop_auditing_id = #{shopAuditingId} + + + + + update shop_auditing set status = -1 + where status = 0 and shop_id in + + #{shopId} + + + diff --git a/tmerclub-admin/src/main/resources/mapper/ShopExtensionMapper.xml b/tmerclub-admin/src/main/resources/mapper/ShopExtensionMapper.xml new file mode 100644 index 0000000..b927eb8 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/ShopExtensionMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + `shop_extension_id`,`shop_id`,`create_time`,`update_time`,`sale_num`,`collection_num` + + + insert into shop_extension (`shop_id`) + values (#{shopExtension.shopId}); + + + update shop_extension + + + `sale_num` = #{shopExtension.saleNum}, + + + `collection_num` = #{shopExtension.collectionNum}, + + + where shop_Id = #{shopExtension.shopId} + + + + diff --git a/tmerclub-admin/src/main/resources/mapper/ShopSubstituteSalesMapper.xml b/tmerclub-admin/src/main/resources/mapper/ShopSubstituteSalesMapper.xml new file mode 100644 index 0000000..624ad26 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/ShopSubstituteSalesMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + `shop_substitute_sales_id`,`shop_id`,`sales_type`,`sales_price_type`,`sales_price`,`modifier`,`order_shape`,`automatic_off` + + + + + + insert into shop_substitute_sales (`shop_id`,`sales_type`,`sales_price_type`,`sales_price`,`order_shape`,`modifier`,`automatic_off`) + values (#{shopSubstituteSales.shopId},#{shopSubstituteSales.salesType},#{shopSubstituteSales.salesPriceType},#{shopSubstituteSales.salesPrice},#{shopSubstituteSales.orderShape},#{shopSubstituteSales.modifier},#{shopSubstituteSales.automaticOff}); + + + update shop_substitute_sales + + + `shop_id` = #{shopSubstituteSales.shopId}, + + + `sales_type` = #{shopSubstituteSales.salesType}, + + + `sales_price_type` = #{shopSubstituteSales.salesPriceType}, + + + `sales_price` = #{shopSubstituteSales.salesPrice}, + + + `order_shape` = #{shopSubstituteSales.orderShape}, + + + `modifier` = #{shopSubstituteSales.modifier}, + + + `automatic_off` = #{shopSubstituteSales.automaticOff}, + + + where shop_substitute_sales_id = #{shopSubstituteSales.shopSubstituteSalesId} + + + delete from shop_substitute_sales where shop_substitute_sales_id = #{shopSubstituteSalesId} + + + diff --git a/tmerclub-admin/src/main/resources/mapper/ShopWithdrawCashMapper.xml b/tmerclub-admin/src/main/resources/mapper/ShopWithdrawCashMapper.xml new file mode 100644 index 0000000..fcbdda6 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/ShopWithdrawCashMapper.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `cash_id`, `pay_sys_type`,`create_time`,`update_time`,`shop_id`,`auditor_id`,`amount`,`auditing_time`,`status`,`remarks`,`shop_remarks`,`paying_account`,`paying_card_no`,`paying_time`,`shop_bank_card_id`,`allinpay_status`,`biz_order_no`,`pay_fail_message` + + + + + + + + insert into shop_withdraw_cash (`pay_sys_type`,`shop_id`,`auditor_id`,`amount`,`auditing_time`,`status`,`remarks`,`shop_remarks`,`paying_account`,`paying_card_no`,`paying_time`,`shop_bank_card_id`,`allinpay_status`,`biz_order_no`) + values (#{shopWithdrawCash.paySysType},#{shopWithdrawCash.shopId},#{shopWithdrawCash.auditorId},#{shopWithdrawCash.amount},#{shopWithdrawCash.auditingTime},#{shopWithdrawCash.status},#{shopWithdrawCash.remarks},#{shopWithdrawCash.shopRemarks},#{shopWithdrawCash.payingAccount},#{shopWithdrawCash.payingCardNo},#{shopWithdrawCash.payingTime},#{shopWithdrawCash.shopBankCardId},#{shopWithdrawCash.allinpayStatus},#{shopWithdrawCash.bizOrderNo}); + + + update shop_withdraw_cash + + + `shop_id` = #{shopWithdrawCash.shopId}, + + + `auditor_id` = #{shopWithdrawCash.auditorId}, + + + `amount` = #{shopWithdrawCash.amount}, + + + `auditing_time` = #{shopWithdrawCash.auditingTime}, + + + `status` = #{shopWithdrawCash.status}, + + + `remarks` = #{shopWithdrawCash.remarks}, + + + `shop_remarks` = #{shopWithdrawCash.shopRemarks}, + + + `paying_account` = #{shopWithdrawCash.payingAccount}, + + + `paying_card_no` = #{shopWithdrawCash.payingCardNo}, + + + `paying_time` = #{shopWithdrawCash.payingTime}, + + + `shop_bank_card_id` = #{shopWithdrawCash.shopBankCardId}, + + + `allinpay_status` = #{shopWithdrawCash.allinpayStatus}, + + + `pay_fail_message` = #{shopWithdrawCash.payFailMessage}, + + + where cash_id = #{shopWithdrawCash.cashId} + + + update shop_withdraw_cash + + + `shop_id` = #{shopWithdrawCash.shopId}, + + + `auditor_id` = #{shopWithdrawCash.auditorId}, + + + `amount` = #{shopWithdrawCash.amount}, + + + `auditing_time` = #{shopWithdrawCash.auditingTime}, + + + `status` = #{shopWithdrawCash.status}, + + + `remarks` = #{shopWithdrawCash.remarks}, + + + `shop_remarks` = #{shopWithdrawCash.shopRemarks}, + + + `paying_account` = #{shopWithdrawCash.payingAccount}, + + + `paying_card_no` = #{shopWithdrawCash.payingCardNo}, + + + `paying_time` = #{shopWithdrawCash.payingTime}, + + + `shop_bank_card_id` = #{shopWithdrawCash.shopBankCardId}, + + + where cash_id = #{cashId} and status = #{status} + + diff --git a/tmerclub-admin/src/main/resources/mapper/SupplierBankCardMapper.xml b/tmerclub-admin/src/main/resources/mapper/SupplierBankCardMapper.xml new file mode 100644 index 0000000..d9f16b6 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SupplierBankCardMapper.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + `supplier_bank_card_id`,`create_time`,`update_time`,`supplier_id`,`bank_name`,`opening_bank`,`recipient_name`,`card_no`, + `branch_name`,`is_default`,`bank_card_no`,`bank_card_pro`,`union_bank`,`status` + + + + + + + insert into supplier_bank_card (`supplier_id`,`bank_name`,`opening_bank`,`recipient_name`,`card_no`,`branch_name`,`is_default`,`bank_card_no`,`bank_card_pro`,`union_bank`,`status`) + values (#{supplierBankCard.supplierId},#{supplierBankCard.bankName},#{supplierBankCard.openingBank},#{supplierBankCard.recipientName},#{supplierBankCard.cardNo},#{supplierBankCard.branchName},#{supplierBankCard.isDefault},#{supplierBankCard.bankCardNo},#{supplierBankCard.bankCardPro},#{supplierBankCard.unionBank},#{supplierBankCard.status}); + + + insert into supplier_bank_card (`supplier_id`,`bank_name`,`opening_bank`,`recipient_name`,`card_no`,`branch_name`,`is_default`,`bank_card_no`,`bank_card_pro`,`union_bank`) values + + (#{supplierId},#{supplierBankCard.bankName},#{supplierBankCard.openingBank},#{supplierBankCard.recipientName},#{supplierBankCard.cardNo},#{supplierBankCard.branchName},#{supplierBankCard.isDefault},#{supplierBankCard.bankCardNo},#{supplierBankCard.bankCardPro},#{supplierBankCard.unionBank}) + + + + + update supplier_bank_card + + + `supplier_id` = #{supplierBankCard.supplierId}, + + + `bank_name` = #{supplierBankCard.bankName}, + + + `opening_bank` = #{supplierBankCard.openingBank}, + + + `recipient_name` = #{supplierBankCard.recipientName}, + + + `card_no` = #{supplierBankCard.cardNo}, + + + `branch_name` = #{supplierBankCard.branchName}, + + + `is_default` = #{supplierBankCard.isDefault}, + + + `status` = #{supplierBankCard.status}, + + + `bank_card_no` = #{supplierBankCard.bankCardNo}, + + + `bank_card_pro` = #{supplierBankCard.bankCardPro}, + + + `union_bank` = #{supplierBankCard.unionBank}, + + + where supplier_bank_card_id = #{supplierBankCard.supplierBankCardId} + + + UPDATE supplier_bank_card + SET is_default = + IF( supplier_bank_card_id = #{supplierBankCardId}, 1, 0 ) + WHERE + supplier_id = #{supplierId} + + + UPDATE supplier_bank_card + SET is_default = 0 + WHERE supplier_id = #{supplierId} and supplier_bank_card_id = #{supplierBankCardId} + + + UPDATE supplier_bank_card + SET status = -1 + WHERE supplier_bank_card_id = #{supplierBankCardId} + + + delete from supplier_bank_card where supplier_id = #{supplierId} + + + diff --git a/tmerclub-admin/src/main/resources/mapper/SupplierCompanyAuditingMapper.xml b/tmerclub-admin/src/main/resources/mapper/SupplierCompanyAuditingMapper.xml new file mode 100644 index 0000000..3338399 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SupplierCompanyAuditingMapper.xml @@ -0,0 +1,97 @@ + + + + + + `company_auditing_id`,`user_id`,`supplier_id`,`supplier_company_id`,`auditor_id`,`create_time`,`update_time`,`status`,`remarks` + + + + + + update supplier_company_auditing + + + `user_id` = #{supplierCompanyAuditing.userId}, + + + `supplier_id` = #{supplierCompanyAuditing.supplierId}, + + + `supplier_company_id` = #{supplierCompanyAuditing.supplierCompanyId}, + + + `auditor_id` = #{supplierCompanyAuditing.auditorId}, + + + `status` = #{supplierCompanyAuditing.status}, + + + `remarks` = #{supplierCompanyAuditing.remarks}, + + + where company_auditing_id = #{supplierCompanyAuditing.companyAuditingId} + + + + + insert into supplier_company_auditing(`user_id`, `supplier_id`, `supplier_company_id`, `auditor_id`, `status`, `remarks`) + values (#{supplierCompanyAuditing.userId}, #{supplierCompanyAuditing.supplierId}, + #{supplierCompanyAuditing.supplierCompanyId}, #{supplierCompanyAuditing.auditorId}, + #{supplierCompanyAuditing.status}, #{supplierCompanyAuditing.remarks}); + + + delete + from supplier_company_auditing + where company_auditing_id = #{supplierCompanyAuditingId} + + + + diff --git a/tmerclub-admin/src/main/resources/mapper/SupplierCompanyMapper.xml b/tmerclub-admin/src/main/resources/mapper/SupplierCompanyMapper.xml new file mode 100644 index 0000000..ade5bc0 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SupplierCompanyMapper.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + `supplier_company_id`,`supplier_id`,`create_time`,`update_time`,`credit_code`,`firm_name`,`residence`,`representative`,`capital`,`found_time`, + `start_time`,`end_time`,`business_scope`,`business_license`,`identity_card_front`,`identity_card_later`,`legal_ids`,`legal_phone` + + + + + + insert into supplier_company (`supplier_id`,`credit_code`,`firm_name`,`residence`,`representative`,`capital`,`found_time`,`start_time`,`end_time`, + `business_scope`,`business_license`,`identity_card_front`,`identity_card_later`,`status`,`legal_ids`,`legal_phone`) + values (#{supplierCompany.supplierId},#{supplierCompany.creditCode},#{supplierCompany.firmName},#{supplierCompany.residence}, + #{supplierCompany.representative},#{supplierCompany.capital},#{supplierCompany.foundTime},#{supplierCompany.startTime},#{supplierCompany.endTime}, + #{supplierCompany.businessScope},#{supplierCompany.businessLicense},#{supplierCompany.identityCardFront},#{supplierCompany.identityCardLater}, + #{supplierCompany.status},#{supplierCompany.legalIds},#{supplierCompany.legalPhone}); + + + update supplier_company + + + `supplier_id` = #{supplierCompany.supplierId}, + + + `credit_code` = #{supplierCompany.creditCode}, + + + `firm_name` = #{supplierCompany.firmName}, + + + `residence` = #{supplierCompany.residence}, + + + `representative` = #{supplierCompany.representative}, + + + `legal_ids` = #{supplierCompany.legalIds}, + + + `legal_phone` = #{supplierCompany.legalPhone}, + + + `capital` = #{supplierCompany.capital}, + + + `found_time` = #{supplierCompany.foundTime}, + + + `start_time` = #{supplierCompany.startTime}, + + `end_time` = #{supplierCompany.endTime}, + + `business_scope` = #{supplierCompany.businessScope}, + + + `business_license` = #{supplierCompany.businessLicense}, + + + `identity_card_front` = #{supplierCompany.identityCardFront}, + + + `identity_card_later` = #{supplierCompany.identityCardLater}, + + + `status` = #{supplierCompany.status}, + + + where supplier_company_id = #{supplierCompany.supplierCompanyId} + + + update supplier_company + + + `supplier_id` = #{supplierCompany.supplierId}, + + + `credit_code` = #{supplierCompany.creditCode}, + + + `firm_name` = #{supplierCompany.firmName}, + + `residence` = #{supplierCompany.residence}, + `representative` = #{supplierCompany.representative}, + `capital` = #{supplierCompany.capital}, + `found_time` = #{supplierCompany.foundTime}, + + `legal_ids` = #{supplierCompany.legalIds}, + + + `legal_phone` = #{supplierCompany.legalPhone}, + + + `start_time` = #{supplierCompany.startTime}, + + `end_time` = #{supplierCompany.endTime}, + + `business_scope` = #{supplierCompany.businessScope}, + + + `business_license` = #{supplierCompany.businessLicense}, + + + `identity_card_front` = #{supplierCompany.identityCardFront}, + + + `identity_card_later` = #{supplierCompany.identityCardLater}, + + + `status` = #{supplierCompany.status}, + + + where supplier_id = #{supplierId} + + and status = 1 + + + limit 1 + + + + update supplier_company set `status` = #{status} + where supplier_id = #{supplierId} + + and `status` = #{dbStatus} + + + + delete from supplier_company where supplier_id = #{supplierId} and `status` = #{status} + + + + + update supplier_company + + `update_time` = NOW(), + + `status` = #{supplierCompany.status}, + + + where supplier_company_id = #{supplierCompany.supplierCompanyId} + + + update supplier_company + + + `business_license` = #{supplierCompany.businessLicense}, + + + `identity_card_front` = #{supplierCompany.identityCardFront}, + + + `identity_card_later` = #{supplierCompany.identityCardLater}, + + + where supplier_company_id = #{supplierCompany.supplierCompanyId} + + + update supplier_company set `status` = 0 where `status` = 1 + + diff --git a/tmerclub-admin/src/main/resources/mapper/SupplierRefundAddrMapper.xml b/tmerclub-admin/src/main/resources/mapper/SupplierRefundAddrMapper.xml new file mode 100644 index 0000000..9ea8934 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SupplierRefundAddrMapper.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + `supplier_refund_addr_id`,`create_time`,`update_time`,`supplier_id`,`mobile`,`is_default`,`consignee`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`post_code`,`addr`,`lng`,`lat` + + + + + insert into supplier_refund_addr (`supplier_id`,`mobile`,`is_default`,`consignee`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`post_code`,`addr`,`lng`,`lat`) + values (#{supplierRefundAddr.supplierId},#{supplierRefundAddr.mobile},#{supplierRefundAddr.isDefault},#{supplierRefundAddr.consignee},#{supplierRefundAddr.provinceId},#{supplierRefundAddr.province},#{supplierRefundAddr.cityId},#{supplierRefundAddr.city},#{supplierRefundAddr.areaId},#{supplierRefundAddr.area},#{supplierRefundAddr.postCode},#{supplierRefundAddr.addr},#{supplierRefundAddr.lng},#{supplierRefundAddr.lat}); + + + update supplier_refund_addr + + + `mobile` = #{supplierRefundAddr.mobile}, + + + `is_default` = #{supplierRefundAddr.isDefault}, + + + `consignee` = #{supplierRefundAddr.consignee}, + + + `province_id` = #{supplierRefundAddr.provinceId}, + + + `province` = #{supplierRefundAddr.province}, + + + `city_id` = #{supplierRefundAddr.cityId}, + + + `city` = #{supplierRefundAddr.city}, + + + `area_id` = #{supplierRefundAddr.areaId}, + + + `area` = #{supplierRefundAddr.area}, + + + `post_code` = #{supplierRefundAddr.postCode}, + + + `addr` = #{supplierRefundAddr.addr}, + + + `lng` = #{supplierRefundAddr.lng}, + + + `lat` = #{supplierRefundAddr.lat}, + + + where supplier_refund_addr_id = #{supplierRefundAddr.supplierRefundAddrId} + + + delete from supplier_refund_addr where supplier_refund_addr_id = #{supplierRefundAddrId} + + + + + + UPDATE supplier_refund_addr SET `is_default` = 0 WHERE `supplier_id` = #{supplierId} + + diff --git a/tmerclub-admin/src/main/resources/mapper/SupplierUserMapper.xml b/tmerclub-admin/src/main/resources/mapper/SupplierUserMapper.xml new file mode 100644 index 0000000..65abcc5 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SupplierUserMapper.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + supplier_user_id, create_time, update_time, supplier_id, nick_name,`code`,phone_num,has_account + + + + + + insert into `supplier_user` ( `supplier_user_id`, `supplier_id`, `nick_name`, `code`, `phone_num`,has_account) + values (#{supplierUser.supplierUserId},#{supplierUser.supplierId},#{supplierUser.nickName},#{supplierUser.code},#{supplierUser.phoneNum}, #{supplierUser.hasAccount}); + + + update supplier_user + + + nick_name = #{supplierUser.nickName}, + + + code = #{supplierUser.code}, + + + phone_num = #{supplierUser.phoneNum}, + + + has_account = #{supplierUser.hasAccount}, + + + where supplier_user_id = #{supplierUser.supplierUserId} and supplier_id = #{supplierUser.supplierId} + + + + UPDATE supplier_user SET supplier_id = #{supplierId} WHERE supplier_user_id = #{supplierUserId} LIMIT 1 + + + + delete from supplier_user where supplier_user_id = #{supplierUserId} + + + + + + diff --git a/tmerclub-admin/src/main/resources/mapper/SupplierWalletMapper.xml b/tmerclub-admin/src/main/resources/mapper/SupplierWalletMapper.xml new file mode 100644 index 0000000..0a012a6 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SupplierWalletMapper.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + `supplier_wallet_id`, + `pay_sys_type`, + `create_time`, + `update_time`, + `supplier_id`, + `unsettled_amount`, + `settled_amount`, + `freeze_amount`, + `total_settled_amount`, + `version` + + + insert into supplier_wallet (`pay_sys_type`,`supplier_id`, `unsettled_amount`, `settled_amount`, `freeze_amount`, + `total_settled_amount`, `version`) + values (#{supplierWallet.paySysType},#{supplierWallet.supplierId}, #{supplierWallet.unsettledAmount}, #{supplierWallet.settledAmount}, + #{supplierWallet.freezeAmount}, #{supplierWallet.totalSettledAmount}, + #{supplierWallet.version}); + + + + + + update supplier_wallet + set unsettled_amount = unsettled_amount + #{changeAmount} + where supplier_id = #{supplierId} and pay_sys_type = #{paySysType} + and unsettled_amount >= -#{changeAmount} + + + + update supplier_wallet + set settled_amount = settled_amount + #{settledAmount} + + , total_settled_amount = total_settled_amount + #{settledAmount} + + where supplier_id = #{supplierId} and pay_sys_type = #{paySysType} + + + + update supplier_wallet + set settled_amount = settled_amount - #{settledAmount} + where supplier_id = #{supplierId} + and settled_amount >= #{settledAmount} and pay_sys_type = #{paySysType} + + + + update supplier_wallet + set unsettled_amount = unsettled_amount - #{supplierRealRefundAmount} + where supplier_id = #{supplierId} + and unsettled_amount >= #{supplierRealRefundAmount} and pay_sys_type = #{paySysType} + + + + update supplier_wallet + set freeze_amount = freeze_amount + #{changeAmount} + where supplier_id = #{supplierId} and pay_sys_type = #{paySysType} + + + + update supplier_wallet + set freeze_amount = freeze_amount - #{changeAmount} + where supplier_id = #{supplierId} and pay_sys_type = #{paySysType} + and freeze_amount >= #{changeAmount} + + + + + + diff --git a/tmerclub-admin/src/main/resources/mapper/WebConfigMapper.xml b/tmerclub-admin/src/main/resources/mapper/WebConfigMapper.xml new file mode 100644 index 0000000..f730145 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/WebConfigMapper.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `id`,`config_type`,`is_activity`,`login_logo_img`,`login_bg_img`,`copyright_cn`,`copyright_en`,`title_content_cn`,`title_content_en`,`title_img`,`bs_menu_title_open_cn`,`bs_menu_title_open_en`,`bs_menu_title_close_cn`,`bs_menu_title_close_en`,`bs_top_bar_icon`,`pc_qrcode_img`,`pc_company_name_cn`,`pc_company_name_en`,`pc_company_name_short_cn`,`pc_company_name_short_en`,`pc_logo_img_text`,`pc_welcome_cn`,`pc_welcome_en`,`pc_company_info_cn`,`pc_company_info_en` + + + + + insert into web_config (`config_type`,`is_activity`,`login_logo_img`,`login_bg_img`,`copyright_cn`,`copyright_en`,`title_content_cn`,`title_content_en`,`title_img`,`bs_menu_title_open_cn`,`bs_menu_title_open_en`,`bs_menu_title_close_cn`,`bs_menu_title_close_en`,`bs_top_bar_icon`,`pc_qrcode_img`,`pc_company_name_cn`,`pc_company_name_en`,`pc_company_name_short_cn`,`pc_company_name_short_en`,`pc_logo_img_text`,`pc_welcome_cn`,`pc_welcome_en`,`pc_company_info_cn`,`pc_company_info_en`) + values (#{webConfig.configType},#{webConfig.isActivity},#{webConfig.loginLogoImg},#{webConfig.loginBgImg},#{webConfig.copyrightCn},#{webConfig.copyrightEn},#{webConfig.titleContentCn},#{webConfig.titleContentEn},#{webConfig.titleImg},#{webConfig.bsMenuTitleOpenCn},#{webConfig.bsMenuTitleOpenEn},#{webConfig.bsMenuTitleCloseCn},#{webConfig.bsMenuTitleCloseEn},#{webConfig.bsTopBarIcon},#{webConfig.pcQrcodeImg},#{webConfig.pcCompanyNameCn},#{webConfig.pcCompanyNameEn},#{webConfig.pcCompanyNameShortCn},#{webConfig.pcCompanyNameShortEn},#{webConfig.pcLogoImgText},#{webConfig.pcWelcomeCn},#{webConfig.pcWelcomeEn},#{webConfig.pcCompanyInfoCn},#{webConfig.pcCompanyInfoEn}); + + + update web_config + + + `config_type` = #{webConfig.configType}, + + + `is_activity` = #{webConfig.isActivity}, + + + `login_logo_img` = #{webConfig.loginLogoImg}, + + + `login_bg_img` = #{webConfig.loginBgImg}, + + + `copyright_cn` = #{webConfig.copyrightCn}, + + + `copyright_en` = #{webConfig.copyrightEn}, + + + `title_content_cn` = #{webConfig.titleContentCn}, + + + `title_content_en` = #{webConfig.titleContentEn}, + + + `title_img` = #{webConfig.titleImg}, + + + `bs_menu_title_open_cn` = #{webConfig.bsMenuTitleOpenCn}, + + + `bs_menu_title_open_en` = #{webConfig.bsMenuTitleOpenEn}, + + + `bs_menu_title_close_cn` = #{webConfig.bsMenuTitleCloseCn}, + + + `bs_menu_title_close_en` = #{webConfig.bsMenuTitleCloseEn}, + + + `bs_top_bar_icon` = #{webConfig.bsTopBarIcon}, + + + `pc_qrcode_img` = #{webConfig.pcQrcodeImg}, + + + `pc_company_name_cn` = #{webConfig.pcCompanyNameCn}, + + + `pc_company_name_en` = #{webConfig.pcCompanyNameEn}, + + + `pc_company_name_short_cn` = #{webConfig.pcCompanyNameShortCn}, + + + `pc_company_name_short_en` = #{webConfig.pcCompanyNameShortEn}, + + + `pc_logo_img_text` = #{webConfig.pcLogoImgText}, + + + `pc_welcome_cn` = #{webConfig.pcWelcomeCn}, + + + `pc_welcome_en` = #{webConfig.pcWelcomeEn}, + + + `pc_company_info_cn` = #{webConfig.pcCompanyInfoCn}, + + + `pc_company_info_en` = #{webConfig.pcCompanyInfoEn}, + + + where id = #{webConfig.id} + + + delete from web_config where id = #{id} + + + update web_config set is_activity = 0 where config_type = #{configType} and is_activity = 1 + + + + diff --git a/tmerclub-api/tmerclub-api-admin/pom.xml b/tmerclub-api/tmerclub-api-admin/pom.xml new file mode 100644 index 0000000..9b19521 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/pom.xml @@ -0,0 +1,28 @@ + + + + tmerclub-api + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api-admin + jar + 后台管理对内接口 + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + com.moyuer.cloud + tmerclub-api-payment + ${project.version} + + + + diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/bo/ShopSimpleBO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/bo/ShopSimpleBO.java new file mode 100644 index 0000000..a1f9b3c --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/bo/ShopSimpleBO.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author lth + * @Date 2021/8/11 10:05 + */ +public class ShopSimpleBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "shopId") + private Long shopId; + + @Schema(description = "店铺id列表") + private List shopIds; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "店铺状态") + private Integer shopStatus; + + @Schema(description = "店铺类型") + private Integer type; + + @Schema(description = "排序: 1.shopId 正序 2.shopId 倒序") + private Integer seq; + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "ShopSimpleBO{" + + "shopId=" + shopId + + ", shopIds=" + shopIds + + ", shopName='" + shopName + '\'' + + ", shopStatus=" + shopStatus + + ", type=" + type + + ", seq=" + seq + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopDetailFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopDetailFeignClient.java new file mode 100644 index 0000000..ce819f3 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopDetailFeignClient.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.feign; + +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.bo.ShopSimpleBO; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.multishop.vo.ShopUserVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface ShopDetailFeignClient { + + /** + * 根据店铺id获取店铺信息 + * @param shopId 店铺id + * @return 店铺信息 + */ + ServerResponseEntity getShopByShopId(Long shopId); + + /** + * 根据店铺id获取店铺信息 + * @param shopId 店铺id + * @return 店铺信息 + */ + ServerResponseEntity getShopDetailByShopId(Long shopId); + + + /** + * 根据店铺id列表, 获取店铺列表信息 + * @param shopIds 店铺id列表 + * @return 店铺列表信息 + */ + ServerResponseEntity> listByShopIds(List shopIds); + + /** + * 获取店铺信息及扩展信息 + * @param shopId + * @return + */ + ServerResponseEntity shopExtensionData(Long shopId); + + /** + * 获取店铺信息及扩展信息 + * @param shopName 店铺名称 + * @return 店铺信息列表 + */ + ServerResponseEntity> getShopDetailByShopIdAndShopName(String shopName); + + /** + * 根据参数获取店铺id列表 + * @param shopSimpleBO + * @return + */ + ServerResponseEntity> listSimple(ShopSimpleBO shopSimpleBO); + + /** + * 根据用户id获取用户信息 + * @param shopUserId 用户id + * @return 用户信息 + */ + ServerResponseEntity getShopUserByShopUserId(Long shopUserId); + + /** + * 根据店铺状态获取店铺id列表 + * @param shopStatus + * @return + */ + ServerResponseEntity> getShopIdsByShopStatus(Integer shopStatus); + + /** + * 根据店铺的名称获取店铺id列表 + * @param shopName + * @return + */ + ServerResponseEntity> getShopIdsByLikeShopName(String shopName); + + /** + * 更改通联商家影印件状态 + * @param bizUserId + * @param status + * @return + */ + ServerResponseEntity updateAllinpayIdCardStatus(String bizUserId, + Integer status); + + /** + * 更改通联商家绑定手机号码状态 + * @param bizUserId + * @param status + * @return + */ + ServerResponseEntity updateAllinpayBindPhoneStatus(String bizUserId, + Integer status); + + /** + * 删除通联支付的缓存 + */ + void deleteAllinpayCache(); + + /** + * 更新企业信息回调 + * @param bizUserId + * @param status + * @param result + * @param failReason + * @return + */ + ServerResponseEntity updateCompanyInfoResult(String bizUserId, + Integer status, + Integer result, + String failReason); + + /** + * 保存编号 + * @param shopId + * @param signAcctType + * @param acctProtocolNo + * @return + */ + ServerResponseEntity updateAcctProtocolNoByType(Long shopId, Integer signAcctType, String acctProtocolNo); + + /** + * 获取未删除的店铺id + * @return + */ + ServerResponseEntity> listShopIds(); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopRefundAddrFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopRefundAddrFeignClient.java new file mode 100644 index 0000000..8fecef1 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopRefundAddrFeignClient.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.feign; + +import com.tmerclub.cloud.api.multishop.vo.ShopRefundAddrVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/03/09 + */ +public interface ShopRefundAddrFeignClient { + + + /** + * 获取店铺退货地址 + * @param refundAddrId 店铺id + * @return 店铺退货地址 + */ + ServerResponseEntity getShopRefundAddrByRefundAddrId(Long refundAddrId); + + /** + * 获取店铺地址列表 + * @param shopId + * @return + */ + ServerResponseEntity> listByShopId(Long shopId); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopSubstituteSalesFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopSubstituteSalesFeignClient.java new file mode 100644 index 0000000..7df9249 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopSubstituteSalesFeignClient.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.feign; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; + +import java.util.List; + +/** + * @author xxw + * @date 2022/6/24 15:36 + */ +public interface ShopSubstituteSalesFeignClient { + + /** + * 根据店铺id获取代销设置类型 + * + * @param shopId 店铺设置表id + * @return 代销设置表 + * TODO 有部分调用是在本服务内部,需要优化 + */ + ServerResponseEntity getByShopSubstituteSalesId(Long shopId); + + + /** + * 根据店铺id列表获取代销设置类型 + * + * @param shopIdList 店铺设置表id + * @return 代销设置表 + * TODO 有部分调用是在本服务内部,需要优化 + */ + ServerResponseEntity> shopSubstituteSalesList(List shopIdList); + + /** + * 保存店铺默认代销设置 + * + * @param shopId + */ + void saveDefault(Long shopId); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/WalletLogOperationFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/WalletLogOperationFeignClient.java new file mode 100644 index 0000000..08786ee --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/WalletLogOperationFeignClient.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.feign; + + +/** + * @author chiley + * @date 2022/6/30 16:42 + */ +public interface WalletLogOperationFeignClient { + + /** + * 恢复供应商丢失的钱包记录 + * 待结算、已结算 + * + * @param str + */ + void addSupplierLog(String str); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/AllinpayRechargeVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/AllinpayRechargeVO.java new file mode 100644 index 0000000..78aa1ad --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/AllinpayRechargeVO.java @@ -0,0 +1,52 @@ +package com.tmerclub.cloud.api.multishop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 通联余额充值 + * @author TRACK + */ +public class AllinpayRechargeVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "支付金额") + private Long payAmount; + + @Schema(description = "支付系统类型") + private Integer paySysType; + + public AllinpayRechargeVO() { + } + + public AllinpayRechargeVO(Long payAmount, Integer paySysType) { + this.payAmount = payAmount; + this.paySysType = paySysType; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "AllinpayRechargeVO{" + + "payAmount=" + payAmount + + ", paySysType=" + paySysType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopBankCardVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopBankCardVO.java new file mode 100644 index 0000000..f266cb1 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopBankCardVO.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author lth + * @Date 2021/4/26 10:12 + */ +public class ShopBankCardVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键id") + private Long shopBankCardId; + + @Schema(description = "银行名称") + private String bankName; + + @Schema(description = "账户名") + private String recipientName; + + @Schema(description = "账号") + private String cardNo; + + @Schema(description = "支行名称") + private String branchName; + + @Schema(description = "银行开户行") + private String openingBank; + + @Schema(description = "是否为默认") + private Integer isDefault; + + @Schema(description = "是否已验证") + private Integer isVerify; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "银行卡/账户属性 0个人银行卡 1企业对公账户") + private Integer bankCardPro; + + @Schema(description = "支付行号") + private String unionBank; + + @Schema(description = "卡号") + private String bankCardNo; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getShopBankCardId() { + return shopBankCardId; + } + + public void setShopBankCardId(Long shopBankCardId) { + this.shopBankCardId = shopBankCardId; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getRecipientName() { + return recipientName; + } + + public void setRecipientName(String recipientName) { + this.recipientName = recipientName; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public String getBranchName() { + return branchName; + } + + public void setBranchName(String branchName) { + this.branchName = branchName; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public Integer getIsVerify() { + return isVerify; + } + + public void setIsVerify(Integer isVerify) { + this.isVerify = isVerify; + } + + public Integer getBankCardPro() { + return bankCardPro; + } + + public void setBankCardPro(Integer bankCardPro) { + this.bankCardPro = bankCardPro; + } + + public String getUnionBank() { + return unionBank; + } + + public void setUnionBank(String unionBank) { + this.unionBank = unionBank; + } + + public String getBankCardNo() { + return bankCardNo; + } + + public void setBankCardNo(String bankCardNo) { + this.bankCardNo = bankCardNo; + } + + public String getOpeningBank() { + return openingBank; + } + + public void setOpeningBank(String openingBank) { + this.openingBank = openingBank; + } + + @Override + public String toString() { + return "ShopBankCardVO{" + + "shopBankCardId=" + shopBankCardId + + ", bankName='" + bankName + '\'' + + ", recipientName='" + recipientName + '\'' + + ", cardNo='" + cardNo + '\'' + + ", branchName='" + branchName + '\'' + + ", openingBank='" + openingBank + '\'' + + ", isDefault=" + isDefault + + ", isVerify=" + isVerify + + ", shopId=" + shopId + + ", bankCardPro=" + bankCardPro + + ", unionBank='" + unionBank + '\'' + + ", bankCardNo='" + bankCardNo + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/constant/OfflineHandleEventStatus.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/constant/OfflineHandleEventStatus.java new file mode 100644 index 0000000..66df3a5 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/constant/OfflineHandleEventStatus.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.constant; + +/** + * 下架处理事件处理状态 + * + * @author YXF + */ +public enum OfflineHandleEventStatus { + + /** + * 平台进行下线 + */ + OFFLINE_BY_PLATFORM(1, "平台进行下线"), + + /** + * 重新申请 + */ + APPLY_BY_SHOP(2, "商家申请恢复"), + + /** + * 平台审核通过 + */ + AGREE_BY_PLATFORM(3, "平台审核通过"), + /** + * 平台审核不通过 + */ + DISAGREE_BY_PLATFORM(4, "平台审核不通过"), + ; + + private final Integer value; + private final String desc; + + public Integer getValue() { + return value; + } + + public String getDesc() { + return desc; + } + + OfflineHandleEventStatus(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + +} + + + diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/constant/WithdrawFrequency.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/constant/WithdrawFrequency.java new file mode 100644 index 0000000..7298833 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/constant/WithdrawFrequency.java @@ -0,0 +1,41 @@ +package com.tmerclub.cloud.api.platform.constant; + +/** + * @author gaozijie + * @date 2023-05-08 + */ +public enum WithdrawFrequency { + /** + * 每天 + */ + EVERY_DAY(1, "每天"), + /** + * 每周 + */ + EVERY_WEEK(7, "每周"), + /** + * 每月 + */ + EVERY_MONTH(30, "每月"), + /** + * 不限制 + */ + NOT_LIMIT(-1, "不限制"); + + private final Integer value; + + private final String desc; + + WithdrawFrequency(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public Integer getValue() { + return value; + } + + public String getDesc() { + return desc; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/dto/OfflineHandleEventDTO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/dto/OfflineHandleEventDTO.java new file mode 100644 index 0000000..34b6f68 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/dto/OfflineHandleEventDTO.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 下线处理事件DTO + * + * @author YXF + * @date 2021-01-15 17:46:26 + */ +public class OfflineHandleEventDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "事件id") + private Long eventId; + + @Schema(description = "处理id——spuId/shopId...") + private Long handleId; + + @Schema(description = "用户类型见SysTypeEnum 0.普通用户系统 1.商家端 2平台端 3供应商端") + private Integer sysType; + + @Schema(description = "处理id——spuIds/shopIds...") + private List handleIds; + + @Schema(description = "下线原因") + private String offlineReason; + + @Schema(description = "拒绝理由") + private String refuseReason; + + @Schema(description = "申请理由") + private String reapplyReason; + + @Schema(description = "3.审核通过 4 审核未通过") + private Integer status; + /** + * 处理人id + */ + private Long handlerId; + + @Schema(description = "关联的店铺id") + private Long shopId; + + /** + * 1 商品 2 店铺 3满减 4.优惠券 5.团购 6.分销 7.秒杀 9.自提点 + */ + private Integer handleType; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getEventId() { + return eventId; + } + + public void setEventId(Long eventId) { + this.eventId = eventId; + } + + public Integer getHandleType() { + return handleType; + } + + public void setHandleType(Integer handleType) { + this.handleType = handleType; + } + + public Long getHandleId() { + return handleId; + } + + public void setHandleId(Long handleId) { + this.handleId = handleId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public List getHandleIds() { + return handleIds; + } + + public void setHandleIds(List handleIds) { + this.handleIds = handleIds; + } + + public Long getHandlerId() { + return handlerId; + } + + public void setHandlerId(Long handlerId) { + this.handlerId = handlerId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getOfflineReason() { + return offlineReason; + } + + public void setOfflineReason(String offlineReason) { + this.offlineReason = offlineReason; + } + + public String getRefuseReason() { + return refuseReason; + } + + public void setRefuseReason(String refuseReason) { + this.refuseReason = refuseReason; + } + + public String getReapplyReason() { + return reapplyReason; + } + + public void setReapplyReason(String reapplyReason) { + this.reapplyReason = reapplyReason; + } + + @Override + public String toString() { + return "OfflineHandleEventDTO{" + + "eventId=" + eventId + + ", handleId=" + handleId + + ", sysType=" + sysType + + ", handleIds=" + handleIds + + ", offlineReason='" + offlineReason + '\'' + + ", refuseReason='" + refuseReason + '\'' + + ", reapplyReason='" + reapplyReason + '\'' + + ", status=" + status + + ", handlerId=" + handlerId + + ", shopId=" + shopId + + ", handleType=" + handleType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/feign/ConfigFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/feign/ConfigFeignClient.java new file mode 100644 index 0000000..ac6cdaf --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/feign/ConfigFeignClient.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.feign; + +import com.tmerclub.cloud.api.platform.vo.SysConfigApiVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface ConfigFeignClient { + + + /** + * 获取配置信息 + * @param key key + * @return 配置信息json + * TODO 有部分调用是在本服务内部,需要优化 + */ + ServerResponseEntity getConfig(String key); + + /** + * 获取支付系统类型 + * @return + */ + ServerResponseEntity getPaySysType(); + + /** + * 保存or修改配置 + * @param sysConfigApiVO sysConfig + * TODO 有部分调用是在本服务内部,需要优化 + */ + void saveOrUpdateSysConfig(SysConfigApiVO sysConfigApiVO); + +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/DistributionConfigApiVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/DistributionConfigApiVO.java new file mode 100644 index 0000000..f2616c7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/DistributionConfigApiVO.java @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author cl + * @date 2021-08-12 09:46:26 + */ +public class DistributionConfigApiVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分销开关: 0:关闭 1:开启") + private Integer distributionSwitch; + + @Schema(description = "客户绑定设置-业绩归属 : 0:允许绑定,关系优先 1:不绑定 分享人优先") + private Integer attribution; + +// 申请条件配置------------------------------------------------------------- + + @Schema(description = "申请条件-条件审核判定: 0:人工判定 1:系统判定") + private Integer autoCheck; + + @Schema(description = "申请条件-条件审核判定:购买指定商品,确认收货任意一件商品后计入") + private List spuIdList; + + @Schema(description = "申请条件-条件审核判定:消费金额大于等于expenseAmount元,实付金额+积分抵扣+余额抵扣总金额,收货后计入(单位: 元)") + private BigDecimal expenseAmount; + + @Schema(description = "申请条件-条件审核判定:消费笔数大于等于expenseNumber次,下单次数,收货后计入") + private Integer expenseNumber; + + @Schema(description = "申请条件-申请所需信息:是否需要真实姓名 true 需要 false不需要") + private Boolean realName; + + @Schema(description = "申请条件-申请所需信息:是否需要身份证号码 true 需要 false不需要") + private Boolean identityCardPic; + + @Schema(description = "申请条件-申请所需信息:是否需要身份证照片 true 需要 false不需要") + private Boolean identityCardNumber; + + @Schema(description = "提现发放方式: 0.无需审核直接发放,1.审核后系统发放,2.审核后人工发放") + private Integer withdrawal; + +// 提现申请配置------------------------------------------------------------- + + @Schema(description = "提现申请配置-提现频率(天)") + private Integer frequency; + + @Schema(description = "提现申请配置-单笔提现最高(元)") + private BigDecimal amountMax; + + @Schema(description = "提现申请配置-单笔提现最低 (元)") + private BigDecimal amountMin; + + @Schema(description = "提现申请配置-打款说明") + private String paymentExplain; + + @Schema(description = "提现申请配置-提现次数") + private Integer number; + + @Schema(description = "商品列表") + private List spuList; + + public Integer getWithdrawal() { + return withdrawal; + } + + public void setWithdrawal(Integer withdrawal) { + this.withdrawal = withdrawal; + } + + public Integer getDistributionSwitch() { + return distributionSwitch; + } + + public void setDistributionSwitch(Integer distributionSwitch) { + this.distributionSwitch = distributionSwitch; + } + + public Integer getAttribution() { + return attribution; + } + + public void setAttribution(Integer attribution) { + this.attribution = attribution; + } + + public Integer getAutoCheck() { + return autoCheck; + } + + public void setAutoCheck(Integer autoCheck) { + this.autoCheck = autoCheck; + } + + public List getSpuIdList() { + return spuIdList; + } + + public void setSpuIdList(List spuIdList) { + this.spuIdList = spuIdList; + } + + public BigDecimal getExpenseAmount() { + return expenseAmount; + } + + public void setExpenseAmount(BigDecimal expenseAmount) { + this.expenseAmount = expenseAmount; + } + + public Integer getExpenseNumber() { + return expenseNumber; + } + + public void setExpenseNumber(Integer expenseNumber) { + this.expenseNumber = expenseNumber; + } + + public Boolean getRealName() { + return realName; + } + + public void setRealName(Boolean realName) { + this.realName = realName; + } + + public Boolean getIdentityCardPic() { + return identityCardPic; + } + + public void setIdentityCardPic(Boolean identityCardPic) { + this.identityCardPic = identityCardPic; + } + + public Boolean getIdentityCardNumber() { + return identityCardNumber; + } + + public void setIdentityCardNumber(Boolean identityCardNumber) { + this.identityCardNumber = identityCardNumber; + } + + public Integer getFrequency() { + return frequency; + } + + public void setFrequency(Integer frequency) { + this.frequency = frequency; + } + + public BigDecimal getAmountMax() { + return amountMax; + } + + public void setAmountMax(BigDecimal amountMax) { + this.amountMax = amountMax; + } + + public BigDecimal getAmountMin() { + return amountMin; + } + + public void setAmountMin(BigDecimal amountMin) { + this.amountMin = amountMin; + } + + public String getPaymentExplain() { + return paymentExplain; + } + + public void setPaymentExplain(String paymentExplain) { + this.paymentExplain = paymentExplain; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } + + public List getSpuList() { + return spuList; + } + + public void setSpuList(List spuList) { + this.spuList = spuList; + } + + @Override + public String toString() { + return "DistributionConfigApiVO{" + + "distributionSwitch=" + distributionSwitch + + ", attribution=" + attribution + + ", autoCheck=" + autoCheck + + ", spuIdList=" + spuIdList + + ", expenseAmount=" + expenseAmount + + ", expenseNumber=" + expenseNumber + + ", realName=" + realName + + ", identityCardPic=" + identityCardPic + + ", identityCardNumber=" + identityCardNumber + + ", withdrawal=" + withdrawal + + ", frequency=" + frequency + + ", amountMax=" + amountMax + + ", amountMin=" + amountMin + + ", paymentExplain='" + paymentExplain + '\'' + + ", number=" + number + + ", spuList=" + spuList + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/DistributionConfigSpuVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/DistributionConfigSpuVO.java new file mode 100644 index 0000000..845eea2 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/DistributionConfigSpuVO.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/11/17 + */ +public class DistributionConfigSpuVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "卖点") + private String sellingPoint; + + @Schema(description = "商品售价") + private Long priceFee; + + @Schema(description = "市场价,整数方式保存") + private Long marketPriceFee; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "商品介绍主图") + private String mainImgUrl; + + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSellingPoint() { + return sellingPoint; + } + + public void setSellingPoint(String sellingPoint) { + this.sellingPoint = sellingPoint; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + @Override + public String toString() { + return "DistributionConfigSpuVO{" + + "spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", sellingPoint='" + sellingPoint + '\'' + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/OfflineHandleEventItemVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/OfflineHandleEventItemVO.java new file mode 100644 index 0000000..3865881 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/OfflineHandleEventItemVO.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 下线处理事件记录项VO + * + * @author YXF + * @date 2021-01-15 17:46:26 + */ +public class OfflineHandleEventItemVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long eventItemId; + + @Schema(description = "事件id") + private Long eventId; + + @Schema(description = "重新申请上线理由") + private String reapplyReason; + + @Schema(description = "拒绝原因") + private String refuseReason; + + @Schema(description = "重新申请上线时间") + private Date reapplyTime; + + @Schema(description = "审核时间") + private Date auditTime; + + public Long getEventItemId() { + return eventItemId; + } + + public void setEventItemId(Long eventItemId) { + this.eventItemId = eventItemId; + } + + public Long getEventId() { + return eventId; + } + + public void setEventId(Long eventId) { + this.eventId = eventId; + } + + public String getReapplyReason() { + return reapplyReason; + } + + public void setReapplyReason(String reapplyReason) { + this.reapplyReason = reapplyReason; + } + + public String getRefuseReason() { + return refuseReason; + } + + public void setRefuseReason(String refuseReason) { + this.refuseReason = refuseReason; + } + + public Date getReapplyTime() { + return reapplyTime; + } + + public void setReapplyTime(Date reapplyTime) { + this.reapplyTime = reapplyTime; + } + + public Date getAuditTime() { + return auditTime; + } + + public void setAuditTime(Date auditTime) { + this.auditTime = auditTime; + } + + @Override + public String toString() { + return "OfflineHandleEventItemVO{" + + "eventItemId=" + eventItemId + + ",createTime=" + createTime + + ",eventId=" + eventId + + ",reapplyReason=" + reapplyReason + + ",refuseReason=" + refuseReason + + ",reapplyTime=" + reapplyTime + + ",auditTime=" + auditTime + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/SysUserVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/SysUserVO.java new file mode 100644 index 0000000..93776d7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/SysUserVO.java @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lhd + * @date 2020/9/2 + */ +public class SysUserVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * sysUserId + */ + @Schema(description = "平台用户id") + private Long sysUserId; + + /** + * 昵称 + */ + @Schema(description = "昵称") + private String nickName; + + /** + * 头像 + */ + @Schema(description = "头像") + private String avatar; + + /** + * 员工编号 + */ + @Schema(description = "员工编号") + private String code; + + /** + * 联系方式 + */ + @Schema(description = "联系方式") + private String phoneNum; + + @Schema(description = "是否已经有账号了") + private Integer hasAccount; + + @Schema(description = "平台id") + private Long shopId; + + @Schema(description = "角色id列表") + private List roleIds; + + @Schema(description = "是否是管理员") + private Integer isAdmin; + + @Schema(description = "状态") + private Integer status; + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPhoneNum() { + return phoneNum; + } + + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } + + public Long getSysUserId() { + return sysUserId; + } + + public void setSysUserId(Long sysUserId) { + this.sysUserId = sysUserId; + } + + public Integer getHasAccount() { + return hasAccount; + } + + public void setHasAccount(Integer hasAccount) { + this.hasAccount = hasAccount; + } + + public List getRoleIds() { + return roleIds; + } + + public void setRoleIds(List roleIds) { + this.roleIds = roleIds; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(Integer isAdmin) { + this.isAdmin = isAdmin; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "SysUserVO{" + + "sysUserId=" + sysUserId + + ", nickName='" + nickName + '\'' + + ", avatar='" + avatar + '\'' + + ", code='" + code + '\'' + + ", phoneNum='" + phoneNum + '\'' + + ", hasAccount=" + hasAccount + + ", shopId=" + shopId + + ", roleIds=" + roleIds + + ", isAdmin=" + isAdmin + + ", status=" + status + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/constant/SupplierStatus.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/constant/SupplierStatus.java new file mode 100644 index 0000000..d08ae7b --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/constant/SupplierStatus.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.constant; + +import java.util.Objects; + +/** + * 店铺状态 + * + * @author YXF + */ +public enum SupplierStatus { + + /** + * 已删除 + */ + DELETE(-1), + /** + * 停业中 + */ + STOP(0), + + /** + * 营业中 + */ + OPEN(1), + + /** + * 违规下线 + */ + OFFLINE(2), + + /** + * 开店申请待审核 + */ + OPEN_AWAIT_AUDIT(3), + + /** + * 店铺开店申请中 + */ + APPLYING(4), + + /** + * 上线申请待审核 + */ + OFFLINE_AWAIT_AUDIT(5), + + /** + * 审核失败(通联独有) + */ + AUDIT_FAIL(6); + + private final Integer num; + + public Integer value() { + return num; + } + + SupplierStatus(Integer num) { + this.num = num; + } + + public static SupplierStatus instance(Integer value) { + SupplierStatus[] enums = values(); + for (SupplierStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static Boolean offlineOrDelete(Integer status) { + if (!Objects.equals(status, OPEN.value()) && !Objects.equals(status, STOP.value())) { + return Boolean.TRUE; + } + return Boolean.FALSE; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierUserFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierUserFeignClient.java new file mode 100644 index 0000000..5478157 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierUserFeignClient.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.feign; + +import com.tmerclub.cloud.api.multishop.vo.ShopUserVO; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiUserVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author chiley + * @date 2022/7/13 15:34 + */ + +public interface SupplierUserFeignClient { + /** + * 根据手机号码查询账户数量 + * + * @param mobile 手机号码 + * @return 账户数量 + */ + ServerResponseEntity countAccoutByMobile(String mobile); + + + /** + * 根据userId获取供应商员工和账号信息 + * @param userId + * @return + */ + ServerResponseEntity getByUserId(Long userId); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierWalletFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierWalletFeignClient.java new file mode 100644 index 0000000..bb8dccd --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierWalletFeignClient.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.feign; + +import com.tmerclub.cloud.api.payment.vo.SplitRuleVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author lhd + * @date 2023/03/20 + */ +public interface SupplierWalletFeignClient { + /** + * 计算供应商收入 + * @param orderId + * @return + */ + ServerResponseEntity calculationSupplierIncome(Long orderId); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierWithdrawCashFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierWithdrawCashFeignClient.java new file mode 100644 index 0000000..fd8821a --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierWithdrawCashFeignClient.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.feign; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author track + */ +public interface SupplierWithdrawCashFeignClient { + + /** + * 提现回调 + * @param bizOrderNo + * @param payStatus + * @param bizUserId + * @param payFailMessage + * @return + */ + ServerResponseEntity withdrawBack(String bizOrderNo, + String payStatus, + String bizUserId, + String payFailMessage); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierApiDetailVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierApiDetailVO.java new file mode 100644 index 0000000..12eb539 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierApiDetailVO.java @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 供应商详情VO + * + * @author FrozenWatermelon + * @date 2020-12-05 15:50:25 + */ +public class SupplierApiDetailVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商店铺名称") + private String supplierShopName; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "供应商简介") + private String intro; + + @Schema(description = "接收短信号码") + private String noticeMobile; + + @Schema(description = "供应商logo(可修改)") + private String supplierLogo; + + @Schema(description = "供应商状态(-1:已删除 0: 停业中 1:营业中 2:平台下线 3:开店申请待审核 4:供应商申请中 5:上线申请待审核)") + private Integer supplierStatus; + + @Schema(description = "是否优选好店 1.是 0.不是") + private Integer isPreferred; + + @Schema(description = "供应商收藏数量") + private Long collectionNum; + + @Schema(description = "移动端背景图") + private String mobileBackgroundPic; + + @Schema(description = "pc背景图") + private String pcBackgroundPic; + + @Schema(description = "联系人姓名") + private String contactName; + + @Schema(description = "联系方式") + private String contactPhone; + + @Schema(description = "详细地址") + private String detailAddress; + + @Schema(description = "邮箱") + private String email; + + @Schema(description = "供应商账号") + private String supplierAccount; + + @Schema(description = "账号状态, 1:启用 0:禁用 -1:删除") + private Integer accountStatus; + + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Schema(description = "签约起始时间") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + @Schema(description = "供应商类型") + private Integer type; + + + @Schema(description = "是否在通联创建了企业会员 0否1是") + private Integer isCreateMember; + + @Schema(description = "是否在通联绑定了手机号 0否1是") + private Integer isBindPhone; + + @Schema(description = "企业信息审核状态 0.未提交 1.待审核 2.审核成功 3.审核失败") + private Integer companyInfoProcessStatus; + + @Schema(description = "影印件采集审核状态 0.未上传 1.待审核 2.只有工商认证通过 3.只有法人信息通过 4.均审核通过") + private Integer idCardCollectProcessStatus; + + @Schema(description = "通联店铺状态 0未开通 1营业中 2平台下线 3上线待审核 4开店待审核") + private Integer allinpaySupplierStatus; + + @Schema(description = "企业账户提现协议编号") + private String companyAcctProtocolNo; + + @Schema(description = "法人账户提现协议编号") + private String legalAcctProtocolNo; + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public String getSupplierAccount() { + return supplierAccount; + } + + public void setSupplierAccount(String supplierAccount) { + this.supplierAccount = supplierAccount; + } + + public Integer getAccountStatus() { + return accountStatus; + } + + public void setAccountStatus(Integer accountStatus) { + this.accountStatus = accountStatus; + } + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getMobileBackgroundPic() { + return mobileBackgroundPic; + } + + public void setMobileBackgroundPic(String mobileBackgroundPic) { + this.mobileBackgroundPic = mobileBackgroundPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + public Long getCollectionNum() { + return collectionNum; + } + + public void setCollectionNum(Long collectionNum) { + this.collectionNum = collectionNum; + } + + public Integer getIsPreferred() { + return isPreferred; + } + + public void setIsPreferred(Integer isPreferred) { + this.isPreferred = isPreferred; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public String getNoticeMobile() { + return noticeMobile; + } + + public void setNoticeMobile(String noticeMobile) { + this.noticeMobile = noticeMobile; + } + + public String getSupplierLogo() { + return supplierLogo; + } + + public void setSupplierLogo(String supplierLogo) { + this.supplierLogo = supplierLogo; + } + + public Integer getSupplierStatus() { + return supplierStatus; + } + + public void setSupplierStatus(Integer supplierStatus) { + this.supplierStatus = supplierStatus; + } + + public String getContactName() { + return contactName; + } + + public void setContactName(String contactName) { + this.contactName = contactName; + } + + public String getDetailAddress() { + return detailAddress; + } + + public void setDetailAddress(String detailAddress) { + this.detailAddress = detailAddress; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getSupplierShopName() { + return supplierShopName; + } + + public void setSupplierShopName(String supplierShopName) { + this.supplierShopName = supplierShopName; + } + + public Integer getIsCreateMember() { + return isCreateMember; + } + + public void setIsCreateMember(Integer isCreateMember) { + this.isCreateMember = isCreateMember; + } + + public Integer getIsBindPhone() { + return isBindPhone; + } + + public void setIsBindPhone(Integer isBindPhone) { + this.isBindPhone = isBindPhone; + } + + public Integer getCompanyInfoProcessStatus() { + return companyInfoProcessStatus; + } + + public void setCompanyInfoProcessStatus(Integer companyInfoProcessStatus) { + this.companyInfoProcessStatus = companyInfoProcessStatus; + } + + public Integer getIdCardCollectProcessStatus() { + return idCardCollectProcessStatus; + } + + public void setIdCardCollectProcessStatus(Integer idCardCollectProcessStatus) { + this.idCardCollectProcessStatus = idCardCollectProcessStatus; + } + + public Integer getAllinpaySupplierStatus() { + return allinpaySupplierStatus; + } + + public void setAllinpaySupplierStatus(Integer allinpaySupplierStatus) { + this.allinpaySupplierStatus = allinpaySupplierStatus; + } + + public String getCompanyAcctProtocolNo() { + return companyAcctProtocolNo; + } + + public void setCompanyAcctProtocolNo(String companyAcctProtocolNo) { + this.companyAcctProtocolNo = companyAcctProtocolNo; + } + + public String getLegalAcctProtocolNo() { + return legalAcctProtocolNo; + } + + public void setLegalAcctProtocolNo(String legalAcctProtocolNo) { + this.legalAcctProtocolNo = legalAcctProtocolNo; + } + + @Override + public String toString() { + return "SupplierApiDetailVO{" + + "supplierId=" + supplierId + + ", supplierShopName='" + supplierShopName + '\'' + + ", supplierName='" + supplierName + '\'' + + ", intro='" + intro + '\'' + + ", noticeMobile='" + noticeMobile + '\'' + + ", supplierLogo='" + supplierLogo + '\'' + + ", supplierStatus=" + supplierStatus + + ", isPreferred=" + isPreferred + + ", collectionNum=" + collectionNum + + ", mobileBackgroundPic='" + mobileBackgroundPic + '\'' + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", contactName='" + contactName + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", detailAddress='" + detailAddress + '\'' + + ", email='" + email + '\'' + + ", supplierAccount='" + supplierAccount + '\'' + + ", accountStatus=" + accountStatus + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + ", type=" + type + + ", isCreateMember=" + isCreateMember + + ", isBindPhone=" + isBindPhone + + ", companyInfoProcessStatus=" + companyInfoProcessStatus + + ", idCardCollectProcessStatus=" + idCardCollectProcessStatus + + ", allinpaySupplierStatus=" + allinpaySupplierStatus + + ", companyAcctProtocolNo='" + companyAcctProtocolNo + '\'' + + ", legalAcctProtocolNo='" + legalAcctProtocolNo + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierApiRefundAddrVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierApiRefundAddrVO.java new file mode 100644 index 0000000..bc1d87a --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierApiRefundAddrVO.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家退货地址VO + * + * @author FrozenWatermelon + * @date 2021-03-09 15:03:18 + */ +public class SupplierApiRefundAddrVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商家退货地址id") + private Long supplierRefundAddrId; + + @Schema(description = "店铺id") + private Long supplierId; + + @Schema(description = "手机") + private String mobile; + + @Schema(description = "是否默认地址 1是") + private Integer isDefault; + + @Schema(description = "收货人") + private String consignee; + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Schema(description = "邮编") + private String postCode; + + @Schema(description = "地址") + private String addr; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + public Long getSupplierRefundAddrId() { + return supplierRefundAddrId; + } + + public void setSupplierRefundAddrId(Long supplierRefundAddrId) { + this.supplierRefundAddrId = supplierRefundAddrId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "SupplierRefundAddrVO{" + + "supplierRefundAddrId=" + supplierRefundAddrId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",supplierId=" + supplierId + + ",mobile=" + mobile + + ",isDefault=" + isDefault + + ",consignee=" + consignee + + ",provinceId=" + provinceId + + ",province=" + province + + ",cityId=" + cityId + + ",city=" + city + + ",areaId=" + areaId + + ",area=" + area + + ",postCode=" + postCode + + ",addr=" + addr + + ",lng=" + lng + + ",lat=" + lat + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/pom.xml b/tmerclub-api/tmerclub-api-auth/pom.xml new file mode 100644 index 0000000..30e832e --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/pom.xml @@ -0,0 +1,23 @@ + + + + tmerclub-api + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api-auth + jar + 授权对内接口 + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + + diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/bo/LoginInfoBO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/bo/LoginInfoBO.java new file mode 100644 index 0000000..c46b9bd --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/bo/LoginInfoBO.java @@ -0,0 +1,42 @@ +package com.tmerclub.cloud.api.auth.bo; + +import java.io.Serializable; + +/** + * 登录信息 + * @author LGH + */ +public class LoginInfoBO implements Serializable { + + private String bizUserId; + + /** + * 第三方系统类型 + * @see com.yami.shop.security.common.enums.SocialType + */ + private Integer socialType; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public Integer getSocialType() { + return socialType; + } + + public void setSocialType(Integer socialType) { + this.socialType = socialType; + } + + @Override + public String toString() { + return "LoginInfoBO{" + + "bizUserId='" + bizUserId + '\'' + + ", socialType=" + socialType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/bo/UidInfoBO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/bo/UidInfoBO.java new file mode 100644 index 0000000..c3ce6f1 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/bo/UidInfoBO.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.bo; + +import com.tmerclub.cloud.common.constant.SysTypeEnum; + +import java.io.Serializable; + +/** + * @author xxw + * @version 1.0 + * @description:保存在token信息里面的用户信息 + * @since 2024/1/3 10:09 + */ +public class UidInfoBO implements Serializable { + + /** + * 系统类型 + */ + private Integer sysType; + + /** + * SysTypeEnum = 0时,表示c端用户的用户id + * SysTypeEnum = 1时,表示商家的员工id + * SysTypeEnum = 2时,表示平台的员工id + * SysTypeEnum = 3时,表示自供应商的的员工id + * SysTypeEnum = 4时,表示自提点的id + */ + private Long userId; + + /** + * 系统账号全局唯一的id, + */ + private Long accountUid; + + + /** + * 用户名称 + */ + private String username; + + + /** + * 店铺/供应商id,仅当SysTypeEnum != 0时有用 + * SysTypeEnum=2时shopId固定为0 + */ + private Long tenantId; + + /** + * 是否是管理员,仅当SysTypeEnum != 0时有用 + */ + private Integer isAdmin; + + /** + * 店铺/供应商是否已经入驻 0: 未入驻,1:已入驻 + */ + private Integer isPassShop; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public Long getAccountUid() { + return accountUid; + } + + public void setAccountUid(Long accountUid) { + this.accountUid = accountUid; + } + + public Integer getIsPassShop() { + return isPassShop; + } + + public void setIsPassShop(Integer isPassShop) { + this.isPassShop = isPassShop; + } + + public UidInfoBO() { + } + + public UidInfoBO(Integer sysType, Long accountUid, Long userId) { + this.sysType = sysType; + this.accountUid = accountUid; + this.userId = userId; + } + + public UidInfoBO(Integer sysType, Long accountUid, Long userId, Long tenantId) { + this.sysType = sysType; + this.accountUid = accountUid; + this.userId = userId; + this.tenantId = tenantId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + + public Integer getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(Integer isAdmin) { + this.isAdmin = isAdmin; + } + + @Override + public String toString() { + return "UidInfoBO{" + + "sysType=" + sysType + + ", userId='" + userId + '\'' + + ", accountUid=" + accountUid + + ", username=" + username + + ", tenantId=" + tenantId + + ", isAdmin=" + isAdmin + + ", isPassShop=" + isPassShop + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/constant/SysTypeEnum.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/constant/SysTypeEnum.java new file mode 100644 index 0000000..c161c9f --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/constant/SysTypeEnum.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.constant; + +/** + * 系统类型 + * @author FrozenWatermelon + * @date 2020/7/2 + */ +public enum SysTypeEnum { + + /** + * 普通用户系统 + */ + ORDINARY(0), + + /** + * 商家端 + */ + MULTISHOP(1), + + /** + * 平台端 + */ + PLATFORM(2), + + /** + * 供应商端 + */ + SUPPLIER(3), + + /** + * 自提门店端 + */ + STATION(4); + + private final Integer value; + + public Integer value() { + return value; + } + + SysTypeEnum(Integer value) { + this.value = value; + } + + public static SysTypeEnum instance(String value) { + SysTypeEnum[] enums = values(); + for (SysTypeEnum statusEnum : enums) { + if (String.valueOf(statusEnum.value()).equals(value)) { + return statusEnum; + } + } + return null; + } + +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/AuthAccountDTO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/AuthAccountDTO.java new file mode 100644 index 0000000..e721944 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/AuthAccountDTO.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/9/22 + */ +public class AuthAccountDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户名 + */ + @NotBlank(message = "username not blank") + private String username; + + /** + * 密码 + */ + private String password; + + /** + * 邮箱 + */ + private String email; + + /** + * 手机号码 + */ + private String phone; + + /** + * 创建ip + */ + private String createIp; + + /** + * 状态 1:启用 0:禁用 -1:删除 + */ + @NotNull(message = "status not null") + private Integer status; + + /** + * 系统类型见SysTypeEnum 0.普通用户系统 1.商家端 + */ + @NotNull(message = "sysType not null") + private Integer sysType; + + /** + * 用户id + */ + @NotNull(message = "userId not null") + private Long userId; + + /** + * 所属租户 + */ + @NotNull(message = "tenantId not null") + private Long tenantId; + + /** + * 是否是管理员 + */ + @NotNull(message = "isAdmin not null") + private Integer isAdmin; + + /** + * 是否通过店铺审核 + */ + private Integer isPassShop; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getCreateIp() { + return createIp; + } + + public void setCreateIp(String createIp) { + this.createIp = createIp; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + + public Integer getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(Integer isAdmin) { + this.isAdmin = isAdmin; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getIsPassShop() { + return isPassShop; + } + + public void setIsPassShop(Integer isPassShop) { + this.isPassShop = isPassShop; + } + + @Override + public String toString() { + return "AuthAccountDTO{" + + "username='" + username + '\'' + + ", password='" + password + '\'' + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + ", createIp='" + createIp + '\'' + + ", status=" + status + + ", sysType=" + sysType + + ", userId=" + userId + + ", tenantId=" + tenantId + + ", isAdmin=" + isAdmin + + ", isPassShop=" + isPassShop + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/SysAccessKeyDTO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/SysAccessKeyDTO.java new file mode 100644 index 0000000..317f5e5 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/SysAccessKeyDTO.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 系统密钥DTO + * @author TRACK + */ +public class SysAccessKeyDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long sysAccessKeyId; + + @Schema(description = "名称") + private String name; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "账号id") + private String accessId; + + @Schema(description = "密钥") + private String accessKey; + + public Long getSysAccessKeyId() { + return sysAccessKeyId; + } + + public void setSysAccessKeyId(Long sysAccessKeyId) { + this.sysAccessKeyId = sysAccessKeyId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getAccessId() { + return accessId; + } + + public void setAccessId(String accessId) { + this.accessId = accessId; + } + + public String getAccessKey() { + return accessKey; + } + + public void setAccessKey(String accessKey) { + this.accessKey = accessKey; + } + + @Override + public String toString() { + return "SysAccessKeyDTO{" + + "sysAccessKeyId=" + sysAccessKeyId + + ",name=" + name + + ",remark=" + remark + + ",accessId=" + accessId + + ",accessKey=" + accessKey + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/UserRegisterExtensionDTO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/UserRegisterExtensionDTO.java new file mode 100644 index 0000000..56b0d29 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/UserRegisterExtensionDTO.java @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.dto; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author cl + * @date 2021-05-13 14:50:53 + */ +public class UserRegisterExtensionDTO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + private Long userExtensionId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "用户等级") + private Integer level; + + @Schema(description = "等级条件 0 普通会员 1 付费会员") + private Integer levelType; + + @Schema(description = "用户当前成长值") + private Integer growth; + + @Schema(description = "用户积分") + private Long score; + + @Schema(description = "用户总余额") + private Long balance; + + @Schema(description = "用户实际余额") + private Long actualBalance; + + @Schema(description = "乐观锁") + private Integer version; + + @Schema(description = "连续签到天数") + private Integer signDay; + + @Schema(description = "付费会员等级") + private Integer vipLevel; + + @Schema(description = "通联累计余额") + private Long allinpayBalance; + + @Schema(description = "通联实际余额") + private Long allinpayActualBalance; + + @Schema(description = "通联实名认证(0:否 1:是)") + private Integer allinpayRealNameSet; + + @Schema(description = "通联绑定银行卡(0:否 1:是)") + private Integer allinpayPhoneBind; + + @Schema(description = "通联支付密码设置(0:否 1:是)") + private Integer allinpayPayPwdSet; + + @Schema(description = "通联提现协议签约(0:否 1:是)") + private Integer allinpayProtocolSign; + + @Schema(description = "通联支付标识绑定(0:否 1:是)") + private Integer allinpayPayAcctBind; + + public Long getUserExtensionId() { + return userExtensionId; + } + + public void setUserExtensionId(Long userExtensionId) { + this.userExtensionId = userExtensionId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Integer getGrowth() { + return growth; + } + + public void setGrowth(Integer growth) { + this.growth = growth; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + + public Long getActualBalance() { + return actualBalance; + } + + public void setActualBalance(Long actualBalance) { + this.actualBalance = actualBalance; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public Integer getSignDay() { + return signDay; + } + + public void setSignDay(Integer signDay) { + this.signDay = signDay; + } + + public Integer getVipLevel() { + return vipLevel; + } + + public void setVipLevel(Integer vipLevel) { + this.vipLevel = vipLevel; + } + + public Long getAllinpayBalance() { + return allinpayBalance; + } + + public void setAllinpayBalance(Long allinpayBalance) { + this.allinpayBalance = allinpayBalance; + } + + public Long getAllinpayActualBalance() { + return allinpayActualBalance; + } + + public void setAllinpayActualBalance(Long allinpayActualBalance) { + this.allinpayActualBalance = allinpayActualBalance; + } + + public Integer getAllinpayRealNameSet() { + return allinpayRealNameSet; + } + + public void setAllinpayRealNameSet(Integer allinpayRealNameSet) { + this.allinpayRealNameSet = allinpayRealNameSet; + } + + public Integer getAllinpayPhoneBind() { + return allinpayPhoneBind; + } + + public void setAllinpayPhoneBind(Integer allinpayPhoneBind) { + this.allinpayPhoneBind = allinpayPhoneBind; + } + + public Integer getAllinpayPayPwdSet() { + return allinpayPayPwdSet; + } + + public void setAllinpayPayPwdSet(Integer allinpayPayPwdSet) { + this.allinpayPayPwdSet = allinpayPayPwdSet; + } + + public Integer getAllinpayProtocolSign() { + return allinpayProtocolSign; + } + + public void setAllinpayProtocolSign(Integer allinpayProtocolSign) { + this.allinpayProtocolSign = allinpayProtocolSign; + } + + public Integer getAllinpayPayAcctBind() { + return allinpayPayAcctBind; + } + + public void setAllinpayPayAcctBind(Integer allinpayPayAcctBind) { + this.allinpayPayAcctBind = allinpayPayAcctBind; + } + + @Override + public String toString() { + return "UserRegisterExtensionDTO{" + + "userExtensionId=" + userExtensionId + + ", userId=" + userId + + ", level=" + level + + ", levelType=" + levelType + + ", growth=" + growth + + ", score=" + score + + ", balance=" + balance + + ", actualBalance=" + actualBalance + + ", version=" + version + + ", signDay=" + signDay + + ", vipLevel=" + vipLevel + + ", allinpayBalance=" + allinpayBalance + + ", allinpayActualBalance=" + allinpayActualBalance + + ", allinpayRealNameSet=" + allinpayRealNameSet + + ", allinpayPhoneBind=" + allinpayPhoneBind + + ", allinpayPayPwdSet=" + allinpayPayPwdSet + + ", allinpayProtocolSign=" + allinpayProtocolSign + + ", allinpayPayAcctBind=" + allinpayPayAcctBind + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/AuthSocialFeignClient.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/AuthSocialFeignClient.java new file mode 100644 index 0000000..b5e0b5e --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/AuthSocialFeignClient.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.feign; + +import com.tmerclub.cloud.api.auth.vo.AuthSocialVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author FrozenWatermelon + * @date 2020/9/22 + */ +public interface AuthSocialFeignClient { + + /** + * 获取根据尝试社交登录时,保存的临时的uid获取社交 + * @param tempUid tempUid + * @return 用户社交账号信息 + */ + ServerResponseEntity getByTempUid(String tempUid); + + /** + * 通过小程序信息获取用户手机号 + * @param sessionKey 小程序session_key + * @param encryptedData 微信小程序的encryptedData + * @param ivStr 微信小程序的ivStr + * @return mobile + */ + ServerResponseEntity getMobileByMaInfo(String sessionKey, String encryptedData, String ivStr); + + + /** + * 根据第三方账号id和第三方系统类型获取账号 + * @param bizUserId + * @param socialType + * @return + */ + ServerResponseEntity getByUserIdAndSocialType(String bizUserId, Integer socialType); + + /** + * 根据code获取openId + * @param code + * @param type + * @return + */ + ServerResponseEntity getOpenIdByCode(String code, + Integer type); + + /** + * 绑定通联支付标识 + * @return + */ + ServerResponseEntity bindAllinpayPayAcct(); + + /** + * 根据uid和第三方系统类型获取账号 + * @param uid + * @param socialType + * @return + */ + ServerResponseEntity getByUidAndSocialType(Long uid, Integer socialType); + +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/TokenFeignClient.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/TokenFeignClient.java new file mode 100644 index 0000000..7385cae --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/TokenFeignClient.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.feign; + +import com.tmerclub.cloud.api.auth.bo.LoginInfoBO; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.api.auth.dto.ThirdApiAbutmentUserDto; + +/** + * @author FrozenWatermelon + * @date 2020/7/15 + */ +public interface TokenFeignClient { + + /** + * 校验token并返回token保存的用户信息 + * @param accessToken accessToken + * @return token保存的用户信息 + */ + UidInfoBO checkToken(String accessToken); + + /** + * 清除当前用户所有token信息 + */ + void clearToken(); + + /** + * 获取用户的登录用户信息 + * @return + */ + UidInfoBO getUidInfoInToken(); + + /** + * 获取用户登录信息 + * @return + */ + LoginInfoBO getLoginInfo(); + + /** + * 同步第三方token + * @param thirdApiAbutmentUserDto + */ + void userTokenSync(ThirdApiAbutmentUserDto thirdApiAbutmentUserDto); + +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/vo/AuthSocialVO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/vo/AuthSocialVO.java new file mode 100644 index 0000000..27d79cb --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/vo/AuthSocialVO.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 用户社交登陆信息 + * + * @author lhd + * @date 2020/01/06 + */ +public class AuthSocialVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long id; + + /** + * 本系统uid + */ + private Long uid; + + /** + * 第三方系统类型 1小程序 2 公众号 + */ + private Integer socialType; + + /** + * 第三方系统昵称 + */ + private String nickName; + + /** + * 第三方系统头像 + */ + private String imageUrl; + + /** + * 第三方系统userid + */ + private String bizUserId; + + /** + * 第三方系统unionid + */ + private String bizUnionid; + + + /** + * 当账户未绑定时,临时的uid + */ + private String tempUid; + + /** + * 有些时候第三方系统授权之后,会有个临时的key,比如小程序的session_key + */ + private String bizTempSession; + + /** + * 用户id + */ + private String userId; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public Integer getSocialType() { + return socialType; + } + + public void setSocialType(Integer socialType) { + this.socialType = socialType; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getBizUnionid() { + return bizUnionid; + } + + public void setBizUnionid(String bizUnionid) { + this.bizUnionid = bizUnionid; + } + + public String getTempUid() { + return tempUid; + } + + public void setTempUid(String tempUid) { + this.tempUid = tempUid; + } + + public String getBizTempSession() { + return bizTempSession; + } + + public void setBizTempSession(String bizTempSession) { + this.bizTempSession = bizTempSession; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "AuthSocialVO{" + + "id=" + id + + ", uid=" + uid + + ", socialType=" + socialType + + ", nickName='" + nickName + '\'' + + ", imageUrl='" + imageUrl + '\'' + + ", bizUserId='" + bizUserId + '\'' + + ", bizUnionid='" + bizUnionid + '\'' + + ", tempUid='" + tempUid + '\'' + + ", bizTempSession='" + bizTempSession + '\'' + + ", userId='" + userId + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/vo/TokenInfoVO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/vo/TokenInfoVO.java new file mode 100644 index 0000000..4199886 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/vo/TokenInfoVO.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * token信息,该信息用户返回给前端,前端请求携带accessToken进行用户校验 + * + * @author FrozenWatermelon + * @date 2020/7/2 + */ +public class TokenInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "accessToken") + private String accessToken; + + @Schema(description = "在多少秒后过期") + private Integer expiresIn; + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + + public Integer getExpiresIn() { + return expiresIn; + } + + public void setExpiresIn(Integer expiresIn) { + this.expiresIn = expiresIn; + } + + @Override + public String toString() { + return "TokenInfoVO{" + + "accessToken='" + accessToken + '\'' + + ", expiresIn=" + expiresIn + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/dto/UserRoleDTO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/dto/UserRoleDTO.java new file mode 100644 index 0000000..d289c67 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/dto/UserRoleDTO.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.rbac.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/27 + */ +public class UserRoleDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户id + */ + @NotNull(message = "userId not null") + private Long userId; + + /** + * 角色id列表 + */ + @NotEmpty(message = "userId not null") + private List roleIds; + + /** + * 系统类型 + */ + @Hidden + private Integer sysType; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public List getRoleIds() { + return roleIds; + } + + public void setRoleIds(List roleIds) { + this.roleIds = roleIds; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + @Override + public String toString() { + return "UserRoleDTO{" + + "userId=" + userId + + ", roleIds=" + roleIds + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/feign/PermissionFeignClient.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/feign/PermissionFeignClient.java new file mode 100644 index 0000000..892fa00 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/feign/PermissionFeignClient.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.rbac.feign; + +import com.tmerclub.cloud.api.rbac.bo.UriPermissionBO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * + * @author FrozenWatermelon + * @date 2020/09/02 + */ +public interface PermissionFeignClient { + + String SERVICE_NAME = "mall4cloud-auth"; + + /** + * 校验是否有某个uri的权限 + * @param userId + * @param sysType + * @param uri + * @param isAdmin + * @param method + * @return 是否有某个uri的权限 + */ + ServerResponseEntity checkPermission(Long userId, Integer sysType, + String uri, Integer isAdmin, + Integer method); + + /** + * 根据MenuIdLis获取菜单资源数据 + * @param menuPermIdList + * @return + */ + ServerResponseEntity> getUriPermissionListByMenuPermIdList(List menuPermIdList); +} diff --git a/tmerclub-api/tmerclub-api-biz/src/main/java/com/tmerclub/cloud/api/biz/feign/AttachFileFeignClient.java b/tmerclub-api/tmerclub-api-biz/src/main/java/com/tmerclub/cloud/api/biz/feign/AttachFileFeignClient.java new file mode 100644 index 0000000..748dd5f --- /dev/null +++ b/tmerclub-api/tmerclub-api-biz/src/main/java/com/tmerclub/cloud/api/biz/feign/AttachFileFeignClient.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.biz.feign; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @Author lth + * @Date 2021/7/23 10:28 + */ +public interface AttachFileFeignClient { + + /** + * 获取未读消息数量 + * @param shopId + * @return 数量 + */ + ServerResponseEntity updateShopIdByUid(Long shopId); + + /** + * 根据文件路径获取文件类型 + * @param filePath + * @return + */ + ServerResponseEntity getfileTypeByfilePath(String filePath); +} diff --git a/tmerclub-api/tmerclub-api-biz/src/main/java/com/tmerclub/cloud/api/biz/vo/ResourcesInfoVO.java b/tmerclub-api/tmerclub-api-biz/src/main/java/com/tmerclub/cloud/api/biz/vo/ResourcesInfoVO.java new file mode 100644 index 0000000..0dc956f --- /dev/null +++ b/tmerclub-api/tmerclub-api-biz/src/main/java/com/tmerclub/cloud/api/biz/vo/ResourcesInfoVO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.biz.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author cl + * @date 2021-08-13 10:02:26 + */ +public class ResourcesInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "服务器域名url", requiredMode = Schema.RequiredMode.REQUIRED) + private String resourcesUrl; + + @Schema(description = "文件上传的路径", requiredMode = Schema.RequiredMode.REQUIRED) + private String filePath; + + public String getResourcesUrl() { + return resourcesUrl; + } + + public void setResourcesUrl(String resourcesUrl) { + this.resourcesUrl = resourcesUrl; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + @Override + public String toString() { + return "ResourcesInfoVO{" + + "resourcesUrl='" + resourcesUrl + '\'' + + ", filePath='" + filePath + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-flow/src/main/java/com/tmerclub/cloud/api/flow/feign/FlowFeignClient.java b/tmerclub-api/tmerclub-api-flow/src/main/java/com/tmerclub/cloud/api/flow/feign/FlowFeignClient.java new file mode 100644 index 0000000..2b5d3ee --- /dev/null +++ b/tmerclub-api/tmerclub-api-flow/src/main/java/com/tmerclub/cloud/api/flow/feign/FlowFeignClient.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.flow.feign; + + +/** + * @author YXF + * @date 2021/07/01 + */ +public interface FlowFeignClient { + + /** + * 删除商品统计数据 + * @param spuId 商品id + */ + void deleteSpuDataBySpuId(Long spuId); + + /** + * 记录支付成功日志 + * @param sysType + * @param orderIds + * @param userId + */ + void paySuccessLog(Integer sysType, String orderIds, Long userId); + +} diff --git a/tmerclub-api/tmerclub-api-flow/src/main/java/com/tmerclub/cloud/api/flow/vo/UserAnalysisVO.java b/tmerclub-api/tmerclub-api-flow/src/main/java/com/tmerclub/cloud/api/flow/vo/UserAnalysisVO.java new file mode 100644 index 0000000..105fdce --- /dev/null +++ b/tmerclub-api/tmerclub-api-flow/src/main/java/com/tmerclub/cloud/api/flow/vo/UserAnalysisVO.java @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.flow.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 流量分析—用户数据VO + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public class UserAnalysisVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long userAnalysisId; + + @Schema(description = "创建时间") + private Date createDate; + + @Schema(description = "用户Id(用户未登陆时,为uuid)") + private String userId; + + @Schema(description = "省Id") + private Long provinceId; + + @Schema(description = "省名称") + private String provinceName; + + @Schema(description = "加购数量") + private Integer plusShopCart; + + @Schema(description = "下单金额") + private Long placeOrderAmount; + + @Schema(description = "支付金额") + private Long payAmount; + + @Schema(description = "浏览量") + private Integer visitNums; + + @Schema(description = "点击量") + private Integer clickNums; + + @Schema(description = "0:旧用户, 1:新用户, 2.未登陆用户") + private Integer userType; + + @Schema(description = "会话数") + private Integer sessionNums; + + @Schema(description = "系统类型 (1:pc 2:h5 3:小程序 4:安卓 5:ios)") + private Integer systemType; + + @Schema(description = "商品访客数") + private Integer prodVisitUser; + + @Schema(description = "商品浏览量") + private Integer prodVisitNums; + + @Schema(description = "商品id列表") + private List spuIdList; + + public Long getUserAnalysisId() { + return userAnalysisId; + } + + public void setUserAnalysisId(Long userAnalysisId) { + this.userAnalysisId = userAnalysisId; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvinceName() { + return provinceName; + } + + public void setProvinceName(String provinceName) { + this.provinceName = provinceName; + } + + public Integer getPlusShopCart() { + return plusShopCart; + } + + public void setPlusShopCart(Integer plusShopCart) { + this.plusShopCart = plusShopCart; + } + + public Long getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Long placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getVisitNums() { + return visitNums; + } + + public void setVisitNums(Integer visitNums) { + this.visitNums = visitNums; + } + + public Integer getClickNums() { + return clickNums; + } + + public void setClickNums(Integer clickNums) { + this.clickNums = clickNums; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + public Integer getSessionNums() { + return sessionNums; + } + + public void setSessionNums(Integer sessionNums) { + this.sessionNums = sessionNums; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + public Integer getProdVisitUser() { + return prodVisitUser; + } + + public void setProdVisitUser(Integer prodVisitUser) { + this.prodVisitUser = prodVisitUser; + } + + public Integer getProdVisitNums() { + return prodVisitNums; + } + + public void setProdVisitNums(Integer prodVisitNums) { + this.prodVisitNums = prodVisitNums; + } + + public List getSpuIdList() { + return spuIdList; + } + + public void setSpuIdList(List spuIdList) { + this.spuIdList = spuIdList; + } + + @Override + public String toString() { + return "UserAnalysisVO{" + + "userAnalysisId=" + userAnalysisId + + ", createDate=" + createDate + + ", userId='" + userId + '\'' + + ", provinceId=" + provinceId + + ", provinceName='" + provinceName + '\'' + + ", plusShopCart=" + plusShopCart + + ", placeOrderAmount=" + placeOrderAmount + + ", payAmount=" + payAmount + + ", visitNums=" + visitNums + + ", clickNums=" + clickNums + + ", userType=" + userType + + ", sessionNums=" + sessionNums + + ", systemType=" + systemType + + ", prodVisitUser=" + prodVisitUser + + ", prodVisitNums=" + prodVisitNums + + ", spuIdList=" + spuIdList + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-group/pom.xml b/tmerclub-api/tmerclub-api-group/pom.xml new file mode 100644 index 0000000..a7bb1b7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-group/pom.xml @@ -0,0 +1,28 @@ + + + + tmerclub-api + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api-group + jar + 团购对内接口 + + + com.moyuer.cloud + tmerclub-common-order + ${project.version} + + + com.moyuer.cloud + tmerclub-common-product + ${project.version} + + + + diff --git a/tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/bo/GroupOrderNotifyBO.java b/tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/bo/GroupOrderNotifyBO.java new file mode 100644 index 0000000..b2c64bd --- /dev/null +++ b/tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/bo/GroupOrderNotifyBO.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.group.bo; + +import com.tmerclub.cloud.api.group.vo.GroupOrderVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author TRACK + */ +public class GroupOrderNotifyBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + private List orderIds; + + /** + * 需要保存的团购订单信息 + */ + private List groupOrders; + + /** + * 区分机器人参团和真人参团 0机器人 1真人 + */ + private Integer isJoin; + + public List getOrderIds() { + return orderIds; + } + + public void setOrderIds(List orderIds) { + this.orderIds = orderIds; + } + + public List getGroupOrders() { + return groupOrders; + } + + public void setGroupOrders(List groupOrders) { + this.groupOrders = groupOrders; + } + + public Integer getIsJoin() { + return isJoin; + } + + public void setIsJoin(Integer join) { + isJoin = join; + } + + @Override + public String toString() { + return "GroupOrderNotifyBO{" + + "orderIds=" + orderIds + + ", groupOrders=" + groupOrders + + ", isJoin=" + isJoin + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/feign/GroupFeignClient.java b/tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/feign/GroupFeignClient.java new file mode 100644 index 0000000..d030c53 --- /dev/null +++ b/tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/feign/GroupFeignClient.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.group.feign; + +import com.tmerclub.cloud.api.group.vo.GroupActivityVO; +import com.tmerclub.cloud.common.product.vo.GroupActivitySpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.Date; +import java.util.List; + +/** + * @author YXF + * @date 2021/3/29 + */ +public interface GroupFeignClient { + + /** + * 获取活动开始的时间(预热的活动开始时间为当前) + * @param activityId 活动id + * @return void + */ + ServerResponseEntity getActivityStartTime(Long activityId); + + /** + * 获取活动信息 + * @param activityId 活动id + * @return void + */ + ServerResponseEntity getActivityInfo(Long activityId); + + /** + * 根据商品id获取团购商品信息 + * @param spuIds 商品id + * @return void + */ + ServerResponseEntity> groupSpuListBySpuIds(List spuIds); + + /** + * 根据商品ids下线所有的团购活动 + * @param spuIds 商品ids + * @return 返回结果 + */ + ServerResponseEntity offlineGroupBySpuIds(List spuIds); + + /** + * 根据skuIds更新团购活动 + * @param skuIds + * @param spuId + * @return + */ + ServerResponseEntity updateGroupActivityPrice(List skuIds, Long spuId); + + /** + * 根据商品id和状态修改拼团活动状态 + * @param spuId + * @return + */ + ServerResponseEntity updateGroupActivityStatus(Long spuId); +} diff --git a/tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/vo/GroupActivityVO.java b/tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/vo/GroupActivityVO.java new file mode 100644 index 0000000..e1645f7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/vo/GroupActivityVO.java @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.group.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 拼团活动表VO + * + * @author YXF + * @date 2021-03-20 10:39:31 + */ +public class GroupActivityVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "拼团活动id") + private Long groupActivityId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "活动名称") + private String activityName; + + @Schema(description = "活动开始时间(活动状态:未开始、经行中、已结束)") + private Date startTime; + + @Schema(description = "活动结束时间(活动状态:未开始、经行中、已结束)") + private Date endTime; + + @Schema(description = "成团人数") + private Integer groupNumber; + + @Schema(description = "商品是否限购(1:限购、0:不限购)") + private Integer hasMaxNum; + + @Schema(description = "限购数量") + private Integer maxNum; + + @Schema(description = "是否模拟成团(1:模拟参团、0:不模拟)") + private Integer hasRobot; + + @Schema(description = "活动是否预热") + private Integer isPreheat; + + @Schema(description = "是否开启凑团模式(1:凑团、0:不凑团)") + private Integer hasGroupTip; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "已成团订单数(统计)") + private Long groupOrderCount; + + @Schema(description = "已成团人数(统计)") + private Long groupNumberCount; + + @Schema(description = "拼团状态(-1:删除、0:未启用、1:启用、2:违规下架、3:等待审核 4:已失效 5:已结束)") + private Integer status; + + @Schema(description = "商品介绍主图") + private String mainImgUrl; + + @Schema(description = "spu名称") + private String spuName; + + @Schema(description = "商品价格(sku最低价)") + private Long price; + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getActivityName() { + return activityName; + } + + public void setActivityName(String activityName) { + this.activityName = activityName; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + + public Integer getGroupNumber() { + return groupNumber; + } + + public void setGroupNumber(Integer groupNumber) { + this.groupNumber = groupNumber; + } + + public Integer getHasMaxNum() { + return hasMaxNum; + } + + public void setHasMaxNum(Integer hasMaxNum) { + this.hasMaxNum = hasMaxNum; + } + + public Integer getMaxNum() { + return maxNum; + } + + public void setMaxNum(Integer maxNum) { + this.maxNum = maxNum; + } + + public Integer getHasRobot() { + return hasRobot; + } + + public void setHasRobot(Integer hasRobot) { + this.hasRobot = hasRobot; + } + + public Integer getIsPreheat() { + return isPreheat; + } + + public void setIsPreheat(Integer isPreheat) { + this.isPreheat = isPreheat; + } + + public Integer getHasGroupTip() { + return hasGroupTip; + } + + public void setHasGroupTip(Integer hasGroupTip) { + this.hasGroupTip = hasGroupTip; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getGroupOrderCount() { + return groupOrderCount; + } + + public void setGroupOrderCount(Long groupOrderCount) { + this.groupOrderCount = groupOrderCount; + } + + public Long getGroupNumberCount() { + return groupNumberCount; + } + + public void setGroupNumberCount(Long groupNumberCount) { + this.groupNumberCount = groupNumberCount; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + @Override + public String toString() { + return "GroupActivityVO{" + + "groupActivityId=" + groupActivityId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", activityName='" + activityName + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", groupNumber=" + groupNumber + + ", hasMaxNum=" + hasMaxNum + + ", maxNum=" + maxNum + + ", hasRobot=" + hasRobot + + ", isPreheat=" + isPreheat + + ", hasGroupTip=" + hasGroupTip + + ", spuId=" + spuId + + ", groupOrderCount=" + groupOrderCount + + ", groupNumberCount=" + groupNumberCount + + ", status=" + status + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", spuName='" + spuName + '\'' + + ", price=" + price + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/vo/ChooseComboItemVo.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/vo/ChooseComboItemVo.java new file mode 100644 index 0000000..be3d648 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/vo/ChooseComboItemVo.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.combo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 购物车中选中的套餐活动项信息 + * @author xxw + * @date 2022/8/23 14:00 + */ +public class ChooseComboItemVo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "主商品购物车id") + private Long mainProdBasketId; + + @Schema(description = "套餐总金额") + private Double comboTotalAmount; + + @Schema(description = "套餐金额(套餐单价)") + private Long comboAmount; + + @Schema(description = "套餐优惠金额") + private Long preferentialAmount; + + @Schema(description = "套餐数量") + private Integer comboCount; + + @Schema(description = "套餐名称") + private String name; + + /** + * 套餐序号 + * 套餐可能会进行分单操作,且一个订单中可能包含多个相同套餐不同规格,所以需要一个独立的参数来标识套餐 + */ + private Integer index; + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Long getMainProdBasketId() { + return mainProdBasketId; + } + + public void setMainProdBasketId(Long mainProdBasketId) { + this.mainProdBasketId = mainProdBasketId; + } + + public Double getComboTotalAmount() { + return comboTotalAmount; + } + + public void setComboTotalAmount(Double comboTotalAmount) { + this.comboTotalAmount = comboTotalAmount; + } + + public Long getComboAmount() { + return comboAmount; + } + + public void setComboAmount(Long comboAmount) { + this.comboAmount = comboAmount; + } + + public Long getPreferentialAmount() { + return preferentialAmount; + } + + public void setPreferentialAmount(Long preferentialAmount) { + this.preferentialAmount = preferentialAmount; + } + + public Integer getComboCount() { + return comboCount; + } + + public void setComboCount(Integer comboCount) { + this.comboCount = comboCount; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getIndex() { + return index; + } + + public void setIndex(Integer index) { + this.index = index; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/CouponProdType.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/CouponProdType.java new file mode 100644 index 0000000..d5d4e33 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/CouponProdType.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.constant; + + +/** + * 优惠券适用商品类型 + * @author FrozenWatermelon + */ +public enum CouponProdType { + + /** + * 0全部商品参与 + */ + ALL(0), + + /** + * 1指定商品参与 + */ + PROD_IN(1), + + ; + + private final Integer num; + + public Integer value() { + return num; + } + + CouponProdType(Integer num) { + this.num = num; + } + + public static CouponProdType instance(Integer value) { + CouponProdType[] enums = values(); + for (CouponProdType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/CouponType.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/CouponType.java new file mode 100644 index 0000000..7f50318 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/CouponType.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.constant; + + +/** + * 优惠券类型 1:代金券 2:折扣券 3:兑换券 + * @author FrozenWatermelon + */ +public enum CouponType { + + /** + * 代金券 + */ + C2M(1), + + /** + * 折扣券 + */ + C2D(2), + + /** + * 兑换券 + */ + C2P(3); + + private final Integer num; + + public Integer value() { + return num; + } + + CouponType(Integer num) { + this.num = num; + } + + public static CouponType instance(Integer value) { + CouponType[] enums = values(); + for (CouponType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/BindCouponDTO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/BindCouponDTO.java new file mode 100644 index 0000000..1de4536 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/BindCouponDTO.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 选择优惠券 + * @author FrozenWatermelon + * @date 2020/12/17 + */ +public class BindCouponDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "优惠券id数组") + private List couponIds; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public List getCouponIds() { + return couponIds; + } + + public void setCouponIds(List couponIds) { + this.couponIds = couponIds; + } + + @Override + public String toString() { + return "BindCouponDTO{" + + "userId=" + userId + + ", couponIds=" + couponIds + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/ChooseCouponDTO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/ChooseCouponDTO.java new file mode 100644 index 0000000..ab1e854 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/ChooseCouponDTO.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.dto; + +import com.tmerclub.cloud.common.order.vo.ShopCartVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 选择优惠券 + * @author FrozenWatermelon + * @date 2020/12/17 + */ +public class ChooseCouponDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户是否改变了优惠券的选择,如果用户改变了优惠券的选择,则完全根据传入参数进行优惠券的选择") + private Integer userChangeCoupon; + + @Schema(description = "优惠券id数组") + private List couponIds; + + @Schema(description = "购物车信息") + private List shopCarts; + + public ChooseCouponDTO() { + } + + public ChooseCouponDTO(Integer userChangeCoupon, List couponIds) { + this.userChangeCoupon = userChangeCoupon; + this.couponIds = couponIds; + } + + public Integer getUserChangeCoupon() { + return userChangeCoupon; + } + + public void setUserChangeCoupon(Integer userChangeCoupon) { + this.userChangeCoupon = userChangeCoupon; + } + + public List getCouponIds() { + return couponIds; + } + + public void setCouponIds(List couponIds) { + this.couponIds = couponIds; + } + + public List getShopCarts() { + return shopCarts; + } + + public void setShopCarts(List shopCarts) { + this.shopCarts = shopCarts; + } + + @Override + public String toString() { + return "ChooseCouponDTO{" + + "userChangeCoupon=" + userChangeCoupon + + ", couponIds=" + couponIds + + ", shopCarts=" + shopCarts + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/LockCouponDTO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/LockCouponDTO.java new file mode 100644 index 0000000..295a644 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/LockCouponDTO.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.dto; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + * @date 2020/12/23 + */ +public class LockCouponDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单id + */ + private String orderIds; + + /** + * 优惠券id + */ + private Long couponId; + + /** + * 用户优惠券id + */ + private Long couponUserId; + + /** + * 优惠金额 + */ + private Long reduceAmount; + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Long getCouponUserId() { + return couponUserId; + } + + public void setCouponUserId(Long couponUserId) { + this.couponUserId = couponUserId; + } + + @Override + public String toString() { + return "LockCouponDTO{" + + "orderIds='" + orderIds + '\'' + + ", couponId=" + couponId + + ", couponUserId=" + couponUserId + + ", reduceAmount=" + reduceAmount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/PlatformChooseCouponDTO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/PlatformChooseCouponDTO.java new file mode 100644 index 0000000..8a7c1f5 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/PlatformChooseCouponDTO.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.dto; + +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 平台选择优惠券 + * @author FrozenWatermelon + * @date 2020/12/18 + */ +public class PlatformChooseCouponDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户是否改变了优惠券的选择,如果用户改变了优惠券的选择,则完全根据传入参数进行优惠券的选择") + private Integer userChangeCoupon; + + @Schema(description = "优惠券id数组") + private List couponIds; + + @Schema(description = "多个店铺订单合并在一起的合并类") + private ShopCartOrderMergerVO shopCartOrderMergerVO; + + public PlatformChooseCouponDTO() { + } + + public PlatformChooseCouponDTO(Integer userChangeCoupon, List couponIds, ShopCartOrderMergerVO shopCartOrderMergerVO) { + this.userChangeCoupon = userChangeCoupon; + this.couponIds = couponIds; + this.shopCartOrderMergerVO = shopCartOrderMergerVO; + } + + public Integer getUserChangeCoupon() { + return userChangeCoupon; + } + + public void setUserChangeCoupon(Integer userChangeCoupon) { + this.userChangeCoupon = userChangeCoupon; + } + + public List getCouponIds() { + return couponIds; + } + + public void setCouponIds(List couponIds) { + this.couponIds = couponIds; + } + + public ShopCartOrderMergerVO getShopCartOrderMergerVO() { + return shopCartOrderMergerVO; + } + + public void setShopCartOrderMergerVO(ShopCartOrderMergerVO shopCartOrderMergerVO) { + this.shopCartOrderMergerVO = shopCartOrderMergerVO; + } + + @Override + public String toString() { + return "PlatformChooseCouponDTO{" + + "userChangeCoupon=" + userChangeCoupon + + ", couponIds=" + couponIds + + ", shopCartOrderMergerVO=" + shopCartOrderMergerVO + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/ReceiveCouponDTO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/ReceiveCouponDTO.java new file mode 100644 index 0000000..fbc5e76 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/dto/ReceiveCouponDTO.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 领券券统计 + * @author yxf + * @date 2023/06/02 + */ +public class ReceiveCouponDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户id列表" ) + private List userIds; + + @Schema(description = "开始时间" ) + private Date startTime; + + @Schema(description = "结束时间" ) + private Date endTime; + + public ReceiveCouponDTO() { + } + + public ReceiveCouponDTO(List userIds, Date startTime, Date endTime) { + this.userIds = userIds; + this.startTime = startTime; + this.endTime = endTime; + } + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + @Override + public String toString() { + return "ReceiveCouponDTO{" + + "userIds=" + userIds + + ", startTime=" + startTime + + ", endTime=" + endTime + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/feign/CouponOrderFeignClient.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/feign/CouponOrderFeignClient.java new file mode 100644 index 0000000..2e03fb7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/feign/CouponOrderFeignClient.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.feign; + + +import com.tmerclub.cloud.api.coupon.dto.LockCouponDTO; +import com.tmerclub.cloud.api.coupon.dto.PlatformChooseCouponDTO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * 优惠券 + * @author FrozenWatermelon + * @date 2020/12/17 + */ +public interface CouponOrderFeignClient { + + /** + * 选择平台优惠券,并组装返回优惠券列表 + * @param param 优惠券参数 + * @return void + */ + ServerResponseEntity choosePlatformCoupon(PlatformChooseCouponDTO param); + + + /** + * 锁定订优惠券状态 + * @param lockCouponParams 订单id和优惠券id关联信息 + * @return void + */ + ServerResponseEntity lockCoupon(List lockCouponParams); +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/vo/CouponDataVO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/vo/CouponDataVO.java new file mode 100644 index 0000000..fef2bad --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/vo/CouponDataVO.java @@ -0,0 +1,300 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 优惠券VO + * + * @author YXF + * @date 2020-12-08 17:22:56 + */ +public class CouponDataVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "优惠券ID") + private Long couponId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "优惠券名称") + private String couponName; + + @Schema(description = "副标题") + private String subTitle; + + @Schema(description = "优惠类型 1:代金券 2:折扣券 3:兑换券") + private Integer couponType; + + @Schema(description = "适用商品类型 0全部商品参与 1指定商品参与") + private Integer suitableProdType; + + @Schema(description = "获取方式 0=用户领取 1=店铺发放") + private Integer getWay; + + @Schema(description = "生效类型 1:固定时间 2:领取后生效") + private Integer validTimeType; + + @Schema(description = "使用条件") + private Long cashCondition; + + @Schema(description = "减免金额") + private Long reduceAmount; + + @Schema(description = "折扣额度") + private Double couponDiscount; + + @Schema(description = "开始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; + + @Schema(description = "领券后X天起生效") + private Integer afterReceiveDays; + + @Schema(description = "有效天数") + private Integer validDays; + + @Schema(description = "总库存") + private Integer totalStock; + + @Schema(description = "库存") + private Integer stocks; + + @Schema(description = "每个用户领券上限,如不填则默认为1") + private Integer limitNum; + + @Schema(description = "优惠券状态 0:过期 1:未过期") + private Integer status; + + @Schema(description = "优惠券投放状态(-1:取消投放 0:自动投放 1:投放 2:违规下架 3:等待审核 4:暂不投放)") + private Integer putonStatus; + + @Schema(description = "商品Id列表") + private List spuIds; + + @Schema(description = "优惠券数量") + private Integer couponNum; + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getCouponName() { + return couponName; + } + + public void setCouponName(String couponName) { + this.couponName = couponName; + } + + public String getSubTitle() { + return subTitle; + } + + public void setSubTitle(String subTitle) { + this.subTitle = subTitle; + } + + public Integer getCouponType() { + return couponType; + } + + public void setCouponType(Integer couponType) { + this.couponType = couponType; + } + + public Integer getSuitableProdType() { + return suitableProdType; + } + + public void setSuitableProdType(Integer suitableProdType) { + this.suitableProdType = suitableProdType; + } + + public Integer getGetWay() { + return getWay; + } + + public void setGetWay(Integer getWay) { + this.getWay = getWay; + } + + public Integer getValidTimeType() { + return validTimeType; + } + + public void setValidTimeType(Integer validTimeType) { + this.validTimeType = validTimeType; + } + + public Long getCashCondition() { + return cashCondition; + } + + public void setCashCondition(Long cashCondition) { + this.cashCondition = cashCondition; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Double getCouponDiscount() { + return couponDiscount; + } + + public void setCouponDiscount(Double couponDiscount) { + this.couponDiscount = couponDiscount; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getAfterReceiveDays() { + return afterReceiveDays; + } + + public void setAfterReceiveDays(Integer afterReceiveDays) { + this.afterReceiveDays = afterReceiveDays; + } + + public Integer getValidDays() { + return validDays; + } + + public void setValidDays(Integer validDays) { + this.validDays = validDays; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getStocks() { + return stocks; + } + + public void setStocks(Integer stocks) { + this.stocks = stocks; + } + + public Integer getLimitNum() { + return limitNum; + } + + public void setLimitNum(Integer limitNum) { + this.limitNum = limitNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPutonStatus() { + return putonStatus; + } + + public void setPutonStatus(Integer putonStatus) { + this.putonStatus = putonStatus; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public Integer getCouponNum() { + return couponNum; + } + + public void setCouponNum(Integer couponNum) { + this.couponNum = couponNum; + } + + @Override + public String toString() { + return "CouponDataVO{" + + "couponId=" + couponId + + ", shopId=" + shopId + + ", couponName='" + couponName + '\'' + + ", subTitle='" + subTitle + '\'' + + ", couponType=" + couponType + + ", suitableProdType=" + suitableProdType + + ", getWay=" + getWay + + ", validTimeType=" + validTimeType + + ", cashCondition=" + cashCondition + + ", reduceAmount=" + reduceAmount + + ", couponDiscount=" + couponDiscount + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", afterReceiveDays=" + afterReceiveDays + + ", validDays=" + validDays + + ", totalStock=" + totalStock + + ", stocks=" + stocks + + ", limitNum=" + limitNum + + ", status=" + status + + ", putonStatus=" + putonStatus + + ", spuIds=" + spuIds + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", couponNum=" + couponNum + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/vo/CouponUserApiVO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/vo/CouponUserApiVO.java new file mode 100644 index 0000000..178f1cc --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/vo/CouponUserApiVO.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 优惠券用户关联信息VO + * + * @author YXF + * @date 2020-12-08 17:22:57 + */ +public class CouponUserApiVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "优惠券用户ID") + private Long couponUserId; + + @Schema(description = "优惠券ID") + private Long couponId; + + @Schema(description = "用户ID") + private Long userId; + + public Long getCouponUserId() { + return couponUserId; + } + + public void setCouponUserId(Long couponUserId) { + this.couponUserId = couponUserId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "CouponUserVO{" + + "couponUserId=" + couponUserId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",couponId=" + couponId + + ",userId=" + userId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/constant/DiscountRule.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/constant/DiscountRule.java new file mode 100644 index 0000000..6e1fc73 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/constant/DiscountRule.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.discount.constant; + +/** + * 满减规则 + * @author FrozenWatermelon + */ +public enum DiscountRule { + + /** + * 满钱减钱 + * M money + */ + M2M(0), +// /** +// * 满件减钱 +// * P piece +// */ +// P2M(1), +// /** +// * 满钱打折 +// * Discount +// */ +// M2D(2), + /** + * 满件打折 + * Discount + */ + P2D(3); + + private final Integer num; + + public Integer value() { + return num; + } + + DiscountRule(Integer num) { + this.num = num; + } + + public static DiscountRule instance(Integer value) { + DiscountRule[] enums = values(); + for (DiscountRule statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/feign/DiscountFeignClient.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/feign/DiscountFeignClient.java new file mode 100644 index 0000000..05bbb15 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/feign/DiscountFeignClient.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.discount.feign; + +import com.tmerclub.cloud.common.order.vo.ShopCartWithAmountVO; +import com.tmerclub.cloud.common.product.vo.SpuDiscountAppVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/14 + */ +public interface DiscountFeignClient { + + + /** + * 计算满减,并组合购物车 + 购物车金额 + * @param shopCartWithAmountVO 购物车列表和运费信息 + * @return void + */ + ServerResponseEntity calculateDiscountAndMakeUpShopCartAndAmount(ShopCartWithAmountVO shopCartWithAmountVO); + + /** + * 商品详情的满减活动列表 + * @param shopId + * @param spuId + * @return + */ + ServerResponseEntity> spuDiscountList(Long shopId, Long spuId); + + /** + * 处理商品下线 + * + * @param spuIds 商品id列表 + * @param shopIds 店铺id + * @return + */ + ServerResponseEntity handleSpuOffline(List spuIds, List shopIds); + + /** + * 处理店铺下线 + * + * @param shopIds 店铺id + * @return + */ + ServerResponseEntity handleShopOffline(List shopIds); +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/vo/DiscountSumVO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/vo/DiscountSumVO.java new file mode 100644 index 0000000..9133196 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/vo/DiscountSumVO.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.discount.vo; + +import com.tmerclub.cloud.common.order.vo.ChooseDiscountItemVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Map; + +/** + * 某个店铺的满江活动的活动信息 + * @author FrozenWatermelon + */ +public class DiscountSumVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 以优惠活动id为key, 优惠活动金额 为value的map + * {优惠活动id:优惠活动金额} + */ + private Map discountIdDiscountSumItemMap; + + /** + * 所有优惠活动加起来的金额 + */ + private Long totalReduceAmount; + + private ChooseDiscountItemVO chooseDiscountItem; + + public Map getDiscountIdDiscountSumItemMap() { + return discountIdDiscountSumItemMap; + } + + public void setDiscountIdDiscountSumItemMap(Map discountIdDiscountSumItemMap) { + this.discountIdDiscountSumItemMap = discountIdDiscountSumItemMap; + } + + public Long getTotalReduceAmount() { + return totalReduceAmount; + } + + public void setTotalReduceAmount(Long totalReduceAmount) { + this.totalReduceAmount = totalReduceAmount; + } + + + @Override + public String toString() { + return "DiscountSumVO{" + + "discountIdDiscountSumItemMap=" + discountIdDiscountSumItemMap + + ", totalReduceAmount=" + totalReduceAmount + + ", chooseDiscountItem=" + chooseDiscountItem + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/bo/DistributionNotifyOrderAndShopBO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/bo/DistributionNotifyOrderAndShopBO.java new file mode 100644 index 0000000..f720137 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/bo/DistributionNotifyOrderAndShopBO.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.distribution.bo; + +import com.tmerclub.cloud.api.multishop.bo.ShopWalletBO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author cl + * @date 2021-08-19 11:30:50 + */ +public class DistributionNotifyOrderAndShopBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺钱包 + */ + private List shopWalletBOList; + /** + * 订单项 + */ + private List distributionOrderItems; + + public List getShopWalletBOList() { + return shopWalletBOList; + } + + public void setShopWalletBOList(List shopWalletBOList) { + this.shopWalletBOList = shopWalletBOList; + } + + public List getDistributionOrderItems() { + return distributionOrderItems; + } + + public void setDistributionOrderItems(List distributionOrderItems) { + this.distributionOrderItems = distributionOrderItems; + } + + @Override + public String toString() { + return "DistributionNotifyOrderAndShopBO{" + + "shopWalletBOList=" + shopWalletBOList + + ", distributionOrderItems=" + distributionOrderItems + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/bo/DistributionSpuBO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/bo/DistributionSpuBO.java new file mode 100644 index 0000000..c63da36 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/bo/DistributionSpuBO.java @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.distribution.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author cl + * @date 2021-08-18 15:00:14 + */ +public class DistributionSpuBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "分销商品表") + private Long distributionSpuId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "商品价格") + private Long price; + + @Schema(description = "商品主图") + private String MainImgUrl; + + @Schema(description = "奖励id") + private Long awardId; + + @Schema(description = "状态(0:商家下架 1:商家上架 2:违规下架 3:平台审核)") + private Integer state; + + @Schema(description = "奖励方式(0 按比例 1 按固定数值)") + private Integer awardMode; + + @Schema(description = "上级奖励设置(0 关闭 1开启)") + private Integer parentAwardSet; + + @Schema(description = "奖励数额(奖励方式为0时,表示百分比,为1时代表实际奖励金额)") + private Long awardNumbers; + + @Schema(description = "上级奖励数额(奖励方式为0时,表示百分比,为1时代表实际奖励金额)") + private Long parentAwardNumbers; + + public Long getDistributionSpuId() { + return distributionSpuId; + } + + public void setDistributionSpuId(Long distributionSpuId) { + this.distributionSpuId = distributionSpuId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public String getMainImgUrl() { + return MainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + MainImgUrl = mainImgUrl; + } + + public Long getAwardId() { + return awardId; + } + + public void setAwardId(Long awardId) { + this.awardId = awardId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getAwardMode() { + return awardMode; + } + + public void setAwardMode(Integer awardMode) { + this.awardMode = awardMode; + } + + public Integer getParentAwardSet() { + return parentAwardSet; + } + + public void setParentAwardSet(Integer parentAwardSet) { + this.parentAwardSet = parentAwardSet; + } + + public Long getAwardNumbers() { + return awardNumbers; + } + + public void setAwardNumbers(Long awardNumbers) { + this.awardNumbers = awardNumbers; + } + + public Long getParentAwardNumbers() { + return parentAwardNumbers; + } + + public void setParentAwardNumbers(Long parentAwardNumbers) { + this.parentAwardNumbers = parentAwardNumbers; + } + + @Override + public String toString() { + return "DistributionSpuBO{" + + "distributionSpuId=" + distributionSpuId + + ", shopName='" + shopName + '\'' + + ", spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", shopId=" + shopId + + ", price=" + price + + ", MainImgUrl='" + MainImgUrl + '\'' + + ", awardId=" + awardId + + ", state=" + state + + ", awardMode=" + awardMode + + ", parentAwardSet=" + parentAwardSet + + ", awardNumbers=" + awardNumbers + + ", parentAwardNumbers=" + parentAwardNumbers + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/bo/DistributionUserUpdateBO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/bo/DistributionUserUpdateBO.java new file mode 100644 index 0000000..9c5bfad --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/bo/DistributionUserUpdateBO.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.distribution.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 修改用户分销员的昵称或者头像 + * @author cl + * @date 2021-08-14 15:59:51 + */ +public class DistributionUserUpdateBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * ID + */ + private Long userId; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 手机号 + */ + private String userMobile; + + /** + * 头像图片路径 + */ + private String pic; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + @Override + public String toString() { + return "DistributionUserUpdateBO{" + + "userId=" + userId + + ", nickName='" + nickName + '\'' + + ", userMobile='" + userMobile + '\'' + + ", pic='" + pic + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/vo/DistributionUserIncomeApiVO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/vo/DistributionUserIncomeApiVO.java new file mode 100644 index 0000000..61527d3 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/vo/DistributionUserIncomeApiVO.java @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.distribution.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销收入记录信息VO + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +public class DistributionUserIncomeApiVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "收入记录id") + private Long incomeId; + + @Schema(description = "钱包id") + private Long walletId; + + @Schema(description = "收入类型(1一代奖励、2二代奖励 3邀请奖励 等 )") + private Integer incomeType; + + @Schema(description = "佣金状态(0:待支付、1:待结算、2:已结算、-1:订单失效)") + private Integer state; + + @Schema(description = "佣金数额") + private Long incomeAmount; + + @Schema(description = "关联订购流水号") + private Long orderId; + + @Schema(description = "关联订单项order_item_id") + private Long orderItemId; + + @Schema(description = "商户订单号") + private String merchantOrderId; + + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "操作人id") + private Long modifier; + + @Schema(description = "订单状态") + private Integer orderStatus; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "商品图片") + private String mainImgUrl; + + @Schema(description = "用户id") + private Long userId; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Long getIncomeId() { + return incomeId; + } + + public void setIncomeId(Long incomeId) { + this.incomeId = incomeId; + } + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public Integer getIncomeType() { + return incomeType; + } + + public void setIncomeType(Integer incomeType) { + this.incomeType = incomeType; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getIncomeAmount() { + return incomeAmount; + } + + public void setIncomeAmount(Long incomeAmount) { + this.incomeAmount = incomeAmount; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public String getMerchantOrderId() { + return merchantOrderId; + } + + public void setMerchantOrderId(String merchantOrderId) { + this.merchantOrderId = merchantOrderId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + @Override + public String toString() { + return "DistributionUserIncomeApiVO{" + + "incomeId=" + incomeId + + ", walletId=" + walletId + + ", incomeType=" + incomeType + + ", state=" + state + + ", incomeAmount=" + incomeAmount + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", merchantOrderId='" + merchantOrderId + '\'' + + ", distributionUserId=" + distributionUserId + + ", modifier=" + modifier + + ", orderStatus=" + orderStatus + + ", spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", userId=" + userId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/live/feign/LiveFeignClient.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/live/feign/LiveFeignClient.java new file mode 100644 index 0000000..92647fb --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/live/feign/LiveFeignClient.java @@ -0,0 +1,25 @@ +package com.tmerclub.cloud.api.live.feign; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author TRACK + */ +public interface LiveFeignClient { + + /** + * 把下架商品从直播间删除 + * @param spuId + * @return + */ + ServerResponseEntity deleteLiveRoomProd(Long spuId); + + /** + * 把下架店铺的直播间结束 + * @param shopIds + * @return + */ + ServerResponseEntity endLiveRoom(List shopIds); +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/DeliveryOrderDTO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/DeliveryOrderDTO.java new file mode 100644 index 0000000..d85c0af --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/DeliveryOrderDTO.java @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.dto; + +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单快递信息DTO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public class DeliveryOrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "deliveryOrderId") + private Long deliveryOrderId; + + @NotNull(message = "订单号不能为空") + @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + @Schema(description = "订单地址id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderAddrId; + + @Schema(description = "快递公司") + private Long deliveryCompanyId; + + @Schema(description = "物流单号") + private String deliveryNo; + + @NotNull(message = "发货方式不能为空") + @Schema(description = "发货方式", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer deliveryType; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "收件人") + private String consignee; + + @Schema(description = "收件人手机号") + private String mobile; + + @Schema(description = "物流订单项") + private List selectOrderItems; + + @Schema(description = "网点id") + private Long outletConfigId; + + @Schema(description = "打印机id") + private Long printerId; + + @Schema(description = "快递公司类型") + private Integer deliveryCompanyType; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "消息内容") + private SendNotifyBO sendNotifyBO; + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getDeliveryCompanyId() { + return deliveryCompanyId; + } + + public void setDeliveryCompanyId(Long deliveryCompanyId) { + this.deliveryCompanyId = deliveryCompanyId; + } + + public String getDeliveryNo() { + return deliveryNo; + } + + public void setDeliveryNo(String deliveryNo) { + this.deliveryNo = deliveryNo; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public List getSelectOrderItems() { + return selectOrderItems; + } + + public void setSelectOrderItems(List selectOrderItems) { + this.selectOrderItems = selectOrderItems; + } + + public Long getDeliveryOrderId() { + return deliveryOrderId; + } + + public void setDeliveryOrderId(Long deliveryOrderId) { + this.deliveryOrderId = deliveryOrderId; + } + + public Long getOrderAddrId() { + return orderAddrId; + } + + public void setOrderAddrId(Long orderAddrId) { + this.orderAddrId = orderAddrId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOutletConfigId() { + return outletConfigId; + } + + public void setOutletConfigId(Long outletConfigId) { + this.outletConfigId = outletConfigId; + } + + public Long getPrinterId() { + return printerId; + } + + public void setPrinterId(Long printerId) { + this.printerId = printerId; + } + + public Integer getDeliveryCompanyType() { + return deliveryCompanyType; + } + + public void setDeliveryCompanyType(Integer deliveryCompanyType) { + this.deliveryCompanyType = deliveryCompanyType; + } + + public SendNotifyBO getSendNotifyBO() { + return sendNotifyBO; + } + + public void setSendNotifyBO(SendNotifyBO sendNotifyBO) { + this.sendNotifyBO = sendNotifyBO; + } + + @Override + public String toString() { + return "DeliveryOrderDTO{" + + "deliveryOrderId=" + deliveryOrderId + + ", orderId=" + orderId + + ", orderAddrId=" + orderAddrId + + ", deliveryCompanyId=" + deliveryCompanyId + + ", deliveryNo='" + deliveryNo + '\'' + + ", deliveryType=" + deliveryType + + ", userId=" + userId + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", selectOrderItems=" + selectOrderItems + + ", outletConfigId=" + outletConfigId + + ", printerId=" + printerId + + ", deliveryCompanyType=" + deliveryCompanyType + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", sendNotifyBO=" + sendNotifyBO + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/StationSalesDTO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/StationSalesDTO.java new file mode 100644 index 0000000..a539665 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/StationSalesDTO.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 自提点销售记录 + * + * @author YXF + * @date 2020-06-04 15:31:29 + */ +public class StationSalesDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "支付订单数", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer payOrderNumber; + + /** + * 平台优惠金额 + */ + private Double platformAmount; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 核销数量 + */ + private Integer writeOffNum; + + /** + * 核销数量 + */ + private String userId; + + /** + * 核销数量 + */ + private Double productNums; + + /** + * 实际支付金额 + */ + private Double actualTotal; + /** + * 支付人数 + */ + private Integer userNum; + + /** + * 支付金额 = 平台优惠金额 + 实际支付金额 + */ + @Schema(description = "支付金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Double payAmount; + + @Schema(description = "客单价", requiredMode = Schema.RequiredMode.REQUIRED) + private Double customerUnitPrice; + + @Schema(description = "1:单天营业额,2:该月营业额", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer salesType; + + public Integer getPayOrderNumber() { + return payOrderNumber; + } + + public void setPayOrderNumber(Integer payOrderNumber) { + this.payOrderNumber = payOrderNumber; + } + + public Double getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Double platformAmount) { + this.platformAmount = platformAmount; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Double getProductNums() { + return productNums; + } + + public void setProductNums(Double productNums) { + this.productNums = productNums; + } + + public Double getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Double actualTotal) { + this.actualTotal = actualTotal; + } + + public Integer getUserNum() { + return userNum; + } + + public void setUserNum(Integer userNum) { + this.userNum = userNum; + } + + public Double getPayAmount() { + return payAmount; + } + + public void setPayAmount(Double payAmount) { + this.payAmount = payAmount; + } + + public Double getCustomerUnitPrice() { + return customerUnitPrice; + } + + public void setCustomerUnitPrice(Double customerUnitPrice) { + this.customerUnitPrice = customerUnitPrice; + } + + public Integer getSalesType() { + return salesType; + } + + public void setSalesType(Integer salesType) { + this.salesType = salesType; + } + + @Override + public String toString() { + return "StationSalesDTO{" + + "payOrderNumber=" + payOrderNumber + + ", platformAmount=" + platformAmount + + ", payTime=" + payTime + + ", writeOffNum=" + writeOffNum + + ", userId='" + userId + '\'' + + ", productNums=" + productNums + + ", actualTotal=" + actualTotal + + ", userNum=" + userNum + + ", payAmount=" + payAmount + + ", customerUnitPrice=" + customerUnitPrice + + ", salesType=" + salesType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/AreaFeignClient.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/AreaFeignClient.java new file mode 100644 index 0000000..0b03e08 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/AreaFeignClient.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.feign; + + +import com.tmerclub.cloud.common.order.vo.AreaVO; + +import java.util.List; + +/** + * @author YXF + * @date 2021/06/02 + */ +public interface AreaFeignClient { + + /** + * 获取省信息列表 + * @return 省信息列表 + */ + List listProvinceArea(); + + /** + * 根据地区id获取信息列表 + * @param areaIdList + * @return + */ + List listByAreaIdList(List areaIdList); + +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/DeliveryFeignClient.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/DeliveryFeignClient.java new file mode 100644 index 0000000..7d9ff3f --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/DeliveryFeignClient.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.feign; + +import com.tmerclub.cloud.api.delivery.dto.CalculateAndGetDeliverInfoDTO; +import com.tmerclub.cloud.api.delivery.vo.ShopTransportVO; +import com.tmerclub.cloud.common.order.vo.TransportVO; +import com.tmerclub.cloud.common.order.vo.UserDeliveryInfoVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/14 + */ +public interface DeliveryFeignClient { + + /** + * 计算运费,并计算获取配送信息 + * @param param 用户地址和订单信息 + * @return void + */ + ServerResponseEntity calculateAndGetDeliverInfo(CalculateAndGetDeliverInfoDTO param); + + /** + * 获取店铺运费模板列表 + * @param shopId 店铺id + * @return 运费模板列表 + */ + ServerResponseEntity> listTransportByShopId(Long shopId); + + /** + * 根据id列表获取运费模板 + * @param transportIds + * @return + */ + ServerResponseEntity> listTransportByIds(List transportIds); + + /** + * 判断用户地址是否包含在配送范围内 + * @param deliveryTemplateId + * @param userId + * @param addrId + * @return + */ + ServerResponseEntity checkAddr(Long deliveryTemplateId, Long userId, Long addrId); + + /** + * 检查配送范围 + * @param deliveryTemplateId 运费模板id + * @param addrId 用户地址id + * @return + */ + ServerResponseEntity checkDeliveryRange(Long deliveryTemplateId, + Long addrId); + + + /** + * 获取商品物流模板 + * @param deliveryTemplateId + * @return + */ + TransportVO getTransportAndAllItemsById(Long deliveryTemplateId); +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/SameCityFeignClient.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/SameCityFeignClient.java new file mode 100644 index 0000000..b8e7e20 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/SameCityFeignClient.java @@ -0,0 +1,26 @@ +package com.tmerclub.cloud.api.delivery.feign; + +import com.tmerclub.cloud.api.delivery.vo.SameCityVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author lanhai + */ +public interface SameCityFeignClient { + + /** + * 清除同城配送坐标数据 + * + * @param shopId + */ + void clearPositionInfo(Long shopId); + + + /** + * 根据店铺id获取同城配送设置 + * + * @param shopId + * @return + */ + ServerResponseEntity getSameCityByShopId(Long shopId); +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryOrderFeignVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryOrderFeignVO.java new file mode 100644 index 0000000..2c8c349 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryOrderFeignVO.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单快递信息VO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public class DeliveryOrderFeignVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单物流包裹id") + private Long deliveryOrderId; + + @Schema(description = "订单号") + private Long orderId; + + @Schema(description = "快递公司id") + private Long deliveryCompanyId; + + @Schema(description = "快递单号") + private String deliveryNo; + + @Schema(description = "收件人姓名") + private String consigneeName; + + @Schema(description = "收件人电话(顺丰快递需要)") + private String consigneeMobile; + + @Schema(description = "物流状态 1正常 -1删除") + private Integer status; + + @Schema(description = "包裹商品总数") + private Integer allCount; + + @Schema(description = "删除时间") + private Date deleteTime; + + @Schema(description = "物流名称") + private String deliveryName; + + @Schema(description = "物流包裹订单项") + private List orderItems; + + @Schema(description = "物流包裹订单项") + private DeliveryInfoVO delivery; + + @Schema(description = "发货方式") + private Integer deliveryType; + + public Long getDeliveryOrderId() { + return deliveryOrderId; + } + + public void setDeliveryOrderId(Long deliveryOrderId) { + this.deliveryOrderId = deliveryOrderId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getDeliveryCompanyId() { + return deliveryCompanyId; + } + + public void setDeliveryCompanyId(Long deliveryCompanyId) { + this.deliveryCompanyId = deliveryCompanyId; + } + + public String getDeliveryNo() { + return deliveryNo; + } + + public void setDeliveryNo(String deliveryNo) { + this.deliveryNo = deliveryNo; + } + + public String getConsigneeName() { + return consigneeName; + } + + public void setConsigneeName(String consigneeName) { + this.consigneeName = consigneeName; + } + + public String getConsigneeMobile() { + return consigneeMobile; + } + + public void setConsigneeMobile(String consigneeMobile) { + this.consigneeMobile = consigneeMobile; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Date getDeleteTime() { + return deleteTime; + } + + public void setDeleteTime(Date deleteTime) { + this.deleteTime = deleteTime; + } + + public String getDeliveryName() { + return deliveryName; + } + + public void setDeliveryName(String deliveryName) { + this.deliveryName = deliveryName; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public DeliveryInfoVO getDelivery() { + return delivery; + } + + public void setDelivery(DeliveryInfoVO delivery) { + this.delivery = delivery; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + @Override + public String toString() { + return "DeliveryOrderFeignVO{" + + "deliveryOrderId=" + deliveryOrderId + + ", orderId=" + orderId + + ", deliveryCompanyId=" + deliveryCompanyId + + ", deliveryNo='" + deliveryNo + '\'' + + ", consigneeName='" + consigneeName + '\'' + + ", consigneeMobile='" + consigneeMobile + '\'' + + ", status=" + status + + ", allCount=" + allCount + + ", deleteTime=" + deleteTime + + ", deliveryName='" + deliveryName + '\'' + + ", orderItems=" + orderItems + + ", delivery=" + delivery + + ", deliveryType=" + deliveryType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryOrderItemFeignVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryOrderItemFeignVO.java new file mode 100644 index 0000000..19187eb --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryOrderItemFeignVO.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 物流订单项信息VO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public class DeliveryOrderItemFeignVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long deliveryOrderItemId; + + @Schema(description = "订单物流包裹id") + private Long deliveryOrderId; + + @Schema(description = "商品图片") + private String imgUrl; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品数量") + private Integer count; + + @Schema(description = "供应商商品图片") + private String supplierImgUrl; + + @Schema(description = "供应商商品名称") + private String supplierSpuName; + + public String getSupplierImgUrl() { + return supplierImgUrl; + } + + public void setSupplierImgUrl(String supplierImgUrl) { + this.supplierImgUrl = supplierImgUrl; + } + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public Long getDeliveryOrderItemId() { + return deliveryOrderItemId; + } + + public void setDeliveryOrderItemId(Long deliveryOrderItemId) { + this.deliveryOrderItemId = deliveryOrderItemId; + } + + public Long getDeliveryOrderId() { + return deliveryOrderId; + } + + public void setDeliveryOrderId(Long deliveryOrderId) { + this.deliveryOrderId = deliveryOrderId; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "DeliveryOrderItemFeignVO{" + + "deliveryOrderItemId=" + deliveryOrderItemId + + ", deliveryOrderId=" + deliveryOrderId + + ", imgUrl='" + imgUrl + '\'' + + ", spuName='" + spuName + '\'' + + ", count=" + count + + ", supplierImgUrl=" + supplierImgUrl + '\'' + + ", supplierSpuName='" + supplierSpuName + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/SameCityVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/SameCityVO.java new file mode 100644 index 0000000..d82d448 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/SameCityVO.java @@ -0,0 +1,334 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.vo; + +import com.tmerclub.cloud.common.bean.BmapPoint; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 同城配送信息VO + * + * @author FrozenWatermelon + * @date 2020-12-16 15:33:57 + */ +public class SameCityVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "同城配送") + private Long samecityId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "配送区域经纬度json") + private String positionInfo; + + @Schema(description = "收费类型 1按区域收取固定配送费 2按距离收取配送费") + private Integer chargeType; + + @Schema(description = "起送价 是优惠券/码和满减优惠抵扣前的商品金额,运费不计入起送价。") + private Long startFee; + + @Schema(description = "配送费") + private Long deliveryFee; + + @Schema(description = "默认距离(km)") + private Double defaultDistance; + + @Schema(description = "每超出距离(km)") + private Double overDistance; + + @Schema(description = "每超出距离费用") + private Long overDistanceFee; + + @Schema(description = "免费重量") + private Double freeWeight; + + @Schema(description = "续重重量") + private Double overWeight; + + @Schema(description = "续重费用") + private Long overWeightFee; + + @Schema(description = "启用状态 1启用 0未启用") + private Integer status; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + @Schema(description = "后台坐标点数组") + private List polygonPath; + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Schema(description = "详细地址") + private String detailAddress; + + @Schema(description = "店铺所在经度") + private String shopLng; + + @Schema(description = "店铺所在纬度") + private String shopLat; + + public String getShopLng() { + return shopLng; + } + + public void setShopLng(String shopLng) { + this.shopLng = shopLng; + } + + public String getShopLat() { + return shopLat; + } + + public void setShopLat(String shopLat) { + this.shopLat = shopLat; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getDetailAddress() { + return detailAddress; + } + + public void setDetailAddress(String detailAddress) { + this.detailAddress = detailAddress; + } + + public Long getSamecityId() { + return samecityId; + } + + public void setSamecityId(Long samecityId) { + this.samecityId = samecityId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getPositionInfo() { + return positionInfo; + } + + public void setPositionInfo(String positionInfo) { + this.positionInfo = positionInfo; + } + + public Integer getChargeType() { + return chargeType; + } + + public void setChargeType(Integer chargeType) { + this.chargeType = chargeType; + } + + public Long getStartFee() { + return startFee; + } + + public void setStartFee(Long startFee) { + this.startFee = startFee; + } + + public Long getDeliveryFee() { + return deliveryFee; + } + + public void setDeliveryFee(Long deliveryFee) { + this.deliveryFee = deliveryFee; + } + + public Double getDefaultDistance() { + return defaultDistance; + } + + public void setDefaultDistance(Double defaultDistance) { + this.defaultDistance = defaultDistance; + } + + public Double getOverDistance() { + return overDistance; + } + + public void setOverDistance(Double overDistance) { + this.overDistance = overDistance; + } + + public Long getOverDistanceFee() { + return overDistanceFee; + } + + public void setOverDistanceFee(Long overDistanceFee) { + this.overDistanceFee = overDistanceFee; + } + + public Double getFreeWeight() { + return freeWeight; + } + + public void setFreeWeight(Double freeWeight) { + this.freeWeight = freeWeight; + } + + public Double getOverWeight() { + return overWeight; + } + + public void setOverWeight(Double overWeight) { + this.overWeight = overWeight; + } + + public Long getOverWeightFee() { + return overWeightFee; + } + + public void setOverWeightFee(Long overWeightFee) { + this.overWeightFee = overWeightFee; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + public List getPolygonPath() { + return polygonPath; + } + + public void setPolygonPath(List polygonPath) { + this.polygonPath = polygonPath; + } + + @Override + public String toString() { + return "SameCityVO{" + + "samecityId=" + samecityId + + ", shopId=" + shopId + + ", positionInfo='" + positionInfo + '\'' + + ", chargeType=" + chargeType + + ", startFee=" + startFee + + ", deliveryFee=" + deliveryFee + + ", defaultDistance=" + defaultDistance + + ", overDistance=" + overDistance + + ", overDistanceFee=" + overDistanceFee + + ", freeWeight=" + freeWeight + + ", overWeight=" + overWeight + + ", overWeightFee=" + overWeightFee + + ", status=" + status + + ", lng=" + lng + + ", lat=" + lat + + ", polygonPath=" + polygonPath + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", detailAddress='" + detailAddress + '\'' + + ", shopLng='" + shopLng + '\'' + + ", shopLat='" + shopLat + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/StationVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/StationVO.java new file mode 100644 index 0000000..0303f7b --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/StationVO.java @@ -0,0 +1,310 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.vo; + +import com.tmerclub.cloud.api.delivery.dto.StationSalesDTO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 自提点信息VO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class StationVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "自提点id") + private Long stationId; + + @Schema(description = "关联店铺id") + private Long shopId; + + @Schema(description = "关联店铺名称") + private String shopName; + + @Schema(description = "自提点名称") + private String stationName; + + @Schema(description = "自提点图片") + private String imgUrl; + + @Schema(description = "电话区号") + private String mobilePrefix; + + @Schema(description = "手机/电话号码") + private String mobile; + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Schema(description = "邮编") + private String postCode; + + @Schema(description = "地址") + private String addr; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + @Schema(description = "时间数据") + private String timeInfo; + + @Schema(description = "0:关闭 1:营业 2:强制关闭 3:审核中 4:审核失败") + private Integer status; + + @Schema(description = "账号名") + private String account; + + @Schema(description = "销售数据") + private List stationSalesDTOList; + + @Schema(description = "库存") + private Integer stock; + + @Schema(description = "库存模式 参考StockModeEnum") + private Integer stockMode; + + public Integer getStockMode() { + return stockMode; + } + + public void setStockMode(Integer stockMode) { + this.stockMode = stockMode; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public Long getShopId() { + return shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getMobilePrefix() { + return mobilePrefix; + } + + public void setMobilePrefix(String mobilePrefix) { + this.mobilePrefix = mobilePrefix; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + public String getTimeInfo() { + return timeInfo; + } + + public void setTimeInfo(String timeInfo) { + this.timeInfo = timeInfo; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public List getStationSalesDTOList() { + return stationSalesDTOList; + } + + public void setStationSalesDTOList(List stationSalesDTOList) { + this.stationSalesDTOList = stationSalesDTOList; + } + + @Override + public String toString() { + return "StationVO{" + + "stationId=" + stationId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", stationName='" + stationName + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", mobilePrefix='" + mobilePrefix + '\'' + + ", mobile='" + mobile + '\'' + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", postCode='" + postCode + '\'' + + ", addr='" + addr + '\'' + + ", lng=" + lng + + ", lat=" + lat + + ", timeInfo='" + timeInfo + '\'' + + ", status=" + status + + ", account='" + account + '\'' + + ", stationSalesDTOList=" + stationSalesDTOList + + ", stock=" + stock + + ", stockMode=" + stockMode + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsAllotOrderBO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsAllotOrderBO.java new file mode 100644 index 0000000..36c254b --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsAllotOrderBO.java @@ -0,0 +1,240 @@ +package com.tmerclub.cloud.api.order.bo; + + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author gaozijie + * @since 2023-11-27 + */ +public class EsAllotOrderBO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 调拨订单id + */ + private Long allotOrderId; + + /** + * 调出点仓库id + */ + private Long outWarehouseId; + + /** + * 调出点库存点类型 + * @see com.tmerclub.cloud.common.product.constant.StockPointType + */ + private Integer outStockPointType; + + /** + * 调入点仓库id + */ + private Long inWarehouseId; + + /** + * 调入点库存点类型 + * @see com.tmerclub.cloud.common.product.constant.StockPointType + */ + private Integer inStockPointType; + + /** + * 物流方式 + * @see com.tmerclub.cloud.common.order.constant.DeliveryType + */ + private Integer dvyType; + + /** + * 物流单号 + */ + private String dvyOrderNumber; + + /** + * 状态 + */ + private Integer status; + + /** + * 总调拨数量 + */ + private Integer totalAllotCount; + + /** + * 备注 + */ + private String remark; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 系统类型 + * @see com.tmerclub.cloud.common.constant.SysTypeEnum + */ + private Integer sysType; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 调拨订单项 + */ + List allotOrderItems; + + public EsAllotOrderBO() { + } + + public Long getAllotOrderId() { + return allotOrderId; + } + + public void setAllotOrderId(Long allotOrderId) { + this.allotOrderId = allotOrderId; + } + + public Long getOutWarehouseId() { + return outWarehouseId; + } + + public void setOutWarehouseId(Long outWarehouseId) { + this.outWarehouseId = outWarehouseId; + } + + public Integer getOutStockPointType() { + return outStockPointType; + } + + public void setOutStockPointType(Integer outStockPointType) { + this.outStockPointType = outStockPointType; + } + + public Long getInWarehouseId() { + return inWarehouseId; + } + + public void setInWarehouseId(Long inWarehouseId) { + this.inWarehouseId = inWarehouseId; + } + + public Integer getInStockPointType() { + return inStockPointType; + } + + public void setInStockPointType(Integer inStockPointType) { + this.inStockPointType = inStockPointType; + } + + public Integer getDvyType() { + return dvyType; + } + + public void setDvyType(Integer dvyType) { + this.dvyType = dvyType; + } + + public String getDvyOrderNumber() { + return dvyOrderNumber; + } + + public void setDvyOrderNumber(String dvyOrderNumber) { + this.dvyOrderNumber = dvyOrderNumber; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getTotalAllotCount() { + return totalAllotCount; + } + + public void setTotalAllotCount(Integer totalAllotCount) { + this.totalAllotCount = totalAllotCount; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public List getAllotOrderItems() { + return allotOrderItems; + } + + public void setAllotOrderItems(List allotOrderItems) { + this.allotOrderItems = allotOrderItems; + } + + @Override + public String toString() { + return "EsAllotOrderBO{" + + "allotOrderId=" + allotOrderId + + ", outWarehouseId=" + outWarehouseId + + ", outStockPointType=" + outStockPointType + + ", inWarehouseId=" + inWarehouseId + + ", inStockPointType=" + inStockPointType + + ", dvyType=" + dvyType + + ", dvyOrderNumber='" + dvyOrderNumber + '\'' + + ", status=" + status + + ", totalAllotCount=" + totalAllotCount + + ", remark='" + remark + '\'' + + ", shopId=" + shopId + + ", sysType=" + sysType + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", allotOrderItems=" + allotOrderItems + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsOrderInvoiceBO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsOrderInvoiceBO.java new file mode 100644 index 0000000..5251abe --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsOrderInvoiceBO.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author FrozenWatermelon + * @date 2021/2/5 + */ +public class EsOrderInvoiceBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单发票ID") + private Long orderInvoiceId; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "发票类型 1.电子普通发票") + private Integer invoiceType; + + @Schema(description = "抬头类型 1.单位 2.个人") + private Integer headerType; + + @Schema(description = "抬头名称") + private String headerName; + + @Schema(description = "发票税号") + private String invoiceTaxNumber; + + @Schema(description = "发票内容 1.商品明细") + private Integer invoiceContext; + + @Schema(description = "发票状态 1.申请中 2.已开票") + private Integer invoiceState; + + @Schema(description = "文件id") + private Long fileId; + + @Schema(description = "申请时间") + private Date applicationTime; + + @Schema(description = "上传时间") + private Date uploadTime; + + @Schema(description = "订单状态") + private Integer orderStatus; + + public Long getOrderInvoiceId() { + return orderInvoiceId; + } + + public void setOrderInvoiceId(Long orderInvoiceId) { + this.orderInvoiceId = orderInvoiceId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getInvoiceType() { + return invoiceType; + } + + public void setInvoiceType(Integer invoiceType) { + this.invoiceType = invoiceType; + } + + public Integer getHeaderType() { + return headerType; + } + + public void setHeaderType(Integer headerType) { + this.headerType = headerType; + } + + public String getHeaderName() { + return headerName; + } + + public void setHeaderName(String headerName) { + this.headerName = headerName; + } + + public String getInvoiceTaxNumber() { + return invoiceTaxNumber; + } + + public void setInvoiceTaxNumber(String invoiceTaxNumber) { + this.invoiceTaxNumber = invoiceTaxNumber; + } + + public Integer getInvoiceContext() { + return invoiceContext; + } + + public void setInvoiceContext(Integer invoiceContext) { + this.invoiceContext = invoiceContext; + } + + public Integer getInvoiceState() { + return invoiceState; + } + + public void setInvoiceState(Integer invoiceState) { + this.invoiceState = invoiceState; + } + + public Long getFileId() { + return fileId; + } + + public void setFileId(Long fileId) { + this.fileId = fileId; + } + + public Date getApplicationTime() { + return applicationTime; + } + + public void setApplicationTime(Date applicationTime) { + this.applicationTime = applicationTime; + } + + public Date getUploadTime() { + return uploadTime; + } + + public void setUploadTime(Date uploadTime) { + this.uploadTime = uploadTime; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + @Override + public String toString() { + return "EsOrderInvoiceBO{" + + "orderInvoiceId=" + orderInvoiceId + + ", orderId=" + orderId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", invoiceType=" + invoiceType + + ", headerType=" + headerType + + ", headerName='" + headerName + '\'' + + ", invoiceTaxNumber='" + invoiceTaxNumber + '\'' + + ", invoiceContext=" + invoiceContext + + ", invoiceState=" + invoiceState + + ", fileId=" + fileId + + ", applicationTime=" + applicationTime + + ", uploadTime=" + uploadTime + + ", orderStatus=" + orderStatus + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsOrderRefundItemBO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsOrderRefundItemBO.java new file mode 100644 index 0000000..f0f0296 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsOrderRefundItemBO.java @@ -0,0 +1,394 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 订单退款记录信息 + * + * @author YXF + * @date 2022/8/23 + */ +public class EsOrderRefundItemBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单项id + */ + private Long orderItemId; + + /** + * 商品id + */ + private Long spuId; + + /** + * skuId + */ + private Long skuId; + + /** + * 商品名称 + */ + private String spuName; + + /** + * sku名称 + */ + private String skuName; + + /** + * 中文商品名称 + */ + private String spuNameZh; + + /** + * 英文商品名称 + */ + private String spuNameEn; + + /** + * 中文sku名称 + */ + private String skuNameZh; + + /** + * 英文sku名称 + */ + private String skuNameEn; + + /** + * 商品图片 + */ + private String pic; + + /** + * 供应商商品名称 + */ + private String supplierSpuName; + + /** + * 供应商sku名称 + */ + private String supplierSkuName; + + /** + * 供应商中文商品名称 + */ + private String supplierSpuNameZh; + + /** + * 供应商英文商品名称 + */ + private String supplierSpuNameEn; + + /** + * 供应商中文sku名称 + */ + private String supplierSkuNameZh; + + /** + * 供应商英文sku名称 + */ + private String supplierSkuNameEn; + + /** + * 供应商商品图片 + */ + private String supplierPic; + + /** + * sku编码 + */ + private String partyCode; + + /** + * 商品数量 + */ + private Integer count; + + /** + * 商品价格 + */ + private Long price; + + /** + * 产品总价格 + */ + private Long spuTotalAmount; + + /** + * 商品实际金额 + */ + private Long actualTotal; + + /** + * 平台优惠金额 + */ + private Long platformShareReduce; + + /** + * 退还积分 + */ + private Long refundScore; + + /** + * 活动id + * @return + */ + private Long activityId; + + /** + * 活动类型 + * @return + */ + private Integer activityType; + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public String getSupplierSkuName() { + return supplierSkuName; + } + + public void setSupplierSkuName(String supplierSkuName) { + this.supplierSkuName = supplierSkuName; + } + + public String getSupplierSpuNameZh() { + return supplierSpuNameZh; + } + + public void setSupplierSpuNameZh(String supplierSpuNameZh) { + this.supplierSpuNameZh = supplierSpuNameZh; + } + + public String getSupplierSpuNameEn() { + return supplierSpuNameEn; + } + + public void setSupplierSpuNameEn(String supplierSpuNameEn) { + this.supplierSpuNameEn = supplierSpuNameEn; + } + + public String getSupplierSkuNameZh() { + return supplierSkuNameZh; + } + + public void setSupplierSkuNameZh(String supplierSkuNameZh) { + this.supplierSkuNameZh = supplierSkuNameZh; + } + + public String getSupplierSkuNameEn() { + return supplierSkuNameEn; + } + + public void setSupplierSkuNameEn(String supplierSkuNameEn) { + this.supplierSkuNameEn = supplierSkuNameEn; + } + + public String getSupplierPic() { + return supplierPic; + } + + public void setSupplierPic(String supplierPic) { + this.supplierPic = supplierPic; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getActivityType() { + return activityType; + } + + public void setActivityType(Integer activityType) { + this.activityType = activityType; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getSpuNameZh() { + return spuNameZh; + } + + public void setSpuNameZh(String spuNameZh) { + this.spuNameZh = spuNameZh; + } + + public String getSpuNameEn() { + return spuNameEn; + } + + public void setSpuNameEn(String spuNameEn) { + this.spuNameEn = spuNameEn; + } + + public String getSkuNameZh() { + return skuNameZh; + } + + public void setSkuNameZh(String skuNameZh) { + this.skuNameZh = skuNameZh; + } + + public String getSkuNameEn() { + return skuNameEn; + } + + public void setSkuNameEn(String skuNameEn) { + this.skuNameEn = skuNameEn; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getSpuTotalAmount() { + return spuTotalAmount; + } + + public void setSpuTotalAmount(Long spuTotalAmount) { + this.spuTotalAmount = spuTotalAmount; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getPlatformShareReduce() { + return platformShareReduce; + } + + public void setPlatformShareReduce(Long platformShareReduce) { + this.platformShareReduce = platformShareReduce; + } + + public Long getRefundScore() { + return refundScore; + } + + public void setRefundScore(Long refundScore) { + this.refundScore = refundScore; + } + + @Override + public String toString() { + return "EsOrderRefundItemBO{" + + "orderItemId=" + orderItemId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", spuNameZh='" + spuNameZh + '\'' + + ", spuNameEn='" + spuNameEn + '\'' + + ", skuNameZh='" + skuNameZh + '\'' + + ", skuNameEn='" + skuNameEn + '\'' + + ", pic='" + pic + '\'' + + ", supplierSpuName='" + supplierSpuName + '\'' + + ", supplierSkuName='" + supplierSkuName + '\'' + + ", supplierSpuNameZh='" + supplierSpuNameZh + '\'' + + ", supplierSpuNameEn='" + supplierSpuNameEn + '\'' + + ", supplierSkuNameZh='" + supplierSkuNameZh + '\'' + + ", supplierSkuNameEn='" + supplierSkuNameEn + '\'' + + ", supplierPic='" + supplierPic + '\'' + + ", partyCode='" + partyCode + '\'' + + ", count=" + count + + ", price=" + price + + ", spuTotalAmount=" + spuTotalAmount + + ", actualTotal=" + actualTotal + + ", platformShareReduce=" + platformShareReduce + + ", refundScore=" + refundScore + + ", activityId=" + activityId + + ", activityType=" + activityType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsPurchaseOrderItemBO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsPurchaseOrderItemBO.java new file mode 100644 index 0000000..21cd706 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsPurchaseOrderItemBO.java @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.bo; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 采购商品 + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public class EsPurchaseOrderItemBO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long purchaseItemId; + + /** + * 商品id + */ + private Long spuId; + + /** + * sku id + */ + private Long skuId; + + /** + * 采购金额 + */ + private Long purchaseAmount; + + /** + * 采购价 + */ + private Long purchasePrice; + + /** + * 采购库存数量 + */ + private Integer purchaseStock; + + /** + * 实际库存数量 + */ + private Integer actualStock; + /** + * 实际库存数量 + */ + private Integer deliveryType; + + /** + * 状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成 + */ + private Integer status; + + /** + * 商品编码 + */ + private String spuCode; + + /** + * sku编码 + */ + private String partyCode; + + /** + * 商品图片 + */ + private String pic; + + /** + * 待发货数量 + */ + private Integer beDeliveredNum; + + /** + * 商品名称 + */ + private String spuName; + + /** + * 商品中文名称 + */ + private String spuNameZh; + + /** + * 商品英文名称 + */ + private String spuNameEn; + + /** + * sku名称 + */ + private String skuName; + + + /** + * sku中文名称 + */ + private String skuNameZh; + + /** + * sku英文名称 + */ + private String skuNameEn; + + public Long getPurchaseItemId() { + return purchaseItemId; + } + + public void setPurchaseItemId(Long purchaseItemId) { + this.purchaseItemId = purchaseItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getPurchaseAmount() { + return purchaseAmount; + } + + public void setPurchaseAmount(Long purchaseAmount) { + this.purchaseAmount = purchaseAmount; + } + + public Long getPurchasePrice() { + return purchasePrice; + } + + public void setPurchasePrice(Long purchasePrice) { + this.purchasePrice = purchasePrice; + } + + public Integer getPurchaseStock() { + return purchaseStock; + } + + public void setPurchaseStock(Integer purchaseStock) { + this.purchaseStock = purchaseStock; + } + + public Integer getActualStock() { + return actualStock; + } + + public void setActualStock(Integer actualStock) { + this.actualStock = actualStock; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getBeDeliveredNum() { + return beDeliveredNum; + } + + public void setBeDeliveredNum(Integer beDeliveredNum) { + this.beDeliveredNum = beDeliveredNum; + } + + public String getSpuNameZh() { + return spuNameZh; + } + + public void setSpuNameZh(String spuNameZh) { + this.spuNameZh = spuNameZh; + } + + public String getSpuNameEn() { + return spuNameEn; + } + + public void setSpuNameEn(String spuNameEn) { + this.spuNameEn = spuNameEn; + } + + public String getSkuNameZh() { + return skuNameZh; + } + + public void setSkuNameZh(String skuNameZh) { + this.skuNameZh = skuNameZh; + } + + public String getSkuNameEn() { + return skuNameEn; + } + + public void setSkuNameEn(String skuNameEn) { + this.skuNameEn = skuNameEn; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + @Override + public String toString() { + return "EsPurchaseOrderItemBO{" + + "purchaseItemId=" + purchaseItemId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", purchaseAmount=" + purchaseAmount + + ", purchasePrice=" + purchasePrice + + ", purchaseStock=" + purchaseStock + + ", actualStock=" + actualStock + + ", deliveryType=" + deliveryType + + ", status=" + status + + ", spuCode='" + spuCode + '\'' + + ", partyCode='" + partyCode + '\'' + + ", pic='" + pic + '\'' + + ", beDeliveredNum=" + beDeliveredNum + + ", spuName='" + spuName + '\'' + + ", spuNameZh='" + spuNameZh + '\'' + + ", spuNameEn='" + spuNameEn + '\'' + + ", skuName='" + skuName + '\'' + + ", skuNameZh='" + skuNameZh + '\'' + + ", skuNameEn='" + skuNameEn + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/BuyerReasonType.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/BuyerReasonType.java new file mode 100644 index 0000000..95ef240 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/BuyerReasonType.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.constant; + +/** + * 退款申请原因 + * @author lhd + */ +public enum BuyerReasonType { + + /** + * 0.拍错/多拍/不喜欢 + */ + WRONG_SHOOTING(0, "拍错/多拍/不喜欢", "Wrong shot / more shots / dislike"), + /** + * 1.协商一致退款 + */ + REFUND_BY_CONSENSUS(1, "协商一致退款", "Refund by consensus"), + /** + * "pleaseChoose": '请选择', + * "wrongShot": '拍错/多拍/不喜欢', + * "refundConsensus": '协商一致退款', + * "damagedGoods": '商品破损/少件', + * "productNot": '商品与描述不符', + * "sellerSendsWrong": '卖家发错货', + * "qualityProblem": '质量问题', + * "pleaseChoose": 'Please choose', + * "wrongShot": 'Wrong shot / more shots / dislike', + * "refundConsensus": 'Refund by consensus', + * "damagedGoods": 'Damaged goods / missing items', + * "productNot": 'The product does not match the description', + * "sellerSendsWrong": 'Seller sends wrong goods', + * "qualityProblem": 'Quality problem', + */ + DAMAGED_GOODS(2, "商品破损/少件", "Damaged goods / missing items"), + + /** + * 3.商品与描述不符 + */ + PROD_ERROR(3, "商品与描述不符", "The product does not match the description"), + + /** + * 4.卖家发错货 + */ + WRONG_DELIVERY(4, "卖家发错货", "Seller sends wrong goods"), + + /** + * 5.质量问题 + */ + QUALITY_PROBLEM(5, "质量问题", "Quality problem"), + /** + * 6.其他 + */ + OTHER(6, "其他", "other"), + + GROUP_FAILED(7, "拼团失败:系统自动退款", "Group failed : The system auto refund"); + private final Integer num; + + private final String cn; + private final String en; + + public Integer value() { + return num; + } + + public String getEn() { + return en; + } + + public String getCn() { + return cn; + } + + BuyerReasonType(Integer num, String cn, String en) { + this.num = num; + this.cn = cn; + this.en = en; + } + + public static BuyerReasonType instance(Integer value) { + BuyerReasonType[] enums = values(); + for (BuyerReasonType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return OTHER; + } + + public static BuyerReasonType instance(String value) { + BuyerReasonType[] enums = values(); + for (BuyerReasonType statusEnum : enums) { + if (statusEnum.getCn().equals(value)) { + return statusEnum; + } + } + return OTHER; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/OrderStatus.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/OrderStatus.java new file mode 100644 index 0000000..e2b4fdb --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/OrderStatus.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.constant; + +import java.util.Objects; + +/** + * 订单状态 + * @author FrozenWatermelon + * @date 2020/12/18 + */ +public enum OrderStatus { + + /** + * 没有付款.待付款 + */ + UNPAY(1, "待付款", "待付款"), + + /** + * 已经付款,但卖家没有发货.待发货 + */ + PAYED(2, "待发货", "待自提"), + + /** + * 发货,导致实际库存减少,没有确认收货.待收货 + */ + CONSIGNMENT(3, "待收货", "已自提"), + + /** + * 订单确认收货成功,购买数增加1. + */ + SUCCESS(5, "已收货", "已收货"), + + /** + * 交易失败,还原库存 + */ + CLOSE(6, "交易失败", "交易失败"), + + /** + * 待成团 + */ + WAIT_GROUP(7, "待成团", "待成团"), + + /** + * 待采购 + */ + WAIT_PURCHASE(8, "待采购", "待采购"), + + /** + * 待付尾款 + */ + WAIT_BALANCE(9, "待付尾款", "待付尾款"); + + private final Integer num; + private final String deliveryName; + private final String stationName; + + public Integer value() { + return num; + } + + public String deliveryName() { + return deliveryName; + } + + public String stationName() { + return stationName; + } + + OrderStatus(Integer num, String deliveryName, String stationName) { + this.num = num; + this.deliveryName = deliveryName; + this.stationName = stationName; + } + + public static OrderStatus instance(Integer value) { + OrderStatus[] enums = values(); + for (OrderStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static String getDeliveryName(Integer value) { + OrderStatus[] enums = values(); + for (OrderStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum.deliveryName; + } + } + return null; + } + + public static String getStationName(Integer value) { + OrderStatus[] enums = values(); + for (OrderStatus statusEnum : enums) { + if (!statusEnum.value().equals(value)) { + return statusEnum.stationName; + } + } + return null; + } + + public static boolean unPay(Integer status) { + if (status == null) { + return false; + } + return Objects.equals(UNPAY.num, status); + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/TimeTypeEnum.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/TimeTypeEnum.java new file mode 100644 index 0000000..2baa261 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/TimeTypeEnum.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.constant; + + +/** + * 流量筛选的时间类型 + * @author YXF + * @date 2021-05-21 + */ +public enum TimeTypeEnum { + /** 日*/ + DAY(1, 1), + /** 周 */ + WEEK(2, 1), + /** 月 */ + MONTH(3, 1), + /** 今日实时 */ + REAL_TIME(4, 1), + /** 近七天 */ + NEARLY_WEEK(5, 7), + /** 近30天 */ + NEARLY_MONTH(6, 30), + /** 自定义 */ + CUSTOM(7, 0); + + private final Integer id; + + private final Integer num; + + public Integer value() { + return id; + } + + public Integer getNum() { + return num; + } + + TimeTypeEnum(Integer id, Integer num) { + this.id = id; + this.num = num; + } + + public static TimeTypeEnum instance(Integer value) { + TimeTypeEnum[] enums = values(); + for (TimeTypeEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return DAY; + } + + public static TimeTypeEnum[] allEnum() { + return values(); + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/FlowOrderItemDTO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/FlowOrderItemDTO.java new file mode 100644 index 0000000..f336be5 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/FlowOrderItemDTO.java @@ -0,0 +1,74 @@ +package com.tmerclub.cloud.api.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author gaozijie + * @date 2023-10-09 + */ +public class FlowOrderItemDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "起始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; + + public FlowOrderItemDTO() { + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + @Override + public String toString() { + return "FlowOrderItemDTO{" + + "spuId=" + spuId + + ", shopId=" + shopId + + ", startTime=" + startTime + + ", endTime=" + endTime + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/QueryOrderDTO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/QueryOrderDTO.java new file mode 100644 index 0000000..1e4314e --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/QueryOrderDTO.java @@ -0,0 +1,55 @@ +package com.tmerclub.cloud.api.order.dto; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author gaozijie + * @date 2023-04-17 + */ +public class QueryOrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户id集合 + */ + private List userIds; + + /** + * 店铺Id + */ + private Long shopId; + + public QueryOrderDTO() { + } + + public QueryOrderDTO(List userIds, Long shopId) { + this.userIds = userIds; + this.shopId = shopId; + } + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "QueryOrderDTO{" + + "userIds=" + userIds + + ", shopId=" + shopId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/AllotOrderFeignClient.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/AllotOrderFeignClient.java new file mode 100644 index 0000000..0c722d9 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/AllotOrderFeignClient.java @@ -0,0 +1,23 @@ +package com.tmerclub.cloud.api.order.feign; + +import com.tmerclub.cloud.api.order.bo.EsAllotOrderBO; + +/** + * @author gaozijie + * @since 2023-11-24 + */ +public interface AllotOrderFeignClient { + + /** + * 调拨订单保存进mongo,并返回es数据 + * @param allotOrderId 调拨订单id + */ + EsAllotOrderBO saveMongoAndGetEsInfo(Long allotOrderId); + + /** + * 统计未完成的调拨订单数量 + * @param warehouseId 仓库id + * @return 未完成数 + */ + Long countUnFinish(Long warehouseId); +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderCommFeignClient.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderCommFeignClient.java new file mode 100644 index 0000000..1efa38a --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderCommFeignClient.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.feign; + +import com.tmerclub.cloud.common.order.vo.OrderItemLangVO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface OrderCommFeignClient { + + /** + * 根据orderItemId,获取评论地订单项对应的spuId + * + * @param orderItemId 订单项id列表 + * @return spuId + */ + ServerResponseEntity getSpuIdByOrderItemId(Long orderItemId); + + /** + * 更新订单项评论状态 + * + * @param orderItemVO 订单项id列表 + * @return spuId + */ + void updateOrderItemComm(OrderItemVO orderItemVO); + + /** + * 批量更新订单项评论状态 + * @param orderItemVOList + */ + void updateOrderItemComms(List orderItemVOList); + + /** + * 根据订单项id获取订单项信息 + * @param orderItemId + * @return + */ + ServerResponseEntity getOrderItemByOrderItemId(Long orderItemId); + + /** + * 根据订单项id获取订单项详情 + * @param orderItemId + * @return + */ + ServerResponseEntity getByOrderItemId(Long orderItemId); + + /** + * 根据订单项id列表获取订单项国际化信息列表 + * @param orderItemIds + * @return + */ + ServerResponseEntity> listOrderItemLangByIds(List orderItemIds); + + /** + * 根据订单项id列表获取订单项信息 + * @param orderItemIds + * @param lang + * @return + */ + ServerResponseEntity> getListByOrderItemId(List orderItemIds, Integer lang); +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderFeignClient.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderFeignClient.java new file mode 100644 index 0000000..3f75525 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderFeignClient.java @@ -0,0 +1,548 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.feign; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.api.order.bo.UserScoreLogOrderBO; +import com.tmerclub.cloud.api.order.dto.CustomerRetainedDTO; +import com.tmerclub.cloud.api.order.dto.FlowOrderItemDTO; +import com.tmerclub.cloud.api.order.dto.FormExcelDTO; +import com.tmerclub.cloud.api.order.dto.QueryOrderDTO; +import com.tmerclub.cloud.api.order.vo.*; +import com.tmerclub.cloud.api.user.bo.UserOrderStatisticBO; +import com.tmerclub.cloud.api.user.bo.UserOrderStatisticListBO; +import com.tmerclub.cloud.api.user.dto.MemberReqDTO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.bo.OrderIdWithRefundIdBO; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.dto.OrderVirtualInfoDTO; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface OrderFeignClient { + + + /** + * 如果订单没有被取消的话,获取订单金额,否之会获取失败 + * + * @param orderIds 订单id列表 + * @param userId + * @return 订单金额 + */ + ServerResponseEntity getOrdersAmountAndIfNoCancel(List orderIds, Long userId); + + /** + * 支付尾款判断,如果订单没有被取消的话且未支付尾款,获取订单金额,否之会获取失败 + * + * @param orderIds 订单id列表 + * @return 订单金额 + */ + ServerResponseEntity getOrdersAmountAndCheckOrderStatus(List orderIds); + + /** + * 获取订单状态,如果订单状态不存在,则说明订单没有创建 + * + * @param orderIds 订单id列表 + * @return 订单状态 + */ + ServerResponseEntity> getOrdersStatus(List orderIds); + + /** + * 获取订单中的金额信息,不包含退款 + * + * @param orderIds 订单id列表 + * @return 订单中的金额信息 + */ + ServerResponseEntity> getOrdersSimpleAmountInfo(List orderIds); + + + /** + * 获取订单需要保存到es中的数据 + * + * @param orderId 订单id + * @return + */ + ServerResponseEntity getEsOrder(Long orderId); + + + /** + * 提交订单 + * + * @param mergerOrder 确认订单的订单信息 + * @return 订单号 + */ + void submit(ShopCartOrderMergerVO mergerOrder); + + /** + * 会员管理部分获取用户相关的订单统计数据 + * @param queryOrderDTO + * @return 相关用户的订单中的信息 + */ + ServerResponseEntity> countOrderByUserIds(QueryOrderDTO queryOrderDTO); + + /** + * 获取各种状态的订单数量 + * + * @param userId 用户id + * @return + */ + ServerResponseEntity countOrderByUserId(Long userId); + + /** + * 付款用户列表 + * + * @param orderSearchDTO 条件参数 + * @return 用户id列表 + */ + ServerResponseEntity> getOrderUserIdsBySearchDTO(OrderSearchDTO orderSearchDTO); + + /** + * 获取在一定时间内消费一定次数的会员信息 + * + * @param isPayed 是否已支付 + * @param deleteStatus 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除 + * @param startDate 开始时间 + * @param endDate 结束时间 + * @param status 状态 + * @param minNum 最小数量 + * @param maxNum 最大数量 + * @return 会员id + */ + ServerResponseEntity> listUserIdByPurchaseNum(Integer isPayed, + Integer deleteStatus, + Date startDate, + Date endDate, + Integer status, + Long minNum, + Long maxNum); + + /** + * 获取在一定时间内消费一定金额的会员信息 + * + * @param isPayed 是否已支付 + * @param deleteStatus 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除 + * @param startDate 开始时间 + * @param endDate 结束时间 + * @param status 状态 + * @param minAmount 最小支付金额 + * @param maxAmount 最大支付金额 + * @return 会员id + */ + ServerResponseEntity> listUserIdByAverageActualTotal(Integer isPayed, + Integer deleteStatus, + Date startDate, + Date endDate, + Integer status, + Long minAmount, + Long maxAmount); + + /** + * 根据参数获取数据分析中的订单信息 + * + * @param spuIds 产品id列表 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 商品效果分析数据 + */ + ServerResponseEntity> getProdEffectByDateAndProdIds(List spuIds, + Long startTime, + Long endTime); + + + /** + * 获取用户的成交留存率 + * + * @param customerRetainedDTO 条件查询参数 + * @return 成交留存信息列表 + */ + ServerResponseEntity> getTradeRetained(CustomerRetainedDTO customerRetainedDTO); + + /** + * 根据订单id列表, 获取订单流量信息列表 + * + * @param orderIds 订单id列表 + * @return 订单流量信息列表 + */ + ServerResponseEntity> listFlowOrderByOrderIds(Collection orderIds); + + /** + * 会员支付信息 + * + * @param param 筛选参数 + * @return 会员支付信息 + */ + ServerResponseEntity getPaidMemberByParam(MemberReqDTO param); + + /** + * 获取新老会员成交数据 + * + * @param param 筛选参数 + * @return 新老会员成交数据 + */ + ServerResponseEntity getMemberPayData(MemberReqDTO param); + + /** + * 刷新交易留存缓存 + * + * @param customerRetainedDTO 条件查询 + * @return + */ + ServerResponseEntity removeCacheTradeRetained(CustomerRetainedDTO customerRetainedDTO); + + /** + * 批量更新订单明细的获得积分 + * + * @param orderItemVOList 订单明细 + */ + void updateOrderItemBatchById(List orderItemVOList); + + /** + * 获取es订单数据列表 + * + * @param orderId 订单id + * @return 订单信息 + */ + EsOrderBO getEsOrderInfo(Long orderId); + + /** + * 获取订单详情 + * + * @param orderId 订单id + * @return 订单详情 + */ + ServerResponseEntity getOrderDetailInfo(Long orderId); + + /** + * 获取正常状态的订单数量 + * + * @param orderIds 订单ids + * @return 订单详情 + */ + ServerResponseEntity countNormalOrderByOrderIds(List orderIds); + + + /** + * 根据用户id列表获取积累消费金额和积累消费笔数 + * + * @param userIds 用户id列表 + * @return + */ + ServerResponseEntity> listSumDataByUserIds(List userIds); + + /** + * 获取用户购买过的商品数量 + * + * @param spuId 商品id + * @param userId 分销员userId + * @return + */ + ServerResponseEntity hasBuySuccessProd(Long spuId, Long userId); + + /** + * 统计用户购物数据 + * + * @param userId 用户id + * @return 用户购物数据 + */ + ServerResponseEntity calculateUserInShopData(Long userId); + + /** + * 计算订单项当中含有的分销金额 + * + * @param orderItems 订单项列表 + * @return 分销金额 + */ + ServerResponseEntity sumTotalDistributionAmountByOrderItem(List orderItems); + + /** + * 获取指定的订单项 + * + * @param orderIds 订单号集合 + * @return 订单项列表 + */ + ServerResponseEntity> listOrderItemByOrderIds(List orderIds); + + /** + * 获取商品洞察的商品id + * + * @param begin + * @param size + * @param shopId + * @param startTime + * @param endTime + * @return + */ + ServerResponseEntity> getInsightSpuIdsByDate(Integer begin, + Integer size, + Long shopId, + Long startTime, + Long endTime); + + /** + * 获取积分订单详情 + * + * @param orderIds 订单id + * @return 订单详情 + */ + ServerResponseEntity> getUserScoreLogDetail(List orderIds); + + /** + * 订单结算 + * + * @param orderIds 订单id列表 + * @return + */ + ServerResponseEntity settledOrder(List orderIds); + + /** + * 订单确认收货 + * + * @param orderIds 订单id列表 + * @return + */ + ServerResponseEntity confirmOrder(List orderIds); + + /** + * 获取活动订单的支付信息 + * + * @param orderId 订单id + * @return + */ + ServerResponseEntity getActivityOrderInfo(Long orderId); + + /** + * 获取用户活动订单的商品购买数量 + * + * @param activityId 活动id + * @param activityType 活动类型 + * @param spuId 商品id + * @param userId 用户id + * @return + */ + ServerResponseEntity getUserBuyNumByActivityId(Long activityId, Integer activityType, Long spuId, Long userId); + + /** + * 获取活动销售的商品数量 + * + * @param orderIds 订单id列表 + * @param activityType + * @return + */ + List getActivitySalesQuantity(List orderIds, Integer activityType); + + /** + * 根据订单id获取对应用户 + * + * @param orderIds + * @return + */ + ServerResponseEntity> getUserByOrderIdList(List orderIds); + + /** + * 统计活动订单的销量 + * + * @param activityId + * @param activityType + * @return + */ + ServerResponseEntity countActivityOrderSale(Long activityId, Integer activityType); + + + /** + * 统计活动sku的销量 + * + * @param skuId + * @param activityId + * @param activityType + * @return + */ + ServerResponseEntity countActivitySkuSale(Long skuId, Long activityId, Integer activityType); + + /** + * 查询指定的订单及订单项列表(从mysql中查询订单列表) + * 由于目前进行了分库分表,所以使用该方法时要注意分表的问题,尽量保证查询的订单都是属于同一个用户的,避免多表查询 + * 如果是多个用户的订单查询,且不涉及下单、结算和退款流程时,不要使用该方法,请使用es进行查询 + * + * @param orderIds + * @return + */ + ServerResponseEntity> listOrderAndOrderItemByOrderIds(List orderIds); + + /** + * 查询财务对账信息,使用mongodb,当有店铺名称查询需要时 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param shopName 店铺名称 + * @param shopId + * @return 财务对账信息 + */ + ServerResponseEntity getAccountOrderDetail(Date startTime, + Date endTime, + String shopName, + Long shopId); + + + /** + * 查询财务对账信息,使用mongodb,当有店铺名称查询需要时 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param shopName 店铺名称 + * @param pageNum + * @param pageSize + * @return 财务对账信息 + */ + ServerResponseEntity listShopAccountDetail(Date startTime, + Date endTime, + String shopName, + Integer pageSize, + Integer pageNum); + + + /** + * 查询财务对账信息,使用mongodb,当有店铺名称查询需要时 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param shopId 店铺id + * @param shopName + * @param pageNum + * @param pageSize + * @return 财务对账信息 + */ + ServerResponseEntity listOrderPayInfo(Date startTime, + Date endTime, + Long shopId, + String shopName, + Integer pageSize, + Integer pageNum); + + /** + * 获取时间范围内的销量排序,放入redis + * + * @param key + * @param shopId 店铺id + * @param time 时间范围内 + * @param expireTime + * @param esRenovationSpuSort + * @param primaryCategoryId + * @return + */ + ServerResponseEntity> getSoldNumRankByShopIdAndTime(String key, Long shopId, + Integer time, Integer expireTime, + Integer esRenovationSpuSort, + Long primaryCategoryId); + + /** + * 获取团购活动信息 + * + * @param groupActivityId + * @return + */ + ServerResponseEntity getGroupInfoById(Long groupActivityId); + + + /** + * 获取报表导出 + * + * @param formExcelParamVO + * @return + */ + List listFormExcelByParam(FormExcelParamVO formExcelParamVO); + + /** + * 付款用户列表 + * + * @param orderSearchDTO 条件参数 + * @return 用户id列表 + */ + ServerResponseEntity> getStationOrderBySeachDTO(OrderSearchDTO orderSearchDTO); + + /** + * 提货 + * + * @param orderIds + * @param stationId + * @return + */ + ServerResponseEntity orderStationByOrderId(List orderIds, Long stationId) throws LuckException; + + /** + * 获取自提点订单列表 + * + * @param orderDTO + * @return + */ + ServerResponseEntity> listStationOrder(OrderDTO orderDTO); + + /** + * 核销操作 + * + * @param orderVirtualInfoDTO + * @param orderId + * @param statinoId + * @return + */ + ServerResponseEntity orderWriteOffByOrderId(OrderVirtualInfoDTO orderVirtualInfoDTO, Long orderId, Long statinoId); + + /** + * 删除通联支付的缓存 + */ + void deleteAllinpayCache(); + + /** + * 订单结算 + * + * @param orderList 订单列表 + * @return + */ + ServerResponseEntity settledOrderByAllinpay(List orderList); + + /** + * 获取待采购订单和支付定金未支付尾款的订单Ids + * @param paySysType 支付类型 + * @return + */ + ServerResponseEntity> listWaitPurchaseAndUnPayBalanceOrderIds(Integer paySysType); + + /** + * 建议订单搜索数据 + * @param orderSearchDTO + * @return + */ + ServerResponseEntity checkOrderSearchInfo(OrderSearchDTO orderSearchDTO); + /** + * 批量获取指定的订单列表(数据必须在同一个表中) + * 注意: 使用该接口时,请确认订单都是属于同一个用户或者订单在同一表中, 如果涉及多个表的数据,请使用es查询 + * @param orderIds + * @return + */ + + List listOrderByOrderIds(List orderIds); + + /** + * 获取订单商品流量统计数据 + * @param flowOrderItemDTO 查询参数 + * @return 订单商品流量统计数据 + */ + List listFlowOrderItems(FlowOrderItemDTO flowOrderItemDTO); +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderInvoiceFeignClient.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderInvoiceFeignClient.java new file mode 100644 index 0000000..6a76ec4 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderInvoiceFeignClient.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.feign; + +import com.tmerclub.cloud.api.order.bo.EsOrderInvoiceBO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface OrderInvoiceFeignClient { + + /** + * 如果订单没有被取消的话,获取订单金额,否之会获取失败 + * + * @param orderInvoiceId 订单发票id + * @return 订单发票数据 + */ + ServerResponseEntity getEsOrderInvoice(Long orderInvoiceId); + + /** + * 根据订单id获取订单发票的es数据 + * @param orderId + * @return + */ + ServerResponseEntity> listEsOrderInvoiceByOrderId(Long orderId); +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderRefundFeignClient.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderRefundFeignClient.java new file mode 100644 index 0000000..7713054 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderRefundFeignClient.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.feign; + +import com.tmerclub.cloud.api.order.bo.EsOrderRefundBO; +import com.tmerclub.cloud.api.order.vo.*; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.Date; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface OrderRefundFeignClient { + + + /** + * 获取退款状态 + * + * @param refundId 退款id + * @return + */ + ServerResponseEntity getRefundStatus(Long refundId); + + /** + * 根据参数获取商品退款订单数据分析 + * + * @param spuIds 商品id列表 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 商品退款订单数据 + */ + ServerResponseEntity> getProdRefundEffectByDateAndProdIds(List spuIds, + Long startTime, + Long endTime); + + /** + * 通过订单id获取成功的退款订单 + * + * @param orderId 订单id + * @param returnMoneySts 退款状态 + * @return 成功的退款订单 + */ + ServerResponseEntity> getOrderRefundByOrderIdAndRefundStatus(Long orderId, Integer returnMoneySts); + + /** + * 根据退款单号列表获取退款订单列表 + * + * @param refundIds + * @return + */ + ServerResponseEntity> listOrderIdsByRefundIds(List refundIds); + + /** + * 根据订单单号列表获取退款订单列表 + * + * @param refundIds + * @return + */ + ServerResponseEntity> listOrderRefundByOrderIds(List refundIds); + + /** + * 通过退款编号id获取退款订单 + * + * @param refundId 退款id + * @return 成功的退款订单 + */ + ServerResponseEntity getOrderRefundByRefundId(Long refundId); + + /** + * 获取mongodb中存储的指定退款信息 + * + * @param refundId 退款id + * @return 成功的退款订单 + */ + ServerResponseEntity saveMongoAndGetEsOrderRefundInfo(Long refundId); + + /** + * 查询财务对账信息,使用mongodb,当有店铺名称查询需要时 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param shopName 店铺名称 + * @param shopId + * @return 财务对账信息 + */ + ServerResponseEntity getAccountOrderDetail(Date startTime, + Date endTime, + String shopName, + Long shopId); + + /** + * 查询财务对账信息,使用mongodb,当有店铺名称查询需要时 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param shopName 店铺名称 + * @param pageNum + * @param pageSize + * @return 财务对账信息 + */ + ServerResponseEntity listShopAccountDetail(Date startTime, + Date endTime, + String shopName, + Integer pageSize, + Integer pageNum); + + /** + * 查询财务对账信息,使用mongodb,当有店铺名称查询需要时 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param shopId 店铺id + * @param shopName + * @param pageNum + * @param pageSize + * @return 财务对账信息 + */ + ServerResponseEntity listOrderRefundInfo(Date startTime, + Date endTime, + Long shopId, + String shopName, + Integer pageSize, + Integer pageNum); + + /** + * 执行退款请求 + * + * @param extendInfo + */ + void doRefund(String extendInfo); +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderSelfStationFeignClient.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderSelfStationFeignClient.java new file mode 100644 index 0000000..d3d1a11 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderSelfStationFeignClient.java @@ -0,0 +1,29 @@ +package com.tmerclub.cloud.api.order.feign; + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.OrderSelfStationVO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; +/** + * @author lanhai + */ +public interface OrderSelfStationFeignClient { + + /** + * 根据提货码查询订单 + * @param stationId 退款id + * @param code 自提码 + * @return + */ + ServerResponseEntity getOrderByStationCode(Long stationId, String code) throws LuckException; + + /** + * 获取用户常用的自提信息 + * @param userId 用户id + * @return 用户自提订单信息 + */ + ServerResponseEntity> getUserStation(Long userId); + +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/PurchaseOrderFeignClient.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/PurchaseOrderFeignClient.java new file mode 100644 index 0000000..0f29a77 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/PurchaseOrderFeignClient.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.feign; + +import com.tmerclub.cloud.api.order.bo.EsPurchaseOrderBO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.Date; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface PurchaseOrderFeignClient { + + /** + * 获取采购订单需要保存到es中的数据 + * @param purchaseOrderId 采购订单id + * @return + */ + ServerResponseEntity saveMongoAndGetEsInfo(Long purchaseOrderId); + + /** + * 更新采购订单的状态 + * @param purchaseOrderIds 采购订单id + * @param purchaseOrderStatus 采购订单状态 + * @return + */ + ServerResponseEntity updatePurchaseOrderStatus(List purchaseOrderIds, Integer purchaseOrderStatus); + + /** + * 获取需要更新库存的商品id列表 + * @param beginTime + * @param endTime + * @return + */ + ServerResponseEntity> listSpuIdOfStockChange(Date beginTime, Date endTime); + + /** + * 统计未完成的采购订单数 + * @param warehouseId 仓库id + * @return 未完成数 + */ + Long countUnFinish(Long warehouseId); +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/manager/ConfirmOrderManager.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/manager/ConfirmOrderManager.java new file mode 100644 index 0000000..9623c55 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/manager/ConfirmOrderManager.java @@ -0,0 +1,936 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.delivery.constant.StationStockStatus; +import com.tmerclub.cloud.api.delivery.feign.DeliveryFeignClient; +import com.tmerclub.cloud.api.delivery.feign.StationFeignClient; +import com.tmerclub.cloud.api.product.feign.WarehouseFeignClient; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.api.product.feign.SkuStockFeignClient; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.api.user.feign.UserAddrFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.OrderCacheNames; +import com.tmerclub.cloud.common.cache.util.CacheManagerUtil; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.DeliveryModeBO; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.dto.DvyTypeDTO; +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.product.constant.*; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.PriceUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 确认订单适配 + * @author FrozenWatermelon + * @date 2020/12/07 + */ +@Component +public class ConfirmOrderManager { + + private final Logger LOGGER = LoggerFactory.getLogger(ConfirmOrderManager.class); + + @Autowired + private CacheManagerUtil cacheManagerUtil; + + @DubboReference + private DeliveryFeignClient deliveryFeignClient; + + @DubboReference + private SkuStockFeignClient skuStockFeignClient; + + @DubboReference + private UserAddrFeignClient userAddrFeignClient; + + @DubboReference + private WarehouseFeignClient warehouseFeignClient; + + @DubboReference + private StationFeignClient stationFeignClient; + + /** + * 过滤物流不同的商品 + * @param dbShopCartItems 用户选择的商品项 + * @return 返回过滤掉的商品项item + */ + public List filterShopItemsByType(ShopCartOrderMergerVO shopCartOrderMerger, UserDeliveryInfoVO userDeliveryInfoVO, List dbShopCartItems) { + // 校验商品是否在配送范围, 用于下面的过滤物流 + this.checkAddr(dbShopCartItems, shopCartOrderMerger.getUserId(), userDeliveryInfoVO); + + Map dvyTypeMap = userDeliveryInfoVO.getDvyTypes().stream().collect(Collectors.toMap(DvyTypeDTO::getShopId, DvyTypeDTO::getDvyType)); + LOGGER.info("用户配送参数为:{}" , userDeliveryInfoVO); + List cartItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + List filterItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 不可配送的套餐id + Set comboIdList = new HashSet<>(Constant.INITIAL_CAPACITY); + for (ShopCartItemVO shopCartItem : dbShopCartItems) { + Integer dvyType = dvyTypeMap.get(shopCartItem.getShopId()); + if (dvyType == 3 || Objects.equals(shopCartItem.getMold(), 1)) { + shopCartItem.setPlatformShareReduce(0L); + cartItems.add(shopCartItem); + LOGGER.info("无需配送的商品,shopCartItem:{}", shopCartItem); + continue; + } + DeliveryModeBO deliveryModeVO = shopCartItem.getDeliveryModeBO(); + boolean hasShopDelivery = deliveryModeVO.getHasShopDelivery() != null && Objects.equals(dvyType, DeliveryType.DELIVERY.value()) && deliveryModeVO.getHasShopDelivery(); + boolean hasUserPickUp = deliveryModeVO.getHasUserPickUp() != null && Objects.equals(dvyType, DeliveryType.STATION.value()) && deliveryModeVO.getHasUserPickUp(); + boolean hasCityDelivery = deliveryModeVO.getHasCityDelivery() != null && Objects.equals(dvyType, DeliveryType.SAME_CITY.value()) && deliveryModeVO.getHasCityDelivery(); + if (hasShopDelivery || hasUserPickUp || hasCityDelivery) { + LOGGER.info("有配送方式的商品,shopCartItem:{}", shopCartItem); + // 设置平台分摊金额,为计算完商家之后计算平台优惠做准备 + shopCartItem.setPlatformShareReduce(0L); + //是否只有一个商品或者只有一个套餐主商品 同时配送方式为同城配送, 不限制用户的地址是否满足配送,避免前端页面显示错误,结算订单的时候会再次判断是否满足配送 + // 过滤出实物商品 + int realItemSize = dbShopCartItems.stream().filter(item -> !Objects.equals(item.getMold(),SpuMold.VIRTUAL.value()) && Objects.equals(item.getSpuType(), SpuType.NORMAL.value())).collect(Collectors.groupingBy(ShopCartItemVO::getSpuId)).size(); + boolean isOneAndSameCity = (dbShopCartItems.size() == 1 || realItemSize == 1) && Objects.equals(dvyType, DeliveryType.SAME_CITY.value()); + // 需要过滤的订单项 - 过滤掉非自提且不在配送范围内的商品,或选择自提但不支持自提的商品 + // 1. 不支持配送、配送类型为自提,但商品不支持自提、或者配送类型为同城,但商品不支持同城 + // 2. 配送类型为同城,且只有一件商品或者套餐的订单中没有实物商品 + boolean shouldFilter = (!shopCartItem.getIsDelivery() || (dvyType == 2 && !hasUserPickUp)) && !isOneAndSameCity; + if (shouldFilter) { + filterItems.add(shopCartItem); + LOGGER.info("过滤掉非自提且不在配送范围内的商品,或选择自提但不支持自提的商品,shopCartItem:{}", shopCartItem); + // 不可配送的商品是套餐商品 + if (Objects.nonNull(shopCartItem.getComboId())) { + comboIdList.add(shopCartItem.getComboId()); + LOGGER.info("过滤的商品是套餐商品,shopCartItem:{}", shopCartItem); + } + } else { + cartItems.add(shopCartItem); + LOGGER.info("不过滤的商品项,shopCartItem:{}", shopCartItem); + } + //判断赠品的配送方式是否满足当前店铺的配送方式 + filterGiveawayShopItems(shopCartItem, dvyType); + + } else { + LOGGER.info("不可配送的商品,shopCartItem:{}", shopCartItem); + filterItems.add(shopCartItem); + // 不可配送的商品是套餐商品 + if (Objects.nonNull(shopCartItem.getComboId())) { + LOGGER.info("不可配送的商品是套餐商品,shopCartItem:{}", shopCartItem); + comboIdList.add(shopCartItem.getComboId()); + } + } + } + // 套餐中有一个不可配送,整个套餐都不可配送 + Iterator shopCartItemIterator = cartItems.iterator(); + while (shopCartItemIterator.hasNext()) { + ShopCartItemVO cartItem = shopCartItemIterator.next(); + if (Objects.nonNull(cartItem.getComboId()) && comboIdList.contains(cartItem.getComboId())) { + filterItems.add(cartItem); + shopCartItemIterator.remove(); + } + } + LOGGER.info("过滤掉的商品项:{}", filterItems); + shopCartOrderMerger.setFilterShopItems(filterItems); + return cartItems; + } + + private static void filterGiveawayShopItems(ShopCartItemVO shopCartItem, Integer dvyType) { + if (CollUtil.isEmpty(shopCartItem.getGiveawayShopCartItemList())) { + return; + } + Iterator iterator = shopCartItem.getGiveawayShopCartItemList().iterator(); + while (iterator.hasNext()) { + ShopCartItemVO shopCartItemVO = iterator.next(); + // 虚拟商品不需要判断物流 + if (Objects.equals(shopCartItemVO.getMold(), SpuMold.VIRTUAL.value())) { + continue; + } + DeliveryModeBO deliveryModeVO = shopCartItem.getDeliveryModeBO(); + // 赠品的配送方式要满足店铺的配送类型 + boolean canDelivary = (Objects.equals(DeliveryType.DELIVERY.value(), dvyType) && BooleanUtil.isTrue(deliveryModeVO.getHasShopDelivery())) || + (Objects.equals(DeliveryType.STATION.value(), dvyType) && BooleanUtil.isTrue(deliveryModeVO.getHasUserPickUp())) || + (Objects.equals(DeliveryType.SAME_CITY.value(), dvyType) && BooleanUtil.isTrue(deliveryModeVO.getHasCityDelivery())); + // 不符合店铺配送类型的赠品,就不赠送了 + if (!canDelivary) { + iterator.remove(); + } + } + } + + /** + * 组合商品操作,并返回组合商品订单Map + * @param shopCartItems 用户选择的商品项 + * @return 返回过滤掉的商品项item + */ + public List handleComboShopItems(List shopCartItems) { + List comboShopCartItems = shopCartItems.stream().filter(shopCartItemVO -> Objects.equals(shopCartItemVO.getMold(), SpuMold.COMBO.value())).toList(); + if(CollectionUtil.isEmpty(comboShopCartItems)){ + return shopCartItems; + } + // 获取所有的非组合商品购物项item,并把组合商品的item放入新的商品项列表 + shopCartItems = shopCartItems.stream().filter(shopCartItemVO -> !Objects.equals(shopCartItemVO.getMold(), SpuMold.COMBO.value())).toList(); + List filterComboShopCartItems = new ArrayList<>(shopCartItems); + for (ShopCartItemVO comboShopCartItem : comboShopCartItems) { + filterComboShopCartItems.addAll(comboShopCartItem.getComboShopCartItems()); + } + return filterComboShopCartItems; + } + + /** + * 当算完一遍店铺的各种满减活动时,重算一遍订单金额 + */ + public void recalculateAmountWhenFinishingCalculateShop(ShopCartOrderMergerVO shopCartOrderMerger, List shopCarts, UserDeliveryInfoVO userDeliveryInfo) { + + Map shopIdWithShopTransFee = userDeliveryInfo.getShopIdWithShopTransFee(); + Map> supplierIdWithShopTransFeeMap = userDeliveryInfo.getSupplierIdWithShopTransFeeMap(); + shopCartOrderMerger.setSupplierIdWithShopTransFeeMap(supplierIdWithShopTransFeeMap); + shopCartOrderMerger.setPreSaleTransFeeMap(userDeliveryInfo.getPreSaleTransFeeMap()); + if (Objects.isNull(supplierIdWithShopTransFeeMap)) { + supplierIdWithShopTransFeeMap = new HashMap<>(0); + } + // 所有店铺的订单信息 + List shopCartOrders = new ArrayList<>(Constant.INITIAL_CAPACITY); + long actualTotal = 0; + long total = 0; + int totalCount = 0; + long allOrderReduce = 0; + long totalTransfee = 0; + long scoreTotal = 0L; + Map shopCityStatusMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (Objects.nonNull(userDeliveryInfo.getShopCityStatusVOS())) { + shopCityStatusMap = userDeliveryInfo.getShopCityStatusVOS().stream().collect(Collectors.toMap(ShopCityStatusVO::getShopId, ShopCityStatusVO::getShopCityStatus)); + } + Map shopStartDeliveryFees = new HashMap<>(Constant.INITIAL_CAPACITY); + if (Objects.nonNull(userDeliveryInfo.getShopStartDeliveryFees())) { + shopStartDeliveryFees = userDeliveryInfo.getShopStartDeliveryFees(); + } + // 所有店铺所有的商品item + for (ShopCartVO shopCart : shopCarts) { + // 每个店铺的订单信息 + ShopCartOrderVO shopCartOrder = getShopCartOrderVO(shopCartOrderMerger, shopCityStatusMap, shopStartDeliveryFees, shopCart); + total += shopCart.getTotal(); + totalCount += shopCart.getTotalCount(); + allOrderReduce += shopCart.getShopReduce(); + + // 积分订单使用积分 + if (Objects.equals(shopCartOrderMerger.getOrderType(), OrderType.SCORE)) { + shopCartOrder.setUseScore(shopCart.getScoreTotal()); + } + + // 如果某家店因为各种优惠活动满减,使得金额变为负数,则这家店最低应该支付一分钱,而里面最贵的那件商品,也是支付一分钱,优惠金额 = (商品金额 - 一分钱) + // 平台端的订单不使用优惠,不需要此判断 + if (shopCart.getActualTotal() < 1L && !Objects.equals(shopCart.getShopId(), Constant.PLATFORM_SHOP_ID)) { + shopCartOrder.setActualTotal(1L); + shopCartOrder.setShopReduce(shopCart.getTotal() - 1L); + + List shopCartShopCartItem = getShopShopCartItem(shopCart.getShopCartItemDiscounts()); + resetActualTotal(shopCartShopCartItem); + } + + //店铺优惠金额 = 优惠金额 + shopCartOrder.setShopReduce(shopCartOrder.getShopReduce()); + + // 计算总运费金额 + totalTransfee = calculateTransFee(shopIdWithShopTransFee, supplierIdWithShopTransFeeMap, totalTransfee, shopCart, shopCartOrder); + + handleShopReduce(shopCart, shopCartOrder); + actualTotal += shopCartOrder.getActualTotal(); + if (Objects.equals(shopCartOrderMerger.getOrderType(), OrderType.SCORE)) { + LOGGER.info("积分订单使用积分:{}", shopCart.getScoreTotal()); + shopCartOrder.setUseScore(shopCart.getScoreTotal()); + } else { + shopCartOrder.setUseScore(shopCartOrder.getUseScore()); + LOGGER.info("非积分订单使用积分:{}", shopCartOrder.getUseScore()); + } + shopCartOrder.setDiscountReduce(shopCart.getDiscountReduce()); + shopCartOrders.add(shopCartOrder); + scoreTotal += shopCart.getScoreTotal(); + } + + shopCartOrderMerger.setActualTotal(actualTotal); + shopCartOrderMerger.setTotal(total); + shopCartOrderMerger.setTotalCount(totalCount); + shopCartOrderMerger.setOrderReduce(allOrderReduce); + shopCartOrderMerger.setTotalTransfee(totalTransfee); + shopCartOrderMerger.setShopCartOrders(shopCartOrders); + shopCartOrderMerger.setUserAddr(userDeliveryInfo.getUserAddr()); + shopCartOrderMerger.setShopCityStatus(userDeliveryInfo.getShopCityStatus()); + if (Objects.equals(shopCartOrderMerger.getOrderType(), OrderType.SCORE)) { + shopCartOrderMerger.setUsableScore(scoreTotal); + } + } + + private static void handleShopReduce(ShopCartVO shopCart, ShopCartOrderVO shopCartOrder) { + // 店铺优惠券优惠金额 + shopCartOrder.setCouponReduce(shopCart.getCouponReduce()); + shopCartOrder.setShopCartItemDiscounts(shopCart.getShopCartItemDiscounts()); + shopCartOrder.setCoupons(shopCart.getCoupons()); + shopCartOrder.setTotal(shopCart.getTotal()); + shopCartOrder.setTotalCount(shopCart.getTotalCount()); + shopCartOrder.setShopComboAmount(shopCart.getShopComboAmount()); + } + + private static long calculateTransFee(Map shopIdWithShopTransFee, Map> supplierIdWithShopTransFeeMap, long totalTransfee, ShopCartVO shopCart, ShopCartOrderVO shopCartOrder) { + Set supplierIds = new HashSet<>(Constant.INITIAL_CAPACITY); + // 计算当前店铺的供应商发货商品运费 + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCart.getShopCartItemDiscounts()) { + Set ids = shopCartItemDiscount.getShopCartItems().stream().filter(shopCartItemVO -> Objects.equals(shopCartItemVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) + .map(ShopCartItemVO::getSupplierId).collect(Collectors.toSet()); + supplierIds.addAll(ids); + } + + // 店铺订单中有供应商运费,需要计算供应商商品的运费 + if (supplierIdWithShopTransFeeMap.containsKey(shopCart.getShopId())) { + Map shopSupplierIdWithShopTransFeeMap = supplierIdWithShopTransFeeMap.get(shopCart.getShopId()); + for (Long supplierId : supplierIds) { + if (!shopSupplierIdWithShopTransFeeMap.containsKey(supplierId)) { + continue; + } + ShopTransFeeVO supplierTransFeeVO = shopSupplierIdWithShopTransFeeMap.get(supplierId); + shopCartOrder.setActualTotal(shopCartOrder.getActualTotal() + supplierTransFeeVO.getTransfee()); + // 运费 + shopCartOrder.setTransfee(shopCartOrder.getTransfee() + supplierTransFeeVO.getTransfee()); + shopCartOrder.setFreeTransfee(shopCartOrder.getFreeTransfee() + supplierTransFeeVO.getFreeTransfee()); + totalTransfee += supplierTransFeeVO.getTransfee(); + } + } + + // 计算店铺运费 + if (CollectionUtil.isNotEmpty(shopIdWithShopTransFee) && shopIdWithShopTransFee.containsKey(shopCartOrder.getShopId())) { + ShopTransFeeVO shopTransFeeVO = shopIdWithShopTransFee.get(shopCartOrder.getShopId()); + + // 店铺的实付 = 购物车实付 + 运费 + shopCartOrder.setActualTotal(shopCartOrder.getActualTotal() + shopTransFeeVO.getTransfee()); + // 运费 + shopCartOrder.setTransfee(shopCartOrder.getTransfee() + shopTransFeeVO.getTransfee()); + shopCartOrder.setFreeTransfee(shopCartOrder.getFreeTransfee() + shopTransFeeVO.getFreeTransfee()); + totalTransfee += shopTransFeeVO.getTransfee(); + } + return totalTransfee; + } + + private static ShopCartOrderVO getShopCartOrderVO(ShopCartOrderMergerVO shopCartOrderMerger, Map shopCityStatusMap, Map shopStartDeliveryFees, ShopCartVO shopCart) { + ShopCartOrderVO shopCartOrder = new ShopCartOrderVO(); + shopCartOrder.setShopCityStatus(shopCityStatusMap.getOrDefault(shopCart.getShopId(), null)); + shopCartOrder.setOrderType(shopCartOrderMerger.getOrderType().value()); + shopCartOrder.setShopId(shopCart.getShopId()); + shopCartOrder.setShopName(shopCart.getShopName()); + shopCartOrder.setShopType(shopCart.getShopType()); + shopCartOrder.setShopReduce(shopCart.getShopReduce()); + shopCartOrder.setStartDeliveryFee(shopStartDeliveryFees.containsKey(shopCart.getShopId()) ? shopStartDeliveryFees.get(shopCart.getShopId()).doubleValue() : 0L); + shopCartOrder.setTransfee(0L); + shopCartOrder.setFreeTransfee(0L); + shopCartOrder.setActualTotal(shopCart.getActualTotal()); + return shopCartOrder; + } + + /** + * 结束平台优惠的计算之后,还要重算一遍金额 + */ + public void recalculateAmountWhenFinishingCalculatePlatform(ShopCartOrderMergerVO shopCartOrderMerger, UserDeliveryInfoVO userDeliveryInfo) { + Map shopIdWithShopTransFee = userDeliveryInfo.getShopIdWithShopTransFee(); + //所有订单实际金额 + long actualTotal = 0L; + //所有订单优惠金额 + long allOrderReduce = 0L; + // 总运费金额 + long totalTransfee = 0L; + // 运费减免金额 + long freeTransfee = 0L; + List shopCartOrders = shopCartOrderMerger.getShopCartOrders(); + List virtualRemarkList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + //订单实际金额 + long orderActualTotal = 0L; + //商家优惠金额 + long orderReduceAmount = 0L; + //商家优惠金额 + long orderPlatformAmount = 0L; + List shopCartShopCartItem = getShopShopCartItem(shopCartOrder.getShopCartItemDiscounts()); + for (ShopCartItemVO shopCartItem : shopCartShopCartItem) { + this.handleShopCartItem(shopCartItem, virtualRemarkList); + orderActualTotal += shopCartItem.getActualTotal(); + orderReduceAmount += shopCartItem.getShareReduce(); + orderPlatformAmount += shopCartItem.getPlatformShareReduce(); + } + // 如果是定金预售,优惠处理下定金和尾款 + if (Objects.equals(shopCartOrderMerger.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + this.handlePreSale(shopCartOrder, shopCartShopCartItem, shopCartOrderMerger); + } + // 如果是折扣特别小的情况下,导致实际金额为0是,改变最小支付金额为0.01元,并且优惠金额减去0.01(积分抵扣除外,积分能够完全抵扣) + // 此时的实际支付金额已经包含运费了 + boolean isMinPrice = shopCartOrder.getActualTotal() < 1 + && (shopCartOrder.getScoreReduce() == null || shopCartOrder.getScoreReduce() < 1L); + if(isMinPrice) { + // 重算订单项 + resetActualTotal(shopCartShopCartItem); + shopCartOrder.setActualTotal(1L); + shopCartOrder.setShopReduce(shopCartOrder.getTotal() - 1L); + } + if (shopCartOrder.getLevelFreeTransfee() != null && shopCartOrder.getLevelFreeTransfee() != 0L) { + // 店铺先说包邮,然后平台再说会员包邮,所以实际上平台的包邮剩下来的邮费 = shopCartOrder.getLevelFreeTransfee() - shopCartOrder.getTransfee() + Long transfee = shopCartOrder.getLevelFreeTransfee() - shopCartOrder.getTransfee(); + //放入平台优惠金额,如果用户等级免自营店运费也要放进去 + shopCartOrder.setPlatformAmount(shopCartOrder.getPlatformAmount() + transfee); + shopCartOrder.setActualTotal(orderActualTotal - transfee); + // 平台会员减免运费金额 + freeTransfee += shopCartOrder.getLevelFreeTransfee(); + } + actualTotal += shopCartOrder.getActualTotal(); + allOrderReduce += shopCartOrder.getShopReduce(); + totalTransfee += shopCartOrder.getTransfee(); +// // 店铺减免运费金额 +// freeTransfee += (Objects.isNull(shopCartOrder.getLevelFreeTransfee()) ? 0 : shopCartOrder.getFreeTransfee()); + } + shopCartOrderMerger.setActualTotal(actualTotal); + shopCartOrderMerger.setVirtualRemarkList(virtualRemarkList); + shopCartOrderMerger.setTotalTransfee(totalTransfee); + shopCartOrderMerger.setFreeTransfee(freeTransfee); + shopCartOrderMerger.setOrderReduce(allOrderReduce); + shopCartOrderMerger.setUserAddr(userDeliveryInfo.getUserAddr()); + shopCartOrderMerger.setShopCityStatus(userDeliveryInfo.getShopCityStatus()); + + + } + + private void handleShopCartItem(ShopCartItemVO shopCartItem, List virtualRemarkList) { + shopCartItem.setShareReduce(shopCartItem.getShareReduce() + shopCartItem.getPlatformShareReduce()); + shopCartItem.setActualTotal(shopCartItem.getTotalAmount() - shopCartItem.getShareReduce()); + // 确保字符串为数组格式类型后,再进行JSON转换,否则会报错 + String virtualRemarkStr = shopCartItem.getVirtualRemark(); + boolean isHandleVirtualRemark = StrUtil.isNotBlank(virtualRemarkStr) + && virtualRemarkStr.startsWith("[") + && virtualRemarkStr.endsWith("]"); + if (isHandleVirtualRemark) { + List virtualRemarks = JSON.parseArray(shopCartItem.getVirtualRemark(), VirtualRemarkVO.class); + virtualRemarks.forEach(virtualRemark -> virtualRemark.setSpuId(shopCartItem.getSpuId())); + shopCartItem.setVirtualRemarkList(virtualRemarks); + virtualRemarkList.addAll(shopCartItem.getVirtualRemarkList()); + } + } + + private void handlePreSale(ShopCartOrderVO shopCartOrder, List shopCartShopCartItem, ShopCartOrderMergerVO shopCartOrderMerger) { + // 定金预售只能买一个商品,直接处理这个商品 + ShopCartItemVO shopCartItemVO = shopCartShopCartItem.get(0); + // 实际定金 + if (shopCartItemVO.getShareReduce() > shopCartItemVO.getBalanceAmount()) { + long actualDepositAmount = shopCartItemVO.getShareReduce() - shopCartItemVO.getBalanceAmount(); + shopCartItemVO.setActualDepositAmount(Math.max(shopCartItemVO.getActualDepositAmount() - actualDepositAmount, 1L)); + } + // 实际尾款 = max(尾款 - 优惠,0) + shopCartItemVO.setActualBalanceAmount(Math.max(shopCartItemVO.getBalanceAmount() - shopCartItemVO.getShareReduce(), 0L)); + shopCartOrder.setShopReduce(shopCartOrder.getShopReduce() + shopCartItemVO.getDepositReduceAmount()); + shopCartOrderMerger.setTotalDepositReduceAmount(shopCartItemVO.getDepositReduceAmount()); + shopCartOrderMerger.setBalanceAmount(shopCartItemVO.getBalanceAmount()); + shopCartOrderMerger.setActualBalanceAmount(shopCartItemVO.getActualBalanceAmount()); + shopCartOrderMerger.setTotalDepositAmount(shopCartItemVO.getActualDepositAmount()); + } + + /** + * 重新计算金额,避免订单无法支付 + */ + private void resetActualTotal(List shopCartShopCartItem) { + Iterator iterator = shopCartShopCartItem.iterator(); + while (iterator.hasNext()) { + ShopCartItemVO shopCartItem = iterator.next(); + shopCartItem.setShareReduce(shopCartItem.getShareReduce() + shopCartItem.getPlatformShareReduce()); + shopCartItem.setActualTotal(shopCartItem.getTotalAmount() - shopCartItem.getShareReduce()); + if (iterator.hasNext()) { + shopCartItem.setActualTotal(0L); + shopCartItem.setShareReduce(shopCartItem.getTotalAmount()); + } else { + shopCartItem.setActualTotal(1L); + shopCartItem.setShareReduce(shopCartItem.getTotalAmount() - 1L); + } + } + } + + /** + * 获取店铺下的所有订单 + */ + private List getShopShopCartItem(List shopCartItemDiscounts) { + List shopCartShopCartItem = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + shopCartShopCartItem.addAll(shopCartItemDiscount.getShopCartItems()); + } + shopCartShopCartItem.sort(Comparator.comparingDouble(ShopCartItemVO::getTotalAmount)); + return shopCartShopCartItem; + } + + + /** + * 确认订单计算平台佣金 + * @param shopCartOrderMerger + */ + public void confirmPlatformCommission(ShopCartOrderMergerVO shopCartOrderMerger) { + for (ShopCartOrderVO shopCartOrder : shopCartOrderMerger.getShopCartOrders()) { + Long totalPlatformCommission = 0L; + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartOrder.getShopCartItemDiscounts()) { + for (ShopCartItemVO shopCartItem : shopCartItemDiscount.getShopCartItems()) { + if (Objects.equals(shopCartOrderMerger.getOrderType().value(), OrderType.SCORE.value())) { + // 分摊比例 + shopCartItem.setRate(0.0); + // 平台佣金 + shopCartItem.setPlatformCommission(0L); + shopCartItem.setSupplierRate(0.0); + shopCartItem.setPurchasePlatformCommission(0L); + continue; + } + // 平台佣金,如果是商家代销,供应商采购价的佣金也需要计算 + // 平台对商家的差价抽佣 = (商家定的销售价格 - 供应商价格)-(商家定的销售价格 - 供应商价格)* 平台抽佣百分比 + // 平台对商家的差价抽佣 = (用户实付金额 + 平台优惠金额 - 供应商金额) * 比例 + long shopAmount = shopCartItem.getActualTotal() + shopCartItem.getPlatformShareReduce() - shopCartItem.getTotalPurchaseAmount(); + shopAmount = Math.max(shopAmount, 0L); + // 平台佣金 + shopCartItem.setPlatformCommission(PriceUtil.divideByBankerRounding((long) ((shopAmount) * shopCartItem.getRate()), 100)); + // 供应商没有平台优惠,此时不用加上平台优惠进行计算 + // 平台对供应商的抽佣 = 供应商采购价 * 平台抽佣百分比 + shopCartItem.setPurchasePlatformCommission(PriceUtil.divideByBankerRounding((long) (shopCartItem.getTotalPurchaseAmount() * shopCartItem.getSupplierRate()), 100)); + totalPlatformCommission += shopCartItem.getPlatformCommission(); + } + } + shopCartOrder.setPlatformCommission(totalPlatformCommission); + } + } + + + public void cacheCalculatedInfo(Long userId, ShopCartOrderMergerVO shopCartOrderMerger) { + // 防止重复提交 + RedisUtil.STRING_REDIS_TEMPLATE.opsForValue().set(OrderCacheNames.ORDER_CONFIRM_UUID_KEY + CacheNames.UNION + userId, String.valueOf(userId)); + // 保存订单计算结果缓存,省得重新计算 并且 用户确认的订单金额与提交的一致 + cacheManagerUtil.putCache(OrderCacheNames.ORDER_CONFIRM_KEY, String.valueOf(userId), shopCartOrderMerger); + } + + + + public UserDeliveryInfoVO getUserDeliveryInfoVO(List shopCartItemsDb, Long userId, OrderDTO orderParam) { + UserDeliveryInfoVO userDeliveryInfoVO = new UserDeliveryInfoVO(); + userDeliveryInfoVO.setAddrId(orderParam.getAddrId()); + userDeliveryInfoVO.setDvyTypes(orderParam.getDvyTypes()); + userDeliveryInfoVO.setDeliveryTemplateIds(new ArrayList<>()); + + DvyTypeDTO dvyTypeDTO = orderParam.getDvyTypes().get(0); + + // 没有订单项或者是自提订单,处理完直接返回即可,不需要获取用户地址 + if (CollectionUtil.isEmpty(shopCartItemsDb) || Objects.equals(dvyTypeDTO.getDvyType(), DeliveryType.STATION.value())) { + // 自提订单,将自提相关的参数插入地址信息中 + if (Objects.equals(dvyTypeDTO.getDvyType(), DeliveryType.STATION.value())) { + userDeliveryInfoVO.setStationId(orderParam.getDvyTypes().get(0).getStationId()); + OrderSelfStationVO orderSelfStationVO = new OrderSelfStationVO(); + orderSelfStationVO.setLat(dvyTypeDTO.getLat()); + orderSelfStationVO.setLng(dvyTypeDTO.getLng()); + orderSelfStationVO.setStationId(userDeliveryInfoVO.getStationId()); + orderSelfStationVO.setStationStockStatus(StationStockStatus.HAS_STOCK.getStatus()); + userDeliveryInfoVO.setOrderSelfStation(orderSelfStationVO); + } + } + boolean activityProd = Objects.equals(shopCartItemsDb.get(0).getSpuType(), SpuType.GROUP.value()) || + Objects.equals(shopCartItemsDb.get(0).getSpuType(), SpuType.SECKILL.value()) || + Objects.equals(shopCartItemsDb.get(0).getSpuType(), SpuType.SCORE.value()); + + boolean getUserAddr = true; + Map dvyTypeMap = orderParam.getDvyTypes().stream().collect(Collectors.toMap(DvyTypeDTO::getShopId, DvyTypeDTO::getDvyType)); + Long addrId = orderParam.getAddrId(); + for (ShopCartItemVO shopCartItemVO : shopCartItemsDb) { + + List deliveryTemplateIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + Integer devType = dvyTypeMap.get(shopCartItemVO.getShopId()); + // 满足条件的不需要判断物流配送范围 1.活动商品 2.虚拟商品 3.无需物流 4.用户自提 + if(Objects.equals(shopCartItemVO.getMold(),SpuMold.COMBO.value())){ + // 可配送,添加模板id + if (!delivery(shopCartItemVO, devType)) { + deliveryTemplateIds.add(shopCartItemVO.getDeliveryTemplateId()); + }; + } + if (getUserAddr) { + // 获取用户地址信息 + ServerResponseEntity userAddrResponse; + if (addrId != 0) { + userAddrResponse = userAddrFeignClient.getUserAddrByAddrId(addrId); + } else { + userAddrResponse = userAddrFeignClient.getUserAddrByUserId(userId); + } + if (!userAddrResponse.isSuccess()) { + LOGGER.error("用户选择物流配送,获取用户地址信息失败,userAddrResponse:{}", userAddrResponse); + throw new LuckException("用户选择物流配送,获取用户地址信息失败"); + } + if (Objects.isNull(userDeliveryInfoVO.getUserAddr())) { + UserAddrVO userAddr = userAddrResponse.getData(); + if (userAddr == null) { + LOGGER.info("用户选择物流配送,获取用户地址信息为空"); + userDeliveryInfoVO.setTotalTransfee(0L); + userDeliveryInfoVO.setShopCityStatus(-1); + } + LOGGER.info("用户选择物流配送,查询的地址信息 -- userAddrResponse:{}", userAddrResponse); + userDeliveryInfoVO.setUserAddr(userAddr); + // 查过一次,下次遍历不用再查了 + getUserAddr = false; + } + } + + // 没有地址,或者是活动商品,不需要获取模板id + if (Objects.isNull(orderParam.getAddrId()) || activityProd) { + return userDeliveryInfoVO; + } + + if (!delivery(shopCartItemVO, devType) && Objects.equals(shopCartItemVO.getMold(), SpuMold.REAL.value())) { + deliveryTemplateIds.add(shopCartItemVO.getDeliveryTemplateId()); + }; + + if (Objects.nonNull(userDeliveryInfoVO.getUserAddr())) { + // 快递配送且用户地址也完整,添加商品运费模板到列表中 + userDeliveryInfoVO.getDeliveryTemplateIds().addAll(deliveryTemplateIds); + } + } + return userDeliveryInfoVO; + } + + private static boolean delivery(ShopCartItemVO shopCartItemVO, Integer devType) { + // 需要配送的条件: 1.实物商品 2.快递或者同城 + // 不是快递或者同城 + if (!Objects.equals(devType, DeliveryType.DELIVERY.value()) || !Objects.equals(devType, DeliveryType.SAME_CITY.value())) { + return true; + } + // 不是实物商品 + if (!Objects.equals(shopCartItemVO.getMold(), SpuMold.REAL.value())) { + return true; + } + return false; + } + + public UserDeliveryInfoVO checkAddr(List shopCartItemsDb, Long userId, UserDeliveryInfoVO userDeliveryInfoVO) { + Map transportMap; + if (MapUtil.isNotEmpty(userDeliveryInfoVO.getTransportMap())) { + transportMap = userDeliveryInfoVO.getTransportMap(); + } else { + transportMap = new HashMap<>(Constant.INITIAL_CAPACITY); + } + + Map dvyTypeMap = userDeliveryInfoVO.getDvyTypes().stream().collect(Collectors.toMap(DvyTypeDTO::getShopId, DvyTypeDTO::getDvyType)); + for (ShopCartItemVO shopCartItemVO : shopCartItemsDb) { + Integer devType = dvyTypeMap.get(shopCartItemVO.getShopId()); + // 满足条件的不需要判断物流配送范围 1.活动商品 2.虚拟商品 3.无需物流 4.用户自提 + boolean delivery = notDelivery(shopCartItemVO, devType); + //判断用户的默认地址是否在配送范围内 + if (delivery) { + LOGGER.info("活动商品或虚拟商品不校验地址"); + shopCartItemVO.setIsDelivery(true); + continue; + } + + Long addrId = userDeliveryInfoVO.getAddrId(); + if (shopCartItemVO.getDeliveryTemplateId() == null || Objects.isNull(userDeliveryInfoVO) || addrId == null) { + LOGGER.info("模板id或地址id为空,不校验"); + // 模板、地址id为空,不可以配送 + shopCartItemVO.setIsDelivery(false); + continue; + } + + UserAddrVO userAddr = userDeliveryInfoVO.getUserAddr(); + if (Objects.isNull(userAddr)) { + // 用户没有设置地址,先跳过处理 + shopCartItemVO.setIsDelivery(true); + continue; + } + // 固定运费或者包邮的商品不需要判断可配送区域 + if (shopCartItemVO.getDeliveryTemplateId() == 0 || shopCartItemVO.getDeliveryTemplateId() == -1) { + shopCartItemVO.setIsDelivery(true); + continue; + } + + // 判断用户地址是否在物流模板中的可配送区域 + TransportVO transportVO = transportMap.get(shopCartItemVO.getDeliveryTemplateId()); + + if (transportVO == null) { + // 这里分出来是因为秒杀、团购、积分订单获取物流是通过dubbo,普通订单不需要通过dubbo + // 秒杀、团购、积分商品才会进入这里,普通商品在执行getUserDeliveryInfoVO()后就获取物流集合 + transportVO = deliveryFeignClient.getTransportAndAllItemsById(shopCartItemVO.getDeliveryTemplateId()); + transportMap.put(shopCartItemVO.getDeliveryTemplateId(), transportVO); + } + + List transFees = transportVO.getTransFees(); + boolean isDelivery = false; + // 包邮代表可以配送 - 兼容旧运费模板 + if (Objects.equals(transportVO.getIsFreeFee(), 1)) { + isDelivery = true; + } else if (CollUtil.isNotEmpty(transFees)) { + for (TransfeeVO transFee : transFees) { + for (AreaVO areaVO : transFee.getCityList()) { + if (Objects.equals(areaVO.getAreaId(), userAddr.getAreaId())) { + isDelivery = true; + break; + } + } + } + } + shopCartItemVO.setIsDelivery(isDelivery); + } + return userDeliveryInfoVO; + } + + + + /** + * 插入快递配送的库存区域id + * @param userDeliveryInfoVO + * @param shopCarts + */ + public void handleShopCartStockPoint(UserDeliveryInfoVO userDeliveryInfoVO, List shopCarts, List shopCartItemsDb, Integer spuMold) { + Map dvyTypeMap = userDeliveryInfoVO.getDvyTypes().stream().collect(Collectors.toMap(DvyTypeDTO::getShopId, DvyTypeDTO::getDvyType)); + List shopCartItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ShopCartVO shopCart : shopCarts) { + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCart.getShopCartItemDiscounts()) { + for (ShopCartItemVO shopCartItem : shopCartItemDiscount.getShopCartItems()) { + shopCartItems.add(shopCartItem); + if (CollUtil.isNotEmpty(shopCartItem.getComboShopCartItems())) { + shopCartItems.addAll(shopCartItem.getComboShopCartItems()); + } + } + } + } + for (ShopCartItemVO shopCartItemVO : shopCartItemsDb) { + if (CollUtil.isEmpty(shopCartItemVO.getGiveawayShopCartItemList()) || !Objects.equals(shopCartItemVO.getMold(), SpuMold.COMBO.value())) { + continue; + } + shopCartItems.addAll(shopCartItemVO.getGiveawayShopCartItemList()); + } + Long areaId = null; + if (Objects.nonNull(userDeliveryInfoVO.getUserAddr())) { + areaId = userDeliveryInfoVO.getUserAddr().getAreaId(); + } + // 非虚拟商品,且用户未选择订单地址,等用户选择地址后再获取快递配送的仓库 + if (Objects.isNull(areaId) && !Objects.equals(spuMold, SpuMold.VIRTUAL.value())) { + return; + } + + Map giveawayStockMap = new HashMap<>(Constant.INITIAL_CAPACITY); + for (ShopCartItemVO shopCartItem : shopCartItems) { + if(Objects.equals(shopCartItem.getMold(),SpuMold.COMBO.value())) { + continue; + } + Long defaultPointId = shopCartItem.getStockPointList().get(0).getStockPointId(); + List warehouseList = shopCartItem.getWarehouseList(); + shopCartItem.setStockPointType(StockPointType.WAREHOUSE.getValue()); + // 设置默认仓库 + // 供应商发货的代销商品先不用处理 + Integer dvyType = dvyTypeMap.get(shopCartItem.getShopId()); + // 商品满足以下任意一项则使用默认仓库的库存:仅有默认仓库的sku、虚拟商品、同城配送、积分商品 + boolean defaultPoint = shopCartItem.getStockPointList().size() == 1 || + Objects.equals(shopCartItem.getMold(), SpuMold.VIRTUAL.value()) || + Objects.equals(shopCartItem.getSpuType(), SpuType.SCORE.value()) || + Objects.equals(dvyType, DeliveryType.SAME_CITY.value()); + if (defaultPoint) { + // 使用默认仓库id + shopCartItem.setStockPointId(defaultPointId); + continue; + } + + if (Objects.equals(dvyType, DeliveryType.STATION.value())) { + // 用户自提 - 判断是共享总部库存还是门店是独立销售库存 + // 默认是共享总部库存,也就是默认仓库id + Long stationId = defaultPointId; + for (StockPointSkuVO stockPointSkuVO : shopCartItem.getStockPointList()) { + // 门店是独立销售库存,则使用门店id + boolean useStationStock = Objects.equals(stockPointSkuVO.getStockPointId(), userDeliveryInfoVO.getStationId()) && + Objects.equals(stockPointSkuVO.getStockPointType(), 2) && + Objects.equals(stockPointSkuVO.getStockMode(), 2); + if (useStationStock) { + stationId = stockPointSkuVO.getStockPointId(); + // 仓库类型更改为门店 + shopCartItem.setStockPointType(StockPointType.STATION.getValue()); + break; + } + } + shopCartItem.setStockPointId(stationId); + continue; + } + + // 未设置库存区域id的订单项 + setStockPointId(warehouseList, shopCartItem, areaId); + + } + for (ShopCartItemVO shopCartItem : shopCartItems) { + // 加载完仓库id后,再校验是否为赠品 + if (CollUtil.isEmpty(shopCartItem.getGiveawayShopCartItemList())) { + continue; + } + for (ShopCartItemVO giveawayShopCartItem : shopCartItem.getGiveawayShopCartItemList()) { + // 赠品必须跟主商品一个仓库 + giveawayShopCartItem.setStockPointId(shopCartItem.getStockPointId()); + // 赠品需要判断库存,所以先收集赠品的库存信息 + String stockKey = giveawayShopCartItem.getSkuId() + Constant.UNDERLINE + giveawayShopCartItem.getStockPointId(); + if (giveawayStockMap.containsKey(stockKey)) { + continue; + } + SkuStockVO skuStockVO = new SkuStockVO(giveawayShopCartItem.getSkuId()); + skuStockVO.setStockPointId(giveawayShopCartItem.getStockPointId()); + giveawayStockMap.put(stockKey, skuStockVO); + } + } + shopCartItems.forEach(shopCartItemVO -> shopCartItemVO.setWarehouseList(null)); + // 校验赠品库存,并去除库存不足的赠品 + this.checkGiveawayStock(shopCartItems, shopCarts, shopCartItemsDb, giveawayStockMap); + } + private static void setStockPointId(List warehouseList, ShopCartItemVO shopCartItem, Long areaId) { + List stockPointList = shopCartItem.getStockPointList(); + Map warehouseMap = warehouseList.stream().collect(Collectors.toMap(WarehouseVO::getWarehouseId, Function.identity())); + for (StockPointSkuVO stockPointSkuVO : stockPointList) { + WarehouseVO warehouseVO = warehouseMap.get(stockPointSkuVO.getStockPointId()); + // 默认仓库不处理 + if (Objects.isNull(warehouseVO) || Objects.equals(warehouseVO.getType(), 0)) { + continue; + } + // 用户订单地址包含在仓库配送区域内,则使用区域库存id + if (warehouseVO.getAreaIds().contains(areaId)) { + shopCartItem.setStockPointId(warehouseVO.getWarehouseId()); + return; + } + + } + // 地址不满足区域仓库的配送范围,则使用默认的仓库 + if (Objects.isNull(shopCartItem.getStockPointId())) { + shopCartItem.setStockPointId(stockPointList.get(0).getStockPointId()); + } + } + + private void checkGiveawayStock(List shopCartItems, List shopCarts, List shopCartItemsDb, Map giveawayStockMap) { + // 没有赠品,不需要检验赠品库存 + if (giveawayStockMap.isEmpty()) { + return; + } + // 查询赠品的库存 + Map skuStockMap = skuStockFeignClient.listSkuStock(new ArrayList<>(giveawayStockMap.values())); + // 先扣除主商品的库存 + for (ShopCartItemVO shopCartItemVO : shopCartItems) { + // 这里是主商品的库存扣除,赠品先跳过不处理 + if (Objects.nonNull(shopCartItemVO.getGiveawayRefundPrice())) { + continue; + } + String stockKey = shopCartItemVO.getSkuId() + Constant.UNDERLINE + shopCartItemVO.getStockPointId(); + // 没有跟赠品相同的区域库存,就不用操作 + if (!skuStockMap.containsKey(stockKey)) { + continue; + } + SkuStockVO skuStockVO = skuStockMap.get(stockKey); + // sku库存先扣除主商品的购买数量 + skuStockVO.setStock(skuStockVO.getStock() - shopCartItemVO.getCount()); + // 小于等于0,都去除改sku的库存,库存为0就说明没有足够的数量给赠品 + if (skuStockVO.getStock() <= 0) { + skuStockMap.remove(stockKey); + } + } + // 扣完主商品的库存后,按顺序开始扣除赠品的库存 + + // 先扣除组合商品的赠品库存 + for (ShopCartItemVO shopCartItemVO : shopCartItemsDb) { + handleGiveaway(skuStockMap, shopCartItemVO); + } + // 再扣除普通商品 + for (ShopCartVO shopCart : shopCarts) { + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCart.getShopCartItemDiscounts()) { + for (ShopCartItemVO shopCartItemVO : shopCartItemDiscount.getShopCartItems()) { + handleGiveaway(skuStockMap, shopCartItemVO); + } + } + } + } + + private static void handleGiveaway(Map skuStockMap, ShopCartItemVO shopCartItemVO) { + // 没有赠品的购物车项,跳过处理 + if (CollUtil.isEmpty(shopCartItemVO.getGiveawayShopCartItemList())) { + return; + } + // 删除没有足够库存的赠品项 + shopCartItemVO.getGiveawayShopCartItemList().removeIf(giveawayShopCartItem -> { + String stockKey = giveawayShopCartItem.getSkuId() + Constant.UNDERLINE + giveawayShopCartItem.getStockPointId(); + // 没有跟赠品的区域库存,代表库存数量不足, 删除该赠品 + if (!skuStockMap.containsKey(stockKey)) { + return true; + } + SkuStockVO skuStockVO = skuStockMap.get(stockKey); + // 扣除赠品库存 + skuStockVO.setStock(skuStockVO.getStock() - shopCartItemVO.getCount()); + // sku库存数量不足,删除该赠品 + if (skuStockVO.getStock() <= 0) { + return true; + } + return false; + }); + } + + + private static boolean notDelivery(ShopCartItemVO shopCartItemVO, Integer devType) { + return Objects.equals(shopCartItemVO.getSpuType(), SpuType.ACTIVE.value()) || + Objects.equals(shopCartItemVO.getMold(), SpuMold.VIRTUAL.value()) || + Objects.equals(devType, DeliveryType.NOT_DELIVERY.value()) || + Objects.equals(devType, DeliveryType.STATION.value()); + } + + public void handleStationOrder(ShopCartOrderMergerVO shopCartOrderMerger, List shopCartItems, UserDeliveryInfoVO userDeliveryInfoVO) { + Map orderStationSpuMap = getStationOrderStockMap(shopCartItems, userDeliveryInfoVO); + if (MapUtil.isEmpty(orderStationSpuMap)) { + if (Objects.nonNull(userDeliveryInfoVO.getOrderSelfStation())) { + shopCartOrderMerger.setOrderSelfStation(userDeliveryInfoVO.getOrderSelfStation()); + } + return; + } + OrderSelfStationVO orderSelfStationVO = stationFeignClient.getOrderStation(userDeliveryInfoVO, new ArrayList<>(orderStationSpuMap.values())); + userDeliveryInfoVO.setStationId(orderSelfStationVO.getStationId()); + userDeliveryInfoVO.setOrderSelfStation(orderSelfStationVO); + shopCartOrderMerger.setOrderSelfStation(orderSelfStationVO); + if (Objects.nonNull(userDeliveryInfoVO.getStationId())) { + shopCartOrderMerger.setStationId(userDeliveryInfoVO.getStationId()); + } + } + + public Map getStationOrderStockMap(List shopCartItems, UserDeliveryInfoVO userDeliveryInfoVO) { + Integer dvyType = userDeliveryInfoVO.getDvyTypes().get(0).getDvyType(); + if (Objects.nonNull(userDeliveryInfoVO.getStationId()) || !Objects.equals(dvyType, DeliveryType.STATION.value())) { + return new HashMap<>(0); + } + + List shopCartItemList = new ArrayList<>(shopCartItems.size()); + shopCartItems.forEach(shopCartItemVO -> { + if (CollUtil.isNotEmpty(shopCartItemVO.getComboShopCartItems())) { + shopCartItemList.addAll(shopCartItemVO.getComboShopCartItems()); + } else { + shopCartItemList.add(shopCartItemVO); + } + }); + Map orderStationSpuMap = new HashMap<>(shopCartItemList.size()); + for (ShopCartItemVO shopCartItemVO : shopCartItemList) { + if (!orderStationSpuMap.containsKey(shopCartItemVO.getSkuId())) { + OrderStationSpuDTO orderStationSpuDTO = new OrderStationSpuDTO(); + orderStationSpuDTO.setSkuId(shopCartItemVO.getSkuId()); + orderStationSpuDTO.setCount(shopCartItemVO.getCount()); + orderStationSpuDTO.setSpuMold(shopCartItemVO.getMold()); + orderStationSpuMap.put(shopCartItemVO.getSkuId(), orderStationSpuDTO); + continue; + } + OrderStationSpuDTO orderStationSpuDTO = orderStationSpuMap.get(shopCartItemVO.getSkuId()); + orderStationSpuDTO.setCount(orderStationSpuDTO.getCount() + shopCartItemVO.getCount()); + } + return orderStationSpuMap; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/manager/SubmitOrderManager.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/manager/SubmitOrderManager.java new file mode 100644 index 0000000..af49b83 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/manager/SubmitOrderManager.java @@ -0,0 +1,971 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.coupon.dto.LockCouponDTO; +import com.tmerclub.cloud.api.coupon.feign.CouponOrderFeignClient; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.order.constant.ShopCityStatus; +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.api.product.feign.SkuStockChangeFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.user.dto.UserScoreLockDTO; +import com.tmerclub.cloud.api.user.feign.UserScoreLockFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.OrderCacheNames; +import com.tmerclub.cloud.common.cache.util.CacheManagerUtil; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.constant.ShopCartItemDiscountType; +import com.tmerclub.cloud.common.order.dto.*; +import com.tmerclub.cloud.common.order.util.OrderLangUtil; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.product.constant.ShopCartSpuActivityType; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + + +/** + * 提交订单适配 + * + * @author FrozenWatermelon + * @date 2020/12/07 + */ +@Component +public class SubmitOrderManager { + private static final Logger logger = LoggerFactory.getLogger(SubmitOrderManager.class); + + @Autowired + private CacheManagerUtil cacheManagerUtil; + + @DubboReference + private SkuStockChangeFeignClient skuStockChangeFeignClient; + + @DubboReference + private CouponOrderFeignClient couponOrderFeignClient; + + @DubboReference + private UserScoreLockFeignClient userScoreLockFeignClient; + + @DubboReference + private SpuFeignClient spuFeignClient; + + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + + public ServerResponseEntity checkSubmitInfo(SubmitOrderDTO submitOrderParam, Long userId) { + ShopCartOrderMergerVO mergerOrder = cacheManagerUtil.getCache(OrderCacheNames.ORDER_CONFIRM_KEY, String.valueOf(userId), ShopCartOrderMergerVO.class); + // 看看订单有没有过期 + if (mergerOrder == null) { + return ServerResponseEntity.showFailMsg("订单已过期,请重新提交"); + } + // 防止重复提交 + boolean cad = RedisUtil.cad(OrderCacheNames.ORDER_CONFIRM_UUID_KEY + CacheNames.UNION + userId, String.valueOf(userId)); + if (!cad) { + return ServerResponseEntity.fail(ResponseEnum.REPEAT_ORDER); + } + //获取套餐订单项 + List cartOrders = mergerOrder.getShopCartOrders(); + Map dvyMap = mergerOrder.getDvyTypes().stream().collect(Collectors.toMap(DvyTypeDTO::getShopId, DvyTypeDTO::getDvyType)); + for (ShopCartOrderVO cartOrder : cartOrders) { + if (Objects.equals(dvyMap.get(cartOrder.getShopId()), DeliveryType.SAME_CITY.value())) { + if (Objects.nonNull(cartOrder.getShopCityStatus()) && Objects.equals(cartOrder.getShopCityStatus(), ShopCityStatus.NO_CONFIG.value())) { + // 当前店铺未开启同城配送 + return ServerResponseEntity.showFailMsg("店铺" + cartOrder.getShopName() + "未开启同城配送"); + } + if (Objects.nonNull(cartOrder.getShopCityStatus()) && cartOrder.getShopCityStatus() < ShopCityStatus.USABLE.value()) { + // 超出商家配送距离或起送费不够 + return ServerResponseEntity.showFailMsg("超出商家" + cartOrder.getShopName() + "的配送距离或起送费不够"); + } + } + // 请选择自提点并填写完整的自提信息 + if (Objects.equals(dvyMap.get(cartOrder.getShopId()), DeliveryType.STATION.value()) + && Objects.isNull(mergerOrder.getStationId()) && Objects.isNull(submitOrderParam.getOrderSelfStationDto())) { + return ServerResponseEntity.showFailMsg("请选择自提点并填写完整的自提信息"); + } + List shopCartItemDiscounts = cartOrder.getShopCartItemDiscounts(); + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + // 超出配送距离 + for (ShopCartItemVO shopCartItem : shopCartItemDiscount.getShopCartItems()) { + if (!shopCartItem.getIsDelivery() && !Objects.equals(dvyMap.get(cartOrder.getShopId()), DeliveryType.STATION.value())) { + logger.info("商品不在配送范围且未选择自提"); + throw new LuckException(ResponseEnum.DELIVERY_OVER); + } + } + if (Objects.equals(shopCartItemDiscount.getType(), ShopCartItemDiscountType.COMBO.value())){ + logger.info("套餐商品"); + cartOrder.setHasComboOrder(true); + } + } + } + if (Objects.nonNull(mergerOrder.getUserHasScore()) && Objects.nonNull(mergerOrder.getUsableScore())) { + if (mergerOrder.getUserHasScore() < mergerOrder.getUsableScore()) { + throw new LuckException(ResponseEnum.NOT_SCORE); + } + } + // 检查下虚拟商品的所需留言是否填写完成 + if (CollectionUtil.isNotEmpty(submitOrderParam.getVirtualRemarkList())) { + List virtualRemarkList = submitOrderParam.getVirtualRemarkList(); + // 如果至少要输入一个备注信息,则不能为空 + if (isRequired(mergerOrder) && CollectionUtil.isEmpty(virtualRemarkList)) { + // 不能为空 + return ServerResponseEntity.showFailMsg("备注信息不能为空"); + } + for (VirtualRemarkDTO virtualRemarkVO : virtualRemarkList) { + if (!Objects.isNull(virtualRemarkVO.getRequired()) + && virtualRemarkVO.getRequired() + && StrUtil.isBlank(virtualRemarkVO.getValue())) { + // 不能为空 + return ServerResponseEntity.showFailMsg("备注信息不能为空"); + } + } + mergerOrder.setVirtualRemarkList(BeanUtil.mapAsList(virtualRemarkList, VirtualRemarkVO.class)); + } + // 处理一下团购订单和秒杀的供应商信息 + handleGroupAndSeckillOrderSupplier(mergerOrder); + //如果是套餐商品设置订单 + // 设置自提信息 + mergerOrder.setOrderSelfStation(BeanUtil.map(submitOrderParam.getOrderSelfStationDto(), OrderSelfStationVO.class)); + + // 订单拆单 + this.handleMergeOrder(submitOrderParam, userId, mergerOrder); + + List dvyList = mergerOrder.getDvyTypes().stream().map(DvyTypeDTO::getDvyType).toList(); + + // 快递和同城配送的地址信息 + if (dvyList.contains(DeliveryType.DELIVERY.value()) && Objects.isNull(mergerOrder.getUserAddr())) { + // 请填写收货地址 + throw new LuckException("请填写收货地址"); + } + return ServerResponseEntity.success(mergerOrder); + } + + private void handleMergeOrder(SubmitOrderDTO submitOrderParam, Long userId, ShopCartOrderMergerVO mergerOrder) { + List orderShopParams = submitOrderParam.getOrderShopParam(); + + List shopCartOrders = mergerOrder.getShopCartOrders(); + // 检查商品状态 +// this.checkSpuStatus(shopCartOrders); + List shopCoupons = getShopCoupons(submitOrderParam, mergerOrder, orderShopParams, shopCartOrders); + mergerOrder.setShopCoupons(shopCoupons); + // 需要拆分订单(订单类型为普通订单才需要拆单) + if (needSplitShopCartOrder(mergerOrder)) { + // 虚拟商品拆分订单 + splitShopCartOrderDtoByVirtual(mergerOrder, userId); + // 套餐商品拆单 + splitComboShopCartOrderDto(mergerOrder, userId); + // 根据供应商拆分订单 + splitShopCartOrderDto(mergerOrder, userId); + // 根据预售拆分订单 + splitShopCartOrderDtoByPreSale(mergerOrder, userId); + } + } + + private static boolean isRequired(ShopCartOrderMergerVO mergerOrder) { + boolean isRequired = false; + for (VirtualRemarkVO virtualRemarkVO : mergerOrder.getVirtualRemarkList()) { + if (!Objects.isNull(virtualRemarkVO.getIsRequired()) + && virtualRemarkVO.getIsRequired()) { + isRequired = true; + break; + } + } + return isRequired; + } + + + private static List getShopCoupons(SubmitOrderDTO submitOrderParam, ShopCartOrderMergerVO mergerOrder, List orderShopParams, List shopCartOrders) { + List shopCoupons = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 设置备注 + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + setRemark(orderShopParams, shopCartOrder); + if (CollUtil.isNotEmpty(shopCartOrder.getCoupons())) { + for (CouponOrderVO shopCoupon : shopCartOrder.getCoupons()) { + if (Objects.equals(Boolean.TRUE, shopCoupon.getChoose())) { + shopCoupons.add(shopCoupon); + } + } + } + } + setOrderInvoice(submitOrderParam, mergerOrder); + return shopCoupons; + } + + private static void setOrderInvoice(SubmitOrderDTO submitOrderParam, ShopCartOrderMergerVO mergerOrder) { + //设置发票 + List orderInvoiceList = submitOrderParam.getOrderInvoiceList(); + if (CollectionUtil.isNotEmpty(orderInvoiceList)) { + mergerOrder.setOrderInvoiceList(orderInvoiceList); + } + } + + private static void setRemark(List orderShopParams, ShopCartOrderVO shopCartOrder) { + for (OrderShopDTO orderShopParam : orderShopParams) { + if (Objects.equals(shopCartOrder.getShopId(), orderShopParam.getShopId())) { + shopCartOrder.setRemarks(orderShopParam.getRemarks()); + } + } + } + + /** + * 是否需要拆单 + * 1.套餐需要拆单 + * 2.供应商需要拆单 + * 3.不是定金预售商品,需要拆单 + * + * @param mergerOrder + * @return + */ + private boolean needSplitShopCartOrder(ShopCartOrderMergerVO mergerOrder) { + // 普通订单和团购才需要拆单 + if (Objects.equals(mergerOrder.getOrderType().value(), OrderType.SECKILL.value())) { + return Boolean.FALSE; + } + // 如果不是定金预售商品,需要拆分订单 + if (Objects.equals(mergerOrder.getPreSaleType(), PreSaleType.FULLPAY.value())) { + return Boolean.TRUE; + } + for (ShopCartOrderVO shopCartOrder : mergerOrder.getShopCartOrders()) { + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartOrder.getShopCartItemDiscounts()) { + // 套餐需要拆单 + if (Objects.equals(shopCartItemDiscount.getType(), ShopCartSpuActivityType.COMBO.value())) { + return Boolean.TRUE; + } + // 供应商需要拆单 + for (ShopCartItemVO shopCartItem : shopCartItemDiscount.getShopCartItems()) { + // 供应商商品且是供应商发货,需要拆单 + boolean supplierSplitShopCartOrder = Objects.nonNull(shopCartItem.getSupplierId()) && + !Objects.equals(shopCartItem.getSupplierId(), 0L) && + Objects.equals(shopCartItem.getSupplierDeliveryType(), 1); + if (supplierSplitShopCartOrder) { + return Boolean.TRUE; + } + // 判断下是否为预售商品,如果是预售商品就拆单 + if (Objects.isNull(shopCartItem.getPreSaleType()) || Objects.equals(shopCartItem.getPreSaleType(), -1)) { + return Boolean.TRUE; + } + // 判断下是否组合商品 + if (Objects.isNull(shopCartItem.getMold()) || Objects.equals(shopCartItem.getMold(), SpuMold.COMBO.value())) { + return Boolean.TRUE; + } + } + } + } + return Boolean.FALSE; + } + + + private void splitComboShopCartOrderDto(ShopCartOrderMergerVO mergerOrder, Long userId) { + List shopCartOrderList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Set needMainOrderIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (ShopCartOrderVO shopCartOrder : mergerOrder.getShopCartOrders()) { + Iterator shopCartIterator = shopCartOrder.getShopCartItemDiscounts().iterator(); + boolean recalculate = false; + int index = 0; + while (shopCartIterator.hasNext()) { + ShopCartItemDiscountVO shopCartItemDiscountDto = shopCartIterator.next(); + // 非套餐项不用处理 + if (!Objects.equals(shopCartItemDiscountDto.getType(), ShopCartSpuActivityType.COMBO.value())) { + continue; + } + shopCartItemDiscountDto.getChooseComboItemVo().setIndex(index); + index++; + // 如果套餐中没有虚拟商品,不用处理 + Iterator iterator = shopCartItemDiscountDto.getShopCartItems().iterator(); + boolean isSplit = false; + while (iterator.hasNext()) { + int size = shopCartItemDiscountDto.getShopCartItems().size(); + ShopCartItemVO shopCartItemDto = iterator.next(); + // 不是虚拟商品,不用处理 + if (Objects.isNull(shopCartItemDto.getMold()) || shopCartItemDto.getMold() != 1) { + continue; + } + if (mergerOrder.getSpuMold() == 0) { + logger.info("订单中有虚拟商品,需要拆单"); + mergerOrder.setSpuMold(1); + } + // 套餐中的虚拟商品,但只有一个订单项 + if (Objects.equals(size, 1)) { + continue; + } + ShopCartOrderVO shopCartOrderDto = new ShopCartOrderVO(); + shopCartOrderDto.setHasComboOrder(shopCartOrder.getHasComboOrder()); + // 拆分虚拟商品 + shopCartOrderDto.setShopId(shopCartOrder.getShopId()); + shopCartOrderDto.setShopName(shopCartOrder.getShopName()); + shopCartOrderDto.setRemarks(shopCartOrder.getRemarks()); + shopCartOrderDto.setShopCityStatus(shopCartOrder.getShopCityStatus()); + shopCartOrderDto.setStartDeliveryFee(shopCartOrder.getStartDeliveryFee()); + shopCartOrderDto.setIsRefund(shopCartOrder.getIsRefund()); + shopCartOrderDto.setOrderType(shopCartOrder.getOrderType()); + shopCartOrderDto.setShopCartItemDiscounts(new ArrayList<>(0)); + shopCartOrderDto.setActualTotal(shopCartOrderDto.getTotal()); + shopCartOrderDto.setSpuMold(1); + SpuVO spuVO = spuFeignClient.getDetailById(shopCartItemDto.getSpuId()).getData(); + shopCartOrderDto.setWriteOffMultipleCount(spuVO.getWriteOffMultipleCount()); + shopCartOrderDto.setWriteOffNum(spuVO.getWriteOffNum()); + shopCartOrderDto.setWriteOffStart(spuVO.getWriteOffStart()); + shopCartOrderDto.setWriteOffEnd(spuVO.getWriteOffEnd()); + ShopCartItemDiscountVO shopCartItemDiscount = new ShopCartItemDiscountVO(); + shopCartItemDiscount.setChooseComboItemVo(shopCartItemDiscountDto.getChooseComboItemVo()); + shopCartItemDiscount.setShopCartItems(Collections.singletonList(shopCartItemDto)); + shopCartOrderDto.getShopCartItemDiscounts().add(shopCartItemDiscount); + loadShopCartOrderDto(shopCartOrderDto); + shopCartOrderList.add(shopCartOrderDto); + // 移除该订单项 + iterator.remove(); + if (!isSplit) { + isSplit = true; + } + if (!recalculate) { + recalculate = true; + } + } + } + if (!recalculate) { + continue; + } + + loadShopCartOrderDto(shopCartOrder); + } + if (CollUtil.isNotEmpty(shopCartOrderList)) { + mergerOrder.getShopCartOrders().addAll(shopCartOrderList); + } + } + + + private static boolean isStation(ShopCartOrderMergerVO mergerOrder, Map dvyTypeMap, ShopCartOrderVO shopCartOrder) { + int dvyType = dvyTypeMap.get(shopCartOrder.getShopId()); + boolean station = false; + //判断是否是自提订单 + if (Objects.equals(dvyType, DeliveryType.STATION.value())) { + //自提订单的地址信息 + if (Objects.isNull(mergerOrder.getOrderSelfStation())) { + // 请填写自提信息 + throw new LuckException("请填写自提信息"); + } + Integer mold = shopCartOrder.getShopCartItemDiscounts().get(0).getShopCartItems().get(0).getMold(); + // 非虚拟商品才需要自提 + if (!Objects.equals(mold, SpuMold.VIRTUAL.value())) { + station = true; + } + } + return station; + } + + private void splitShopCartOrderDto(ShopCartOrderMergerVO mergerOrder, Long userId) { + List shopCartOrders = new ArrayList<>(Constant.INITIAL_CAPACITY); + List normalShopCartOrderList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map> supplierIdWithShopTransFeeMap = mergerOrder.getSupplierIdWithShopTransFeeMap(); + for (ShopCartOrderVO shopCartOrder : mergerOrder.getShopCartOrders()) { + // 注意一下等级免运费金额,因为一个店如果免运费,则肯定所以项都免运费了 + long levelFreeTransfee = Objects.isNull(shopCartOrder.getLevelFreeTransfee()) ? 0L : shopCartOrder.getLevelFreeTransfee(); + Iterator shopCartIterator = shopCartOrder.getShopCartItemDiscounts().iterator(); + long transFee = shopCartOrder.getTransfee(); + List normalShopCartItemList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map shopCartOrderMap = new HashMap<>(12); + while (shopCartIterator.hasNext()) { + ShopCartItemDiscountVO shopCartItemDiscountDto = shopCartIterator.next(); + Iterator iterator = shopCartItemDiscountDto.getShopCartItems().iterator(); + while (iterator.hasNext()) { + ShopCartItemVO shopCartItemDto = iterator.next(); + // 判断下是否为供应商商品,如果是商家代销供应商商品且为供应商发货才继续 + if (Objects.equals(shopCartItemDto.getSupplierId(), 0L) || !Objects.equals(shopCartItemDto.getSupplierDeliveryType(), 1)) { + // 普通的商品和商家仓库自己发货的放入同一个list + normalShopCartItemList.add(shopCartItemDto); + continue; + } + + ShopCartOrderVO shopCartOrderVO = new ShopCartOrderVO(); + shopCartOrderVO.setHasComboOrder(shopCartOrder.getHasComboOrder()); + // 拆分供应商商品 + if (shopCartOrderMap.containsKey(shopCartItemDto.getSupplierId())) { + shopCartOrderVO = shopCartOrderMap.get(shopCartItemDto.getSupplierId()); + ShopCartItemDiscountVO shopCartItemDiscount = new ShopCartItemDiscountVO(); + shopCartItemDiscount.setShopCartItems(Collections.singletonList(shopCartItemDto)); + shopCartOrderVO.getShopCartItemDiscounts().add(shopCartItemDiscount); + } else { + setShopCartOrderInfo(userId, shopCartOrder, shopCartItemDto, shopCartOrderVO); + shopCartOrderMap.put(shopCartItemDto.getSupplierId(), shopCartOrderVO); + } + // 移除该订单项 + iterator.remove(); + } + } + Map shopSupplierIdWithShopTransFeeMap = supplierIdWithShopTransFeeMap.get(shopCartOrder.getShopId()); + // 重新算一下供应商 + if (CollectionUtil.isNotEmpty(shopCartOrderMap)) { + for (Long supplierId : shopCartOrderMap.keySet()) { + // 供应商运费放进去 + ShopTransFeeVO shopTransFeeVO = shopSupplierIdWithShopTransFeeMap.get(supplierId); + // 店铺订单计算 + ShopCartOrderVO shopCartOrderVO = shopCartOrderMap.get(supplierId); + // 如果有等级免运费金额,则所有都免运费 + shopCartOrderVO.setTransfee(Objects.isNull(shopTransFeeVO) ? 0L : shopTransFeeVO.getTransfee()); + shopCartOrderVO.setLevelFreeTransfee(Math.min(levelFreeTransfee, shopCartOrderVO.getTransfee())); + this.loadShopCartOrderDto(shopCartOrderVO); + shopCartOrders.add(shopCartOrderVO); + transFee = transFee - shopCartOrderVO.getTransfee(); + } + } + // 普通商品和商家仓库发货的供应商商品做一个order + if (CollectionUtil.isNotEmpty(normalShopCartItemList)) { + ShopCartItemDiscountVO shopCartItemDiscount = new ShopCartItemDiscountVO(); + shopCartItemDiscount.setShopCartItems(normalShopCartItemList); + shopCartOrder.setTransfee(transFee); + shopCartOrder.setLevelFreeTransfee(Math.min(levelFreeTransfee, shopCartOrder.getTransfee())); + shopCartOrder.setShopCartItemDiscounts(Collections.singletonList(shopCartItemDiscount)); + this.loadShopCartOrderDto(shopCartOrder); + normalShopCartOrderList.add(shopCartOrder); + } + } + mergerOrder.setShopCartOrders(new ArrayList<>(Constant.INITIAL_CAPACITY)); + if (CollectionUtil.isNotEmpty(normalShopCartOrderList)) { + mergerOrder.setShopCartOrders(normalShopCartOrderList); + } + if (CollUtil.isNotEmpty(shopCartOrders)) { + mergerOrder.getShopCartOrders().addAll(shopCartOrders); + } + } + + private void setShopCartOrderInfo(Long userId, ShopCartOrderVO shopCartOrder, ShopCartItemVO shopCartItemDto, ShopCartOrderVO shopCartOrderVO) { + shopCartOrderVO.setOrderType(shopCartOrder.getOrderType()); + shopCartOrderVO.setShopId(shopCartOrder.getShopId()); + shopCartOrderVO.setShopName(shopCartOrder.getShopName()); + shopCartOrderVO.setRemarks(shopCartOrder.getRemarks()); + shopCartOrderVO.setSupplierId(shopCartOrder.getSupplierId()); + shopCartOrderVO.setSupplierDeliveryType(shopCartOrder.getSupplierDeliveryType()); + shopCartOrderVO.setShopCartItemDiscounts(new ArrayList<>(Constant.INITIAL_CAPACITY)); + ShopCartItemDiscountVO shopCartItemDiscount = new ShopCartItemDiscountVO(); + shopCartItemDiscount.setShopCartItems(Collections.singletonList(shopCartItemDto)); + shopCartOrderVO.getShopCartItemDiscounts().add(shopCartItemDiscount); + } + + private void splitShopCartOrderDtoByPreSale(ShopCartOrderMergerVO mergerOrder, Long userId) { + List shopCartOrders = new ArrayList<>(Constant.INITIAL_CAPACITY); + List normalShopCartOrderList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map preSaleTransFeeMap = mergerOrder.getPreSaleTransFeeMap(); + for (ShopCartOrderVO shopCartOrder : mergerOrder.getShopCartOrders()) { + // 注意一下等级免运费金额,因为一个店如果免运费,则肯定所以项都免运费了 + long levelFreeTransfee = Objects.isNull(shopCartOrder.getLevelFreeTransfee()) ? 0L : shopCartOrder.getLevelFreeTransfee(); + Iterator shopCartIterator = shopCartOrder.getShopCartItemDiscounts().iterator(); + long transFee = shopCartOrder.getTransfee(); + Map shopCartOrderMap = new HashMap<>(12); + List normalShopCartItemList = new ArrayList<>(Constant.INITIAL_CAPACITY); + while (shopCartIterator.hasNext()) { + ShopCartItemDiscountVO shopCartItemDiscountDto = shopCartIterator.next(); + Iterator iterator = shopCartItemDiscountDto.getShopCartItems().iterator(); + while (iterator.hasNext()) { + ShopCartItemVO shopCartItemDto = iterator.next(); + // 判断下是否为预售商品,如果是预售商品就拆单 + if (Objects.isNull(shopCartItemDto.getPreSaleType()) || Objects.equals(shopCartItemDto.getPreSaleType(), -1)) { + // 普通的商品放入同一个list + normalShopCartItemList.add(shopCartItemDto); + continue; + } + + ShopCartOrderVO shopCartOrderVO = getPreSaleShopCartOrder(userId, shopCartOrder, shopCartItemDto); + shopCartOrderMap.put(shopCartItemDto.getSkuId(), shopCartOrderVO); + // 移除该订单项 + iterator.remove(); + } + } + // 重新算一下预售商品 + if (CollectionUtil.isNotEmpty(shopCartOrderMap)) { + for (Long skuId : shopCartOrderMap.keySet()) { + // 运费放进去 + ShopTransFeeVO shopTransFeeVO = preSaleTransFeeMap.get(skuId); + // 店铺订单计算 + ShopCartOrderVO shopCartOrderVO = shopCartOrderMap.get(skuId); + // 如果有等级免运费金额,则所有都免运费 + shopCartOrderVO.setTransfee(Objects.isNull(shopTransFeeVO) ? 0L : shopTransFeeVO.getTransfee()); + shopCartOrderVO.setLevelFreeTransfee(Math.min(levelFreeTransfee, shopCartOrderVO.getTransfee())); + shopCartOrderVO.setHasComboOrder(shopCartOrder.getHasComboOrder()); + loadShopCartOrderDto(shopCartOrderVO); + shopCartOrders.add(shopCartOrderVO); + transFee = transFee - shopCartOrderVO.getTransfee(); + } + } + // 普通商品和商家仓库发货的供应商商品做一个order + if (CollectionUtil.isNotEmpty(normalShopCartItemList)) { + ShopCartItemDiscountVO shopCartItemDiscount = new ShopCartItemDiscountVO(); + shopCartItemDiscount.setShopCartItems(normalShopCartItemList); + shopCartOrder.setShopCartItemDiscounts(Collections.singletonList(shopCartItemDiscount)); + shopCartOrder.setTransfee(transFee); + shopCartOrder.setLevelFreeTransfee(Math.min(levelFreeTransfee, shopCartOrder.getTransfee())); + loadShopCartOrderDto(shopCartOrder); + normalShopCartOrderList.add(shopCartOrder); + } + } + mergerOrder.setShopCartOrders(new ArrayList<>(Constant.INITIAL_CAPACITY)); + if (CollectionUtil.isNotEmpty(normalShopCartOrderList)) { + mergerOrder.setShopCartOrders(normalShopCartOrderList); + } + if (CollUtil.isNotEmpty(shopCartOrders)) { + mergerOrder.getShopCartOrders().addAll(shopCartOrders); + } + } + + private void splitShopCartOrderDtoByVirtual(ShopCartOrderMergerVO mergerOrder, Long userId) { + List shopCartOrders = new ArrayList<>(Constant.INITIAL_CAPACITY); + List normalShopCartOrderList = new ArrayList<>(Constant.INITIAL_CAPACITY); + OrderType orderType = mergerOrder.getOrderType(); + for (ShopCartOrderVO shopCartOrder : mergerOrder.getShopCartOrders()) { + // 注意一下等级免运费金额,因为一个店如果免运费,则肯定所以项都免运费了 + long levelFreeTransfee = Objects.isNull(shopCartOrder.getLevelFreeTransfee()) ? 0L : shopCartOrder.getLevelFreeTransfee(); + Iterator shopCartIterator = shopCartOrder.getShopCartItemDiscounts().iterator(); + long transFee = shopCartOrder.getTransfee(); + List virtualShopCartOrderList = new ArrayList<>(); + List normalShopCartItemList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Long mainOrderId = null; + int itemCount = shopCartOrder.getShopCartItemDiscounts().get(0).getShopCartItems().size(); + // 如果当前店铺的商品数量为1,则不需要拆单直接跳过 + if(itemCount == 1 && shopCartOrder.getShopCartItemDiscounts().size() == 1){ + continue; + } + while (shopCartIterator.hasNext()) { + ShopCartItemDiscountVO shopCartItemDiscountDto = shopCartIterator.next(); + Iterator iterator = shopCartItemDiscountDto.getShopCartItems().iterator(); + while (iterator.hasNext()) { + ShopCartItemVO shopCartItemDto = iterator.next(); + // 普通虚拟商品直接拆分即可 + if (Objects.equals(shopCartItemDto.getMold(), SpuMold.VIRTUAL.value())) { + ShopCartOrderVO shopCartOrderVO = getPreSaleShopCartOrder(userId, shopCartOrder, shopCartItemDto); + shopCartOrderVO.setMainOrderId(0L); + shopCartOrderVO.setSpuMold(1); + virtualShopCartOrderList.add(shopCartOrderVO); + // 移除该订单项 + iterator.remove(); + } + } + } + // 重新算一下商品 + if (CollectionUtil.isNotEmpty(virtualShopCartOrderList)) { + for (ShopCartOrderVO shopCartOrderVO : virtualShopCartOrderList) { + // 店铺订单计算 + // 能被拆分的都是虚拟商品,运费都为0 + shopCartOrderVO.setTransfee(0L); + shopCartOrderVO.setLevelFreeTransfee(0L); + shopCartOrderVO.setHasComboOrder(shopCartOrder.getHasComboOrder()); + shopCartOrderVO.setMainOrderId(Objects.isNull(shopCartOrderVO.getMainOrderId()) ? mainOrderId : shopCartOrder.getMainOrderId()); + loadShopCartOrderDto(shopCartOrderVO); + shopCartOrders.add(shopCartOrderVO); + } + } + shopCartOrder.setSpuMold(0); + loadShopCartOrderDto(shopCartOrder); + } + if (CollUtil.isNotEmpty(shopCartOrders)) { + mergerOrder.getShopCartOrders().addAll(shopCartOrders); + } + } + + + private ShopCartOrderVO getPreSaleShopCartOrder(Long userId, ShopCartOrderVO shopCartOrder, ShopCartItemVO shopCartItemDto) { + ShopCartOrderVO shopCartOrderVO = new ShopCartOrderVO(); + // 拆分预售商品 + shopCartOrderVO.setShopId(shopCartOrder.getShopId()); + shopCartOrderVO.setShopName(shopCartOrder.getShopName()); + shopCartOrderVO.setRemarks(shopCartOrder.getRemarks()); + shopCartOrderVO.setOrderType(shopCartOrder.getOrderType()); + shopCartOrderVO.setShopCartItemDiscounts(new ArrayList<>(Constant.INITIAL_CAPACITY)); + shopCartOrderVO.setSupplierId(shopCartOrder.getSupplierId()); + shopCartOrderVO.setSupplierDeliveryType(shopCartOrder.getSupplierDeliveryType()); + ShopCartItemDiscountVO shopCartItemDiscount = new ShopCartItemDiscountVO(); + shopCartItemDiscount.setShopCartItems(Collections.singletonList(shopCartItemDto)); + shopCartOrderVO.getShopCartItemDiscounts().add(shopCartItemDiscount); + return shopCartOrderVO; + } + + private void loadShopCartOrderDto(ShopCartOrderVO shopCartOrderVO) { + if (Objects.isNull(shopCartOrderVO.getLevelFreeTransfee())) { + shopCartOrderVO.setLevelFreeTransfee(0L); + } + if (Objects.isNull(shopCartOrderVO.getTransfee())) { + shopCartOrderVO.setTransfee(0L); + } + shopCartOrderVO.setUseScore(0L); + shopCartOrderVO.setActualTotal(shopCartOrderVO.getTransfee() - shopCartOrderVO.getLevelFreeTransfee()); + shopCartOrderVO.setTotal(0L); + shopCartOrderVO.setTotalCount(0); + shopCartOrderVO.setDiscountReduce(0L); + shopCartOrderVO.setCouponReduce(0L); + shopCartOrderVO.setPlatformCouponReduce(0L); + shopCartOrderVO.setScoreReduce(0L); + shopCartOrderVO.setPlatformAmount(shopCartOrderVO.getLevelFreeTransfee()); + shopCartOrderVO.setLevelReduce(0L); + shopCartOrderVO.setShopReduce(shopCartOrderVO.getPlatformAmount()); + shopCartOrderVO.setPlatformCommission(0L); + shopCartOrderVO.setTotalPurchasePlatformCommission(0L); + List shopCartItemDiscounts = shopCartOrderVO.getShopCartItemDiscounts(); + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + for (ShopCartItemVO cartItemDto : shopCartItemDiscount.getShopCartItems()) { + // 订单项的金额在生成订单时已经算好了,这里只需要相加即可,不需要别的处理 + shopCartOrderVO.setActualTotal(shopCartOrderVO.getActualTotal() + cartItemDto.getActualTotal()); + shopCartOrderVO.setTotal(shopCartOrderVO.getTotal() + cartItemDto.getTotalAmount()); + shopCartOrderVO.setTotalCount(shopCartOrderVO.getTotalCount() + cartItemDto.getCount()); + shopCartOrderVO.setShopReduce(shopCartOrderVO.getShopReduce() + cartItemDto.getShareReduce()); + /// comboAmount与shareReduce金额一样,导致套餐计算优惠翻倍 +// if (Objects.nonNull(cartItemDto.getComboAmount())) { +// //加上套餐优惠金额 +// shopCartOrderVO.setShopReduce(shopCartOrderVO.getShopReduce() + cartItemDto.getComboAmount()); +// } + cartItemDto.setPlatformCommission(Objects.isNull(cartItemDto.getPlatformCommission()) ? 0L : cartItemDto.getPlatformCommission()); + shopCartOrderVO.setPlatformCommission(shopCartOrderVO.getPlatformCommission() + cartItemDto.getPlatformCommission()); + shopCartOrderVO.setSupplierId(cartItemDto.getSupplierId()); + shopCartOrderVO.setSupplierDeliveryType(cartItemDto.getSupplierDeliveryType()); + shopCartOrderVO.setPreSaleType(cartItemDto.getPreSaleType()); + if (Objects.nonNull(cartItemDto.getPurchasePlatformCommission())) { + shopCartOrderVO.setTotalPurchasePlatformCommission(shopCartOrderVO.getTotalPurchasePlatformCommission() + cartItemDto.getPurchasePlatformCommission()); + } + if (Objects.nonNull(cartItemDto.getDiscountAmount())) { + shopCartOrderVO.setDiscountReduce(shopCartOrderVO.getDiscountReduce() + cartItemDto.getDiscountAmount()); + } + if (Objects.nonNull(cartItemDto.getShopCouponAmount())) { + shopCartOrderVO.setCouponReduce(shopCartOrderVO.getCouponReduce() + cartItemDto.getShopCouponAmount()); + } + if (Objects.nonNull(cartItemDto.getPlatformCouponAmount())) { + shopCartOrderVO.setPlatformCouponReduce(shopCartOrderVO.getPlatformCouponReduce() + cartItemDto.getPlatformCouponAmount()); + } + if (Objects.nonNull(cartItemDto.getScoreReduce())) { + shopCartOrderVO.setScoreReduce(shopCartOrderVO.getScoreReduce() + cartItemDto.getScoreReduce()); + } + if (Objects.nonNull(cartItemDto.getPlatformShareReduce())) { + shopCartOrderVO.setPlatformAmount(shopCartOrderVO.getPlatformAmount() + cartItemDto.getPlatformShareReduce()); + } + if (Objects.nonNull(cartItemDto.getLevelReduce())) { + shopCartOrderVO.setLevelReduce(shopCartOrderVO.getLevelReduce() + cartItemDto.getLevelReduce()); + } + if (Objects.nonNull(cartItemDto.getScorePrice())) { + shopCartOrderVO.setUseScore(shopCartOrderVO.getUseScore() + cartItemDto.getScorePrice()); + } + } + } + } + + public void tryLockStock(ShopCartOrderMergerVO mergerOrder) { + + Map stockBillLogItemMap = new HashMap<>(Constant.INITIAL_CAPACITY); + + for (ShopCartOrderVO shopCartOrder : mergerOrder.getShopCartOrders()) { + List shopCartItemDiscounts = shopCartOrder.getShopCartItemDiscounts(); + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + // 加载库存日志信息 + this.loadStockBillLogItem(stockBillLogItemMap, shopCartOrder, shopCartItemDiscount); + } + } + + // 库存日志列表 + List stockBillLogItems = new ArrayList<>(stockBillLogItemMap.values()); + + logger.info("tryLockStock stockBillLogItems:{}", stockBillLogItems); + // 锁定库存 + ServerResponseEntity lockStockResponse = skuStockChangeFeignClient.lock(stockBillLogItems); +// 提示具体哪个商品库存不足 + if (Objects.equals(ResponseEnum.NOT_STOCK.value(), lockStockResponse.getCode())) { + for (ShopCartOrderVO shopCartOrder : mergerOrder.getShopCartOrders()) { + List shopCartItemDiscounts = shopCartOrder.getShopCartItemDiscounts(); + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + List shopCartItems = shopCartItemDiscount.getShopCartItems(); + for (ShopCartItemVO orderItem : shopCartItems) { + boolean flag = Objects.nonNull(orderItem.getSupplierSkuId()) && Objects.equals(orderItem.getSupplierSkuId().toString(), + lockStockResponse.getData().toString()); + if(Objects.equals(orderItem.getMold(),SpuMold.COMBO.value())){ + for (ShopCartItemVO comboShopCartItem : orderItem.getComboShopCartItems()) { + if (Objects.equals(comboShopCartItem.getSkuId().toString(), lockStockResponse.getData().toString()) || flag) { + OrderLangUtil.shopCartItemLang(orderItem); + String skuName = Objects.isNull(orderItem.getSkuName()) ? "" : orderItem.getSkuName(); + throw new LuckException(orderItem.getSpuName() + " " + skuName + " 库存不足"); + } + } + continue; + } + if (Objects.equals(orderItem.getSkuId().toString(), lockStockResponse.getData().toString()) || flag) { + OrderLangUtil.shopCartItemLang(orderItem); + String skuName = Objects.isNull(orderItem.getSkuName()) ? "" : orderItem.getSkuName(); + throw new LuckException(orderItem.getSpuName() + " " + skuName + " 库存不足"); + } + + } + } + } + } + if (!lockStockResponse.isSuccess()) { + throw new LuckException(lockStockResponse); + } + } + + private void loadStockBillLogItem(Map stockBillLogItemMap, ShopCartOrderVO shopCartOrder, ShopCartItemDiscountVO shopCartItemDiscount) { + List shopCartItems = shopCartItemDiscount.getShopCartItems(); + for (ShopCartItemVO orderItem : shopCartItems) { + if(Objects.equals(orderItem.getMold(),SpuMold.COMBO.value())){ + for (ShopCartItemVO comboShopCartItem : orderItem.getComboShopCartItems()) { + handleSotckBillLog(stockBillLogItemMap, shopCartOrder, comboShopCartItem); + } + }else { + handleSotckBillLog(stockBillLogItemMap, shopCartOrder, orderItem); + } + + + //处理赠品订单项 + if (CollUtil.isEmpty(orderItem.getGiveawayShopCartItemList())) { + continue; + } + // 赠品库存计算 + for (ShopCartItemVO giveawayShopCartItem : orderItem.getGiveawayShopCartItemList()) { + + String giveawaySkuPointKey = giveawayShopCartItem.getSkuId() + Constant.UNDERLINE + giveawayShopCartItem.getStockPointId(); + StockBillLogItemDTO giveawayStockBillLogItem; + if (!stockBillLogItemMap.containsKey(giveawaySkuPointKey)) { + giveawayStockBillLogItem = new StockBillLogItemDTO( + giveawayShopCartItem.getSpuId(), + giveawayShopCartItem.getSkuId(), + giveawayShopCartItem.getShopId(), + shopCartOrder.getOrderId(), + giveawayShopCartItem.getSpuName(), + giveawayShopCartItem.getSkuName(), + 0, + giveawayShopCartItem.getSkuPriceFee(), + giveawayShopCartItem.getPartyCode(), + giveawayShopCartItem.getImgUrl() + ); + giveawayStockBillLogItem.setStockPointId(giveawayShopCartItem.getStockPointId()); + stockBillLogItemMap.put(giveawaySkuPointKey, giveawayStockBillLogItem); + } else { + giveawayStockBillLogItem = stockBillLogItemMap.get(giveawaySkuPointKey); + } + giveawayStockBillLogItem.setStockCount(giveawayStockBillLogItem.getStockCount() + giveawayShopCartItem.getCount()); + } + } + } + + private static void handleSotckBillLog(Map stockBillLogItemMap, ShopCartOrderVO shopCartOrder, ShopCartItemVO orderItem) { + String skuPointKey = orderItem.getSkuId() + Constant.UNDERLINE + orderItem.getStockPointId(); + StockBillLogItemDTO stockBillLogItem = stockBillLogItemMap.get(skuPointKey); + if (Objects.isNull(stockBillLogItem)) { + stockBillLogItem = new StockBillLogItemDTO( + orderItem.getSpuId(), + orderItem.getSkuId(), + shopCartOrder.getShopId(), + shopCartOrder.getOrderId(), + orderItem.getSpuName(), + orderItem.getSkuName(), + 0, + orderItem.getSkuPriceFee(), + orderItem.getPartyCode(), + orderItem.getImgUrl() + ); + stockBillLogItemMap.put(skuPointKey, stockBillLogItem); + } + stockBillLogItem.setStockPointId(orderItem.getStockPointId()); + stockBillLogItem.setStockPointType(orderItem.getStockPointType()); + stockBillLogItem.setStockCount(stockBillLogItem.getStockCount() + orderItem.getCount()); + stockBillLogItem.setSupplierId(orderItem.getSupplierId()); + stockBillLogItem.setSupplierDeliveryType(orderItem.getSupplierDeliveryType()); + + // 如果是供应商商品且发货方式为供应商发货,则将spuId和skuId替换成供应商商品的 + // 只替换id,商品名称图片等信息则保留商家的商品信息,库存记录是商家的库存记录 + if (!Objects.equals(orderItem.getSupplierId(), 0L) && Objects.equals(orderItem.getSupplierDeliveryType(), 1)) { + stockBillLogItem.setSpuId(orderItem.getSupplierSpuId()); + stockBillLogItem.setSkuId(orderItem.getSupplierSkuId()); + } + } + + public void tryLockCoupon(ShopCartOrderMergerVO mergerOrder) { + if (!Objects.equals(mergerOrder.getOrderType(), OrderType.ORDINARY)) { + logger.info("提交普通订单,锁定优惠券"); + return; + } + List lockCouponParams; + List orderIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 如果不为空表示拆分过订单 + if (CollectionUtil.isEmpty(mergerOrder.getShopCoupons())) { + List shopCartOrders = mergerOrder.getShopCartOrders(); + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + Long orderId = shopCartOrder.getOrderId(); + List coupons = shopCartOrder.getCoupons(); + if (CollectionUtil.isNotEmpty(coupons)) { + for (CouponOrderVO coupon : coupons) { + if (Objects.equals(Boolean.TRUE, coupon.getChoose())) { + coupon.setOrderId(orderId); + } + } + } + orderIds.add(orderId); + } + // 锁优惠券 + lockCouponParams = getLockCouponDto(mergerOrder, orderIds); + } else { + for (CouponOrderVO shopCoupon : mergerOrder.getShopCoupons()) { + orderIds.addAll(shopCoupon.getOrderIds()); + } + // 锁定优惠券 + // 平台优惠券 + lockCouponParams = new ArrayList<>(Constant.INITIAL_CAPACITY); + LockCouponDTO platformLockCouponParam = getLockCouponWhichSplit(mergerOrder.getCoupons()); + if (platformLockCouponParam != null) { + // 平台优惠券涉及多个订单,所以设置订单id为多个订单id以逗号分割 + platformLockCouponParam.setOrderIds(StrUtil.join(StrUtil.COMMA, orderIds)); + lockCouponParams.add(platformLockCouponParam); + } + // 店铺优惠券 + LockCouponDTO shopLockCouponParam = getLockCouponWhichSplit(mergerOrder.getShopCoupons()); + if (shopLockCouponParam != null) { + lockCouponParams.add(shopLockCouponParam); + } + } + if (CollectionUtil.isEmpty(lockCouponParams)) { + return; + } + ServerResponseEntity lockCouponResponse = couponOrderFeignClient.lockCoupon(lockCouponParams); + if (!lockCouponResponse.isSuccess()) { + throw new LuckException(lockCouponResponse.getMsg()); + } + } + + /** + * 尝试锁定优惠券 + * + * @param mergerOrder + * @param orderIds + */ + private List getLockCouponDto(ShopCartOrderMergerVO mergerOrder, List orderIds) { + // 锁定优惠券 + // 平台优惠券 + List lockCouponParams = new ArrayList<>(Constant.INITIAL_CAPACITY); + LockCouponDTO platformLockCouponParam = getLockCouponWhichSplit(mergerOrder.getCoupons()); + if (platformLockCouponParam != null) { + // 平台优惠券涉及多个订单,所以设置订单id为多个订单id以逗号分割 + platformLockCouponParam.setOrderIds(StrUtil.join(StrUtil.COMMA, orderIds)); + lockCouponParams.add(platformLockCouponParam); + } + // 店铺优惠券 + for (ShopCartOrderVO shopCartOrder : mergerOrder.getShopCartOrders()) { + LockCouponDTO shopLockCouponParam = getLockCouponWhichSplit(shopCartOrder.getCoupons()); + if (shopLockCouponParam != null) { + lockCouponParams.add(shopLockCouponParam); + } + } + + return lockCouponParams; + } + + private LockCouponDTO getLockCouponWhichSplit(List couponOrders) { + if (CollectionUtil.isEmpty(couponOrders)) { + return null; + } + for (CouponOrderVO couponOrder : couponOrders) { + if ((Objects.equals(Boolean.TRUE, couponOrder.getChoose())) && couponOrder.getCanUse()) { + LockCouponDTO param = new LockCouponDTO(); + if (Objects.nonNull(couponOrder.getOrderId())) { + param.setOrderIds(String.valueOf(couponOrder.getOrderId())); + } else { + param.setOrderIds(StrUtil.join(StrUtil.COMMA, couponOrder.getOrderIds())); + } + param.setCouponId(couponOrder.getCouponId()); + param.setCouponUserId(couponOrder.getCouponUserId()); + param.setReduceAmount(couponOrder.getReduceAmount()); + return param; + } + } + return null; + } + + public void tryLockScore(ShopCartOrderMergerVO mergerOrder) { + // 如果没有使用积分,就不用锁定积分啦 + if (Objects.isNull(mergerOrder.getUsableScore()) || Objects.equals(mergerOrder.getUsableScore(), 0L)) { + logger.info("没有使用积分,不用锁定积分"); + return; + } + List shopCartOrders = mergerOrder.getShopCartOrders(); + List userScoreLocks = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + if (Objects.equals(shopCartOrder.getUseScore(), 0L)) { + continue; + } + userScoreLocks.add(new UserScoreLockDTO(shopCartOrder.getOrderId(), shopCartOrder.getUseScore(), mergerOrder.getOrderType().value())); + } + + // 锁定积分 + ServerResponseEntity scoreResp = userScoreLockFeignClient.lock(userScoreLocks); + if (!scoreResp.isSuccess()) { + logger.info("锁定积分失败,失败原因:{}", scoreResp.getMsg()); + throw new LuckException(scoreResp.getMsg()); + } + + } +// +// private void checkSpuStatus(List shopCartOrders) { +// List spuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); +// for (ShopCartOrderVO shopCartOrder : shopCartOrders) { +// List shopCartItemDiscounts = shopCartOrder.getShopCartItemDiscounts(); +// for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { +// List shopCartItems = shopCartItemDiscount.getShopCartItems(); +// for (ShopCartItemVO orderItem : shopCartItems) { +// spuIds.add(orderItem.getSpuId()); +// } +// } +// } +// if (CollUtil.isNotEmpty(spuIds)) { +// ServerResponseEntity skuStatusResponseEntity = searchSpuFeignClient.checkSpuStatus(spuIds); +// if (Objects.equals(skuStatusResponseEntity.getCode(), ResponseEnum.SPU_STATUS_ERROR.value())) { +// for (ShopCartOrderVO shopCartOrder : shopCartOrders) { +// List shopCartItemDiscounts = shopCartOrder.getShopCartItemDiscounts(); +// for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { +// List shopCartItems = shopCartItemDiscount.getShopCartItems(); +// for (ShopCartItemVO orderItem : shopCartItems) { +// if (Objects.equals(orderItem.getSpuId().toString(), skuStatusResponseEntity.getData().toString())) { +// OrderLangUtil.shopCartItemLang(orderItem); +// String skuName = Objects.isNull(orderItem.getSkuName()) ? "" : orderItem.getSkuName(); +// throw new LuckException(orderItem.getSpuName() + " " + skuName + " 不在正常状态"); +// } +// } +// } +// } +// } +// if (!skuStatusResponseEntity.isSuccess()) { +// throw new LuckException(skuStatusResponseEntity); +// } +// } +// } + + private void handleGroupAndSeckillOrderSupplier(ShopCartOrderMergerVO mergerOrder){ + if (Objects.equals(mergerOrder.getOrderType().value(), OrderType.GROUP.value()) || + Objects.equals(mergerOrder.getOrderType().value(), OrderType.SECKILL.value())) { + logger.info("团购订单或秒杀订单,处理供应商信息"); + mergerOrder.getShopCartOrders().forEach(shopCartOrderVO -> { + shopCartOrderVO.getShopCartItemDiscounts().forEach(shopCartItemDiscountVO -> { + shopCartItemDiscountVO.getShopCartItems().forEach(shopCartItemVO -> { + shopCartOrderVO.setSupplierDeliveryType(shopCartItemVO.getSupplierDeliveryType()); + shopCartOrderVO.setSupplierId(shopCartItemVO.getSupplierId()); + }); + }); + }); + } + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/CustomerRetainVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/CustomerRetainVO.java new file mode 100644 index 0000000..81e4a9f --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/CustomerRetainVO.java @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + + +/** + * @author cl + * @date 2021-05-22 14:30:11 + */ +public class CustomerRetainVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "当前月") + private String currentMonth; + + @Schema(description = "成交月") + private String dealMonth; + + @Schema(description = "新访问/成交客户数") + private Integer newCustomers; + + @Schema(description = "第1月留存") + private Integer firstMonthRemain; + @Schema(description = "第1月留存率") + private BigDecimal firstMonthRemainRate; + + @Schema(description = "第2月留存") + private Integer secondMonthRemain; + @Schema(description = "第2月留存率") + private BigDecimal secondMonthRemainRate; + + @Schema(description = "第3月留存") + private Integer thirdMonthRemain; + @Schema(description = "第3月留存率") + private BigDecimal thirdMonthRemainRate; + + @Schema(description = "第4月留存") + private Integer fourthMonthRemain; + @Schema(description = "第4月留存率") + private BigDecimal fourthMonthRemainRate; + + @Schema(description = "第5月留存") + private Integer fifthMonthRemain; + @Schema(description = "第5月留存率") + private BigDecimal fifthMonthRemainRate; + + @Schema(description = "第6月留存") + private Integer sixthMonthRemain; + @Schema(description = "第6月留存率") + private BigDecimal sixthMonthRemainRate; + + + public String getCurrentMonth() { + return currentMonth; + } + + public void setCurrentMonth(String currentMonth) { + this.currentMonth = currentMonth; + } + + public Integer getNewCustomers() { + return newCustomers; + } + + public void setNewCustomers(Integer newCustomers) { + this.newCustomers = newCustomers; + } + + public Integer getFirstMonthRemain() { + return firstMonthRemain; + } + + public void setFirstMonthRemain(Integer firstMonthRemain) { + this.firstMonthRemain = firstMonthRemain; + } + + public BigDecimal getFirstMonthRemainRate() { + return firstMonthRemainRate; + } + + public void setFirstMonthRemainRate(BigDecimal firstMonthRemainRate) { + this.firstMonthRemainRate = firstMonthRemainRate; + } + + public Integer getSecondMonthRemain() { + return secondMonthRemain; + } + + public void setSecondMonthRemain(Integer secondMonthRemain) { + this.secondMonthRemain = secondMonthRemain; + } + + public BigDecimal getSecondMonthRemainRate() { + return secondMonthRemainRate; + } + + public void setSecondMonthRemainRate(BigDecimal secondMonthRemainRate) { + this.secondMonthRemainRate = secondMonthRemainRate; + } + + public Integer getThirdMonthRemain() { + return thirdMonthRemain; + } + + public void setThirdMonthRemain(Integer thirdMonthRemain) { + this.thirdMonthRemain = thirdMonthRemain; + } + + public BigDecimal getThirdMonthRemainRate() { + return thirdMonthRemainRate; + } + + public void setThirdMonthRemainRate(BigDecimal thirdMonthRemainRate) { + this.thirdMonthRemainRate = thirdMonthRemainRate; + } + + public Integer getFourthMonthRemain() { + return fourthMonthRemain; + } + + public void setFourthMonthRemain(Integer fourthMonthRemain) { + this.fourthMonthRemain = fourthMonthRemain; + } + + public BigDecimal getFourthMonthRemainRate() { + return fourthMonthRemainRate; + } + + public void setFourthMonthRemainRate(BigDecimal fourthMonthRemainRate) { + this.fourthMonthRemainRate = fourthMonthRemainRate; + } + + public Integer getFifthMonthRemain() { + return fifthMonthRemain; + } + + public void setFifthMonthRemain(Integer fifthMonthRemain) { + this.fifthMonthRemain = fifthMonthRemain; + } + + public BigDecimal getFifthMonthRemainRate() { + return fifthMonthRemainRate; + } + + public void setFifthMonthRemainRate(BigDecimal fifthMonthRemainRate) { + this.fifthMonthRemainRate = fifthMonthRemainRate; + } + + public Integer getSixthMonthRemain() { + return sixthMonthRemain; + } + + public void setSixthMonthRemain(Integer sixthMonthRemain) { + this.sixthMonthRemain = sixthMonthRemain; + } + + public BigDecimal getSixthMonthRemainRate() { + return sixthMonthRemainRate; + } + + public void setSixthMonthRemainRate(BigDecimal sixthMonthRemainRate) { + this.sixthMonthRemainRate = sixthMonthRemainRate; + } + + public String getDealMonth() { + return dealMonth; + } + + public void setDealMonth(String dealMonth) { + this.dealMonth = dealMonth; + } + + @Override + public String toString() { + return "CustomerRetainVO{" + + "currentMonth=" + currentMonth + + ", newCustomers=" + newCustomers + + ", dealMonth=" + dealMonth + + ", firstMonthRemain=" + firstMonthRemain + + ", firstMonthRemainRate=" + firstMonthRemainRate + + ", secondMonthRemain=" + secondMonthRemain + + ", secondMonthRemainRate=" + secondMonthRemainRate + + ", thirdMonthRemain=" + thirdMonthRemain + + ", thirdMonthRemainRate=" + thirdMonthRemainRate + + ", fourthMonthRemain=" + fourthMonthRemain + + ", fourthMonthRemainRate=" + fourthMonthRemainRate + + ", fifthMonthRemain=" + fifthMonthRemain + + ", fifthMonthRemainRate=" + fifthMonthRemainRate + + ", sixthMonthRemain=" + sixthMonthRemain + + ", sixthMonthRemainRate=" + sixthMonthRemainRate + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/FlowOrderItemVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/FlowOrderItemVO.java new file mode 100644 index 0000000..67fecf4 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/FlowOrderItemVO.java @@ -0,0 +1,73 @@ +package com.tmerclub.cloud.api.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author gaozijie + * @date 2023-10-09 + */ +public class FlowOrderItemVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品购买数量") + private Integer count; + + @Schema(description = "支付金额") + private Long amount; + + @Schema(description = "支付时间") + private Date payTime; + + public FlowOrderItemVO() { + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + @Override + public String toString() { + return "FlowOrderItemVO{" + + "spuId=" + spuId + + ", count=" + count + + ", payTime=" + payTime + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/FlowOrderVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/FlowOrderVO.java new file mode 100644 index 0000000..eeef834 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/FlowOrderVO.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class FlowOrderVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单ID") + private Long orderId; + + @Schema(description = "用户ID") + private Long userId; + + @Schema(description = "商品Id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long spuId; + + @Schema(description = "订单金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderAmount; + + @Schema(description = "是否支付", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer isPayed; + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getOrderAmount() { + return orderAmount; + } + + public void setOrderAmount(Long orderAmount) { + this.orderAmount = orderAmount; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + @Override + public String toString() { + return "FlowOrderVO{" + + "orderId=" + orderId + + "userId=" + userId + + ", spuId=" + spuId + + ", orderAmount=" + orderAmount + + ", isPayed=" + isPayed + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/GroupInfoVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/GroupInfoVO.java new file mode 100644 index 0000000..0705e7b --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/GroupInfoVO.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.api.order.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author TRACK + */ +public class GroupInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单数 + */ + private Integer orderCount; + + /** + * 人数 + */ + private Integer numberCount; + + public Integer getOrderCount() { + return orderCount; + } + + public void setOrderCount(Integer orderCount) { + this.orderCount = orderCount; + } + + public Integer getNumberCount() { + return numberCount; + } + + public void setNumberCount(Integer numberCount) { + this.numberCount = numberCount; + } + + @Override + public String toString() { + return "GroupInfoVO{" + + "orderCount=" + orderCount + + ", numberCount=" + numberCount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderPayInfoVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderPayInfoVO.java new file mode 100644 index 0000000..f1d7501 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderPayInfoVO.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author TRACK + */ +public class OrderPayInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "支付时间") + private Date payTime; + + @Schema(description = "支付入口[0订单 1充值 2开通会员]") + private Integer payEntry; + + @Schema(description = "关联订单号") + private String orderIds; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "支付单号") + private String payId; + + @Schema(description = "支付积分") + private Long scoreCount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "合计") + private Long payAmount; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Integer getPayEntry() { + return payEntry; + } + + public void setPayEntry(Integer payEntry) { + this.payEntry = payEntry; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public String getPayId() { + return payId; + } + + public void setPayId(String payId) { + this.payId = payId; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + @Override + public String toString() { + return "OrderPayInfoVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", payTime=" + payTime + + ", payEntry=" + payEntry + + ", orderIds='" + orderIds + '\'' + + ", payType=" + payType + + ", payId=" + payId + + ", scoreCount=" + scoreCount + + ", alipayAmount=" + alipayAmount + + ", wechatAmount=" + wechatAmount + + ", balanceAmount=" + balanceAmount + + ", payAmount=" + payAmount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderProdEffectRespVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderProdEffectRespVO.java new file mode 100644 index 0000000..af30406 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderProdEffectRespVO.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Pineapple + * @date 2021/5/21 16:06 + */ +public class OrderProdEffectRespVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品id + */ + @Schema(description = "商品id") + private Long spuId; + /** + * 下单人数 + */ + @Schema(description = "下单人数") + private Integer placeOrderPerson; + /** + * 支付人数 + */ + @Schema(description = "支付人数") + private Integer payPerson; + /** + * 下单商品件数 + */ + @Schema(description = "下单商品件数") + private Integer placeOrderNum; + /** + * 支付商品件数 + */ + @Schema(description = "支付商品件数") + private Integer payNum; + /** + * 商品下单金额 + */ + @Schema(description = "商品下单金额") + private Double placeOrderAmount; + /** + * 商品支付金额 + */ + @Schema(description = "商品支付金额") + private Double payAmount; + + /** + * 支付成功订单数,计算退款率使用 + */ + private Integer payOrderNum; + + public OrderProdEffectRespVO() { + } + + public OrderProdEffectRespVO(Long spuId, Integer placeOrderPerson, Integer payPerson, Integer placeOrderNum, Integer payNum, Double placeOrderAmount, Double payAmount, Integer payOrderNum) { + this.spuId = spuId; + this.placeOrderPerson = placeOrderPerson; + this.payPerson = payPerson; + this.placeOrderNum = placeOrderNum; + this.payNum = payNum; + this.placeOrderAmount = placeOrderAmount; + this.payAmount = payAmount; + this.payOrderNum = payOrderNum; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getPlaceOrderPerson() { + return placeOrderPerson; + } + + public void setPlaceOrderPerson(Integer placeOrderPerson) { + this.placeOrderPerson = placeOrderPerson; + } + + public Integer getPayPerson() { + return payPerson; + } + + public void setPayPerson(Integer payPerson) { + this.payPerson = payPerson; + } + + public Integer getPlaceOrderNum() { + return placeOrderNum; + } + + public void setPlaceOrderNum(Integer placeOrderNum) { + this.placeOrderNum = placeOrderNum; + } + + public Integer getPayNum() { + return payNum; + } + + public void setPayNum(Integer payNum) { + this.payNum = payNum; + } + + public Double getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Double placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Double getPayAmount() { + return payAmount; + } + + public void setPayAmount(Double payAmount) { + this.payAmount = payAmount; + } + + public Integer getPayOrderNum() { + return payOrderNum; + } + + public void setPayOrderNum(Integer payOrderNum) { + this.payOrderNum = payOrderNum; + } + + @Override + public String toString() { + return "OrderProdEffectRespVO{" + + "spuId=" + spuId + + ", placeOrderPerson=" + placeOrderPerson + + ", payPerson=" + payPerson + + ", placeOrderNum=" + placeOrderNum + + ", payNum=" + payNum + + ", placeOrderAmount=" + placeOrderAmount + + ", payAmount=" + payAmount + + ", payOrderNum=" + payOrderNum + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundSimpleVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundSimpleVO.java new file mode 100644 index 0000000..f0c50f6 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundSimpleVO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author lth + * @Date 2021/7/15 14:52 + */ +public class OrderRefundSimpleVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "退款单号") + private Long refundId; + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + @Override + public String toString() { + return "OrderRefundSimpleVO{" + + "orderId=" + orderId + + ", refundId=" + refundId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderSettlementSimpleVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderSettlementSimpleVO.java new file mode 100644 index 0000000..4508d93 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderSettlementSimpleVO.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author lth + * @Date 2021/7/14 13:28 + */ +public class OrderSettlementSimpleVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单id列表") + private List orderIds; + + @Schema(description = "支付单号") + private Long payId; + + @Schema(description = "支付单号集合,目前只有预售订单存在多条") + private String payIds; + + public List getOrderIds() { + return orderIds; + } + + public void setOrderIds(List orderIds) { + this.orderIds = orderIds; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public String getPayIds() { + return payIds; + } + + public void setPayIds(String payIds) { + this.payIds = payIds; + } + + @Override + public String toString() { + return "OrderSettlementSimpleVO{" + + "orderIds=" + orderIds + + ", payId=" + payId + + ", payIds='" + payIds + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/PageShopAccountOrderVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/PageShopAccountOrderVO.java new file mode 100644 index 0000000..43d7055 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/PageShopAccountOrderVO.java @@ -0,0 +1,65 @@ +package com.tmerclub.cloud.api.order.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author TRACK + */ +public class PageShopAccountOrderVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private List shopList; + + private List payInfoList; + + private List refundInfoList; + + /** + * 总条数 + */ + private Long total; + + public List getShopList() { + return shopList; + } + + public void setShopList(List shopList) { + this.shopList = shopList; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public List getPayInfoList() { + return payInfoList; + } + + public void setPayInfoList(List payInfoList) { + this.payInfoList = payInfoList; + } + + public List getRefundInfoList() { + return refundInfoList; + } + + public void setRefundInfoList(List refundInfoList) { + this.refundInfoList = refundInfoList; + } + + @Override + public String toString() { + return "PageShopAccountOrderVO{" + + "shopList=" + shopList + + ", payInfoList=" + payInfoList + + ", refundInfoList=" + refundInfoList + + ", total=" + total + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/PurchaseOrderAddrVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/PurchaseOrderAddrVO.java new file mode 100644 index 0000000..c3bb668 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/PurchaseOrderAddrVO.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 采购订单配送地址VO + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class PurchaseOrderAddrVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "ID") + private Long purchaseOrderAddrId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "收货人") + private String consignee; + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区域ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Schema(description = "地址") + private String addr; + + @Schema(description = "手机") + private String mobile; + + public Long getPurchaseOrderAddrId() { + return purchaseOrderAddrId; + } + + public void setPurchaseOrderAddrId(Long purchaseOrderAddrId) { + this.purchaseOrderAddrId = purchaseOrderAddrId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @Override + public String toString() { + return "PurchaseOrderAddrVO{" + + "purchaseOrderAddrId=" + purchaseOrderAddrId + + ", shopId=" + shopId + + ", consignee='" + consignee + '\'' + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", addr='" + addr + '\'' + + ", mobile='" + mobile + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/ShopAccountOrderDetailVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/ShopAccountOrderDetailVO.java new file mode 100644 index 0000000..b860342 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/ShopAccountOrderDetailVO.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class ShopAccountOrderDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "积分数目") + private Long scoreCount; + + @Schema(description = "合计") + private Long total; + + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "实付金额") + private Long actualTotal; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + @Override + public String toString() { + return "ShopAccountOrderDetailVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", wechatAmount=" + wechatAmount + + ", alipayAmount=" + alipayAmount + + ", balanceAmount=" + balanceAmount + + ", scoreCount=" + scoreCount + + ", total=" + total + + ", payType=" + payType + + ", actualTotal=" + actualTotal + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/ShopAmountVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/ShopAmountVO.java new file mode 100644 index 0000000..7fa0cb8 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/ShopAmountVO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + * @date 2023/05/22 + */ +public class ShopAmountVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 收款金额 + */ + private Long amount; + + /** + * 通常为店铺id,供应商id + */ + private String bizUserId; + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + @Override + public String toString() { + return "ShopAmountVO{" + + "amount=" + amount + + ", bizUserId=" + bizUserId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/SumAmountVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/SumAmountVO.java new file mode 100644 index 0000000..e08502c --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/SumAmountVO.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Citrus + * @date 2021/8/16 9:10 + */ +public class SumAmountVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "用户消费笔数") + private Integer expenseNumber; + + @Schema(description = "用户消费金额") + private Double sumOfConsumption; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getExpenseNumber() { + return expenseNumber; + } + + public void setExpenseNumber(Integer expenseNumber) { + this.expenseNumber = expenseNumber; + } + + public Double getSumOfConsumption() { + return sumOfConsumption; + } + + public void setSumOfConsumption(Double sumOfConsumption) { + this.sumOfConsumption = sumOfConsumption; + } + + @Override + public String toString() { + return "SumAmountVO{" + + "userId=" + userId + + ", expenseNumber=" + expenseNumber + + ", sumOfConsumption=" + sumOfConsumption + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/pom.xml b/tmerclub-api/tmerclub-api-payment/pom.xml new file mode 100644 index 0000000..de81f71 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/pom.xml @@ -0,0 +1,23 @@ + + + + tmerclub-api + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api-payment + jar + 支付对内接口 + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + + diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/CompanyBasicInfo.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/CompanyBasicInfo.java new file mode 100644 index 0000000..d3abe05 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/CompanyBasicInfo.java @@ -0,0 +1,251 @@ +package com.tmerclub.cloud.api.payment.allinpay.member.resp; + + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 企业账户基本信息 + * + * @author LGH + */ +public class CompanyBasicInfo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "企业名称,如有括号,用中文格式()") + protected String companyName; + + @Schema(description = "企业地址") + protected String companyAddress; + + @Schema(description = "认证类型 1.三证 2.一证 本系统采用2.一证") + protected Integer authType; + + @Schema(description = "统一社会信用") + protected String uniCredit; + + @Schema(description = "绑定手机 返回参数") + protected String phone; + + @Schema(description = "联系电话") + protected String telephone; + + @Schema(description = "法人姓名") + protected String legalName; + + @Schema(description = "法人证件类型") + protected Integer identityType; + + @Schema(description = "法人证件号") + protected String legalIds; + + @Schema(description = "证件有效开始日期") + protected String identityBeginDate; + + @Schema(description = "证件有效截止日期") + protected String identityEndDate; + + @Schema(description = "法人手机号") + protected String legalPhone; + + @Schema(description = "企业对公账户") + protected String accountNo; + + @Schema(description = "开户银行名称") + protected String parentBankName; + + @Schema(description = "开户行地区代码") + protected String bankCityNo; + + @Schema(description = "开户支行名称") + protected String bankName; + + @Schema(description = "支付行号 12位数字") + protected String unionBank; + + @Schema(description = "开户行所在省") + protected String province; + + @Schema(description = "开户行所在市") + protected String city; + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getCompanyAddress() { + return companyAddress; + } + + public void setCompanyAddress(String companyAddress) { + this.companyAddress = companyAddress; + } + + public Integer getAuthType() { + return authType; + } + + public void setAuthType(Integer authType) { + this.authType = authType; + } + + public String getUniCredit() { + return uniCredit; + } + + public void setUniCredit(String uniCredit) { + this.uniCredit = uniCredit; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getTelephone() { + return telephone; + } + + public void setTelephone(String telephone) { + this.telephone = telephone; + } + + public String getLegalName() { + return legalName; + } + + public void setLegalName(String legalName) { + this.legalName = legalName; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public String getLegalIds() { + return legalIds; + } + + public void setLegalIds(String legalIds) { + this.legalIds = legalIds; + } + + public String getIdentityBeginDate() { + return identityBeginDate; + } + + public void setIdentityBeginDate(String identityBeginDate) { + this.identityBeginDate = identityBeginDate; + } + + public String getIdentityEndDate() { + return identityEndDate; + } + + public void setIdentityEndDate(String identityEndDate) { + this.identityEndDate = identityEndDate; + } + + public String getLegalPhone() { + return legalPhone; + } + + public void setLegalPhone(String legalPhone) { + this.legalPhone = legalPhone; + } + + public String getAccountNo() { + return accountNo; + } + + public void setAccountNo(String accountNo) { + this.accountNo = accountNo; + } + + public String getParentBankName() { + return parentBankName; + } + + public void setParentBankName(String parentBankName) { + this.parentBankName = parentBankName; + } + + public String getBankCityNo() { + return bankCityNo; + } + + public void setBankCityNo(String bankCityNo) { + this.bankCityNo = bankCityNo; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getUnionBank() { + return unionBank; + } + + public void setUnionBank(String unionBank) { + this.unionBank = unionBank; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + @Override + public String toString() { + return "CompanyBasicInfo{" + + "companyName='" + companyName + '\'' + + ", companyAddress='" + companyAddress + '\'' + + ", authType=" + authType + + ", uniCredit='" + uniCredit + '\'' + + ", phone='" + phone + '\'' + + ", telephone='" + telephone + '\'' + + ", legalName='" + legalName + '\'' + + ", identityType=" + identityType + + ", legalIds='" + legalIds + '\'' + + ", identityBeginDate='" + identityBeginDate + '\'' + + ", identityEndDate='" + identityEndDate + '\'' + + ", legalPhone='" + legalPhone + '\'' + + ", accountNo='" + accountNo + '\'' + + ", parentBankName='" + parentBankName + '\'' + + ", bankCityNo='" + bankCityNo + '\'' + + ", bankName='" + bankName + '\'' + + ", unionBank='" + unionBank + '\'' + + ", province='" + province + '\'' + + ", city='" + city + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/CompanyInfo.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/CompanyInfo.java new file mode 100644 index 0000000..1f89d63 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/CompanyInfo.java @@ -0,0 +1,104 @@ +package com.tmerclub.cloud.api.payment.allinpay.member.resp; + + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author LGH + */ +public class CompanyInfo extends CompanyBasicInfo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "审核状态 1.待审核 2.审核成功 3.审核失败") + private Integer status; + + @Schema(description = "审核时间") + private String checkTime; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "审核失败原因") + private String failReason; + + @Schema(description = "OCR识别与企业工商认证信息是否一致 0否1是 没有则不返回") + private Integer ocrRegnumComparisonResult; + + @Schema(description = "OCR识别与企业法人实名信息是否一致 0否1是 没有则不返回") + private Integer ocrIdcardComparisonResult; + + @Schema(description = "签约提现协议号") + private String acctProtocolNo; + + @Schema(description = "法人签约提现协议号") + private String legalAcctProtocolNo; + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getCheckTime() { + return checkTime; + } + + public void setCheckTime(String checkTime) { + this.checkTime = checkTime; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getFailReason() { + return failReason; + } + + public void setFailReason(String failReason) { + this.failReason = failReason; + } + + public Integer getOcrRegnumComparisonResult() { + return ocrRegnumComparisonResult; + } + + public void setOcrRegnumComparisonResult(Integer ocrRegnumComparisonResult) { + this.ocrRegnumComparisonResult = ocrRegnumComparisonResult; + } + + public Integer getOcrIdcardComparisonResult() { + return ocrIdcardComparisonResult; + } + + public void setOcrIdcardComparisonResult(Integer ocrIdcardComparisonResult) { + this.ocrIdcardComparisonResult = ocrIdcardComparisonResult; + } + + public String getAcctProtocolNo() { + return acctProtocolNo; + } + + public void setAcctProtocolNo(String acctProtocolNo) { + this.acctProtocolNo = acctProtocolNo; + } + + public String getLegalAcctProtocolNo() { + return legalAcctProtocolNo; + } + + public void setLegalAcctProtocolNo(String legalAcctProtocolNo) { + this.legalAcctProtocolNo = legalAcctProtocolNo; + } + +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/IdCardCollectByFileUploadResp.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/IdCardCollectByFileUploadResp.java new file mode 100644 index 0000000..518fd38 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/IdCardCollectByFileUploadResp.java @@ -0,0 +1,58 @@ +package com.tmerclub.cloud.api.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 影印件采集(文件上传模式) + * @author TRACK + */ +public class IdCardCollectByFileUploadResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 上传结果 1.成功 2.失败 + */ + private Integer result; + + private String bizUserId; + + /** + * 失败原因,上传失败返回 + */ + private String failReason; + + public Integer getResult() { + return result; + } + + public void setResult(Integer result) { + this.result = result; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getFailReason() { + return failReason; + } + + public void setFailReason(String failReason) { + this.failReason = failReason; + } + + @Override + public String toString() { + return "IdCardCollectByFileUploadResp{" + + "result=" + result + + ", bizUserId='" + bizUserId + '\'' + + ", failReason='" + failReason + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/IdCardCollectResp.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/IdCardCollectResp.java new file mode 100644 index 0000000..983f77a --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/IdCardCollectResp.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.api.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 影印件采集 + * @author TRACK + */ +public class IdCardCollectResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 上传结果 1.成功 2.失败 + */ + private Integer result; + + private String bizUserId; + + public Integer getResult() { + return result; + } + + public void setResult(Integer result) { + this.result = result; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + @Override + public String toString() { + return "IdCardCollectResp{" + + "result=" + result + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/DepositApplyResp.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/DepositApplyResp.java new file mode 100644 index 0000000..0aa72cc --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/DepositApplyResp.java @@ -0,0 +1,103 @@ +package com.tmerclub.cloud.api.payment.allinpay.order.resp; + + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-03-30 + */ +public class DepositApplyResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 通联订单号 + */ + private String orderNo; + + /** + * 商户订单号 + */ + private String bizOrderNo; + + /** + * 渠道交易流水号 + */ + private String payInterfaceOutTradeNo; + + /** + * 微信APP支付信息(JSON) + */ + private String weChatAPPInfo; + + /** + * 交易验证方式(1:时,需要调用‘确认支付(后台+短信验证码确认)’功能) + */ + private Integer validateType; + + /** + * 扫码支付信息 + */ + private String payInfo; + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getPayInterfaceOutTradeNo() { + return payInterfaceOutTradeNo; + } + + public void setPayInterfaceOutTradeNo(String payInterfaceOutTradeNo) { + this.payInterfaceOutTradeNo = payInterfaceOutTradeNo; + } + + public String getWeChatAPPInfo() { + return weChatAPPInfo; + } + + public void setWeChatAPPInfo(String weChatAPPInfo) { + this.weChatAPPInfo = weChatAPPInfo; + } + + public Integer getValidateType() { + return validateType; + } + + public void setValidateType(Integer validateType) { + this.validateType = validateType; + } + + public String getPayInfo() { + return payInfo; + } + + public void setPayInfo(String payInfo) { + this.payInfo = payInfo; + } + + @Override + public String toString() { + return "DepositApplyResp{" + + "orderNo='" + orderNo + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", payInterfaceOutTradeNo='" + payInterfaceOutTradeNo + '\'' + + ", weChatAPPInfo='" + weChatAPPInfo + '\'' + + ", validateType=" + validateType + + ", payInfo='" + payInfo + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/PayByBackSmsResp.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/PayByBackSmsResp.java new file mode 100644 index 0000000..4342d29 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/PayByBackSmsResp.java @@ -0,0 +1,81 @@ +package com.tmerclub.cloud.api.payment.allinpay.order.resp; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 确认支付 后台+短信验证 响应参数 + * + * @author TRACK + */ +public class PayByBackSmsResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 成功:success + * 进行中:pending + * 未支付:unpay + * 失败:fail + * 支付状态发生变化时还将发送异步通知:提现在成功和失败都会通知商户;其他订单只在成功时通知商户。 + */ + private String payStatus; + + /** + * 支付失败信息 + * payStatus为fail和unpay时有效; + * 其中payStatus返回unpay时,仅针对收银宝快捷短信验证码输入错误场景,允许商户继续调用确认支付 + */ + private String payFailMessage; + + /** + * 商户系统用户标识,商户系统中唯一编号。 + */ + private String bizUserId; + + /** + * 商户订单号(支付订单) + */ + private String bizOrderNo; + + public String getPayStatus() { + return payStatus; + } + + public void setPayStatus(String payStatus) { + this.payStatus = payStatus; + } + + public String getPayFailMessage() { + return payFailMessage; + } + + public void setPayFailMessage(String payFailMessage) { + this.payFailMessage = payFailMessage; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + @Override + public String toString() { + return "PayByBackSmsResp{" + + "payStatus='" + payStatus + '\'' + + ", payFailMessage='" + payFailMessage + '\'' + + ", bizUserId='" + bizUserId + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/QueryBalanceResp.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/QueryBalanceResp.java new file mode 100644 index 0000000..17b8d58 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/QueryBalanceResp.java @@ -0,0 +1,41 @@ +package com.tmerclub.cloud.api.payment.allinpay.order.resp; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 查询余额 返回 + * + * @author LGH + */ +public class QueryBalanceResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 总额 + */ + private Long allAmount; + /** + * 冻结额 + */ + private Long freezenAmount; + + public Long getAllAmount() { + return allAmount; + } + + public void setAllAmount(Long allAmount) { + this.allAmount = allAmount; + } + + public Long getFreezenAmount() { + return freezenAmount; + } + + public void setFreezenAmount(Long freezenAmount) { + this.freezenAmount = freezenAmount; + } + + +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/WithdrawApplyResp.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/WithdrawApplyResp.java new file mode 100644 index 0000000..90d81d7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/order/resp/WithdrawApplyResp.java @@ -0,0 +1,48 @@ +package com.tmerclub.cloud.api.payment.allinpay.order.resp; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 提现申请返回 + * + * @author TRACK + */ +public class WithdrawApplyResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 云商通订单号 + */ + private String orderNo; + + /** + * 商户订单号(支付订单) + */ + private String bizOrderNo; + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + @Override + public String toString() { + return "WithdrawApplyResp{" + + ", orderNo='" + orderNo + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/BindCompanyAccountDTO.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/BindCompanyAccountDTO.java new file mode 100644 index 0000000..1b8609c --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/BindCompanyAccountDTO.java @@ -0,0 +1,105 @@ +package com.tmerclub.cloud.api.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 企业会员绑定对公户 + * + * @author LGH + */ +public class BindCompanyAccountDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "企业对公账户 AES加密", requiredMode = Schema.RequiredMode.REQUIRED) + private String accountNo; + + @Schema(description = "开户银行名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String parentBankName; + + @Schema(description = "开户行地区代码 非必填") + private String bankCityNo; + + @Schema(description = "开户支行名称 \t如:“中国工商银行股份有限公司北京樱桃园支行”", requiredMode = Schema.RequiredMode.REQUIRED) + private String bankName; + + @Schema(description = "支付行号 12位数字", requiredMode = Schema.RequiredMode.REQUIRED) + private String unionBank; + + @Schema(description = "开户行所在省 开户行所在市必须同时上送 非必填") + private String province; + + @Schema(description = "开户行所在市 开户行所在省必须同时上送 非必填") + private String city; + + public String getAccountNo() { + return accountNo; + } + + public void setAccountNo(String accountNo) { + this.accountNo = accountNo; + } + + public String getParentBankName() { + return parentBankName; + } + + public void setParentBankName(String parentBankName) { + this.parentBankName = parentBankName; + } + + public String getBankCityNo() { + return bankCityNo; + } + + public void setBankCityNo(String bankCityNo) { + this.bankCityNo = bankCityNo; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getUnionBank() { + return unionBank; + } + + public void setUnionBank(String unionBank) { + this.unionBank = unionBank; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + @Override + public String toString() { + return "BindCompanyAccountDTO{" + + ", accountNo='" + accountNo + '\'' + + ", parentBankName='" + parentBankName + '\'' + + ", bankCityNo='" + bankCityNo + '\'' + + ", bankName='" + bankName + '\'' + + ", unionBank='" + unionBank + '\'' + + ", province='" + province + '\'' + + ", city='" + city + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/OrderPayInfoDTO.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/OrderPayInfoDTO.java new file mode 100644 index 0000000..639dadb --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/OrderPayInfoDTO.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author cl + * @date 2021-05-22 14:28:43 + */ +public class OrderPayInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单id列表") + private List orderIds; + + @Schema(description = "用户id") + private Long userId; + + public List getOrderIds() { + return orderIds; + } + + public void setOrderIds(List orderIds) { + this.orderIds = orderIds; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public OrderPayInfoDTO() { + } + + public OrderPayInfoDTO(List orderIds, Long userId) { + this.orderIds = orderIds; + this.userId = userId; + } + + @Override + public String toString() { + return "OrderPayInfoDTO{" + + "orderIds=" + orderIds + + ", userId=" + userId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/UpdateCompanyInfoDTO.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/UpdateCompanyInfoDTO.java new file mode 100644 index 0000000..c9153fb --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/UpdateCompanyInfoDTO.java @@ -0,0 +1,110 @@ +package com.tmerclub.cloud.api.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lanhai + */ +public class UpdateCompanyInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商户唯一号") + private String bizUserId; + + @Schema(description = "企业名称") + private String companyName; + + @Schema(description = "企业地址") + private String companyAddress; + + @Schema(description = "法人姓名") + private String legalName; + + @Schema(description = "法人证件类型") + private Integer identityType; + + @Schema(description = "法人证件号码") + private String legalIds; + + @Schema(description = "法人手机号") + private String legalPhone; + + public UpdateCompanyInfoDTO() { + } + + public UpdateCompanyInfoDTO(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getCompanyAddress() { + return companyAddress; + } + + public void setCompanyAddress(String companyAddress) { + this.companyAddress = companyAddress; + } + + public String getLegalName() { + return legalName; + } + + public void setLegalName(String legalName) { + this.legalName = legalName; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public String getLegalIds() { + return legalIds; + } + + public void setLegalIds(String legalIds) { + this.legalIds = legalIds; + } + + public String getLegalPhone() { + return legalPhone; + } + + public void setLegalPhone(String legalPhone) { + this.legalPhone = legalPhone; + } + + @Override + public String toString() { + return "UpdateCompanyInfoDTO{" + + "bizUserId='" + bizUserId + '\'' + + ", companyName='" + companyName + '\'' + + ", companyAddress='" + companyAddress + '\'' + + ", legalName='" + legalName + '\'' + + ", identityType=" + identityType + + ", legalIds='" + legalIds + '\'' + + ", legalPhone='" + legalPhone + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/feign/PaymentFeignClient.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/feign/PaymentFeignClient.java new file mode 100644 index 0000000..8c88b67 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/feign/PaymentFeignClient.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.payment.feign; + +import com.tmerclub.cloud.api.payment.dto.AllinpaySettlementApiDto; +import com.tmerclub.cloud.api.payment.dto.OrderPayInfoDTO; +import com.tmerclub.cloud.api.payment.dto.PayInfoApiDto; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @Author YXF + * @Date 2022/08/10 9:21 + */ +public interface PaymentFeignClient { + + /** + * 查询订单是否支付成功, 已经支付成功的订单进行支付成功处理 + * + * @param orderPayInfoDTO 订单id列表 + * @return 支付成功的订单id列表 + */ + List queryAndHandleOrderPaySuccess(OrderPayInfoDTO orderPayInfoDTO); + + + /** + * 进行商家余额支付(通联支付) + * + * @param payInfoApiVO 支付信息 + * @param payInfoApiVO + * @return 支付成功的订单id列表 + */ + ServerResponseEntity doAllinPayShopBalance(PayInfoApiDto payInfoApiVO); + + /** + * 如果是通联支付进行通联支付分账 + * + * @param payInfoApiVO 支付信息 + * @return 支付成功的订单id列表 + */ + ServerResponseEntity doAllinPaySettlement(AllinpaySettlementApiDto payInfoApiVO); + + /** + * 失效微信或者支付宝支付二维码 + * @param orderPayInfoDTO + * @return + */ + ServerResponseEntity cancelOrderQrCode(OrderPayInfoDTO orderPayInfoDTO); + + + /** + * 根据订单id获取最新的支付成功记录的系统类型 + * @param orderId + * @param userId + * @return + */ + ServerResponseEntity> getPayInfoByUserIdAndOrderId(Long userId, Long orderId); + + /** + * 根据支付单号获取支付信息 + * @param payId + * @return + */ + ServerResponseEntity getPayInfoByPayId(Long payId); + + /** + * 退款主动查单 + * @param refundId + * @return + */ + ServerResponseEntity checkRefundStatus(Long refundId); + + /** + * 团购订单拆单后,修改订单支付信息 + * @param orderIds + * @param oldOrderId + * @return + */ + ServerResponseEntity updatePayInfoBySplitGroup(String orderIds, Long oldOrderId); +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/AccountDetailVO.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/AccountDetailVO.java new file mode 100644 index 0000000..3fb0aba --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/AccountDetailVO.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.payment.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Pineapple + * @date 2021/6/9 16:00 + */ +public class AccountDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "积分") + private Long scoreCount; + + @Schema(description = "微信占比") + private Double wechatPercent; + + @Schema(description = "支付宝占比") + private Double alipayPercent; + + @Schema(description = "余额占比") + private Double balancePercent; + + @Schema(description = "合计") + private Long total; + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Double getWechatPercent() { + return wechatPercent; + } + + public void setWechatPercent(Double wechatPercent) { + this.wechatPercent = wechatPercent; + } + + public Double getAlipayPercent() { + return alipayPercent; + } + + public void setAlipayPercent(Double alipayPercent) { + this.alipayPercent = alipayPercent; + } + + public Double getBalancePercent() { + return balancePercent; + } + + public void setBalancePercent(Double balancePercent) { + this.balancePercent = balancePercent; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + @Override + public String toString() { + return "AccountDetailVO{" + + "wechatAmount=" + wechatAmount + + ", alipayAmount=" + alipayAmount + + ", balanceAmount=" + balanceAmount + + ", scoreCount=" + scoreCount + + ", wechatPercent=" + wechatPercent + + ", alipayPercent=" + alipayPercent + + ", balancePercent=" + balancePercent + + ", total=" + total + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/ShopAccountDetailVO.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/ShopAccountDetailVO.java new file mode 100644 index 0000000..a3d6b2e --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/ShopAccountDetailVO.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.payment.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class ShopAccountDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "积分数目") + private Long scoreCount; + + @Schema(description = "合计") + private Long total; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + @Override + public String toString() { + return "ShopAccountDetailVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", wechatAmount=" + wechatAmount + + ", alipayAmount=" + alipayAmount + + ", balanceAmount=" + balanceAmount + + ", scoreCount=" + scoreCount + + ", total=" + total + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-product/pom.xml b/tmerclub-api/tmerclub-api-product/pom.xml new file mode 100644 index 0000000..6b7ebcf --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/pom.xml @@ -0,0 +1,38 @@ + + + + tmerclub-api + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api-product + jar + 商品对内接口 + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + com.moyuer.cloud + tmerclub-common-order + ${project.version} + + + com.moyuer.cloud + tmerclub-common-product + ${project.version} + + + com.moyuer.cloud + tmerclub-api-marketing + ${project.version} + + + + diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/SkuStockLockBO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/SkuStockLockBO.java new file mode 100644 index 0000000..0d582d4 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/SkuStockLockBO.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.bo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + */ +public class SkuStockLockBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull(message = "skuId不能为空") + @Schema(description = "skuId", requiredMode = Schema.RequiredMode.REQUIRED) + private Long skuId; + + @NotNull(message = "orderId不能为空") + @Schema(description = "orderId", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + @NotNull(message = "商品数量不能为空") + @Min(value = 1, message = "商品数量不能为空") + @Schema(description = "商品数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer stockCount; + + @Schema(description = "库存仓库id") + private Long stockPointId; + + @Schema(description = "默认仓库id,如果不为空,在回退库存时回退到这里") + private Long defaultStockPointId; + + public SkuStockLockBO() { + } + + public Long getDefaultStockPointId() { + return defaultStockPointId; + } + + public void setDefaultStockPointId(Long defaultStockPointId) { + this.defaultStockPointId = defaultStockPointId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getStockCount() { + return stockCount; + } + + public void setStockCount(Integer stockCount) { + this.stockCount = stockCount; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + @Override + public String toString() { + return "SkuStockLockBO{" + + "skuId=" + skuId + + ", orderId=" + orderId + + ", stockCount=" + stockCount + + ", stockPointId=" + stockPointId + + ", defaultStockPointId=" + defaultStockPointId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/SpuSimpleBO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/SpuSimpleBO.java new file mode 100644 index 0000000..e5fba27 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/SpuSimpleBO.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author lth + * @Date 2021/8/13 15:13 + */ +public class SpuSimpleBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "spuId") + private Long spuId; + + @Schema(description = "商品id列表") + private List spuIds; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺id列表") + private List shopIds; + + @Schema(description = "商品状态") + private Integer status; + + @Schema(description = "商品主图") + private String mainImgUrl; + + @Schema(description = "排序: 1.spuId 正序 2.spuId 倒序") + private Integer seq; + + @Schema(description = "当前语言") + private Integer lang; + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + @Override + public String toString() { + return "SpuSimpleBO{" + + "spuId=" + spuId + + ", spuIds=" + spuIds + + ", spuName='" + spuName + '\'' + + ", shopId=" + shopId + + ", shopIds=" + shopIds + + ", status=" + status + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", seq=" + seq + + ", lang=" + lang + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/BrandShopDTO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/BrandShopDTO.java new file mode 100644 index 0000000..b18d98f --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/BrandShopDTO.java @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 品牌店铺关联信息DTO + * + * @author FrozenWatermelon + * @date 2021-05-08 13:31:45 + */ +public class BrandShopDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键id") + private Long brandShopId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "品牌id") + private Long brandId; + + @Schema(description = "授权资质图片,以,分割") + @NotBlank(message = "授权资质图片不能为空") + private String qualifications; + + @Schema(description = "类型 0:平台品牌,1:店铺自定义品牌") + private Integer type; + + @Schema(description = "检索首字母") + @Length(max = 1, message = "检索首字母长度不能超过1") + private String firstLetter; + + @Schema(description = "排序") + private Integer seq; + + @Schema(description = "是否置顶 0:不置顶 1:置顶") + private Integer isTop; + + @Schema(description = "logo") + private String imgUrl; + + @Schema(description = "品牌名称") + private String name; + + @Schema(description = "品牌描述") + private String desc; + + @Schema(description = "品牌状态") + private Integer status; + + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "关联系统类型 1.店铺 2.平台端 3.供应商") + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getFirstLetter() { + return firstLetter; + } + + public void setFirstLetter(String firstLetter) { + this.firstLetter = firstLetter; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public Long getBrandShopId() { + return brandShopId; + } + + public void setBrandShopId(Long brandShopId) { + this.brandShopId = brandShopId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public String getQualifications() { + return qualifications; + } + + public void setQualifications(String qualifications) { + this.qualifications = qualifications; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + @Override + public String toString() { + return "BrandShopDTO{" + + "brandShopId=" + brandShopId + + ", shopId=" + shopId + + ", brandId=" + brandId + + ", qualifications='" + qualifications + '\'' + + ", type=" + type + + ", firstLetter='" + firstLetter + '\'' + + ", seq=" + seq + + ", isTop=" + isTop + + ", imgUrl='" + imgUrl + '\'' + + ", name='" + name + '\'' + + ", categoryId=" + categoryId + + ", desc='" + desc + '\'' + + ", status=" + status + + ", sysType=" + sysType + + ", status=" + status + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/CategoryShopDTO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/CategoryShopDTO.java new file mode 100644 index 0000000..a69cc03 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/CategoryShopDTO.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分类签约信息 + * + * @author lth + */ +public class CategoryShopDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键Id") + private Long categoryShopId; + + @Schema(description = "分类id") + @NotNull(message = "分类id不能为空") + private Long categoryId; + + @Schema(description = "自定义扣率,为空代表采用平台扣率") + private Double rate; + + @Schema(description = "经营资质") + private String qualifications; + + public Long getCategoryShopId() { + return categoryShopId; + } + + public void setCategoryShopId(Long categoryShopId) { + this.categoryShopId = categoryShopId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + + public String getQualifications() { + return qualifications; + } + + public void setQualifications(String qualifications) { + this.qualifications = qualifications; + } + + @Override + public String toString() { + return "CategoryShopDTO{" + + "categoryShopId=" + categoryShopId + + ", categoryId=" + categoryId + + ", rate=" + rate + + ", qualifications='" + qualifications + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/SpuUpdateDTO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/SpuUpdateDTO.java new file mode 100644 index 0000000..c25e5fd --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/SpuUpdateDTO.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.dto; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public class SpuUpdateDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分类id + */ + private Long categoryId; + + /** + * 分类id列表 + */ + private List categoryIds; + + /** + * 分类名称 + */ + private String categoryName; + + /** + * 分类等级 + */ + private Integer categoryLevel; + + /** + * 商品状态 + */ + private Integer status; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺名称 搜索华为的时候,可以把华为的旗舰店搜索出来 + */ + private String shopName; + + /** + * 店铺logo + */ + private String shopImg; + + /** + * 品牌id + */ + private Long brandId; + + /** + * 品牌图片 + */ + private String brandImg; + + /** + * 品牌名称 + */ + private String brandName; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public List getCategoryIds() { + return categoryIds; + } + + public void setCategoryIds(List categoryIds) { + this.categoryIds = categoryIds; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public Integer getCategoryLevel() { + return categoryLevel; + } + + public void setCategoryLevel(Integer categoryLevel) { + this.categoryLevel = categoryLevel; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopImg() { + return shopImg; + } + + public void setShopImg(String shopImg) { + this.shopImg = shopImg; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getBrandImg() { + return brandImg; + } + + public void setBrandImg(String brandImg) { + this.brandImg = brandImg; + } + + @Override + public String toString() { + return "SpuUpdateDTO{" + + "categoryId=" + categoryId + + ", categoryIds=" + categoryIds + + ", categoryName='" + categoryName + '\'' + + ", categoryLevel=" + categoryLevel + + ", status=" + status + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", shopImg='" + shopImg + '\'' + + ", brandId=" + brandId + + ", brandImg='" + brandImg + '\'' + + ", brandName='" + brandName + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/WarehouseDTO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/WarehouseDTO.java new file mode 100644 index 0000000..2c7b3f8 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/WarehouseDTO.java @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.dto; + +import com.tmerclub.cloud.common.order.dto.AreaDTO; +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serializable; +import java.util.List; + +/** + * DTO + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +public class WarehouseDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "仓库id") + private Long warehouseId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "仓库名称") + private String warehouseName; + + @Schema(description = "仓库类型(0默认仓库,1区域仓库)") + private Integer type; + + /** + * 系统类型见SysTypeEnum 0.普通用户系统 1.商家端 2平台端 3供应商端 + */ + @Schema(description = "系统类型") + private Integer sysType; + + @Schema(description = "仓库地址") + private String address; + + @Schema(description = "管理人") + private String manage; + + @Schema(description = "管理电话") + private String phone; + + @Schema(description = "供应城市项") + private List cityList; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Hidden + @Schema(description = "仓库id集合") + private List warehouseIds; + + @Hidden + @Schema(description = "店铺id集合") + private List shopIds; + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public Long getSpuId() { + return spuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public List getCityList() { + return cityList; + } + + public void setCityList(List cityList) { + this.cityList = cityList; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getWarehouseName() { + return warehouseName; + } + + public void setWarehouseName(String warehouseName) { + this.warehouseName = warehouseName; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getManage() { + return manage; + } + + public void setManage(String manage) { + this.manage = manage; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public List getWarehouseIds() { + return warehouseIds; + } + + public void setWarehouseIds(List warehouseIds) { + this.warehouseIds = warehouseIds; + } + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + @Override + public String toString() { + return "WarehouseDTO{" + + "warehouseId=" + warehouseId + + ", shopId=" + shopId + + ", warehouseName='" + warehouseName + '\'' + + ", type=" + type + + ", sysType=" + sysType + + ", address='" + address + '\'' + + ", manage='" + manage + '\'' + + ", phone='" + phone + '\'' + + ", cityList=" + cityList + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", warehouseIds=" + warehouseIds + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/BrandShopFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/BrandShopFeignClient.java new file mode 100644 index 0000000..5062cd4 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/BrandShopFeignClient.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.feign; + +import com.tmerclub.cloud.api.product.dto.BrandShopDTO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @Author lth + * @Date 2021/7/12 9:08 + */ +public interface BrandShopFeignClient { + + /** + * 根据店铺id批量保存品牌签约信息 + * @param brandShopDTOList + * @param shopId + * @param sysType + * @return + */ + ServerResponseEntity insertBatchByShopId(List brandShopDTOList, Long shopId, Integer sysType); +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/CategoryFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/CategoryFeignClient.java new file mode 100644 index 0000000..2fd717c --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/CategoryFeignClient.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.feign; + +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; +import java.util.Set; + +/** + * @author lhd + * @date 2020/12/23 + */ +public interface CategoryFeignClient { + + /** + * 根据分类id,获取分类及分类国际化信息 + * @param categoryId + * @return + */ + ServerResponseEntity getByCategoryId(Long categoryId); + + /** + * 根据分类id列表获取信息 + * @param categoryIds + * @return + */ + ServerResponseEntity> getByCategoryIds(Set categoryIds); + +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/GiveawayFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/GiveawayFeignClient.java new file mode 100644 index 0000000..e93a6e7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/GiveawayFeignClient.java @@ -0,0 +1,21 @@ +package com.tmerclub.cloud.api.product.feign; + +/** + * @author lanhai + */ +public interface GiveawayFeignClient { + + + /**buildItemGiveawayInfo + * 主商品下架时失效赠品活动 + * @param spuId + */ + void changeGiveawayStatus(Long spuId); + + /** + * 赠送商品上下架时删除购物车缓存 + * @param spuId + */ + void changeGiveawaySpuStatus(Long spuId); + +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/ShopCartFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/ShopCartFeignClient.java new file mode 100644 index 0000000..32deb5f --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/ShopCartFeignClient.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.feign; + +import com.tmerclub.cloud.common.order.dto.DvyTypeDTO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public interface ShopCartFeignClient { + + /** + * 获取购物项 + * @param shopCartItems 订单项\购物车项数据 + * @param dvyTypes 店铺物流类型 + * @param isShopCartOrder 是否从购物车提交的订单(注:不是购物车,是购物车提交的订单) + * @return 购物项 + */ + List handleShopCartItem(List shopCartItems, List dvyTypes, Boolean isShopCartOrder); + + /** + * 获取购物项 + * @param addrId + * @return 购物项 + */ + List getCheckedShopCartItems(Long addrId, List dvyTypes); + + /** + * 通过购物车id删除用户购物车物品 + * @param shopCartItemIds 购物车id + */ + void deleteItem(List shopCartItemIds); + + /** + * 根据店铺id列表更新购物车店铺是否停业属性 + * @param shopIds + * @param isClosed + * @return + */ + ServerResponseEntity updateIsClosedByShopIds(List shopIds, Integer isClosed); + + /** + * 套餐发生变化时移除用户购物车项 + * @param comboIdList + * @param spuId + * @param skuId + */ + void deleteCartByComboUpdate(List comboIdList, Long spuId, Long skuId); + + /** + * 根据套餐id和套餐商品id集合移除用户购物车项 + * @param comboId + * @param spuIdList + * @return + */ + ServerResponseEntity deleteCartByComboIdAndSpuIdS(Long comboId, List spuIdList); + + /** + * 根据套餐id和套餐商品id集合移除用户购物车项 + * @param comboId + * @param skuIdList + */ + void deleteCartByComboIdAndSkuIdS(Long comboId, List skuIdList); + + /** + * 修改用户购物车中的套餐商品价格 + * @param comboId + * @param skuId + * @param price + * @return + */ + ServerResponseEntity updateCartSpuPriceByComboIdAndSkuId(Long comboId, Long skuId, Long price); + + /** + * 根据套餐主商品skuId获取搭配商品id + * @param skuId + * @return + */ + ServerResponseEntity> skuIdListByComboMainSkuId(List skuId); + + /** + * 套餐修改商品起搭数时异步修改以后购物车商品数量 + * @param comboId 套餐id + * @param spuId 商品id + * @param count 套餐商品起搭数量 + */ + void updateCartComboCount(Long comboId, Long spuId, Integer count); + + /** + * 清空购物车 + * @param userId + * @param shopCartItemIds + */ + void deleteShopCartItemsByShopCartItemIds(Long userId, List shopCartItemIds); +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuFeignClient.java new file mode 100644 index 0000000..f4f94b9 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuFeignClient.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.feign; + +import com.tmerclub.cloud.common.product.vo.SkuAddrVO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.app.SkuAppVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public interface SkuFeignClient { + + /** + * 通过skuId获取sku信息 + * @param skuId skuId + * @return sku信息 + */ + ServerResponseEntity getById(Long skuId); + + /** + * 通过spuId获取sku信息 + * @param spuId spuId + * @return sku信息 + */ + ServerResponseEntity> listBySpuId(Long spuId); + + /** + * 通过spuIds获取sku信息 + * @param spuIds spuIds + * @return sku信息 + */ + List listBySpuIds(List spuIds); + + /** + * 获取供应商商品信息(包括供应商库存和商家库存) + * @param spuIds + * @param shopId + * @return + */ + ServerResponseEntity> listSupplierBySpuIds(List spuIds, Long shopId); + + /** + * 根据skuId列表获取商品列表 + * @param skuIds + * @return + */ + ServerResponseEntity> listSpuDetailByIds(List skuIds); + + + /** + * 根据skuId列表获取售价最低的商品的售价 + * @param skuIds + * @return + */ + ServerResponseEntity getMinPriceFeeByIds(List skuIds); + + /** + * 通过skuIds获取sku信息 + * @param skuIds skuIds + * @return sku信息 + */ + ServerResponseEntity> getByIds(List skuIds); + + /** + * 获取商品sku保存到商品列表 + * @param spuAdminVOList + * @return + */ + ServerResponseEntity> setSpuSku(List spuAdminVOList); + + /** + * 处理sku更新 + * @param beforeData 更新之前的数据 + * @param afterData 更新之后的数据 + */ + void processSkuUpdate(SkuVO beforeData, SkuVO afterData); + + /** + * 获取指定的sku及名称 + * @param skuId + * @return + */ + SkuVO getSkuAndNameById(long skuId); + + /** + * 根据skuIds获取sku信息 + * @param skuIds skuIds + * @return sku信息 + */ + List listBySkuIds(List skuIds); + + /** + * 根据商品编码集合获取skuVO集合 + * @param partyCodes 商品编码集合 + * @return skuVO集合 + */ + List listByPartyCodes(List partyCodes); + + /** + * 获取商家代销商品skuVO集合 + * @param supplierSkuIds 供应商skuId集合 + * @param shopId 店铺id + * @return 商家代销商品skuVO + */ + List listShopSaleSku(List supplierSkuIds, Long shopId); +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuStockFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuStockFeignClient.java new file mode 100644 index 0000000..50677be --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuStockFeignClient.java @@ -0,0 +1,91 @@ +package com.tmerclub.cloud.api.product.feign;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; +import java.util.Map; + +/** + * @author xxw + * @date 2022/11/17 15:24 + */ +public interface SkuStockFeignClient { + + /** + * 根据商品skuid和库存点获取库存点关联的商品库存 + * @param skuId + * @param stockPointId + * @return + */ + ServerResponseEntity> getStockMapBySkuIdAndStockPointIds(Long skuId, List stockPointId); + + /** + * 获取sku库存Map(key:skuId_stockPointId) + * @param skuStocks sku库存数据列表 + * @return sku库存Map(key:skuId_stockPointId) + */ + Map listSkuStock(List skuStocks); + + /** + * 修改sku库存 + * @param stockVOList sku库存VO + */ + void changeSkuStock(List stockVOList); + + /** + * 检查库存点集合是否含有该sku集合 + * @param stockPointIds 库存点id集合 + * @param skuIds skuId集合 + * @return 包含的skuId集合 + */ + List checkStockPointContainSku(List stockPointIds, List skuIds); + + /** + * 补充库存 + * @param spuId + * @param stockPointSkuVOList + * @return + */ + ServerResponseEntity addAndUpdateStockPoint(Long spuId, List stockPointSkuVOList); + /** + * 根据skuIds获取sku信息 + * @param skuIds skuIds + * @return sku信息 + */ + ServerResponseEntity> calculateStockByComboSpuList(List skuIds); + + /** + * 根据库存点id修改库存模式和库存 + * @param stockPointId + * @param stockMode 库存模式 1 共享库存 2 独立库存 + * @param type 共享库存模式(1同步到默认仓库 2库存清零),只有切换成共享库存模式才有值 + * @return + */ + ServerResponseEntity updateStockMode(Long stockPointId, Integer stockMode, Integer type); + + /** + * 加载商品库存数量 + * @param productSearchList + * @return + */ + ServerResponseEntity> loadProdStock(List productSearchList); + + /** + * 获取sku区域库存集合 + * @param productSearchList + * @return + */ + ServerResponseEntity> mapSkuPointStockByStockPoints(List productSearchList); +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SpuBrowseLogFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SpuBrowseLogFeignClient.java new file mode 100644 index 0000000..6d9bd78 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SpuBrowseLogFeignClient.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.feign; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public interface SpuBrowseLogFeignClient { + + /** + * 通过spuId需要搜索的商品 + * @param userId userId + * @param shopId 店铺id + * @return 浏览商品信息 + */ + ServerResponseEntity> recentBrowse(Long userId, Long shopId); + +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SpuCommFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SpuCommFeignClient.java new file mode 100644 index 0000000..efba4ef --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SpuCommFeignClient.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.feign; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author lhd + * @date 2020/11/12 + */ +public interface SpuCommFeignClient { + + /** + * 获取时间范围内的销量排序,放入redis并返回当前分页的商品信息 + * + * @param key + * @param shopId 店铺id + * @param time 时间范围内 + * @param expireTime + * @param esRenovationSpuSort + * @param primaryCategoryId + * @return + */ + ServerResponseEntity> getCommNumRankSpuIdsByShopIdAndTime(String key, Long shopId, + Integer time, Integer expireTime, + Integer esRenovationSpuSort, + Long primaryCategoryId); + +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/StockPointFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/StockPointFeignClient.java new file mode 100644 index 0000000..a5c51dd --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/StockPointFeignClient.java @@ -0,0 +1,36 @@ +package com.tmerclub.cloud.api.product.feign; + + +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author zp + */ +public interface StockPointFeignClient { + + /** + * 根据库存点id判断是否有库存数据 + * @param stockPointId + * @return + */ + ServerResponseEntity countStockList(Long stockPointId); + + /** + * 获取库存点sku集合 + * @param stockPointSkuDTO 库存点skuDTO + * @return 库存点sku集合 + */ + List listStockPointSku(StockPointSkuDTO stockPointSkuDTO); + + /** + * 更新库存点和商品关系(删除库存为0的关联数据,库存减少后调用) + * @param stockPointIds 库存点id集合 + * @param skuIds 商品skuId集合 + */ + void updateStockPointSkuRelate(List stockPointIds, List skuIds); + +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/manager/ShopCartAdapter.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/manager/ShopCartAdapter.java new file mode 100644 index 0000000..e15d44c --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/manager/ShopCartAdapter.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.manager; + +import com.google.common.collect.Lists; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.feign.OrderShopDetailFeignClient; +import com.tmerclub.cloud.common.order.util.OrderLangUtil; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 购物车适配器 + * @author FrozenWatermelon + * @date 2020/12/07 + */ +@Component +public class ShopCartAdapter { + + @DubboReference + private OrderShopDetailFeignClient orderShopDetailFeignClient; + private static final Logger logger = LoggerFactory.getLogger(ShopCartAdapter.class); + + /** + * 将参数转换成组装好的购物项 + * @param shopCartItems 订单参数 + * @return 组装好的购物项 + */ + public List conversionShopCart(List shopCartItems) { + // 根据店铺ID划分item + Map> shopCartMap = shopCartItems.stream().collect(Collectors.groupingBy(ShopCartItemVO::getShopId)); + + // 返回一个店铺的所有信息 + List shopCarts = Lists.newArrayList(); + for (Long shopId : shopCartMap.keySet()) { + // 构建每个店铺的购物车信息 + ShopCartVO shopCart = buildShopCart(shopId, shopCartMap.get(shopId)); + // 店铺信息 + ServerResponseEntity shopNameResponse = orderShopDetailFeignClient.getShopInfoInOrderByShopId(shopId); + if (!shopNameResponse.isSuccess()) { + logger.error("获取店铺信息失败,shopId:{}", shopId); + throw new LuckException(shopNameResponse.getMsg()); + } + ShopInfoInOrderVO shopInfo = shopNameResponse.getData(); + shopCart.setShopName(shopInfo.getShopName()); + shopCart.setShopType(shopInfo.getType()); + shopCarts.add(shopCart); + } + + return shopCarts; + } + + + private ShopCartVO buildShopCart(Long shopId, List shopCartItems) { + + ShopCartVO shopCart = new ShopCartVO(); + shopCart.setShopReduce(0L); + shopCart.setDiscountReduce(0L); + shopCart.setShopId(shopId); + long total = 0L; + long actualTotal = 0L; + long reduce = 0L; + int totalCount = 0; + long scoreTotal = 0L; + + for (ShopCartItemVO shopCartItem : shopCartItems) { + total += shopCartItem.getTotalAmount(); + actualTotal += shopCartItem.getActualTotal(); + reduce += shopCartItem.getShareReduce() != null ? shopCartItem.getShareReduce() : 0; + totalCount += shopCartItem.getCount(); + scoreTotal += shopCartItem.getScorePrice(); + } + + ShopCartItemDiscountVO shopCartItemDiscountVO = new ShopCartItemDiscountVO(); + shopCartItemDiscountVO.setShopCartItems(shopCartItems); + // 用于后续组装组合商品 + Set comboSkuIds = shopCartItems.stream().map(ShopCartItemVO::getMainComboSkuId).filter(mainComboSkuId -> Objects.nonNull(mainComboSkuId)).collect(Collectors.toSet()); + shopCartItemDiscountVO.setComboMainSkuIds(comboSkuIds); + shopCart.setShopCartItemDiscounts(Collections.singletonList(shopCartItemDiscountVO)); + shopCart.setTotal(total); + shopCart.setTotalCount(totalCount); + shopCart.setActualTotal(actualTotal); + shopCart.setDiscountReduce(0L); + shopCart.setShopReduce(reduce); + shopCart.setScoreTotal(scoreTotal); + return shopCart; + } + + /** + * 不可配送的商品添加店铺名称 + * @param shopCartOrderMerger 订单信息 + */ + public void setFilterShopItemsLong(ShopCartOrderMergerVO shopCartOrderMerger) { + List filterShopItemList = shopCartOrderMerger.getFilterShopItems(); + // 购物车项添加店铺名称 + OrderLangUtil.shopCartItemList(filterShopItemList); + for (ShopCartItemVO shopCartItemVO : filterShopItemList) { + if (Objects.equals(shopCartItemVO.getShopId(), 0L)) { + logger.info("店铺名称 平台是官方店"); + shopCartItemVO.setShopName("官方店"); + continue; + } + ServerResponseEntity shopNameResponse = orderShopDetailFeignClient.getShopInfoInOrderByShopId(shopCartItemVO.getShopId()); + if (!shopNameResponse.isSuccess()) { + logger.error("店铺名称获取失败"); + throw new LuckException(shopNameResponse.getMsg()); + } + ShopInfoInOrderVO shopInfo = shopNameResponse.getData(); + shopCartItemVO.setShopName(shopInfo.getShopName()); + } + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/util/ProductLangUtil.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/util/ProductLangUtil.java new file mode 100644 index 0000000..16a0fb7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/util/ProductLangUtil.java @@ -0,0 +1,352 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.order.vo.OrderSkuLangVO; +import com.tmerclub.cloud.common.order.vo.OrderSpuLangVO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.product.vo.app.BrandAppVO; +import com.tmerclub.cloud.common.util.LangUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 订单语言工具类 + * @author YXF + * @date 2021/05/19 + */ +public class ProductLangUtil { + + /* + ===========================spu=================================== + */ + + private final static Logger LOGGER = LoggerFactory.getLogger(ProductLangUtil.class); + + /** + * spu国际化信息 + * @param spuVO sku信息 + */ + public static void spu(SpuVO spuVO) { + handleSpu(spuVO); + } + + /** + * spu列表国际化信息 + * @param spuList spu列表 + */ + public static void spuList(List spuList) { + for (SpuVO spuVO : spuList) { + handleSpu(spuVO); + } + } + + /** + * 商品详情 + * + * @param spu + */ + public static void spuDetail(SpuVO spu) { + if (CollUtil.isEmpty(spu.getDetailList())) { + return; + } + Map map = spu.getDetailList().stream().collect(Collectors.toMap(SpuDetailVO::getLang, SpuDetailVO::getDetail)); + spu.setDetail(LangUtil.getLangValue(map)); + } + + /** + * 获取商品名称 + * @param spuVO 商品信息 + */ + private static void handleSpu(SpuVO spuVO) { + if (CollUtil.isEmpty(spuVO.getSpuLangList())) { + return; + } + Map spuNameMap = spuVO.getSpuLangList().stream().filter(spuLangVO -> StrUtil.isNotBlank(spuLangVO.getSpuName())).collect(Collectors.toMap(SpuLangVO::getLang, SpuLangVO::getSpuName)); + Map sellingPointMap = spuVO.getSpuLangList().stream().filter(spuLangVO -> StrUtil.isNotBlank(spuLangVO.getSellingPoint())).collect(Collectors.toMap(SpuLangVO::getLang, SpuLangVO::getSellingPoint)); + spuVO.setName(LangUtil.getLangValue(spuNameMap)); + spuVO.setSellingPoint(LangUtil.getLangValue(sellingPointMap)); +// spuVO.setSpuLangList(null); + } + + /* + ===========================sku=================================== + */ + + /** + * sku国际化信息 + * @param skuVO sku信息 + */ + public static void sku(SkuVO skuVO) { + handleSku(skuVO); + } + + /** + * sku国际化信息 + * @param skuList sku列表 + */ + public static void skuList(List skuList) { + for (SkuVO skuVO : skuList) { + handleSku(skuVO); + } + } + + /** + * 获取sku名称 + * @param skuVO sku信息 + */ + public static void handleSku(SkuVO skuVO) { + Map skuMap = skuVO.getSkuLangList().stream().filter(skuLangVO -> StrUtil.isNotBlank(skuLangVO.getSkuName())).collect(Collectors.toMap(SkuLangVO::getLang, SkuLangVO::getSkuName)); + skuVO.setSkuName(LangUtil.getLangValue(skuMap)); + skuVO.setSkuLangList(null); + if (CollUtil.isNotEmpty(skuVO.getSpuSkuAttrValues())) { + spuSkuAttrValueList(skuVO.getSpuSkuAttrValues()); + } + } + + + /* + ===========================sku属性信息=================================== + */ + + /** + * sku属性国际化信息 + * @param spuSkuAttrValueList sku属性列表 + */ + public static void spuSkuAttrValueList(List spuSkuAttrValueList) { + Integer lang = I18nMessage.getLang(); + for (SpuSkuAttrValueVO spuSkuAttrValueVO : spuSkuAttrValueList) { + handleSpuSkuAttrValue(spuSkuAttrValueVO, lang); + } + } + + /** + * sku属性国际化信息 + * @param spuSkuAttrValueList sku属性列表 + */ + public static void spuSkuAttrValueList(List spuSkuAttrValueList, Integer lang) { + for (SpuSkuAttrValueVO spuSkuAttrValueVO : spuSkuAttrValueList) { + handleSpuSkuAttrValue(spuSkuAttrValueVO, lang); + } + } + + /** + * 获取sku属性名称 + * @param spuSkuAttrValueVO sku属性信息 + */ + public static void handleSpuSkuAttrValue(SpuSkuAttrValueVO spuSkuAttrValueVO, Integer lang) { + if (CollUtil.isEmpty(spuSkuAttrValueVO.getSpuSkuAttrValueLangList())) { + return; + } + Map map = spuSkuAttrValueVO.getSpuSkuAttrValueLangList().stream().collect(Collectors.toMap(SpuSkuAttrValueLangVO::getLang, s -> s)); + if (MapUtil.isEmpty(map)) { + return; + } + SpuSkuAttrValueLangVO spuSkuAttrValueLangVO; + if (Objects.nonNull(map.get(lang))) { + spuSkuAttrValueLangVO = map.get(lang); + } else { + spuSkuAttrValueLangVO = map.get(Constant.DEFAULT_LANG); + } + spuSkuAttrValueVO.setAttrName(spuSkuAttrValueLangVO.getAttrName()); + spuSkuAttrValueVO.setAttrValueName(spuSkuAttrValueLangVO.getAttrValueName()); + } + + /* + ===========================属性=================================== + */ + + /** + * 属性国际化信息 + * @param attrVO 属性信息 + */ + public static void attr(AttrVO attrVO) { + handleAttr(attrVO); + } + + /** + * 属性国际化信息 + * @param attrList 属性列表 + */ + public static void attrList(List attrList) { + for (AttrVO attrVO : attrList) { + handleAttr(attrVO); + } + } + + /** + * 获取分类名称 + * @param attrVO 属性国际化信息列表 + */ + public static void handleAttr(AttrVO attrVO) { + Map attrNameMap = attrVO.getAttrLangList().stream().collect(Collectors.toMap(AttrLangVO::getLang, AttrLangVO::getName)); + Map attrDescMap = attrVO.getAttrLangList().stream().collect(Collectors.toMap(AttrLangVO::getLang, AttrLangVO::getName)); + attrVO.setName(LangUtil.getLangValue(attrNameMap)); + attrVO.setDesc(LangUtil.getLangValue(attrDescMap)); + for (AttrValueVO attrValue : attrVO.getAttrValues()) { + Map valueMap = attrValue.getValues().stream().collect(Collectors.toMap(AttrValueLangVO::getLang, AttrValueLangVO::getValue)); + attrValue.setValue(LangUtil.getLangValue(valueMap)); + } + } + + /* + ===========================分类=================================== + */ + + /** + * 分类国际化信息 + * @param categoryVO 分类信息 + */ + public static void category(CategoryVO categoryVO) { + handleCategory(categoryVO); + } + + /** + * 分类国际化信息 + * @param categoryList 分类列表 + */ + public static void categoryList(List categoryList) { + for (CategoryVO categoryVO : categoryList) { + category(categoryVO); + } + } + + /** + * 处理分类国际化信息 + * @param categoryVO 分类国际化信息列表 + */ + public static void handleCategory(CategoryVO categoryVO) { + if (Objects.isNull(categoryVO) || CollUtil.isEmpty(categoryVO.getCategoryLangList())) { + return; + } + Integer lang = I18nMessage.getLang(); + for (CategoryLangVO categoryLangVO : categoryVO.getCategoryLangList()) { + // 国际化目前默认名称为中文 + if (Objects.equals(categoryLangVO.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + categoryVO.setName(categoryLangVO.getName()); + categoryVO.setParentName(categoryLangVO.getParentName()); + } + LOGGER.info("分类语言数据:{},语言数据:{}", categoryLangVO, lang); + if (Objects.equals(categoryLangVO.getLang(), lang)) { + categoryVO.setName(categoryLangVO.getName()); + categoryVO.setParentName(categoryLangVO.getParentName()); + break; + } + } + categoryVO.setCategoryLangList(null); + } + + /* + ===========================品牌=================================== + */ + + /** + * 品牌国际化信息 + * @param brandVO 品牌信息 + */ + public static void brand(BrandVO brandVO) { + if (Objects.isNull(brandVO)) { + return; + } + handelBrand(brandVO); + } + + + /** + * 品牌国际化信息 + * @param brandList 品牌信息 + */ + public static void brandList(List brandList) { + if (CollUtil.isEmpty(brandList)) { + return; + } + for (BrandVO brandVO : brandList) { + handelBrand(brandVO); + } + } + + + /** + * 品牌国际化信息 + * @param brandList 品牌信息 + */ + public static void brandAppList(List brandList) { + if (CollUtil.isEmpty(brandList)) { + return; + } + for (BrandAppVO brandVO : brandList) { + handelBrand(brandVO); + } + } + + + /** + * 处理分类国际化信息 + * @param brandVO 品牌信息 + */ + public static void handelBrand(BrandVO brandVO) { + BrandLangVO brandLangVO = handelBrandLang(brandVO.getBrandLangList()); + if (Objects.isNull(brandLangVO)) { + return; + } + brandVO.setName(brandLangVO.getName()); + brandVO.setDesc(brandLangVO.getDesc()); + brandVO.setBrandLangList(null); + } + + /** + * 处理分类国际化信息 + * @param brandVO 品牌信息 + */ + public static void handelBrand(BrandAppVO brandVO) { + BrandLangVO brandLangVO = handelBrandLang(brandVO.getLangList()); + brandVO.setName(brandLangVO.getName()); + brandVO.setLangList(null); + } + + /** + * 处理分类国际化信息 + * @param brandLangList 品牌语言列表信息 + */ + public static BrandLangVO handelBrandLang(List brandLangList) { + Map map = brandLangList.stream().collect(Collectors.toMap(BrandLangVO::getLang, b -> b)); + BrandLangVO brandLangVO = map.get(I18nMessage.getLang()); + if (Objects.isNull(brandLangVO)) { + brandLangVO = map.get(Constant.DEFAULT_LANG); + } + return brandLangVO; + } + + /** + * 处理购物车项国际化信息 + * @param shopCartItems + */ + public static void shopCartItemList(List shopCartItems) { + for (ShopCartItemVO shopCartItem : shopCartItems) { + Map spuMap = shopCartItem.getSpuLangList().stream().collect(Collectors.toMap(OrderSpuLangVO::getLang, OrderSpuLangVO::getSpuName)); + Map skuMap = shopCartItem.getSkuLangList().stream().collect(Collectors.toMap(OrderSkuLangVO::getLang, OrderSkuLangVO::getSkuName)); + shopCartItem.setSpuName(LangUtil.getLangValue(spuMap)); + shopCartItem.setSkuName(LangUtil.getLangValue(skuMap)); + } + + } +} diff --git a/tmerclub-api/tmerclub-api-search/pom.xml b/tmerclub-api/tmerclub-api-search/pom.xml new file mode 100644 index 0000000..e7c1b9b --- /dev/null +++ b/tmerclub-api/tmerclub-api-search/pom.xml @@ -0,0 +1,34 @@ + + + + tmerclub-api + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api-search + jar + 搜索对内接口 + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + com.moyuer.cloud + tmerclub-common-product + ${project.version} + + + com.moyuer.cloud + tmerclub-common-order + ${project.version} + + + + + diff --git a/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/constant/EsRenovationProductSortEnum.java b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/constant/EsRenovationProductSortEnum.java new file mode 100644 index 0000000..0b1f442 --- /dev/null +++ b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/constant/EsRenovationProductSortEnum.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.constant; + + +/** + * 装修商品排序 + * @author lhd + * @date 2023/01/30 + */ +public enum EsRenovationProductSortEnum { + + /** + * 上架时间升序 + */ + CREATE_TIME_ASC(0, "createTime"), + + /** + * 上架时间降序 + */ + CREATE_TIME_DESC(1, "createTime"), + + /** + * 销量倒序 + */ + SALE_NUM_DESC(2, "saleNum"), + + /** + * 销量正序 + */ + SALE_NUM_ASC(3, "saleNum"), + + /** + * 评论数量倒序 + */ + COMMENT_NUM_DESC(4, "commentNum"), + + /** + * 评论数量正序 + */ + COMMENT_NUM_ASC(5, "commentNum"), + ; + + private final Integer value; + + private final String param; + + + public Integer value() { + return value; + } + + EsRenovationProductSortEnum(Integer value, String param) { + this.value = value; + this.param = param; + } + + public String param() { + return param; + } +} diff --git a/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/dto/PurchaseOrderUpdateDTO.java b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/dto/PurchaseOrderUpdateDTO.java new file mode 100644 index 0000000..8ab7a5b --- /dev/null +++ b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/dto/PurchaseOrderUpdateDTO.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author FrozenWatermelon + */ +public class PurchaseOrderUpdateDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "采购id") + private Long purchaseOrderId; + + @Schema(description = "状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成") + private Integer status; + + public PurchaseOrderUpdateDTO() { + } + + public PurchaseOrderUpdateDTO(Long purchaseOrderId, Integer status) { + this.purchaseOrderId = purchaseOrderId; + this.status = status; + } + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "PurchaseOrderUpdateDTO{" + + "purchaseOrderId=" + purchaseOrderId + + ", status=" + status + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/EsOrderFeignClient.java b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/EsOrderFeignClient.java new file mode 100644 index 0000000..3332c2b --- /dev/null +++ b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/EsOrderFeignClient.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.feign; + + +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; + +import java.util.List; + + +/** + * 订单搜索 + * + * @author FrozenWatermelon + * @date 2021/02/05 + */ +public interface EsOrderFeignClient { + /** + * 分页获取订单信息 + * + * @param orderId + * @return + */ + void updateOrder(Long orderId); + + + /** + * 获取待发货订单 + * @param orderSearchDTO + * @return + */ + List getUndeliveryOrder(OrderSearchDTO orderSearchDTO); + + +} diff --git a/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderRefundTaskFeignClient.java b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderRefundTaskFeignClient.java new file mode 100644 index 0000000..45e4098 --- /dev/null +++ b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderRefundTaskFeignClient.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.feign; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * 搜索符合定时任务条件的订单 + * @author FrozenWatermelon + * @date 2021/02/05 + */ +public interface SearchOrderRefundTaskFeignClient { + /** + * 取消申请超时的订单,无论该超时订单处于任何状态 + * @return + */ + ServerResponseEntity cancelWhenTimeOut(); + + /** + * 退款临近超时提醒 + * @return + */ + ServerResponseEntity pressProximityTimeOutOrder(); + + /** + * 发放退款 + * @return + */ + ServerResponseEntity refundRequest(); + + /** + * 执行一下平台介入超时处理,超时则默认平台不同意退款 + * @return + */ + ServerResponseEntity cancelRefundInterventionTimeOut(); + +} diff --git a/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderTaskFeignClient.java b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderTaskFeignClient.java new file mode 100644 index 0000000..69db23d --- /dev/null +++ b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderTaskFeignClient.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.feign; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * 搜索符合定时任务条件的订单 + * @author FrozenWatermelon + * @date 2021/02/05 + */ +public interface SearchOrderTaskFeignClient { + /** + * 订单结算 + * @return + */ + ServerResponseEntity settledOrder(); + + /** + * 确认收货 + * @return + */ + ServerResponseEntity confirmOrder(); + + /** + * 预售订单,尾款时间开始时尾款金额为0的处理 + * @return + */ + ServerResponseEntity handlerBalanceTimeStartOrder(); + + /** + * 预售订单,尾款时间过期未支付时的处理 + * @return + */ + ServerResponseEntity handleBalanceTimeExpireOrder(); + + + /** + * 采购订单,过期未支付时的处理 + * @return + */ + ServerResponseEntity checkPurchaseOrderPayStatus(); +} diff --git a/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchPurchaseOrderFeignClient.java b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchPurchaseOrderFeignClient.java new file mode 100644 index 0000000..0b24208 --- /dev/null +++ b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchPurchaseOrderFeignClient.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.feign; + +import com.tmerclub.cloud.api.dto.PurchaseOrderUpdateDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.order.dto.PurchaseOrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsPurchaseOrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * 采购订单搜索 + * @author FrozenWatermelon + * @date 2021/02/05 + */ +public interface SearchPurchaseOrderFeignClient { + + /** + * 分页获取采购订单信息 + * @param purchaseOrderSearchDTO + * @return + */ + ServerResponseEntity> pagePurchaseOrder(PurchaseOrderSearchDTO purchaseOrderSearchDTO); + + /** + * 更新采购订单状态 + * @param purchaseOrder + */ + void updatePurchaseOrderStatus(PurchaseOrderUpdateDTO purchaseOrder); +} diff --git a/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchSpuFeignClient.java b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchSpuFeignClient.java new file mode 100644 index 0000000..796761a --- /dev/null +++ b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchSpuFeignClient.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.feign; + +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.dto.ProductSearchLimitDTO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; +import java.util.Map; + +/** + * 商品搜索feign连接 + * @author YXF + * @date 2020/12/07 + */ +public interface SearchSpuFeignClient { + + /** + * 商品搜索 + * @param productSearch + * @return + */ + ServerResponseEntity> search(ProductSearchDTO productSearch); + + /** + * 根据spuId列表, 获取spu列表信息 + * @param spuIds 商品id列表 + * @return 商品列表 + */ + ServerResponseEntity> listSpuBySpuIds(List spuIds); + + /** + * 根据店铺,获取商品分页信息 + * @param pageNum 分页数 + * @param pageSize 每页大小 + * @param shopId 店铺id + * @return + */ + ServerResponseEntity> spuPage(Integer pageNum, Integer pageSize, Long shopId); + + /** + * 后台商品搜索 + * @param productSearch 搜索筛选条件 + * @return 商品分页信息 + */ + ServerResponseEntity> adminPage(ProductSearchDTO productSearch); + + /** + * 获取指定数量的的spu列表 + * @param productSearchLimitDTO + * @return + */ + ServerResponseEntity> limitSpuList(ProductSearchLimitDTO productSearchLimitDTO); + + /** + * 根据id列表,获取每个id指定数量的spu列表 + * @param productSearchLimitDTO + * @return + */ + ServerResponseEntity>> limitSpuMap(ProductSearchLimitDTO productSearchLimitDTO); + + /** + * 获取不为删除状态的商品列表 + * @param spuIds + * @return + */ + ServerResponseEntity> listNotDeleteSpu(List spuIds); + + /** + * 商品列表(仅包含商品id,更新时间) + * @param productSearchDTO + * @return + */ + ServerResponseEntity> simpleList(ProductSearchDTO productSearchDTO); + + /** + * 获取要导出的平台商品列表 + * @param productSearchDTO + * @return + */ + ServerResponseEntity> listExcelPlatformSpu(ProductSearchDTO productSearchDTO); + +// /** +// * 根据spuIds校验状态 +// * +// * @param spuIds +// * @return +// */ +// ServerResponseEntity checkSpuStatus(List spuIds); + + /** + * 批量更新 + * @param spuList + */ + void batchUpdateStockAndSaleNum(List spuList); +} diff --git a/tmerclub-api/tmerclub-api-seckill/src/main/java/com/tmerclub/cloud/api/seckill/dto/SecKillRefundDTO.java b/tmerclub-api/tmerclub-api-seckill/src/main/java/com/tmerclub/cloud/api/seckill/dto/SecKillRefundDTO.java new file mode 100644 index 0000000..8e3d7cd --- /dev/null +++ b/tmerclub-api/tmerclub-api-seckill/src/main/java/com/tmerclub/cloud/api/seckill/dto/SecKillRefundDTO.java @@ -0,0 +1,68 @@ +package com.tmerclub.cloud.api.seckill.dto; + +import com.tmerclub.cloud.common.order.bo.RefundReductionStockBO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +/** + * @author lanhai + */ +public class SecKillRefundDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 秒杀活动Id + */ + private Long activityId; + /** + * 用户id + */ + private Long userId; + /** + * 退款商品信息 + */ + private List refundReductionStocks; + + public SecKillRefundDTO() { + } + + public SecKillRefundDTO(Long activityId, List refundReductionStocks,Long userId) { + this.activityId = activityId; + this.userId = userId; + this.refundReductionStocks = refundReductionStocks; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public List getRefundReductionStocks() { + return refundReductionStocks; + } + + public void setRefundReductionStocks(List refundReductionStocks) { + this.refundReductionStocks = refundReductionStocks; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "SecKillRefundDTO{" + + "activityId=" + activityId + + ", userId=" + userId + + ", refundReductionStocks=" + refundReductionStocks + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-seckill/src/main/java/com/tmerclub/cloud/api/seckill/feign/SeckillFeignClient.java b/tmerclub-api/tmerclub-api-seckill/src/main/java/com/tmerclub/cloud/api/seckill/feign/SeckillFeignClient.java new file mode 100644 index 0000000..ca3c0df --- /dev/null +++ b/tmerclub-api/tmerclub-api-seckill/src/main/java/com/tmerclub/cloud/api/seckill/feign/SeckillFeignClient.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.seckill.feign; + +import com.tmerclub.cloud.api.seckill.vo.SeckillApiVO; +import com.tmerclub.cloud.common.order.vo.OrderCountVO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.product.vo.SekillActivitySpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; +import java.util.Map; + +/** + * @author YXF + * @date 2021/3/29 + */ +public interface SeckillFeignClient { + + /** + * 根据商品id获取秒杀商品信息 + * @param selectedLot 所选批次 + * @param spuIds 商品ids + * @return 秒杀商品信息 + */ + ServerResponseEntity> seckillSpuListBySpuIds(Integer selectedLot, List spuIds); + + /** + * 根据活动d获取秒杀商品信息 + * @param activityId 活动id + * @return 秒杀商品信息 + */ + ServerResponseEntity getSeckillInfoById(Long activityId); + + /** + * 根据商品ids下线所有的秒杀活动 + * + * @param spuIds 商品ids + * @param updateSpu 是否修改商品信息 + * @return 返回结果 + */ + ServerResponseEntity offlineSeckillBySpuIds(List spuIds, Boolean updateSpu); + + /** + * 根据店铺id下线所有的秒杀活动 + * @param shopId 店铺id + * @return 返回结果 + */ + ServerResponseEntity offlineSeckillByShopId(Long shopId); + + /** + * 获取缓存中的秒杀订单 + * @param orderId + * @param userId + * @return + */ + ServerResponseEntity getSeckillOrderByRedis(Long orderId, Long userId); + + /** + * 获取缓存中的秒杀订单 + * @param userId + * @return + */ + ServerResponseEntity> mapSeckillOrderByUserIdAndRedis(Long userId); + + /** + * 更新秒杀订单状态 + * + * @param orderId + * @param userId + * @param status + */ + void updateRedisSeckillOrderStatus(Long orderId, Long userId, Integer status); + + /** + * 获取当前用户秒杀订单中可能存在的数量 + * @param userId + * @return + */ + ServerResponseEntity countRedisSeckillOrder(Long userId); + + /** + * 删除redis中该订单信息 + * @param userId + * @param orderId + * @return + */ + ServerResponseEntity deleteRedisOrderByUserIdAndOrderId(Long userId, Long orderId); +} diff --git a/tmerclub-api/tmerclub-api-user/pom.xml b/tmerclub-api/tmerclub-api-user/pom.xml new file mode 100644 index 0000000..6e50a63 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/pom.xml @@ -0,0 +1,38 @@ + + + + tmerclub-api + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api-user + jar + 用户对内接口 + + + com.moyuer.cloud + tmerclub-common-order + ${project.version} + + + com.moyuer.cloud + tmerclub-api-marketing + ${project.version} + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + com.moyuer.cloud + tmerclub-api-payment + ${project.version} + + + + diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/BalanceRefundBO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/BalanceRefundBO.java new file mode 100644 index 0000000..269cbf7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/BalanceRefundBO.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 退款成功通知 + * @author FrozenWatermelon + */ +public class BalanceRefundBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long refundId; + + private Long changeBalance; + + private Long payId; + + private Long userId; + /** + * 退款序号 + */ + private Integer refundNumber; + + /** + * 支付系统类型 + */ + private Integer paySysType; + + public Integer getRefundNumber() { + return refundNumber; + } + + public void setRefundNumber(Integer refundNumber) { + this.refundNumber = refundNumber; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getChangeBalance() { + return changeBalance; + } + + public void setChangeBalance(Long changeBalance) { + this.changeBalance = changeBalance; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "BalanceRefundBO{" + + "refundId=" + refundId + + ", changeBalance=" + changeBalance + + ", payId=" + payId + + ", userId=" + userId + + ", refundNumber=" + refundNumber + + ", paySysType=" + paySysType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/RechargeNotifyBO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/RechargeNotifyBO.java new file mode 100644 index 0000000..801ecc6 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/RechargeNotifyBO.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 充值成功通知 + * @author FrozenWatermelon + */ +public class RechargeNotifyBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long balanceLogId; + + private Integer payType; + + private Long payId; + + public RechargeNotifyBO() { + } + + public RechargeNotifyBO(Long balanceLogId, Integer payType, Long payId) { + this.balanceLogId = balanceLogId; + this.payType = payType; + this.payId = payId; + } + + public Long getBalanceLogId() { + return balanceLogId; + } + + public void setBalanceLogId(Long balanceLogId) { + this.balanceLogId = balanceLogId; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + @Override + public String toString() { + return "RechargeNotifyBO{" + + "rechargeLogId=" + balanceLogId + + ", payType=" + payType + + ", payId=" + payId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserOrderStatisticBO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserOrderStatisticBO.java new file mode 100644 index 0000000..84f6578 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserOrderStatisticBO.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户相关订单统计数据 + * @author: cl + * @date: 2021-04-14 14:04:01 + */ +public class UserOrderStatisticBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "时间") + private String timeData; + + @Schema(description = "最近消费时间") + private Date reConsTime; + + @Schema(description = "消费金额") + private Double consAmount; + + @Schema(description = "实付金额") + private Long actualAmount; + + @Schema(description = "消费次数") + private Integer consTimes; + + @Schema(description = "消费人数") + private Integer payUserCount; + + @Schema(description = "平均折扣") + private Double averDiscount; + + @Schema(description = "售后金额") + private Double afterSaleAmount; + + @Schema(description = "售后次数") + private Integer afterSaleTimes; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Date getReConsTime() { + return reConsTime; + } + + public void setReConsTime(Date reConsTime) { + this.reConsTime = reConsTime; + } + + public Double getConsAmount() { + return consAmount; + } + + public void setConsAmount(Double consAmount) { + this.consAmount = consAmount; + } + + public Long getActualAmount() { + return actualAmount; + } + + public void setActualAmount(Long actualAmount) { + this.actualAmount = actualAmount; + } + + public Integer getConsTimes() { + return consTimes; + } + + public void setConsTimes(Integer consTimes) { + this.consTimes = consTimes; + } + + public Double getAverDiscount() { + return averDiscount; + } + + public void setAverDiscount(Double averDiscount) { + this.averDiscount = averDiscount; + } + + public Double getAfterSaleAmount() { + return afterSaleAmount; + } + + public void setAfterSaleAmount(Double afterSaleAmount) { + this.afterSaleAmount = afterSaleAmount; + } + + public Integer getAfterSaleTimes() { + return afterSaleTimes; + } + + public void setAfterSaleTimes(Integer afterSaleTimes) { + this.afterSaleTimes = afterSaleTimes; + } + + public Integer getPayUserCount() { + return payUserCount; + } + + public void setPayUserCount(Integer payUserCount) { + this.payUserCount = payUserCount; + } + + public String getTimeData() { + return timeData; + } + + public void setTimeData(String timeData) { + this.timeData = timeData; + } + + @Override + public String toString() { + return "UserOrderStatisticBO{" + + "userId=" + userId + + ", timeData=" + timeData + + ", reConsTime=" + reConsTime + + ", consAmount=" + consAmount + + ", actualAmount=" + actualAmount + + ", consTimes=" + consTimes + + ", payUserCount=" + payUserCount + + ", averDiscount=" + averDiscount + + ", afterSaleAmount=" + afterSaleAmount + + ", afterSaleTimes=" + afterSaleTimes + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserOrderStatisticListBO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserOrderStatisticListBO.java new file mode 100644 index 0000000..5c48867 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserOrderStatisticListBO.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 用户相关订单统计数据 + * @author: cl + * @date: 2021-04-14 14:04:01 + */ +public class UserOrderStatisticListBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "老会员总成交数据") + private UserOrderStatisticBO oldUserOrderStatistic; + @Schema(description = "新会员总成交数据") + private UserOrderStatisticBO newUserOrderStatistic; + + @Schema(description = "老会员成交数据列表") + private List oldUserOrderStatisticList; + @Schema(description = "新会员成交数据列表") + private List newUserOrderStatisticList; + + public List getOldUserOrderStatisticList() { + return oldUserOrderStatisticList; + } + + public void setOldUserOrderStatisticList(List oldUserOrderStatisticList) { + this.oldUserOrderStatisticList = oldUserOrderStatisticList; + } + + public List getNewUserOrderStatisticList() { + return newUserOrderStatisticList; + } + + public void setNewUserOrderStatisticList(List newUserOrderStatisticList) { + this.newUserOrderStatisticList = newUserOrderStatisticList; + } + + public UserOrderStatisticBO getOldUserOrderStatistic() { + return oldUserOrderStatistic; + } + + public void setOldUserOrderStatistic(UserOrderStatisticBO oldUserOrderStatistic) { + this.oldUserOrderStatistic = oldUserOrderStatistic; + } + + public UserOrderStatisticBO getNewUserOrderStatistic() { + return newUserOrderStatistic; + } + + public void setNewUserOrderStatistic(UserOrderStatisticBO newUserOrderStatistic) { + this.newUserOrderStatistic = newUserOrderStatistic; + } + + @Override + public String toString() { + return "UserOrderStatisticListBO{" + + "oldUserOrderStatistic=" + oldUserOrderStatistic + + ", newUserOrderStatistic=" + newUserOrderStatistic + + ", oldUserOrderStatisticList=" + oldUserOrderStatisticList + + ", newUserOrderStatisticList=" + newUserOrderStatisticList + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserScoreBO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserScoreBO.java new file mode 100644 index 0000000..8658ea3 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserScoreBO.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.bo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/22 + */ +public class UserScoreBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long userId; + + private Integer payType; + + private List orderIds; + + /** + * 是否解锁积分 + */ + private Boolean isUnLock; + + /** + * 判断是否取消订单 + */ + private Boolean flag; + + public Boolean getFlag() { + return flag; + } + + public void setFlag(Boolean flag) { + this.flag = flag; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public List getOrderIds() { + return orderIds; + } + + public void setOrderIds(List orderIds) { + this.orderIds = orderIds; + } + + public Boolean getUnLock() { + return isUnLock; + } + + public void setUnLock(Boolean unLock) { + isUnLock = unLock; + } + + @Override + public String toString() { + return "UserScoreBO{" + + "userId=" + userId + + ", payType=" + payType + + ", orderIds=" + orderIds + + ", isUnLock=" + isUnLock + + ", flag=" + flag + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/MemberReqDTO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/MemberReqDTO.java new file mode 100644 index 0000000..85d3da7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/MemberReqDTO.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author lhd + */ +public class MemberReqDTO extends CustomerReqDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "0 全部会员 1免费会员(普通会员) 2付费会员") + private Integer memberType; + + @Schema(description = "符合条件的userIds") + private List userIds; + + @Schema(description = "几年前") + private Date beforeYear; + public MemberReqDTO() { + } + + public MemberReqDTO(Date startTime, Date endTime) { + super(startTime, endTime); + } + + + public Date getBeforeYear() { + return beforeYear; + } + + public void setBeforeYear(Date beforeYear) { + this.beforeYear = beforeYear; + } + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + + public Integer getMemberType() { + return memberType; + } + + public void setMemberType(Integer memberType) { + this.memberType = memberType; + } + + + @Override + public String toString() { + return "MemberReqDTO{" + + "memberType=" + memberType + + ", userIds=" + userIds + + ", beforeYear=" + beforeYear + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/UserScoreLockDTO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/UserScoreLockDTO.java new file mode 100644 index 0000000..0d3d19d --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/UserScoreLockDTO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/12/22 + */ +public class UserScoreLockDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull(message = "orderId不能为空") + @Schema(description = "orderId", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + @NotNull(message = "积分数量不能为空") + @Min(value = 1, message = "积分数量不能为空") + @Schema(description = "积分数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Long score; + + + private Integer orderType; + + public UserScoreLockDTO() { + } + + public UserScoreLockDTO(Long orderId, Long score, Integer orderType) { + this.orderId = orderId; + this.score = score; + this.orderType = orderType; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + @Override + public String toString() { + return "UserScoreLockDTO{" + + "orderId=" + orderId + + ", score=" + score + + ", orderType=" + orderType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/PopupFeignClient.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/PopupFeignClient.java new file mode 100644 index 0000000..f50ef56 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/PopupFeignClient.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.feign; + +import com.tmerclub.cloud.api.coupon.vo.CouponDataVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * 弹窗广告 + * @author TRACK + */ +public interface PopupFeignClient { + + /** + * 把下架商品从弹窗广告关联删除 + * @param spuId + * @param shopId + * @return + */ + ServerResponseEntity deletePopupProd(Long spuId, Long shopId); + + /** + * 关联页面删除后将弹窗广告失效 + * @param linkId + * @param shopId + * @param type + * @param categoryIds 分类下架用 + * @return + */ + ServerResponseEntity deleteLink(Long linkId, Long shopId, String type, List categoryIds); + + /** + * 关联页面删除后将弹窗广告失效 + * @param couponList + * @return + */ + ServerResponseEntity deleteLinkBatch(List couponList); + + /** + * 店铺批量停业 + * @param shopIds + * @return + */ + ServerResponseEntity deleteShopLinkBatch(List shopIds); + + /** + * 下架商家 + * @param shopId + * @return + */ + ServerResponseEntity offlineShop(Long shopId); +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserAddrFeignClient.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserAddrFeignClient.java new file mode 100644 index 0000000..c89a507 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserAddrFeignClient.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.feign; + +import com.tmerclub.cloud.common.order.vo.UserAddrVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * 用户地址feign连接 + * @author FrozenWatermelon + * @date 2020/12/07 + */ +public interface UserAddrFeignClient { + + + /** + * 根据地址id获取用户地址信息 + * @param addrId 地址id + * @return 用户地址信息 + */ + ServerResponseEntity getUserAddrByAddrId(Long addrId); + + /** + * 根据用户id获取默认地址 + * @param userId + * @return + */ + ServerResponseEntity getUserAddrByUserId(Long userId); + +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserBalanceLogFeignClient.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserBalanceLogFeignClient.java new file mode 100644 index 0000000..400e81a --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserBalanceLogFeignClient.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.feign; + +import com.tmerclub.cloud.api.payment.vo.ShopAccountDetailVO; +import com.tmerclub.cloud.api.user.bo.BalancePayBO; +import com.tmerclub.cloud.api.user.bo.BalanceRefundBO; +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailExcelVO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.api.user.vo.UserPayInfoVO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.Date; +import java.util.List; + +/** + * 充值信息 + * @author FrozenWatermelon + */ +public interface UserBalanceLogFeignClient { + + /** + * 获取充值金额 + * @param balanceLogId 充值记录id + * @return + */ + ServerResponseEntity getPayAmount(Long balanceLogId); + + /** + * 获取充值记录是否已经支付 + * @param balanceLogId 充值记录id + * @return + */ + ServerResponseEntity getIsPay(Long balanceLogId); + + + /** + * 余额支付记录 + * @param balancePayBO 记录信息 + * @return + */ + ServerResponseEntity insertBalancePayLog(BalancePayBO balancePayBO); + + /** + * 余额退款记录 + 执行退款 + * @param balanceRefundBO 记录信息 + * @return + */ + ServerResponseEntity doRefund(BalanceRefundBO balanceRefundBO); + + /** + * 分页获取余额充值财务对账信息 + * @param financeDetailDTO + * @return + */ + ServerResponseEntity> pageFinanceDetail(FinanceDetailDTO financeDetailDTO); + + /** + * 获取余额充值财务对账信息 + * @param financeDetailDTO + * @return + */ + ServerResponseEntity> listFinanceDetail(FinanceDetailDTO financeDetailDTO); + + /** + * 获取平台财务信息 + * @param startTime + * @param endTime + * @return + */ + ServerResponseEntity getPlatformAccountDetail(Date startTime, + Date endTime); + + /** + * 获取用户充值,购买会员财务信息 + * @param startTime + * @param endTime + * @param financeType + * @param pageSize + * @param pageNum + * @return + */ + ServerResponseEntity> pageUserPayInfo(Date startTime, + Date endTime, + Integer financeType, + Integer pageSize, + Integer pageNum); + + /** + * 获取用户充值,购买会员财务信息 + * @param startTime + * @param endTime + * @param financeType + * @return + */ + ServerResponseEntity> listUserPayInfo(Date startTime, + Date endTime, + Integer financeType); + + /** + * 扣减用户余额,更新余额支付记录为支付成功 + * @param payId + * @return + */ + ServerResponseEntity updateToOrderPaySuccess(Long payId); +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserLevelAndScoreOrderFeignClient.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserLevelAndScoreOrderFeignClient.java new file mode 100644 index 0000000..96a1f34 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserLevelAndScoreOrderFeignClient.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.feign; + +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * 用户等级积分订单计算feign连接 + * @author FrozenWatermelon + * @date 2021/05/10 + */ +public interface UserLevelAndScoreOrderFeignClient { + + + /** + * 计算订单等级和积分优惠 + * @param shopCartOrderMerger 订单信息 + * @return + */ + ServerResponseEntity calculateLevelAndScoreDiscount(ShopCartOrderMergerVO shopCartOrderMerger); + + /** + * 获取财务对账退款积分 + * @param refundIds + * @return + */ + ServerResponseEntity getScoreCount(List refundIds); + + /** + * 获取该用户是否具有平台会员包邮权益 + * @param userId + * @param shopId + * @return + */ + ServerResponseEntity getHaveFreeFeeRight(Long userId, Long shopId); +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserLevelLogFeignClient.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserLevelLogFeignClient.java new file mode 100644 index 0000000..05073a1 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserLevelLogFeignClient.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.feign; + +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.dto.UserTypeDTO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailExcelVO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * 会员等级日志 + * @author FrozenWatermelon + */ +public interface UserLevelLogFeignClient { + + /** + * 获取会员等级购买金额,并生成购买vip的订单 + * @param userLevelLogId 会员等级购买记录id + * @return + */ + ServerResponseEntity getPayAmount(Long userLevelLogId); + + /** + * 获取会员等级购买记录是否已经支付 + * @param userLevelLogId 会员等级购买记录id + * @return + */ + ServerResponseEntity getIsPay(Long userLevelLogId); + + /** + * 获取指定时间内的用户类型 + * @param userTypeDTO + * @return + */ + UserApiVO getUserTypeAndUserNameAtTime(UserTypeDTO userTypeDTO); + + /** + * 获取会员购买财务对账信息 + * @param financeDetailDTO + * @return + */ + ServerResponseEntity> pageFinanceDetail(FinanceDetailDTO financeDetailDTO); + + /** + * 获取会员购买财务对账信息 + * @param financeDetailDTO + * @return + */ + ServerResponseEntity> listFinanceDetail(FinanceDetailDTO financeDetailDTO); +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/FinanceDetailExcelVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/FinanceDetailExcelVO.java new file mode 100644 index 0000000..70e9f82 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/FinanceDetailExcelVO.java @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 财务明细excel信息 + * + * @author TRACK + */ +public class FinanceDetailExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "财务明细报表"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") + @ExcelProperty({"财务明细报表", "交易时间"}) + private Date transDate; + + @ExcelProperty({"财务明细报表", "订单编号"}) + private String orderId; + + @ExcelProperty({"财务明细报表", "下单时间"}) + private Date placeTime; + + @ExcelProperty({"财务明细报表", "交易摘要"}) + private String prodName; + + @ExcelProperty({"财务明细报表", "发生渠道"}) + private String shopName; + + @ExcelProperty({"财务明细报表", "资金变更申请人"}) + private String userName; + + /** + * com.tmerclub.cloud.order.constant.FinanceBizType + */ + @ExcelProperty({"财务明细报表", "业务类型"}) + private String bizTypeStr; + + @ExcelProperty({"财务明细报表", "支付交易单号"}) + private String payIds; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @ExcelIgnore + private Integer payType; + + @ExcelProperty({"财务明细报表", "支付方式"}) + private String payTypeName; + + @ExcelIgnore + private Long transAmount; + + @ExcelProperty({"财务明细报表", "收支金额"}) + private String amount; + + @ExcelIgnore + private Long shopId; + + @ExcelIgnore + private Long userId; + + @ExcelIgnore + private Integer bizType; + + public Date getTransDate() { + return transDate; + } + + public void setTransDate(Date transDate) { + this.transDate = transDate; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public Date getPlaceTime() { + return placeTime; + } + + public void setPlaceTime(Date placeTime) { + this.placeTime = placeTime; + } + + public String getProdName() { + return prodName; + } + + public void setProdName(String prodName) { + this.prodName = prodName; + } + + public String getBizTypeStr() { + return bizTypeStr; + } + + public void setBizTypeStr(String bizTypeStr) { + this.bizTypeStr = bizTypeStr; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + public String getPayIds() { + return payIds; + } + + public void setPayIds(String payIds) { + this.payIds = payIds; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public String getPayTypeName() { + return payTypeName; + } + + public void setPayTypeName(String payTypeName) { + this.payTypeName = payTypeName; + } + + public Long getTransAmount() { + return transAmount; + } + + public void setTransAmount(Long transAmount) { + this.transAmount = transAmount; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "FinanceDetailExcelVO{" + + "transDate=" + transDate + + ", orderId='" + orderId + '\'' + + ", placeTime=" + placeTime + + ", prodName='" + prodName + '\'' + + ", shopName='" + shopName + '\'' + + ", userName='" + userName + '\'' + + ", bizTypeStr='" + bizTypeStr + '\'' + + ", payIds='" + payIds + '\'' + + ", payType=" + payType + + ", payTypeName='" + payTypeName + '\'' + + ", transAmount=" + transAmount + + ", amount='" + amount + '\'' + + ", shopId=" + shopId + + ", userId=" + userId + + ", bizType=" + bizType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/FinanceDetailVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/FinanceDetailVO.java new file mode 100644 index 0000000..0bde86e --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/FinanceDetailVO.java @@ -0,0 +1,203 @@ +package com.tmerclub.cloud.api.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author TRACK + */ +public class FinanceDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "交易时间") + private Date transDate; + + @Schema(description = "订单号") + private String orderId; + + @Schema(description = "下单时间") + private Date placeTime; + + @Schema(description = "交易摘要") + private String prodName; + + @Schema(description = "发生渠道") + private String shopName; + + @Schema(description = "资金变更申请人") + private String userName; + + @Schema(description = "业务类型 1.订单支付 2.订单退款 3.余额充值 4.购买会员") + private Integer bizType; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式 -1.不限") + private Integer payType; + + @Schema(description = "收支金额") + private Long transAmount; + + @Schema(description = "支付单号") + private Long payId; + + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "支付多单订单号") + private String orderIds; + + @Schema(description = "支付交易单号") + private String payIds; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "用户id") + private Long userId; + + public Date getTransDate() { + return transDate; + } + + public void setTransDate(Date transDate) { + this.transDate = transDate; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public Date getPlaceTime() { + return placeTime; + } + + public void setPlaceTime(Date placeTime) { + this.placeTime = placeTime; + } + + public String getProdName() { + return prodName; + } + + public void setProdName(String prodName) { + this.prodName = prodName; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getTransAmount() { + return transAmount; + } + + public void setTransAmount(Long transAmount) { + this.transAmount = transAmount; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public String getPayIds() { + return payIds; + } + + public void setPayIds(String payIds) { + this.payIds = payIds; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "FinanceDetailVO{" + + "transDate=" + transDate + + ", orderId=" + orderId + + ", placeTime=" + placeTime + + ", prodName='" + prodName + '\'' + + ", shopName='" + shopName + '\'' + + ", userName='" + userName + '\'' + + ", bizType=" + bizType + + ", payType=" + payType + + ", transAmount=" + transAmount + + ", payId=" + payId + + ", refundId=" + refundId + + ", orderIds='" + orderIds + '\'' + + ", payIds='" + payIds + '\'' + + ", shopId=" + shopId + + ", userId=" + userId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberContributeValueVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberContributeValueVO.java new file mode 100644 index 0000000..4d37854 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberContributeValueVO.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author + */ +public class MemberContributeValueVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public MemberContributeValueVO() { + this.payOrderNum = 0; + this.totalMember = 0; + this.totalMemberRate = 0.00; + this.payMemberNum = 0; + this.payMemberNumRate = 0.00; + this.payAmount = 0.00; + this.payAmountRate = 0.00; + this.pricePerMember = 0.00; + this.frequencyOfConsume = 0.00; + } + @Schema(description = "用户类型 0:普通会员 1:付费会员" ) + private Integer userType; + @Schema(description = "累积会员数" ) + private Integer totalMember; + @Schema(description = "累积会员数占比") + private Double totalMemberRate; + + @Schema(description = "成交会员数") + private Integer payMemberNum; + @Schema(description = "成交会员数占比") + private Double payMemberNumRate; + + @Schema(description = "支付订单数") + private Integer payOrderNum; + + @Schema(description = "支付金额") + private Double payAmount; + @Schema(description = "支付金额占比") + private Double payAmountRate; + + @Schema(description = "客单价") + private Double pricePerMember; + + @Schema(description = "人均消费频次") + private Double frequencyOfConsume; + + public Integer getTotalMember() { + return totalMember; + } + + public void setTotalMember(Integer totalMember) { + this.totalMember = totalMember; + } + + public Double getTotalMemberRate() { + return totalMemberRate; + } + + public void setTotalMemberRate(Double totalMemberRate) { + this.totalMemberRate = totalMemberRate; + } + + public Integer getPayMemberNum() { + return payMemberNum; + } + + public void setPayMemberNum(Integer payMemberNum) { + this.payMemberNum = payMemberNum; + } + + public Double getPayMemberNumRate() { + return payMemberNumRate; + } + + public void setPayMemberNumRate(Double payMemberNumRate) { + this.payMemberNumRate = payMemberNumRate; + } + + public Integer getPayOrderNum() { + return payOrderNum; + } + + public void setPayOrderNum(Integer payOrderNum) { + this.payOrderNum = payOrderNum; + } + + public Double getPayAmount() { + return payAmount; + } + + public void setPayAmount(Double payAmount) { + this.payAmount = payAmount; + } + + public Double getPayAmountRate() { + return payAmountRate; + } + + public void setPayAmountRate(Double payAmountRate) { + this.payAmountRate = payAmountRate; + } + + public Double getPricePerMember() { + return pricePerMember; + } + + public void setPricePerMember(Double pricePerMember) { + this.pricePerMember = pricePerMember; + } + + public Double getFrequencyOfConsume() { + return frequencyOfConsume; + } + + public void setFrequencyOfConsume(Double frequencyOfConsume) { + this.frequencyOfConsume = frequencyOfConsume; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + @Override + public String toString() { + return "MemberContributeValueVO{" + + "userType=" + userType + + ", totalMember=" + totalMember + + ", totalMemberRate=" + totalMemberRate + + ", payMemberNum=" + payMemberNum + + ", payMemberNumRate=" + payMemberNumRate + + ", payOrderNum=" + payOrderNum + + ", payAmount=" + payAmount + + ", payAmountRate=" + payAmountRate + + ", pricePerMember=" + pricePerMember + + ", frequencyOfConsume=" + frequencyOfConsume + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberDealRespVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberDealRespVO.java new file mode 100644 index 0000000..97d21b8 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberDealRespVO.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author + */ +public class MemberDealRespVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "全部成交会员") + private MemberDealVO allMember; + + @Schema(description = "新成交会员") + private MemberDealVO newMember; + + @Schema(description = "老成交会员") + private MemberDealVO oldMember; + + @Schema(description = "图标参数") + private List trendParam; + + public MemberDealVO getNewMember() { + return newMember; + } + + public void setNewMember(MemberDealVO newMember) { + this.newMember = newMember; + } + + public MemberDealVO getOldMember() { + return oldMember; + } + + public void setOldMember(MemberDealVO oldMember) { + this.oldMember = oldMember; + } + + public List getTrendParam() { + return trendParam; + } + + public void setTrendParam(List trendParam) { + this.trendParam = trendParam; + } + + public MemberDealVO getAllMember() { + return allMember; + } + + public void setAllMember(MemberDealVO allMember) { + this.allMember = allMember; + } + + @Override + public String toString() { + return "MemberDealRespVO{" + + "allMember=" + allMember + + ", newMember=" + newMember + + ", oldMember=" + oldMember + + ", trendParam=" + trendParam + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberDealTreadVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberDealTreadVO.java new file mode 100644 index 0000000..8cf188e --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberDealTreadVO.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author + */ +public class MemberDealTreadVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long currentDay; + + @Schema(description = "新成交会员数") + private Integer newPayMemberNum; + @Schema(description = "老成交会员数") + private Integer oldPayMemberNum; + + @Schema(description = "新支付订单数") + private Integer newPayOrderNum; + @Schema(description = "老支付订单数") + private Integer oldPayOrderNum; + + @Schema(description = "新客单价") + private Double newPricePerMember; + @Schema(description = "老客单价") + private Double oldPricePerMember; + + @Schema(description = "新支付金额") + private Double newPayAmount; + @Schema(description = "老支付金额") + private Double oldPayAmount; + + public Long getCurrentDay() { + return currentDay; + } + + public void setCurrentDay(Long currentDay) { + this.currentDay = currentDay; + } + + public Integer getNewPayMemberNum() { + return newPayMemberNum; + } + + public void setNewPayMemberNum(Integer newPayMemberNum) { + this.newPayMemberNum = newPayMemberNum; + } + + public Integer getOldPayMemberNum() { + return oldPayMemberNum; + } + + public void setOldPayMemberNum(Integer oldPayMemberNum) { + this.oldPayMemberNum = oldPayMemberNum; + } + + public Integer getNewPayOrderNum() { + return newPayOrderNum; + } + + public void setNewPayOrderNum(Integer newPayOrderNum) { + this.newPayOrderNum = newPayOrderNum; + } + + public Integer getOldPayOrderNum() { + return oldPayOrderNum; + } + + public void setOldPayOrderNum(Integer oldPayOrderNum) { + this.oldPayOrderNum = oldPayOrderNum; + } + + public Double getNewPricePerMember() { + return newPricePerMember; + } + + public void setNewPricePerMember(Double newPricePerMember) { + this.newPricePerMember = newPricePerMember; + } + + public Double getOldPricePerMember() { + return oldPricePerMember; + } + + public void setOldPricePerMember(Double oldPricePerMember) { + this.oldPricePerMember = oldPricePerMember; + } + + public Double getNewPayAmount() { + return newPayAmount; + } + + public void setNewPayAmount(Double newPayAmount) { + this.newPayAmount = newPayAmount; + } + + public Double getOldPayAmount() { + return oldPayAmount; + } + + public void setOldPayAmount(Double oldPayAmount) { + this.oldPayAmount = oldPayAmount; + } + + @Override + public String toString() { + return "MemberDealTreadVO{" + + "currentDay=" + currentDay + + ", newPayMemberNum=" + newPayMemberNum + + ", oldPayMemberNum=" + oldPayMemberNum + + ", newPayOrderNum=" + newPayOrderNum + + ", oldPayOrderNum=" + oldPayOrderNum + + ", newPricePerMember=" + newPricePerMember + + ", oldPricePerMember=" + oldPricePerMember + + ", newPayAmount=" + newPayAmount + + ", oldPayAmount=" + oldPayAmount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberTrendRespVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberTrendRespVO.java new file mode 100644 index 0000000..e20e077 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberTrendRespVO.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lhd + */ +public class MemberTrendRespVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "时间,格式例如:2020-07-21") + private String currentDay; + + @Schema(description = "注册会员数量") + private Integer memberNum; + + @Schema(description = "注册付费会员数量" ) + private Integer vipMemberNum; + + @Schema(description = "新增会员数" ) + private Integer newMember; + + public String getCurrentDay() { + return currentDay; + } + + public void setCurrentDay(String currentDay) { + this.currentDay = currentDay; + } + + public Integer getMemberNum() { + return memberNum; + } + + public void setMemberNum(Integer memberNum) { + this.memberNum = memberNum; + } + + public Integer getVipMemberNum() { + return vipMemberNum; + } + + public void setVipMemberNum(Integer vipMemberNum) { + this.vipMemberNum = vipMemberNum; + } + + public Integer getNewMember() { + return newMember; + } + + public void setNewMember(Integer newMember) { + this.newMember = newMember; + } + + @Override + public String toString() { + return "MemberTrendRespVO{" + + "currentDay=" + currentDay + + ", memberNum=" + memberNum + + ", vipMemberNum=" + vipMemberNum + + ", newMember=" + newMember + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserApiVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserApiVO.java new file mode 100644 index 0000000..565eb04 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserApiVO.java @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 用户表VO + * + * @author YXF + * @date 2020-12-08 11:18:04 + */ +public class UserApiVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "ID") + private Long userId; + + @Schema(description = "用户名") + private String userName; + + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "1(男) or 0(女)") + private String sex; + + @Schema(description = "例如:2009-11-27") + private String birthDate; + + @Schema(description = "头像图片路径") + private String pic; + + @Schema(description = "状态 1 正常 0 无效") + private Integer status; + + @Schema(description = "普通会员等级(冗余字段)") + private Integer level; + + @Schema(description = "普通会员等级id") + private Long userLevelId; + + @Schema(description = "普通会员等级名称") + private String levelName; + + @Schema(description = "付费会员等级") + private Integer vipLevel; + + @Schema(description = "付费会员等级id") + private Long vipUserLevelId; + + @Schema(description = "付费会员等级名称") + private String vipLevelName; + + @Schema(description = "vip开始时间" ) + private Date vipStartTime; + + @Schema(description = "vip结束时间" ) + private Date vipEndTime; + + @Schema(description = "等级条件 0 普通会员 1 付费会员") + private Integer levelType; + + @Schema(description = "用户手机号") + private String userMobile; + + @Schema(description = "用户手机号") + private String phone; + + @Schema(description = "用户付费会员等级 商品个性化推荐 1:开启 0:关闭") + private Integer prodRecommendation; + + /** + * openId list + */ + private List bizUserIdList; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getBirthDate() { + return birthDate; + } + + public void setBirthDate(String birthDate) { + this.birthDate = birthDate; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public Integer getVipLevel() { + return vipLevel; + } + + public void setVipLevel(Integer vipLevel) { + this.vipLevel = vipLevel; + } + + public Long getVipUserLevelId() { + return vipUserLevelId; + } + + public void setVipUserLevelId(Long vipUserLevelId) { + this.vipUserLevelId = vipUserLevelId; + } + + public String getVipLevelName() { + return vipLevelName; + } + + public void setVipLevelName(String vipLevelName) { + this.vipLevelName = vipLevelName; + } + + public Date getVipStartTime() { + return vipStartTime; + } + + public void setVipStartTime(Date vipStartTime) { + this.vipStartTime = vipStartTime; + } + + public Date getVipEndTime() { + return vipEndTime; + } + + public void setVipEndTime(Date vipEndTime) { + this.vipEndTime = vipEndTime; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getProdRecommendation() { + return prodRecommendation; + } + + public void setProdRecommendation(Integer prodRecommendation) { + this.prodRecommendation = prodRecommendation; + } + + public List getBizUserIdList() { + return bizUserIdList; + } + + public void setBizUserIdList(List bizUserIdList) { + this.bizUserIdList = bizUserIdList; + } + + @Override + public String toString() { + return "UserApiVO{" + + "userId=" + userId + + ", userName='" + userName + '\'' + + ", nickName='" + nickName + '\'' + + ", sex='" + sex + '\'' + + ", birthDate='" + birthDate + '\'' + + ", pic='" + pic + '\'' + + ", status=" + status + + ", level=" + level + + ", userLevelId=" + userLevelId + + ", levelName='" + levelName + '\'' + + ", vipLevel=" + vipLevel + + ", vipUserLevelId=" + vipUserLevelId + + ", vipLevelName='" + vipLevelName + '\'' + + ", vipStartTime=" + vipStartTime + + ", vipEndTime=" + vipEndTime + + ", levelType=" + levelType + + ", userMobile='" + userMobile + '\'' + + ", phone='" + phone + '\'' + + ", prodRecommendation=" + prodRecommendation + + ", bizUserIdList=" + bizUserIdList + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserManagerVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserManagerVO.java new file mode 100644 index 0000000..31583db --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserManagerVO.java @@ -0,0 +1,495 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.vo; + +import com.tmerclub.cloud.api.coupon.vo.CouponUserCountDataVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 全部会员VO + * + * @author cl + * @data 2020-04-09 16:16:53 + */ +public class UserManagerVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "用户名") + private String userName; + + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "用户邮箱") + private String email; + + @Schema(description = "手机号码") + private String phone; + + @Schema(description = "修改时间") + private Date updateTime; + + @Schema(description = "注册时间") + private Date createTime; + + @Schema(description = "M(男) or F(女)") + private String sex; + + @Schema(description = "出生日期。例如:2009-11-27") + private String birthDate; + + @Schema(description = "头像图片路径") + private String pic; + + @Schema(description = "状态 1 正常 0 无效") + private Integer status; + + @Schema(description = "积分") + private Long score; + + @Schema(description = "会员成长值") + private Long growth; + + @Schema(description = "会员等级") + private Integer level; + + @Schema(description = "等级条件 0 普通会员 1 付费会员") + private Integer levelType; + + @Schema(description = "vip结束时间") + private Date vipEndTime; + + @Schema(description = "会员等级名称") + private String levelName; + + @Schema(description = "bizUserId") + private String bizUserId; + + @Schema(description = "付费会员等级") + private Integer vipLevel; + + @Schema(description = "付费会员等级名称") + private String vipLevelName; + + // -----------------------------------------------------以上是user 的信息 + + @Schema(description = "最近消费时间") + private Date reConsTime; + + @Schema(description = "消费金额") + private BigDecimal consAmount; + + @Schema(description = "实付金额") + private BigDecimal actualAmount; + + @Schema(description = "消费次数") + private Integer consTimes; + + @Schema(description = "下单次数") + private Integer allCount; + + @Schema(description = "平均折扣") + private BigDecimal averDiscount; + + @Schema(description = "充值金额") + private BigDecimal rechargeAmount; + + @Schema(description = "充值次数") + private Integer rechargeTimes; + + @Schema(description = "售后金额") + private BigDecimal afterSaleAmount; + + @Schema(description = "售后次数") + private Integer afterSaleTimes; + + @Schema(description = "当前积分") + private Long currentScore; + + @Schema(description = "累积积分") + private Long sumScore; + + @Schema(description = "当前余额") + private BigDecimal currentBalance; + + @Schema(description = "累计余额") + private BigDecimal sumBalance; + + @Schema(description = "分销等级") + private Integer distributionLevel; + + @Schema(description = "成为分销员的时间") + private Date distributorTime; + + // ----以下用户详情---------------------------------------------------------------- + + @Schema(description = "标签") + private List userTagList; + + @Schema(description = "用户优惠券 统计") + private CouponUserCountDataVO couponUserCountDataVO; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Integer getVipLevel() { + return vipLevel; + } + + public void setVipLevel(Integer vipLevel) { + this.vipLevel = vipLevel; + } + + public String getVipLevelName() { + return vipLevelName; + } + + public void setVipLevelName(String vipLevelName) { + this.vipLevelName = vipLevelName; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getBirthDate() { + return birthDate; + } + + public void setBirthDate(String birthDate) { + this.birthDate = birthDate; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Long getGrowth() { + return growth; + } + + public void setGrowth(Long growth) { + this.growth = growth; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Date getVipEndTime() { + return vipEndTime; + } + + public void setVipEndTime(Date vipEndTime) { + this.vipEndTime = vipEndTime; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public Date getReConsTime() { + return reConsTime; + } + + public void setReConsTime(Date reConsTime) { + this.reConsTime = reConsTime; + } + + public BigDecimal getConsAmount() { + return consAmount; + } + + public void setConsAmount(BigDecimal consAmount) { + this.consAmount = consAmount; + } + + public BigDecimal getActualAmount() { + return actualAmount; + } + + public void setActualAmount(BigDecimal actualAmount) { + this.actualAmount = actualAmount; + } + + public Integer getConsTimes() { + return consTimes; + } + + public void setConsTimes(Integer consTimes) { + this.consTimes = consTimes; + } + + public BigDecimal getAverDiscount() { + return averDiscount; + } + + public void setAverDiscount(BigDecimal averDiscount) { + this.averDiscount = averDiscount; + } + + public BigDecimal getRechargeAmount() { + return rechargeAmount; + } + + public void setRechargeAmount(BigDecimal rechargeAmount) { + this.rechargeAmount = rechargeAmount; + } + + public Integer getRechargeTimes() { + return rechargeTimes; + } + + public void setRechargeTimes(Integer rechargeTimes) { + this.rechargeTimes = rechargeTimes; + } + + public BigDecimal getAfterSaleAmount() { + return afterSaleAmount; + } + + public void setAfterSaleAmount(BigDecimal afterSaleAmount) { + this.afterSaleAmount = afterSaleAmount; + } + + public Integer getAfterSaleTimes() { + return afterSaleTimes; + } + + public void setAfterSaleTimes(Integer afterSaleTimes) { + this.afterSaleTimes = afterSaleTimes; + } + + public Long getCurrentScore() { + return currentScore; + } + + public void setCurrentScore(Long currentScore) { + this.currentScore = currentScore; + } + + public Long getSumScore() { + return sumScore; + } + + public void setSumScore(Long sumScore) { + this.sumScore = sumScore; + } + + public BigDecimal getCurrentBalance() { + return currentBalance; + } + + public void setCurrentBalance(BigDecimal currentBalance) { + this.currentBalance = currentBalance; + } + + public BigDecimal getSumBalance() { + return sumBalance; + } + + public void setSumBalance(BigDecimal sumBalance) { + this.sumBalance = sumBalance; + } + + public Integer getDistributionLevel() { + return distributionLevel; + } + + public void setDistributionLevel(Integer distributionLevel) { + this.distributionLevel = distributionLevel; + } + + public Date getDistributorTime() { + return distributorTime; + } + + public void setDistributorTime(Date distributorTime) { + this.distributorTime = distributorTime; + } + + public List getUserTagList() { + return userTagList; + } + + public void setUserTagList(List userTagList) { + this.userTagList = userTagList; + } + + public CouponUserCountDataVO getCouponUserCountDataVO() { + return couponUserCountDataVO; + } + + public void setCouponUserCountDataVO(CouponUserCountDataVO couponUserCountDataVO) { + this.couponUserCountDataVO = couponUserCountDataVO; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + @Override + public String toString() { + return "UserManagerVO{" + + "userId=" + userId + + ", userName='" + userName + '\'' + + ", nickName='" + nickName + '\'' + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + ", updateTime=" + updateTime + + ", createTime=" + createTime + + ", sex='" + sex + '\'' + + ", birthDate='" + birthDate + '\'' + + ", pic='" + pic + '\'' + + ", status=" + status + + ", score=" + score + + ", growth=" + growth + + ", level=" + level + + ", levelType=" + levelType + + ", vipEndTime=" + vipEndTime + + ", levelName='" + levelName + '\'' + + ", bizUserId='" + bizUserId + '\'' + + ", vipLevel=" + vipLevel + + ", vipLevelName='" + vipLevelName + '\'' + + ", reConsTime=" + reConsTime + + ", consAmount=" + consAmount + + ", actualAmount=" + actualAmount + + ", consTimes=" + consTimes + + ", allCount=" + allCount + + ", averDiscount=" + averDiscount + + ", rechargeAmount=" + rechargeAmount + + ", rechargeTimes=" + rechargeTimes + + ", afterSaleAmount=" + afterSaleAmount + + ", afterSaleTimes=" + afterSaleTimes + + ", currentScore=" + currentScore + + ", sumScore=" + sumScore + + ", currentBalance=" + currentBalance + + ", sumBalance=" + sumBalance + + ", distributionLevel=" + distributionLevel + + ", distributorTime=" + distributorTime + + ", userTagList=" + userTagList + + ", couponUserCountDataVO=" + couponUserCountDataVO + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserTagApiVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserTagApiVO.java new file mode 100644 index 0000000..7a6a901 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserTagApiVO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 用户标签VO + * @author: cl + * @date: 2021-04-12 15:56 + */ +public class UserTagApiVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long tagId; + + @Schema(description = "标签名称") + private String tagName; + + @Schema(description = "标签类型0手动1条件2系统") + private Integer tagType; + + @Schema(description = "标签下的所有用户id") + private List userIds; + + public Long getTagId() { + return tagId; + } + + public void setTagId(Long tagId) { + this.tagId = tagId; + } + + public String getTagName() { + return tagName; + } + + public void setTagName(String tagName) { + this.tagName = tagName; + } + + public Integer getTagType() { + return tagType; + } + + public void setTagType(Integer tagType) { + this.tagType = tagType; + } + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + + @Override + public String toString() { + return "UserTagApiVO{" + + "tagId=" + tagId + + ", tagName='" + tagName + '\'' + + ", tagType=" + tagType + + ", userIds=" + userIds + + '}'; + } +} diff --git a/tmerclub-auth/pom.xml b/tmerclub-auth/pom.xml new file mode 100644 index 0000000..3142636 --- /dev/null +++ b/tmerclub-auth/pom.xml @@ -0,0 +1,86 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-auth + jar + + mall4cloud 授权校验模块 + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + com.moyuer.cloud + tmerclub-common-cache + ${project.version} + + + com.moyuer.cloud + tmerclub-common-security + ${project.version} + + + com.moyuer.cloud + tmerclub-common-leaf + ${project.version} + + + com.moyuer.cloud + tmerclub-common-rocketmq + ${project.version} + + + + com.anji-plus + captcha + + + com.github.binarywang + weixin-java-miniapp + + + com.github.binarywang + weixin-java-mp + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.moyuer.cloud + tmerclub-api-biz + ${project.version} + + + com.moyuer.cloud + tmerclub-api-user + ${project.version} + + + com.moyuer.cloud + tmerclub-api-order + ${project.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/AuthApplication.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/AuthApplication.java new file mode 100644 index 0000000..d313e33 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/AuthApplication.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud; + +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.security.servlet.UserDetailsServiceAutoConfiguration; + +/** + * @author FrozenWatermelon + * @date 2020/7/8 + */ +@SpringBootApplication(scanBasePackages = "com.moyuer.cloud", exclude = UserDetailsServiceAutoConfiguration.class) +@EnableDubbo(scanBasePackages = "com.moyuer.cloud.**.feign") +public class AuthApplication { + + public static void main(String[] args) { + SpringApplication.run(AuthApplication.class, args); + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/adapter/CaptchaCacheServiceRedisImpl.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/adapter/CaptchaCacheServiceRedisImpl.java new file mode 100644 index 0000000..e7d91bc --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/adapter/CaptchaCacheServiceRedisImpl.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.adapter; + +import com.anji.captcha.service.CaptchaCacheService; +import com.tmerclub.cloud.common.cache.util.RedisUtil; + +/** + * 适配验证码在redis的存储 + * + * @author FrozenWatermelon + */ +public class CaptchaCacheServiceRedisImpl implements CaptchaCacheService { + + @Override + public void set(String key, String value, long expiresInSeconds) { + RedisUtil.set(key, value, expiresInSeconds); + } + + @Override + public boolean exists(String key) { + return RedisUtil.hasKey(key); + } + + @Override + public void delete(String key) { + RedisUtil.del(key); + } + + @Override + public String get(String key) { + return RedisUtil.get(key); + } + + @Override + public String type() { + return "redis"; + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/config/CaptchaConfig.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/config/CaptchaConfig.java new file mode 100644 index 0000000..5ad5ede --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/config/CaptchaConfig.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.config; + +import com.anji.captcha.model.common.CaptchaTypeEnum; +import com.anji.captcha.model.common.Const; +import com.anji.captcha.service.CaptchaService; +import com.anji.captcha.service.impl.CaptchaServiceFactory; +import com.anji.captcha.util.Base64Utils; +import com.anji.captcha.util.ImageUtils; +import com.tmerclub.cloud.common.constant.Constant; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.util.FileCopyUtils; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +/** + * @author FrozenWatermelon + * @date 2020/8/12 + */ +@Configuration +public class CaptchaConfig { + private static final Logger LOGGER = LoggerFactory.getLogger(CaptchaConfig.class); + + @Bean + public CaptchaService captchaService() { + Properties config = new Properties(); + config.setProperty(Const.CAPTCHA_CACHETYPE, "redis"); + config.setProperty(Const.CAPTCHA_WATER_MARK, ""); + // 滑动验证 + config.setProperty(Const.CAPTCHA_TYPE, CaptchaTypeEnum.BLOCKPUZZLE.getCodeValue()); + config.setProperty(Const.CAPTCHA_INIT_ORIGINAL, "true"); + initializeBaseMap(); + return CaptchaServiceFactory.getInstance(config); + } + + private static void initializeBaseMap() { + ImageUtils.cacheBootImage(getResourcesImagesFile("classpath:captcha" + "/original/*.png"), getResourcesImagesFile("classpath:captcha" + "/slidingBlock/*.png"), Collections.emptyMap()); + } + + public static Map getResourcesImagesFile(String path) { + Map imgMap = new HashMap<>(Constant.INITIAL_CAPACITY); + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + + try { + Resource[] resources = resolver.getResources(path); + Resource[] var4 = resources; + int var5 = resources.length; + + for(int var6 = 0; var6 < var5; ++var6) { + Resource resource = var4[var6]; + byte[] bytes = FileCopyUtils.copyToByteArray(resource.getInputStream()); + String string = Base64Utils.encodeToString(bytes); + String filename = resource.getFilename(); + imgMap.put(filename, string); + } + } catch (Exception var11) { + var11.printStackTrace(); + } + + return imgMap; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/config/RocketMqConfig.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/config/RocketMqConfig.java new file mode 100644 index 0000000..c73ece6 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/config/RocketMqConfig.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.config; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqAdapter; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * + * @author cl + * @date 2021-05-14 17:58:19 + */ +@RefreshScope +@Configuration +public class RocketMqConfig { + + @Autowired + private RocketMqAdapter rocketMqAdapter; + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate userNotifyRegisterTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.BATCH_USER_REGISTER_TOPIC); + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/constant/AuthAccountStatusEnum.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/constant/AuthAccountStatusEnum.java new file mode 100644 index 0000000..849f264 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/constant/AuthAccountStatusEnum.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.constant; + +/** + * 统一账户信息状态 + * + * @author FrozenWatermelon + * @date 2020/09/22 + */ +public enum AuthAccountStatusEnum { + + /** + * 启用 + */ + ENABLE(1), + + /** + * 禁用 + */ + DISABLE(0), + + /** + * 删除 + */ + DELETE(-1); + + private final Integer value; + + public Integer value() { + return value; + } + + AuthAccountStatusEnum(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/JsapiSignatureController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/JsapiSignatureController.java new file mode 100644 index 0000000..e64715a --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/JsapiSignatureController.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.controller; + +import com.tmerclub.cloud.auth.config.WxConfig; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.error.WxErrorException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author FrozenWatermelon + * @date 2021/7/31 + */ +@RequestMapping("/wx/jsapi") +@Tag(name = "jsapi签名") +@RestController +public class JsapiSignatureController { + + @Autowired + private WxConfig wxConfig; + + @PostMapping("/createJsapiSignature") + @Operation(summary = "生成jsapi签名", description = "根据url生成当前页面的jsapi签名") + public ServerResponseEntity createJsapiSignature(@RequestBody String url) { + WxJsapiSignature jsapiSignature; + try { + jsapiSignature = wxConfig.getWxMpService().createJsapiSignature(url); + } catch (WxErrorException e) { + throw new LuckException(e.getError().toString()); + } + return ServerResponseEntity.success(jsapiSignature); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/LoginController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/LoginController.java new file mode 100644 index 0000000..09f2e44 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/LoginController.java @@ -0,0 +1,324 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.controller; + +import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.anji.captcha.model.common.ResponseModel; +import com.anji.captcha.model.vo.CaptchaVO; +import com.anji.captcha.service.CaptchaService; +import com.tmerclub.cloud.api.auth.bo.LoginInfoBO; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.LoginType; +import com.tmerclub.cloud.api.auth.constant.SocialType; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.vo.TokenInfoVO; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.user.bo.UidAndUserIdBO; +import com.tmerclub.cloud.api.user.dto.UserRegisterDTO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.auth.config.WxConfig; +import com.tmerclub.cloud.auth.dto.*; +import com.tmerclub.cloud.auth.manager.TokenStore; +import com.tmerclub.cloud.auth.mapper.AuthSocialMapper; +import com.tmerclub.cloud.auth.model.AuthSocial; +import com.tmerclub.cloud.auth.service.AuthAccountService; +import com.tmerclub.cloud.auth.service.AuthSocialService; +import com.tmerclub.cloud.common.cache.constant.OauthCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.security.adapter.AuthConfigAdapter; +import com.tmerclub.cloud.rbac.service.MenuPermissionService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import me.chanjar.weixin.common.error.WxErrorException; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/6/30 + */ +@RestController +@Tag(name = "登录") +public class LoginController { + + @Autowired + private CaptchaService captchaService; + @Autowired + private TokenStore tokenStore; + @Autowired + private AuthAccountService authAccountService; + @Autowired + private MenuPermissionService menuPermissionService; + @Autowired + private AuthSocialService authSocialService; + @Autowired + private WxConfig wxConfig; + @Autowired + private AuthSocialMapper authSocialMapper; + @DubboReference + private NotifyFeignClient notifyFeignClient; + @DubboReference + private UserFeignClient userFeignClient; + + @Value("${sa-token.token-name}") + private String tokenName; + + + + @PostMapping("/ua/login") + @Operation(summary = "账号密码(用于h5、pc登录)", description = "通过账号/手机号/用户名密码登录,还要携带用户的类型,也就是用户所在的系统") + public ServerResponseEntity login( + @Valid @RequestBody AuthenticationDTO authenticationDTO) { + if (!Objects.equals(authenticationDTO.getSysType(), SysTypeEnum.ORDINARY.value())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + return doLogin(authenticationDTO, LoginType.PASSWORD.value()); + } + + @PostMapping("/ua/login_with_code") + @Operation(summary = "手机号+验证码登录(用于前端登录)", description = "通过手机号+验证码登录,还要携带用户的类型,也就是用户所在的系统") + public ServerResponseEntity loginWithCode(@Valid @RequestBody LoginCodeDTO loginCode) { + // 该接口是用户端在(pc、h5、小程序)使用 + if (!Objects.equals(loginCode.getSysType(), SysTypeEnum.ORDINARY.value())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + boolean flag = (Objects.equals(loginCode.getSocialType(), SocialType.MA.value()) + || Objects.equals(loginCode.getSocialType(), SocialType.MP.value())); + if (StrUtil.isBlank(loginCode.getTempUid()) + && flag) { + return ServerResponseEntity.showFailMsg("tempUid is blank"); + } + //校验验证码 + ServerResponseEntity validCodeResponse = notifyFeignClient.checkValidCode(loginCode.getMobile(), loginCode.getValidCode(), SendTypeEnum.LOGIN); + if (!validCodeResponse.isSuccess() || !validCodeResponse.getData()) { + return ServerResponseEntity.fail(ResponseEnum.VERIFICATION_CODE_ERROR); + } + // 如果没有注册的话,短信登录将会进行注册 + // 在pc/小程序/公众号的登录,都有短信登录的方法。但是公众号/小程序的短信登录,登录了之后会见这个用户和公众号/小程序绑定一起(登录并绑定) + return threeInOneLogin(loginCode.getMobile(), loginCode.getTempUid(), loginCode.getSocialType()); + } + + @PostMapping("/ua/wx/login") + @Operation(summary = "账号密码登录(用于微信小程序和公众号)", description = "二合一登录(包含绑定+登录),一定要传tempUid") + public ServerResponseEntity tempSocialLogin( + @Valid @RequestBody AuthenticationDTO authenticationDTO) { + if (!Objects.equals(authenticationDTO.getSysType(), SysTypeEnum.ORDINARY.value())) { + return ServerResponseEntity.showFailMsg("sysType error"); + } + if (StrUtil.isBlank(authenticationDTO.getTempUid())) { + return ServerResponseEntity.showFailMsg("tempUid is blank"); + } + return doLogin(authenticationDTO, LoginType.PASSWORD.value()); + } + + @PostMapping("/ua/ma/login") + @Operation(summary = "微信小程序一键登录", description = "三合一登录(包含注册 + 绑定 + 登录)") + public ServerResponseEntity maLogin(@Valid @RequestBody MaCodeAuthenticationDTO maCodeAuthenticationDTO) { + WxMaPhoneNumberInfo newPhoneNoInfo; + try { + newPhoneNoInfo = wxConfig.getWxMaService().getUserService().getPhoneNoInfo(maCodeAuthenticationDTO.getCode()); + } catch (WxErrorException e) { + throw new LuckException(e.getMessage()); + } + // 没有区号的手机号,国外手机号会有区号 + String mobile = newPhoneNoInfo.getPurePhoneNumber(); + + return threeInOneLogin(mobile, maCodeAuthenticationDTO.getTempUid(), SocialType.MA.value()); + } + + @PostMapping("/ua/admin_login") + @Operation(summary = "账号密码 + 验证码登录(用于后台登录)", description = "通过账号/手机号/用户名密码登录,还要携带用户的类型,也就是用户所在的系统") + public ServerResponseEntity login( + @Valid @RequestBody CaptchaAuthenticationDTO captchaAuthenticationDTO) { + // 登陆后台登录需要再校验一遍验证码 + CaptchaVO captchaVO = new CaptchaVO(); + captchaVO.setCaptchaVerification(captchaAuthenticationDTO.getCaptchaVerification()); + ResponseModel response = captchaService.verification(captchaVO); + if (!response.isSuccess()) { + return ServerResponseEntity.showFailMsg("验证码已失效,请重新获取"); + } + return doLogin(captchaAuthenticationDTO, LoginType.PASSWORD.value()); + } + + + private ServerResponseEntity doLogin(@RequestBody @Valid AuthenticationDTO authenticationDTO, Integer loginType) { + ServerResponseEntity uidInfoBOResponse = authAccountService.getUserInfoInTokenByInputUserNameAndPassword( + authenticationDTO.getUserName(), + authenticationDTO.getPassWord(), + authenticationDTO.getSysType(), + loginType); + if (!uidInfoBOResponse.isSuccess()) { + return ServerResponseEntity.transform(uidInfoBOResponse); + } + + UidInfoBO data = uidInfoBOResponse.getData(); + + // 将以前的权限清理了,以免权限有缓存 + menuPermissionService.clearUserPermissionsCache(data.getUserId(), data.getSysType()); + + AuthSocial authSocial = null; + if (StrUtil.isNotBlank(authenticationDTO.getTempUid())) { + authSocial = authSocialService.getByTempUid(authenticationDTO.getTempUid()); + if (Objects.isNull(authSocial)) { + return ServerResponseEntity.fail(ResponseEnum.TEMP_UID_ERROR); + } + // 社交账号未关联本系统账号,则进行绑定关联 + if (Objects.isNull(authSocial.getUid())) { + authSocialService.bindSocial(authSocial, data); + } + } + + TokenInfoVO tokenInfoVO = tokenStore.storeAndGetVo(data); + + if (Objects.nonNull(authSocial)) { + // 缓存当前登录的openId + LoginInfoBO loginInfoBO = new LoginInfoBO(); + loginInfoBO.setSocialType(authSocial.getSocialType()); + loginInfoBO.setBizUserId(authSocial.getBizUserId()); + RedisUtil.set(OauthCacheNames.LOGIN_INFO + tokenInfoVO.getAccessToken(), + JSONObject.toJSONString(loginInfoBO), + tokenInfoVO.getExpiresIn()); + } + // 保存token,返回token数据给前端 + return ServerResponseEntity.success(tokenInfoVO); + } + + + @PostMapping(AuthConfigAdapter.LOGIN_OUT_URI) + @Operation(summary = "退出登陆", description = "点击退出登陆,清除token,清除菜单缓存") + public ServerResponseEntity loginOut(HttpServletRequest request) { + String accessToken = request.getHeader(tokenName); + UidInfoBO uidInfoBO = tokenStore.getUidInfoByCache(accessToken); + LoginInfoBO loginInfoByCache = tokenStore.getLoginInfoByCache(); + if (uidInfoBO == null) { + return ServerResponseEntity.success(); + } + if (!Objects.equals(SysTypeEnum.ORDINARY.value(), uidInfoBO.getSysType())) { + // 将以前的权限清理了,以免权限有缓存 + menuPermissionService.clearUserPermissionsCache(uidInfoBO.getUserId(), uidInfoBO.getSysType()); + } + + // 只有微信公众号和小程序的登录会进行登录并绑定的操作 + if (Objects.equals(loginInfoByCache.getSocialType(), SocialType.MA.value()) || Objects.equals(loginInfoByCache.getSocialType(), SocialType.MP.value())) { + // 解绑 + authSocialMapper.unBindUser(loginInfoByCache.getBizUserId(), loginInfoByCache.getSocialType()); + } + // 删除该用户在该系统当前的token + StpUtil.logoutByTokenValue(accessToken); + return ServerResponseEntity.success(); + } + + @PutMapping("/checkPhoneIsBind") + @Operation(summary = "检查用户修改后的手机号是否已经绑定其他账号", description = "检查用户修改后的手机号是否已经绑定其他账号") + public ServerResponseEntity checkPhoneIsBind(@RequestBody BindSocialDTO checkSmsDTO) { + + int accountNum = authAccountService.getByMobile(checkSmsDTO.getValidAccount()); + if (accountNum > 0) { + // 此用户不存在,请先注册 + throw new LuckException("此手机号已经绑定过其他账号,请重新输入。"); + } + return ServerResponseEntity.success(true); + } + + + /** + * 三合一登录(包含注册 + 绑定 + 登录) + */ + private ServerResponseEntity threeInOneLogin(String mobile, String tempUid, Integer socialType) { + ServerResponseEntity uidInfoBOResponse = authAccountService + .getUserInfoInTokenByInputUserNameAndPassword(mobile, + null, SysTypeEnum.ORDINARY.value(), LoginType.ONE_CLICK_LOGIN.value()); + if (!uidInfoBOResponse.isSuccess()) { + return ServerResponseEntity.transform(uidInfoBOResponse); + } + UidInfoBO uidInfoBO = uidInfoBOResponse.getData(); + AuthSocial authSocial = null; + // 没有就注册 + if (uidInfoBO == null || uidInfoBO.getAccountUid() == null) { + if (Objects.equals(socialType, SocialType.MA.value()) || Objects.equals(socialType, SocialType.MP.value())) { + authSocial = authSocialService.getByTempUid(tempUid); + if (authSocial == null || authSocial.getUid() != null) { + return ServerResponseEntity.fail(ResponseEnum.TEMP_UID_ERROR); + } + } + UserRegisterDTO userRegisterDTO = new UserRegisterDTO(); + userRegisterDTO.setMobile(mobile); + userRegisterDTO.setTempUid(tempUid); + // 注册并绑定用户 + ServerResponseEntity saveResponse = userFeignClient.save(userRegisterDTO); + if (!saveResponse.isSuccess()) { + return ServerResponseEntity.transform(saveResponse); + } + UidAndUserIdBO uidAndUserIdBO = saveResponse.getData(); + uidInfoBO = new UidInfoBO(); + uidInfoBO.setUserId(uidAndUserIdBO.getUserId()); + uidInfoBO.setAccountUid(uidAndUserIdBO.getUid()); + uidInfoBO.setIsAdmin(0); + uidInfoBO.setSysType(SysTypeEnum.ORDINARY.value()); + } else { + authSocial = checkAndGetAppConnect(uidInfoBO.getAccountUid(), socialType, tempUid); + } + TokenInfoVO tokenInfoVO = tokenStore.storeAndGetVo(uidInfoBO); + if (authSocial != null) { + // 缓存当前登录的openId + LoginInfoBO loginInfoBO = new LoginInfoBO(); + loginInfoBO.setSocialType(authSocial.getSocialType()); + loginInfoBO.setBizUserId(authSocial.getBizUserId()); + RedisUtil.set(OauthCacheNames.LOGIN_INFO + tokenInfoVO.getAccessToken(), + JSONObject.toJSONString(loginInfoBO), + tokenInfoVO.getExpiresIn()); + } + return ServerResponseEntity.success(tokenInfoVO); + } + + /** + * 登录并绑定用户 + */ + private AuthSocial checkAndGetAppConnect(Long uid, Integer socialType, String tempUid) { + // 只有微信公众号和小程序的登录会进行登录并绑定的操作 + if (!Objects.equals(socialType, SocialType.MA.value()) && !Objects.equals(socialType, SocialType.MP.value())) { + return null; + } + // 在SocialLoginController 当中,会返回一个tempUid用来换取openid的 + AuthSocial authSocial = authSocialService.getByTempUid(tempUid); + if (authSocial == null) { + throw new LuckException(ResponseEnum.TEMP_UID_ERROR); + } + // 二合一登录,啥意思呢? + // 1. 绑定:将该账号和该微信的openId进行绑定 + // 2. 登录:返回token登录成功 + if (authSocial.getUid() == null) { + authSocialMapper.bindUidByTempUid(uid, authSocial.getTempUid()); + } + // 如果有userId就判断下是不是一样的user,不是的话,不能够绑定 + else if (!Objects.equals(authSocial.getUid(), uid)) { + throw new LuckException(ResponseEnum.SOCIAL_ACCOUNT_BIND_BY_OTHER); + } + return authSocial; + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/StationLoginController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/StationLoginController.java new file mode 100644 index 0000000..231f505 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/StationLoginController.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.controller; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.LoginType; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.vo.TokenInfoVO; +import com.tmerclub.cloud.api.delivery.feign.StationFeignClient; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.api.rbac.dto.ClearUserPermissionsCacheDTO; +import com.tmerclub.cloud.auth.dto.AuthenticationDTO; +import com.tmerclub.cloud.auth.manager.PasswordManager; +import com.tmerclub.cloud.auth.manager.TokenStore; +import com.tmerclub.cloud.auth.service.AuthAccountService; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.rbac.service.MenuPermissionService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/6/30 + */ +@RestController +@Tag(name = "自提点登录") +public class StationLoginController { + + @Autowired + private TokenStore tokenStore; + @Autowired + private PasswordManager passwordManager; + @Autowired + private AuthAccountService authAccountService; + @Autowired + private MenuPermissionService menuPermissionService; + @DubboReference + private StationFeignClient stationFeignClient; + + + @PostMapping("/ua/station_login") + @Operation(summary = "自提点账号密码(用于前端登录)", description = "通过账号/手机号/用户名密码登录") + public ServerResponseEntity login(@Valid @RequestBody AuthenticationDTO authenticationDTO) { + authenticationDTO.setSysType(SysTypeEnum.STATION.value()); + // 账号密码校验 + ServerResponseEntity uidInfoBOResponse = authAccountService.getUserInfoInTokenByInputUserNameAndPassword( + authenticationDTO.getUserName(), + authenticationDTO.getPassWord(), + authenticationDTO.getSysType(), + LoginType.PASSWORD.value() + ); + + if (!uidInfoBOResponse.isSuccess()) { + return ServerResponseEntity.transform(uidInfoBOResponse); + } + + UidInfoBO data = uidInfoBOResponse.getData(); + // 校验门店状态是否正常 + StationVO stationVO = stationFeignClient.getStationByInside(data.getTenantId()).getData(); + if (stationVO == null) { + throw new LuckException("门店不存在"); + } + if (!Objects.equals(stationVO.getStatus(), 1)) { + throw new LuckException("该门店已关闭,请联系管理员"); + } + // 清理权限缓存 + ClearUserPermissionsCacheDTO clearUserPermissionsCacheDTO = new ClearUserPermissionsCacheDTO(); + clearUserPermissionsCacheDTO.setSysType(data.getSysType()); + clearUserPermissionsCacheDTO.setUserId(data.getUserId()); + menuPermissionService.clearUserPermissionsCache(clearUserPermissionsCacheDTO.getUserId(), clearUserPermissionsCacheDTO.getSysType()); + data.setIsPassShop(1); + // token存储返回 + return ServerResponseEntity.success(tokenStore.storeAndGetVo(data)); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/TokenController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/TokenController.java new file mode 100644 index 0000000..f02c6ce --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/TokenController.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.controller; + +import cn.dev33.satoken.stp.StpUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.auth.manager.TokenStore; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author FrozenWatermelon + * @date 2020/6/30 + */ +@RestController +@Tag(name = "token") +public class TokenController { + + @Autowired + private TokenStore tokenStore; + + + @PostMapping("/ua/token/refresh") + public ServerResponseEntity refreshToken() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + if (uidInfoBO == null) { + // 登录过期,请重新登录 + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + // 获取请求的用户信息 + UidInfoBO uidInfoInToken = tokenStore.getUidInfoInToken(); + // 获取续签时间 + int expiresIn = tokenStore.getExpiresIn(uidInfoBO.getSysType()); + // 续签时间 + StpUtil.renewTimeout(expiresIn); + // 返回续签时间 + return ServerResponseEntity.success(expiresIn); + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/WxMnpController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/WxMnpController.java new file mode 100644 index 0000000..d43bb6a --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/WxMnpController.java @@ -0,0 +1,40 @@ +package com.tmerclub.cloud.auth.controller; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest; +import com.tmerclub.cloud.auth.config.WxConfig; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import me.chanjar.weixin.common.error.WxErrorException; +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; + +/** + * @author gaozijie + * @date 2023-04-28 + */ +@Tag(name = "微信小程序接口") +@RestController +@RequestMapping("/ua/wx_mnp") +public class WxMnpController { + + @Autowired + private WxConfig wxConfig; + + @Operation(summary = "获取小程序urlLink") + @GetMapping("/generate_url_link") + public ServerResponseEntity generateUrlLink(GenerateUrlLinkRequest generateUrlLinkRequest) { + WxMaService wxMaService = wxConfig.getWxMaService(); + String urlLink; + try { + urlLink = wxMaService.getLinkService().generateUrlLink(generateUrlLinkRequest); + } catch (WxErrorException e) { + throw new LuckException(e.getMessage()); + } + return ServerResponseEntity.success(urlLink); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/BindSocialDTO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/BindSocialDTO.java new file mode 100644 index 0000000..7370fcc --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/BindSocialDTO.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用于登陆传递账号密码 + * + * @author FrozenWatermelon + * @date 2021/01/19 + */ +public class BindSocialDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotBlank + @Schema(description = "尝试社交登录的时候返回的tempUid", requiredMode = Schema.RequiredMode.REQUIRED) + private String tempUid; + + @NotBlank + @Schema(description = "校验账号,邮箱 or 手机号", requiredMode = Schema.RequiredMode.REQUIRED) + private String validAccount; + + @Schema(description = "验证码") + private String validCode; + + public String getTempUid() { + return tempUid; + } + + public void setTempUid(String tempUid) { + this.tempUid = tempUid; + } + + public String getValidAccount() { + return validAccount; + } + + public void setValidAccount(String validAccount) { + this.validAccount = validAccount; + } + + public String getValidCode() { + return validCode; + } + + public void setValidCode(String validCode) { + this.validCode = validCode; + } + + @Override + public String toString() { + return "BindSocialDTO{" + + "tempUid='" + tempUid + '\'' + + ", validAccount='" + validAccount + '\'' + + ", validCode='" + validCode + '\'' + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/CaptchaAuthenticationDTO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/CaptchaAuthenticationDTO.java new file mode 100644 index 0000000..beb8469 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/CaptchaAuthenticationDTO.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 验证码登陆 + * + * @author FrozenWatermelon + * @date 2020/7/1 + */ +public class CaptchaAuthenticationDTO extends AuthenticationDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "验证码", requiredMode = Schema.RequiredMode.REQUIRED) + private String captchaVerification; + + public String getCaptchaVerification() { + return captchaVerification; + } + + public void setCaptchaVerification(String captchaVerification) { + this.captchaVerification = captchaVerification; + } + + + @Override + public String toString() { + return "CaptchaAuthenticationDTO{" + "captchaVerification='" + captchaVerification + '\'' + "} " + + super.toString(); + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/feign/AccountFeignController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/feign/AccountFeignController.java new file mode 100644 index 0000000..4f17d87 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/feign/AccountFeignController.java @@ -0,0 +1,527 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.feign; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.bo.UserRegisterNotifyBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.*; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.auth.vo.TokenInfoVO; +import com.tmerclub.cloud.auth.manager.PasswordManager; +import com.tmerclub.cloud.auth.manager.TokenStore; +import com.tmerclub.cloud.auth.mapper.AuthAccountMapper; +import com.tmerclub.cloud.auth.mapper.AuthSocialMapper; +import com.tmerclub.cloud.auth.model.AuthAccount; +import com.tmerclub.cloud.auth.model.AuthSocial; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.UserAdminType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.security.bo.AuthAccountInVerifyBO; +import com.tmerclub.cloud.common.security.constant.InputUserNameEnum; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PasswordUtil; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import org.apache.dubbo.config.annotation.DubboService; +import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.client.producer.TransactionSendResult; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.transaction.annotation.Transactional; +import org.yaml.snakeyaml.tokens.ScalarToken; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/9/22 + */ +@DubboService +public class AccountFeignController implements AccountFeignClient { + + @Autowired + private AuthAccountMapper authAccountMapper; + @Autowired + private AuthSocialMapper authSocialMapper; + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private TokenStore tokenStore; + @Autowired + private RocketMQTemplate userNotifyRegisterTemplate; + @Autowired + private SegmentManager segmentManager; + @Autowired + private PasswordManager passwordManager; + + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity save(AuthAccountDTO authAccountDTO) { + + ServerResponseEntity verify = verify(authAccountDTO); + if (!verify.isSuccess()) { + return ServerResponseEntity.transform(verify); + } + AuthAccount data = verify.getData(); + // 设置uid + data.setUid(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_AUTH_USER)); + authAccountMapper.save(data); + + return ServerResponseEntity.success(data.getUid()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity update(AuthAccountDTO authAccountDTO) { + ServerResponseEntity verify = verify(authAccountDTO); + if (!verify.isSuccess()) { + return ServerResponseEntity.transform(verify); + } + AuthAccount authAccount = authAccountMapper.getByUserIdAndType(authAccountDTO.getUserId(), authAccountDTO.getSysType()); + if (!Objects.equals(authAccountDTO.getStatus(), 1)) { + if (Objects.equals(authAccount.getIsAdmin(), UserAdminType.ADMIN.value())) { + return ServerResponseEntity.showFailMsg("该账号为管理员不能禁用"); + } + + } + if (StrUtil.isBlank(verify.getData().getPassword())) { + verify.getData().setPassword(null); + } + authAccountMapper.updateAccountInfo(verify.getData()); + // 修改了用户的状态 or 密码 or 用户名,要将用户下线 + if (!Objects.equals(authAccountDTO.getStatus(), 1) || StrUtil.isNotBlank(verify.getData().getPassword()) + || !Objects.equals(authAccountDTO.getUsername(), authAccount.getUsername())) { + AuthAccount dbAccount = authAccountMapper.getByUserIdAndType(authAccountDTO.getUserId(), authAccountDTO.getSysType()); + tokenStore.deleteTokenByUidInfo(BeanUtil.map(dbAccount, UidInfoBO.class)); + } + return ServerResponseEntity.success(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity updateAuthAccountStatus(AuthAccountDTO authAccountDTO) { + if (Objects.isNull(authAccountDTO.getStatus())) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + AuthAccount authAccount = BeanUtil.map(authAccountDTO, AuthAccount.class); + authAccountMapper.updateAccountInfo(authAccount); + return ServerResponseEntity.success(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity deleteByUserIdAndSysType(Long userId) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + Integer sysType = uidInfoBO.getSysType(); + AuthAccount authAccount = authAccountMapper.getByUserIdAndType(userId, sysType); + if (Objects.isNull(authAccount)) { + return ServerResponseEntity.success(); + } + if (Objects.equals(authAccount.getIsAdmin(), UserAdminType.ADMIN.value())) { + throw new LuckException("管理员账号不能删除"); + } + authAccountMapper.deleteByUserIdAndSysType(userId, sysType); + + if (Objects.equals(sysType, SysTypeEnum.ORDINARY.value())) { + authSocialMapper.unBindUserByUid(authAccount.getUid()); + } + // 删除对应的token信息,使用户下线 + AuthAccount dbAccount = authAccountMapper.getByUserIdAndType(userId, sysType); + tokenStore.deleteTokenByUidInfo(BeanUtil.map(dbAccount, UidInfoBO.class)); + + return ServerResponseEntity.success(); + } + + @Override + public void deleteByTenantIdAndSysType(Long tenantId, Integer sysType) { + AuthAccountVO authAccountVO = authAccountMapper.getAccountInfoByTenantId(sysType, tenantId); + authAccountMapper.deleteByTenantIdAndSysType(tenantId, sysType); + // 清除缓存 + tokenStore.deleteTokenByUidInfo(BeanUtil.map(authAccountVO, UidInfoBO.class)); + } + + @Override + public ServerResponseEntity countByMobile(String mobile) { + return ServerResponseEntity.success(authAccountMapper.countByMobile(mobile, SysTypeEnum.ORDINARY.value())); + } + + @Override + public ServerResponseEntity getByUserIdAndSysType(Long userId, Integer sysType) { + AuthAccount authAccount = authAccountMapper.getByUserIdAndType(userId, sysType); + if (Objects.nonNull(authAccount)) { + authAccount.setPassword(null); + } + return ServerResponseEntity.success(BeanUtil.map(authAccount, AuthAccountVO.class)); + } + + @Override + public ServerResponseEntity getInsiderDataByUserIdAndSysType(Long userId, Integer sysType) { + return getByUserIdAndSysType(userId, sysType); + } + + @Override + public ServerResponseEntity getBySysTypeAndIsAdminAndTenantId(Integer sysType, Integer isAdmin, Long tenantId) { + AuthAccount authAccount = authAccountMapper.getBySysTypeAndIsAdminAndTenantId(sysType, isAdmin, tenantId); + if (Objects.nonNull(authAccount)) { + authAccount.setPassword(null); + } + return ServerResponseEntity.success(BeanUtil.map(authAccount, AuthAccountVO.class)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity saveAccountWithSocial(AuthAccountWithSocialDTO authAccountWithSocialDTO) { + AuthAccountDTO authAccount = authAccountWithSocialDTO.getAuthAccount(); + String tempUid = authAccountWithSocialDTO.getTempUid(); + + // 保存账户 + ServerResponseEntity serverResponse = save(authAccount); + if (!serverResponse.isSuccess()) { + return ServerResponseEntity.transform(serverResponse); + } + Long uid = serverResponse.getData(); + + // 如果有社交帐户信息 + if (tempUid != null) { + authSocialMapper.bindUidByTempUid(uid, tempUid); + } + + return ServerResponseEntity.success(uid); + } + + @Override + public ServerResponseEntity storeTokenAndGetVo(UidInfoBO uidInfoBO) { + return ServerResponseEntity.success(tokenStore.storeAndGetVo(uidInfoBO)); + } + + @Override + public ServerResponseEntity> listByUserAccount(String userName, String phone, String email, SysTypeEnum sysType) { + return ServerResponseEntity.success(authAccountMapper.listByUserAccount(userName, phone, email, sysType.value())); + } + + @Override + public ServerResponseEntity updateUserMobile(AuthAccountDTO authAccountDTO) { + if (authAccountMapper.countByMobile(authAccountDTO.getSysType(), authAccountDTO.getPhone()) > 0) { + throw new LuckException("该手机号码已在系统存在"); + } + authAccountMapper.updateUserMobile(authAccountDTO); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> listUserByUserIdsAndType(List userIds, Integer systemType) { + if (CollUtil.isEmpty(userIds)) { + return ServerResponseEntity.success(new ArrayList<>(0)); + } + List authAccountList = authAccountMapper.listUserByUserIdsAndType(userIds, systemType); + return ServerResponseEntity.success(authAccountList); + } + + @Override + public ServerResponseEntity> listByUserIdsAndPhoneAndType(List userIds, String phone, Integer sysType) { + List authAccountList = authAccountMapper.listByUserIdsAndPhoneAndType(userIds, phone, sysType); + return ServerResponseEntity.success(authAccountList); + } + + @Override + public ServerResponseEntity getByUserIdAndType(Long userId, Integer sysType) { + List authAccountList = authAccountMapper.listUserByUserIdsAndType(Collections.singletonList(userId), sysType); + if (CollUtil.isEmpty(authAccountList)) { + throw new LuckException("用户不存在或已删除"); + } + return ServerResponseEntity.success(authAccountList.get(0)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity updateUserInfoByUserIdAndSysType(UidInfoBO uidInfoBO, Long userId, Integer sysType) { + AuthAccount byUserIdAndType = authAccountMapper.getByUserIdAndType(userId, sysType); + uidInfoBO.setAccountUid(byUserIdAndType.getUid()); + tokenStore.updateUidInfo(uidInfoBO); + AuthAccount authAccount = BeanUtil.map(uidInfoBO, AuthAccount.class); + int res = authAccountMapper.updateUserInfoByUserId(authAccount, userId, sysType); + if (res != 1) { + throw new LuckException("用户信息错误,更新失败"); + } + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity countByMobileAndSysType(String mobile, Integer sysType) { + return ServerResponseEntity.success(authAccountMapper.countByMobile(mobile, sysType)); + } + + @Override + public ServerResponseEntity countByUserNameAndSysType(String userName, Integer sysType) { + return ServerResponseEntity.success(authAccountMapper.countByUserNameAndSysType(userName, sysType)); + } + + @Override + public ServerResponseEntity> listUserNameByNames(List names) { + if (CollUtil.isEmpty(names)) { + return ServerResponseEntity.success(new ArrayList<>(0)); + } + return ServerResponseEntity.success(authAccountMapper.listUserNameByNames(names)); + } + + @Override + public ServerResponseEntity updateNoAuditUidInfo(UidInfoBO uidInfoBO) { + AuthAccount byUserIdAndType = authAccountMapper.getByUserIdAndType(uidInfoBO.getUserId(), uidInfoBO.getSysType()); + uidInfoBO.setAccountUid(byUserIdAndType.getUid()); + AuthAccount authAccount = BeanUtil.map(uidInfoBO, AuthAccount.class); + StringBuffer uidBuffer = new StringBuffer(); + uidBuffer.append(uidInfoBO.getSysType()).append(Constant.UNDERLINE) + .append(uidInfoBO.getAccountUid()).append(Constant.UNDERLINE) + .append(uidInfoBO.getUserId()).append(Constant.UNDERLINE) + // 未开店成功的店铺、供应商id默认是-1 + .append(byUserIdAndType.getTenantId()).append(Constant.UNDERLINE) + .append(uidInfoBO.getIsAdmin()).append(Constant.UNDERLINE) + // 未开店成功的店铺、供应商默认是未入驻 + .append(byUserIdAndType.getIsPassShop()); + tokenStore.updateUidInfoByUid(uidBuffer.toString(), uidInfoBO); + int res = authAccountMapper.updateUserInfoByUserId(authAccount, uidInfoBO.getUserId(), uidInfoBO.getSysType()); + if (res != 1) { + throw new LuckException("用户信息错误,更新失败"); + } + return ServerResponseEntity.success(); + } + + + @Override + public ServerResponseEntity updateAuthAccountStatusAndDeleteUserToken(AuthAccountDTO authAccountDTO) { + // 修改了用户的状态,应该要将用户下线 + if (Objects.isNull(authAccountDTO.getUserId())) { + throw new LuckException("用户id不能为空"); + } + if (Objects.isNull(authAccountDTO.getSysType())) { + throw new LuckException("系统类型不能为空"); + } + if (Objects.isNull(authAccountDTO.getStatus())) { + throw new LuckException("用户状态不能为空"); + } + AuthAccount authAccount = BeanUtil.map(authAccountDTO, AuthAccount.class); + authAccountMapper.updateAccountInfo(authAccount); + // 删除对应的token信息,使用户下线 + AuthAccount dbAccount = authAccountMapper.getByUserIdAndType(authAccountDTO.getUserId(), authAccountDTO.getSysType()); + tokenStore.deleteTokenByUidInfo(BeanUtil.map(dbAccount, UidInfoBO.class)); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> getBizUserIdListByUserId(Long userId) { + List bizUserIdListByUserId = authAccountMapper.getBizUserIdListByUserId(userId); + return ServerResponseEntity.success(bizUserIdListByUserId); + } + + @Override + public ServerResponseEntity getBizUserIdByTempUid(String tempUid) { + AuthSocial authSocial = authSocialMapper.getByTempUid(tempUid); + AuthSocialDTO authSocialDTO = new AuthSocialDTO(); + BeanUtils.copyProperties(authSocial, authSocialDTO); + return ServerResponseEntity.success(authSocialDTO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity batchRegisterAccount(AuthAccountUserDTO authAccountUserDTO) { + List accountDTOList = authAccountUserDTO.getAccountDTOList(); + if (CollUtil.isEmpty(accountDTOList)) { + ServerResponseEntity.showFailMsg("用户信息列表为空"); + } + accountDTOList = filterAuthAccountsByPhonesOrEmailsOrUserNames(accountDTOList); + int size = accountDTOList.size(); + if (CollUtil.isEmpty(accountDTOList)) { + ServerResponseEntity.showFailMsg("符合导入规则的数据" + size + "条"); + } + List authAccounts = new ArrayList<>(Constant.INITIAL_CAPACITY); + int i = 0; + for (AuthAccountDTO authAccountDTO : accountDTOList) { + // 邮箱 + if (StrUtil.isNotBlank(authAccountDTO.getEmail()) && !PrincipalUtil.isEmail(authAccountDTO.getEmail())) { + continue; + } + // 手机号 + if (StrUtil.isNotBlank(authAccountDTO.getPhone()) && !PrincipalUtil.isMobile(authAccountDTO.getPhone())) { + continue; + } + AuthAccount authAccount = BeanUtil.map(authAccountDTO, AuthAccount.class); + // 设置分布式id + Long uid = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_AUTH_USER); + authAccount.setUid(uid); + authAccounts.add(authAccount); + i++; + } + + + // 批量注册用户 + if (CollUtil.isNotEmpty(authAccounts)) { + List userIds = authAccounts.stream().map(AuthAccount::getUserId).toList(); + // 需要插入的用户信息 + List userRegisterList = authAccountUserDTO.getUserRegisterList(); + List userRegisterExtensionDTOList = authAccountUserDTO.getUserRegisterExtensionDTOList(); + List userList = userRegisterList.stream().filter(item -> userIds.contains(item.getUserId())).collect(Collectors.toList()); + List userExtensionList = userRegisterExtensionDTOList.stream().filter(item -> userIds.contains(item.getUserId())).collect(Collectors.toList()); + UserRegisterNotifyBO userRegisterNotifyBO = new UserRegisterNotifyBO(BeanUtil.mapAsList(authAccounts, AuthAccountDTO.class), userList, userExtensionList); + // 发送用户注册事件 + TransactionSendResult transactionSendResult = userNotifyRegisterTemplate.sendMessageInTransaction(RocketMqConstant.BATCH_USER_REGISTER_TOPIC, new GenericMessage<>(userRegisterNotifyBO), authAccounts); + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + return ServerResponseEntity.success(String.valueOf(userIds.size())); + } + return ServerResponseEntity.showFailMsg("无数据导入"); + } + + @Override + public ServerResponseEntity getAccountInfoByTenantId(Long tenantId, Integer sysType) { + sysType = Objects.isNull(sysType) ? AuthUserContext.get().getSysType() : sysType; + AuthAccountVO authAccountVO = authAccountMapper.getAccountInfoByTenantId(sysType, tenantId); + if (Objects.isNull(authAccountVO)) { + throw new LuckException("找不到此账户信息,账户已删除"); + } + return ServerResponseEntity.success(authAccountVO); + } + + @Override + public ServerResponseEntity verifyAccount(AuthAccountDTO authAccountDTO) { + ServerResponseEntity verify = verify(authAccountDTO); + if (!verify.isSuccess()) { + return ServerResponseEntity.showFailMsg(verify.getMsg()); + } + return ServerResponseEntity.success(verify.isSuccess()); + } + + /** + * 过滤掉已经存在的 手机号号 用户名 邮箱 的账户 + * + * @param accountDTOList 未过滤前的账户集合 + * @return 过滤后的账户集合 + */ + private List filterAuthAccountsByPhonesOrEmailsOrUserNames(List accountDTOList) { + List phones = accountDTOList.stream().map(AuthAccountDTO::getPhone).distinct().filter(StrUtil::isNotBlank).collect(Collectors.toList()); + List emails = accountDTOList.stream().map(AuthAccountDTO::getEmail).distinct().filter(StrUtil::isNotBlank).collect(Collectors.toList()); + // 获取已存在的email用户 + List dbEmails; + if (CollUtil.isNotEmpty(emails)) { + List authAccountEmailList = authAccountMapper.getAuthAccountByInputUserName(InputUserNameEnum.EMAIL.value(), emails, SysTypeEnum.ORDINARY.value()); + if (CollUtil.isNotEmpty(authAccountEmailList)) { + dbEmails = authAccountEmailList.stream().map(AuthAccountVO::getEmail).collect(Collectors.toList()); + } else { + dbEmails = new ArrayList<>(0); + } + } else { + dbEmails = new ArrayList<>(0); + } + // 获取已存在的phone用户 + List dbPhones; + if (CollUtil.isNotEmpty(phones)) { + List authAccountPhoneList = authAccountMapper.getAuthAccountByInputUserName(InputUserNameEnum.PHONE.value(), phones, SysTypeEnum.ORDINARY.value()); + if (CollUtil.isNotEmpty(authAccountPhoneList)) { + dbPhones = authAccountPhoneList.stream().map(AuthAccountVO::getPhone).collect(Collectors.toList()); + } else { + dbPhones = new ArrayList<>(0); + } + } else { + dbPhones = new ArrayList<>(0); + } + // 过滤已存在的 username email phone用户 + accountDTOList = accountDTOList.stream().filter(item -> { + boolean isExist = dbEmails.contains(item.getEmail()) || dbPhones.contains(item.getPhone()); + return !isExist; + }).collect(Collectors.toList()); + // 过滤掉邮箱用户重复的数据。导入的用户手机号不为空,phone已经过滤了,响应的username也过滤了,这里只给邮箱去重就可以了 + List accountList = accountDTOList.stream().filter(item -> Objects.isNull(item.getEmail())).collect(Collectors.toList()); + accountDTOList = accountDTOList.stream() + .filter(item -> Objects.nonNull(item.getEmail())) + .collect(Collectors.collectingAndThen( + Collectors.toCollection(() -> + new TreeSet<>(Comparator.comparing(AuthAccountDTO::getEmail, Comparator.nullsLast(String::compareTo)))), ArrayList::new)); + accountList.addAll(accountDTOList); + return accountList; + } + + private ServerResponseEntity verify(AuthAccountDTO authAccountDTO) { + boolean isStationAccount = authAccountDTO.getSysType() != null + && Objects.equals(SysTypeEnum.STATION.value(), authAccountDTO.getSysType()); + // 用户名(自提门店账号无格式要求) + if (!isStationAccount + && StrUtil.isNotBlank(authAccountDTO.getUsername()) + && !PrincipalUtil.isUserName(authAccountDTO.getUsername())) { + return ServerResponseEntity.showFailMsg("用户名格式不正确"); + } + + // 邮箱 + if (StrUtil.isNotBlank(authAccountDTO.getEmail()) && !PrincipalUtil.isEmail(authAccountDTO.getEmail())) { + return ServerResponseEntity.showFailMsg("邮箱格式不正确"); + } + + // 手机号 + if (StrUtil.isNotBlank(authAccountDTO.getPhone()) && !PrincipalUtil.isMobile(authAccountDTO.getPhone())) { + return ServerResponseEntity.showFailMsg("手机号格式不正确"); + } + + if (StrUtil.isNotBlank(authAccountDTO.getUsername())) { + AuthAccountInVerifyBO userNameBo = authAccountMapper.getAuthAccountInVerifyByInputUserName(InputUserNameEnum.USERNAME.value(), authAccountDTO.getUsername(), authAccountDTO.getSysType()); + if (userNameBo != null && !Objects.equals(userNameBo.getUserId(), authAccountDTO.getUserId())) { + String failMsg; + if (isStationAccount) { + failMsg = "账号已存在,请更换账号名再次尝试"; + } else { + failMsg = "用户名已存在,请更换用户名再次尝试"; + } + return ServerResponseEntity.showFailMsg(failMsg); + } + } + + if (StrUtil.isNotBlank(authAccountDTO.getEmail())) { + AuthAccountInVerifyBO emailBO = authAccountMapper.getAuthAccountInVerifyByInputUserName(InputUserNameEnum.EMAIL.value(), authAccountDTO.getEmail(), authAccountDTO.getSysType()); + if (emailBO != null && !Objects.equals(emailBO.getUserId(), authAccountDTO.getUserId())) { + return ServerResponseEntity.showFailMsg("邮箱已存在,请更换邮箱再次尝试"); + } + } + + if (StrUtil.isNotBlank(authAccountDTO.getPhone())) { + AuthAccountInVerifyBO phoneBo = authAccountMapper.getAuthAccountInVerifyByInputUserName(InputUserNameEnum.PHONE.value(), authAccountDTO.getPhone(), authAccountDTO.getSysType()); + if (phoneBo != null && !Objects.equals(phoneBo.getUserId(), authAccountDTO.getUserId())) { + return ServerResponseEntity.showFailMsg("手机号已存在,请更换手机号再次尝试"); + } + } + + AuthAccount authAccount = BeanUtil.map(authAccountDTO, AuthAccount.class); + + if (StrUtil.isNotBlank(authAccount.getPassword())) { + ServerResponseEntity decryptPasswordEntity = passwordManager.decryptPassword(authAccount.getPassword()); + if (!decryptPasswordEntity.isSuccess()) { + return ServerResponseEntity.transform(decryptPasswordEntity); + } + // 密码格式检验 + if (!PasswordUtil.checkFormat(decryptPasswordEntity.getData())) { + return ServerResponseEntity.showFailMsg("密码由字母加数字或符号至少两种以上字符组成6-20位半角字符,区分大小写"); + } + authAccount.setPassword(passwordEncoder.encode(decryptPasswordEntity.getData())); + } + + return ServerResponseEntity.success(authAccount); + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/manager/PasswordManager.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/manager/PasswordManager.java new file mode 100644 index 0000000..629e58c --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/manager/PasswordManager.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.manager; + +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.symmetric.AES; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.nio.charset.StandardCharsets; + +/** + * @author 菠萝凤梨 + * @date 2022/1/19 16:02 + */ +@Component +public class PasswordManager { + private static final Logger logger = LoggerFactory.getLogger(PasswordManager.class); + private static final long TEN_MINUTES = 1000 * 60 * 10; + + /** + * 用于aes签名的key,16位 + */ + @Value("${auth.password.signKey}") + public String passwordSignKey; + + public ServerResponseEntity decryptPassword(String data) { + SecureUtil.disableBouncyCastle(); + AES aes = new AES(passwordSignKey.getBytes(StandardCharsets.UTF_8)); + String decryptStr; + String decryptPassword; + try { + decryptStr = aes.decryptStr(data); + long currentTimeMillis = System.currentTimeMillis(); + long timestamp = Long.parseLong(decryptStr.substring(0, 13)); + // 签名时间大于十分钟,提示请求超时 + if (timestamp + TEN_MINUTES < currentTimeMillis) { + return ServerResponseEntity.showFailMsg("请求超时"); + } + decryptPassword = decryptStr.substring(13); + } catch (Exception e) { + logger.error(e.getMessage()); + return ServerResponseEntity.showFailMsg("AES解密错误"); + } + return ServerResponseEntity.success(decryptPassword); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/mapper/AuthAccountMapper.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/mapper/AuthAccountMapper.java new file mode 100644 index 0000000..4978335 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/mapper/AuthAccountMapper.java @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.mapper; + +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.auth.model.AuthAccount; +import com.tmerclub.cloud.common.security.bo.AuthAccountInVerifyBO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/7/2 + */ +public interface AuthAccountMapper { + + /** + * 根据输入的用户名及用户名类型获取用户信息 + * + * @param inputUserNameType 输入的用户名类型 1.username 2.mobile 3.email + * @param inputUserName 输入的用户名 + * @param sysType 系统类型 + * @return 用户在token中信息 + 数据库中的密码 + */ + AuthAccountInVerifyBO getAuthAccountInVerifyByInputUserName(@Param("inputUserNameType") Integer inputUserNameType, + @Param("inputUserName") String inputUserName, @Param("sysType") Integer sysType); + + /** + * 根据用户id 和系统类型获取平台唯一用户 + * + * @param userId 用户id + * @param sysType 系统类型 + * @return 平台唯一用户 + */ + AuthAccount getByUserIdAndType(@Param("userId") Long userId, @Param("sysType") Integer sysType); + + /** + * 根据用户id 和系统类型获取平台唯一用户 + * + * @param sysType 系统类型 + * @param isAdmin 是否管理员 + * @param tenantId 租户id + * @return 平台唯一用户 + */ + AuthAccount getBySysTypeAndIsAdminAndTenantId(@Param("sysType") Integer sysType, @Param("isAdmin") Integer isAdmin, @Param("tenantId") Long tenantId); + + /** + * 根据getByUid获取平台唯一用户 + * + * @param uid uid + * @return 平台唯一用户 + */ + AuthAccount getByUid(@Param("uid") Long uid); + + /** + * 更新密码 根据用户id 和系统类型 + * + * @param userId 用户id + * @param sysType 系统类型 + * @param newPassWord 新密码 + */ + void updatePassword(@Param("userId") Long userId, @Param("sysType") Integer sysType, @Param("newPassWord") String newPassWord); + + /** + * 保存 + * + * @param authAccount + */ + void save(@Param("authAccount") AuthAccount authAccount); + + /** + * 更新 + * + * @param authAccount authAccount + */ + void updateAccountInfo(@Param("authAccount") AuthAccount authAccount); + + /** + * 根据用户id和系统类型删除用户 + * + * @param userId 用户id + * @param sysType 系统类型 + */ + void deleteByUserIdAndSysType(@Param("userId") Long userId, @Param("sysType") Integer sysType); + + /** + * 删除账号(通过租户id和系统类型) + * + * @param tenantId 租户id + * @param sysType 系统类型 + */ + void deleteByTenantIdAndSysType(@Param("tenantId") Long tenantId, @Param("sysType") Integer sysType); + + /** + * 根据手机号获取存在用户的数量 + * + * @param mobile 手机号 + * @param sysType 系统类型 + * @return 数量 + */ + int countByMobile(@Param("mobile") String mobile, @Param("sysType") Integer sysType); + + /** + * 根据手机号获取uid + * + * @param validAccount 手机号 or 邮箱 + * @param systemType 系统类型 + * @return uid + */ + AuthAccount getAccountByInputAccount(@Param("validAccount") String validAccount, @Param("systemType") Integer systemType); + + /** + * 根据账号信息,获取对应的用户列表 + * + * @param userName + * @param phone + * @param email + * @param sysType + * @return + */ + List listByUserAccount(@Param("userName") String userName, @Param("phone") String phone, @Param("email") String email, @Param("sysType") Integer sysType); + + /** + * 根据用户id及系统类型修改用户手机号 + * + * @param authAccountDTO 用户信息 + * @return void + */ + void updateUserMobile(@Param("authAccountDTO") AuthAccountDTO authAccountDTO); + + /** + * 根据用户id和系统类型,获取账号列表信息 + * + * @param userIds + * @param systemType + * @return + */ + List listUserByUserIdsAndType(@Param("userIds") List userIds, @Param("systemType") Integer systemType); + + /** + * 根据用户ids,或者电话号码,系统类型获取用户列表 + * + * @param userIds + * @param phone + * @param sysType + * @return + */ + List listByUserIdsAndPhoneAndType(@Param("userIds") List userIds, @Param("phone") String phone, @Param("sysType") Integer sysType); + + /** + * 根据用户id更新租户id + * + * @param authAccount + * @param userId + * @param sysType + * @return + */ + int updateUserInfoByUserId(@Param("authAccount") AuthAccount authAccount, @Param("userId") Long userId, @Param("sysType") Integer sysType); + + /** + * 根据用户id获取用户的微信小程序的userid集合 + * + * @param userId 手机号 + * @return 第三方微信小程序的userid集合 + */ + List getBizUserIdListByUserId(@Param("userId") Long userId); + + /** + * 根据查询参数获取账户列表 + * + * @param inputUserNameType 输入的用户名类型枚举 1.username 2.mobile 3.email + * @param params 用户手机号集合 / 邮箱集合 / 用户名集合 + * @param sysType 用户类型 + * @return 账户集合 + */ + List getAuthAccountByInputUserName(@Param("inputUserNameType") Integer inputUserNameType, @Param("params") List params, @Param("sysType") Integer sysType); + + /** + * 批量注册账户,必须使用条件插入,保证用户批量注册唯一性 + * 该接口只能于用户批量注册普通用户 + * 需要确定需要批量插入的集合本身 里面的手机号 邮箱 用户名 不存在重复的数据 + * + * @param authAccounts 账户参数集合 + * @return 行数 + */ + int batchSaveAccounts(@Param("authAccounts") List authAccounts); + + /** + * 统计用户数量 + * + * @param userIds 用户id集合 + * @param sysType 系统类型 + * @return 数量 + */ + int countByUserIds(@Param("userIds") List userIds, @Param("sysType") Integer sysType); + + /** + * 根据租户id获取商家信息 + * + * @param sysType + * @param tenantId + * @return + */ + AuthAccountVO getAccountInfoByTenantId(@Param("sysType") Integer sysType, @Param("tenantId") Long tenantId); + + /** + * 统计手机号码的使用数量 + * + * @param sysType 0.普通用户系统 1.商家端 2平台端 + * @param mobile 手机号码 + * @return 数量 + */ + int countByMobile(@Param("sysType") Integer sysType, @Param("mobile") String mobile); + + /** + * 根据用户名和用户类型查看用户名的使用数量 + * + * @param userName + * @param sysType + * @return + */ + int countByUserNameAndSysType(@Param("userName") String userName, @Param("sysType") Integer sysType); + + /** + * 获取已存在的用户名称 + * + * @param names + * @return + */ + List listUserNameByNames(@Param("names") List names); +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/mapper/AuthSocialMapper.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/mapper/AuthSocialMapper.java new file mode 100644 index 0000000..e6c5c52 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/mapper/AuthSocialMapper.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.mapper; + +import com.tmerclub.cloud.api.auth.vo.AuthSocialVO; +import com.tmerclub.cloud.auth.model.AuthSocial; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户社交登陆信息 + * + * @author lhd + * @date 2021-01-06 10:26:53 + */ +public interface AuthSocialMapper { + + /** + * 保存用户社交登陆信息 + * + * @param authSocial 用户社交登陆信息 + */ + void save(@Param("authSocial") AuthSocial authSocial); + + /** + * 更新用户社交登陆信息 + * + * @param authSocial 用户社交登陆信息 + */ + void update(@Param("authSocial") AuthSocial authSocial); + + /** + * 根据社交账号userId和类型获取用户社交账号信息 + * + * @param bizUserId 第三方系统userId + * @param socialType 第三方系统类型 + * @return 用户社交账号信息 + */ + AuthSocial getByBizUserIdAndType(@Param("bizUserId") String bizUserId, @Param("socialType") Integer socialType); + + /** + * 获取根据尝试社交登录时,保存的临时的uid获取社交 + * + * @param tempUid tempUid + * @return 用户社交账号信息 + */ + AuthSocial getByTempUid(@Param("tempUid") String tempUid); + + /** + * 绑定社交账号,通过tempuid + * + * @param uid uid + * @param tempUid tempUid + */ + void bindUidByTempUid(@Param("uid") Long uid, @Param("tempUid") String tempUid); + + /** + * 获取在微信公众号/小程序 绑定的账号数量 + * + * @param uid uid + * @param socialType 社交帐号类型 + * @return 绑定账号的数量 + */ + int countByUidAndSocialType(@Param("uid") Long uid, @Param("socialType") Integer socialType); + + + /** + * 解除用户绑定 + * + * @param bizUserId openid + * @param socialType 社交账号类型 + */ + void unBindUser(@Param("bizUserId") String bizUserId, @Param("socialType") Integer socialType); + + /** + * 解除用户绑定 + * + * @param uid 用户id + */ + void unBindUserByUid(@Param("uid") Long uid); + + /** + * 获取可用的社交账号 + * @return + */ + List listAvailableSocial(); + + /** + * 根据平台唯一id uid 和类型获取用户社交账号信息 + * + * @param uid 平台唯一id + * @param socialType 第三方系统类型 + * @return 用户社交账号信息 + */ + AuthSocial getByUidAndType(@Param("uid") Long uid, @Param("socialType") Integer socialType); +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/model/AuthAccount.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/model/AuthAccount.java new file mode 100644 index 0000000..0032b2a --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/model/AuthAccount.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 统一账户信息 + * + * @author FrozenWatermelon + * @date 2020/07/02 + */ +public class AuthAccount extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 全平台用户唯一id + */ + private Long uid; + + /** + * 邮箱 + */ + private String email; + + /** + * 手机号 + */ + private String phone; + + /** + * 用户名 + */ + private String username; + + /** + * 密码 + */ + private String password; + + /** + * 创建ip + */ + private String createIp; + + /** + * 状态 1:启用 0:禁用 -1:删除 + */ + private Integer status; + + /** + * 系统类型见SysTypeEnum 0.普通用户系统 1.商家端 + */ + private Integer sysType; + + /** + * 用户id + */ + private Long userId; + + /** + * 所属租户 + */ + private Long tenantId; + + /** + * 是否是管理员 + */ + private Integer isAdmin; + + /** + * 店铺是否已经入驻 0: 未入驻,1:已入驻 + */ + private Integer isPassShop; + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getCreateIp() { + return createIp; + } + + public void setCreateIp(String createIp) { + this.createIp = createIp; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + + public Integer getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(Integer isAdmin) { + this.isAdmin = isAdmin; + } + + public Integer getIsPassShop() { + return isPassShop; + } + + public void setIsPassShop(Integer isPassShop) { + this.isPassShop = isPassShop; + } + + @Override + public String toString() { + return "AuthAccount{" + + "uid=" + uid + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", createIp='" + createIp + '\'' + + ", status=" + status + + ", sysType=" + sysType + + ", userId=" + userId + + ", tenantId=" + tenantId + + ", isAdmin=" + isAdmin + + ", isPassShop=" + isPassShop + + '}'; + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/model/AuthSocial.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/model/AuthSocial.java new file mode 100644 index 0000000..e0aca45 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/model/AuthSocial.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户社交登陆信息 + * + * @author FrozenWatermelon + * @date 2020/07/02 + */ +public class AuthSocial extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long id; + + /** + * 本系统uid + */ + private Long uid; + + /** + * 当账户未绑定时,临时的uid + */ + private String tempUid; + + /** + * 第三方系统类型 1小程序 2 公众号 + */ + private Integer socialType; + + /** + * 第三方系统昵称 + */ + private String nickName; + + /** + * 第三方系统头像 + */ + private String imageUrl; + + /** + * 第三方系统userid + */ + private String bizUserId; + + /** + * 第三方系统unionid + */ + private String bizUnionid; + + /** + * 有些时候第三方系统授权之后,会有个临时的key,比如小程序的session_key + */ + private String bizTempSession; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public Integer getSocialType() { + return socialType; + } + + public void setSocialType(Integer socialType) { + this.socialType = socialType; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getBizUnionid() { + return bizUnionid; + } + + public void setBizUnionid(String bizUnionid) { + this.bizUnionid = bizUnionid; + } + + public String getTempUid() { + return tempUid; + } + + public void setTempUid(String tempUid) { + this.tempUid = tempUid; + } + + public String getBizTempSession() { + return bizTempSession; + } + + public void setBizTempSession(String bizTempSession) { + this.bizTempSession = bizTempSession; + } + + @Override + public String toString() { + return "AuthSocial{" + + "id=" + id + + ", uid=" + uid + + ", tempUid='" + tempUid + '\'' + + ", socialType=" + socialType + + ", nickName='" + nickName + '\'' + + ", imageUrl='" + imageUrl + '\'' + + ", bizUserId='" + bizUserId + '\'' + + ", bizUnionid='" + bizUnionid + '\'' + + ", bizTempSession='" + bizTempSession + '\'' + + '}'; + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/AuthSocialService.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/AuthSocialService.java new file mode 100644 index 0000000..2f28042 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/AuthSocialService.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.service; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.auth.model.AuthSocial; +import org.apache.ibatis.annotations.Param; + +/** + * @author FrozenWatermelon + * @date 2020/7/2 + */ +public interface AuthSocialService { + + /** + * 获取社交账号信息 + * @param bizUserId 第三方社交账号的id + * @param socialType 社交账号类型 1 小程序 2 公众号 + * @return + */ + AuthSocial getByBizUserId(String bizUserId, Integer socialType); + + /** + * 保存或更新社交账户 + * @param authSocial authSocial + */ + void saveOrUpdate(AuthSocial authSocial); + + /** + * 获取根据尝试社交登录时,保存的临时的uid获取社交 + * + * @param tempUid tempUid + * @return 用户社交账号信息 + */ + AuthSocial getByTempUid(@Param("tempUid") String tempUid); + + /** + * 获取在微信公众号/小程序 绑定的账号数量 + * @param uid uid + * @param socialType 社交帐号类型 + * @return 绑定账号的数量 + */ + int countByUidAndSocialType(Long uid, Integer socialType); + + /** + * 绑定社交账号 + * @param authSocial + * @param uidInfoBO + */ + void bindSocial(AuthSocial authSocial, UidInfoBO uidInfoBO); +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/impl/AuthAccountServiceImpl.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/impl/AuthAccountServiceImpl.java new file mode 100644 index 0000000..3f653e8 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/impl/AuthAccountServiceImpl.java @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.LoginType; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.auth.constant.AuthAccountStatusEnum; +import com.tmerclub.cloud.auth.manager.PasswordManager; +import com.tmerclub.cloud.auth.mapper.AuthAccountMapper; +import com.tmerclub.cloud.auth.model.AuthAccount; +import com.tmerclub.cloud.auth.service.AuthAccountService; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.bo.AuthAccountInVerifyBO; +import com.tmerclub.cloud.common.security.constant.InputUserNameEnum; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PasswordUtil; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/7/2 + */ +@Service +public class AuthAccountServiceImpl implements AuthAccountService { + + @Resource + private AuthAccountMapper authAccountMapper; + + @Autowired + private PasswordEncoder passwordEncoder; + + + @Autowired + private PasswordManager passwordManager; + + public static final String USER_NOT_FOUND_SECRET = "USER_NOT_FOUND_SECRET"; + + private static String userNotFoundEncodedPassword; + + @Override + public ServerResponseEntity getUserInfoInTokenByInputUserNameAndPassword(String inputUserName, + String password, Integer sysType, Integer loginType) { + + String decryptPassword = null; + if (Objects.equals(loginType, LoginType.PASSWORD.value())) { + ServerResponseEntity passWordResponse = passwordManager.decryptPassword(password); + if (!passWordResponse.isSuccess()) { + return ServerResponseEntity.transform(passWordResponse); + } + decryptPassword = passWordResponse.getData(); + // 自提门店端密码可以为空格 + if (!Objects.equals(SysTypeEnum.STATION.value(), sysType) + && StrUtil.isBlank(decryptPassword)) { + return ServerResponseEntity.showFailMsg("密码不能为空"); + } + } + if (StrUtil.isBlank(inputUserName)) { + return ServerResponseEntity.showFailMsg("用户名不能为空"); + } + + InputUserNameEnum inputUserNameEnum = null; + + // 邮箱 + if (PrincipalUtil.isEmail(inputUserName)) { + inputUserNameEnum = InputUserNameEnum.EMAIL; + } + + // 手机号 + if (PrincipalUtil.isMobile(inputUserName)) { + inputUserNameEnum = InputUserNameEnum.PHONE; + } + + // 用户名(自提门店账户名无限制) + if (Objects.equals(SysTypeEnum.STATION.value(), sysType) + || PrincipalUtil.isUserName(inputUserName)) { + inputUserNameEnum = InputUserNameEnum.USERNAME; + } + + if (inputUserNameEnum == null) { + return ServerResponseEntity.showFailMsg("用户名或密码不正确"); + } + + AuthAccountInVerifyBO authAccountInVerifyBO = authAccountMapper + .getAuthAccountInVerifyByInputUserName(inputUserNameEnum.value(), inputUserName, sysType); + // 账号安全校验 + if (Objects.equals(loginType, LoginType.PASSWORD.value())) { + if (authAccountInVerifyBO == null) { + prepareTimingAttackProtection(); + // 再次进行运算,防止计时攻击 + // 计时攻击(Timing + // attack),通过设备运算的用时来推断出所使用的运算操作,或者通过对比运算的时间推定数据位于哪个存储设备,或者利用通信的时间差进行数据窃取。 + mitigateAgainstTimingAttack(decryptPassword); + return ServerResponseEntity.showFailMsg("用户名或密码不正确"); + } + if (Objects.equals(loginType, LoginType.PASSWORD.value()) && !passwordEncoder.matches(decryptPassword, authAccountInVerifyBO.getPassword())) { + return ServerResponseEntity.showFailMsg("用户名或密码不正确"); + } + } + if (authAccountInVerifyBO != null + && Objects.equals(authAccountInVerifyBO.getStatus(), AuthAccountStatusEnum.DISABLE.value())) { + return ServerResponseEntity.showFailMsg("用户已禁用,请联系客服"); + } + + return ServerResponseEntity.success(BeanUtil.map(authAccountInVerifyBO, UidInfoBO.class)); + } + + @Override + public AuthAccount getByUserIdAndType(Long userId, Integer sysType) { + return authAccountMapper.getByUserIdAndType(userId, sysType); + } + + @Override + public void updatePassword(Long userId, Integer sysType, String newPassWord) { + PasswordUtil.check(newPassWord); + authAccountMapper.updatePassword(userId, sysType, passwordEncoder.encode(newPassWord)); + } + + @Override + public AuthAccount getByUid(Long uid) { + return authAccountMapper.getByUid(uid); + } + + @Override + public AuthAccount getAccountByInputUserName(String mobile, Integer systemType) { + return authAccountMapper.getAccountByInputAccount(mobile, systemType); + } + + @Override + public int getByMobile(String mobile) { + + return authAccountMapper.countByMobile(mobile, SysTypeEnum.ORDINARY.value()); + } + + @Override + public int batchSaveAccounts(List authAccounts) { + return authAccountMapper.batchSaveAccounts(authAccounts); + } + + @Override + public int countByUserIds(List userIds, Integer sysType) { + return authAccountMapper.countByUserIds(userIds, sysType); + } + + /** + * 防止计时攻击 + */ + private void prepareTimingAttackProtection() { + if (userNotFoundEncodedPassword == null) { + userNotFoundEncodedPassword = this.passwordEncoder.encode(USER_NOT_FOUND_SECRET); + } + } + + /** + * 防止计时攻击 + */ + private void mitigateAgainstTimingAttack(String presentedPassword) { + if (presentedPassword != null) { + this.passwordEncoder.matches(presentedPassword, userNotFoundEncodedPassword); + } + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/impl/AuthSocialServiceImpl.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/impl/AuthSocialServiceImpl.java new file mode 100644 index 0000000..329d810 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/impl/AuthSocialServiceImpl.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.service.impl; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.PersonalMemberInfo; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.auth.mapper.AuthSocialMapper; +import com.tmerclub.cloud.auth.model.AuthSocial; +import com.tmerclub.cloud.auth.service.AuthSocialService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/7/2 + */ +@Service +public class AuthSocialServiceImpl implements AuthSocialService { + + @Autowired + private AuthSocialMapper authSocialMapper; + + @DubboReference + private ConfigFeignClient configFeignClient; + + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + + @Override + public AuthSocial getByBizUserId(String bizUserId, Integer socialType) { + return authSocialMapper.getByBizUserIdAndType(bizUserId, socialType); + } + + @Override + public void saveOrUpdate(AuthSocial authSocial) { + if (authSocial.getId() == null) { + authSocialMapper.save(authSocial); + } else { + authSocialMapper.update(authSocial); + } + } + + @Override + public AuthSocial getByTempUid(String tempUid) { + return authSocialMapper.getByTempUid(tempUid); + } + + @Override + public int countByUidAndSocialType(Long uid, Integer socialType) { + return authSocialMapper.countByUidAndSocialType(uid, socialType); + } + + @Override + public void bindSocial(AuthSocial authSocial, UidInfoBO uidInfoBO) { + authSocial.setUid(uidInfoBO.getAccountUid()); + authSocialMapper.update(authSocial); + // 是否开启通联支付,是则为账号绑定支付标识(若用户已绑定手机则不需要) + Integer paySysType = configFeignClient.getPaySysType().getData(); + if (Objects.equals(paySysType, PaySysType.ALLINPAY.value())) { + PersonalMemberInfo memberInfo = allinpayFeignClient.getPersonalMemberInfo(uidInfoBO.getUserId().toString()).getData(); + if (Objects.nonNull(memberInfo) + && !memberInfo.getPhoneChecked()) { + allinpayFeignClient.bindPayAcct(uidInfoBO.getUserId(), authSocial.getBizUserId(), authSocial.getSocialType()); + } + } + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java new file mode 100644 index 0000000..508305f --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.constant; + +/** + * 分布式id key + * + * @author FrozenWatermelon + * @date 2021/4/9 + */ +public interface DistributedIdKey { + + /** + * 统一用户id uid + */ + String MALL4CLOUD_AUTH_USER = "mall4cloud-auth-account"; +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/controller/MenuPermissionController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/controller/MenuPermissionController.java new file mode 100644 index 0000000..c05f602 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/controller/MenuPermissionController.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.controller; + +import cn.hutool.core.util.BooleanUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.rbac.dto.MenuPermissionDTO; +import com.tmerclub.cloud.rbac.model.MenuPermission; +import com.tmerclub.cloud.rbac.service.MenuPermissionService; +import com.tmerclub.cloud.rbac.vo.MenuPermissionVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/09/02 + */ +@RequestMapping("/mp/menu_permission") +@RestController +@Tag(name = "权限接口") +public class MenuPermissionController { + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + @Autowired + private MenuPermissionService menuPermissionService; + + + @GetMapping("/list_by_menu") + @Operation(summary = "获取菜单资源列表", description = "分页获取菜单资源列表") + public ServerResponseEntity> listByMenuId(Long menuId) { + List menuPermissionVOList = menuPermissionService.listByMenuId(menuId); + return ServerResponseEntity.success(menuPermissionVOList); + } + + @GetMapping + @Operation(summary = "获取菜单资源", description = "根据menuPermissionId获取菜单资源") + public ServerResponseEntity getByMenuPermissionId(@RequestParam Long menuPermissionId) { + return ServerResponseEntity.success(menuPermissionService.getByMenuPermissionId(menuPermissionId)); + } + + @PostMapping + @Operation(summary = "保存菜单资源", description = "保存菜单资源") + public ServerResponseEntity save(@Valid @RequestBody MenuPermissionDTO menuPermissionDTO) { + if (BooleanUtil.isFalse(permission)) { + return ServerResponseEntity.showFailMsg("暂无权限修改菜单"); + } + MenuPermission menuPermission = BeanUtil.map(menuPermissionDTO, MenuPermission.class); + menuPermission.setMenuPermissionId(null); + return menuPermissionService.save(menuPermission); + } + + @PutMapping + @Operation(summary = "更新菜单资源", description = "更新菜单资源") + public ServerResponseEntity update(@Valid @RequestBody MenuPermissionDTO menuPermissionDTO) { + if (BooleanUtil.isFalse(permission)) { + return ServerResponseEntity.showFailMsg("暂无权限修改菜单"); + } + MenuPermission menuPermission = BeanUtil.map(menuPermissionDTO, MenuPermission.class); + return menuPermissionService.update(menuPermission); + } + + @DeleteMapping + @Operation(summary = "删除菜单资源", description = "根据菜单资源id删除菜单资源") + public ServerResponseEntity delete(@RequestParam Long menuPermissionId) { + if (BooleanUtil.isFalse(permission)) { + return ServerResponseEntity.showFailMsg("暂无权限修改菜单"); + } + MenuPermissionVO menuPermissionVO = menuPermissionService.getByMenuPermissionId(menuPermissionId); + if (Objects.isNull(menuPermissionVO)) { + throw new LuckException("找不到对应资源"); + } + menuPermissionService.deleteById(menuPermissionId, menuPermissionVO.getBizType()); + return ServerResponseEntity.success(); + } + + @GetMapping("/list") + @Operation(summary = "获取当前用户拥有的权限", description = "当前用户所拥有的所有权限,精确到按钮,实际上element admin里面的roles就可以理解成权限") + public ServerResponseEntity> permissions() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + return ServerResponseEntity.success(menuPermissionService.listUserPermissions(uidInfoBO.getUserId(), + uidInfoBO.getSysType(), com.tmerclub.cloud.common.util.BooleanUtil.isTrue(uidInfoBO.getIsAdmin()))); + } + + @GetMapping("/page") + @Operation(summary = "获取当前用户拥有的权限", description = "当前用户所拥有的所有权限,精确到按钮,实际上element admin里面的roles就可以理解成权限") + public ServerResponseEntity> page(PageDTO pageDTO, MenuPermissionDTO menuPermissionDTO) { + PageVO permissionPage = menuPermissionService.page(pageDTO, menuPermissionDTO); + return ServerResponseEntity.success(permissionPage); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/controller/RoleController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/controller/RoleController.java new file mode 100644 index 0000000..83c69ab --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/controller/RoleController.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.controller; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.rbac.dto.RoleDTO; +import com.tmerclub.cloud.rbac.model.Role; +import com.tmerclub.cloud.rbac.service.RoleService; +import com.tmerclub.cloud.rbac.vo.RoleVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 角色 + * + * @author FrozenWatermelon + * @date 2020-09-17 19:15:44 + */ +@RestController +@RequestMapping("/mp/role") +@Tag(name = "角色") +public class RoleController { + + @Autowired + private RoleService roleService; + + + @GetMapping("/page") + @Operation(summary = "分页获取角色列表", description = "分页获取角色列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, String roleName) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + PageVO rolePage = roleService.page(pageDTO, uidInfoBO.getSysType(), uidInfoBO.getTenantId(), roleName); + return ServerResponseEntity.success(rolePage); + } + + @GetMapping("/list") + @Operation(summary = "获取角色列表", description = "分页获取角色列表") + public ServerResponseEntity> list() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + return ServerResponseEntity.success(roleService.list(uidInfoBO.getSysType(), uidInfoBO.getTenantId())); + } + + @GetMapping + @Operation(summary = "获取角色", description = "根据roleId获取角色") + public ServerResponseEntity getByRoleId(@RequestParam Long roleId) { + return ServerResponseEntity.success(roleService.getByRoleId(roleId)); + } + + @PostMapping + @Operation(summary = "保存角色", description = "保存角色") + public ServerResponseEntity save(@Valid @RequestBody RoleDTO roleDTO) { + Role role = BeanUtil.map(roleDTO, Role.class); + UidInfoBO uidInfoBO = AuthUserContext.get(); + role.setBizType(uidInfoBO.getSysType()); + role.setRoleId(null); + role.setCreateUserId(uidInfoBO.getUserId()); + role.setTenantId(uidInfoBO.getTenantId()); + roleService.save(role, roleDTO.getMenuIds(), roleDTO.getMenuPermissionIds()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新角色", description = "更新角色") + public ServerResponseEntity update(@Valid @RequestBody RoleDTO roleDTO) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + + RoleVO dbRole = roleService.getByRoleId(roleDTO.getRoleId()); + + if (!Objects.equals(dbRole.getBizType(), uidInfoBO.getSysType()) || !Objects.equals(dbRole.getTenantId(), uidInfoBO.getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + Role role = BeanUtil.map(roleDTO, Role.class); + role.setBizType(uidInfoBO.getSysType()); + role.setTenantId(uidInfoBO.getTenantId()); + roleService.update(role, roleDTO.getMenuIds(), roleDTO.getMenuPermissionIds()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除角色", description = "根据角色id删除角色") + public ServerResponseEntity delete(@RequestParam Long roleId) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + + RoleVO dbRole = roleService.getByRoleId(roleId); + + if (!Objects.equals(dbRole.getBizType(), uidInfoBO.getSysType()) || !Objects.equals(dbRole.getTenantId(), uidInfoBO.getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + + roleService.deleteById(roleId, uidInfoBO.getSysType()); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/MenuDTO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/MenuDTO.java new file mode 100644 index 0000000..64bb22d --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/MenuDTO.java @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 菜单管理DTO + * + * @author FrozenWatermelon + * @date 2020-09-15 16:35:01 + */ +public class MenuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "菜单id") + private Long menuId; + + @NotNull(message = "parentId NotNull") + @Schema(description = "父菜单ID,一级菜单为0") + private Long parentId; + + @Schema(description = "权限,需要有哪个权限才能访问该菜单") + private String permission; + + @Schema(description = "路径 就像uri") + private String path; + + @NotBlank(message = "component NotBlank") + @Schema(description = "组件如:1.'Layout' 为布局,不会跳页面 2.'components-demo/tinymce' 跳转到该页面") + private String component; + + @Schema(description = "当设置 true 的时候该路由不会在侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1") + private Integer hidden; + + /** + * 最长32个字符 + */ + @Length(message = "the longest 32 characters ", max = 32) + @NotBlank(message = "name NotBlank") + @Schema(description = "设定路由的名字,一定要填写不然使用时会出现各种问题") + private String name; + + /** + * 最长32个字符 + */ + @Length(message = "the longest 32 characters ", max = 32) + @NotBlank(message = "title NotBlank") + @Schema(description = "设置该路由在侧边栏和面包屑中展示的名字") + private String title; + + @Schema(description = "系统类型") + private Integer sysType; + + /** + * 最长32个字符 + */ + @Length(message = "the longest 32 characters ", max = 32) + @Schema(description = "设置该路由的图标,支持 svg-class,也支持 el-icon-x element-ui 的 icon") + private String icon; + + @Schema(description = "当路由设置了该属性,则会高亮相对应的侧边栏。") + private String activeMenu; + + @Schema(description = "排序,越小越靠前") + private Integer seq; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getPermission() { + return permission; + } + + public void setPermission(String permission) { + this.permission = permission; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getComponent() { + return component; + } + + public void setComponent(String component) { + this.component = component; + } + + public Integer getHidden() { + return hidden; + } + + public void setHidden(Integer hidden) { + this.hidden = hidden; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getActiveMenu() { + return activeMenu; + } + + public void setActiveMenu(String activeMenu) { + this.activeMenu = activeMenu; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "MenuDTO{" + + "menuId=" + menuId + + ", parentId=" + parentId + + ", permission='" + permission + '\'' + + ", path='" + path + '\'' + + ", component='" + component + '\'' + + ", hidden=" + hidden + + ", name='" + name + '\'' + + ", title='" + title + '\'' + + ", sysType=" + sysType + + ", icon='" + icon + '\'' + + ", activeMenu='" + activeMenu + '\'' + + ", seq=" + seq + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/MenuWithPermissionIdDTO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/MenuWithPermissionIdDTO.java new file mode 100644 index 0000000..a00b236 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/MenuWithPermissionIdDTO.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 菜单id和权限id列表 + * + * @author FrozenWatermelon + * @date 2020/9/18 + */ +public class MenuWithPermissionIdDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "菜单id") + private Long menuId; + + @Schema(description = "菜单下的权限id列表") + private List permissionIds; + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + public List getPermissionIds() { + return permissionIds; + } + + public void setPermissionIds(List permissionIds) { + this.permissionIds = permissionIds; + } + + @Override + public String toString() { + return "MenuWithPermissionIdDTO{" + + "menuId=" + menuId + + ", permissionIds=" + permissionIds + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/RoleDTO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/RoleDTO.java new file mode 100644 index 0000000..3674455 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/RoleDTO.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 角色DTO + * + * @author FrozenWatermelon + * @date 2020-09-17 19:15:44 + */ +public class RoleDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "角色id") + private Long roleId; + + @Schema(description = "角色名称") + private String roleName; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "菜单id列表") + private List menuIds; + + @Schema(description = "菜单资源id列表") + private List menuPermissionIds; + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public List getMenuIds() { + return menuIds; + } + + public void setMenuIds(List menuIds) { + this.menuIds = menuIds; + } + + public List getMenuPermissionIds() { + return menuPermissionIds; + } + + public void setMenuPermissionIds(List menuPermissionIds) { + this.menuPermissionIds = menuPermissionIds; + } + + @Override + public String toString() { + return "RoleDTO{" + + "roleId=" + roleId + + ", roleName='" + roleName + '\'' + + ", remark='" + remark + '\'' + + ", menuIds=" + menuIds + + ", menuPermissionIds=" + menuPermissionIds + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/feign/PermissionFeignController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/feign/PermissionFeignController.java new file mode 100644 index 0000000..ce0cb32 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/feign/PermissionFeignController.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.feign; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.platform.vo.UriPermissionVO; +import com.tmerclub.cloud.api.rbac.bo.UriPermissionBO; +import com.tmerclub.cloud.api.rbac.feign.PermissionFeignClient; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.PmsContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.BooleanUtil; +import com.tmerclub.cloud.rbac.service.MenuPermissionService; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.AntPathMatcher; + +import java.util.*; + +/** + * @author FrozenWatermelon + * @date 2020/7/15 + */ +@DubboService +public class PermissionFeignController implements PermissionFeignClient { + + private static final Logger logger = LoggerFactory.getLogger(PermissionFeignController.class); + + @Autowired + private MenuPermissionService menuPermissionService; + + @Override + public ServerResponseEntity checkPermission(Long userId, Integer sysType, String uri, Integer isAdmin, Integer method) { + // 从上下文获取 + List uriPermissionVOList = PmsContext.get(); + AntPathMatcher pathMatcher = new AntPathMatcher(); + boolean match = true; + // 第三方接口调用权限判断 + if (CollUtil.isNotEmpty(uriPermissionVOList)) { + match = false; + for (UriPermissionVO uriPermissionVO : uriPermissionVOList) { + // 判断是否有权限 + if (Objects.equals(uriPermissionVO.getUri(), uri)) { + return ServerResponseEntity.success(Boolean.TRUE); + } + } + } + // 系统接口权限判断 + else { + List uriPermissions = new ArrayList<>(); + // 系统管理员,拥有最高权限 + if (BooleanUtil.isTrue(isAdmin)) { + uriPermissions = menuPermissionService.listUriPermissionInfo(sysType); + } + // 目前该用户拥有的权限 + else { + uriPermissions = menuPermissionService.listPermissionByUserIdAndSysType(userId, sysType); + } + + // 看看该uri对应需要什么权限 + for (UriPermissionBO uriPermission : uriPermissions) { + // uri + 请求方式匹配 + if (pathMatcher.match(uriPermission.getUri(), uri) && Objects.equals(uriPermission.getMethod(), method)) { + // uri 用户有这个权限 + if (uriPermission.getHasPermission()) { + return ServerResponseEntity.success(Boolean.TRUE); + } else { + match = false; + } + } + } + } + + + if (!match) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + // 如果uri 没有匹配到,则说明uri不需要权限,直接校验成功 + return ServerResponseEntity.success(Boolean.TRUE); + } + + @Override + public ServerResponseEntity> getUriPermissionListByMenuPermIdList(List menuPermIdList) { + return ServerResponseEntity.success(menuPermissionService.getUriPermissionListByMenuPermIdList(menuPermIdList)); + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/MenuPermissionMapper.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/MenuPermissionMapper.java new file mode 100644 index 0000000..32804ef --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/MenuPermissionMapper.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.mapper; + +import com.tmerclub.cloud.api.rbac.bo.UriPermissionBO; +import com.tmerclub.cloud.rbac.dto.MenuPermissionDTO; +import com.tmerclub.cloud.rbac.model.MenuPermission; +import com.tmerclub.cloud.rbac.vo.MenuPermissionVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/09/03 + */ +public interface MenuPermissionMapper { + + /** + * 获取菜单资源列表 + * + * @param menuPermissionDTO 搜索参数 + * @return 菜单资源列表 + */ + List list(@Param("menuPermission") MenuPermissionDTO menuPermissionDTO); + + /** + * 根据菜单资源id获取菜单资源 + * + * @param menuPermissionId 菜单资源id + * @return 菜单资源 + */ + MenuPermissionVO getByMenuPermissionId(@Param("menuPermissionId") Long menuPermissionId); + + /** + * 保存菜单资源 + * + * @param menuPermission 菜单资源 + */ + void save(@Param("menuPermission") MenuPermission menuPermission); + + /** + * 更新菜单资源 + * + * @param menuPermission 菜单资源 + */ + void update(@Param("menuPermission") MenuPermission menuPermission); + + /** + * 根据菜单资源id删除菜单资源 + * + * @param menuPermissionId + * @param sysType + */ + void deleteById(@Param("menuPermissionId") Long menuPermissionId, @Param("sysType") Integer sysType); + + /** + * 获取某个类型用户的所有权限列表 + * + * @param sysType 系统类型 + * @return 权限列表 + */ + List listAllPermissionBySysType(@Param("sysType") Integer sysType); + + /** + * 获取某个用户的权限列表 + * + * @param userId 用户id + * @param sysType 系统类型 + * @return 权限列表 + */ + List listPermissionByUserIdAndSysType(@Param("userId") Long userId, @Param("sysType") Integer sysType); + + /** + * 根据系统类型,获取该类型用户拥有的所有权限数据 + * + * @param sysType 系统类型 + * @return uri权限列表 + */ + List listUriPermissionInfo(@Param("sysType") Integer sysType); + + /** + * 根据menuId获取菜单资源列表 + * + * @param menuId 菜单id + * @return 菜单资源列表数据 + */ + List listByMenuId(@Param("menuId") Long menuId); + + /** + * 通过权限对应的编码获取权限信息 + * + * @param permission 权限对应的编码 + * @param sysType 系统类型 + * @param menuPermissionId + * @return + */ + MenuPermission getByPermission(@Param("permission") String permission, @Param("sysType") Integer sysType, @Param("menuPermissionId") Long menuPermissionId); + + /** + * 根据MenuPermIdLis获取菜单资源数据 + * @param menuPermIdList + * @return + */ + List getUriPermissionListByMenuPermIdList(@Param("menuPermIdList") List menuPermIdList); +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/RoleMenuMapper.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/RoleMenuMapper.java new file mode 100644 index 0000000..2216e35 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/RoleMenuMapper.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.mapper; + +import com.tmerclub.cloud.rbac.model.RoleMenu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/6/24 + */ +public interface RoleMenuMapper { + + /** + * 批量插入角色菜单关联关系 + * @param roleMenus 角色菜单对象列表 + */ + void insertBatch(@Param("roleMenus") List roleMenus); + + /** + * 根据角色id删除角色与菜单的关联关系 + * @param roleId + */ + void deleteByRoleId(@Param("roleId") Long roleId); + + /** + * 根据角色id,获取角色菜单关联关系列表 + * @param roleId 角色id + * @return 角色菜单关联关系列表 + */ + List getByRoleId(@Param("roleId") Long roleId); +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/UserRoleMapper.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/UserRoleMapper.java new file mode 100644 index 0000000..c6a711f --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/UserRoleMapper.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.mapper; + +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/6/24 + */ +public interface UserRoleMapper { + + /** + * 根据用户id删除用户与角色关系 + * + * @param userId + */ + void deleteByUserId(Long userId); + + /** + * 根据用户id 批量添加用户角色关系 + * + * @param userId + * @param roleIdList + */ + void insertUserAndUserRole(@Param("userId") Long userId, @Param("roleIdList") List roleIdList); + + /** + * 根据用户id 获取用户角色关系 + * + * @param userId 用户id + * @return 角色id列表 + */ + List getRoleIds(Long userId); + + /** + * 根据角色id 删除用户角色关系 + * + * @param roleId 用户id + */ + void deleteByRoleId(Long roleId); + + /** + * 获取使用过中的角色id列表 + * @return + * @param roleId 角色id + */ + List selectUseRoleIds(@Param("roleId") Long roleId); + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/RoleMenu.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/RoleMenu.java new file mode 100644 index 0000000..b8c1c0d --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/RoleMenu.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 角色与菜单对应关系 + * + * @author FrozenWatermelon + * @date 2020/6/24 + */ +public class RoleMenu extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 关联id + */ + private Long id; + + /** + * 角色ID + */ + private Long roleId; + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 菜单资源用户id + */ + private Long menuPermissionId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + public Long getMenuPermissionId() { + return menuPermissionId; + } + + public void setMenuPermissionId(Long menuPermissionId) { + this.menuPermissionId = menuPermissionId; + } + + @Override + public String toString() { + return "RoleMenu{" + + "id=" + id + + ", roleId=" + roleId + + ", menuId=" + menuId + + ", menuPermissionId=" + menuPermissionId + + "} " + super.toString(); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/MenuService.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/MenuService.java new file mode 100644 index 0000000..ba5f786 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/MenuService.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.service; + +import com.tmerclub.cloud.rbac.model.Menu; +import com.tmerclub.cloud.rbac.vo.MenuSimpleVO; +import com.tmerclub.cloud.rbac.vo.MenuVO; + +import java.util.List; + +/** + * 菜单管理 + * + * @author FrozenWatermelon + * @date 2020-09-14 16:27:55 + */ +public interface MenuService { + + /** + * 根据菜单管理id获取菜单管理 + * + * @param menuId 菜单管理id + * @return 菜单管理 + */ + MenuVO getByMenuId(Long menuId); + + /** + * 保存菜单管理 + * + * @param menu 菜单管理 + */ + void save(Menu menu); + + /** + * 更新菜单管理 + * + * @param menu 菜单管理 + */ + void update(Menu menu); + + /** + * 根据菜单管理id删除菜单管理 + * + * @param menuId 菜单id + * @param sysType 系统类型 + */ + void deleteById(Long menuId, Integer sysType); + + /** + * 根据系统类型获取该系统的菜单列表 + * + * @param sysType 系统类型 + * @return 菜单列表 + */ + List listBySysType(Integer sysType); + + /** + * 根据系统类型获取该系统的菜单列表 + 菜单下的权限列表 + * + * @param sysType 系统类型 + * @param userId 用户id + * @param isAdmin 是否为管理员 + * @return 菜单列表 + 菜单下的权限列表 + */ + List listWithPermissions(Integer sysType, Long userId, Integer isAdmin); + + /** + * 获取当前用户可见的菜单ids + * + * @param userId 用户id + * @return 菜单列表 + */ + List listMenuIds(Long userId); +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/RoleService.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/RoleService.java new file mode 100644 index 0000000..ab4700b --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/RoleService.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.rbac.model.Role; +import com.tmerclub.cloud.rbac.vo.RoleVO; + +import java.util.List; + +/** + * 角色 + * + * @author FrozenWatermelon + * @date 2020-09-17 19:15:44 + */ +public interface RoleService { + + /** + * 分页获取角色列表 + * @param pageDTO 分页参数 + * @param sysType + * @param tenantId + * @param roleName + * @return 角色列表分页数据 + */ + PageVO page(PageDTO pageDTO, Integer sysType, Long tenantId, String roleName); + + /** + * 分页获取角色列表 + * @param sysType 系统类型 + * @param tenantId 租户id + * @return 角色列表分页数据 + */ + List list(Integer sysType, Long tenantId); + + /** + * 根据角色id获取角色 + * + * @param roleId 角色id + * @return 角色 + */ + RoleVO getByRoleId(Long roleId); + + /** + * 保存角色 + * @param role 角色 + * @param menuIds 菜单id列表 + * @param menuPermissionIds 权限id列表 + */ + void save(Role role, List menuIds, List menuPermissionIds); + + /** + * 更新角色 + * @param role 角色 + * @param menuIds 菜单id列表 + * @param menuPermissionIds 权限id列表 + */ + void update(Role role, List menuIds, List menuPermissionIds); + + /** + * 根据角色id删除角色 + * @param roleId + * @param sysType + */ + void deleteById(Long roleId, Integer sysType); + + /** + * 根据角色id获取该角色所在系统 + * @param roleId 角色id + * @return sysType + */ + Integer getBizType(Long roleId); + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/impl/RoleServiceImpl.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000..5c8e325 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/impl/RoleServiceImpl.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.rbac.mapper.RoleMapper; +import com.tmerclub.cloud.rbac.mapper.RoleMenuMapper; +import com.tmerclub.cloud.rbac.mapper.UserRoleMapper; +import com.tmerclub.cloud.rbac.model.Role; +import com.tmerclub.cloud.rbac.model.RoleMenu; +import com.tmerclub.cloud.rbac.service.RoleService; +import com.tmerclub.cloud.rbac.vo.RoleVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 角色 + * + * @author FrozenWatermelon + * @date 2020-09-17 19:15:44 + */ +@Service +public class RoleServiceImpl implements RoleService { + + @Autowired + private RoleMapper roleMapper; + + @Autowired + private RoleMenuMapper roleMenuMapper; + + @Autowired + private UserRoleMapper userRoleMapper; + + @Override + public PageVO page(PageDTO pageDTO, Integer sysType, Long tenantId, String roleName) { + return PageUtil.doPage(pageDTO, () -> roleMapper.list(sysType, tenantId, roleName)); + } + + @Override + public List list(Integer sysType, Long tenantId) { + return roleMapper.list(sysType, tenantId, null); + } + + @Override + public RoleVO getByRoleId(Long roleId) { + RoleVO role = roleMapper.getByRoleId(roleId); + List roleMenus = roleMenuMapper.getByRoleId(roleId); + role.setMenuIds(roleMenus.stream().map(RoleMenu::getMenuId).filter(Objects::nonNull).collect(Collectors.toList())); + role.setMenuPermissionIds(roleMenus.stream().map(RoleMenu::getMenuPermissionId).filter(Objects::nonNull).collect(Collectors.toList())); + return role; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(Role role, List menuIds, List menuPermissionIds) { + if (roleMapper.countRoleName(role) > 0) { + throw new LuckException("角色名称已存在,请重新输入"); + } + roleMapper.save(role); + insertMenuAndPermission(role.getRoleId(), menuIds, menuPermissionIds); + } + + + @Override + public void update(Role role, List menuIds, List menuPermissionIds) { + if (roleMapper.countRoleName(role) > 0) { + throw new LuckException("角色名称已存在,请重新输入"); + } + roleMapper.update(role); + roleMenuMapper.deleteByRoleId(role.getRoleId()); + insertMenuAndPermission(role.getRoleId(), menuIds, menuPermissionIds); + } + + private void insertMenuAndPermission(Long roleId, List menuIds, List menuPermissionIds) { + if (CollectionUtil.isNotEmpty(menuIds)) { + List roleMenus = menuIds.stream().map(menuId -> { + RoleMenu roleMenu = new RoleMenu(); + roleMenu.setRoleId(roleId); + roleMenu.setMenuId(menuId); + return roleMenu; + }).collect(Collectors.toList()); + roleMenuMapper.insertBatch(roleMenus); + } + + if (CollectionUtil.isNotEmpty(menuPermissionIds)) { + List roleMenus = menuPermissionIds.stream().map(menuPermissionId -> { + RoleMenu roleMenu = new RoleMenu(); + roleMenu.setRoleId(roleId); + roleMenu.setMenuPermissionId(menuPermissionId); + return roleMenu; + }).collect(Collectors.toList()); + roleMenuMapper.insertBatch(roleMenus); + } + } + + @Override + public void deleteById(Long roleId, Integer sysType) { + + // 获取正在使用中的角色 + List userRoleIds = userRoleMapper.selectUseRoleIds(roleId); + + if (CollUtil.isNotEmpty(userRoleIds)) { + RoleVO roleVO = roleMapper.getByRoleId(roleId); + if (Objects.nonNull(roleVO)) { + throw new LuckException("角色:" + roleVO.getRoleName() + "使用中不能删除"); + } + } + roleMapper.deleteById(roleId, sysType); + roleMenuMapper.deleteByRoleId(roleId); + userRoleMapper.deleteByRoleId(roleId); + } + + @Override + public Integer getBizType(Long roleId) { + return roleMapper.getBizType(roleId); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuPermissionVO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuPermissionVO.java new file mode 100644 index 0000000..c1532d9 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuPermissionVO.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 菜单资源VO + * + * @author FrozenWatermelon + * @date 2020-09-15 16:35:01 + */ +public class MenuPermissionVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "菜单资源用户id") + private Long menuPermissionId; + + @Schema(description = "资源关联菜单") + private Long menuId; + + @Schema(description = "菜单标题") + private String menuTitle; + + @Schema(description = "权限对应的编码") + private String permission; + + @Schema(description = "业务类型 1 店铺菜单 2平台菜单") + private Integer bizType; + + @Schema(description = "资源名称") + private String name; + + @Schema(description = "资源对应服务器路径") + private String uri; + + @Schema(description = "请求方法 1.GET 2.POST 3.PUT 4.DELETE") + private Integer method; + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + public Long getMenuPermissionId() { + return menuPermissionId; + } + + public void setMenuPermissionId(Long menuPermissionId) { + this.menuPermissionId = menuPermissionId; + } + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + public String getPermission() { + return permission; + } + + public void setPermission(String permission) { + this.permission = permission; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public Integer getMethod() { + return method; + } + + public void setMethod(Integer method) { + this.method = method; + } + + public String getMenuTitle() { + return menuTitle; + } + + public void setMenuTitle(String menuTitle) { + this.menuTitle = menuTitle; + } + + @Override + public String toString() { + return "MenuPermissionVO{" + + "menuPermissionId=" + menuPermissionId + + ", menuId=" + menuId + + ", menuTitle='" + menuTitle + '\'' + + ", permission='" + permission + '\'' + + ", bizType=" + bizType + + ", name='" + name + '\'' + + ", uri='" + uri + '\'' + + ", method=" + method + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuSimpleVO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuSimpleVO.java new file mode 100644 index 0000000..bfee416 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuSimpleVO.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 菜单管理VO + * + * @author FrozenWatermelon + * @date 2020-09-15 16:35:01 + */ +public class MenuSimpleVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "菜单id") + private Long menuId; + + @Schema(description = "父菜单ID,一级菜单为0") + private Long parentId; + + @Schema(description = "设置该路由在侧边栏和面包屑中展示的名字") + private String title; + + @Schema(description = "菜单权限列表") + private List menuPermissions; + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public List getMenuPermissions() { + return menuPermissions; + } + + public void setMenuPermissions(List menuPermissions) { + this.menuPermissions = menuPermissions; + } + + @Override + public String toString() { + return "MenuSimpleVO{" + + "menuId=" + menuId + + ", parentId=" + parentId + + ", title='" + title + '\'' + + ", menuPermissions=" + menuPermissions + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuVO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuVO.java new file mode 100644 index 0000000..55fa80d --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuVO.java @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 菜单管理VO + * + * @author FrozenWatermelon + * @date 2020-09-15 16:35:01 + */ +public class MenuVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "菜单id") + private Long menuId; + + @Schema(description = "父菜单ID,一级菜单为0") + private Long parentId; + + @Schema(description = "权限,需要有哪个权限才能访问该菜单") + private String permission; + + @Schema(description = "路径 就像uri") + private String path; + + @Schema(description = "组件如:1.'Layout' 为布局,不会跳页面 2.'components-demo/tinymce' 跳转到该页面") + private String component; + + @Schema(description = "当设置 noRedirect 的时候该路由在面包屑导航中不可被点击") + private String redirect; + + @Schema(description = "一直显示根路由") + private Integer alwaysShow; + + @Schema(description = "当设置 true 的时候该路由不会在侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1") + private Integer hidden; + + @Schema(description = "设定路由的名字,一定要填写不然使用时会出现各种问题") + private String name; + + @Schema(description = "设置该路由在侧边栏和面包屑中展示的名字") + private String title; + + @Schema(description = "设置该路由的图标,支持 svg-class,也支持 el-icon-x element-ui 的 icon") + private String icon; + + @Schema(description = "如果设置为true,则不会被 缓存(默认 false)") + private Integer noCache; + + @Schema(description = "如果设置为false,则不会在breadcrumb面包屑中显示(默认 true)") + private Integer breadcrumb; + + @Schema(description = "若果设置为true,它则会固定在tags-view中(默认 false)") + private Integer affix; + + @Schema(description = "当路由设置了该属性,则会高亮相对应的侧边栏。") + private String activeMenu; + + @Schema(description = "排序,越小越靠前") + private Integer seq; + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getPermission() { + return permission; + } + + public void setPermission(String permission) { + this.permission = permission; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getComponent() { + return component; + } + + public void setComponent(String component) { + this.component = component; + } + + public String getRedirect() { + return redirect; + } + + public void setRedirect(String redirect) { + this.redirect = redirect; + } + + public Integer getAlwaysShow() { + return alwaysShow; + } + + public void setAlwaysShow(Integer alwaysShow) { + this.alwaysShow = alwaysShow; + } + + public Integer getHidden() { + return hidden; + } + + public void setHidden(Integer hidden) { + this.hidden = hidden; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public Integer getNoCache() { + return noCache; + } + + public void setNoCache(Integer noCache) { + this.noCache = noCache; + } + + public Integer getBreadcrumb() { + return breadcrumb; + } + + public void setBreadcrumb(Integer breadcrumb) { + this.breadcrumb = breadcrumb; + } + + public Integer getAffix() { + return affix; + } + + public void setAffix(Integer affix) { + this.affix = affix; + } + + public String getActiveMenu() { + return activeMenu; + } + + public void setActiveMenu(String activeMenu) { + this.activeMenu = activeMenu; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "MenuVO{" + + "menuId=" + menuId + + ",parentId=" + parentId + + ",permission=" + permission + + ",path=" + path + + ",component=" + component + + ",redirect=" + redirect + + ",alwaysShow=" + alwaysShow + + ",hidden=" + hidden + + ",name=" + name + + ",title=" + title + + ",icon=" + icon + + ",noCache=" + noCache + + ",breadcrumb=" + breadcrumb + + ",affix=" + affix + + ",activeMenu=" + activeMenu + + ",seq=" + seq + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/RoleVO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/RoleVO.java new file mode 100644 index 0000000..669457f --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/RoleVO.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 角色VO + * + * @author FrozenWatermelon + * @date 2020-09-17 19:15:44 + */ +public class RoleVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "角色id") + private Long roleId; + + @Schema(description = "角色名称") + private String roleName; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "创建者ID") + private Long createUserId; + + @Schema(description = "所属租户id") + private Long tenantId; + + @Schema(description = "类型") + private Integer bizType; + + @Schema(description = "菜单id列表") + private List menuIds; + + @Schema(description = "菜单资源id列表") + private List menuPermissionIds; + + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getCreateUserId() { + return createUserId; + } + + public void setCreateUserId(Long createUserId) { + this.createUserId = createUserId; + } + + public List getMenuIds() { + return menuIds; + } + + public void setMenuIds(List menuIds) { + this.menuIds = menuIds; + } + + public List getMenuPermissionIds() { + return menuPermissionIds; + } + + public void setMenuPermissionIds(List menuPermissionIds) { + this.menuPermissionIds = menuPermissionIds; + } + + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + @Override + public String toString() { + return "RoleVO{" + + "roleId=" + roleId + + ", roleName='" + roleName + '\'' + + ", remark='" + remark + '\'' + + ", createUserId=" + createUserId + + ", tenantId=" + tenantId + + ", bizType=" + bizType + + ", menuIds=" + menuIds + + ", menuPermissionIds=" + menuPermissionIds + + "} " + super.toString(); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/RouteVO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/RouteVO.java new file mode 100644 index 0000000..cd328b7 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/RouteVO.java @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/8/6 + */ +public class RouteVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long id; + + @Schema(description = "parentId") + private Long parentId; + + /** + * 就像uri + */ + @Schema(description = "路径: 就像uri") + private String path; + + /** + * 组件: 'layout/Layout' 为布局,不会跳页面 'views/components-demo/tinymce' 跳转到该页面 + */ + @Schema(description = "组件如:1.'Layout' 为布局,不会跳页面 2.'components-demo/tinymce' 跳转到该页面") + private String component; + + /** + * 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + */ + @Schema(description = "当设置 noRedirect 的时候该路由在面包屑导航中不可被点击") + private String redirect; + + /** + * 一直显示根路由 + */ + @Schema(description = "一直显示根路由") + private Boolean alwaysShow; + + /** + * 当设置 true 的时候该路由不会在侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1 + */ + @Schema(description = "当设置 true 的时候该路由不会在侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1") + private Boolean hidden; + + /** + * 设定路由的名字,一定要填写不然使用时会出现各种问题 + */ + @Schema(description = "设定路由的名字,一定要填写不然使用时会出现各种问题") + private String name; + + /** + * 设定路由的名字,一定要填写不然使用时会出现各种问题 + */ + @Schema(description = "排序") + private Integer seq; + + /** + * 路由的源信息 + */ + @Schema(description = "路由的源信息") + private RouteMetaVO meta; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getComponent() { + return component; + } + + public void setComponent(String component) { + this.component = component; + } + + public String getRedirect() { + return redirect; + } + + public void setRedirect(String redirect) { + this.redirect = redirect; + } + + public Boolean getAlwaysShow() { + return alwaysShow; + } + + public void setAlwaysShow(Boolean alwaysShow) { + this.alwaysShow = alwaysShow; + } + + public Boolean getHidden() { + return hidden; + } + + public void setHidden(Boolean hidden) { + this.hidden = hidden; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public RouteMetaVO getMeta() { + return meta; + } + + public void setMeta(RouteMetaVO meta) { + this.meta = meta; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "RouteVO{" + + "id=" + id + + ", parentId=" + parentId + + ", path='" + path + '\'' + + ", component='" + component + '\'' + + ", redirect='" + redirect + '\'' + + ", alwaysShow=" + alwaysShow + + ", hidden=" + hidden + + ", name='" + name + '\'' + + ", seq=" + seq + + ", meta=" + meta + + '}'; + } + +} diff --git a/tmerclub-auth/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService b/tmerclub-auth/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService new file mode 100644 index 0000000..d53f728 --- /dev/null +++ b/tmerclub-auth/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService @@ -0,0 +1 @@ +com.tmerclub.cloud.auth.adapter.CaptchaCacheServiceRedisImpl diff --git a/tmerclub-auth/src/main/resources/captcha/original/2.png b/tmerclub-auth/src/main/resources/captcha/original/2.png new file mode 100644 index 0000000000000000000000000000000000000000..909dc39ef60eae026a09a82fde781ccc44858bd4 GIT binary patch literal 43926 zcma%hV{j!vv-XK?Y;1GGjm;CE7@KTt+qUhEZ5tcgwrzXwzTbE2-oLk}W@@UR>K;{1 zO+P(>v8C{txhf?fmTppuqw%!8jqn&;a0QU=V0ve+K|l z0Kh+A|Ihiqss2Y`V4>k4q2M9F!2k$g05GWkVE-Ta*FyYTI3yG_3@jWf01Ofg0vr+o z8UhLu8V>3o0Pzn&Lx%y7vS47s3X{Pp>9dk!VcYwQ#OJY5eES0uWml%;pu&N_shhnu z2uR3xY)~;OaLXiW9`jjd{p3#ozZiqB)(T_mw4m&dR4!|*W%*gs+?-A}Ii&YTFh_ka~7vJH7#dSvXKP~?{h%E^1=-?Y$7d+%OoOHsfVtk@~nOb9X zk#-1KQkkTbGm&l2s8p*E^D7`+-dOVl@5wA}t4Wbl&VfC=fe03lABKPnvy8i^Dap(Z zzaR{k{tFsn+JSAt@5}v4XwYaFCa#@N@kZk1=tp zTcDexy@hCBsAxYd&`t3GA6bAS=OVNHqBWE2#8CkDNv$;O&%ga%wSVFGwB6vfEYQbQ zAEFE#cc0#nFtfUa`6PR=M>}PGuDr>z0E2tAJlh|y)pC*s`}r0ZcRCATlHItr;x*4& z#!PTnA>Ek`chwZPKlvq}(bSFnw(D?sxcKdx$}RraokRH!R`#6&)~sN^+n|+`A7NVW zXwgqlelt~2wRc3BL2H~!HjGV{?BWd8^rueO!=Ko=Zy~2G5J&ES_gX@+8gZ=}g3q7) zsfTTwg6N|MCyiNUMrm~idv*EKlNLLh0;0Bx9GN?{*SEZyGh4hm%IF9rF=vEtH1UP` z!Fep*<^ocV8C-sf4>7cJe#)N&_O?`1T6tM|WDexz(E_@HhS0L5tciIJe9Pr}pnagN z9i8xGIvEC<~ZGPs?H3e5puHlfHZ)Fw-Odi=6HJfK(`8d>5&# zWlh~qw6YatxcGZuiYf~&mO8=ngYMH`z$l7_&iLLbj)X8R|J@crS_bw)At|l(=*or~ z<=%Y;5EV@3v5W%g2MSSu0poza_&wgm%!fsC+xdy<7`v@Z=D@StF?ruFTDfIen5g@q z0E|*$dyBe1)mxD0t{Hdvp5_ZqP4w(6c9F0Xk{MU^pKv_iI6C z!rHnn_QN^DB(4ROKf~r0X8J{7;2a!Iz@-QfJJ=tr;_-Hrh-ad*uIsppQR>2300iAy z5^*E({$D`e8T$kOfe+RGl}4#5r*G8q_OOhFtfoyfPD?el-tXqcTq^OIY!@44I>B)G zllVyraSgk}{`UN%rauI9W!wcT(9U7$>RFP%I@bwpC%oMrQr1oBYK(a*NkfzhzR`+E zWYiUue1*9^x~HN^2X-<)yWU)0mrwam4z{*ztC&CH?!xKBUOFaPZ2mc~eEoqfhuKLv z-k!#|Y4}V{Ul_}xde5+oHg+IYV}Fzb)U~F!79&(`kwJp0k;k0yg-BMUm^S-;!nF+^ zIGMr)mH3F|c&KcQ-HQ3r*7%{w*H6V)*<1}T2+EGss-w4zeRT*DD-37C3_7>Lg^0-( z>e+ttq_eRhLJQW^tF5V^=JNbLa(hP5l*zqe&B?2D$+G?}nX;9!frio|-^9xAXE9om zS{hR~qV?LK4^t65<=4VBgRE01MsEPzf%2hi>-!0d{4!rtdeja1e%dM4%oX?JO7$^4 zUm)?*<)AE<;+|f+YLaP6gbQS|FDMk$C{$VDi~vle`vp=W^?X7}vn==M$IkE#vp=9) zb!-fU6cw?wbtU?G9TH7W#$}S!L{_53^3sfGgT2sP&rL_Bzl-oZZEY1yRl~Q%U?KH5 zp`7BPy{PoqE~)86Hb{unsm3#OVl!ttEX19;kH(1QhqL z-p>rsTaz#k_XOpLZB@+84&X=ce`LZj!Oa`0h-wXoKP<-g2UA3|-?Pu>wm*s9`SCxJ zLO@%XXAO8a-f+U>e>MzqIsG$Or&BdxEDFeWQu0|;#_II#Waoc_sHSqU;ZO6T(~rUh zlW?1m44N^(bh}BDT1z4Qz94~~Q^znYYVH34Bh0nuShm#sl+W?W(S=x8q*Oy!S#|(X z{97*TM;@aX(KekPb3y5_toWJR=YV1J#Q(1u7-2AZ$@-O6U}&P6ok zc1he=PoQhG?&^$0S#=$mQBRlC#HD6mV z1#lK_n#zM1CTNUoYRRaoIKP-SqOS1b{JF%)s7zbjqx&|erCpb;Eu##acYse2rsZ*S zb0&ib;H5*gz{2XOYiQ_BDr-jnolLoiG}V2UrSwIo6+Yujv`G>T%Ub5A@YCM&5%OTP zbMh)NmGzDC?Zj%U0&SSMJP~9yAFE%Ab7_(8l5ii}kO&Rj<0XZYeGNyJR zL9vOLb#oMo#598dS90X$yX9*iRA-M6D_`LEn2ua9M1EM2$K-D)e=#;Oyia=FL{m zC%CG|uwT`fso=!d60^^GKxZP8Sh>&P*8DU2n87}n@xCo`et&h9nphdVq=`T7VK{Cr z$*>VTT_Zd* zY;L+Jw?WE&thK5&pTj;SVJxP{Hcort{Fdi;rgX_d>k_yfo+LiKiELN}9?C%I`od?K zmSWvsz>(1p8o=U9OMyqtmzL|O?l zIl1&Rn>Uwt&V3;?y*qhO8NQfE1H6QQslixK6QSCH@r+bB7BbCCg&B3fZdy}OyFC(S zQ{1Hy3~z?vb~cq)&4X~C;~3opZwz-w{C6hGO7Aw5n@KWrTD#0^3M8D)oQS2~jt2Kn zb_b)!siZh*p#N!S5uTP(7mnv?R9)AXQEz9IzX0082H-+;UIuG26P;q-lQ2A&6BFuMHxXw83wciy z3)#J=n_r(BzDsiA+e-@`WtbzaIT_wn{q7&ySmU3W;vGr)9X|(Jdq^EkI|yEl=Ubkc zS&h(6-R`mF0(!L;p;aXM!qrQ3H+d4_a1c@4OS@w1!2W3esf%VHo^u~~{$0*xZ@M_V zC5Wl3xci*iI;1Ks9~Ww8Bf{(%_DrAHR4(GH;uu7>ud))=7r%<_kb#)^8exYdok{L5 zrr^#W2&Ob&ngGj>1P`OVA=%MhExE3@EE!mAj7H*kjjX%V!bG{G`KN-ly<4I?ZM_VL zn`0WaGnSsPSMy`jN4AhpX$ROycM5#wLWSoI#n_-j5?4XyQ%2==s6eiI*1UM$kkI+m zMaa1AyEv}hXzldWPZIVYalT9$&Y)0ShqtOK`B4O1X@-yEMO)aj4W^)bi>VSj9Z`Fm zj<6p(sIv}RoyczqE1>EY7NMXF#m>1k>{KKa(n8Mocq_R&>DHJm&QTg&Rno(G*1ob0 zU$dbcbP*iG8Bi&NCJb0~&Nc3Wu3DMnz?#{Sy7gdd|L~|`?9g@Qc6P+#96LHtabTal zJzh``bV#oIna$!m@N5av)?($dtk1g-pSkENHy`}I)q{(+3UJFID(6|;$BvV{zqj}*xh;t5%-nkFo9N-7$gU?)?Tb{o8M-hB#|mYD0u|a?RFG zaaArf;$dNNbGz?+O%|Tfd_1+|VCfVKh*NyQfIE4Lw?NN22az`Tm@{XN+$c)cC&K8R zrh431TJ(L=b=sL+jjHAxb85xY4<7m!o3MC^O(r)p0xa*9IrzO&>0|K>L6fY_UN@st zSDbs!Yv^NT-HFO3uf{9l>bXxNK0H9V$Aog{ME_ z_0L!JuW8zY6o`w?`R*co!^P6rZ#*SFbkp3#E57U|tTGODF+zJIA{Bf^or&Sn2FqC9 z?eA`EjJL|h4%_7R$3+aIs#Sb04EyBcnnY%_XN?hi;74|(-orU(9h+(oLr1@3ty&)= zE(K2qAC-4Tn@bqK$Vq;} zQS(=&icrJyi1Y5?=}6_lGapBrFjj{LPjUj3p5H)b`>xjr6=`5|COchzyJDobz>%U< z(9#gAHiP^kQ)f9+UM~dW2KAZ>TV-xiw`7TW*tEGKicX$)^ZyK}Ie1z?#VIfulvIEy z@xPtVhb`oW5BHSBgVg(!=;~6v7H7U@XgWAUr8k2zGA{Lk%xtq$L9Yo2v>-&)mU0wU zVnvn+Ru;%xjlNr&#(#Gixy(|U4XrHJSi$JIp|!VP3r&E%C7+@dyhbj0==B;Zs5&O0 zsZCj7pcDO}Gyu*>a%Lj{jizp(u zrz#cGq3av?^3ld!X^Lhy`AE|;bDj8`_H={NZ{b!GgDr<@0^sw&`e-y)Risyuv<9ye zp}9spDWmz#>5ET<7?5RR8nBl7vtw{wrq^@C8x;-1@ zLxNl6eD-nzo*7kU&r-pv)kZpVulj!GPV7kTN%{kk1lC1f@?G$Vm`!15buJ zj$@TS6Jt7?4>X(aA|q6WCM(r}O-y_xhsnuYMTAm1u`FWGR=q`eE>!kIQvOO7I9$;enlCk|-3BIkbBbU#w z%yd64Bo(o&IwMyBO=y&DgMtZVqQCDLADjr{sgjZp3zvwB7BY+ThDOCq+a6S>f2DQz z{RPZtz}t8nM)>~VZH?Ku;vT-*5ktR)FSClWOs3i$GC!iPp-sZaaP!s-94sE@hU^tdZMOW0I5y`pC2q)%B$vm}QAt!j) z2tq9i{)UMTyhBi83Z|$$Of6t`fjj{x5!}>kKl3ory&f5@e3) z5(qGVRFh%JzEcwxpe43{adUgv@0waj;!yc0x+q!Gqv>re8GAvl!IwK5ZI2J2b0wZ?&<&=3q}AXXb6zD^IQ3?t z7A?*|=gD9r4gNOaIkH%^<2byp`WKM%iTxsBr8(Q`nBo}oz0!qlJu~<%TH<5OEmaRc5m6wo~tPfe3AnCwM-EyPAdwWugMuA=53z;xQc+FkHxgiZ6bgXLXHYl`JAcYKcx z-4yk5OzqC|nJRA4WSY*j!y5xW)MgND1!o0D(U4U6Xq%h-{u4zWnm0~ILXy>dd3*Py ziRaXWV%tD^#U6?5v$ZK#fw&i2aZH14nST$1x3?;$b}r%z8n9K5Hu;e#O^LBpJYs29 zCroHg?ucpGG~XtY;sg4!42b&d_zUO|6>4+!WNyzUFx@_GWKz~U)g%)8LU7vK8j@S@*3s|o^lfp0~@^^HAvZx_0FQ?K!z(eR2S~BeP zXeP_H-U5HLLTgMmiPo^z9kCv)aZe4!p>~0<+uQi>D9>YZ{YqwV6gUgLzb5pIIvnTW zUB9-|8RsaE)ZkRpIF#2h+QUVZiiIKaHw~w4g*PsfD-8B<#h2(BQ&5hc3>Gqkzm@f* zHMgvzsL@*$tFhHx`OMN57|>Nd+}Ot(({ub7XW#AFW;0~_H>X_o@4e#giqAyZ%cx#DBl~1QgG5g>1fLx%O+?-Okmn5Iz2$jyU=tj>DcIhAo|#Ha!O~3q zJ>4pq)`q}wKm>fcCHe~>9Iw#C)?88woc50s&sLXIQWe)nU@+?<$7v3;SZB%hXDlii zm!^1zHlF)V4n)@Q97HSPG5>z7XSvaGdB-tLW9PJryTzzS*pU_CWwH|M7IEQ?ek7JW zreVz6$gwO+6j~aazIW99hG7mm9CW91UKHURrtc?`(gE!8fYF!wRMZ_et*Y45m@9Ih!eRLtKxO@@#V9RP`!40VRkH5f4L*1qa+rIOTyn<-09u z4|5lUqE%)2si@I^#O~H`_EC(CPujz#12FmORCL#hbtg4*`LHZ=Kh#f`hjD}8KN1;^ z5w{Zyw7xH_EHzz=m=H!X`89Sp1W8lBuf`wQe9^yo8x=0f&q0M4LzYti6<9)d#Ctya$o>?4^)1+%t0l7X zepM&Z90CWCZXR8ZQLI$uRk|^jZK=n?gtP%!c7XbhL)o8pUIggOz)0OlrP*l4XeXpn zCQq0QGqTJvThN4xfylP6difWSD$g2!WtvRl2dY4ZNje3_3EQ9W#Y-hwCMu%B56Uz2K5RM0U~zIwDuCG<+76+Oy&f8T2$DKvvulv-}? zdSp8UeM=!86|>^@Pq=$m*aS9fhtUxk(}v(g_5THw=H=pmDvde+$lxclTr-A+ON(@? zltDE6S+3^-Z?coNG#8X9pUx}n-kd)9u(A%UJpB%3y-RK)c-4*Umv~vyp}3M+x@?O0lcz2EPf!(-7OsteCBvNX=?j#%Gp!Y3k!Zw zfYpRrv(H~Z?9O5$o)!BK6-D-qBbXF{ekf!lyPI#YTh*@}p!&=evP?r@%a{Zctd|R#s|`{F3iOcs znS*Pwf&pN_um1E!YJ@kr|Z)l-qOh3|*`uNtUq6!V`1N|Dln?RePgO^jd>DOMYa64Hn4mKA5AxyG_hFv^ z1IYbs99f~EQ1^=$mr9=GSIZ5QJ&1wNZC5c%sXXpKgXVy#+mj=eU{+2WCK^nzHUSFr zQWD}PXXCn5_%M6S?`SgSv(}_Da1fq`3Oxg8WnWYAezW+rSXUc36(niDH5m&bh#ifH zId(e^No;1x-+6Gudw0dqA;y}m_9SLJOcvT0+lpTr(rr|nk@(=%5^`b(h;p^gQZr_F z%xn`sIk|qsuVnLV2ilJ`R1vaSRo#@r4KY|1UeJnF_(w{Ws2-=F7|9!G>wyRG;-Jo< zM)7a1D&yM8!k!iqXMII@NtLfC)gl|W4&2UWlsPl6^U`u ztM!}DgOL4jng+O807gAN&Xk66C9bFCXRUAMo+~?=W8J$S`R#8yiud-`T>XNr!>o|P z_LF=`gPn;=|2PmZo7!;70GP4be6U(0WFnIMV!SOFqAZ$%A)n9BH&4wj{VUymE7ot8 ztMQlc`Oq*NQt6ze0no(;WkzZ8V>>J)#b&qQ=x(1uly->T z=y-S4mYLg4;Bg$`=CmV3J~13Swve<$gDQLd!~>!?tIT^vzVrE7G?%Hh__sZs@;-% z%8hz+#{IMgUU165ytp|-*q1=pLR>D&9o}o%kb4?FMFtMq{QS)v01aBxmAzP|wb7Pm zmne11)ON{jUu#^plbHYDiOpfFwQcofWMsfyFqz({sg1#=7tJcU+(vTYqSaPmwJ&3v zLE8ppc`%$tsuk2-DQqtce7idsl{#Y&EKq@DglHhHWUlq#a!BVZq34RgR|XjvrWKxZ z*>WD0G4j4mpW0)FI?Y@BdnL=9)PTJb5N?Wr*~6*GUB{knUX=GE9N^iY?R{CAl1{K7 z_Tb#%s*x*)v{Ajq4Ao)7`5g`hN0H;M>RQC(x5ouGK~yNM$uHMy%J4D4u$B-N7Q&j- zA(JfQCD|wx>O?wnv=F;k+d=trEOL|Xa_j1ijMLC7T2+`S;z2w)H(+k*WHgjdMQY5e zr(V3DJzsCHZxgi*@yTWlv*&r$)1@U3C*GTyi<;3qETHh?Eq>S3vrWqLWS@m1SDGno zS}#eRPQq?I!c)YUCTWX*$!QXNiyOaeCJ+_;A3~A8tqynv3Aa(7m-fvS>^c zY4twh70DlOtV0V+Io`hB%qMS;Nni2OaZ&g8gsS6rSlj)0mi@(#NQ{~LNpU?m_52sW zXl2h_^rO4epL4wHK!8syQ(5V-K_}{&Djr8H>3&YVI|nspElU{))LwbrsB)gKJ4@Qi zg;t{ALWLEB4d!AN$4!BsTP}ldwR=&D$T_jTN_i7bOun~q#SPBZk;ffED2+*(3RE&p zJ)B8N#*8`B@lDrCED2Sq{;>?q$oLM+G8T;$ngR<1^{alkds> zqGzRqZry?3miZP5Dkw_#9;Z9%_`B=`V@9~C$>4~wvwm^zvUsdPUve9RMGzpV!i>D~ zv>I_5>iCf2IcQgH9V25V5V_!%-`TYO^YmT3AZk4{wTvOd8$VwvzkGzrV02y%bu$RB zgnlMp;X_?pVSDZ#FH-IR2n6^L;}!IH@lF2Npk|k9-j}$GWS~lk$q2-&u_S2yG#HgF zaFS1({%22IuM4&<%E)bz{hqwBap`B=HLpad$8a%j{>()?5NyDYcx**)7AAW-p)SNc_Cy z2zzX|W@UStn2Tc>98#H^T(5pWckE65C`!cp8s&D5;<7!YX!l1U8ZxBBj1_k`%P#*dZSJT=VA4Z5_HgBdP^VW|>olIu+fh|nP%n{r4Y=B0J;uXL53 z(-*Hofm3LlaE5fhBZd``nX2eshz9rJd5}QeDHGWfw>X$|I&7M<;R)4yd0w9F=78DZ z{R==YPE-DdB+_Q}Ts5MZ(}K8E1M3LC=M_^!*=uApb9tZET%qiGQ?niR0NLla{@Ad) zy6gvzZP-2^=w>gfws?|>{l~C#HJk||Yv*QeW{Hc`YG5eEtXe*qHOJBCS$?!YYb>k^8 zK=pvLwpI~@2`@3(bGWqFzQXx6JLLr>IdvzD8?cJ7R#3(RD&t*Rk1iT*%9Kj_m(@?{ zg+CDfWj`jVxxpEceh-7-G?u188 z+=+8fPtm)+Y9MAyv{Q4U0qSPJh_0jBYk_et|25u1G%p_IBO#{ zON_B2z=P6J_G*|dGhtVQIZxS>E)`5h}7)USuZY02=aI3Y*`Qwz6R2=?T~5iR06DT5zz%X@Qx z9mcDA;=aO~C+r1A;8CFeuq-9wZ@23eQE|pjF2dH9E!rEuO}B^B>fKm@F@sP@=Ruq2 zVNx|tC>?51O&eq!6Ehb3XnD#TB7jRK^f4(VwUUylDy5|efSrj6(b|pgi!N)6818(t zuuCNuPW84NeCf9tfpzh&X2ZqVJX?dbanx#BZlPU@-z4>j>2-6W&i&I*be0ys0q;Lm zF`eQQv*F0I*5`_OC*T?}V*c2sHYKSC{g{%HklftDk2!YkRxVl!`3g#^+UER6zw*S9 zCwtge$Yv4<@oOkf)vVVn%oZt4sC4OYd<64&d(=|Y}(gQBS<8qI(9-uW-m`gtx7hMo3bV-C#_7&v3zR{Op=duCNfOD7v8 zv8%}^HNZ!voEs@kMRd7xTCgf`k&%OW&$TX%2$7tzpUiH`fGy%Wa^Jm|n!pgiA_FD4 z_fJhPvHt=%KP4hJo2V#bG+IlxhhljQ90&{+WfU1yn4CFR?mpAizMo{i>BvGh`i;EHr}OE1h5XJ#AJ_?97;^O%Hi`R4dDxi z)3aXa@#D5SoUdDUwdAhU53jJOR$5Ik)~ll)x+l8Rx!MA*_y=)Y$Yny#I$P|SZE-`a z-qA6&Kr_^bEiFFzz%h`Ml=HylYk(7Z`P7CDMK27sGpbg|o|NvGrM(a7)1xRhMjCT{ zw`aos2uja+>w4775&{ZTHnEFFK5(B;+pd%|^k@90*5$H%fK9am$9W;?F9B+J>agX< zUGT`&hVQPNNkg^?{QaPXD#oND>3D(W`oq!*@%2qcQYOB-ucJcP*TfD2+D7fD5rIu- z?BCbzO+1BrUeXtdurXt?iBxMQdO4cio@lSKEOZQNU-%!xYCeA!;*Woz$yKlRjOxvt z@jp&#FnNaWB4VL@#0>1mfMLi|#k7-kTMxLQt35xY5-j&C&CS0JrA=cCVHO;*{Si2* zZ(ppSdDfd;>TBmrt}^7ZMy5(GTRc1UvE*h4oq;f=?r~?LVS1gR`|j+h0*`A6z)HQR zo7_+YYBpb=TPMmzi}Xr=2qv7<=4oWZlF1p-dAfPJVr)?RWVcvum${oM9xHzn4HP%W zc}nh`jVn~xhq=bz(lO`Gp*UP-+2?Ymb6{{uR+%uB77XtyCj$7-q4_V0y@hjOK3!LR z=-F%#Bg>k{wp02>cSs|ITcE!{4cA@q{!uK0lfrjO+N4-6ge(Mye)K|7DC!JmaS9Cwk_}B{g#^L2 zyz)w^A2x16|1i}_E-d+pC&wg+hL0Jz5&-tDplk{Es^tlV*aj2!oU!h4?kNE(T)rDz zQ)}czCo}TI-1mF6E>lC_l|XRp_N%x&(^H`DK`0k+652a@Uf{u`(+QdDx>d5(BP-wu zl;NZjCbX~AsP#A2X=!0?L-#iq5rN0*I6AA?b0jX>B@D)xu*{ILhkLVNn;f>W%xv6Q z9v`)tVsXbRqlT`=;RZOl|=enWv9G-TILi4aaD}9S%#J`6QZZm$C?%yFO4EKcSgt{ zyaxDf1Vwv3@jRaW&i>8VVw7W-{HMymL=mHqL>Jyp7pvcv^SWa*(;A0z>HxDizleus zb5P?jnve)VT}wRQ9;ktecF2OsI?gdo#c%M94qp+_@fvOfKVGMMuJG_9r$xi4|JnY2StZzaYdv4?y zWi5#b!!KT*&dWYO)Y>r;dA%tR`pGNmOaM&+7VsEj*;kTvk16?<=gBEb1B+}>j`HCb z%rnI?%JVUp56TUFkM370xxXP+=H{2P#huvDApX*>v8q_<;@s4xTz~QAzy9d3=%Q1D zDG;6s0CC{CJ)T&b3F~?@PwJl78rD$Q%!0Cb{MYRbsKV95<$F*<<=Ob1*tD$&Fi&zh zr2gfZUY+8U)#T@zO7@HUcu&hne9xB)@z7}1!-9_(CqeT59%viBNM1blz^-|v3ZV-g z3nxKeTcTvT7+rN*Gz#eHl>FEMJ`vY;K0?-<4F%s>)MSjxvu_JHXRmej1VTkH(~S~ zICw?GW%vg-J^ODZPsiGr@t1K%aJ1}UEI0;kN+vxJ&#He`t~ipm?zTkHDJx6u2wicL z&0`w$j5z`f>dTz1m-^yXJr9)6gsr#$)FLS2CX1)q=b`;Zqxtc<$yQ;x_Ba@G5lub( zF^A?>t2NpL@vV7k2Oe&!E$@IsBH5{1B8BRMtYwl(EBlL-5O!R5sDKN-KU{1fY2N%vSUSFWXhaxdX@3WxBR3 z+2H!LI&oOH-xSFkGXY9d_+YW_{kdLrj*zIdv1|_$gl{UA`m)nrf_+)&&R0(ZXn|^- zq~WC$Zv;qU1}tZE*t5*4d?7S68zl%zlKkdL;Ulh|h++oPs!?ct$!88pPo_BwipxM! zOinDTr zhKQ$km-v8Rk<>}ys_tG!$0Rq_2Er&y!aP>m#+nHzh%-szvnZkkmwE(<8n2T^+Gt4% zpo9@}zF_D7ff(Cj&EmHA;puZ0b^L;C96(0@>S4Vwu%d=;xuL7|nPKFUMqc(ZCgxtl zLBN$xOQS@AR-J3UxyC_AtHfksp^Bh++p5Pbfe?E~aAw7w_T#p^m_zMxF}tdeU8}xi z4Lu7}I^sGh>EoSXUZJ5!&Dy%KJ#*CDQYWbFd+_%BNw4+SV8U(4!x3E#1MR#3qocgMHv?ZQ|5MpO z@EI7tdRtp#gKsLkA6GCuGI<8TVzVjvaGh`5E$b)>o(d*mcPclz`?{;UjuI|9WxQEa z%d2rtKfP;Ile#5^{v1yM?9VLiXT_2&`I z!by05U`+*+9JA8%go&YubFRRIFqcLtnXSoZ`+JEh+(&Q+LxAo;BnC6-NGiNa5V=K; zn3BPSbxaKir2Xo1znC7~O-6m+x1C@XpzG?z%Pq_LOOUY4^3;QCbNe%1Px7 zCM!}ME@DOe`R1*F@N*$)=3-PH~qIKOv$^csM0j;dgnk`}T5M4_diZ^7e1@!(a?fNl^zVENOSw1j+2e_-&}pbP!D5G7M` zS&LeUl;#yCU|x=6xy(%Sn-m=zUC*fE^6o?c*RPO7##6`dV=1W{N%0dCkR#4=Wy38c zm`ctT=CEdEeMkFEBo>}vOLF%zHmE^2QQZ3T+NiwGG!-FEY{$(&ZWsYPH=}30{>~DV zC)cxdNT?mN!x7KYic4HwJ;DRej?*|9z>62!XU2n{4jsJ8Lel`l0ixi#5{u|H&!}^i zU`P&8_37uF9nfEZRE7GQGsW$on`tbbv_MZOgcna%n0VU9VQX}g&TnmDZAHH&bl-V~ zFRwh{AJ^UmJv5t{T5`BXFef`@!(|Tm@q>xtSJ)z@&`8peX?LpSwr1PFCDnHkvhoCs z?R2pTLLv1Qr~_Q_ME{o-jUl+7bc1OiI_qC68q+-yt%H-Z)NPy==`rC-Pk~KL;C$1( z$_J0*9rLd5v@Ak6J9}`57Iol3{qmt?1YuPO-g{GTn>I4>!GAJx_VHqhZY>sOR7~>h zD^cv!T{$}wqemJm(JvGoJTH%;(FVvJb&e7WQz0qbwD7`2+_H8@*yEaD zk52z3hP;(OGl}Jk6)QmlMNMt3c~&z=;lQEb#@KPUXm+)BH<$DNPxa7>OYMPa!+$}{ zSy#nefqIGUKaTCF>n|YLTK!U*SW1e=w;$5wJ#_e*x<>M(hBw|>%`G4yH92>Snk(@J z54LtHv?W%Stu!mxrvuUk((MHHvL-g{3-6IGyfS1rmW5oAgXZ=!Z&r}#lTKP&f)r3> z1^}b`A|fv?(pK9o83Xv2`1*hC?w|mZC9i%#4S8KE7@4u(UbOJ}#)2%E*dIp~7RfF< zQ8va{ajmC4ni&TX=FaJj*ub6375D4A2ykOLPhuGl*mF}wR1eXSgZ!8D3ieq&Iu_6% zq53wtjv=5`PtkxY-fT@{J5tC=Bokk6vavi(i1W0WX`T$B_DTk3WLpM%vRrEHavDs0 znQgU2q7DX^g&b5AVW^SuKkqTw-L+G|XbBx|R?|LJNa71m()I{)X!sg*=IgtII@gh6 zi;glJPHc!9 z>#zwk31?dysJUyy;-PBa5c{fbKm@4fqN<4>BsZyB_~j>kMgBX<6F)DWB6f>mU$GA) z>>qA@_gKL6986X99|KRxs?q)N@%E6Guk?i;KMk9|P5YeLyF4kA%SAJ~n584r025RK zvV|d9biGZRE_)7}tDMkYuWOkWFnN^?pzOG-oljhOQ;wKzbVdvB$U7|+{fdhk;dz%#~-!OMCHQ! zq-xD&Xqfq_pabJF@}HyhmdCQ>Egr5Em&}~8e*9m6-(^L>#8_9v#*8e5`PQ|Wb8cbE zCL3vlSS?q~08l~=#_h?{u95QiC1$vU%V$WeTh`DodqLcy1z|1Ynf*9zj1}uAh#F;{ zb7>iQT2lFrL-&7KD%ThD8jzt(u>*}ztBWFqot3`OKrw&Ms51R=ApxsV*tjuBP+aDc zwsbp57pZ>V(&UF7KCq*x3wFLmDatntg83U>Vq9MdYL>v*aeoGy$?=avpmD2AXXdcI z60Y)!R2YM)qlvZF{B&(0BaIA`yo?`a9A=yokNFbS$?TWM%!lM$>ocFaW+OMJDm=_W z$zK58-0i?dTID$BGhCEXxr%!y|0E{Yki^CE>9Nr0V7a(x;%UA}Wy}*bI`1qtl!cLu zd^j*-?%ZPGS#4-r0(cTw`-ewR0gpNT2&^LDaWTMKptv*2mC&70+I!`A!w^XO$x9v9=^NB^}GDoTYhi-PDuH%0c^PUdxct) zi{&G>BK?tEw0^s`(r=@YR5IQzi$2Vt`g5Cc`?~ddfAyFyC)8#ZazYxYG`d`vmSD$u z?l0|3G%{Hwmf?zMb8B@T39_(CrpfUJaCGc_d0;H}ai%gbu}!u+oRQ}Q`0TYS3WDP& zqWb>Rt??D!BQbPUBz_Lx7rBN5M(gu+(c^AyTh}qUX!|=CeO+O@E*)`q_0O> z<3}D$_10vYW#t;7HZu&8QGt2&OC7J``@Sq>hTl04{V|D@$q7qH5z$f`U403#yx~_I zh{D3jP#b2{uOKe~5TdixiKIu8vL&hnl;-{R3xc*S4%rtx(QA~J6 zAOnNW-!CrP*a$bg3)!w?tV(~aaHakY*^$iNoH|tc zwDRq@*3&ssA^UbaGNg0WAKJfwZcO0=%S~fu(i`-kR%f*y+u;h+MQzcB*4Um0RpN){ zGr>E(%{NPdY2K%MhjV7%y;#4NVbVhma*m*9>ICg z6{>Z=nj10DlA4P&pZHMM&^#htc0HF@UNI6-gq|^Im(tN>IEduaK%#S_=~kR}XkI+w zuh?j4QqSqO!PDX70!qk)<>M?1fm{}-ikQ$H=swea*PmS;@v6Xk)|vfitF@41D#iKM zTBq~pG&|>0MB3lq7|vgn1gv2RLsxHZsY`PA*rw|7BlrfM2qU~CH(>5hPt~;TpQ?QD z%xXS;kw58Fn=LpiOImuLXL0~MDiunGC~Cx)>!#0Ft}P+$(L8pMGS}6{KDiTn3tMLg zKaG;GULhWvny|SBv?b>jXr9Ak4XeUL{Td(IUrIr1z;}r9UP`>ESjnMNe%tP$IUyFU zgsjfuh&PD4d&l)B?-uJ#TkE~H-w<~CR%vzh;W}dB@eDYPSO^inXvhN`t-7Ux<8GnC zomaSxRU_0KKf!~KB6NJc2> z=~$=W?Y=4=SI6NoPav9UfyNJBltig5szP)DsGl^#t zAMc4L!RZ#pc38eTA$hQ=nk!=LK^TsRcy{CW7PWkUV_#*kP}_na4W#-i1xnhYf`ZN4 z*>tFgr?B~%Abi}P-iO5>M?ZuWTbmh8q_JAeT6MqpGns#iuxd4?M3wf34N#*7NxBD9 zX6Nv@6d6;}DQ&pRRn>Lqhe!&1hsuR50ENB1+*MaN#$Rqxg;&P4Ez^}c<+<@S5WpX* z)%AwE*-PTlN|Wngpj-*xe0KdTG2E6@&`PN*$`ZWMd?%~7HPSv!{XG8*Fq_>PL#R?4 zOQ(ey6@wGdxPhDF?O|E2rSRgRPCyCSy2YXR$IIj5pWAvyS-D7fmI@vXy~e zA3zqG+Nr&jQ4-b$|ts1R$O%hJ=|Rw<%xQ7_WJ8*?a=BYm+I3Wui42DS!EI>^gkdQcf^U7q%h;5+ z$RTi+9f>89wWvLyO4zaDKMjPt+y5^BWI&t07m~B0ijsut2^+^yVDltW2?XQYQz#gK zrWjQK^NNMvH|4FmsSq5z;f#q5KNUdDhc#TeleZQ4?jZpvdOVp4QXB~Z3eb=`%iK_J z@aoIyAD={wuA^xL?9NP5?0e%h4XCTJsJ6tVOLrZFn;Td1?9HrG8-qnM-y(HNipulr zNEPs$$uHfJX(9Ew^D>jU&%~{IB+qGPCy-Kj4qY7;V6dSL2P{8DJ0DMXACFUysv=r_ z)a0J$8D%BijJl@zis4NqPqdZoZ&hkY2e(A@;ReEPLh5hYtPfJPHxNJc*v@QZM^7OrNnuLJc9O#)tAJAQnC_$UkY*ZhmYnlkX@crQuOO+iUvVvNAZRxzkH4eG9;4+9aY}>U zTHiOJX%FPrS970cQuZJv_A%9so4{Ce4ysvmMUOBQDMa`FeG1{aWexpN@il4(t3eqW zXSmtNM;hR7>?E8!8r+mABTZ^zgV^`cI(_|H2tZy{OG#3JLZ6LQchv(Gp`DE6SJ_RI z_~t!TgU8D5tsHV%tZ$>@@+HYmBZ>z6*ictxX8m(g9eBlUZafjH%Y|+HJO2Q5-jCk5 zA5dEFzMn8feLmmxj<~sWj*i`ol+5oY03;GVbZl+`tSvfZbBjZ(pYx!a^t8a%SD zAe86;1Be8}P@NORg78GZmF zaPTpg63F%zM`jw<>3%tBCBX40Nj(86wf0Bt%RIw5n;wx-Z2tft!@+r;Mlm-rj}@1q zW0bh9^?g%pT)#PN+sJ`GbMm0NbSrJ<&=eK>I27br<<_Ssv?Wc+aVH4RfuG zaKA>Gi<$!@a~$VKqr`~ExEBCAy`suIN|KjR=M^?qjR*<@ zQQxY+=^cRK<;jQswBPO3!RjsDxQQ4C{5byr*{RGwrjN47&9YkHY&7lAq^=orMGoNT zwUMdlXVKoAB&-iV{%ODcl`r)+_rhWS0Jk6e6(W!HBN#bC70RjVKn4XJu;iJp0@OwkAgyt30iNuKdL5}n1uPQ7Vu zyG@qT9xXh==@U_Ni;fDJ_0}HcyI=0*hWNCGDh9PPMd!#-@t7I~B`E~zqua624*Kh- zfa^fGo~q9Rv0jXJfIvEwe`ddb+0<$3C23#k7N*N##I2_rSkMrpt7uRa0~P@m>n#g7=!I-^S~tI$T<}sa|93xV^Xpsh2!?&tpi zvp4q5Hdw|T9wc~?W5s4PNUXNY3^3XnWtLb%5YsI*gryC#$`S%n00007Zj9{>ZkFKD zfE=obd3%X*CC3tac+$b|JD;hzdbSo3VQ*hWD>9>$?OexOv3g?tEU3|DB?2@@V#bc8 zN^PY&wfv>d;12y@ZyWyIv4$PN`V6Fo;JE@xJOBU^O0OVIS%%VUmGY4rn&2`hI?Z#n zk5%$VxV~GLXI)ySxc3IU$?;3OSJ{(|PoI$KQ)7-e+mqr_%$-Kfdwb&g2UOY}NPF3?V;Xv8TfR~&8MY`Am$veD+m{9GK< z;3)xRg&fNY_6cl$(Y7!V>dCkE#}OXTRlw1GOZo_^swYm z&{L;==Ma;rJ$kj3n1gL)v`%x_)_~IEsOiWJM;9haaXd|GY+GgS<95xzZ)4`TAp=ws zzyPH$d1TmhGjUg`tE-^70`_bdCO+KOC>@J6uSk%EM0F8W^CNmj znjH^d2I^;l1ZY5#&3_)B<<1Q&6j=@B0+n_*5xpR?QjWpQ621g2?&UrIxE9BWSB?xth7AP$^6sHT7 z%YV#|-SjZB(N@xuuMULA0U>KjDZ}4WD&_)0xjyQwJo|*=C$~ish@Xw8`OA z$-k*?T!=O9WcH7)EOk7V++~Hx`HFNOH*z)Tw_A4Kep>6;+asC~61iv3ogUkB+$;fQ zq_2&nsRNoK)Cd0n2_D;8JDcF{H%ST_f8D5x?sX*m;ad0Vm-=&JC;pl*f8SRB0MuL2 zz}(24pLH@k5s2bkf0ts^*zGM|FOAkw=FY{bsDvWd#WEkIl_;?aGIR!1hZLoRja0Q0 z;!j#I+FM!Mm@OFAM5Lo~$20fVWcL%@&F5UWx>A^&%4JTMuE(VLOa{F}9&DGC%Am@0 zE-UM7Ji+{(?r$khtsPW8&Zgfrt=7^;0S`#Zfd2p~#I?W^ijInd-%6onpt}So^k-OD zQ)Q_owZ%#tbq%ewC(cVqX&~r8BTlZuWkq5A=sEP&X+&wI$>otr=2HS3oX;k5dfIkpW@c8^XHnxPJfS6X3ocMx+nYhaL1-gL>a~Ba=VQfxe4=HXzF3qity*rh( zTcwp0>#(PGy>WiH^z2@$^xfXhS`6=v&WX#UwpKOHh_&c+ooS9pN`e#^&21gbE`m_3 zdr4SFHhW051bis2Xa(xX>2#KpsM)~zZ+ zi>Z#vRN|AhN?%_o?LU+^UzS$()}kiv+rIC19W&W(#!C;HFl?`lbw>=&AU#_c#o?_l zBDt-@W0u2cbUSNLlXY;`%FqJfz||yUq>`ir0|Hj8LxuQ12jhNwKSPH7d&lfTQ2}f9&dX7pmf^Un5-}9stVM!~X!{#QyG(q~!otvyGBL z+IysTAJ6RR#SIS%_GyK<@IrOmcImHS*&var`1JfKz$Ys9ZKVet)E>cozVX=q03Mp7 zTP6}iX+8cw`o~I$!UkmxWh5nTAuBqiK#d1(`G)ULTPgE2 z)N8xIYp5yiJUVJsfVMT$xBI_tz9gUKH0e^Ud-2;sw-K(R?D+h@XG)h{c}R~b`s*ar zt(cZVx?=0)$ZfY6W@~YlsH=SrB(|ml!8`YM3D>AdNNSAfC|qe?zW8IuYHyxV^vY)iyJ4E9Zkq; zJcP8;mQWoDSw@*Yr1Zwo>MMAn++$?kON-bEM0#Mn_+gJosoDpyxVsHqsnR-XuD+XG zkIHzSDU)$uE5@{GB{axH@SMuiv}jGn9jEnuFmEoa4F)pUvbCKptn@8cDSUY zQ0`k~dt@!&y*+5jcWYQ=4YrNZ!}U&cSk|%9$c<@cp97tM#Br?)OP6_5?e{vqn&d{( z@~-l4<~hrdIQgjDlfqcmQ_FM}Nw3GFUgSB3FFz)v$6JXV%;GdF z`fAGp&TDHPPVqIQM`Ozh4TPxmiwod_@&5oo%|3I?vX+$A@*3S~q!%46Yj^}`tDBwN z_wt*)!gBc#F{%Lps$Hc)!8LW`Rs)WEdduM^C52hyyaOkF;=H1(7K5GS6_PQxS%D_H zwTn!m>@@Yeb}Y+j`7A_?!cM{hhgvO`c1q{9G>`{~mmX)3tT)LFj0`%86~F*0Tfko1 zxY9iY7@53`=OLFq!oXO$Co8_Cv&XUp*x5SuSaPD>Ey%54%Wf-3SyOGW%W6Q>sG6>P z!KPhq)yoVqsrk)!hd|OOyFc2O6VHv?OC)nNq)K}nc}exT|T9PA2G zo%vF&0MoGQq*oUXm=6#O#VB5JbM)zIcH!@#{u@gV6vZns=<+7N4vqWjn38Q~y<=kZ zO5B#>Bxh&X$x@_FmbMv5apwtBiqxLxt+s=UaV1a2qVg4ZR@T!ZqNk*tkyy=bx@zW| zmnv&N<{Ly+Ew=qae2wMSl3WCoYpQ#VdarkL1&zDz?%Ww|7*{yt1{j`wSeu$$83*3d;LXZ^!MImy|m#=VHRedejw@+Kimb_7oW}J}yHQrZEdYo>} zG&VTn@{r3`4x!e=Z&;!zDO+nwohU||l$~KUD`R9?B3)J=mqZ@5LBV5NJ2!s}ppo5k?4=TuUah2oCR_Rsdc~pNc z_QA+ZQdg-yj z3Bv{Nq1U%sY^A7tollo#mwDBeIm@{YEY3%fc|WSnrl+c*k5bgc?R1u&qb8-ahBfL*p13Q(ok=9Ca?-Wwh`p<6=0(_?4Bo z{#S2BR}G0yM`BaRZVU$dtd$S6^!mwh$N=N*ok`(=?izAF+$g&L00;Y~YGr5Xp6V=B z4R0wklVis;Yk8oSU3N3=I>n0`X(cE@PSu?iyW!Ma_aQ{40h~cv173S}_dRFsClPu- zJXJTC%foWoNPMR=6|Pb!W2WV+X%$x3swKGMtFBWK*5l7``EE&n$pdmnSrWG8yUcfO zLlC!faL*HxcIVMn1FhX|Aad&SNf@Fi81#%0I9A`;74~14@Oit=tYh3{?sCp&2FA)9 z7`4%*e%{K_K@G;CLql=c9)_*3bQ+V~l1V*jN?#!+OkMX-O9WC$8-7-~2W2$e!voFE za`l1u?xmCb_WuAro)PYc;t3LpuJ9Pr~f*JUY6ODhJPqd$;!+fr{Ge{hrEl@7+?3Xe&A!CDO zHc)E+09TC#a1F~@k|0>h5iQ$o^)VeFOj=6;Xw>!R(t37H!$V}4n4?W77)clq;#CRf zrvkVxb*(L!k*t#O+Fn?sAw}po;mG!p!n*tR*}#}@x863#c=HE@nDmq}8)h@^wHVHn zr6IEPnQ~ZdDt*~bC(Ll}C{v0mNJt?g)$DAo>@8VuZ}Nef1wALOxqF!;mFoP)3CSs{ zZhJ8zE!W*cX-NdBN(mi@ey(XG;4z>D12h!9-FwXT_lx9Kc&(2mQoWGV6r$Rir82Fi z*E*zy2=h|~r&?lG(hroS?@qnI>S8CHfLfDFh}JUZa;y~l=itYFSTpbJ3cDxDsPySl zwE!nsa+x~!1orK(QV>Z}4sgvo>&i#H&N&`vhe3NKN_lHXn9qoS( z4AN;@D((;W+FbqMcyuWpPtv$thdx#a~#So(onz$t;L}~sj zZ>>5dVEB!G9Y{samWGnNYYsm@^9tm~kp6QtF&;}VIUi&Oqr8^gLe$iRHx<3jJdvW4 zui-r-A4NC}8Pmf@?mLIFrrCELC<5~Xe{Z)~NocecG!M~G1I zE*K1`-Aiv0(YEA9lEk)MNmFtoyxfKz0BA}cX=`m@5#K}D^fvK@Gg? zij0-L9h9f?Sx^V&9v(d)_8?PFrNE+5lNXVdSu-wHO9HZy8prf-Uwx?4M#8Z3t|d}l zP)gFEcBli}ug%>OX9Ub)QsN0w+jW%9jF&w`Z&4Y*wC)3PR0!;Pp)`T+ zAP`eNiZBfrny;>7_Q`8H)|OWc^3^sJtbJ3Tpq+PyGn2{2EUaOgxi3SF1-dqFW4Bm# zFqv`*Wo1e}U{MCEBQX+VAUzNsScSlKB^=zfzz2fnt~?f~o8GUtdpv`d{i!3924~1N z+-2?|n?6&|U#y~|VO35>MT=LpY{#!vem{oEk&4!| zjqX`MEkU$x*26MbWyZ-+NmOa*X-%U|d#F655IlAMJrh!mLlIHJp%qv4xZY2YMlqF2 z+{qB{Q6cosSFE;@x0f;S!;GuRe7b;=mi0ghNjfP+br!)S#Q7s0KMeBs(?04ef8!7^ z_QN_SA9L3))wGY<=92AX`iTp1%cw~ST7WEwu^3C9YCu=cwC&eT2_0IGYU3;W2j5hs z-!Mp;hndIS`e|R!c_$jitLI8k zj-?6s4z*hh7Vww383b)EbDU5$peZhKzyL8M#np;63 zsT|O`H#ZO|WaAHRnXYM?ay(9H$})siH=WDBx;!b4hVN5K1NuJc0l@?^ACPZu`y6 z{i9n963kxE)oYOFtAfAga&d91YI~OD;xQ_5ilx@J>_~B#ODL|4gjUunn8?^bIJ=7b<=VMg2_QIwrTYo#vT*+;jTkCNMxVtbQ z$Xo;|M6nZWWDwel^g5k;_EK9hq0$0%Cmw*G3YV*HQ9~d`6?cSh7B0BZE(eQQ=((3@&jv9Y>8a z_9??FAkMLU#tSfGNSI4=(!a}&%AHqW^7j$2>!-u0i6tct1FDe>0Yz86`_r;pYOGaK zCs$kYw72rCzGMX@7Id6_T7|boLlxzv#70}pY(dl%hgBs+61@ms=g0&sBuzO|c(yT+ z?H=;#s;$+m;xZoI+$#eBG<11bEpOA-@@|1k$Y|C@>u(X(%5zge~7n>nu?C) zt7}U7)jK&(B+HW1DN|&p=iH@i1Nfe!BbZ14igsYDm1SS%PC(?060RZ;=*TQDtZbYs z1VzVcDQ77PO1=g~oAHtlhJjsWK62ZJ0h@_lhJp8`8x1ObxYrk-NBridE@_Y+EZ_>- zcI;ooG7G5mGjfbi6oo1LK0;;8y1CCHm#0}dl~cx(A*e0-UsEl`Hrj(_T|;ZzTVmF* z5uvONV8op*0AlB2MVgV{m+iHc`)cet!p$DQn8qj>p+dqlr+f|M>w%WQ=t zDSs#>B_SH9>XLLHhEq>(d-(Xcb@SbRG2Rw7}1q?H#nm&p86Mw8^+{-M#G; zv{GVJv@&Hf@>!FW<`mVUGM18*DM*g(lj%_>L-OuV@#)0&Y{jZw&?*jWrvrdBUKqdA z&)#ka8Kgav@uirLB17exZbP;6Qir8D`)ESt&_!uV4UxNQib98vSq=|UZ~;#mwAX+F zs-UY!;4gFByX}UXj`)K*;r!z(rnyA7?J`_qHPnj=?49fJ4VbLt0wkPnMMU_KS=AnE zFDc0ziqhF6bNlA|Cf|Jpx6{ilw5(_^jY(_Ekq!uniNtc^C=yL0CjqP_r;jB(doinO z$?U3e-fMbJagx^7wPDAx9IJk82P^$NSy%Ghhfd;SdezC14Gp-bA5cc}blQ*r=+Znk zcLx^gK%6jAp5E%zV|7L02R~z5e5zgplHwO}Dmfz+O5duSkhUH&Bo!F$ZD|qQb{orC z@Bux+@9^oKbw*H(xKjp}xDpO^y5To0XK`j0{yy^uD zIkjV$sj^E|AuZ-Gk&WECz;U?pWmPnjQ6@uf9jTC*D_dnlx{%6#&a*^@Ex=2Vm}z$< zZ_0bH>=ZkQhJc(Yuys0>1dqk2{wg2)NIh#UQA)1Ac|O?Z^NqGT^I090eFe3AjAJ;j zO|+?v=o{x_aMJI}?yd``Uz!DEfq&MISZ z1E}IYDOIimeBwYraj4HTU>Lo|b;dlu`nBC|RmJb*u_@!yIbNul6bz~qVLp=X9L*$3 zgo#xw$Y{hOLrd;u~+u@RO8yQD}xhki^gXc0R-R2-^$x35VY^#)ESXW4|goN25 zY%q`vB(WXaJe9?f~4#~ zQqIv{;^qrjog|ux0|vAbTyep@IB~7bt6|)?j}^FUAXL`!jVJk|HF4lO$QaPy-J85= z?zh?Hzaa30zx7(#)-2#*H<;DL%6Yz2iz>+ZEQn6oyI%$k)jPF~xea9jYuwt{D)SQI z=kNC^E_SJ33{P`k8VHMVI=}=-!^NS*xD`Y=D6Xq&uztsUE$+!;xu!({z<{NofVgA# z(<|%`9&#rRHx_d?HMu>@)!D6v3x9Ve$05NDl~hpVTO#zA398_)GA9EVI21y9Q|zYqA;~{u zQA)}=9<0p{)Or^|J1*FkwpU9>Q#_oWe(<0(RrH6ZO#9Wz=U@f#OYyL&q- ztkX6Koh+njZ)dXbrMO+)NRcYiYwiA_X6TbGEETPmcD9z7h||l_=b47eLK5P%E*;C! zJGPF38+OAGk2i5O#a!IJ>SHsoCn3mi9^7lnPF-TsK=T8eK}gX>Iv*bAzNcRwzp0i4 z!hx*T6&`CT87(u`ve~PxX4y~xONGtu8tgZW(QZz<@nEw@XoEg_|=Koz2aoar3GJSayKhi*AgPJ@6| z>aFE|cNR2WSLEj+zRlHCD0rPz2|<@!iy{nm+J_CLu;Yxl-0L~5yb2DR7B%>RURN^M z%X&z5mH+_YnGVu>jX{S~gK`7ed#mRhcI(^c4rLb^va4oWy=bdSI8~0V>6TM67v&BiWGN1L4Nfa!CJ4!STJo`V2!_hb4g zc&Dsm55KR!$#Qhx@?Rv>+~4NRM_iOHi4^s#v&XS@NQ|Vv9TRM?BdJZRaBZd=LXwb` z6Q5v_7u{UDUF^xN56W>ZVCegW5Q2fkAmP=SJ*WjTStZ6h#CSWoCRdwX)VC(P@Pxh_0}p5!eD zJL;eZUbg8h)S6DDz~RLcFaoU*kXj#(kaOYf(^T}_Oy>ows8$b$+;Ut7TrNqnr?jdG z^ol}4m0uP!l7eLK1Lb|_{f39Dms^Xc4GfJmuNC_${17%bA2rCm6wGm-BWAYNbz%BG zPQ`2+aSleUy2o-jau&A0E(V{E9z}J65R>1^dDQLirkxHuiQGUM$5=nfM079!O0f2d zv?w@kDal-W`Zp+IwU))D8ye=bN=Wk}CV!Q+UVJMCoJx}=18R!e@!Fy_Nb6mXeu6Oy zF&yhUMn*_D9XV7wpNzQw02C-q4K4?ZA+Qpbak?66t%x1MPw5rx6##zK9W?3GrgY~| z0JSBzhmYOTThUls*+`FTS7T7=irUYX#hfSLx~3H&#Woh(Z4GLVm{kxJcBlX22>M=oP2KzgjNc zuO0G`I)~o05p5X6=RyAfb=-ID>wvMEOwyx)@%zikQzzEe&_|giM&?8)Y|DuTKkf?& zb!}M4TZITx!Vu!r0?+jeHg|V&vPV7SwT;!;#)l*^hp~+qxTnID3@_>#!4%TfL48vf z+r7MLDuDbf=Z_bU#9~uU7FQqlH6kr>hr@29r+JW+cI-QJ^4$p9A3mnErY_4IvCH2{ zmc~bDhfAHvXNN(j0#7|qA^^6P$g*u~-HzOr+{NpxCP96dTT9I;i%5{7)GaSEu%v&Q z+Ms?N3+mxi)YarMJ;7>!OE(sg*M$HwpQt~!tR`7&BFnLlUdn<{jGK@sy=s@cM1)h~ zXF9b}SxFlm@<>qb2Z@93wEh{pfQyG-F?*aiwKPwb5s5SC`%2@{`#0teG_#70ng94MW3StCi=$ zi4mv#hU(pE_gqV5{hPGnHosP1Zr@VxEz!jdovUt+ z2Td?COJ^L(rOtMzhY-*cN?<%raO2TMu2SVWHJLUgjAHHBg~P?NoSMPNRn_+}+oNZc zvnp5%m-?No8v>-X+;nKin(C3ESKHC#yp~CDB)I~T2~||bv*B4W+cmM5AVtVvm=9rJ zxHq_}DfX;GcP!&KC#BRj^;E0LIK{e3hKdFa!d(T`cllGO2jWLoBe<9$b8zjUKHf4g zC){e=@P2vX9yj7VCSGyL7+x(Ib#J)YyU8kGE%X`lb}BL*l$E|5Bjwr-?*Z1laxg{- zBPz`>$mt7O(n#p34lVBwhx1v!hXJ@oOroTrGtk_&>l`}h3l1?BOR`h0x)2hR{`XDi zw3KcpoZHCIufnA9V$9EAF_qop3#YTOLyD6T(DFofqdxRVx~0^Ik>^8>hdzC$=J4o5 z7x>6RX=&4d#8fwuxcLJKvAcr{$(xM72P1~!9^6Q+l8;oBpn{?uuX*J7f#0fE(SL_B zH|Aju9hv)5)aw3Wm@+j}s!JLI|GNHtiwI{)AX$~*9`?{;G2FM)H?qO>=#0nqg zJiU%_y=rnCp}4E4{Z18Y{-VYmVk4@>{{Shc6Doe#etMozLuherC2Lq4!O$5*1;nBu z^B=q0ENF6FvdxBfsbHX0pETK9)eDRP!gZHBTls09B~aXfCoimK3QgVshnKyn$Bu+3VubT_yex)=lB41*Qpl{ zIaAiwvcAslN0C(qU5n}Ylp`|ZsAW16z4uZJanKSxR!4_Ibj)B^6ckutmUn20q`Hk* zehAQZJgaH#i4l~eDw&F9BVK*>m)c zXbo5!BVC4A0tyV2gP%fWPp`ASE#v$LjM?J6LYk5)AjFRz20LFFhaux|sOw@?svEN_ z<@z^l1JRsy*P`f`++OYL0SB#pvJ0kKNA)4Doy=)?P~aV;YemclFCNOFaX6M|J<16u zn&*){RLQ$RON&fq$Mnez+gPO#p~;4;Sk~5U!BBDN5~4C7w$Nw|8&tP;q-dZ=hgvRn zmX`i8hx2{I54M4%6RQ+CarookK#bQlS0G&ptxKM93Z2YjmG6`WU6vB2C*%rjE%mK$ zjm$+_maoX(wCEnwt$P@Bv(0cvoUvRxhjLdfy54<6zDo+i!`^-P42Nl`qMArS*yzzo z)QwK^ssIq9b4L@=errN#0lUTH{K!?SvYd8{~s+l?4gU8+Or zaS9`1{#6eV)uSBX5c^=}pXNQM+){(9le@(WbBFGrR?T8&E12Vpdn3eIogT`zxit4P zZRJO&gMZM`*I&?SOTQWCCJ-n@9a{&dYq>$E?1qf;dL&~5* z&7@>ccM2@ztR73|E;PVp0PPMe)0vg@M+q&1$%+x)=^uYlu? zKVg{GMa7z*DfU+;Gb+bpKO#B-NLy|tY3!c0ix^I(;CP~A*G8D>AFN4EfEv&f-$496 zkv`x#R?C)eSra(pkEYMXIHsyfJji!8&?I>oHgNL`1*r`g?Rr?Gf)sP?U`b0E6Sy_)@LYaY}U4zsd%qL#J(f_8ren(@LnP z>vPQyaTYV}HGx-SWY%x)QlAl8;mu4&V2dcVq{*4R4k|=;($bHX2C7igP&$*ZK91g8 z6v)Ed(=cjq!{=SZ(oqWc7S|u#jqbkhH=tq3KbV4ZFzymtDxEC){H`i=k8HDT4mIx284u)Iksi8C~pFD;yfrPn6o*yJj9)S#r5DeFtAFG_eT z?I;R8LMw}BoSh-=_|(iYw;u~lUB3wMpB&<~Gco*o5M^^NY9>`GeU**Pqp-~AFGOwk zBh|L_cRY_jca##H`fcnEysgBP?d=|IDlR5fq}46wHz=s7XTMe9u(h`i5JuK(d3&^kS34It^Da4_G^f3|n6%3y zouQ$vQmE0BM<6%~!nXEDi*n^(sLZhWZOBTmDj8LiMl8kBoQ~Sc8g`YLD1`q2tq!Db zNK(FU9S=rjt3XfyKK$q|xOW0k1uMA^(2Lu~RVm4?#k8VvO59zmys~Xb)asQ6Cd!!? zU4Fok)Lmrblic2-zZ#Qnw3R?lO*PzQ^se^fj!nj=fso>Oy$&B=X`0x%HHPW2 zww#Sp({(L9=^b?px%sOpUz)MF=ucB+j4e8(SHGt&>XYxMAch?cJO|&MS=I-{*xm_T z)m|}8MMDj=B`wCKr>&}Ow1J=rZY*RKl>7-Nt6(*u8UPhYyt@)fJv2jI8AgTa<;{D9 zNY!MJbkK&$3DA9mr>K|E*P9`2;w<^-_qG&MAmfwgMVD41rNq9&3krUbu~8 zM|R+9IuN%Wx5wosBhI{}?kjd0j;F^?s6~Gpp=ooKgCzRQFWUUB>eaK67(RD)OZ_bq1kMCC3>`6XrDP5Va(gZqW2tB(j{j{{Xx( zfP@yP>?#4LYZ`FCgTVV5NwRNY{2wDFm6u_B8_T%17m(Crceu=s801{D2vii>)5o%! zUx8hFIskF0Qp$XvN*h5&i90)WocoQ=*74F?o8R*C)|Lp|qY;nItGcS(Z98nGG%>FP zs$uY;M>BDCrxjI2vg7W5_eaO?25#fEOUpI*eY6K_nnTsQ!c}U`4Svu=&^5$WLRZ`?Ia;fK79n~aNB&g zqo6JA3LhU1yx(j80J#mS=mCFWEN(nl=D2)Y@UKGLKOi^jQcachw9Mr8zA~MG;d^Q7 z-2b!ntN_R@TRV@Ds+_u}s0~4*}kmRQh=O=$UjJ6k0IUXfzeYr1p zDlA}M=}gf!$Bpx9OIPe{R~FISGUpSI6~x0UZSwU=amuMqw<(phP?k@0g&|1%14++; ztnfGm7>43I5Uo-W%B1Nz=0bOkB&OY@QP1PmsetmsyB_+--LECLXn})Fju`U;?>`C+GM3?l zGaU-@8cJJjl(dAQ2tqtj~|m2$|H=86Bt8V~R3RC=g&mp0mH?%vd)Cbm;;q`jiZb~}xd zQrk*V>~+v+2iwr3#g6Jf3U-umJg8^Dd_BaEb2UdF)Y#;{ir;}M`4cgg#qh}QoXY-VtrL&`DtVO~y#}YwTY7PJeDu}sPrQAME z4VlS{h|7Qg@aw0W0^@^yeV${Ez{Fw4z-Pdvk8_b?HOT$NK2&d7e1|J*t7oAQ;Hke; zA!I4pOHx}wN_U=}urMnc8m#~+2v2fj&Zw98kSW1UNir@i$tvK;Tr3_1`)s5-1`C^A z)z4T#3O<^y=JG9K)Sx>fYKi!F)2PbH8r2LXKbrIKaY}H91@EX29b^@F=Otvg_Ad`9 ze=*0gq)J{NZ;&+HD9qb1l{QgxX;_JJ<(DC;1U(^Tf>b-CbQpIFc`qGn;`7?TP>g~7 zWK+dL;ZGE0ggLmX@%Boc@`hcK+F_CCYO3VpT#?JSk#H!cM2J%?Dyx#y%eTH%+V^BL zA|)LXB*@TElOS7JVwLGerJDCs(Yxq&aH0;z%U1&0pIQhn7lI? zsKYUeJX(r6VpC()aO!K=NbZ=h*-K5S#dxjvh%Pvz-EJt8sXbq}w~E#VTS5{j+8R2C z-5jt%lU`&>;xq`Yx0ddb-M!j zP3o+vm&_-orH-Q0@2{sW~>l}!HtSj=jdIpUr(t)=~~dzjF2 zEX$hM(jBj~oksexsjWu2Vlr8sDjTuop#VJE60|E#6gBHFb$i4uY$R(g$Bqf^tNVOQ zHn#($0*9qVQr2E%2C{ql1FpaLv1du zKZ_wO>%z61_#+rJ3ViUdXW4Hiy^rN_;N#FK=3=;QV{_!kM2X5c_A^(G$Wt$^FMyWa ztXfj7x-2KegVv3{-4nlh@D%gzs`Fij64vvlhYj{EiBp*JEomEx5 z996j~%(J0ZdJayB* zNh$`umi#95N|mC!e613t5_CU=od?^mN|ge=!B5-6+1n7~&6OfuY*>kABxj~fT4Y(m zOTnm-n_I7`Ed>yir0dpR^{f1{V8Ba@KtYaVRM-{5hI~uNyfse(z79sarObyGG;`|e zJnFd0WeGt_VnlXZ&MYZC*6LJA@Coqi9>QI@t#8#hnE)6Tog=Vk)_a9lk|{N6N<4Be zBJqAv#o6689$8Lg&%?49@ggm5R?9L!Opv(2i1Jez(&`^VN_LHP9lQ0?$9H8TG{qwc zOq6^mS{@uQD6}ex&Ul^?!rXOvl-$OK-|QT0xK}X^tIUf_6`32IQ;AAe+l>&R+=4th zvSzimwi3?vvM|w^N{EhWrZL3QTuoKixxaGxcPV2lgT{(Xd}j96H5HaqW~KTC)69^T ztg7ndKjlP|I?b=hOK2)|sbG)*8u^#6w<-58OKu}>X!>T^PD|aA2%JbABv)%=)O14tm;))k+05J5O$mP*W@`XmQkr+jzQA(pRBSP*M-`{vCV;X?_?p#=g#; z(4G}qI6t@kKjb_j?<)TQP~YP2V#RVx+eo#}+*&b*DH1YS>5QC0x?P2X)bGZY!c#Ct zQb2U2(ef)n_m!sMAJMXTU!oxk4krK$0R?m8(_b50?eae1%!#GanO-pF97Pv1uW}4> zHFPXv+?Nr|x4>v8s(uG$W;1YBXhwD2@EA(Yin&w0#^Ih z-+v=viNs8#j1D+w)N{u=YmK_<*@f2(9#;|$U#F_P_^*(umX{ShwPS zn^Sv7UmwxKl)D5;aWAHDU_AGxQk-T(s!M<=u#U4IC7q4Xw2{kl<#cThKrtsVi&b*W z@~s%-xV*ME3?JdzjeCo6I0454(s)fzA52DHisYA^d2z~IbqX5ov2h#{x(m4j!-SaVB|#)N6Phnl&?1&-n?191 zpn*W^6uj13&#@A z-RaVdIABI-amJafJKkTuDuUZp9^xfm7WV9m0dXph)t%wE=1j|g1OgqBsGq1EM~U23 z*ywszpZ6hq8h@BrG`ES4LGW`2?NF}&0PXSF?c1ZZ9E7lg?`yyC(?5;-`S;@)mfW($ z{k!rUaD1{-jHe2m;7@fQF^8S6ZEMrVVMzNr=xsmlU(%9DBE7b|iN}tXxDV{SpLKJ$ zKak$Ch!k7l!hf{H_t&)#)zdh#%(+DGXRHyXw0 zX6Bw7a+r?msU(MrwvcqwQ`f6)znH$8-EJLcZ8F|4c$kDZb5KCT9KzR~-ufri7Az9n zT0hBlPHURxo}v%9<6FdiO7dLZ$vCYywjAFRn>4A3mwc6C^c;GgIa=6}DoKM*%zGCb z3161eGK$?=Km%#lt&5LQS~Z`$Qtkr}(^(K~d(_j2TWatZ7dr-yWZ{ta@Tfo2mkQ)8 zmy@~I+(r766NsYn1?Lsxkz~%FL1mZzi23 z-f`v|leUiE)hdzt84e@=0Enwzi{`upaer$Xegsqq=pOnQOOIGHiF}7D&mM=D*w?XF zVLHPV&oQGa9AN4hOo*{J%u=sE%trOi%M<(YroN<6;d40sj;a5@8 z*jdVy;(`*yXi*)LA??I~pDC7KK%Fi5YNFO>ObFn23~OdDH|K*DhchNA*c{YmpHlr~aM35!-_ItGg%z?c1DiZb*ok*u~RwT#dChH1ait zZ&u+_4zp_<+VWdcj;M7Tm~?kS)z^B%jc7TAty7C@q24FEY3@A4o(mK9BqOyWQc~0Ip~nx{04J%s zMl%->Dh!S8I09(`=D({?vrZ3Gh&d-O<5O+hXe~7r6H_*N+(L*f2vHLz(M!-1^2Sgk zXgl`k4!dCaK_j}4^v*vq4HZ`$q5lAwW*zK>RQq?~47V+m6tu^*wq(}Cb$hlUNJNP9 zC#fYvT?`a!;jeu_U3T+>0Qk`xZxF<(J;Js8P47?N{{TN&q3nx`vRG6ToLBu-UoF}g z%`ob<{K<9_f{FrE0U|g;hro1biEvqiyGnbh+#_xgpgl|Ps~q8O6v!;{9J4FrT4q`O za#aJ>R1aFJ`S?h!qKjKBNS4}IVk#xej$QKEE~K4Qq6s6Qxvld{kZB+%V*T|qArUoz zoj{UKS*1OA<`Ib3Hp)>+PaR-(W!MoM?m+>>I;Pa1jmNQ29mkHn6{Wla8mi*si7Q1I zEmbxeaS=2M3tD4@G?Gw+hFS;ue+soK zI&SgoI$Fu4TQ(=jZGK{&R{h$gN+)uN?YVlD=sRoU{hc_*nxxTkCla>M;#qMaOG(rL zqKVt7DN2-~-|Xm|DIBX}tM`;olCL2ff)c$8n~6yvZqaH^qr>IY55J_etK~8Z*XAsh zp2u-fDkD%2;#PoZ{{XwEs8og{N_V=-T5rKBb8u3J+>kfu6aBp^N|hjCaav_*Q_FN{ z5WQBk06T^0wD#BTB=o8$oonRBhJV45wu*vCPi2h=?WxqMT9NkZdU|?}%b3d#C9yU? zh*#w;z@(&q(?y>EESEDnCAh3AhDTG<0^ZIHiTXD!wY8Q|miay}_{XTD$12 z#Y5rWph<0SFYy@1b%Fe};F=FwV7ygw<)w8CwW+p`4qDx=qsY|ssO2bIW6Y^U*`+O^ z{Su+&B!YIGJUR=uOJx#yZf+_FBoDMxhwuqiZGz&wcXdlr*SL#Zszwuy<=M-)?MzG~ zAgskKYf+ZiqBIPfE2NonnbGUz#dtWTqrfgSw4u^;UhHRjX3G9?J=D%Hhq(D3Ch5o_PKMlKcK1hbF==hVq6ta)TX{YHI)m5c^KKk4TzJ>r zC9QBy6oPX%7U$e?m)u##i7s|0GQv&mP5eeRi5@JuE>2WQNs1KoD@vyvAxCObuoB`G z^Jt&5JrV1@tJE7DT8L%*3}kXgnrUcgcsXctW^#9g@L!kxSLqw=lXHH6U1uxY_CKtb z7N6E?hv8*Q&nryGz7diMRwBDYr%~RX!0_BM|o;oATV; zuEi`reVMgiMB$1Uu>DF}+HyndEk}8}*vn|_Nm|n5gHnE8zW&%Yn;0btXzpIxumAH##~~h zJ|u?1RLhSgE;rct6WI1Wy67j?Bm_MNO=W`JJ|XX`g!Z48a|OODgz;34EV09IDAkqu zQ&j#^-pF5gfXuh&MImR-8dQeL*1G1rx=Mc2}j;x!=aPt$F_ecX_M*Tm;J`n3ck z6&U0J!|bkKd2DZPrV?Z>L>QprQ@a|wj8~dD1xp{V@a);_ZVERXUzuVYg<7T$tI>cXDx7Wyjit}zvv8G2;j%293UN;2Im^8p_-gok(UN!+4BLHLh{Mr<&Q!Ex!P z@i#0z{{R}a4ledn!yIJGY-3n`AY5dmDQkqol1fmJK~ZQGtPQ>-gQ?V~rzE!qpdA#z zgNagUu*UJq+RYIL99G#LMOK3?);Y(!!3)%*wQ}F}9Y1B~WX%e^!C)PNYS_o51 zjk8iv5x9_*1Zd)d5}=j$@H+nhwn4Nv61BcVdZB6(epMwXUiB?sj34RIN;;(J-?7vk zb?Qk&JnBIWOJxgfD|5>m5|CA*Q~>Yb0Us$E4*mzkb`rylGGkljtjj}dkEJ0gBrU{k z+z1*r0#XQ9Z3zST9>=E~_*8y1n8mA#)k@I`NJt84NO2?Mri$DXrn>#-?9;gdQ+#VV zt0w@|rKRrF`G`>S6{591U`uCBQn9X@>#uI6wCPd^)&wAjR=pIS{!&r3I;TxY8mB-8 zgQN(k)?9mpwxoQeTNI@vrG8;bfL5wPk+-=g<{u86V@=X)YBJR}q#^Jf+*7wgp|v_M z=2MLgM`5VdK0PXAug5bO-dl?exC?6uN#CG#Ya}N{Z`CB9hJ#&ubo8{;8rwaPvRMmU zMCed9l?9Wggl{TsdY~N+fDYY9R{>HD9h5N5d21Ns+-lP=%4)^lsVy~rnz?fFT~QD z0anj1^xk64t6T?D3NqBTxXPMyXI;n6xplQ@M16XYkPqR1Xph+k;(LWHJRRM_ut z+qO4N9t2!QrjS8xZN{>O3mCpmmom-Xw?JoR9jrRomIaPi8g~_r!j!YJLQdSRc z%|)VbqS;}11WXqwu$@{Qa*a1uE1zcr^hR#OGGAuD$aYb0X;4qfc>e%jPYeAax;3CR z$8WgFf89Tsu8-1iy}qHbF2oDCPxsqf{0}z&05H-P;9A}-s3|HMf{nfe_wK)jz8!v8 zPdQ<5uegIk1He%qnXO`9d#B&J7GsIv(AlJ!$ru2o^rng_F zzAl>4$5d}5q>TroCk&oCh`@>rU3VcUh;2DTDoj@I zsWL2lsd8an$xA9rZ$ok_9cDwwETs+=E6{CjE)9v7aSUVF6p&G={NlJbrxH04T#ejt zzWK3O>Tj(LQ(=!02+1jrtj*_$9~+-<+?~8az>m04QoQ9TG5aSddVb`O?&3ovRUmG zt+B9Xhz2;4NjPFj#GF0DD*M6lY;IHRJvkyp{6~`PI|&PWavIeu^4rzbAuW^Q2<@lX zdcm7=c_o1O4*`{I3w;GrpGv3_kyM4Sgss0!vUic9e=kin>^w%l&#c>9<0ac$nOY>4 z!LXNbs-MrGR?U+9$+1FOjvrR{Pn3nUg*xKg2yCVD()(^BQZyk2OHfKbPPTWYj2!%! z{{UcD#aoUSQvU$Nf9)Ff_O-=Typ_&edyWR#Ra4xDk6BwlLyFpA(pOHuaSpX5EvThv zu53C0Cv=TG2TaCCQm8oSjGi^sKQv^m@lO-u@~i2Zvzcv|P*BEz{D&i@ z$1EexY`h(9w}@L{59lE7)2;siPcfFz27!|Wa}w&2?k9jIm`J|gxXN5cMTHXN*lka! zvP8)-Cb<6J%vyaDtTxc!+yD-P;!l3N2-pilt1L+T)dgmb24b-~;=GT_Siao~8iAVH zt||!bKg!Ef>?=d}>CwlU(cyE)X{D^3z&(|%mx*(|Zt+pgRyM%{R+-E39BUzIdJmN@ zOH@bYq$rIFwh}ehr}Jk|m>#e`>WOnd6Gvth1bZX*Le;aClPECBR<2W6Mxx3c#_6Nb zxiO}sNUy7Q(z4byjd6NW-ju%uq^K1Ho!z>uE?(KR$sU)x0OSaI6dXH1ss8|nO+`_1 z#c`!JgP3_`?n1l9Jf$xbq-{L-Y9hc=~J_5;8Z)_9$WSiTiS?a#WpFDcqpIA!)y-GF-- z_WfNEiSlTL(uRq7iEh5qko!pqdAThx<1L^xrxU6{Ut&}gb<}Q0XKvhD)jc&`&vz9{ zZgB1`<9s$Suf=feYMv^UxlpR$vJ&%-5xPsokhPgQtLAaVZYNSYwARNS0|C)PB%J8S z7NI&Nq%|Fu6bcelu(t-Alkzgb+TP>eQlL_i@z<#rgOx#eoT^<8xt*y??mmPiNh4L1 zB}FM3Xp|v3tM5=FL;bMS;u9fJCZ^D$v|MUCEhr^HARYU4*F*S%2Jhvk@%Z$~Osi7w zNn7dAsS0hSI;9{wqC2^-hm^FRGh%=wk>TIJ#%&}HiiRe?7!h~0l}p^d?T<0lDaTfj zr6Foq(E%z?eL|0phhGk)z0}KFn8gg}fVVzHXcXBSR)eO1AQG)WC%Qq`zf2DbiORO4 z<^d>q437T*gu3IZN!pS^Qjn(f@dLMhrU0m6m3rhs)r%~N_UVQNm~{vbftQW8dou+W3kgi31mL;F%T zA#QIfSD0GU%SalhRSm!;z;sDHi0`23#V?I!2U#gcnCF^QqLrm7R_6BTLUl`N+*9%F z0r+dv;Y>wqTxxJimWNd9Zjg|Lx%f~5hU20%3P~NjH2z&SJ(T%Ysn|kEaSj!ofQ6Te zTx<^lQk4~_L*Nd&{iEz+4JuT<#c|eWe*&^*8J%SKHI);tNP#mLmsctyj=Yvsq+L;6 zN1I!F9V%%KB?KjHIDk;3>!}QZ;l2`wqz4YreaVeYg}S^z5$%;%9&PTw-9Hb9D)Ksh zH|D6Z9#TD5>Gs@PnyiJCm6;SS$fR-ev&GgQ{_;A`n{e{5m4mH>kM5NfZILOUEudLh17Qh zwX$Q#gg)JreLhgsTZb|CQt6KSffd#Hi&+F`>1?m_{FfwptV=@VRY#Oz*F>+7xNg4{ zGZ7lGE$`T9WVsQS0f8qUg4MX9E@&sS<3J8d&ZT4`WtDy0w?sJZyXhqq zdTC2S3yno8S9Xhq8U=u`l6Po34zM@a#_P1*ZMwi07V<@@6*aK6Q;I6|*2dQ-(BHv% zrF^NH^i*9g1s8@{)*l`7{UmvH=*}rG@kDv4ThpC}t2)M%m4$9ql_{3uTI>$4GSYPM zBd>@(Mfn%%`vPU!#5b^y_iqh(AMoVTSD~fV^q$rEo$33whF%#hra#Yarmysws3%wy z&E9gxA(=p@Zi_9ex(z!mO$b(TfPhg`_xx^Gn^kIn#ZvGlC{nQLxIB;@VhpgL9CBd z>>Gabw!R&~ps|fE4j4Iv1LA69)-rIw(4!;ZY(tE!VOu{{S!bV*SygS8y$UjH0@!i1 z%#8s}rES7w$XbYSEyrC+(7CWBBe49z{K)lJs5gt9i*S3bcKd1H8MTeaL3C~{SqlE~ z$`9&~!rnE3=)XtoTV0%6rK1})?6Eb%cQk6!@Tkw`1V7SD&kB=aueTaXdy}d_3Ik~I>WO?U-vBikzWyC;d3GX0MvKw8hd_~RuwXR z!sD{?S>g1yjHmQw<-E%xW=%4cEk{bFycCv}sAcVm`P8j8q!Zhr?yV0jYIt=5douT> zW!yBIcM*;?eE#P0YWd@dtK`62bya!v9F}7&PiAtZ#;KKD!r6w}+KPbZnJDety}F$> z9zAXCb7_uO{su8mwj8USEO2Yueqs|Ed?>kpj^{W8i{VW3q&ekW#C{qAm-7u}0Q?X} z?GCPvx;t&_Z+HzdXg{nI-!qdI&!X83bV9ho-${L1%IlkagF%N!PIc9r`Oz2UH733f(tL8rHe! zYAEv*fVkzv>ZYVLLyS6tp}8dvq#Z%mpiLNi2;-RO<=sqLp#@c!I?)QhbvQkYh5{3m z@y=69PTfDv(c~E2royrE{#0v;8$KXz>(2c`;@#>AauP;IXhT|d#ce_2*ZfE5q`|hM z$XoGN+;eqbYKk_c5(DUz{Pa_)K?Ny%sa|pUhT+>yKnJZc19TTI2(`cFcvUb(qcuK1 zQxH718e5W`0hPL^7Njg7yq47Rb_U!r(ydYm2Tgl`Nb9W)38Ym5N$RP@DzMwgMvS+# z0*9Q?vZj!9TD2u8PV{TvzQL#?QJ{br<4|*msVsEESUcu0QoR%AqeV8~mJ&%*gcX;H zduR`WweR2@3Wg`0WJj=y(!8jibMLEjYjI9_NOU1!B%?s3tzk#Dx@t5X`h6u*q#K4c zyG@+sgdZuUSO^PANKyHS+Lh?Fou~xq*;?ukh|{U*q=0qS(k#TR{Oy&x;?(A=Q-`|B zQby+#;x{i)l!Sq__a{O+mNdsK>t@`hU2wV-+NEsKEwnu6l0hX69|Z&v@dvlqdP&Nl zMisq@C1tcYw^D~RDf3)FM3k(Rb}pbOAt`T7M~FI&KE#+%&UjY!nQ2DS=a=RU8iuKMtB|&P$4INg+#Hq=fm;Xpn^HQdZgy@HN^1-KxLXf#FPRWWD60glE3Q|@8?g$9lH>7y$+h2#qYfZwWP?%oCib`~Ma`r1kliP{Ipzf4F1l>{>AQ>BNO1W6!iW)Zq@$8BU)6(x=AJa>_qbOeLsN>^X7!{X;f-90 z{03E79L2-v=|Py=rzOHx*Rhl0XT&%;tT9XiChwrM1{I?|2f1r(HW zhZLf|FOv!*Ld9A%gg`1~wi`f76sMbPBqaeuO*P!LecGP0WQpwvD$^bfMX(MD$n4}Z zHvBp0`>HHWLcG$Q$wSVxr6jE&H?Gj708f7Xx^_Tci-r|5CY+5KCvfy)$!Z)&B_t_D zw)~LbQiFQ_TMr=$i>Aq&=k()@~sR-Zk1LNnOx%`Yf z*Qzi5L$=>GJDa@5IZUC0Q zkM*iU$DZIg##609xw>~3kXv}ESsZuknN!Nx+YO5(hpP9qv%6C8?XO-rzy418+iq!< zmS*NL_@Ho;41WkmO7a85`xd~9|!lThRO13+nhp7imSLca2}Cd zwx!ohi7llRzLE+jMO%%iC=bq25C;mf+T}OQFLIspb{^_5xE8)Az0lAQH*6-Rh#qkbH zN^vVGGt_FNndx>ssFFOQ)97z|3n>mXQs7#9EelJXlcDGrjCqu4#MB~lQyOXbYdFlX zjvDt9oK{+77fGZ2mb_{Ky|{5Tug7*|+o`msd|Z`^HSCm!Uv)7g#?hpy^r;C}n|o+$ zttAr!q=YG&8q2+IslW;H@yT)c)QgKguiT==nrXQp;F1(y*8KiR)8VgfsT(WnQn8X9(5*jrzJzU~fAHQqkKAeC z<9~lRojn3Wef3gH z2MkL)y}rtJ@V|7eI+j;uRLt1tXJ*Srl_7ouUb(+fURvDC1h(!3wngbf;dgN$^;Mf#-pJm^3Uyx2=6+=)BL=`x3P^rMjj%KSdi@ z{10x|O-{S?^7Y==_`YAw=5G8te7p4ip1UKEpmC`I{{WL4H|wLiYo_ggJMnq{0GGRN zy6fBU{B-F%=BOUd+QM)AbHC320EhlJ_*(j9?%(A1`!{?x>$l_6jJQ*d%&U0c;O*pV zy?=}RPw{?#Gk)%bff4YAby|vTFUfO;7bdFRZUvRbZq3gR}CEaw{ zyKait(`@-Q)9m^8Yo~skWl}x0;O^g6{=Rm*M~|E3X`;Wy+4A|G8vJ$F@9KPMRDw6+ zKZkaR)63U(o&Nw1pOvPcgLi#C{-ikPQ9LrN#(%?OUn{{|b=OUGSJ~T7_qTky>(dSt zxYl%k!1lhQU58!T?eRM4v*puI9Y2?Tq}poV!~8@1Kg6H^00z1v$6xrrZ^KTcDXVDK zx+8X)`Ktc_4^JJ#@Ogc-{{W=;ZPTZv#r&Xlv%8bnT=T*Ga zPx#BzcJG(X)9~*8t#$9#MChC=PCnXC?7WZEUDxzIJxhP~x9VP-!8+-;=kqoGdiZwJ zs^8h8apJW)h2{Au+xkA6UDMHeuRBj9c=^9J&AuDE?fdlTgZi|)>q~2=rIEYS{{V(J zc{{Yz(5q-G*)LxUVo>qdv4E;?=ydy{{S$57n|E|x^3IvU49z%k3MHQ z&}KucjV*Kk0OtE{*Ve?{={56z6Po&c{{SbOr{LTF02{-;ooBm;+1K&qMjt8a z*L02EUb-E3?DO^X>im9R$^QV;+fIajY(3wmjz0Q};{KEMIo_|;Yv&`&{{T(@09yT5 ze)FfD`Y+4swfsJB$*#Kg>y-79{U84T$kV4E^CZ*R_>=lL*7v59>c9SurNih~S8w6( z!kVlb^^I%%-}QIU`h(>D@BNFnP5rd=fA@=T{{Wx9zCC=M>W}i>a(zGf51g3&7uTm} zpZl-u;mW>&*#5iAZ=e2c<*px9^o!f%{`31(< zwbO6pY~A+%09Lwux^)RZi`mALK3+YP)Nwba{{X^gC;7j) z^shz!cXywr?LRM1H_rT>-E3{yJ3RPxdv;Yjtou0i(7TWI{f%e)hy5$t>VL`q0IPa_ zx#sNr&sqMMesAgfcJ1}wlm6$;yQ4idc)X=v3clh{yyfO@Y{kpA=i ziRu3UE7E_f-=qHksh)Q6<>~%{{{YsXsO{6t^}mt3P5t%jD(gZO@|AdM`!K6^-zFNe z?Cf7;rptuAN2!haU;6#Kdi_88OZso<+dRRill#N+{Jnqu*Uz_2dv$?ui;t9@D!%HR z-!3{ot@=1q&vE*f>-=Nu{{VgZ{{YsV^M7%E)BVllewiy@)xT|j-M`U%jsB;}{{S(& z%G2|_uCQm*t=}d?=G44?PM&MRsWm*erj+PZ6$(> zU8jp({ki(N1E9)D$w~oW-~eF$?*Kl}05k~?Gdmvu41fgwZzJ$|0U(Q-JDFMl=7axQ zz&=SQLj%Ckz#!1TK1YGg ze?JHf4gvP>@?QV}2?Y%U3l0x}!6ASFU{L?}!~aeDH%9RPM~6cN04NBEe^1a*(6DfD zaQ`^+kAemb1E9l_v58{9shW^ux`eP(V8JIBi*aCIHUHYh!5vaFZE>UIq`G!3SrFGq zqoxg24;ulQYs%mao27o2;MR)dK?A@bz#$j`q!=)CYGA1D+R}Os5m7|O3Q+}nHy(GD)#W61Xoxo)#o~Z_-|m~Xb@L_RfQeW)CV3D0a59|NT*U5DYZNh)lzR~oF>-xurhO5F4x29 z?h{#IIy4*4-ALP-&d81aKVqd^DlblXGNVA7YMZvry zGd59eIg`B3POAn@nq6r{RTB}KA^njuD>{@eZO555tGryg&3z)XvychGTk~%@2-bCS z__#A&;;dXvTFwBqZg@MQK-Y6z6>6KZwk<>*bMGresAz{X<{;5M{^XRPBhIcuMgT|F zveaS{Ldv0$R+*VD9-_eTCiN%qOOQy8$^^ccz9Sz$xP$BGjzY9!7=-hD(75amn7f4F z93I5M^_U#)k|emIPvCp*<-pZJn}p44>dI-OQO*}LEKGI(r*!P*kGV$YODCDAg`}t_ z_qaIZ>5lS0W6tnNLiZ`&H_s422C^twr8vsgya32KkIsA@dOF0; z4qL2B;x`J|PQqf6yS8<*`V%Uqthzl0ib$0$jUyhw&Iua%oeAb=`^A6Hm2W=-d0SX< zMlwy*)c-VOy~Gkd3lNoq)!?^%B_y7I*pZZhkHC~!V262iDj?49;5XQwa{*N?3kyDe zw4Z*=H@>~oYv65mY89BC(kX2$@g3hevV!E&P2p=GR5V3MtO*B&{GN{0il<25S=Vz{ zY%<$m4^1N=I>hoID$?mOu630^C_jOZ)%{Pvrd+P;sjl!7KnwZ=>|H*A)`fCWywj2Q zO2_z50B^YB!!03Zd{wP3&|%)wbw~JaI%sab-0*Gx=L_gxFCydTb&c94|2zJ$3DG-V z4dJX8jViTi*$AM8W#q5tj_`dB1-^y_pRPEg+6VcQSXxn!Q5wEhn~JZ^90iY@T~nnT zV_7BgG838W{atEC@);^bRZZ=HZ!><2MEO&k8SSBI8bD7@0a9ZyfJZ16Ubn>}U6VCn zIF}sj<-wV_;Jn_49%~gXwU-WeaTH*;DHHny8uXS81kJPOsAwJeZ>k!KqdK$pC>Evl zb5u+hn#%y!mzB%9HJKDK?Q1{!(RKyE7J%Z3oChw?DmuT zdsj$T<)^BiZt7Dyw*KWphfOGQv4LRbB1bK&#+20Ih6h4cTTy~$%3H-d8NiZ#_;7vX!8CTZZF)e1tWHWK)oyWk zn>Bt+8qb5(wQb1ut$GJoh4izf!vI{UgM3I>{sx7U;N zC?Q93jVQhDvXx`psr8)y?d++4RVL?*iX2%*(x3ej^o{HFhhS?`aJjT=ip}&Se~LS8 z{>;+c?obFurfV#c0$H0VfMngo7e7s4vYbn35duahAt|Ntz8?4qM96&tg+(d1j{#{d zecEgf+Fva(;gk7aB`|?cKoCayIWN{T)>Rm?EpP1D{f+ozq?nbn_Pg>iuH!;cV_vec$;4sl=4q5C?b1B=u9v7=qQ_!3S=ka2bf$fH6IkBYvle7~yFIf$*6R2{g%r zOEkCOY6w(S9mb9y!jZ*-qm*kU8|~_yePd;Lc|*6A(h8_T>gBfnrsRu^^C>_q7wf@E ztMSlzlEMqm8AuX3yb+s}mL2>8P){^@G#FMI)}c5F#T6qhLAggP(d*?1+`^FjzA?<% z`Z1+$ghj0O3lL|7`IG*&WV9D-i zGBV)S4UAyw5aP@hA`!Pr>5w+7?z>;oPw-XCTv~`1OZWVI;P13S^53-DE$@+bE$LO) z$~U$IBPMQA5L5Z-%lbOZWT8F*HzL#WUWNIjjNw5S;$Z00>bK68NY-lZW|guC^n({{Iu6LnzUuQwo0PADCai>pakw4Z-{?yu|{4E7XWo3UtVoinqWj5<=**C zP80e4)I%`AW1h5|f)~Y$9^N%TB5gS64kEE41pnjC`=D!L}{S>*~C zU?ky1L|lo~hrEjzBeji=zEgit0 zpYOZo`TYsWVjB+ZydT|m`Eka~zn42tZ%TZ<@%yE;4h5XPLYXJG9#CjOjdJ+q?hO_7W35XILUp74@5C@bJhWwsa%(Gfkpi7}4*5z;RD*6W z=M|8ScH}hUbbLQ{N{9IH$o=QQ?E3H%h&Gz6^_yG0sHgt*9nW^E{eWmwmg9RCzo5RB zIy`N~lI(n+Ef!dD!pNxDEWhxB5dRnbVv`WJ`>z;@3;8LjWdZyam)w%C`s@J9rZMXNhg z?**7xEC(J;j@p0Cfbi#1_^j)*iqn4B7n>@8$oE4-x6TX9ziC5z=gOHXwVLf(C{^c|G7K`>B#vdwX6PI z3|{Z0JWHY+i2VRk?Oa6drLA(=a#>r1IZSX4X;Z$P%>*5O` zwb$>eC5Y|qYJOD4)*tH??=e&9FFK$QV&jqd1^ADA;%q5=7|JU}e;&OgljVGR;m~=h zf-TukV5+r7Z_8lih>EzT!BZ1w;rl0WYV<9FiUi~a(%2(5rg(Z^?$c-|6&bG-EyBm8 zThDhVx@RN}I-HIC1onKHSbpIyxEg0?=(3 zl4&9mf%QU#>SEAVcGQ&4AJ$(^%-Tth;?}jGKLG^R*ML@3U#%DC8ZPDJJUg^T5iRf~ z_-Ii7(N`k=CtJ?|^$KT7JIleKS-AE7m&7~VZ{v!%jA~zWo>h)tR-=;q=P}J- zsSweQ1+)hbh7uG9hD4gQVm7iaERy^$-CaOuIY~?6f&TX*d6>)?Hofbhzt$2eU&aX_vAzqG(grCyLv1%Z&H)c*njwe+c;m&g{XP#BvcXq%V~ z9iGb7xz$UD{Hymc3@E~gwj9|ez zZ`63l7lL5Nscht}ca*Ux5HV9|Mu13kC2F%9+TiY+!C)Z?+&aq=m6Rj$Iasv*2I=sq zW{y!-jCH%H$VM0Kg1WfT_99zhhc%nj0|{%dK3aPU{{8;d{Yval2SX`DNViKft|$Jc zLyNvhpHP0^z>kKkf-5^%PIOq>w5AjhA)8&${gbx`$k35NeGQFCTBcAAOnl_-zS6i> z(a3T!K*rjzPeh^!^8_FRZ7U<^z_RKkp~IJGBOA5id%hb+4FvyX>Q?n|r$oIv!-S9a z>lNQB3UN|`OsckpRX^}&1*h2>Qh@cTl{*_1`JJe8KaB>SntTJY|VvD}@ zHJsnZzoSJ>RkMy#V{Ej*e2s8CwD(Wlnf9c;PJAL89unzH5^k&=rf{a7ZtTw_H+w4P z?`eN@xfQ_}QpggSrt8*$cn;T(+FysS-_?Fs{ zLKdY@tAGIf`pa6a;U(}JKWOnAD;T3Ee%pYhMjZbjq_DMi)wm-APO2`?A;ao2ohc|Z z%X6MuQ7nj%Spu1=tS_WU*hwoRga4_l5OafN;psPup4#p*}|+hza{({ zWu)Jle~uPu6_jTCkYkEF%}l4ReKxuj z_n@hk{7X}*P8YI1FI^epIwA6Mw+-^F6AULAwT8KXmsu1>7K=_i^qCCjQoX0@f)uZo zv_}R9ghgGuYRg|dLBp7rMQdE=!YkZI;IDr}KY{dZhUkFpYRu$8f2<)T*-k+bPYVj0 z5vL8Xt8p<8VFwE8&doVxuWbpdYH529mBovEA z8xS59Z+vblfN#9#Z!w`T5r-aW+*n_aN}t^1PvC~gal5^nQ0qpf zgRj14K5;}Yu82=OzIKD?Qyd5o>h3!rc}r2Y>+8^CR-SSC@r!;A-#2|hLSZsS0vTelgvecK;_eFW*~>Sl;~ewow4;r#hNgF8LnQZR_xA7K zWUViytHmeuNi~#3t3HfqnjAn@rJ}}x0p=Jhl89Ilztdk~MW(w8qw#>W>(0wj=zR5P zBIOM&j_CgIyw0KCka0d^PS;B0BYkxuV^7Jmg)Jwi?Xv@Y89grrgRAK=e9f*L3SKD% zE&J7RUep107gmtE&BJ-6n87=uu7w+dC|NlenJS=w(O-K)vvr?f=D{EO7x!w9IRc9* zN^f1(JlX^U3b3Wv`Il&UZevIE1~t)klr6#ib0bQq0a_SU3{RlQ`MngPz$V%gx@Hh6m zmk7=miP-m>42PvuIZ2JV9G?htlGE_P4@LiiZ?NO_+`xL-O0C%m?#bQDVg}KOAA))TOHSDh2mmgf zDE@tAq6%tdd-t7%(9+-`E=n$FO$pLQ5cud{$H6s`g=27KC{_?J2Y`TJqAv}F zE5)`FsH#jlSs~k_z8c{90sUMJ(T5TnV>(%VvY>}>=}P4$$Fy>Rzv|yHjnZjKFeOn* zAX8E1MUc#wYH;Mz-Ts4`b#ML08xD;@^h~F*eu9rSG{$d@8Si?NoB40!$dPUBM|DnK zs+tx1ooo8Zhu&umII1IQt5Or}WLPPgDF!vPaek0W?$aJ~IW&CXdlfGs|{U zvZGu&OuYiQq^#_m`pd!p~9hd&jS547}Oz z38eX_%h}9Wr&4h9(ryzrMJ0%-sI>7KY~cBJ6>w(sdb%b-XrDl2IT)%iFU(`$iw*B& zMzvU#F>d{u#3F5Jrv2r&H4(P3QBJ{!@^8ZHuT>U~rVEBnTd#lX((mT@QqWN-?LE(l zf||Qs(j1_F5YIDwRGd%8@OaFNpW!YxWO5Zu(D(?wB^oKSv)g13nU_HAfrv@Td(fJm?$X|Y&O#mVF6HvGAkjI0kvZR|h8>x4hAf?{m zf~hgpPt(H%fz<=~ow zVhKPcdL-a%3mYQhnQ~nZIr8EzbwKF)%+6wg(VkaB6+7|JzfLV!>nje25`4=fN3ITs zl<-p&Ih2ScC-@$u-_4pLSS{vWwN>;_ePELd1bkUnrJ%mDCq;!rd zW|od3Dt-63`X^q%TJ_+23H0tz_Jrd#Z46o6J%o!?B+H1;{kqUykX9m_O@fHDNSf5| zKbZDSRqrQbjpPKRyKkZ1!d&gnuZN3)%{vYuSYs_g%$o`%saZn`1sHqy~jCn&4hE8buqf#B`-zj4H#~_1(yso;_tjkwu8my3cW? z-*Z16aSyQ)ilT$n3IKe&$0NR>iv-u5utRKl6iu*pUU2-U5ywD#ZH#SceOGFBu5Z*1 zF2q)nHLz&kwT|_EA>?zPPc@aV;)pJxSEwzNP+Tr}-V!D-qbdABm%U2hy#`NO|GnJG zc5QK(bG#OhtDNF8omEDtovV(K1t6Bk&dXt;K7~(h!W0L*nEd`Krr-wo{_EkjMzu|8 zFXS5RO)OG9S;Z!A#}9_}4MH5A8@xfJglKTwfwovgMCkt4yOjc?S$0s=Wszs~h?`Z^ zd$Tyjq=4oi;l%fwZYTxFKOAu$wD}NC5&pM}(rui=dJEvtvWp*kZ`Mea8X^ot6X%JV z9E65~PI-YRN>;Ft;d!AIhG%I%iL->00}tMjclRGvlnlBJJLIDSpwPpt0Sjr`B7p?VWjvjm_bI23Mzho+m zZn&D-P>|EKvE=a4(Rp%QXrQ}|{%`uiNh_U7&M1%=tDPVZ0;LXloO}xXgE-eDkpWaz zEVi^r43$*H?&#>4==NEu~8KQzBwS5iwjYu7V=`Ve?f%m16r7o8$~WPDr_9-bB`xUo8O(c+r9^_Z8RDpuX~(n z^?=8V&>EApy%R%}+fu1AkkNvQ)T@G+M>gGitkdO5X+ZPZVueN}T-RV{U#?!4k_hZaa}CW|5=I9xaH@^VyXBW9FIT9MjF*L z-5uB*E)+_|YKP!TwVuQaofz-vQ1=NiDx=?CVEtJkJ)lbIZMyXq>ovT^*3CIlEG1>z z6wpH-Qu@NzP06B3$oyiDp-{Z2p(xtP8E*`$ybCq{~ACyD6PH{j*11=9#eS<8L#A2{9dN0?i8F zuyP!uCF7vf_l~^iJPTLI@MR%$xF_FQuq~La?OHlpt8J@jWyMtGv>p=WyNOa~uw z#0EuNgY9LYr=v5J9kjDc=jd-4sjw0+{~$7VSz2@u%I@eEWhl{w-D}vE(kSk!F(o`} zh07no5ob?#E|!YW!rtpCegbw;4l6cBrW_}((3YSHik7y~l(jtZBHGM2!Y51-J7mLJ zSO0lzcCpnMD&nJ1nZ0>fZzE)hQ*Fc4*~USqZ|}=)&oB=C2u5WxO`x1E4p{u4{lCP&0;+v zb~t;hRZ`X|S>guIg8l52=9n=JCf2?2yMw7z^}CJx74B@)@c}v*gc;xF&4GJxDmwz# zB@&Y@DC`AuB>v|9=Qi$kaIZ4_J^-FD(;*>O*s)oT24tj}LyD#52b z&;S%79POAr<+{p7FDoTcVK-!st|qnO91xrb4)j8?9Bh0urSnC^N&1(<@*pcurDiD+9>(NLU?>Xb9MIz z_(TG)%DoOLsUfG9&bC#~^>C(-_kZW52>^d`M%i)mlz^lnw?h@rdnJlMyK+bB2W>4$+-UH|M|trb@j1) z$%e_P+{PrDD=)svl;=&f3G7H|h?Sk(igf2MAtppZXFPJPW8w)Mji2se2A4nB>f16I zoCq6XZRwKrBSy;*fX-}HgUKV&2TE+OdW%>%xARoO{$=5jap>nUB@pq(zT7wLBXxp# zyip}Cn=NV3M9vT+Cl#)s%^n3oq@D#pRHeGCDT5N{o0~p-UP>Mr;U8JK@KbRJ<84&_ zhCy4*{z(%J-Rkjj+$C(dMI`4`d4-`>(*Y<8P$)~tq4c`_H@lg=XF-#ex-~nK^=^a$ zo6rlBv0bI?5K)Otoo_y{5p!Fu>uU9;Ci_5ztfWk-HjH;w?zAQqd}a2`S;~2{Lzlti z?DHZFm#8!rGHsP){RpI}{>H4{u@?+q$ZuU(M~B@O52M3fiO$^QmbyzyW0{?9QQ$6Py6$?`Ch38g+JD6h`lRtx5 zNLI!v?D71eBx{a4>uOZ09z zzBBa&2)8;iEjs!#VK*vpws0`c`@|!=W(aa(KMh^|@%*}+x=V{e;X3d5QqLEr^js2@ zvry;k6mAMfn%64>TNz!QvoXEaFC4az60`Npl|ihYlR@u9#6;o8U;#Eic6;MwYLL$( zQ*%UUga*NDEg7A2k`^rNOGV_Yjs)>|&7q4LH!6!KrQ(JuB07i(-`?h4pQyv_L}vs# zTHUPSerr(t*-%nfIte>g&cPtSL*xH~-le(N7cXSXkY+!Oy@<8KPOF=gaA9@OdL9An z9*zrWdeNrt-XfE#V_ajY${$|4E zc1}jurr9aHCbhjxc$um5&kG#Mq~|V4kO7!@9Rf^Nz|hE<>bc9YrTtmlk=sqmcxQth zpim81qnr$nHjf?9aOggpMEhk2V(oo_aNG&;_bClhg2 z-OGX`ny>)|Q4%S|@Yl;jOsT&(N7RojUNUJ?TDUQ!2@9=TiwP9Q4OPFWq|7%*8846D z)8^Ed2d;RPrRwb1pTMrtp?M;|#G&L{3<+$JM)Yn;zvVS6VG({$VBy#FWYIc*Ur%F> z-bB_`Qh7+~la6+-%&K=iJ|apc|ET0Z%`O8Cy{RAcgF3qVNl2ZBlO-EI#tc0ZtX-E0 zwMw%cT`X8+YEq^Gj2ym8n=xB>TFD?}3i3r?&>X!yybSml+J;e(HuC1ygD|DkQ_jRT zwaU&4Vgu8zsSNZE=B_@!dc!-l_uIga-7@jx8f0MG({by3X+xQ?+ zOcCcNb0yhN!ihes@*g;%S|vlrxo^4Lq^nB6BNXmKz=@TDc$AwI5mS}k1w0TTD4_Ga z&t&m}!OAexW21|HvC#?+)~RU_qCYwKt@@_}58)efOJrat)2pjj zWX8W7`LpH2Op+(X(&q5?!>{4aF5Wa8$2Zufs%J{XgW-%_WG9n_b2Ckz zBRrT44-}v;J0~~|8$QHa>*$pGz$Ccs7RHCkplm<1z^W17^6GnrK}f=(Frl9QTg5bw zTTdpHh~DM7<_*-bGq>~aU5%#Nrj)SklmI-=CAG=u2n-c?^N#rvC?cbmDEpT{rqZ7a zQ{|~@N3}Vtc@q*+>bDuer?paQnkeA(4L@qP1~lww?9ZcRVhyt!p;v&7i0Df_pPdhP z<3{`1{Qj>8n}5xB`tqxK=fn=B>CgD~T5JK;?%Ws4r`3c6O?b~3E|JjIb&FnqT%7)O?x@Q?@wLG;Un z(|YSmpJ1*Vxt*gHsj8?6%-A0E0gES`q4q*g!XHYvu^RUVydXS5QPm|?2gm8HYI7g~ zhfIPy-2z?}9uaVc13v5>d6cvCj9s|8PNTyggnNw_fuHZ>^UqoEcH<6LbcH zf(Ki*kz1LVc#f)wAZIlSjL{9&>fiRdxxm*z^8ptU;$7AcD832~FnbBe(YmYzqF9H! z*#ZYYfixlCg_BY`sJGEqemi`W>W zQh2b^hveb>rls0f$}XN z?7hzs`6cz$b(LfKXiIM=S9x8Rgnm$7vWI+e5o8u}Q^az%c%$WwR@Avg)(#Vjti_02 z5MT4Z+X&1R;0zCyx)~WQuL{t@nb^zhZaUXjJqisvsCCZXvgFLe(Xft*Q17a@6#4(0 zV^-1c0^77?K6<2R5Rf4|uaxrL7Cb;m50m|K6_>x+^edC%?<>{e5D5Z%OZ~spy*vgz zB`P?a2UfWgP&D^6U^PXXS z0bkdof}x$zxNgHu+CW`yhS}5j-(06c8v7Zph&2krUk81oxdM8t-eDF*xN@7-!7*_Z z;+776Ml;ME8b8bxS=oLd;qWOLj6pqL_u1Ipzh;4s-?H-vO=o4=ozUQYH~u+L0p}+W zvwndm-4n!a0x1g_2SP*i@tGVfsTZl;8PO)BC8#YoXcvUZo#EYZXhXS-2@A=_Okzlg z5N7Ia4zy?8-lJbJThOLY6US@CyBy=)h@NBQ^LE&bbzW`nZeH`(4*eQaTOyCB?OSi! z3Ul#va9^?49?#N?t-nt+u_h@{Rp^U~PgE@JFImYvVUc7jie-hm1z*4~ZgAI^IFzUU zL@=)NSWK~RKaNse)ACXTxmos$V$PY9i=lqS0E-%k7Zc>V$35Cde0QLunW`IbA1Sps z%8tPRx z9VUt}TFIa4uz7#6m`d5`Ds>~u;JlE*`?Ymr;Q3DhXsokkucd2a8t-g~H+JTTAyDo) z!^%la$af5ndV7R)t5#w*%!+}iW)KD)OJl-BqDQg5@|*xSmUR-};EToVH+$y3wk#gQ zt%a@<8^JPK?=76)-g@~@+lv!<*LgMvDad?G>6ZDGo-Pmk@V*OUHXBm=h>Fp$1uHmQ1`x^W@jc%6^|W40J{t$_ zsRBG%gG8pPu%zxC^xs^qs)86xT#<%B7;Y%Z%8Xi$x#f=2O2+$C%+KVU_RPk0*9d_? zk*0BMzp7}76d6z?5Vc1{$L&zat;2ba8YieEjCN6Dzr~}o&y?czoYySBQ9uFzy)i)A zN7`FQP&{HfuWf2|4__VMa>}ofdfnv#)H8jU)$ST_i)C5q+2ezaY$fT7>>MuU{?1I2`a0 z+@M}~+Dr--5ssfm#gs3XB);x~Y0ci$D*`fvg95Sqd{}-W%XUw{)ut(Daje#e6POc( zf)9;i_c~;v5z*j}vlF%TreV5fY(%9{`*3=hP*%~qb9V^a2<0?6eV#Gt)ch(cnc(HXBQrWuO}{cvX;^WSrR$P2&hMKpmo$=!3JVR@Me{ zom8+riLNH`I`fXc$6N&(EquSSemg>a(~}_sy5ns7XI_$TRr|WW&W+wIUnO@oz)npO z^pg?T5pz+MQ_dYGCq`K&rdm>i>*`?t{Q|FnaT{DL0sy}RxIu?)6nrTkJdc57Bm25% zTOFB#nR5qDrk*AjwPa>5dACM?_Lby~o(?dw;Uaxr6SY$9zkBE`OK$k=zv4f~OwT!C ze%%yk*V6bk?8jG{N~tm1hOWw)AgZ%IvYB-y(d&BN+zWuEke zY?P(Rz8y_2(w4*0Lp3n+>Xq7eolwmZ>iZXyL_Jsf7_h|-b@=YtlC@KL-Z0(Vu*V}| z`en?uWJ|~*bXGW+LlT5YHj{)&)^x*1pZ#n(E1tr%m{nr&f$wGJ1soZxqw98i9B+9z zQ&7b)zT)&IT%0ti7nHn3_QZ?R0mDJ{Z?@2ozoXl`@$;jofJwyN%>{)!Y5&YofCsml7$C zZ<4*^kVvK<5+l)p@#{|wW;4UmOx=Tx;mKL^4(}g1jsi#x@*}Gi`*J_J&T_vp>lcg(~|`hk2pAg*!4P+MuFFq?F5I#>(4uOALm_j z~pnVFS-{X`UN`mvk}tudVzi_=|;f z*JqCcgs<-1=5)xF!_&cGqjOdUI@wThBzsQE3B|iQ zbK}#JLb4!dXU(}y2`DP=yrmy6jdoFvH<1algezU=*F9XpkZ4m*A#w{Ze(sBQ73rx5 zmO3M$oZL?akb8DM+;UhT&$(EE*u!pSU{DAVfm~8#knDHQy@~}ROh~A3RvCC$a5Q&J${M(we2aZ2e+sd3yfAk+L?t*hRdhW&s!wBljqcYl+ z8kOx3d4Nf8u+uqP&qPFBkt}t3wj?fix!zbbTCxb*XExbrWO=2*sTe@eY!hxJjHleA zA8!r%#%$NTka&@e?eJU340Hc#F_|w}(xRr>le)M{TodX?4tc~JdQ&j=-yM~I>zeTX zXUMS%V?{oWkOkNz4%XO}1ep}-l9fM{@CtZ5f0-NfWX<3e5B1*_-;rVD4(X zhDdip_jp~b2g~9s%F&#qM!0+e6%vKddMnAkWH%!kmC0ng(rxy(2XutLJ})5!DeG5{9O-m;W#qfdZRW1#IHF@4T%ijQFTfE;%n4t`;a-oC!gL6_r393 zfJ90`d%>UFZZRn=E2L!aR3G$V(-=;DfoChayeYW11Mv<(&2mh-}*ehIw~QK{z>Bi_$%UDIPUl>m#<+!I+tDXd7Bs)Y@dO1gh6T+KZ(w9@#>y*6s+32c(}ySkQ%{ zn67OetUe|y2+lZBEb%&m*F#;shiQDmlZ+hGM(DqvjD)Eajof(hGCX{&d)iFcseX_i z{gOHh&i)Sn@I~^b=B>oSkvY|HSc+bX^$xz9X+e=XhX}g_PO7*LjJ?aC@cXQ%$$0sa zgZ-jBb9JitffbcD6gTAUmvws=r#Nn;+N1`ATNAx5%4WfB4X3L}K!W!74BCr|z9$OF(nTo@tC;;N^ZzGjv5;68k^By%Z01q#@i1SX zD@M((cTQH7@mL}wOqammaLX%Kx6Uf!*6$lXMr4X~V(W~n*eb^KrP30hZ02eiP{qmE z-K7VF@<1))^vnd>p8AOW&HRIyUp2!IO?Ku-jVo%k&HxeQk6p%)zH8 zpaxKou6Jw=l@_;@DikGLrOak)vq*`YqQ0kqjAMF*(>q$GL0#g>Z}b!G!?+;M!Aj;p z^?ko$FZIWMvOaq|TRz+kkBy0#qPoM$kUU;qEKUM6aepcBvdLYLAL=SG_2xdkat@I~~KtQz(kaYQw8nU3h0du`nh$)R=de-hu;-O(2;V zB8@1E(9y0I8XPIryq~k-VRXTx@?sRgi{(}7BQJBTc*pT?t{mCBq^+k*Lk8f(&u+Qu z(-$NUt0kGldSPNPHD)ZX#&>D3+%y~MCg-rE%x6*=b`f%ZOdK70(z}=4F+~xjQ8ZY| zZ=RQ!G4(Im`<X}YS^9NX;^6jDsm6P_-8L|&m{{cs{{ zL4L4-lC|Z`lGbesO`25#Q5(1Iz7V9?=zN5~e~!eZ`^xz%k?LlA1@lc2cSoJQTqpMw zw9RC}AP|jBjWXje{lmwI1beGpaV_qwL3J;wi|oQia3GnTQA0yS?gzWrCC0|1uOwfo zWI%(eMliSv-A{GJ9?7x{A8NDJDRW2$BVGXWP?A!!y8V}+v(yy1f1C{@3{N)qfDwY` zP*mk7Kx%f0z5L^+p9}b``|z#6@ zI?{L~IPjh+aMnD}*tCqeu_&JQC!TN5ufymtXchm~Lap@}?_))-zIEE>$xfRNW{B=X zpG9jnQTp3`U5LQ_1}0b!9y>`&zk~+dDS9wWtIbd1rCuXd;%^=Y7GDUM_r9Ic@p8!r zy|XbR*FYoNhHCz!Oh^7hjc3x7z*5g1>;EZx`iiHG$zL#wH-c$%ss=qF(L3e^}-3d^iWA7w)X&n_^+((N5(=-v4( z_(f&!&CChb&+u#_W3`_3B*y7-ZyIfnKd)d|Pz~>Nk?6PlNd4AvJqB{^jR|o)LK`kA zEfR$U)0kIK;;ismd~FpdQ-#IH*Spy_#iC%MvzMh88Ey#RX|v_z@0em(*EyofgHw|x zSJ97m0!u6iq)I%aBO}_5)_L%|W>pax_i-5SVqIy9&Q@LGope{^1^;zXUxHd-r~Y2y z{A^CkRdIE$+~RU7cei5F-YFn8%%@G$$%&-@bI&-q+9pvgb3Bc>|KAS9U$t$jz0I8a zQlXgTLLcN`h%t}P7K|`=Y9k1lApNw$E?@YgTDm#mV2tMS4-W%S1{i#u$0*KSn_MZZH zK}+Ci(IsLL@DizX;;U*&0K^Hftc6{h_WzvMzwTA|wA5{Cw@w_A01tj=0z?y5>qo8j{>~LrscVXSdOS(FwC^9ZW+s?%YBioG1}d4H zVde_Xm~UgKu0_GHaJF2is10=vCIhuLdCutQeh`L_nnG*P+YE^!9s0?kzVM5xBgRU9 zni3Ci3JzM4CbiX=_Rl8?9M?Qxkq~epoCeh7b~}$KwVg}vxM#pJMG9;;*2*MAFleg! zHcU+1^m($*V34!wqa0qe3sLyQai#3FJ{Cd;y%H>|lqVT@Zk(zLR& z6XWP)^>7C*hya)#UDrNRw>h%ft>d{yoArrP3Om`Jv7XB@C=Ym3BVbq zLqW61PRFN&x9|rO#Yj}WlJxD$`>e8{2h4IW8<0CHB;oR^A)Xq`Bq9d3aOWs)t>vhB zW`pBSRaqlc2mb&*sYC0gsPA9+L5Ga2Z>{Yg8o9O@+o*f8hPANC(R?H>KJiQpmy~T= z*Bap~8WSDH+EVzk-IIp6Zl;Ec2Y1r)298lDZ<3CLjBsPNRhp{#uGV(o#&RVSh!c7D zrI5(hw<-pN#e4ZyOBlvI%06O%az)|~t$kGX!>-VTa;8D3Ns1I6tp0mGeAX}6y=+G*j;P*uZeM@oWZDrthNCc4MiLQtuvxWlxe(4o^; zo?JmZ!S&T9HH8YRhXeC;z^7&+y&B4Sip9nph0l?<<}gDg9^9bZgeT!gNi51bm4*)ubOUq1}Y>{-Vhyj!Vems4b_HwMrB5|M1E>_$pOW)z$ zPW&wF{{Yzk05N>CoiH37U?#B&VIpn_Jd?weO;9a7!tbDf4M02VCtaKKnp_Y_c%_hg z>r+Ytv>KeF1`94eA?Tj!jdE?zVqA0Zs$-i;{iSWg*_NHSE#{Ytc{w*V4H{G@E{T^B z4O&O4{%%O;IGBlmibWuw;}ZaE%Q1NcpoXF%`pyFNou`W{2>^*pi5B%BTc>cnSQMqB zVR+HSnd^=r8=}^M<&J)pm9$)_WZ6!~#oHWcl9+>7Ob10I=GXy{Ie@hSsv*D_ax^BBF#bb``d9~1U6=22+ zOU2qqmOZix!bLeMDL8u+)yhZm7IG(gszL^GqN|FEpI%a4?Cfd+JHFxDert_nG0g)c zg)DcdH%98}vCN>0bV4~A*xlXy_7)bemmVh(kXbo= zYAE63^&|OP##hM*wq34FTNB4m_E%3p9u35cO~s8KOi5U34kI+t~9hi%j?nqwq` z>+hy*!Hm~w(=Kl`DI714XKhCh8y&nY=9!o@I!v-kjaL{Uw(tjF7s!9m&PWF}3H%i>7fvxA(sA>xg?`Mce9^t_;y-j!p(xHtxp&H#$ML8ZU zD&gWtoXIBb2psu>rM$NUAc0p&GN5B^H9$K1b)C8Y0OV;&u@jyg*y_;Rn~}PpLZ3>L8jj0CtTapq8TL4XGunr{OsBg5PZfz>(Lz;a)b zaqZcd!e;G{aAO`l%ZbrMe(4jgq;jS(fB=|8N5pl6)o%4Uwc(80`{Up_*4RgF3K;BUW({=QsI+6ygb#`$|0n zmioc~-LarJJThhw>=i?Y6U?W5Z~ZjlcV@lWTbYC+s$iTj_4BWx7aZlrOOKd6;e-rz z@h(5}4NBEiZHU(DSJ)t;LLW}K4K#}b0kQ#ItJ~ru8`ZM26%#g3ukD;V_N8he`t{iD z4$Y!(LVfkh?rqDgcThdmF|an^0PyKS3RBzR*IHO!vxZaQ6y-!}Qq#YGuiw|*q&<}4 zNfx7kKSeue(}7;f5Gmj^sM56kLONHb5qxfFP!RE`SFi_hr}#8zAPh%i>1)u0++u(j z3RCR?Hq!~p1|Hx7AXu2!58jPKO3a6S5iU!~#8mQ8k(e^8CMxd2H?R%{Ji3 z^v(>O9Nh+ zG+?SB(x#z!@zg!~>kf~6MSiLz95OrpFNJdL)$Gl3w@)A_KNuL}Y`9aCALfrwD+c(q zFT}WK$Q!xUmvcc~v9LFXGaJ0NpUYdaO{OBrHy;^-Vx36GCm_u;sDLh+RVj9uc8G?f zmqEQgGS_NiEhB>+{{RvtTV~_6M>8dlO(8;{nFY9_WmDp!JMYU z?Xx8QQNJdotbR+{*K}R4D%RV(vZU|f_T>H)Wgx6WqeD7PB+Vvsw=%>En1!HIox8@> zq6L!1_+w}QWgwmaDJP(*qB};vR72sBuX9}W&Kx{9Pm~+*zBDc}%KQ)Gnr?D~eiU-L z>9uoCJIffV%DFO6DQuBy>esrV!qLB<+l{SEO&$1k+Qt@Ws2J<0xmg|0LYzbmt6H6} zdep+t%uNrLt#BYa7La{}4i#Pv%V~knY;a5*=9ZOnO^+-QR+*Uc$@Ia$F}{1h<*fd6 zSH;WpM!bkRT;U#{p8XZEw>_sPg3kG8ATQ*90j_5?LpMIG+$?4mI99KISF8C6O-M z113vdcRwMlMj0YK#gM}1inEc6YHU8%1--PhE2d1sMPt-6z;IQHpp>Z_QcbpRf0<;` z%LtXBz*+b^7308EKd9|;X^x$cP330HPG+i$3!ofLArlXJa!X;nXOV3?cb``+`;#(# z_lzU4ELK3m?q9QcU`1N9Qd0!E0~eVYCU4o^Ou+<*%!&}iT*`?Emg7Ma_qjE$(6R9O z%x+?QNQVUD&3RPs8$5bw^&zuld2m2mY`sPx**Ka9D`hWFTZYKQ_;vpP9XXwh(jc;p0J{A2EL%V!KK@ZF`iqW zj<=-nrMxhZ`A#{kq&=r3scczizd!P?Qf}eWMIs=wz*LN3>!xVky=$2x;xPc%7M0C% zF~A>L^;7kZ+4PbzvNl&20C8#s8Gz@9D|Mmr4b$nt%ic^yTx;6g&%nW$uB>}!yh7T$ zu)XbTTW?)Aw=wigvJ9o|#OKwI6xy~?%3$eJ2gY>!fi%eC-S*uf@}CppV!Fl4dz7#q z>Rx8kxNC#o9IcW<8c0M0*mX{~r*<}i;9nMV#O7g!$9(nVU5CcJmpy4cx?j4()|NMU zcra2%({Acz)JzhR@$Am!=bX*Du24FrIs%{o91}C$r{4D+7H1fImjQ`&fkS&6;Y@C; zXwd4KSjkJlA$%tI6d2*zQHCAC-kG_s@NF{}HG*JT z(&K>y3~<1q<$7GPr+qx}9w^Kf&CiLwL1!59Cd;+$czlO(NMUPZ_W9e?(-u=! zu_c9_aVsZoG*v@5QOYW`OvEPL!hK0DhkKpT%`cSKM|Sv}grDx=YK5B3q9)4_WW}-o z9960SA=X3L=xGw%z&@MT9uT{;DtU{Y4CHMrlVf89aiCb(CPwDCW^x=|#Vv0*rIxpCL1RzI4uGB!@h%<>HC7+I~wbjaR;17Tg!uPsSr7{w(K z2LAvTpv5t2B~`QLPE%CpQ+Y^6k9~(y{Y#qi4r^?>h2!nqZHw_ticDDG%lWdgn8MhOvLkM%X-P@O zNS0Y>IJA!W6ix}Ks$yh{P1|)Io(=0m3!4~(+_w$cGhn=u^6Fej zK_?`mWLzu>H!{PyG8i`$;u`JWchH|KMl{m5i7K2`8bIYzIlDI7tPDP5rG%(J5pl65 z>qwZ(5c+O%XF14NFj>2s*g7jH+_#C1g#tizQXa%-GXjqo#T5Eii~@a7SBF*@HTUMIF;)3jbOzE^`}-7Ag3lz;OF zYzcybr~-yChK!oc>OD+)e3AK&1hnT-;UPge0vm&Y_EC#ZvFc!xPzb4W^(&{q~0q49q_!Iv!d*Wwy~`v&V)EYjASwkf`Grxe9=V0 zZG*4}<@d3xcCo?(Az*4}I08sNCo)%`buY~9<4yT8Ci3&sJY6}C%7(v%eLR%_ z^78jP8-c64&BT0mb<_4k?(z$IhyZofkT=D%U=HV=-|kdF`#2a*0*nB}UH12FTz409QH$);2H7hqX%_rBr1pm8cYpf_p1VWs_-s;?E#S`Gj(3XaftW z4m=eB2(`R_6_g^pbHn~f?n$+!_;EeOh?td$0u6f9g=J5xT;w^7O)j&O<6TVFmBWhF z#k1BbNSF#gWc8qrjVeE+b=d4=9VNIt*D1TTHA-} z7a`4T)TovBW`)3&qBmu<7i)%&UN^OZb}%kQnlVWQ-#JPX=D!kE7ERrxqQX>!5=~N= z)G2^P?uKT>*__9SNkHNVX*_|zn;Z=|OA&dDJ-%QHfQ-O%BN5+fbd}K#H31Ey<6i#C zg#>G+DpQo3j407n0TApUHS6F#Y4uPvdQwrv5{`kZ<4Ol${a(TG(CJQdR|EZ&WVNj; zUf#-d@1;$^-`iOaU=FndQ?OISJ5#oT-FQ#~!k>zri~@{V2eG4Y?gQBp2XN>=RJ1sCYk9bP>Vqa-)Bx%o z0BP+Wowdg*UyXJo5shi{>(`S10JF?1h3>~};v^D(>JgOhQpemtkibkUk66z~vW}B0 zfEMesb_5cbhOY8g;Sd20ZGAfeG7Hg zc$P8pk=UczQppUYsAzI!6U~u(lWuRhlCp7iDpOKD@xda$8ixik+sP82N=XLm;aqCpevJtmML)>`LL? z@sci5G<2baTL`!Yk1oZOtSqY+ zjWJ!1H5~RfNj0OUBBde9;hUsPQxxc|VvPhqLnBQnX7f9N3+1qS^DlR8XzExWw`rSj z#Ca$X+>7Dq(yGk;&ZP8=-2961DZZ6(_DR_zo5w`QBC7k(V65gg5x{{ZD=40YWsoOmy~uI_Dj=EQO| znM0jik8GwylT3ya7{;vt05vYX28LB5 zFpS}aGjD5-wi^_5jp2N34+@a)&Ou~5aGZ|9F!QmkG1f=T*WJT*#VH*ew1deOH_??y zsY1^7By3_AF`m;M(67s_t~v`lh$ux?={~R zoPyK&zsfmO6gY{=$0`D51Bz)AA00EOZK5j7S7+v8QTzY!z8Zy?sKvyNn#`ppdE&`;B23g!^60+>{ zdZZ)B9#ZjsNt=U#6hR3V)*m6Bu@wk$6qKUOiaQO^z!d5l$eBM{iM)K5a_3r*{{S;+ zl!AxOZTJg0Mesc-nVmT)mH8`nL|z$s;EuQ_;Ng#N$GMM*jDtlO)utq_2Lv-nw2*GA zhjUX7oh+z^^;dAA%pzkLM_x%?A8zU^2a34j{;-E0y+cktv&B2>TVBeIFMJBhYxii@R&t@R^XP&{AZE8UqcZxhzXT6&7*U~ z>;eZ<3I1}F@zUNvX5AqKAjon3_R`ujetI(19wG&h+#8<$RS-nJFyKh|rSBy`iDU@Z z5t#iI5;6x=ETgxZyW1yT8OgDCcND3wDh>Vg78ZrEc(^q?sKp-vbZp3jM_w<~9M zA;6R*U{`|ouXRkATtD#X&W3|Sd3dt~PZ&f(i54T2SiOmsIlB;~3xbsz0B)wS_XLk$ zq#%M8K%d=d_+wi8anGdHASvavsT@PFPB`%O)nfUA2#I{egg|LfP=QaZ2i>h;5az)} zuUUgP%7m3m3*P*@?cQp{VQiy`EO-m%CnVt*Y`F5|2#~iWAKWWIJhTka8Aj3yvUbV3 z&xBqQK#G*99U%FJ$r(-LD3I1Pvc(ZBnStTL-90)HQO>Vu%IvKdAlRwmgW3JHad;<@ ztcmYcP90u2{{S9FVtZ-sY_j2!vf`!POt5I;NtC_5yM!J++TiDrBjn7fK&2<0yu~R% z+e0tvnIn^Dozb@=TEY zDRo&ho>-5UF>B0`M(3ypoRB85eg#M)%{V!}6K9Nm?uUhGvBCEj3F`HFs^_(E2d7$( zN(hK`?^<|hElQyF(z<4^k6&mFY1n%9?WOLbY;8vfZiC`J9u*Mq_t#2+V)%|esuaQ? zDTs9uIDm~hfNVcctUxp=7NQO&^zV-l77T;}fGryc2e1VabnDlqvcOAKx;Ldtxur^& zc@5Auv+gxSKma2bNO}+bKGy#Lug%n2!;?oL{oj2_r5W{6jv0rt^-Gu#1;RW2z^a&= z*-hbIzTnp(U2zucT66l-b5|;0JQ>A%FCDSRDt~Qv7IMiqQ=9h~SlLWU+6ML_cKUG< zSq>88f{Rtkmot?YbVj1&z(SCU6oPOzuF;{3TdRMXU6Lj>0CrU_B~*gED-(6r&!dJo zpvq)%ChZQu3^OS2_Exr&9;FKrn*gWstrt|J4kPh!$$iNTr~#5TBNCXq!>_ai zLtPxZE{Fo}=2(Bse;x?6hTYp*92g8_5&r-woNaqmqviLgUTA~K@D|01kGR2(W1{fZ z1(TkPxA>#S=cSasuPilWUpLId)$UwKln#H&nI#7I^$ z5|3Uqg^S_W91R&3)prUg-GenByATRSA z6!r@NR9(61Gr8F!MY2ZJ9ThLqt=}H~L^8u3Jo7Hcn#P=8pR?HF+ZywOwcK%^5JXzY zWEnikVpvS4=532^*@uF<+%UJU7pk=+k`4g}NF;Iy6b?h@>o$!$b$Vv8@{I2wlJZCy zT;r6RwNnwm)xAFNsh2}OW<-3j($E;xQh0%n9-!4JKQ8Z8z9n%F5R4)w8kdMT1b{W` z)DyB(4w}ApT`(iZI)B_hWl%f5s1f1Qmm7afa^=phc17pa^K@`yj<(eH65@Q5*qqg# zt=NZec;Ss*M8jHkoIWj*Xx7@Z)QbKVw%FV^1djHguE4CApsWy0gclhOH{26R@_LglI6jCIy$Kw zs-|T)m4?&;s6zpWVNdvcsT=@6IvAn@@Y* zcde>J${wIOlQm8=xpLMu;)X=Hm_x?f%;xTnE#k*gZQx;$29WUOcG@wjgB=pgrAe|v zB2*FpAvTZz0x0$^BxAuO?F6l!ihtRn?cY~3^T^mtq>GjUZOso$UkXF8xxId3>$(E| z$M`pg7QO9jNH&+Y?r7dDW1`DJ%d$8q(o!wTsVG)*EfoMdOAw%2(fa;9tYlOZA;YTnuc}iGS_jdsp3s61zE{b6-~+&E0qLX*!_I&9Il-02&qs3jBXi0R)Qn_v$ zQ(UD0I0yh~KVyPWJlSV(1xJWj^Sf#hyz1j|Ya@V0LKBfxa;M7o(~iy&2BL6yc!&HnhVe7s;fGI=Z{av}zq+L;uTgx9 z6N~5Yq<|)0snTNo~6hUu6-!YW%Rq!v;d+`8i-uiD`n{l@T>4n}|FZQk}s3d^XXi zw{7N5f*O&#LtIb!jX?hJ{{V)V{pInrA0`459HkX`mwIxm;mVG4Lfp77gErzEG2v=) z>^S>yTnV$3!%NCV!b!W$Su)O)kFr^zb4IIe+ww|S#gcN^%DEL}UMirUwy9`#oYKx6 zG@~S>C_r487g(uFaKf$YcZW7OGQ$eKAW(%%kU&B^Zhdu8vF|JFW*6m>y}`kr3S1E1 z#n#GF(Q09vg^0b5aWu&X$fmh63dta`n<{OFIx40I0Ng{Cr5W{GOpVe>BPX9Qjl?ce zEEe`&91zubw|vvHG%#dyng~a6H{yXhsO_r}&W>!y-(0xl8@a9?aJo@zXDZ%U^@OF% zhvlU1nHWrQGU~{JUgepMyx~xnmKcZ>N_Bo+FeyN(lmLV%XlOQw{{SY#=S@2ag5cy zc-eP7scX8IZvG{COTyucR368s<+7XF`NRcxrlAA|wD*m^O*9O1WtHr6!$@)=u^`wC z2o-l}*M4JFmGMN=l#p5oLOCfthYH!gThZUs8csp)NTp+8HRV^U92Xw_DmecDYN5o= z9C3;)ysW%r@m^j|`LG?{@Y8lRrvNvzSSOJZlazLgsn+POUCRP!DA=l$f~iPyT-)^W zZWHF7N2>*hHw%gORSnK)_T4spG*S4<9LjBvF*6u}=MM&?LrZr%2;=q>j}p&I>LHSy_C68xhe zYqI2Veo_&|zz(+gtz2XuROw}y#~0-!a;8uYW#Tfb+l{*`Y>pXvdwOeflZjk=sQIMRYax~J z`L1zfj%undQbPCguKQ0GlToK+rX~XRf{1;Ub+JdL2dC~9zpebEiujd>?2L(Mxipop zc16QKR#pN;$g143F+Yh(zG~I_NvdEX#ZSyjbx0)|4xyGw@|kygq9^e zzRo6C%;>nl?mEW-Ea@O-rKvItf^fIhCV{4gk9-seSKM;FAbh&B?`08=*lHH*$WB zdeV3gj7-%oXt?Ize}~+nt9YZI%lr?&Ve5duPBrwYiF>?-DTFr`fwT=!`ar=_m^?sh zO+khDRk3VuPbRAL3XKN6>t2)(0noQ~I07$$rBu!vY1^$tY2U}7^`&&F2B|@AG$D*X zckzDM&}tvzANusIO8K(!r_*4gbON=aDFuDBA$t9K%Bz$%l`6!-03Gx|y*0#PQ5IWq zvdfhycW|QwItbKvzd%GO+w2r|S9Eq=1IIE4v{jw9`qmPbQ|vWTo~TwaGExc+6OW3K ze5m#SO_L?usA~97sSdeOVb;2}RlVy&Ph1G=X70)UpBUQoz1i4NQ5-zEuNet%rI7J{35UGwNA-aF1L~`mieq*vDm;pR&ZPOL(>s+_g zU@~}E%eXbzawQ2Kt{v5`Pa!P39~npyjz7!rS%sp|E+ib>cJw>Qb`dhaKJ~jepDFvN zrg-SAkwL-K0rJ4>3SqbjxZPHt-Q(O znnz@7TGrbuNX;Q}TQm{O)r`TsJI6R~YTmt$@>=l7R`asTMqE$KXt=l;6w`3kN05+h zlra=hG~5`ZJH;FbZm1Lnl<`lfzttW4cx&L%wVEv(iX(hdI3=?`hg^VlHS0Sc`fsxB zE@axL9bTmV(zS#3fM*fNxSq;czj$|o^4K+lYRcNf^KaiXj*Y*d;#OxFZwuEcwMs_m zx8nSiC7@UlPchjNOsVFia0k$Fqr(alsUr&y|@)bP!tjh)ep&BZOhy^Z_g|ln<3l8-*%KI z9bk;SOQ4ds?uaXcFd=e4-Bz5i5fGNPZit9<-LqR^4kR|yl!_4KFVPZC%|_v+^4*!a zpWKXc`~6kmx@P$scBH+fvSwf^5enT$bwN2l4_dhP*|TSD%-LY&7xyv9jJ>^QeBs{O zE)%z5q+}D9RnU{nO|8Q9>{?0?fSa$7`IL+(uAaI%U}QiRJUo$bI3TP@?`0I7^nr~nCy z9YUVNqC2P5@7w&wLMAarUh<4;mtDk=5O#pLk%+yyNX<6U2B3oHFi7AVi?74g$$A88i@=B5aB8ts49a!ZyEE=UfR7BTJ2`LY1>BjZpbAsXVDotHInS}kAH zI_-Q-fE|wTqR*?gl%jObz zq9>_sK`3JQQ>{nXAFEN40K<<8kLP|uY=p0GKSk?A%ki6_fDdu@Q|as5LBs=PFTH-l0b^o7#n+vnz@&~wim6bz`IpRxJzXllMYVX=DDtCrH;1k z)=s%ooY8eZI{iTcHim|7;YSV+-^xrtpe7Ij%i9X-wQNwHe{fcd`)c;QwmmkK;^7hE zigP=L1aPRoEaE`InHCP%E%{;OilJ@XNL<+FWAVFpYpJ!-BLRF;`C%a3(Vk(-LmUA$ zlN!{*1=H3?lT9NU=DDUf8+H-*_Ejikbh5HX0tk1gDD@AHHDfYv2OQPQZeO$}MX~G$ z(OiwmNj3g9ew<`;_3jLZc9!&tI5p(6qGqqIer1{Q-6;%ERQflJ22`9x2-#B*3jb3Pn^(8 zgl{+K2}^OezqYRRzw5#3b932~mwMSh4o1FYyA-YaRUS0U%DKEs=pBrS;U^*Er7g(x zpq6f$YZgW8bqp&PX8orSn@{v!r&p&Mh#}WW0aSA%bDBu`fGv!V3B(g>bN;EGDMWI+ zPS+BsNCa{O7X#P6t3NV%{hs;%0K*8c?*Qi1HPeQ9S!JaGa@khuHlnIRWK2br%jB4g(Aql54dH@I7~r^B7rn3xsq=1_H+Ac)Ik7*!XhKo%~k*ov>Gnl!(VL!T^`Km z37*wB1L^Cm4credHxJq)4wR*ltpx77W=cI&N@6b2RKlUSM8ZP=d?FosYi?$l7*PPM zMjPW=CVKqvDsuD1aD0KYVwH1|c&6dagM74X-ma(k`FdP(GuZlcN>Yl862ZUbB;pk? zRH-8_$OeU_CDFb5owxGt{!`6b^Y@0q7j#!l03@iRJGp8|~3Y+AZp>M4kkKKQ51|NB6+v`8eU0 zt}%JY-Z?WUAuK}RKl!;^_XEwDp=nU%$LeJFo>+6gwsYNAUFDM z!>2Lbi0Ro(f$l6vIC;&tZw2JM4_?~Y<%_Q{3Lsz*{XPAZ)Ep|?T%~z?>B8Mg_|!g; zH9FJzw3gPV01%T$$EicG02-m%f;1kRebv&kEhC6LF!bY3=D+OC{{YY>{{ZEeSygI> z(xrwpLF=?zBqmWplmo;>1H<|?D;jY)R8A{lRof}u4IamqEfoNFyg@-7-TaR*^q^O$ zjWwIQxD6t6aIGz+gzCZI8h*-xNHdjLM+In-F^^g-(dvpjR7#Ul zgJq5Ph7c(`>z8wbT3qA}0_4~Zt6eyZz1c#S8z;iG4)q4XJS@vsb(0I9%-51PrXIFW zjIA7tfU@P=jh!DKFn;br--OAGQ?_QTmvo4WM=jdAZTYfFhFgX`kFR=Vai02omLy^{Pp2P70}%T(HtFCgHl z&O@8a*c*gE!Uhea)C6nL1UmQBFvwn990)2q6Po+cI@EJ87N><8rpkMiQ#IprY!D)2 z_l7te4YcB7m<>}HH&ELOQ4eJ`b&gfehyqxjRvc=ixd8?v;>7a)-rDrk{9&>EP58HO zt#D(c@BF)C##$V6%u+F#F|I4ToY*+(N?!Tn{qWA|k&BvW@p!eRWMY*`M&}0tV^l;4 zP!FO$jo%--?9fixOLe+4<-J0$g&5=7-w8a&I`Dt2wkGZS^sQ`pv|8XLZO{j_{{S(e zZHdf?YfG4I<*0kS%v4b?_%++Jc-(l+Zp!73*`zn}hP0Vq7cC=YLF2Cn{ReisdyIR5}F)juO;2m{%e zf7ETgEk=Wkeu>LdZgtBj0f)nvc+5n;+WgiLPpDJJNb2|O$mUFc{xeS+J(#!*>?o`J z##_GrsuTOFdMTW=Pmo!71V)t(USUx0Uj^{;Vj)Utqg}ozfS#2dnAu8W&Z%SXbrby%7N_i zhy6(L?OFr-oq9K);x8rh2nf(BJg?&j_x}J%VJF(271A30>@hM+l@Iu5+G&27vxbnz zwRnFqmrnZ4J{tNt7*GEIiTt)o2ST5fTv-7(u%#d1gH&nlrkXb$>;)}<{@EUei*$QI z@Q1X5FZ{^U9yg-};kToiM5PW+WziE2HxDZKs#1k$6)}xw6r~S%&;!Rq^)2yNB%y=; zne-moU#D#DC&a?Mq>sIR(_X9J9*g)pkXVb346*hT7-Kg!?T3(Y&nGy;aiNm! zE2in0$Rlw~%1M4N3oPl?!E(G^7Yqp55~R131fpdCsi)jEaXLw(J~$1c38p!2sTnzh&b6eRBdj4UF>lYIT0l%i8-x38676dMeV-xkbF&I&S5rA zQgkuT9z@2rl0~b}C=*o3D3aR@J5Eucg{SV?`C8^Z;^8a?1YeFdUOk^k%jA;B1qg1v z-IV;#UWC@Ba?Du|F#iByT(Gg(% zdhcJ39HGf>rm@~e#>9xc`60&EknAEdm7y7)WiXz!0ZYo5rWxxI{!mL_~G3rTV+-Z46=^4z_q<4p7!e_5g2m zYk*su<9eqj)4Npi7t5y3ZWY0Vk;f2i(xvEsLMsY40p8d(UN!Q5P}kl-vhqXBhWC^l zcS`kyo3Ns;h*%~tWNR3evPg9!uSp`iNp=gU;LZwfFa;#(j_rQA`jM(H22j%8h)SDr zDlx0f+jP+B-KLH=hCRTWg-{SD1VU;wTk`WH;ypNpZ7y)Qi6I1m81I!_UR8&e<`G?= zDmI{^B?VI{s3j1oKtr%oR!^$FrI$=J5^Ci-5n&m7vJ0=tn<^+&P6Dbk>D{6^eAYnm zGW@_s3CE5;-Zd*_UqVY)CEJ)v++oK)NLeSr_~>!8JoUHAUOx=I(F|+0;J!uu)-%v@ z?G>F$<+@}RBJ9&>LMFH-3GGaj$cJ05)4kHf@#eYtl=HR;h64(@Hr=JvF_B3eo?BX< zgs3HM4mg@*+uxVEA+6nNT(?Fv<_+S7u{9eqj5W{7{x+T_K=F^zlTJ1JsLMSWhH;Nw zHX&Sms);Hoi0v>92Uj-_sCWI*nKvCvrtp@6=egyf-!@$2qT*2jIMsM|J+Dr4X`*u- zm=pn^6v1+)7*^1ncE`7^g>BuEc_DjvFT9g`zP~OATTN$9?VCi3!^2z9wxnF6#GAUE zQYID&ADVt-kt>&KC@GMs0V{(XEz^S5{HLn$t@k<7BZxu(6=mTMS#}}<6xisV%881J z$^qK61kL(2ud|=?Czel$tew~{ouvHPz6Pf@?TEW=hAlwkr*7Rl(_K*k6AI@CTJxKi zSTT&NNh^U{X}!@9@(OO*z3nB6P;GkH7b8Qky6uN15E7ABOpWI=SVMDH=peahWW!m; zSvKukHIRi&M+Y?7%_ETuZnb5xiP&KwSC0^QC49#HPPk1i!R|{;!Nn-zV-Msrh2@Iw z(QGI-nzp9YU3leALVzaPM1qQ~pEn8%X*P~g5C9=-r6h62_RR_Z04E?;AKg3;?=<*b z*bW3$A(?=%kYs5?&(qkI7;x8>nJ8T}Z&o`r6n#-LcV?-xyS(MdixCj6rVO1y!Y7j;e927Vs znox?e$F<%jp9`)yRmf(wL%5GX9-blW>7i398`81W5Gqul?o>)6T5S&{Q&yfKQiti# zBIA`6JrbXw^}AMR9d$}T2I*7;LchB&zgewgo!L`4?HF9sI#TpRo0DWwP}LCJKV&Ih zz7?qIVHj>V>r5^uvz0=b7bC*jHuL+Y`MM!(8)7*#tom}{m1heQ)gl*h#aFMEK^@ye zp-Lii4?qFceQvi)x4?B;>0^gX++6Y+(cV+rg3fK#8(1P7fsuQ!hUfA_<1NdNlu$qr(Jk=)xYZ2 z&c?e-urb=H*l#0&Y)fzx@xQn<9tOQ@>A&>bbYU8;;zsG1LS!B(5kjf?8Or34aRR(e z|>$_cQ@i{lnren4)48F>a|< zOm>NOl%?1Rlmxp#hA@DKutQnwU}jelX9PV4DpLc`rCiNt0D%t@N|D=Ld4*VqI26d6 zaR7j2Odql!AWC&05JIEWdJkPokhRLC;_85RV~-(5SGWM?fF$L{bj>dCi~;ux-uwrBFe!fzEfV}Xo+rMF zEb%nz3xLqU@Tftd%U+>E?g1xJ>DR+TCOyoxhg**FlwFygB?xdu3*F0*q=jBMI*5_G zWY15zA2{Ha^pq0`_U$RopqNML0oBIG16oXvAauRP3xa%VqufK#1#6EI2e=x(o}1b1 z*hi94QTH>lwZ~au1o5rm4=3$;RBf^h#t@d2s9rO(0q07fRW*KoC+S%UOu8&+bm^R;0WwBqSxk| zmQhY@U>LJ1W1}0zwl2~{#xRisOl3@fRm?&N?M%yl6iwm*Q*14J2DQ!r50CBRS9zBF9`Zdr7kO5Kx;n&l)vCCZFkYaiJJ5ve)Sq{5L zr~vqn)*jmQ(j{)=ejRBrH3K9BspHS76j;&%BhY$Kf0u1W3$X(-^WodZq$!-H9_kEV z7~RL)PY$|~sNWsP_)`m5;2KJhy#YUE1}?_65FdSgq5SB^waWB~Fg4>OIx!;;dvI|uel*0uUPYfTU{1aZUDj|vjHM>wczkcRvRH1-?U(lgK- zd%sE^F?p(}p<6l343Gn;DtS$tW?ST_H&1YnmWl)#6oEpJIsgW^EzPWM;V^C)*Svtf z+V8e<=WUReVj7;JYuONEyRP1!&F}qMq|wH-@$I1t89^G;r-0OdR-B!bZGfT3#HA3e zJ>EJLtw+*omx*cgbo%=E>CMVK<(kv=>GtNLh7QN zm&Gfx2mtggdQ<7}(xin4I?Tc*3J6d>ss~LXM=AjZG+$uUE8E0>q;zq)7owvBO3^}6 zNydoyuAwR()3#g#>m6U(iEgwlye6{uK)OvBM)g*1G1jiWhyON%KE-~a71!%3|zPYQ6H}0 ztQfX!bCukk(SdFifiw#TksS~hk;jf+s0AxH9GG^gnVF7aqS}2VOd6m z0yht<7Z4ffwO!zL8OHe8Q5V06m6+ z1Jpf&6#*#t4^SOe!n6P`v8N)7(5?Ov_?8m=e=fP}Uf>ihG>-~$T{u(;n0W?(={wI`Z?=|9XfAySxb2^3Nb%2WofODX1 zjg$~FuK_yjGpIWalHOWppwx$ua&Yl79vbk!sDIa2$)8R1&X~6lCYcGs#j%2&nThJ! z_1&NSBWnXS8~&gb7#23a|a z-}k*cs`&*;Ze$}KNyu{NNe|Ri?b2_%aDu|H97dp3OaLHJ=}-dgtpnORvlBdKXB(m+ z^iN$tJjSpL&AuGT?Z0&pf4KrAbCkP;1A2*)rraPD0}wz&!fJ^14uPu>5L7UXrry6! z`ho9pa0rARc>D)_C4!z>W&ssKq%aT)P$?>)fQePyTAZd1-~a=w1d>BQ1Pfmt(3JAR znVxXtarTN&dMh9WDM~_$;9b5@6=4bqc8N+f5&a#~OcY51thB?UU7)$3kx~*1Cl3_f#3L;?sEw#+m=HaII39cQ=I{GK+ zz2Ehno*i?FY8pJbNAI)*Ki+B;<9hI|`)vIec$;qlAb;~><(22e(b11l*hOiX`JiQm z&!|>EVkX=Xd{@UvPzUUb%j+jdhz)(EbOWzX*kldUxDph<1INNE&Udgzv>rJJ$J60j z;2mCq03%Mm+W!DQU2Yfnu~yo|Ub036h08<^pj1P*k6+ba5FH{4+U+#o0}coXUjDxd z#-UIU?@xULzrU`Y3!2+teV&}?IjwPNXz@1-l=Td2ATW(6Awch1k6LyR4&C%r3v=}B zrsXn_;qn37eyD!h?xq?DeID+eyA4D%=7h06o~n(-?*Yh!dkDh|ySz}u0S@97`uf+z zJ^D%uNf>>U=C#0(NKg}qRpX7XzyzU)aRYSiK<(0={{ViS<}_o=&?PX&;V*J<(bzWHYucY7Q^EuDyMaK|SqEjb3nu$Y@ zN;`kG`^7}Yf&ox56afM3AT`$mxu@z=58wX)>1}r#NnO4&?jZZkduC0vpodTj{d%op z6ysO>E1y9_-TfK{_M$#D&D8b>^$+vtT_}@e;an-iI)DJwJO2Pze)<7uaY`^l7<++3 z^jGQXG|}TofSgvkFo=&@Q@)%4^mNcCg%mhY165DwCq2kzoV{^y&k+O56rl>6D3-*&{FLPx-Xh6 z-9R6N^f^ari7HAci-b=@rgDfFh5!&6hN@~IYuRfNQnBTwN4B&s{J{R7m$k_|YG>#u zmy&sQ%#AgHe;te_#IoKziX*ujS0K8WZbG0-^43UA86ernf{)P@mO#Tprdj0N#-~dh zdZ!Vshr-fD-ok9Bn>yJIsu?uKCzr+YI_IGrKm4mI_A z^k(%Qf%OyOJ+Xg2aU91rW1x@6+2Yq=R9dFW?qtNDhF!6d#5G#mSL|9JI@k&xS`JF( zv43%=7UXe=kV9}h#}8HqsOwTiD04Hlc@fC+_>PtAftCS5Gj8fr?+*QbUz-}O zUb9`TlUuBn^6Ffqx$Z7;=ZgArueY@NZ9bn&-9C}6jwWzp16VDBARX!7QLEo7Q54WAzF^_74pmA(5igdYhR_Y+Q7><+SEAHC@cEdOLDRdRBgUd2vEee{y}#K> zE*=@iR8x7^8q>dFCNwVX`qKWFO^D=X`48ztecru zWJ%8Yn8j4bF?JT7VZ&j7#5pVNr_-%1I2pj1S{H(2%Hrd?qIf}_pb^gw{{TgzjNPd5 zl5WK@NP;3!AeyvZwA?{BfSEFvu!g5}ZEU5k`H07#_S8TV9%lp#!vWNMYcH5k?81od zIZR78=UgMw@+_Ve|4y`NgV2^V;5?J zx~4IU@QC%?nDq*YgelURmpHPLa6#}j7FQK6zj`6#$X=J38Oc&uswMzaBw~q>F$|$c zsGQX(d4M6)w@PZZrL1$TQQ+}Z=s9+BtFb-Mu^ItiRr!vciAZDBRd)GiCt$UYGh+X4UcLcz28Co)s%!HnK|E z1eP$S-L^xBQFpc^kvzj~NbXiq%u0soxj6#XyF*@q^d{x`J=E}1Z>~1SYWC07;R~tJyE#l<5wwl|=tpDtaIXfxGUU*{^*VaerrQQ8DW3HYZoZM&4qX{vn7sQCcGu6_*=g4+Q20U-*uJaRfFPiV2!MxQ&?DpY z>tr9o+&S?byek=pW_SG%dp#YAx?YyxI>+ z(x0#2rY%SiT`fWpZoTS0{Wv*oNv#I-aEgG_ul0Mh;7NCNMp^|5n3xo1t!N0!Mk;Cm zb)(csCH7Ev{Z!QYHxaCi{`FSYq0&90_7B@uauh!0FsE=2paz~g?OHu)T!Qvfm{a(A z(x3rft3)9SMNeR)hsc47YK1_5MJeC(hKsH#15~Gym{J2MT5~Zn(TF@FmaCGgAVZtt zAe02Via!xYs1LVP=Yg`e;N~28)U9?>xQ-&eV}7r^4VU5udy~0fqE>H>FX=ZjX2qf;F~na7e(QZlnG8du9w;<8@tlVECYFs7;%0}`O+6c{1(gyit7^C6Oq_Z2?d8{%X<+T)1Qux20dQ16 zHwM#Ifk6>12WSS~^zIec=C_ox5U2wBEq%z@50nD|Iglv8`*0iy6xDi~Y?-(NA9>t~ zPEwS`5G@C(6c5;_g-6?6P9EuGYW%I^@f8^Xo&pe@FyYRb&lDBK6B$5E00;#k%RvQB zKmpt!6)}Is`Uh8Ik0VP_L0ma6znuvlGXm4%1$y^mZ$U{<8>WDfBcx)TLx=wWcteRp zX@seez%?4yh8j>cJYx9`D6BS?i%Qc$Sv^FV|TI0WKk#6UXi01z-3sttSB zSC=$p%aw4o$A6%xJjSV3{{S=CQ;6cc?r8ceDhq%j8_Tq(^8f~kn4?2(Fo^UpjXHPJ z3~e!&IFPpc5j_Plq`Fr>DQWNcd}#VID}hZ7v)WXc8;0ErU-?@IIlr%gcZ zKbaO{rJ$!Z9-XyjH{7wMp}-T@wN*Q@q@fa?o0^%?)f1cqRuZ11F!`QN!vcPA6x)gh z=sg3ceNI7)sBvQ(!o-!qR^V``nIl}HK&1P*^z_D-g#)IV8&cdV9I1e)WjatQnGLw2 zP&n@G*P!aYcIJ6fGJ|gWryphM?nbx<09OL1kF(cC%Hi}fjis4BS%lPT?WCezu`%1d zV)2Tla?!yY7M@Fl9VAr5MJHnULAz91`w9MNVQ!Ul}x{jBPSnm zvHLri%#?r>L`Pp;eIdI;z3mLvGV_vifq;0k!0jV4CJq(yztx*eyB_y8-tbH zPl%EQ%``N%5S34FZyL-9Vd?|)Q>A{MgY3|04RJs&m-tX~GnH?Igt$2N+YXhM(+_$F z*V?t}K0R~?CCAg#g*+FR5TFF_@B6E=6hHtv2>XAcwba>eel-$1%K#O3FrJ@qrDp2+ zU;rc9fnO2v@b-p`Z&l1t`zSj$VBp|W+1Q+WZC^(Z%c!`k=}m>e2B4Nk&WQeulPIVD zw_Gmj6LFLRz9E0^w!3YduH6|Qz5em9ayN*0^wkQ|t_l7B0L$H>NFD;a1BEGHb$^#$ znk!2b6ei&Suh;!rDcep23hT`t)cW)Z=R^{qS6*p@`Tqcyzd#-|Q1HfrI-(s!ef`Jl z4K%;HoD~<11P;KX^>};yd-l_Fp`sc{!v61VDYjS)H5zsI`1oo@xoM6FFNG)(!IJ`Q zF7PVIC?Q_pn(3)e5C8!#tZAK>QyJhMJ@r#l8FUXAcu%^mR1d_0VgcbwkB@~z>DP49 zy|u=tJZaEEj?mm5@vpP!_vzqTkvC3sU3B+!?gsw7CntRxWllvA(n=F(4M1uX@TP$P zlsM59;diQ+0&PxH;hVdrw=H0@*IU%ilI zkJvm?uiJ=uX%M=;Lt7}22N>Ort{etE{{Gs|X_3uz1OYG>>ctlBR9;658udl;sj*PN z(1M=B88Vl6pM6eXGKMe-L<>P5X1_DsJja(xNot$|4#cm#BapHnPtBIV`g-Xx!mPlb zeAK>az~Ty2phBB(P!HP>19k6F(_(YW(WK>3Yu~&35~Y=~WhKs65y!6#J=EBCf)0>u z-69a{dA?z3Pu>6+YC}{uR)Qh}Pzq~685=XDkbf-MeLm`X~p@g;U1N3V2ayCmfOGkvEziInw7d7mcHx%Q7d#M$| zs4C>*y2l-&0Cmbzrrb}kdVq}tOltS-(^9fB*5(-91|$!&wxfK&sZ|2j7g(~f#OhWAqr|Dk3>!(FAZfK-oC2+awrEsQ}F~mGLhLPFFfa5{8Ok=9(3 zl>r(_T#+KYZeZh!b=G9nW%IT?Xzd5qV<*p?HE7V;ZyGz2i2+qq&^(h^@i~KF2zvMW zTfMh!++DZK9zXM+P9`m<2e^VYPek)!f`d;EOiQO=zfb=Q# zVjuvA4sO#_d@r0&-`*d`bpZOcWN!Kg6?4jV8jZVFv8n`4#c@xK4o^bwRzn9~8{PHo z()h(A)7#Sfrkvf|Z_1g@VbG6VsGYA|;dqZu>ImM3KCB?2k}nPKH54IApn_MHD>xLV z?ePWmv`y^*8i$Ug{aZu;%_WzBICVimn|`_WF}OGz_WJ9f^fC2kuU;75^siAHzZZCW zzm7*y{;i<`(qqxqrv90@=l+??#Pjs+tcTFY)sTPrFurI#zwd4@0Q%{C^bH}p=o|99 zuQWdHzu8Fbn$V-lab8yYDi-mGFF{{Vw4Ys-tw zZzbIYy`$}|=)E7ft&_N0z-&W;Gcs{)GHiUc`FdS&u<}jjT3b&qyQSpgTWv{ZW;+QN z@iE6lu9R+Lw+99}6FJIIIk|0ip}L(@=3quRgzf+>bz5XI>GUjyVf?_P_m!_sMD_ar z0HeOD^sCroUDloZey?EZ0ZQi8mhWW;`TmV1=S33?Yril<=+O?KIdHDUPMtb<{{Szm zK$XIro~pxt*Y*DZN71GeQZ>f{ER?{>(6?>XU|x3Ji+i}nx19B}F%xR!Ca{sWE2|!T z^Cg?b-3{&OpZ84Ku+ENE!LynqsFP`gD_ub8GCi+*b1|+2wMbFPMZ)x_7CK1W803-7 zC{c2r1rH<6yo4SKda0P8QT3m@NT3#gsW^Rz$K$8MaUrg18~}RIdJm4TjoWN4L7*4^ z0IKh@vrgN)p#K0ofA-t<*Rz&`S$Laj-;20s6uIZ)V4@@EE>$Di#2(|BWggwMoblpV zkI2QEW%5UIEs^`A1xw^ShV zKO5WTR`IZ!J2lACJ+|eiY~;mPuaYrSF6G_B8+(@B1bnenfz(PG&w;Mf&gfnJH{5c~ z_x9G7?W&7kqmD-sHF5Y!wc1MiIB^PkR+Wuis8&*K!9fD3*&r}uK90%V@Yh+4{ zA$%v()m+|R=4S@$$aX6Fa;@A==6tKYzbmt0>*V~d-`%bAOy#e8%mirr#pH#=mRs_kBOJ+g3EmpNAY5+0)}ywMwm3 z;qxMQr7?qbPyX5a^Vj8ky}z|zDxEya`#gJe)|gDKT$p|}Uryc?UQBrWJ+#Ah`+?uL_k&NE zr;|;^r;+6K-R!Sgch;0i=6HW(e5;%L%kAM*LL;+ay;B~S_0rQiZ!I?0<;(Ufx|II_ zquuv({{S1twbgh0rE$!0$JuW|PikgnD2JMTsm`;K-$1XKN(X-@%%;KndpyCe*PZ{9eVt^KYd>@8hJZ+{gLfoyYl_D@z9Ac^5Ml()7ewa^Oamj z&Dp^?d{%)iXf@yVdVP=be|NK`Yxb+tP8?A>rXB0-PBjr<4`IjQ)3=Rc=D&xjU6lL3 z-fi;hxSwZl$G_R(-`$}Kd7N?Jsp;vBOX5(NA;A~F?&F1G-?Mt{rqs6iU$~~<4Zjzc z?cLV3)Q;ljreZhqJpa{d{Uf!yb3`<%xb@_^0N7wHq_Y{s#FU<8PV% zC5`ewhW`K){{VD;Gv-s}zGwYc%>DPlyIOlTZ`AbJJjL^)Oo^Z7A1-Sz@msp6?w|gy zeBNGP%gOWq08KI1sV){m+f~CXTP?ZK3a1z<6RHeu9(ymMuK2^W&e#vRKeLDwg_5C{ZM*KZHtA(dW?Rb5W`aAgeY2&*eM5b_{ zR`L5kRcqM2yep@0ri?gJV~)Yw$L&_VgV~^dT6e3{($v(JrtKZ*Q@?o|H(Yxxhp@+;n+9_>|^5}2>1Jbo1S{{T+- zA;%AA3i(MNf8ih6_<#KG`vkA?Q*ZwOynhFL*VRw`-%|LqabE9dUyV_} Mk^SDDo}BCd*$(rtZ2$lO literal 0 HcmV?d00001 diff --git a/tmerclub-auth/src/main/resources/captcha/original/6.png b/tmerclub-auth/src/main/resources/captcha/original/6.png new file mode 100644 index 0000000000000000000000000000000000000000..1e04492979a234b9d1999634e8d671b2fcf827e6 GIT binary patch literal 59340 zcma&MWl$VU&@H^U1YIOSgTtZ;?oMDAUtALi4ht+!2pXKAS=`+n7AFLE2o8&DAS^B+ zgycSNy$p9HPff2t9$-T)#?7X@^2eJ26+R11Hixp0BrsnfPbd|a%J!L&i()l z05;%%jDUY<01^coH)~sfP2YbOjDILVH~{1S9hm<=u>LRpzw4M782_>V&HqdMzi$5Z z0m$(I*%+c&7~}vHp%x`Cs4vh5A3h$HB!TAjE!#g^BTBO8-m#FZ17u zhlP!Ui%;+$MFzmY!otMXRC8*tO@<;dC4x zvJ0)(?Q>)U5?sUqA3yq9$a(vSJsYD66ywZoX;>Hl&6eviM=DyV4`xLHp^DYh#bG1P zXRX3wBR)afaObQu61-1iP}wS((p(fb^<)Y?pdgl&uK zo^N{dB6o1Z3st~aM(KE_vDJ)Qov}`{dsRuCYIqtCL;NX=zCC8WPC133%=wB5BLts| zz597FizN+03{=L^R>v^)eW9(rzyTN||AU)zB2>)JEv-Hs0`p4MLbiO!Rkv6CNHrKx zbl-p$gV}e?^^}IpcR?z(Om)U#XexGZ@P6lS^WA6WO6EQgVX)8lUc;dhFQuaW z<0t8>xM<g*~q&Qn=!i7y_U-^IkTw2e*lF&e~;7|qyWE}ZKYzy<^hk6 zUdGNo{ye8vY3-tjg)Is0q8r43H!jO2E)^|i%>$7)BSq}sLfm(@eEGi!eqB5}#a(jq z@_lU}CfEHSTzN$znL~&nbb)iM)yl7m{+4R0L zlxcloV*Y2q-A$)4+uS%6elp|DCw_s?cC2KR;y4kXyDnv6;Za$$u=Z)uH9X-RL28wG zQj+!}&48W7F_#0kfQX8a6?RF`6~e1P-s#lD4r5uJlTX^*B^I2lk7y9TrMsko0 znFV$jRW{DvBvgffbzn~O4E&+i$` zKzXak;O=LlQXV1Mso9=|l2&bFPI2zhm}!Ju1;A?(+PS=v#6;?ZYoEJ=_A~uE7&4@) zGd(3Kc{E2mL@iU6Y{u1>x_84`r0qk*$7TopF=d|Q{#P`^wo*^$kd z=J#10;0bLYvnIQIq9)l#@#N~3IT$ygW}+KY+ndluoky)4eQhDR1?C={e&ipc4t@#& zxmb)TzQpi=LJyw+Y9D8@XQ>J6Yj;V5QT+AFavGjhUdVZmKxVC%uXwZ>Ir)g%!-T1D z)M!3;cklA|+<^M$<|AK8x<(GaGvRGJ8+!iCVw9_X(~P6%Me4N(U+FuZeCl$f<|m(0 zzPFB_%HEPeQwsN?$|`N0t^vMuPW`&l(KxcZL@Iu7sM>kPi>!V{>Pa54nD{B%?FRPK zDS^1z(N^jN2apKAJetieDVNnpk7D@BIn@ow3P*v2OZvMs#mTK&p0c9P-|c!2%d8f2 z*r{~6Mr@KW7YW<`M38; zz6@~~hmoT9a7mVYIa|7tT_WSW$0^3!OPKjO%T9JJ=;!JU)I@d%R39QsJ1orFmgmJc z6c>OP8iU)xo~KX4!vk?s__+4{>;!&!>)u0#}ey9^Hj44 z$_1i#PO@4JwjVzj43@vJrV1>guyTY;C*a*F9d2!y?j=o~ZE*`mv9ux$6XgVXrt?WC zq)a3JIOb|R&=Y->YO2c_Z;hhh7tBb{i1`Y8j2x=JfAlikA5l*+C&pNWJU1Z2E112m zABf#NTwMgWNNaK7a}MC=H@KeA#>J_@lqyPzI9bnLD+dSmluPZbYddxM+QKWHzV1V9 zEHWIeobQN5$FrY7z|5^ZB`^CJalWQ!d+-NL*Si|Le0rT}sPA#y&=C@x2?fBDV;KJd z-c}+1t~wpVhOZ63sA|X^E;wpc2ICJVN0Y;4I?*^^9PValhtRsT2^&rG)SRUtmkQ*# zQau^oMT8vI&O|P#zaYj@g8U`o3sYfu(ES^Mo)Nw;l!URyT)O`N{i=zH zlJKa24HwG$i(do!{{SwI3=u|4t?UwrVUX;pUy9gPk44s6HG~RoC>^tE@t23GqljLm zk(yPD4NHj|P5}5-%KZz@`rx)oMR)B>2l=MiKvtgKC;CN%;9@cCV@xE&?v~?RN^CG43JN(NHm{9PuT9B*6)3i4jUM(bEoB)UC?lRVjDRGJ$0Ci-R5B(w8Fa$gms}S{*`!zCVD% z^t${N#o(|VbAMWg=;yK6o7uy2Uu7DtN@{alF@teWmkn2LsHyfpfF~JE{oy%HC7ABK zcjqNTv76qBw5r8=6ev8gPV{%$vP-alm9dy#=gyd^-;@2{Q*(M)bBEH}&(Gz2&=2>1 zr?P##yrg9Vfic`r6)xR5M|HW23;nvDTi+q74mLu=f$%&WCzxY;MouZ9OC(&+$LF#` zZPBX|9){fmw(3mNClw?@H2JF|v@AA#l{ka$1DMm+Qw5$i)mbDA5vX%WHD;P-rV1mq zLTo|OiG3szZEISquUkd^>e`u}m6};O=dUVIKtBHcetDHpeE+F^_qy4yHr+4+N%04a2>tceb3w_MI3KN#cA8J)xN}w2n>G?T zpEVm1p73>X0uQ!}c$#zmt+yVPFL+UeYwc!@;45~E%jbtOZt=;lPQ8U^eazTEByW7; z09R}}7YE2i_u7Z?9Id7zk~h|h_P;y)A{tQqyY-W$U z5~$zPtxu%ZEiyt6+7it+`rqL5x1 z+XPv-#naAVwt*1*^(m8eCQhnXWdi|{Tr>M$%;V#p{nGqsHL#elp z4hd+k`1NZEnr&O`yg68a&yLN)nJA#O(u3i3;rp!67c?)4;88{>voj(179FEfl&ef= zHKT3#Cfll8L$TC?x?qv)zWq3cWWSkzE7rkyaXJRKv<7?-s8TczaFO{0 z%%QAJ|E{<@z)HP^k~nu!MtN7H*oZu*eC8<`UU$@9->hHk;Q*M+QCI&5&<)BuhTsW( zTkJB>g;)$6EQ7fH)DB|$v3|DerIhscZb=7eX>HVj6Z&l>_kHv&6wR5v zA?oqG5f}F!Ft;zw+}$;}bD1d`DIXJba>IUUF1*qcp#Tw$WW;j(J?O7Ca_xHm<&~nc zMPCe++fo*7wp)iV#6TxdpI$$hw^bjpu~B2|qzztst}pn=&i$nGHK6wJtK0XVc%|0_ zghzawq>f3Subw_X8l|p(^;u@P>sC?zqvy!Rf=Z0R;BRGR@>UoFW-FeMDu4;F{T!v8 zr6K}czgl$X%N@^Bfz|wga&@~OdjZNA+{a(^Jd4*T-(kNlswyGE`x7}6iDTo3fAc&! ze2sr;CHahO0GRQ4g2je~&YhBpjfx{nU&7CGkJr5N_$T*z<@^aWCSwLQEv(sFSC*Gc z%(b8C7x2|a*+g`5%Mg{X+&+|%LJ|(HCM5-8NYDBOyIDwa)6S&hKSFmmG`?U_zi$bs z*wQU~?XO4OSx6X(+*BN+q-3`A-Y&IjU(>>Pk;|Q0E{?C# zv$D^KVG8o4mlr@f)nT{H>PQsxtF{}-0*INe{6gV@rBLwU^B`8ZIp_{uQh}lwwtmNF zPlRjZPNs_vTCzwB_2mg6sP+2?SXCPhY9EsOxUn>GCeY4%?P)h{dRd`oy9&oYtGOxK zLylNDMxhkrfn8zW{JpMpe!0F0~|@cX;@=TZSW=BS~qk;&>+o9Mz?c2Bfs4BmzrS-XKLk2={Fr z_9PrZ{4llpI>RF}9BXED?km=}Pj0i5C4POo4@M%dJ-PL|?afuhqFzDXIEc z_SeM`{K{#!9t5T%(O2}?azdzC==XV-4>-SgJBqM#ZJnWJqsos)Zn>xZF)&h1DD$Zi<+N{TQPQ`Yy&`8dd5V z7&&;6b15Bok?0{+FxLD`g$wr{E=k5I!S+Wzok=FS=uaHZz-0hVC+{3`z?!|aQXQJ( zf9#5l484S|zojKi_qUWIH@i6@D24WLNnl80V{_l38|F$olf_C|YP_j}kvI%TeQmOQ z9Uh{?fvI{~+_KX*5zPFtwCn;b5qNPI>&vmf1s5@Fs|HfiDE0mUe0aPbgT_>i>JAn? z()>B}es426`?hW2BPyg)kyS}^=FCRw*vX&>HXvcYKG0D+W*2jTVawvPUA+^vz3quQ-&WUHS=(pWOsx3-;6cLe@Zt!vw{$%5%Z$CwE2r3GUMId2HQE>selWT2ePFdC+rOe-0 zFo%U=O}jjOkVdgl6$nO!yjsrJ9jvLVh}yL@bVvDD{U3jGMO;$Y&0&ObS=+RVh?(_ zexUCqqa4$fpi!$(C`W3+CtigNL5e*t7XEB>hhJ@jDd*bz4L0VI)^olyM`1OB)5H`vVQ>Aay~(`3iI|4+PsC$c4u|4+66IRr}y%?{AKD8 zNsL2Hy%{ymouSl?T38K58JxDAVB%&-Q)>J`u{YP5AKS)`Q^5B$=IhHdJ%S!C;hSL^ zUo|#wOlKW@T7A`czv!yfds=vHVI{ekYER9r`t0sa$ITItUUOoQ^V<3+-Cn7)+M)J# z)g>7^ZFlSzS*a2lcTl+>IA6Iq?tV4dL}#)_x2b5`(7t3WWGB9D3{rgGRPI!4sgzD5 z^>s;AF}ngvQlLs&N19vTj=UAj#)f>{W3eb++xI2k&~|^CSl1~>6O7sJw40|x^&?Ch zM@r;L-$1K!foIN$?Q#}OZM>}s+4;YVtE6XmdS!LnXW^Oe=ik_mR^+>f)Cbk8t)srh zVLq2M3y@sE_y_RYZ~1)iDpU^h<2&SLZn}@Uz!q;cw-Az89k#Y<8~ zQJ?t@C_z!3`IglhS_=6im=<$?Ni_=;ReGYT^feN7v8fV6_ed|^+yT421kv6{0 zVUv15wvo{kT*npQhk+JuJv%(QcPCqVQBhUp-JxD8x@(`7HtTMc|St~q|Cs&Qdq*~ub&6l z$T>0b;WNDNh_N{L=GP}UDpZafmIj6pIh;?jR&AKweM0&a{{xh)t;&Ba-%$fDyc(_5 z!|Iy}cXIS&Z`hsOtqvu3DO+#<+-|I@i+FLOI2!@&MTRQ8#2S>_b)}2il}ueA(UujO z=F9(7DEhYVro5oc3-Z?PEs1$}DUHH9dOI;<t4XVuq zxZ39Ih~+zNY~fm>j)fZj9(i0#-90HEWcy7q1|qNUfni2SWk)u$i=?J7b3UQu!N`#m z&r1&8EX`#_Fx-kGGM`NP;~(+3w(p2)42g*?3X$^@+H?@XAXUd>TiiS9AItQ4huK~d z_i8>4)0N!bTI;SPxJ6BfHUkFd@{oOT4&z#qcI9EVP_%A}D*ZH>boaW>IA!Zgwfy#= zQHDloPUp6HPuMC4ALd5j=e~)^}LgMHGJ{D*4+Dl-6*O z`f|h2y}F@;w~izWzcdSfC-W;GpkX`mJ|MdJZeXKM0%2J!gYT@6(4;cA)^*VpHEtKOW7QH|Hd*3D=Df-YeG-eVMbhdN4 z;%3-tR<_2k!Q>4ytrot6kE8taXku^JrR07Bwa!pD*+vAb?PBO?4zTBrW8|5m zPj*T8{Q^iX4k~5x7U3dH)r-oeXl)7b`6ZAx-ih4$(Y~g4%*6hUT_Z;ykW*$Y=6)tH zom&*m$Q2b+yS_agQ*cz zj31Zk%pFiuSDjNRA3h^d$IVt0uz3N@SLR z+#_edMt*UAlI&w}QCLz@YM}zSg7x!PlXY|`ywt8KLR;@vU;c!tM1zJ*pCd^j1My4Y z;qTgcU~j)Oza~4%IR=Mcw4o&l&d56Y`C?L~XvBy9ker1+l1;EBg4v~=n)1tbfx;iZ zY{is4M{mY51P3XmG?6@67{vZ3O@izXNc$$AsQuov@VlM%llkw@+{<;bJ(>InAAY&t zW_xSChZsmw7T^j-Y8mLwbtavJnEwNqGx_q+bZri~`hVW`rntLjn%#X~ZER7d2!^C+ z3u*(V_P|%m>zq?sh;!#M?wSM9_y&LgzIXaLxEZbH zvESAD&9?JRSg!lbT-x^&T{bI0yc6=yw+%DzN06J-E{%0?x=*=wIy*LEV^^8XM+{jr z7UXZe$}6aqs^A8H#Yi#oPE3!{KGi|91@7dEiQTN6jE4Lb*SB9-cb-qLte^0Uc%zCs zaJbv0^;d+lUNENV?FfeyNn|t;@2rY72^ShY8cac=>etNC0^O9;bxu(IZ-iO}I3Gzd zrJPChQc^j^c@`^ULx@ISlbEMUuJ)3Z^UUSDu*z*vo90s8L;z-L4*09>ATGv zqqQxaqcuf@ASU@C`AhDhLuT3*&M4&EWcPI_i={;VyD-%=x?Ug4(E$Eb+%fiy4%pTD zFiq5u;#|~b_qqw+cpe!^X&Hr#Dk6C2kKZ>#$g@QMfF^n$yWFFNy(l1AKhaD#AbD5W z5pn=^i7#dYU=f9vz@ei_Si^o9*K228A|JH2w)phLq(6ye@g+4lTIGJ0?{hqIqq%C0){ym#3xyC}9&vdTJ{lda`b**j0ck(;4!wy$m1 z-9(Rh5Z{`=+1~cJnPH5)YzNA8Csg&y_hDb*wrn-CBqz6> zQ&1WM6U4?h z-#pi2sz__Ra92~(i$_8+K(zNNu*9|O=Vao?uVz;Prz<|U0q&{2`+0GrOniigYDHC~ zSg=Q%;+BP2FOp9sJ0*y{LC^aGTAIhQm2N$xDQ``V;EM#0qa9lM)0tQ6Q)?r2HQLeh zHEStJ=tC1YljOFHC>`a3QHg%+RXuH2^8zngc76VBy|(m8)us#^g&;oM2)IKOh5nWL<7Z^O zOY3aJkY70@0-x6Z_)kaBM=E5x*In^S*caPGZ7l)Eo!&2S<9RS)?3;UtgIwBl<&**;C#X9 zQ}pyz)S6ypM{`*RQw*-l>!jRWH;McG?w& zVz4)N4>32*VTZ^%>q@J$Q;JT&*b|mWcWzwROLAJtFS#ZNDkd|$-z<7tzzhygp{`W* zmCJw;tr}qX3VK(sUu z*Zk?b@=M>`ws_|zv>{z=r^%Rax?t#M8P`PRN}r>+l)7uL;)SFsq~J;L9=+lH(oOqW zCq!%UJJ8v+HNLGv%h87GIrst}m*F%%&Ti#7;n}JFu?hom$6}2dz#J2nEYM;I{WAHY zt8Q2-5b07kwWmYG@uHo78E5$As#-eC`gi9Co@N2hN)94|%Y-hJ3|CsAZ zTmk3ZpMHv?-$b_6Xk8Tj^jW~sr?mZ7Mjoi3Eq*M{tQg{S*uC_jdNnl{Kf65geEz>; zrqY-*_-Z%T%s4J$1GP8o^QdHnRK+orjB%p>O$;m?b5bRLo*niKzjO@&Ca9`=YgweI zLK)BN;PMaf7$r|guM_cEA%1@yIXnZ8?XR6nwa-Z-3!5meBz9875k9^ZmhkfM-ui0Yl5Dg^7`Wkd?X`7XWs_-@%_1Gi8^L+;v(_R)n})nAUo&_4_J zpe7U@?%-*Ep8%Pi*XK~y7$NSuuBr&}NQ9Qu+mqdr}OV-{<+A$1=m` z2WNXE9?M}?DeUi8J~402`d7G7YIl}Owm9W7Go}U~l(@^EMt-AXwSHD>%I;ey5BGdg z*d&W)Jco80>`?OGx?u!vIH2@-ayw&e**=BkjoFWA+n?+m!n3*v8j>>LrA=NM0x?8CzCUZ1s5+Z5Ti2(>UfOPmPw>exU&NKue=|BY) zdR1NhLfm{tA}No}aed%#yHB8P65|P0CXb9^z0jcTDzB0o1NNAmnd6-2|0y4N>n>e# zVXQ29^8^MxQE};bK!ga#F7kJ}#F%MFH81uL#jhLMfW*n^hX+$pq-{@7TcFm2goo_M z4ha56E(!v7UKfeU`b(*u50q1F6589`e6()=2UzDots^&-qww(GyoY_eI!;nFu?t9M z3uO1FJHTcJCtclu2ChZJzwGo${Y_s)-M!ou301Rze%N_2hAUr?+*d=8)5t=sb+3?+ zs`Xt>y|&3Sk2%S1#%#&)E|G zr`4P{J~rjmjTkw0kreU$SV|?A1CI$ENn_)-d9&nqyh7v8p%rhE_l7Lx-vecLqTcuW z{Pdo%`<6^qQfdSuRG-A7gd$4G4e{MU1M-O2JOS$5N4Rz2+vDR!MX;nWB1tZj!}B_4 z$MmVx4Ic7ghWP?}`4#*U47^vo&4-uQ+h5g)i69n-_hbirB5d+ukv}yxti8nOVi%&% zYN~_=D-3(H^04VfT-|ENygqa$=}Gpl6FPz(n>NMSO=A{!3j)LVkSASyo%2^b{8;l$ zUlJ-m4>sjI52)XNJ@<$(bqN)RVVh{Gv{jsm#^|4G6&h{ysrx!0}FRh+T@Y;PA^!B{X3=3J#s8eQ2H1`Vob2;y>y~7&J z>;7d9F=-YU$VsCu;Ww-i-2PMctIF0?@j#iTDcp>I!(8CP%85C`lG6ek3|*IJHLLvG zPxeJiK0lGVew;ll)5|Ek5wIL(YWFdlfQQMyO7DtX<-B*d(y23{Z{fES*pq}iFULa= zi=Sdza0exek>s1c#Yhomn(3n@*7k+P++H}ua3bBr)gfW8&w%+=F|#XeR)pjByhD?o zYr=sXyhf(HxIvvXVxY& z(}kKK@B%@HtgXu$LLS3fn(!Tyw|9D0UC&U`gn74Wd^Yl<()X2h<19##85@r+MN zGmH3gg{x!6^ocyfoGe0cv*>!9?HJ%*TbJwvg_bztdI;@z{P&r~P=400lUEc;RVHv+ z=r{nW`47gYO}*7zqs6kc`J@Yp)f)*L-YUUS`rHspg}!DXNRFKThTe~#-FQ^CpKas4 zvsYQ$H#l)Cr!lZCeIRxX3Fc>iEbdHh>6cjJ_12N__g3yVxej*WYD0PIy4VGJsL409pC0`o&X~qM7gw6Tf0g@V2!5 z)&%wB!!plfs3#corYw`qu9cv(Bj=_hJdx@J$k*PTJ2ES8NI7_+Q*jCVkc_m%3NiY- z;dB3;dbjUq^$xz7wE%Ufz<=faisk4FlzdV~x`eZ<Ngs{^m~k=QJ@+AOsiVrJDCW1+ZDh8HP&!I|Uw z4}c78`PAISkSG@XitoAezE6GneQD<)hiSIEB7+lm?nh*JG`fPBDW9M3X}BF_6r{C| zI>tvKTL^uCIoQdeMp+4Lm*IC*#6xkIZqE;>-k#yrJxEh_E56=N4q+s_?FF~4@5xp@!pJj7$5}~ zPl_fqBmA!`s49=Xc`UwfvB;vlH#Pl`riRFYaX+zeJ%2VezS%0JqI3Q1WoMC0(>N~u zTL+qnYcnko2Oz7QPhRvlU4(*FK~Z@LkAgNwHum)n!|H0#EXsw-EP6JG0XjhFSq(W^ z(b1s*5*X(Ef{>#Er_a~}Px5A~!k3_(KNOUvO23r_)u?6k!%Zx%eR9hwPv@beL?XKfE1aE#X)^aNzUscK_z8J9fecn!4R(QhGH9gz(J1ObB;y7o% z%6y(*7iog#AKsvDF*J8r(^LwB;P*p-nHTg$nyU$qRI-aUq3Oo+G!IkF3m#$>%v#5X z{#gLhfiU*CYpkzM_d?X=t9GR%on&g?j5D>&-}!d@1Mo{(M=m|VdYm20l1d2|S^%7{V{a`;-ci&fpm#%<@=tyjeLSrIIpQh}z9I5BaPrtjvuZO# zU@DyCq2T)i5_?HlNtJM#AtmNq*@ogAkCu77Q!sj`Bp32uLj~TT(t}u;BdZo37GT6% zrnb19KHt@|WQ(!IHroUqwD(zUK||*zdOV&zlbE)2spOSck}3-ZHlr*`^tLs3N~MdU zQp|~+is@4*~?(I%ma;LA4VwFd3VS#NP@C4M1!$ zG&VLS+GI?Xv*|k&Ng1gtRVDmVcOX!oZo-^17p`X#=Mu6;rFRw^+%F7P*}QA{GDsB7 z_zTluqbshJD*_XTYOEv-*pe!|3uR|184arkX|d}27AG^w4kWvVo&Jp0BcojFtTMGw zs)l`)x4;Be{njpzd%Y@ZowRGNs!XKOc#tmVLOQ?Rv!9*{=`;%RhTOy(yK{zL<;nkT zXO}}(igQa@_R73YvpTw${(TD{x03`~X7dM}e4tG`P|u=ZkY{29Q(_Gy*tBlOiRkG| z;VdzfwKEgydMi`vcb_0yC0UfvONp@9#%rOn-$O3%9&hYnEGkra<}S9 zMhQbr*Yr8-r1DR)ABW3I5;u#GYRwawBQXG1fYUPqym-A2CkuF`Z54u&Q zV0D-%F1u5TPBO12liC|1RExnf&u-m4o|hh5jqG;s(yLE%{vf62WYKMAd;2VK}hAo}eC6!(o$Z0(S#q&L;HW=qa@t(ekqMpfms`dyParp}ol zjuthTOM4hpXIDQWj5JFhgAy;+yLZiq$?r)=wXQ~v)c&3Rt`>C5p&Xg*J*->Ud_o|+o%p_$6RPuuExKsq=R(@T52ob4ZJA5Mo`N&i zr+d|&)z6P5>1Zhz*RnSKB`=M%2Gp4g&W z_b*-xXsXNy%w$1~yiAJS{oYBEO1g@5qqN!u2oHY^7O#As$Hj|>agSl%fwQ;k2i2{N ztLQF+h-p`j!1kn^VctqBQ=9&l$S@DO2YgA?+}Z@JdTJ=v4<6=2Rn*)QxZs1fq^wrb zdcG-*1=dem*%8Sk2s$h77tz}5fcnh8zonhcDhQb%kaIl1`W(r|hFR)Q0+0W@*X-=w zX5%S(mXO|aTcm7UTWSMI_D*`{uI&2ZX}63|693jo+9}~+0SaB4>Sp7qWGe+=Z36~Y zWWMM6fCC>xJM>ernF*l_#h`6S%=NU$vpdDLjm;q`DOAl?P?N+1zm<2xaN;|UA8Xmk zgyUpb&YmXK30<1ZURot=wEB6tbmcCvzZ<9*Yt*8jd`%H$Wj*qfw?-$#Bw!aB^&Cr4 zcG!exmu{ykj$%kBvSL;_)>vV_W=4cJ=Hx&?yk&B;e_G=yb=3nx+hm#9{b;?$VD~;b z%bQR1mo7Fli8wX>U$z7upF2^RdlnWtX(#~L-L0w*BwVrcZpD`lJWkdV=Q^y1== zDnI^GtYQ%Xy>+>}AHitfa=Q9`1YDj(^6HZdvw?~CPz5uWq6!#_@YkCOdkTwYXLfxT z9`mISBWK$_phhy5ZpcYcTTlyAQtBtV>K`EXPWtR*n2*6Jm(=UzSDY-l{x$_ z)x04)jy4XumQFR^KuMq+&K66!jBy`%F?@X{SY2B?otZ94Ks?0*r%2WTAr|nLIA4di z54WQEh^aSQ=TY}q4j+M+GcB3rbKZP8$BtHdw7Wk}JtrA@pRR#)kq$euOF0Pp z+j(PC`s-vCbtXz#Fkh`ILZaBM2$LCl+uCOBa&H=CVC%0S7V}o!zj!+q^u{?T#lND*Q(SikacMg0NNdwB zmCdUnPO98)SFqQq5FICxS+x6D{2NxYnTU$wsE;sXPodetP##8&nz^( zEnu{{_y@R}==$M8tvR&_^)7|+Vfvq_hp72wDnIw;6%pfGhQY%@rdeFlQ5DwOvc{gn zv|mwXt1VnBDkH&HH>z$z>($NavoWT6+*?-g!5%uWJ5F)k3an*zE?SOJI80BsIl%o} zAom}`Ysrzxue&ov>krHwTnSDgVJD7l>2Pj(TX~dA{*Mfbeus36S#c^UVXQF@(T05< z?_oMPXMds$LNqO<6u{u3rmo2iViKGUTpX z3{Ire{A}%_>9Kuo#8M%hv4oQ8RUY1B{(fCkT9wb8C-n9Z?}Pr?;}BKRX6iGKS1vD+ zyU`jmyzXR%=%p1m*cxMP4OB%buQZQ9o&xcpPQmE>v~|zty`FRJ)Amy!qmAD`_v$vO zl%zwCnsD7)G|rQ)A}>cAqbvoFJ3*9!+SC>0Qya$$BrGq*u)p6l&W^q2;augyURaju zZhNRv<1W|RW@p<+*^FBCC0cPjBSoL11%0m1njc5f&3<3j8F?SJapt@5vdlXtm7TiZ zl3%HRsdU5}5|%X&Tsg09lPT?V8!s%o_Sdz}$RX9x04aTga0}6du(b7NIJZCTB2Odn zEfV^Y^`LkI%bc?jB=3`VS>5UK+u9TMt4XX~#AnZ^90^73?G1o4w!7i6R zE7;!|JCmN+5x0EF4;eic1_+Mro8tsX@Frbf;4K$(pm2qRegSC|_ESq5jiRw_hj5D4 zM{v&Ny%jG@;s@Bgn0k4IXP??5`)_73_qV1ddLLpDZ^CMsF(8<+2GTg%c$zJPvs^mN!iX zOT8#3_-_?3Q7w1!o)C-lmF#GZIiYvj2|D&Np%w~DFy5W9*V(5;>L8F{Hd2#4#UNAB zfXC`iM9X3YQ`4nsf;CtUEPvi>u@LOyleQNqsQcjUh)1dm#QHgM_YJu5*Gm}rrfk8G z+Whm$nkh&gQ@BEJe!Saf`63b;vSy=00V02mPQd>M__%DaBw@G>3LJrqrxcNJGDoMq z(DLj58IYg)Doe37P{imGi<&dF3U1r%?He?MMqP7P@c9=RBo~Qt7uiyKc-cw*D zSR$?80|_XgY3O|;Dz`^p>gom^lcaph2%ez8A=z;28RorWPAZ+#iN(&J09(PA~}G)ZCP`e-s4ARx?y?QXxoPOLWCy`mtK2 zqgJ(!4(c?YjV5UN?@@UEyieu6&S^f6NfxYT4I4`loUADSludQ=&2&s?I?LQ#8uXJW zp(OzUW6><$=;g5N1uR{3@8){MS|hwk&J;Xi&~^^sft$U+A;!fm zunjNI(hhH=QG0{%{p4S3NZc`g|57aL)coa(kppcX!nb;`bqa@p465D7b6AIi9l0sA zlC(;bPY3$6a2_MSt8YlNl1~;{T=gKv`Iq7X?<_?~KC182dCq4lBhl$x*T%=~dz!V( z)0qm8DvX1{gSqqW`m{SV%)$w_SX;qU)o;p=gAq&5qd>w$kDp@CyQA*?#dej4p|+xB zezEDq3n5-E9Qrt#5*Y!{xL4gB^FDj#j97bTbJ?V(8~-e+4BR>f=laX8kYY2aD_o12 zA`aa!*f9Ju+dXgMOU3n)*4yl4^soSm7F^sn%{(A8QWtY$F!`{o3vccQ-_YnckTS=b z6Z`|TQdnNxtG=I*f^5_T!(BbMZAi8yq;;uK@0;kMsSb$nq-u|s{7j6t^3a?aK;6OG zx&C9-Cy&={{0sUmx0-w-l;M)&0OL%7S8YJVuPUV&1jSt-L+^R3GxAnsY0JdjCwUfu zbF==o;16Fr5PU(w8E*X#fYxgfKlf*NeD}g&TEoP6a}J}uEiNE}U&OxyW%2#}C#aV= zN)XS)@n}2ivc5{JHTLp@g@KAXAIs7TylknZRC}QvLS6tA!F^MXPa!lPUd;X0=U^vJ zQ>G~|b5Y16SVgH4404PNfrHtIBquO1Ju-L_!8v9O;^-pm7m`I~^gh|zDk=@aC4`)s zfR`8-+cI7?2K|jA8$t{3LfvdBg@4#K@`2LmS?exwsb+EOeX0Y8IOkG($LW#^j|%Tv z_>_Z0q+h$~`61Qh^dW?8$|)N2lUxT^J30 zB_nIe@%sGUYE$Y=eKX(IbtdZV{B7uUDp)%V>;-@zP2u!!1%xI&QuLO|t zle|phD^_<#SBueloz&ICo#Ey-VLIUt>?}b}99SE_HnlA7Audy?ED50)AdNE0-Dqx; z5s`O-zw}sh^z+@sZT|tzaJIC*`}|DcP`ohLx_&0QPQd5P%T0w;HHj=id;rerjBgb6 z+OlKK#AH=lhy>jS9lZV7yps8l9%-fZ>7LlXa*Qhh{F>2;(cWp!#9_YZ=tCvt4;u`)XG4jR}D&PVa4U z(Oi_E)KD6lZ)I*^mi`A&4h-<> zPdIQzm^5YUt=w@?d}yy7%*(za`?}BayXwnAQdaVX_RFre&iTeWtkP1)&gH-fMZXZ$ zTBR{@?ab(>INQGm8*1>u>BtoIw=4=biH;-VxTM`%KE$T{;=wTEsc-Ck^AdTxMM7Cg zG{&Z{A1RYQ$umHVm^fYYye`U#(A z*TwqW|-MZID$P{Hm4!MFRf6S)Bi=EnkfaYb!9k(>TyXR((;o=`oI8=~8@7ni6a`^NM z8K3?S0Bb;$zpdV_*mmo8OMqIPaVbk_Oy;Ll4wTD+Or}o=+1}IJWaD^TSvQKR={=Eg zy1eR^N*!7?20`XZBDF*h#V3n?>a3@F>YG)yN>!$X0fvbrl>`YD6U|0u9_`C}w6>v9 zSOBl6Jy%4sD#R!JqX=f%@0T2*Srzu>7^>1TM-C3;sK{b-R;W>!VRsg)hUGGe7bf0Q zC1EQq(D)I?K*U18^#L$>FdZc9%&85)xETuQX@b=!LvZPFJ7 zB_L^400pTET1f(WMr2@2#KsX>x!)`LpD?#IxPc+4123mM;pN&E*Eg~5S$1n|;;!=w zKxPG|Ma(wbyL=c-2I571=!ilW8I&W`x&kXxUM{=6JHE-ZRdq$}PuuOxNv3NWZGM!A zCBCzLHJl`nRFx`ROrn!vq}x^7kyMnn)G=3D=BF0Il##14tqRlzGbTg=d`wF_PxmL< zhBxOa?bmQ2F(MrJic9g_1P54JR5;45cm3+> zWIcMcmQkpsPBgHfk_?DYz>Gn|_QCSEvR7+ewKuvK(EYW<0x_O=NR9*?46W)CjKzdu>8)w$`q+K}(={I+CC;moEZ1{ctC$K&7cw zBg7)121O@0`rPJ1wxJHpl*<9dX=tePS1OtTQa~Pl96xH6>ZzrqlPuwz&os=6$OnWr zdy{3Xv$d_>io>XsiMvsl#4AD6mHz>5nKY{(_Y8Rm?~_+;!O8G_q_Gzrxn_9;TY8yfsmB?B!^rnelpr2Wfl?{YO*r0t z!KbR-cdJInwc}G<>NQJ(Os1pYl+9j3Gp^ODquRDA{q1#v32c6}!G_9VavenYPzILM1;L;3C-aTn^}2 zTlQz8Ut*9*_AZZdg!~s3WiF*h&XpWx`dd@<&i&w+2b5`tE>zVBIu(f!DQ5QjgdVyk zLX{oFB&S2{x{6nkHBx!fyc29R$SY1bPwDK6b>-8btK9+SV;WV`rX^C4r}1!cqgW3zX+ntyJg7E_=_t9p3x$vg8y^8*42zGa3+Ohn#FZmtt>k z*eUJF!O)PUpW;>~FhTvrebgP^->6#?jLZ_O_kMxmp_}Vi{-RSCZHI1Wj&wg|fpoRzI%b>o`2{X+GRfv_c-l zV5r4*;==*uEl$O^+o5Y;C6dEPamv(%5LfW88$a?(V*EpKSMGJE?$DByl0BLGV-kLO zw-MX@x24*wpS^iV3XvHDsNp%w2$$p}f<LZAbd|9GxLr|GN3>)1mqj5Ceyqa zPTAU-_jfD%Q)S3PQ?J{_gqGH~pG^%K1=J^Y z8>MbtR|x>iNH~7+kQkUb?GD>nF1@$A@2$$~tXt_*(_o`DzM<$y=QUyBiHrB_F9C-R z#hC7$-I&nQ$`@{GV~Gtg+YwnZC(2XGNJ?91B-DdMfxv_F8@dl(lWS6{YG2+g4nqXb z%*KKIoNRxTvDWVjq@JUW7MfAS=}*Ovo*%9WjGpCgyW5(&T4%?(TkcFIR4LI{)Qu)H zsSYyo77wisAwq}Da1`5MdK^iZAP`1U@bLctY-?N6ON|l-52WBiosC!?&g_?`?H0!` zQ6HA5Q`ZTDErq*pn9HhZ{-0E8jOx-)jTA=)R@y?XYk5gYc_2wd0;J*rk<3gI42~f3 zfr_80MZi)a#iosC)R0I*go=it#zi2Bj0l`oPj0=s!0!vaEwF_#nMW7xy662<%&#!r zaye>h)bvby7*w`ORFz%i1vukDK$e>%igA@K^;Fl*(O0;u+G)!rp|BDbkfgg zILw@Q_`!W$Iy!W+$kN&qB!Ps05{5KeRi_fN#mDjXo{MOLm9+*l(`C<8Rutlw(nN{x z$>=RS=T05Sk=V0matUMpU4pF~TWVI-MYn82xb_bHsyhKxZt@QQpotQ{w#zPy92YAc)l-n)g=6t9t})p=P~@hrZYu^ z?Z(!21NVNsW*c26>Dw{8yNPjX*tS#?10THP2uoQ$FA?Mb+HF?sh2^~s6`~ngLU}eg z$u*X3$8p%qR8^%)d4%;DaFP~UL6A}7sVOp^YDfy=V@6$0)}?;qNz_Uzq=l&x1u1yq zro^%Y9a29DB_kmlSg>x|qGQHf>8#8V7;Ggg0Zz(Gfg(6$f(wgwpbic_qrbJgtU{8x zXYqs6P8#l5!Zhgj(bcf?z;Hpi& zWM=|umlCxD=T0aWPUCj=n(XZb{+{P$WGsg2o~KcybWa8KTh^Ar&)23yG9tp~Z?}Cd z3srP4P~6m{1u3>&9aJ7EDOQrAGQeVTiwxO4@Wi(nGvLE%ZMyVMqFZW2d5k)x3XKl7 zy3`*cE5#qWc6&AFY#X(b;X`qu0Le@`h47g8RAuePCw2`@!iwyw8-+DRGyFq{QhYdp z7$E!TWG!HQ_IC)G&-+LsCNq8wt#nCDoL(7Qgc3CsDS`*%#)tgBZfYA}Vd?AY6atuC zLQgrRQwjFY1H0#Ln$G7|1R`&#ZG@ctDoSS|!epKk_87Hq?Un3u?}hC={_L|$YT@Tw z`Ey=HZCs{DxwPOhA1JZJN?k}OP1B?lN16~mJTGv2@C}{v^<)14TDvRfDgn%ONBVY; zAG>6Qk-<(LQ58g$U-yfb3Q|R)*bNma86KLy)V!bkSHVC$P|%hJHK~$qz9o{d@4bSn zbcfn;4!>^+Qx6pd1sPW7!s9rV510y9fHJ6BL#5W{li`FLo4UM)!*9t+mmGemfo}c3 z-(kct@rm|%(3($9G+hGN;|(Xlmg5wrGC&8Gk^tgv-2F2SPNHD*lr^b*zTB9Q1BcR3 zHf5U^yw1vUGz=!;Jh;6q`)-t!IO4r1D{+^ILOjVlfZ&s7yI5IBa-yXPNW{+%@jgN+ zw>mqeLFrSnwJ78V(+DduYju~jUf;7_z}#y+ar_m_0lZ|(TqqSTeDjgs3G=#llU!T>Vnr4i&agKuwk^ILCkbt?)}Qtqc- zRvwU$Ntxu7gBVxe?&5B{nV)V}`DfGg+%mhx-y@b^c8y!@$6wR!&5~${_S;7Vyt&@ucYT;!mbm$S@kqqgDVqCyCmfLUD-%qqVxbpVsd7;QfTo9v zWr=R=uHV=0nwh5Ycv)hee-LRT^%gjZuTb&OB5I4)&W^dJNwIn#`;ne#GJTT0T z1en)l-v0n;x4jD7yQRJynSo;40r|`|E?Ogyhm{?N97>-{Yfz{_Bv*jNDhkyznu#ME zPczTX3@)t+k_j5VnR!Dd^D!-li-w96}1WRnfN6 z@Ty9dhX4v5ke)y)zkxisFj#1@5*V34-t$=`kPZ?sNOoUS2_R` zeFKc~Z|(Ed+diuP@=9rH)_PLPZ3%0ZezFR1{n_z@k?ti$t+%$51rD|o)LIpqO64gY z83IQ#BFwh8eq+szZ--%!xvpMg!IfnCbb_?&xO9U+t))>dscr%f=fP9*m$++d-neYq zhTV3}N|N_bq?9sdbs~xDNIIzA*UEa4HHg$)#i9U)^5S`YegL`D4|No0HR7D zaVi87PlQ+LcDNMDT~qZRIHZk4FVYOMN=P69myC5~c`o`#+RX0+#id|*bNBpi^=Pu3 zxtoqWBgncykr6)nU7Z&O-DD}yR8q=K2O0Oc8z*va3*foi>**=&EmnsuR|cw1H^@UBMe(n_IdBGw?6HEty|-> zk#kG~8*OXG?|V&phqy3VkoDE4Ta@jMp%*1#sO@WY(6}|z>E}{-(t8(uBWrJ?x;I5F zO;s78a-9xSBtEtYLQ)**1tr5Yg#u8Sr&Pc&5AGhqtlgcy{?FR=H1yR%t(R7sf>4Lh z+UL>^0HmiKBa+^64!Dq!rX^zLpkrjrn7MtOF4!%2bqC}FbHbT|D zP;j}+NJ-+eb>BNPblx0#p5mHkii%RrNL4z(;50lNSGsXCZ`pgRZrYn_s)TInt#BM zs?vo?;I`G`2r%JqAd5aYjUn50*{alu$!1c*f8C?tsMmzPTBem#(6pZk$Kg}d5()(; zoT0SxI#KDFpkY%8l%5``nk@FL3?vm2|gl=4qGQZ!*rel8dXE6!ZnYzG*5# z!Tf5DHLYDORsMp{v$oO-swyez>Dx*~$A_H8|mno6rF z1=aB@l+HYXoN_fn895JxW{OcTR#2i7Li&26By+;yX8L$2)nm?QO{t7>{+uj7*VG zWGW=L9lOTYbI~QS)oH~CN-8;l#ya0SnR~N+TrPTvr!FbB$l!#{I1!OJnfqgWcI#-h zvip5(+lWX@jMF2j;^KfSpFC#(MswT7ZG}4QjiJxy+8TXqH8$OlN|5|TM@7)ikfsnD zki#fy+>}IR4YuBflgyGy;>}QZyt4i2_XKW7XNUpyG8mjK%<* z2+z#SpA4X2b0F@GthI}DtV0%lY`glIwcXp3q68Z&2yo1kDM8g2o{Rw|G5n!*YPdo%g_q(|&T1lV) z>Zv12d`E=<<-r=!Z3qEUf!*G;E@Ed-(r^yiH!C{bF72*6LxI0*lec&d83m2Wbynp_ zpZ!Y8<|a-xWVT)rAU7S`Mli#ZZVZ$;r4O_Yl6bm5QA=gDzjnAOD5Ixjt!g|7l7O7$ zf&nTL&1lL7;kvu+@ryOIYN>g^kdQHvn4J7na5+f|@Pj+Mt@E+=yRb4_vdU?^mgNxP z_*`vax8J->X#G<35C~aJ28x_39tzSc&yH=-wQ}#*cU-G?U*W27p9bk$IC&LdKbc+; zzm%(IX1ivpw*p9_Wgr7DzN&KsAoH5$rE)@4V=6t%vBz9Lbch zW?FK~D$UXb!4A4=qU@%ET}eK)D1%z@sC$cHw9#0_6F@eG&=Q2@AuT!txu#(I<0EX{ z%X7Ql-g>dZ>$OT++&oH&Ct06~!dxIE}`2rK@$Zlt@#} zWz zCBE&Q>SLJ}L%H~_elZzXCHEe4+}UDDg9-T8tE5|^#)b5jrp~G|#kN~D(L0BBY0$x7J7?Q7rwGNws4>a3iGhK9-lmY@! zjY(NnwX01^jY&KZEw=uklYkVS1Og2CgE5RyYpY5UbQLGaoF(Ehh_#%S>4x1Gbj2h) zV7lp3YL#y2Fnv_0(9qD~=jJL84%gYf-0lEhyIH79%KL4%&~VR*TP3w0Y~ls(;cja> zhsahtFh&bKRQ~|ka41Xk#SeY={@ELooozN3-&QS?WqB*|@;eo;xqN>6JvTQk7zEjo zU}8D#nQkSy5v{h_Yxb8IfUPNRLocR@OQ7dH(Yp5b$=r_iyJ{s(?W%F8B&}}Bu~?}J zTGXW}E5Hpz=~6;)3c%5~cHMsMqo>|Cw6-trpIJf@+DigJEFmBOqyR~jwF9d$8f^PW z??x?o?Av3am~22?Ofub%DaZ|^GQ^B|CfV$rWd~DgOKc@vymfK*)!obf`rWVDH)vru zQlrvaW2ToR2c)88C0b=ENFD%1UhUgke#2o*+0yE5?VJ#^sYyc4q^nWILmX!_%*CkQ zGwfc^X@2P{n+u$NFzpCUM!t=aV~%b>KaT#uzh z_)i1+VmXWBP9MBU0CL0+IbtGguw+)r>tbc5>keP73am*8Q3=)0Q(-~D%gB!&Dpw0_ zLkUxL4Xp~1%pcPh3L55=;#_5ECSxN2m);eJKmP!qeab$URMI12cH4}VAgC3^x8#<2 zub}B5sSY&RsPh~Pc6AyX?_G&&0GDe}1pfeg)Cahn4>+~&>c^Sw#lgl&0WD)M-6Tw5 zz>FowDDyAw3nt7rTKR=+MiK6uzi!r7ZN#8MhDxNEb7eM(&z8`25Y$BwY08I<-P~(g zy472DT?B>3;ZPE#f5T}Wr(8e6l!Bsp0~w2C)Guw?>-TNWW}1$fPU-#SpGz#^_LicQ zft1bz6CRFVZa&mucK-m{?hk z)yRTq6baysWTPn~R%FU5w@QSchm`*SR6(*)F7bMWX167Br(I_=3L+2+)>Qh#X%rv| zq%OW3hXv{nmbKg6xmBnporaXP6NG|9{{U1BtBcnP_UIS{yz7A=c#|lyZPCwhj?a5o z%=ZHF;|*K3vjUxT(zPWDyJZfs(zd}#C-on?U!=6sK&d*v4ms_5uDSOkel1ksnwy1M zT4-mbDpr)?$p{*i;0$VOZ7mko+sQ)6O*Jb8OFRyg%|?95z<8MRDf@-*g~uttGub&D zwO=zm-N+>MQ0leGn|;Y{rfbf!l@dvew@*%-(h>(6$9YmvZMz*V+@u5LY1%>(d>a^& zIg$xJCIXvYrmpjLsJ_$^7VC;69z@_gKum!0jXr&pdvVC{y`dxP^eZi}lQMvo$xo;G+|;Askt`!ZQVNs+sPX>*>r?oe z1Hh@Y1BrtZq{>smI2=c$ivIwB9)A!Ac zPH-u432{DJRun#{{KZ8@BKnkzai=+20{~t=7=mM}k109voIjZg$#N)w8Ci*ytpKMEjKB6Nx=AOGh3BxpEMzx0=Urt?AUy z{xTA>f6PXy`(u^FQWQ81v=r{M}6BaCE6XN%o9BoAK^T)hWR4OB1)k@30j;jtoYx~R1323rfog0YTlX2LQxVx{ ze8p>VKni)DD?QEK2-*7*<9#RnLv-p(LyDbq(AXX&N9v28VK#cV-*fGjg#q$NcslVp z2HN!!cyNPf?J3(7yFMwjOkQoS$$m5Na@>F^s=0B?FOo&#QX~ph#^D(XTIy&h2LkG9 zZ|ok@QtihVrt0k)mr$eeb!sN-%0I+by#tJd9z&X`*932=dd!dO5_xU9*Fr;#o@v7Aa&*-VDrYr>!aR+QGK;p4$eZ70-} zlZc9~lDQsysZI@u{{Y$6e}I0G0o9pZ(T;2S zq<`5OIJdz|c375~aO2%A%&-_lY0M$^k`g(orwHn@R8R0Iah9sXbxxO+g3dU7F@v28 zwKnF%Y$$|?VPqRQhu*a=A-QAkI7uOurgStKR=p=w%gI4LRaH3kOJ4mZ5=zoNhxLe) za^R|j{qAu9WZkf2a}>X#kS4BG_aabw?UB!#w_bJm zvROh9ZN|2Zi&_&_g6-oJm$!Ev z%R=f~K`jr8MBzD}LjX8NXnXnYJNo0?J@Vadl=86su$eOs$J-7O9z?r)>WzE5mg}KT z&AFk(gX7X|BZ6<`!?#0g?6H5WK>Swbgt%rgOEQ~i@YFqL#DT&GpPFvuvvk}P`zqSt zU8dTiT~bIPb!!7!gpNHFo`|0ivLqE1bDddoF6=kgWjiL@*H--f*2-=2bLkMuokfdp z?9ZZhK{jDztDw`6qpd0`rz(#=J#HEixVNho%Ce-|X~LhVRPtf3QuvHi28453k~qa< zZ@T55YB_MXfNwQRO+7G>#-Zb-2Mi?Go2wiU+NT?Y$FZDSWOlB}g<Ugk8EYjEifyHmwt@p5}{-yN@TX>DqfQZhqn5<&+c zlz@@SP-d`MskX(6p3_W8ZIl3|97@)4TZ-aTwM|6vB*Sk2%yTTe0<+{f#@tQXT&8i9 zE|@LW`)SE#T1Tm-kMuMAwaCIlmGy0q=glHDdE8?)kEt}9+CCH=I2-G zGB}Y5yJd+lIL)ELcBa({@2Fhf3oeAhi~`h^D2f8<0V(sUxcl5K+exr?RbBn^I<2%) z(tml?;DnBN)5J|}POs52Vj8#1!4 ze&E_bLyb3yxP`^E*dA-h&nYhuMM7Fh9wUq`+D(sLysN7>edQ`~pyItsnb!NWRv*X= z{0U5Ip5ktLO_^<`wo)iJTTy}%CFrMX1+4N5PzX;sFO*e(+Sj|>JGcG7+>Xn)3oK2d z@gCLtLREH+)nD-zTyS7^{Y&awV`oJB(RgLXf9HOkzL;#UvV+LXw|l8oqF=B zw%SicB$D*Tg(we%DL)d=q-j*h0xFfeow~bn?sqzo_-d)VWuEQb(-*W$#d1po>5tvzHiW}^C5~gUuD24x+SXfcuQ|ym zN|Zq2y-%_Gn?=7Z+s^ZEx6|0|^@*r?`g*>q5ZVrA3GT?9*IarEZ>pERd4Z zsy%h3a?+KpAt+49njBQ80XyGrcS7v;+kF)(-m)UKPggB6n02)O0HtW7;wTFx#YkYJ zAROb;#~ig=Y_>~%zT8-HENJbe4#!$nm8gwMbuKnkl@%X4@H@EFyK$;rQ<&?-aw9P> z347wrM#FS;>8DO<&%p7Ve(!TF@nIF-orL5)T`JuY+s)Nv=}J`PRt-6NPYvnloO#VG zB$qSv!s@J32?cBP_{3p$+fA~|W3EDAge;1etal$mO-ZP2W#lD5pD;Ln zlG1-p5Z%XEs%(>wk@|j^@7q4zHv1d9xtc|C>2bST)}aB5nPE-BacCqyoe2d?1DG@h zyw4TBmk-qw+a|$nMa*2x*HDE>YT-U2GxPn&ecQ*xaZRf2 zR>gDveGzP0Ld6KS>-&IxrSDFsWEmJk7{Qgx3b!P<*$qqrT>{4!dsR`J!T zJUVR?oTvP(^FB4DQW`>09Vr-1yka#8uvQ*tJddnq@VQk#Gp$l{jYWac|@OW zEC{jfW=Rr#^o5dhk;~tS_Q3|fi6hb~Ide7m{y&ElL=SO`vx=F=gmJAximB8*$Tabw z@Zn^EDGcQZm`-|>Q1tWjK4c#g&b0hET{uX>D$a0~B9$cifG5cOISMAeu3rupP6ycu zoN|OoWkj0kO#lOzFii>OJh*(qfB*@~8n~4cj3pLU`>0{06};-u(`W;lmg16xBz`4I z{{S8&x~Ofk^M*~N6Fxu*m}Xj1+zlrck^uI^@4tI*c5k=&QLwudYxd#bHW_(#DQb2{ zvKQQv-x14$`1zU}aZ!crwy5D$P)f>46dZGRyB8C@w*^&jGCgm)QN~F@l)QB$90q1l zrM9KLi)A$}8|0y%NN|BNH6K!?F*2FXQxWG)_gVX;W#4g^cGqU%vHN1~=0MioNZb2s z^47d!I&Q7U$Q->m@>^7kv34q>ycC4=(Av@yO4j4E_H|a;S=?8G+my8QeOA<&5N0Nc z36e9_&Sg14mvC-9k7?NtY>kCh?Op!!TGMrJEwb4|C?Mzqf>gOoOw0un!Y+TdSr=`u z+Dv;8#BUA3wc4yU`!ri?jk78Wn1>O#x*UqWS{>3!_}7i8`AgWSrrPxzzWYqGTXU)| z%*`qSa|A1fag0ARH8!h-#-DC&`j(LOB{)GT(y(Lzl9N1V$BYjDNmqEOFp>|)8`yt?>5TZ+jjWn zePuFJZFI~!&^w;ipx|@dEA?giy=9aAz;tx1|l_D6@R2>}zBKG=kw+KsMu_YU;DI@R?E zt~%>WNPR4oILoaoTu|pl!P9Wi5zEJmB5pSn(yEj^zKIx&InOzBh($FsLTQc~Veot$ccwO%saf{Q4V$*%MN?Fk&(KWeDNsT2a zKvOE`LKKmhYrioz8>Ok%?lv{1v8+0@uD0NsOp1V7T2V}~l*uC)+7-W)P0MDa8vV@p=|tylPIoo{uw+cZk(q^O|sd@n^xbvKYY{z9TI_`w}m8CwEj&$PTZMW9lo%wnsYjRVT zKo1gd9uWmwS4}|QUZr6T&Qt#Y0q>8e)iHg*+e?(I9z|-rGXWw@b;Fw4-C^cNr0b5d zA7McX=9MHKTxXv9?V7q&H(6N9+goc&u@VMGM;wj@4&9r*wNkZH(m0i+X(^ga^9Ei< zapyJNR#?0vc(=~a8UFxeEIW&xu>6%0g$CKbTx73BPc0~2O1>T(Z|#*^MNQj#ebM5c zpW%%x&ma=e^57#EUpD1M!*^6BvTJcQi%L8jYE-E@|!G$mH+D@sY0N~?JwyskvF*-L3TrAl=? zBS>Ar_K9cStRmxs<@V8?VRG(Pi?oO~neSUJN|R)o+~|7Hg4M}{scqt( z(H)NSNskgE2#&;I?g&{8GSXAblR?a%9xs;0lkp}+MDUbWE)VJ)Wh2HQ%jMbWt6NBH zb66+j2E4Qe<6Zgry0sRJEjd@rQpgo4%)eZ<GZ`!yClxaQ=!$-1ha$$;|g( zDU#x@8GYhR{{U{a4HnCI1*>hbfl^Z%-37EZo??`*pBjFLZ_sw%V6kOv4y8KE@iwo)Hm#D%$KeY?c!uG`aAc6Z2c-Cl->1-V&s>Yi(&H(7!@C@k;Hw)oiuhdzV{< zNu4zyGxa*?^(aq@8Y3(|@WjUBqE+heYwhzgG>Ow!RV;M2+Pw)s&bi8bff2A-6Wd{= zp|X&M(3aAGC>u&gp(p}?Arzqa4k*ZNbuSlJi>gs1o+O!{d>U3#%VD;_4Ws}E00tO% zLrQJwde%x152LE$T1j~6)uAQT07$7iK|HE>wp%Dl)C91YioM3GNS+fSBK!UErJ=-? zCsK7E)b&!lhp8$}NceC|wOc_c633qy9^ESn5LG;4PwjgaIX-&4u5)^=xSHB_9-vZ( zuTL64Ks=HRVOI@2C^#H`VfTVIe#QJ6jX+&)N2Dc~Y+~ZM%2<11Z?x7G-**!46$w8l zN9q&ExJRUW20rM^-*mYK)%M@_Xp`KY)LUX$c8hiQ&U-l$Y^Z6gLN^lTnE3YPUe_I> zBe5Sko7cLariomF`5ruEYWo71@Fst?MCUfD`Z|09JtVeSyJ&TWM(yg%leZUx49II+n*Qu6@;?+ z0bxJBa>Mw}9&t5DzGqn^c&_9ZsO~(51I$~6u_=cYO8JoFmLEg%r6dp*=8&4#N@>Ay zdxqI=u3I+hS<(eatgPx(xPU76FIAu*~Fvf4cQ)c+j4nyJd)C1QoMzEaZcSE_juA*Ann^7 zJ<7+VYYM1Kbra$eg-HfnBvn5MmbGlFYwVO)+&)^onFFBorQ)d*=c-cY5DUM1zRtUJ zoqw?R6`Af{0eEH$kHy7vEt=dsdn3C}iWC!Xv%7xB?Kb((NKw$2I^7zOb<>{^b$6-_ z?9wfw-&tn8Ea@q%K}#5nPg%Wb2^`26Mat8%FZ*q4tah&3S7|8Kt(vwLxexh4eMKMP zNGjnW7-0L2_sMeZlYRHExr~H6Z;P2+-*XkPy(CChJ%rigrq_n!jXIh(w_{r4x78^0 zu1l^f__)$LB{t5}cCo7?Z!-PGC|j<$-1NOr=_N``@z6aeZeSe=OvD8Dvo$-*f0wD- zaWn`Gu-3d5mQXP&P9ZCCMN3cw$gGK(K^y(O{kJP|Hy8KK-Jf-K&TbPg*Ev8J6>i1t zlL`ZCaW(0tV*12ZmDZH`a6s+VGkYhp_51RyrB|EPLbRL;x^0yuv}g96)Ur8go=_6* zJFoA4`&xT>OcX3OIx_OajEk-Wg)H#&HRvD2rAs*9iV)Ox8jl?Txbd28h8s;1hT3HT z4W%jM076m#<1`g5_Z0KQmlmQ)=1G|`sdS;1lG|7|kN_Nj!wBVC^;VTUszrPV@&unc zjuj+Jz@MrRDVdHXxB>Az`GROD2mPndg+^SVH3Kp%cCub1XIl7HLJg;G58 zgjET09Y_?Y<;?gK_;TmSf3t;>4se<032t)=Q9gC>q5KEL^7wG^tYs|W6^?jBgR~gx zZ`rIz-fTGv#@V~d2bxsl3JHeMsXsh|Kg)_YboUqb_RpwVRVuoH(nmj3=6!;3KeVla z;d*SSO_sf9*~8xoz3ulCY3+};{ny@$yoOqT7{+J)0f$tSnfXn{rNPJGwiH2GUB&b% zKywI6kAUL|Qqt93?rd8r1nR0DOKIaGqbd0(6(1&oDkTLo?^ zeh35)5(gOa&FrIY(Y>AKZszdGj;VI6cPGfN;z3GFQnMVs>ose63L{NY;^n_V;1-j{ zlibuPBHgjAg-ZFC+h>gWO=$`z%z-a-Qoj^w>y5{DsR?SCvg^r6z$Ca;p(FWFPqa=n z88FHKxih3Nm@m9RVf4-Py^w|W4m*X}3Y65G$kH%YKoVt);jKS&a!YldUXIzbAzwXC6;A78R-`IY08V(!N>DIkygT}{ zPT0Acd!-do4fJ1cR;_B%1k2|k2ddO{7%XT5QO!OA) z7;&ZCrL^s3sU-~ckr65sC1oan8rO`ouqyT5gA@aLoEDd|wNnrRYUGDnKbO{k6; z~$%PE(K-|mRZaJO0-h%lqwnK!FC!m0k8wKq=`aaOp|Ze7cA z7u$XI>1@9MkQCaGx@7^ubczA84;?y5i+d+-TWuo8RcE)<+fq!GC8nTH{%}!Jyfp$x zIA&ZoD>cLlh1M)<%vQNBZH`iybcEKbF(lC>&{vlP8zpahs6b}tMPuAlqYkAz%ePf| zsi)HAGL_($kS7DHy@z2vH)v|B?QYB9aRQ;QVw)krJkVjA{{UB*keBq;N6Ssvke1`4 z7@YF~bvlym*@j%U!%0XqQ_eONsvr`zB_xDy_mtB8_S(KTbyf|qQ%q9or81P&CZSZx z2|!ZGamMD9kdRhVlTSw6ZPhL2FE*vynvrqMYYsM&LIE`DKzUl0q^3=!aw?jnkW?y5 z?&E*3?k;pQJ*>2`J3ZJ78MS1xtza95Yi5Bd+r94E*=TE>bi+%FdJw5vsPif2qydX| zw`!{%*$CZrJx0T-I#LAYzy&H?v(98=ib2l^=+)=GY;29*b|WZ7P*Xw5gq2G}%LyoH zClC}`(xr)fN=P_^7rEF6dN_Xf_PMq@!EV1rySaG9VcRckTcihN9Hz|LZIYlVq#bFW zDq~4HQ~@1eNT(If(pA;%{^zS?f*oSCs1%MG0a$um5|jd^9tq6Ga^H{8SKFSru!S~S zbe58HA!?FZn9PzwM~pf9g~}O`j5(a{rek)nT5L&Y+}tg8$L^L)HZ|I7QN8`v-3s41 z!DO}x1MpPQlg!YYTY$ftBTsQFv_S(r6&Q@=AI>Bf|=$3z)vF-%C6p9 zZnm^0?Ca^e2FWUIU<4?SgdsqsT5`l{RI?L^lVz2=8(EoNt~mx%hUVK>lw0D;v0ZTs ze1@(b%0pdfv!uiKcNjM)vZA^c+?X=mZPXNy*ao}^yWEcP@70uTL|WIk3N)&X!J?rg zW~4sml&q7$mcYPB=LMeDQ1+`~Tbe~vw-LDYeeFu*SznWF%(e&al&Jpz8H{3m()PD| z=J#*B7W;11?wzY^w?lVjJri?I1(7+63`+4P8m@PSF0o+9h8hj2#Lb5e!>o9N8pJHx1nyGe8`hup7grx~-F1A$IN&&Oy&+?jKL7+on=h6RNU5M+*l(|PT>`ah|)(iq)9`RT(jol5i`B6)a-^>3q~cD=P#vV{Pln8P@y{{X&a+T)3K_M26eO0-!r zt=Pn%-y4h)(@$8VS??Dpuo4E8A}`fqu%e%o^y$DO^5tXNqN*Q?L*3=jh)@Qd#+n)?NsAc#<}z|(_`XV zmShLl`XeFszf~PwMcU||owk{UytS+Bp$XKb$N|7%fSKVNN&8@SdY;ewKid3CLi3(j0hXa1#H&16p4$HPE8*R0+l_@zn zP@^}T@>1pzKd=%q5MS+KcIiu5ye#Gbfoo+a^GRssdTAg)ZAOw&Vtd$Qj%gvbtaGKq`1ZRCmBhh=$|M#Ig=&TjU!;+VMB5h4A< z&Y5x?X)RENC}Wn;{IgG#M*Midn~I{Nz8&*!&q_+{OgvizViQim)cc&hWE6wMl*Y8% z_WEwwcI9_kw1H5?IelRLx7Q@H+2=PDfJg3ya*RlKX`8~hcKw}OuhX4Fjan6Uv`=mB zoyrbVYg%Vmu27#V3l|TnB_gAm!qlHL#)on^_X!e=t29YuWRRgW(izhAS)RlMEFZT{D89`?D{7=9mMmW8&%@tC_@BHNJ$ z*>ITCJ*mkv7u41h<@r9COP-&Rngw^ch#1giCZbmmRS#<2{Rf zM%|M8apN?(QygwHPDzmBP})j?am56r5JwTj zyny5dNHy`NBg^yQ!Wq+^VjDQ3aTypy%rRU;aI8|XjQbPCv#fG!D`r+dnq#(%qRjg) zRSQG5%j7xG)Ce>uMSdJAmh}xP#T>X}4U}{%S}IrVz$gjhd7JVwIU{gM&mJ^WFaQ!p(;3LW% zQ%?1ONp$feANKg?1b1M+ZY`1fd0~^WJ*vItIi%U_$AbP@oUY1m3AM&j++yDnHHzJA zx5i~oEUm=^6*#IAKmc((tNqCBid~=7QL@rJ>&Z%t)K=*QT8IPEnR*i}F*78^bNhPI zH%(6R4J2PGshOu*hC!xv6oi6Iii(L^r|R^H0FWU3c0dXOqP49mNc=f*5E7y8iDM|_ zQ=sZPxeyH#;(7BlspLrEP@G{Ck>?z5JwskZ4-?FguN5E2Q-u-$_rhuhQ{$8-yCS5N z_zwbA<5S=&D4!4W;be><0y*a#OC@9|lRy-%ROiZr#-4xW!lHQ$-G@bREV93cgn;{~qD*oC7Je(>@sFC&s)K_F`u_@zw8N&FpftzQaLjG5n^ z%8IMwc1G1UDG}-eiq)UE0HZ)$zd?UtT8lR2R;YdB%ES3aQIdb|uJ0Ch1&Uz3y4fZ! zDjvt(+-uqrvXMURd6hdH#Um{VSFI3QjVeVAMx_Jg#dot7RKIhq-0uKcqDX0(iT(S) z%|rPc6Z2FNFE=Kw8$Ie~RsR61-ChhCU{OlemmWX-XB65c#VAnY6vOt%*{3$=VXPNh zoMO%UI#apb-A*EsdUr&jyCW|Z9YIZ6n{9MI#Np#Xb|S<5{oeloomeZi+J=yG8j*^< z>iVNT_p@-PW%ilCpG|dYOtF!Y#*}-LjJ!-9nQVs0aSWQeOKEJD#Rse>rg>39pw_-0 z;m2R?NizXM(Z?SQ{{Up8jT_l$=q<*SK48j6OwMv5c}qF!GUt?6$9vnHcEe$E$x$9r zzGO`&7_p(UqaoS1a$|mq5=zutZDjJP<;7RMd!+3S+t=1GblfUi6wHB{aqmpP%#^25 z!<0PyuwO;T^FeZSF%2-6gd>)efu3jJFz!*jXU~G#mwQhMTl~nfyJFmhLH~30WDgt>8L} zCo)o{X-^~}BOw~cYYLw5cd=K>qNgpXsVi(8o153z^$|R@ke>?Gki0)OCcd z=4c7Qw)$rsSaM*xtZ|&wRH*- zq@!V_GDD~OWap5Sfd?5#5K|+^Q0Elenp_1-T-y0a10FzQ^;x-X`%X+jSg6Km0#B}xQw_Hcmy{h{mZ9gw zmge1!TK9(A*~la3E|1kMLyt|03a2J{deWG$SgZ!GY~J@Xfb=O5PSQ>?*5z9XGV)10 zc*P{EIx$eX_*+~-Po6)3I8B}YcisE4rtwzl-L0sqTgq88QBu}aqlQxDDF7rTC?}pq49ILt zy0YUfgryRC$UrL62BlU`ikV0=NKEj|1CgH|QF5$#C_xJN4ta9%$YT+%HBT6FAdUDlN5aWtVGc!BegTC#Y7r1h=dWQyIvd z2@$lvD%AIlvt@Gcd0Vept}cZ9tAwqtmP&Oktdyl-`jS8s2_Tsh5Qo`EybSVn!*jM* zJHJl2-K>7kBe&Y`uXQdE9=AzVhcC1~qOPNhjOmQ+NF-581daiDJPL8i3E*#V=Zng zV^?ch(yAw#4r(SrDdVW*G@K0h;TWE=r)VpUz2u*n3(^t<%8v~rjK)7%kepYpYu*M) ziDi%8?{`?ZRyySLwQjQJ7SE>JoQju1W3;P;w&SJCjD%3AHzQWHQ6P>AEm-z)w&S&r z)YGb-osy^D4<#Y7FH)2V^rU#F>xz+H^Zw&z*u@QB&D1$2Sq!OK<&ULF1tfqbsVf1A z!UC_pZs1#Y3$Pgbhi!fsX5F7{yqDg$Jo4M=%$X|OpjPLoHl$8S{70V|gR(n|XVZRQ zOWS(An#*NH6+%MNaMY9)aRU$%Wrvh#4(si!yPd71Mb@2d)-hVzl!g7BNh5*B)hy#K zziB;&uy=d+3&!$X!hNlsukFQ_@+i^n(i@KhE!`>9Mmu4Qs67U%OxO@^Hm8}r*NJOv=xlKE-AAaZvO2hs?|laYTjwPrR~z< z!iWUY)2Sz>CPCEmr3shXLS4c=95POs8N^4M5=JAg-PU7 zLI;81FLqKZ>Xh@~>LUZMB=W_yqP=!S2%(4j@<6@HLk^zS>z6MZs3`A z=hg}HQA?~;*Zt~oZny3lW=It+I6S0B?TBjBE}%O*C3 zTo{cKb2F7PQ%CekOG;2mTX2OPKzMOc?;mz4Y#SD?n#t4`T88>bQ3W~z{Uu&tWfPsV z*v?(ITNSrLgG$Qvgp744Vkg5qV?956Zspy}H@6AcJ9Nc;3uo*MWZ6q?xC2tN{OSu* z*h8tVl`g@F`*e>Ih0R}w6`#sB$mrNBcim!VQ&yu+!8{sh>UCfIM`WKKnTt2(TXZIw zsvVt1qEw}ds)-p&WldA0^U^x5k(k!m;Td7yjE-*q0B+vZcHxRjam3}hWu;jJhB}H3 zTiSo9=pmY}k>fD)#E&+U&x_9Kv)ng!`lZ^G68X2>2pmEJz9pXoASr6_Obu-p+ji91 z6}!6Og(WjeRHgB#dQjSUlC_ki4r&qTXW16he@FHc39=>{B2Kv4?epg{w51NQ84%iH z*%5kbl`b?CCsF<-D4!F>i@DXb^*6Lxt*V`(+R|y;@#%n_S!QLAwm$Zn*H=rnh2HAe zMe5?SQ0NAFO6GLTl1NPCF^8vfdk1jt8yLdzM)G)8dk#0a7F_Qm#_pE)q}nsYSQ(l0 zYemLu2`SW^WgwzK3IM?MAotg@mN>Rtb?h%Cut~aMR*Ot~UfsgVab2*s zUH1zse)DU_G5jT*Gc%EiVB14uwZK%HixL$lAiO2klFU|JD0R_k)oRo=saOMqfl$Pr zGEB+lcuO=&setvNVJK{q>XMdH*fN@mk`&{l$O&m}IFh0wNZ7x)1}nU`ykiodv^%we z=GmmX)0RAKt4Pk-x8n8&aircd?8@_EY9m-(p2vI2W7(&wYbi??cHUtNcp*z47euDe z7m^NB!-VB84n8CdVHepAD4@97%0Sda#w3|(o_c~xlP|L(WOFMr-RRm(7GKk|eb(DN zI^)!e(rsBjdy3eu<>|!&5>slq-J@KKla%5EAT&$5#*I}K@S1lNFa~GnA)!em1SLv7 z0H4q~XAd{7_V#B-wK;Hx)!JlPb7I=unHj5;xKJF5%=vMx?kr1@5(CrNL+&LCLo0o> ztb(+I=b%8IAPzXfI;Joa9v@aeqr!3gTgOp6s(BxP&e6UccFBf_CF#Pfv683^NCiUk#ODdYkPK3^>lfi>oM`jjZ}k17%pg!17c zs#hv}p)@I>{{RZswBbN7@P_KeS;xh1g>y+Fnu#2_(48r*JP!^~f@Q!$N-~^w+3m01 z?)J+pVOOpb8HfNC{{U5K3vm1rhU$MI!Z#ZBEq2H5RR&G6(w0g75M&`rN>?i?+oVP+ zTEP1A_eFvGRxP&p*7%_*V&4^*anniw+byM}nhzB#O@A}TIQKo(+oj3-qvmhA>X-ij zXyNV=rLEM6rKLqPVojw0d!x^9`<8b8>D&k1d$ui&w7i!i}xE^{Li4kzAY82)g#Xs*4}?V2<93@1{6;76r19v`C^U}VGz71W@V z*HRNxRV}mZx9j$Fo~?ASH3E@LTIEMN$iCl=Fc=d8H%EfCuJdalKVlMPO{7 zmq}BrcD}I@5?!A8FPXR-8kusHH(bg(Q(qGwq?5CNxYL&jT7d;HJWTQa;b8zAFQH`#|mc zF-nr=2OhyD8%?4;!xNIbOqj8odgAl8*wAD*Hpt8=iMqar+Yxk>tW!yCvV#WPr#eul zKva$ZPoc*8DWq} z8A|{X5+^@NBaGlpxT{u{`avmF+Xw{WM8dI>r->^oI&}Kvt{7b{=LoW3y{BS3NpKCZ znD0Zg4Tc|0B2B|7vErEq_RC~4NO5gI#WvCOs(|TJs2|0~HL2h0zy51!uI;N;j>WE> zO8Y4fpwX32EMKW@0yGsS#T4C-s9AX!Vh$45dOrZn$)`*cr&IjYlw$ zrEraR-E*Cg>?60l9@RE2`oXljaT5~TOA{ETDRs)O5rd5jb-q;FZIPGd1WR>=yDCbB z3(g;z#}JhfrNU9XLZA6lRaBLDaNl}vYAunqD)$v>0Sq)s zLHkQMAtRY8lt=8{w^_b-Z7qV7D5ci{Sp(rfGf_Sgo^cUNj$}ZD^Tbx96MplvwCiN|pvJ>XhZXe>~5q2|ZS9cG2)o)wsb<;5Ud1TCmzOy#b z2h8*jwI5zU_!%{t?nRUM5Zgwnd&4u8S+c^oeGPutN5~M!+5mulNQAYRP zjh4;GJ3&aKCF+k-Nlf&-oQ$&}V98SACNY3E#@yAH3mB(y)upy%LQ051MqrVUC^N=c z7}$o$ZjJkTcJmV5jDs4!;c+k4MkiyKMnfRLCR(bSKp5BNs^kNg%>|UgFO2xjVfX zLWQ+Dn58NbQ-LazkCDm3B-ziV0Y4ED8t(pmm&VUAExp2Q)=k9vu(!(GoD%ztD&c6e z;5SRkE%UQ0-fsQvyEZQ-Bs4y&ZLUSK<0AU&E+M40hSusVHtTCnvQP-y4>6>V zQ0MFt#xCwvE|~_Q3tLVkl7*pVD%J<2BqU7ZElLVbfM-4hkKC7U_#bflC4KGdGIt}g zZH7ZC**-`Hljj|ri|hW@xQknWeV+ADw9=0r6iQR0?g882wC;abJSw7 zJ9hhPr?RV*#dh<%vhpiz%ca8gCmh}UdL__IzFZQ^2)Iqiu`_3N=i)+SFv^56r8P7v zQjY~IO_O?U`(xJ4mwZh%wx!_fj8)P%QreUN1cwl|A8f1yg%F|+k?EWZZv(a0>$M%< zepp|qyHK>InyI6#Qx7EzGYL~}A;ugCB$NUIl1cRmkp!Mm_XgcA&v#ritkcW~=Pl0m-gyTxs{{Sh}yQ^>0?+)E=2ivB21sZFEAucwf zBhztgEl4v-1u6)Vl4pSg4JB>P>fqb4idZuITIAc%GFuI&BDbbM=sM&J%qC|ojl=B$JR#$(uVs^=QyX2(9wnRz+bPl4Hw-geF7;Pt0@49|ej(&as z@JXSge!b+=Q>RnP;mesPfboibRYO#*sppj@lk}7(;Jc}V=JtE_qR)M8QXPotR4I(V z4px=6f8{*bO2BXrl}g}W-z}eXZ)>?w^G8ZjPNc|;F&Sk9UeaHwDle&OoqClqF~koe z!Z11ajl8cO@1wYuo_I3L%fxSPzEl!c%lHmGsa01rG=#@c@~)l@{{WX8g)Kj0C@Ypg zODU-b!%M4C{V+7{-MRYS=2s!mR^fXI6rAS+-tIfqt+DpjjDtwX6}71cA3@Pf+PHn=rN;m`{m3LrQRs0W3%W;v z7wIaCIy*6#K#3h`W@7;j1oVBYy(KS2Df)Va2Ll^`DywzHPHI^*IL>}Bc(mMUO&cv> zf|LQLl!T!z?{y8r)VT5^Jd^5e_SVv?UxLDFIAf$7r6`=$F{m9w-Xr{pWK`El=g(Dt z4nxbI9!o>vlzA)T!agfZRZTY)GZi-_MfOU#du9#6Q2O5M*s5_yx-k9E>U6c1%bu+| zx$vfvQ6n-ZIexfrBq4K5gb4k>_Bq>Ua~p}ayQ#VuIv&rq#_ZXr(Desrp2LIZTYE1{eSa zFwiGRkU3+NxJwWuFd0Y;%uL2WS0X_K>O6=hgP({stM;>P$Vk6 zk279=XOCJX2pl8f)JXLbLb-fEHTa5<0UwtiLvu0^nN}E1INgy`r6z`l{wj|XUSv@C zpFS5#45fyDPuUIBKsaZ{Iox|nsZr-z3K2u`J6#L#{k4r z796{sv(l!J&Dzgzg(Ru7Q1#Y8@g#9QyVX%{wr#%Kwn}bwBwQ;1o(puzq$*g=Gf8%Su5}&wvw*CwsS6-|y^Ms7YN_RYDp{mN^y|VNy2hC zV>paH$r}%J-@NC1`>DUgkhb?5H+vDsWw?!HtS1H> z_HFG|g8AIa&;0e~xoBd4W|@N|%aV0qM>d3XPj>C*sNJyk!h`<+YOq_IFAzQ|hms}_ z@pQl-@_5GP_Nxzrw|HbrBbL~b8kkcqWKueQ(bclr5Y%^DqT2TCHk1#Ta^N+))W+$q zE2zXL1fDsZeWa5Hy{3wtwL+GueIZ6_PYzz-01@=bF?&VTwVQRt+iS<=k8n>_p8K-+4l=@H)kD-e8p~&F}q#G7kli< zQC5ht;9H&dE(JJJP_C(wX6$2Fh zHx}uordkilrQo*-7)d8AdGd&-e0SM-r{4>*p4;utDHyKF;QPIkUtrXTva>zP?bCDa zNNsIXLjIkCK)0~jr=-hvoQbX-+E!Y-f92zKcRBg~HE_7mrM3N_ihGSB)8J8`fPJeD@H(x z{{Y5XN{{fNBz#eoZZ5dZ(vHPVAy01s=a27HxS52X{1%iy%<8{(G|7?dowDQ|a~Qj- z+T(*)({DgIA5~JMp{ea4gr`*q>LE0zj||$VafN;IbtZYIKXLu02<+~@vtbn?N&-`e z6Cm0x#kChzCdVRdR<#d#Zb#G^aYUN0Ttzs5keYF3p}1RA0z-*Pxhn(p#AU{~)B>h~ zAo4K`-0k;xk13a+Tv~7vj*_B2+LU}e(WsqVfUg%SMKGjHDH?gqK+f#@?kJ=sTDeLc zDY?PhD+IY&Gs(5-wmFsMa$o&5+cEoNE=rFPz@inc_YgClKT7GHn=VrgN7vBX<5*`(&#Y)_Z(i(i^X?np-QtHo_)WwG;4(0;L`a z1~ZYo8{2r^&DqNLD(<&Ewc_Ho?3VR8MB4GVM6qSJB8H8&)D#7+Bj#~xJ|~T5ur_5k zZ?;7}l`>6A8tOi|d`~D%XUQf=Pau&PbG>{0UCQn&)%3)!#?roCjk%GgnYDUWt{R_F zTka3ua07r4F6@@sOYg((6SiAF6@}b3uebRzw=} zN}V%L5k7hSCCVe4{netCwnBkPH5v~vNKYl|00B`!l42~*wSRfB> zC(0V^EwJ|Y-Za*r38PBGj-E(KnI7DtxIXr|J&$v3_)gPe5bd&ei)^9XHww{k9WeF1 z7kF{lkG9XhREDDEw%A=_+Kn2Ph>jW!Rl>cs*mn)zZ@F&D^*PfHU`NF3r0aC!oPqYJ z%Y<&t!`#E#r)VvfogX=H7`CzKO*2zM7N7``Thl{l_giy;5h8t^JJ`lIW3)RW<=>a_3@d<8F6E*zYRcFvUU^nwMfJ1Da11W(D75_kP~q+)I@; zbsK)~Cr})9 zNJX3EcUz9+q9w}s?bZYop>i!YCN57#Zra1?1+_|Hm5B1LYiNS%+zSXKp#T6$=)0AU z*=iL{ZRwX2AhqcVDp1SQZzh{4)t6Y9d6= zaySg3mtuvO;Q4Gkn;FTRmv3o>#hr{@EsQjYh+dj4yWB*Vm~k3;YL4nnd`FPGx|YrD zzwJq(vEC7CNdSl8FD!{Y*E-uAlGzDD zhdHPd&NAiq&+NCo&Gg^Q=X^FRx16gx+q|z2!mXD#@QbyJC&}Q;uvq8Q${ zj`>1R%Z$T!S}I6MpyIExYCN3 z?rvLilc!#i65>N^)Di|DlAH+4EkMf%D!#{A{x#cP*(YgpTwLP!`w@vVF1O`Y$+&h@ zGf6GGB6w|!#Ab}Ed?udKI_PipO3GE`!P1|)U8qjPvTWMByH;)9!!9=EEoxOtm8njt zN^uT4659HzGYU(Dlz^2aN;BQVv;F0x?v3+y)LIS8V^wq=rmCe_eQ610C=9I#n$gmc znlu#6T9VM0e9Txm&KNH~HDNd$RJL-bv#+I!`ygN#%pNTt-N3IuZs0O8{kBwU57oMeQ^hj)a1 zNvh-Aqm-_L(y!F%f%p-`6V~J3Fn6xJ+`{V`)dib#&H1?E)A;hJD01eECn)!RMd3i zgo=KAU{3Vzf5!Kt=w(x+rTe6E^!!ruRQ=JSc3rFR>lS6!EnVa;6UBS0lDGT)g4facw_ zxw?0)y3zjt)6n^;s3+m*Q~JnP0336s*`EcRV&?nlw%V$$0)2F~p{ZtFaOh0DKq^@N zND)5N-L1y$gS2gs+SNr3bDAm(w;$Yq5w)*s7rJ7>GJ`~68l*|g2QP-ikw`VtCo#{iv55*QK2G$HoC?C#atpKd!t zwo)R;UB?E*txe>wp`;{S^Qmlm{Dwg(=Heq>CP+2&QQ|85RNb!AO}6M&_Y}10WD&Du9eQO~Sx~3c57{a*LIn6U*h&YKT12T~T7Wu|0U#uvRrvXm z0H+joT9z?>SrQ;+4SDY!Nv$YNd3@C$8c>h%;qzch8aq5N`Va7i+tSvRtD3zejX;s& z018Otc~ggh0#hRc4W>bfQ)jNF%ca`gB1h@Ux42N++*wM>0ZjoWgdIbdg?JQqlGd8- zp6N)%6F*Uc2X89NH>9AM&RNE0vPg=F{ma-0JePE^KO}fjLB7xT0zEuwPMy4u$Z=h! zDIb$6hK#0awEIQHg~YR(&wEfOh;W}F&>~)1N%zH${jV?kbA9ZewW*w1d3kh?LE!7pW4<`KSuQ$5|)^F zCS{Z%AvzS2QoSjbtd;hqoKdSgb-6Zj7Utk}y1LgKD|Pn5k`|{=Q7h1|QUcPjKqQ3x zGcprDuF`Gxh%>IYSu8-eTOvO?bl2Psvl<*$l=O$5S>%MYgcDyna`EEVPM4o?EHVn6 zT7p0sl@lQ^IESb$GTNPVgtC;C6UYHGj6oO=bvq%MPgT0XxKS;)RXV2Qz{t@4IPB7u z6roVwxQ1fNO8kIxSs%hUv)wjc;-G9hS4gF@1}a3H1I#95d!-edX7by$?v`lkl9#6~ zE1DTQW~erm zskOSc=+v}khM%6fa@LfV$r$Nblw>D;_q8}q9dw^)lhakY3Xt5S5YT!^ArYI50jq^i z5SsW<`SHAWwPiNk+SOMInJLnVB`5clfF9E*=Jw9o_Y1xKg8bVWrU%-W61=4$kTX2w zBS`-MU~bB?jhF2W?%{JwEcbUWxXY^Z`|Hx#eRm6HGdEGh8;o#P_<5FS+FWPY;>_eRq%bk; zLUU!`s+izhCAX$J9BHMvRMOo_h6hziDyRf$C*d5-xTtX8GlHY_X=o|Q0{7V_L?^~X zdXFjkMr0BMbJE>rv`5FW`*pI%WV1nH-Dk7f;j;?gY_`N~H4-E!QBd0vBF1P@2tWw{ zac7{UQryy#lZl@ad7d+d6ql4AQ_jjdmI^e3Qlx=FR?Sk5eh0|$ zc%frJkPtS!)Zrxa_QcliUyOG5vRO{$<_@Mjdv%rkn&Ouf1Jam|oi=MTMMM=yy3JY} zLVR^P4LNa#e=wVlw|;N>9^6<7bE4`|r8z30!z^XNwBk<;Ny;`S<^KR@Qthp#_Uycn zz^H9+IO4zEQnZq_uOHzGAbq2x3`mTcZf5b{HxDt*_eU(4udik|dHEFb6t0{$-f>1O z28mE8iEV<~8Ekk2wmdk}HI{o{Zni^KdPxSU83Rxs8C<8#;dCw)J- z9SUui-IFbo{VHb0mQjvc8wm=-73x-MFzfpw>_q*_-%bAj?qR3qTQ<)w%F`OxV~XqS z*|N8Bc`_P*Ae$X3Lo*EAiTB)VQdE*q;;HHfi0;@~sqK4mr+!@NnKx>MDT);>2~yey zW}(KEK~f0?EzL5Ys80w_c-1|*_mvjWrdt014x>lR)`XP+vScaQSQsc06zYMW*_g&P zadMp9n%6qzArstO~R#Up0X|el>mF<4s-|p6}#K^J<)_fZ$ zvd6^kOv2Bdvh7^uT{GLg;|_+WCBJW*8q)Kuu&{zvr6x@lv`jMN$PcgK01^q|HQf&UI9TQ9v-iRlYo&p0t&G+FlO4XHrwT{*M6~FqFt<)n|v#^n(J?MFT=Up zE)mxiAS;)s95_T7aP4msh~bsD8J>H#5`0q<(|J}& zjo0{6yB1DnzJ`L2%FMP!JSo8OzR&I3Q>v@k6?a{^SWN!_^!le8V4vcpbh}KU;2TU@ z-|i({*}s?1UGYCc|*TH&zo$LfSUFl)bsi zf?74A;N0DjkIQw@%AWlk{{RkLOEFj8+aIA-mR-?r1K_M=+v=n_KTaKCN<7rcLGZ>a z)tgtccgZT0UH097?>3=bOONpSUP$smmyA0t-S*!wXA>WIaa`kWTK?6BNL%o#U z&#gkwwS?UZUgNmOZpEx3L(2E00{vDGxA*I`l| zK%dqjl|A8=39|6id}ZgHF1(u^#0Ac=!*^K+-CNXQJfNXnTH>fjQ6&EWxOj~;i$)Et zK=L?`uOF@@o4mdNE0TmDO2uq%8o{|vfK^{a<`F5Ba<4a|7M`c$pz-tv(eb4!^1z>d zA6z<3)s^6&K|bg~nTOvS3NV)fhO*>A4^Fhlvt{W z0Myji@+bX+hfS~$B`jgGlw}W{zp|X8FSJ_9NsI0TnZ$Dmi5W%bwUJOYAsTa#7-pnix z_YJ-f(yq0&%>Mu&Hf!yc$#n=WH0$x~?Bmgb7ea(yv(Wm zXwF0+>JK=cKk-cYu$Xk+B5oUoirAq#T11-1$MX7FLH__TpNd^Ef7^9uY7L>H0!eYS zAtrztBp*;8H_m^@jR*N?*}}=SKN4DWy8NZ!k(8$cF6CWKW!L4wm`;9YoIYL&1w}xl zr9TQLyp1YA1XGtP@umZ7o;*wp&YZ?zdm^X4>Ai?&UGigHwqN$gbSztUx*e(R+>PJB z?RmYnea~*QOM}kilND;o6=rTl=FKUY*qmQ)F{UOVEV}z^Wa>iDjU|`mcNIS9Z%V5f zD4G{N3k|p&2{Ob?i4rl9@DcjHp{s?4qi(*Xw@&+RBdCdLM^Oa@KpY87<_1$3%orl@ zUhFrwZL#Z3uYdb%%`F!QkbvLeDr1Ov;0 zt!?VTbE{MOYN++&rNs5npAMrlT!%F>pBNI+ZSC7|*Z$3MSRcaQ5@aC4>n&CTR ztW^$8Eh|v-ZehXXPz*Jwy&{QSJEL#Wul{ptY#$|&p!tOn6IjYElaL;bEr;7F)|VN5 z4y1~5I?%Nwig0orNNlW9b0jGL@d7DRr(%Nj3^apN`ruq2a(lEQ;OE~xBTwfs%VM* z**@s7Z7QP0@tpBgz4=CaH(GKnzuh0(HH;*MWO$xOD7XA-g>CG^erCAlf~sf^$7pip zz&+}q&*hPe82H}4I+8zy6-_AN=A^+jiaw`zUaa8NDpx-hG62Wes2_gDz2I9LYj^uo z&Lk%n+>NQq<>i))O6Kcr&K9|gL`<<3!fK0+t*NZVp4-h8HspEzP;`=b4R6Y7osWE? z-V{zLFEr>&g+fIxB;u9x)+Uk8Qi3+`-837;ZK3*5%ZjB8uSwK}gnvnB<>)fwf<#>w z@@^!J+hXaDMxQb^-M*G$n0D2o8~GElRvdnO+2JNi?W&lKEHH&3wV|-J>eK+}PTr_? z-A6}sLtQJ=tRdwG1j{AF1qSpS0>V$IkVq#^5;2}_8&ZRFQq?^mtCg4Ma%7OGJ=}9 zCkvjJB_RqxB!t3gK>6`h{`K4nPfxfzUY_ERF{`vV1HLL%E9z~@@sn>W!6qyf-GJ@= zbG>fR?{}>A3dJ`2>twUwgjP14AaEMcv&~Ss--mb$?u)W)rtNrf>vltmMz%`4+2>;t zaa)`vN4mmk(LOAo6q1q%DNdC0@Z&vGZ(iL|eqijv!n(#T4yopr)nz-(I1;v0Qe^5< z52yj@D(5)USDwo6Yft5F?5)s>C+eB`T9mynD_DIWl&r6da{{SH`ooZBA0f$xp0NmL>j}xs{xYdE7M5#V;3*LKe$1Wm6mVB07vDX5V?XGaTsZv6Uf_=avxmnoPc<4PQ{HNg9ezBMmHnw40OnFR5H|J2a~;y!)AKNB0So@)}B(q`gB`Ki5buoKN(H=#+9kvUS$`XkSl$f9&a8i+}T-pLncMcS z{ifW|VZY+iJxe|-RMby15yk*zjwaRu1-cz$6io z^rztj9C4ly{M}u_uy%8|yI+KDRv% zQDDZEgyixuo1B>PQnePX@K+(=gm`>*&rpTvZ`FY(gow>26Ns1|B*;g?RuT%Oie_YI zFG^HWWizM+B4atI4B(T&cM}NQ>~7zeZT?Se%CW1WR_(g;YIViLn!|6uAKWq4X@}Jn z*Q2a9=|@e_lB5+UpAqX}Z5cQueg6Phn2)X{O}JWc5a-$lF@*8tamzk%?MuXuGha{y zic^_Q4JZ>q$Kr{3Lu?GkAJN1|;mM#SO}j-j@Y1%N0ZlkRi3>p*7N3Y9f;dqvEMl3$ zI-5SC2C#F1{{SuRyI}Jv>%3ex(#2=U7NX$FaCJ_=a$xSNm(A}CmtvIrp+cm(T?fn_ zE4OWpwC}6yU9Hrv)o^z}L%{P6x23>Fa|*!4vf12i?`LRI(p;(>ph%ZR@|u<<`=zRc zx`30&0faG}*nP&v0AAO39h^a7vsn1{>)9-OsbZp3N*PtnD8@4uT1co0Gv83JpA6XA z7mGr4?Q8YgjRPj1T5H%6;1N_7;zt4!@Q<~7mu26U6}&dJt>;LRpP*B==ZyZ;n=Vt8 zd9nm_!Q77WHsMF=du51jZM6;!cP*UUW#hMXHlO*wvUeq$WHmUtf2PgN(awOL9{wlX zN-s^)g41|leWn(=C&=bd@O7em1E~=Z?#Jy7)Row;w|gByI5lvl6-*Bgn4=|Ne-fC= z9hUF7)-8{|)GgYy=i5UpC^WXWhi)&}<*!mmNiAlUi1#c#_QJo6Odx|^TqLdKwpk$; z`a7+m-`;tJIM4q8oX1(Yc&Mftx!E4zJlTI~zi8Z4!e99c#+3G4X`L+81L4!07PvQa zyLX>KYUzyLta&}XWPk2hhDT<|prkAKRAEX|(7N*g`l-a_zwk@rdh8b}DzPk^bp>A3 zf>b@AN(Xm~UgX9o+L;S-r}78z6dB8q*w)N>f7x*SGas?|WK% zb8VmYw%Vj@)VU#~)V!3bL&aS^Dm;tI@rt{9hMvb@tlWiY zlxfm3T7emsm;o%ZgrFn?K`TnTra!MB19F@yNa{ZAW-R+T%f#y0SaN} z)|1Q-cyMW0e@T6`sz(Au$UG&)dCq*J;$3_owiJ3~VlxDIgMoqWZ*10U1!V0$=Wf2! z$O|iG-)YKZWth4M<|C^e&jtLo7*Gunq{W~FB!kb1%3ABSG6Qt=l>q}JI8ys#!%OLM zL-`b#uT^cmxmLcTv`rz>aa#pc>-Vx!l7E>BpBP1va_={9^?PaiW4%_iB$iPp>N{za z$ZQYdL+Z#e*Q6*4bD0?>UP&BHvwEo}Rn&CvAbqA*x^@2m*k4_uf6UnOh&T3lKq|Fd zo^5}*QrccdKl2*tI0uPB&zyH+9r8JZ29_ zc(GgKriAO0A)Z7PQncYK-FDx0(*FQg=Bd$ZQ4F|ivVwJ&X!E4V`a1z7yd z*CgA;Z4JWqsR>_Qr~>V{a-ix{dI}lp1$6ye?%Vg}ofLY@Rre*+)GPxew%wk+NYrxBY8ynCFeXG+uW9=- z=XjrUOC9>dCh2U!dvV7t7k$afaqEoBJNLVVvRsv80S6}d+4!5+i&OEWNKMjv;ycZk z3SEH>=2cV*aAVunTVChgwO8wnJ8s!6`c|YZAxL(l88DKQFnww2E1Fs$=M?JKZpO<) zwW%E> z!xJakAYN_}tx<0GV*H4)ZPxy@glKH6$bBG|n@~!KDYZ>gSf$mxWEM#(GsN-#0B%rE zr?;VsW~gY85lqSgQNVgZl0X^Y4m>j?L)yi;SVm)az1T7AmIcb~V7%UO+3i)*jO{; z@BaW{mw=v7;e3=RBrRxHAQTs-geZf^RFw)-od@~w?UV`5D>aoGl0gZOo@2-L!%ri_ zF)Y^CaI$7N^@}UBU0C*aOLhL&66Frz5UWv*HJ963WVNUTX*{X{9QbnW6&*{Bzf!|a zJkgpIv?Xdm=8~XFPl$*{ulI{{F45bn>R6_D6u5@nS`f6EV6-JcD+de+BM1#AeX;v9 zX8!;uGQxJ&X4K^~3r@drG&P!1wo+W%`Kjej;VF_ zkmUu<#E@R4TG()doXcb-K;}Y_piGGo2~oJ#?J2h2=`Gh=K~hSo>#16(Wkn`w^r!_S zf_@|^DjW5)T-?f(E0zPYLUeY)>98!QF0agL2q zU!!EL1q$^Plb!dcefO@$-Y)IRD%LKx_RyU|t&|rMr3_GAW235E)RJ+=akRUC`C9E4 zcKdxzyDMzV+uMQQrD>pj=GjsbsU_Chc~1m`gwhOz#IVatJ&^Y^2f00f+kEO^YCZmS zsmne62~iD{W999brbk z9Dd(>3iK>*q1HpK=s2M2_lytK4z>>Rw7q{|FyTYRU};d1K3qMKm#@E6xY*|MZEU-H ztt~ULY_+D}X=rjfTVnGG??avoRV4BrRpPJtM?kmPulD+prEFKAkZ>YtT)#vRKQuPA z+%MK^i-}f;t*P)Np=3yoSmPB__IT}nS9RU;+;@X1fb{*l*aa}VYM*T`#JOfONlZkx zr3EFz(bZA>Ar+{n1`WIgZsEFj2B-QoWmI%Cl)B4F>pGwOCW!<1+)2zvd)_KbR;zZy zq)LC*s8v=0!kv{4lVAK-!cU42xZg0q@ric$%}t8zdFW{ga&@`Rn%1zIRmkc}nORT7 zX(pUhD&29)l{k-toR95-J)Y@PZ=-IRa#|84Bg6JXHsiH(Kw9j#cy|#)qCCW#e6j^d z0IZf4enKMxmu@0NHpqnl2n8r!O z9V;s;Dk;=Hs)pM{w1g&7oWVc6;7=T79+dLb+ia+*NI*G~W=SNIJZ5GA#NY=go%*Cy zo?NL=Pmds;bsT`Y3v zkf8W-_}B5_P??E%!Ur&}G0wNu&rkirnrqLIH0AjY7fKVE&Jb3thEekO3pJtt0C&Qi z`BRZe9t8OK@TW~YVG=n<;nk()oMH4K_8h8QVbr1497!5fhZuA%wWsq3@#E-Y3^F1S zQ<5QR!D%z`67d{Ighe0G9inRcCnmRT?lWM?CAHF(ea3C<<1^)=y2zOAh(Juz70efs zvK7ow@lU_@=Vk7Mgx@Wc&pZsniBC!7o@srehf;h(;@wT$UGGOoC=qn4cHEqLPdI8C z66D+3(mZs^V+dVFEq1r0{@=`R(2^=ddz#q2#0Is}l*~_EDCOW4PAaMGW#-TS0NHz| za9ffxY4=fbryd-Yol#!^8LcF+)zU~h9>}yNcd#yEta@r}| zD{!^ex7FxQWHzsur&^^mAf!y>BlW*$cGGm%H$!Qtx!Nucs!0xLsb^8(R5UCPFnnO^ z?CZFgx$H~sB|W>NGMr(>p%)O*TM`hBT?H)!I7ulfA!!N<9AjSN{$TbubZCVwwt}+X zbSaXO=7l0-92SH6QXu8D`&WP1D zxGqOclEqBAw^n`>uS$bJ^B@Nt1DXefU-u&2rLr0-St{poaWu^*?GUm$iUXFPK|DHx z*njr3vv_B2UA}ED%;0UMSpME%`1Ug%c8-&mX%_2jc(bohq|o(m6I*st!9P2snvzc& z<73&ZbQVh3RB8heP*^63pB0N{i- zfF399DE*}pc)Nts5Rx{ejHo^Cx96JB@jeUJie2ZalbK0<_|AV zFO+hxsa5C8hpaF`$3LbJ)zyM9$KCIQ<PfFKDd2qgeulY@P}M?w z%y7Fb8mTHx0I01^R4LB7h}5ItDa(f_WMiEF0B`D#5+@!46JDNyRFx$sNzzFGRQU1) znwt32hbeCvLUJ)jT zQR-HtiVy);D*hZiZ8GEZAZv!i?8Vb?tQ((j+FiYsxVX#HB-nFTu`2<}ZE`La`PQk9M8A6h zc1x0=PkEL8sRau@bUc1G`Xww>7TYhUC212A62Rs#Jo1SVbhwljORCZ^0(i=NKS$LS z>-MniJ?_;zTCo1(fRygm?>qfW-5HM{qGE1W*3~M@kH~dHuS|Z_@*5!fL+fzTr;l_t zcJ}3(pKdf#UubnIR5905ur-PC4GA=p$4OV(F!O1&o0UyQ?0kA(`tRG@_?*q*doa6D9iO}%IFxym1 zikg`1k}9s(OYPd@2Ja=aa9ztKxZT}y;qODPEn zN+Bweqyj(Pl?54K4wUHw1CSYhn3tr@cUS2tw*u9vXymG;-CIkY#)aTYa-riks9I8Bd%H20yYI6rce%oe*`)`Y! z60oBhWI0G@+PDQ!;wm`<#wqQ_#jEZ;`nL6W)T&XfZYv*Cu1p~y@Rlm@0CSF$eqlS0 zLD>zRZnW*`BJk>v%`ybN47H@Z;ZGFl`@E!7zX*sv&>h*av^$x+otbW>{wxfx+WZ~N z+Zoc7V!_TV1~7+lyI6|UTUzB>*^2yz5mmDESt(HcGI$nuQ*GC63*{BU$|^q*X00qq zAgNtavC#?Bi4GH`IAT-;@r>KJJB$7L%Qst_Y{=4-scH0uHHv{yI0ZIJ(yVz%Md@w^ zbT?hTmBGma6e>dDTAP&gc=D9WXl{~&Dr~&tjuNIqs+Q402BJ?J=HBhr%SlR?z+-Uq z5Nb5YlsKeS?5*Bgvczo` z>!Y^1ykz?gwp61j0OD2@l_Q!)l6l3$V%WP^urF)5+&1esR^21g>+VgSKXM5vO1RBH zo&bof-@G4g9n<$0ifv`2;eM-*C0 zkwPivI1Ki)w!PKa3fv!v*U;CwbX!Y9sZyF!mXhYOq%AsI^r%P$>EI<6zVvS1-fzTO zKL>5EEeGU+`Z>7X84S? zTdz56w;g&!=y@f#SX6k7x>^dIy9`ydD%fRvJ-FCsY#db#rF%u~;Z64{*L=TRhKlz)Bel+fFX)BgaLsyN@`6xy{RL;O5A z@}`h+PzF6A*HCpOL_!?gdlb9WTrCk>by|s&1Nk@7s(9%~=_uFYom zRV_>?%|1B(m}6WvmLs~CW4)G_N{H7sy(DwwnGBLY#HWQtONk$PnT})jM4K17b^icW zGA1MIw%=v8y1M1Da~J^s05NV*me~TdQA>4NY6qHlaEhiE>7140gh)45!kLEdJ&Kl~sF|pmwHGPJJ!o+tnJiGKKLygC`Tdwfb6_Y@D$5h)9 z&^n@82~bK~aee^@jyUdAegS@Ny#ywe^?Q}YJh3={ImY0lqc>|h+5oDlvJyZOBp-mt zVowaS9x<8?#N8M_ac{m(MVjMxNZD4!_BV<#w_AUAw@YqzKX=Zi$eyd_M{APZV#{hy zL2$Yjo^47CZr2fMBov+x?OQ6Wy|1IOxRoPtZp)HZ;z%KBr9n=Vl;)YCEzB89tg#e7 zxvt(1Rp4#=eu#;QNY*?EB4S|l@k!*Sd}C19{UX_|(U5iYA~4drpz=ZzlC!3@2c1X# z!kl!EYuS-#+tilyi3XTLeV`Aggk+2DTC1+_)f|-Sj(jFzUCFJWeCZ;EMDhp1fGhDN z{&eDTH04UeftQv%xkO^HPcTIOo-mg#dQPgUqM)n&(w=lmMJP!p@!~G;UUSiHP%wE1gvUSlTpZyNl>9aJgdW$wW}CSSQ9UFCqF4i!PKEu8dQ@+ogCAs z5l~G)H2(mzg~NPh9s&Cx@q}p?R00s?Lz;mK2B2~Rp;Y7)4JbKNp9-P597YlOX;OrQ zahd5y%CK7rR+OXxO(caV8u$)=H9YxwaN!NiOlS1M64Qv)nEFl=U$~kIt4KdFNYdC9 z0)c1dRcXwc566coN#UQ2c@2rj|0E&9arz!;N2hP5HInn6TE;IUmkE%RqC)YE8 zm(%pY8F1N49rgq{mZ`7VE@lj3>n}DRw!YwHDX*jl8r4q@U~vL#9ZRKZ0cbulFqM;X zJ8zs#X@!`r^QjC)n+SkBLjwkib8ylUG!LnNzu$c|VZRS3`kv?2X zQp7e8r=!Psk~E|?lH!5~)=NA1IDylxAZaH~+0MMpO2!hkxe4APYe%o5ntv4#Yo@{hO5 zYO2~RS8iz3p;2&msQifqG_9y9V3COGFG@U9tVV|SV{}or*sP0$RYF|Q=#OiT_*iC$ zQdIGf5TL$;O^Q@`k;Sr}optppdD)UlC!FI*H%7(2jk+dAnr53yK;)1lCF8~hdq;hk zrPkSVkuwL)OZfa2?pYABwQsq>w?TG8aG8>aRXQWi2~yk%ZJ>hck01%+)lFq24w}50B}?7EuB|&cz~eN zl7!DSs7MKM#KZ2=ZF=qT+*&JTAW~4#As-xGlA|-9w8B zaT7o*maGb8A_*Cp8Ao64NU-jU8=GqEs&jc1ia^&O;)Jxc_l(peM7|`Gk&Q)dhU}a5 zy_oWq4qSI(M4xD!g;U+Yn95`}stSh!Sz1U{Xi|7N{$2Z(Te=y0Xl^IVm#RTFR--jI z*uh9qKN6cfb1CwUUw1=jw`D23ThXC~ETQB9Accb|%YY_x9O0+CJHdB{5q6v|HRDoT z>RoT~B0TFc8%ZH>;yTJ)Dw3rDRzN92d3c%)hiA6ilK3}AS`HEEZA1cmO!6P3z*4f4 zan(?on>{1$QKb5uN@wO01}0oc5&{QnUwaVo3%px4U6WaE%XpSi7HYkT<+QCRHEGtZ*+N=M;d93lFa zPBKvO5{VY?4y)pk67w*^xos81YF(!90&;3fSddi_>H*ORB9FD0`f`uKb4aPD$CWBa$B+h`#|lV73Q+=N zeK<$pxSCT{M~R{46nWH&>L=hh^al|LEn;})1|!Gy#~E=%kcBK2a?@Q})S>`2HKDJ= zg$$A=a)eS;;=)J8gd4kSY&hm21~Sr=OPG-^Uw~G(si7qK(L8f6^BKFBxp%v?l-|KRmB6*cwznoD>^k+T^N-EAN4PMpO}PzDD1uuA0d_0zz1*usww<=#Ds{r* zR+OnBq_njyc!MH|B%p~9y&xQ5jek$b?8~KSdCGC}(hF^BLbVm3G=Ne;lH8J1CoKh2 z5}Z}n*n_rt8)2~6-dlZ!TFCcea<>NM)=Jxw#hP0Uw~xknxkdV{(V2fqr57PyXM+W( zr?_937HOIF+U(<|C6QVT+&F(3DWC9&qbii_?$H&!G}qV7^-no00N6ZmM3vxFV@xsJ zOD&XxKr72oudA1+p8%TpRPoS|%21GjfO8fZ_; z@`9mXP*Rie`0?osiG`0d9~>kC*#>!iJYl;oa#l1pu#XU>bD#u;dFd4c#=a!ehoP(` zEU|`|%#k@tUdZHB`V|jJ(n$iKB_Rfc^GW8P!}1&`h6zZPap6kG8R>zGIPOL+Eqs2< zZLy~K+(i`3mZ_nDUeq$EbxQdQE&eQD4G80n3FOY$Fe~FDUv!Sj*8r6Ag(@ zs4T5YDFB5j#ENo8q7oITiV{c1&xZ+aV9PjiBqTkjzXH&Vi>MS^GYmW6Zb#<~_J$`n;mft)Kor7l;0tj}H%#K0bBgnfoAk zbA`q{zHgNO0H^*RHF;_LxbVMZD%a9c2JX*8+b7)r07g1`&;I~F`j@)-f8_lm`JT7K z@ZwI}s%KBlPySS;?bU>#^I3`YJ)hyn&H-HO=>Gtz(*Bs&T0i)w@4lUXD@hS{{ZX$r|i5%I-cM8tsf6Rj}kBI z`FAwy)uj9yb!Ed=5f0Xm#2DAp)74M)HE7IyS}~V7aDdOdp1OYoOW}5YySZJ zw_WnRU;f=+{@0>%>H4~VG4>@szuW0`I)14|H(RxRDg7SrSF(3Uvgq~eqtns%AEni= z$*-2GYURe*?v}5>sxHWX%Kdifn??3#9^#k1fVZNvJAF2NUwtncQoqospPiO7)bJfK&W@-NbrL;Oa zdVXo?^rtEMfAbpg>q=77=;`Q|GmRUyCI0|cYjsOs;mpgeJ#vx%0Lx3$(VX>b_4PII zlo$k;f5r^A3G@%e z@g7{bc=F*Ws;pbueE|Ev*}8v!SbE;;>wjIRN$!W%zKQzZwz{3>e;biLhwd*oejfA2qeb^Yq^#1@GyHDi0y#ev-`H6o7zVD~c?M^ed_h{Ahz1R1jUe)`r6!!lBxO!i?ea#W= zKc~M#{Xebhr?dAz%KJ{Yx#eC5_THEMDxlHw6Y9C}^)*jXo~>AG{r>>7rzp60J74`< zuGjdMkCdmDjT&X?m&<7NX`jQZ*Vfgm(-#Za{{Yti0O`MC{n!0P^?zsDtNYjbef!^| z^we~cg#s2SJ zeuy9U6Xrj&EfF=sr%e#JvhoN+Z(6RV(HUPk1n55o+tfor?0L50GVIn zuN?!uPw{tWIqE+YzNuj@UJ{D_(9`{;N2jMQl7FYFUfo#g{ptOwz&G6o)BgZp>L2vY z)2aUe=l=k?{{VA;roa6^?SJOI$HReda(Z8d93e$qiF2F+*mtw~_x{WKyI#Nl0LcEi^nE>4S5NQ%0MO|CDeCd35S^y! zbW{Dm{mb(mOn(6CeifJh0L^{Ozmo|{8+V3%HGVVwqtfXA0QLEN@A-cV`^ouZI6H9f ztMx6uNZrwFipfa`rG>8tm)j+|ukil>v*E)30Pgr@#t=Ur7*>a?PcNxg%cIlL z;5>EubpCuca$oZOvxiO2WBQrH4=tvLI{yH&bo#&fCa$-K{{Y8+wSO)gQ_6mxulX|n z0KF0{YX1P6^+4f#_B};(e{AZhuh747Y5xEZefm0oE+^U7$Eh#k)B2(AI!DFBIek#m zKRUjD;`zLOW8?VzKOP>Zgfyx9Q`7Y49k!Z%THC9or{2Y{y4UUh0M!2gozeYHkLANl zp0C56)2~-ae+HddeVtfp9B~H7=aGY4~TSA(ZiyWrzEsI=}R- zu>DWn-%tMlsEdEQud@E0^*?CjT_5Tfw*LV8M^~fP`d_jAEk5(B`o7zQyB+@k_HAUe zb$3-ko{>-s-zi<1mqiFhUT73`Re>3!2f1%d>PL`VU;FbAIm-n^PR-UG{{{U8f ze~kQEeH#A&fB2^?A|JmK{@JFKw84Ii7HV34&R-u_`aM8%;KdbA8n)PYt*7;TA)6wF8-Q}y}=c>Fe zC94U0C;H)0K8V#kxXO9))5o9fhjtUI>OP;}dbINWnbY@GukrQ2OQl~L`gmtoEjaWg zKezrE&K48UuZntj%3tjI`N5lD`qxD|zpFhOBEP!-0AO`~Reb$F=X6uToV!+(-em{jdSA{rzK9Yq!@}JY&`s4rE|E+&i literal 0 HcmV?d00001 diff --git a/tmerclub-auth/src/main/resources/captcha/slidingBlock/2.png b/tmerclub-auth/src/main/resources/captcha/slidingBlock/2.png new file mode 100644 index 0000000000000000000000000000000000000000..b1482d48b4f2f323979ead105e074fbcc6c0e6d9 GIT binary patch literal 21367 zcmeI4c{r47{O~79woXza)EQb3V`dm*h>XKiy=5QuBz(svaoDMbJTQWYecn9EsM(gFs3up3WGoBc2Af#oH0d%A#YX_e8-&oU-U)IX#%3vpU|MsO?R~ z8++@UV7(o&3OG>}G^diMBH+LYPs4ycok(O?MNehXFMbsPd8rvH3jU%(b5s^pT?z;` z(>n-Or%>@=IcX#W3ztQKmz!jkWQ%5u+;TL|E zdVUE3?@9cH*;3E4*_So7Jk?47G(~kP9z&y0O(+x+dU?4X{5BV0b@ip?DGwIc!(fTz zr3sQyg8pdqed&Dnhu6T+@Mypm1%V+UGAI+cydv<2KuE$+iZIv;C(D{Y_|T)^hy<_i zKHzX*Z}(%^!ULTM>t$VHonVQg?+P99EG)p*mq`XrdFw4i9xE+bKc6 zH?Gj6FHl8w3W-7mP79BgRf7Jkd4<)NMXRVocBNs+SiFt~8fcIv5^;*M2si?+K(K}2 zaJDE20to=XD9GAEPzqQA5+y5(l7nNuK-AM)Y5o`28WgPC(#8W^FXt#61q-c-ZvT)!^fQ87(;(+Z5Lm(h1q^t}CLy*BCu`);k0;}+C z{W5pv_bbkFuKgDmw|_lzj8!Vj8}c8{+|R4N|1zhpENhqj{{6-6Kg+7iSIIxuE8l9M zzt%TPbv01vX)I?Jt)+apH1YrEat5eKfIAGu72LlSn2cTue=z@39{uVaC@KHG#*{%S z0QDan50S^%BEHs`FdPhmvPA+VAy9b2;6SOoe5xy){VW#c-kYra=Vm zG+dV|W`z7#n;$!VYH0r55H9yE+84_eJzp)C_sxoj7++>)xfOUs0z938(jU*Pm^6CA z{O^VDL;CN1(>*eS&`~fVFmW+LiLS%MMMuGiz{JG}CAtn17aav70uvV_l;}E4TyzwS z2uxgzP@?NFanVsQA~10=LW!=!#6?HJh`_|f2qn4>6Biu?BLWi_Bb4YmOk8vnj0j9z zj8LNMFmcgQFd{Ho9TAQ7|GfaWO)PuEWGdN5P1|#Kj0Dx(*W;9R(u-6Bi?t=sHYXbQFvTOk9jmqU$hm z(NQoWFmW+LiLS%MMMuGiz{JG}CAtn17aav70uvV_l;}E4TyzwS2!D%<^ZN@A@MPdE z2Ohxd47jF6GJ#hifU(*}dLWSZP7vtCNf7A6B5-^I0=dCJptnasAjNYa5I-g6NR<`{ zw4q%`L)FBy^IeKpnDt?=`+h^+pUdPaJ=cqBWNirV5+`ChqIiXEd5EL657Y1avF$sJJZ_NRuzBMQFr#eSb=W`7r4=4PO7^Z1NPjc@X0WbLCQ`|5mzlM7u>t#=yL{sn6Wtj$**)_uRf#7Z zhw+@nAm1lfd;)n!HoA-yV!N!8tZ`0GpRHYlXLTg1lGjo8+J=NHt#Zlxm^5`Nd z8K!%uc~Wk}i3#L68s?dv9*#GU-=Ida)6G7sc{@!S zw1M@(fO6^D!r=}X9b=_--^YlQ42k0VcAjHRM%PR%4(qNda@r?vr6%Sh2+EAjEYxDp zPmglo5(#YUJR2`3no)~!rZk;~TZAG)?y4P5aP9iz6_?6f+Lf8}z8JyYDbJ?{w+qYo zow(!i6El{(1h#c5pNe{=TP4BM3(~(5s9k_O4C%5F(No5T^@N>zbSqG#q*@^Y{H zRJe5yuIm8rjK`-JZe}r&9_r%1k~eqcbNkq(!UrxX36T4suHa^FOJOvsLJYkiVpWqP zM%*2a%rh~t+?#5Y9nzW`)C>M{W{(%&aRuaAJFAP8>;@017TR%o)qOpTpUnJaL8;>@g1;4RG2=nf8sAE zfABWHake}PtT;Ao(we_nIE|*negx?z6MIs*1frX;&-p2yy&jHs+srTz-KnI?s+$E9W4Gl?r=-L zxaUG!)<)JfoL;~8dPK*c8sMUpJ&3zDHMfsMeO_iF1Su$pV(DMkvZ=37y?8IJAOk)k zJja8n_Ajms&2s^h#V3LMMno%lxe1~;b1$Rzj54(t3Ku`YS#t{%R<5MjD{Ss z(Tt9#>Sa9@0zt6LTmJ~^CO^ncjNRY_v5rJ<)w5rvb#zaJaW=`fz$SYuth&Dto}42rdAfam%rJG-xpq2d~GZac)s6gas zHxKx4=Ix5##F9X`)gT+GQUSUBiMy%=M2xZ3-h*?ntYsI0X&qS~U9hwKe0ZEuY)NP! zW~%@2!a%aefg>fNmWCSAzr#xW0&hR}p3ZDOneHbCyE7~qk55EJY!%V46;kiGDo?xk z!ntv+N-eZ!*70TK+}y38+}t=*S*gd58=o(9Y+vuOSaZ+!ykr7le9Eg1v-)hto#GQW z5^ogURHHPK3lQRQN5ghifmad1a%|~xMn#V3C(R8rFH5ECvxh%@PPjLk=I4@hBQ7e5 zm8e6tNmc)tD!f=++B;z|RyveA8y5NdLfEU0-8x1@p`4+NP5kK3UH3lD98*~c8QUhf z$MfD;@!=CZC-z%&^T_ARL^)B`;oIJHztY*D$!_=olafdB&m#-NS-`yFty=F4s^WuK) z=W1k)fyyHILx2IiH^}M!h5)Kps6%mpU1|SRv3nof1&*X1`$@!ujNn&Ld}PzSu?U&#}Z?dkHCd!UZZe+;X`RWoq|vUY!+ zK5LBj_WUTb_TBmCr)!*Q#xyKM!r?7$%Adfe@a8Q7*ysHRB8HAB>cpH(fa>|ZerX)( z;=X$@M6A)}ZL9J0>}+#;d;OyU$#_HIjC zYr8{@`4{^?$Qr!cB7Eb{Sb6E|;Vnl;>x73I(y;cpz=5jM;RA=NXGb!hv74Lq_Sa2& zl^kO`mz1a~smH@gbK~#Wb2H5+N{kyDc!QE9{;0krN9cO6_?c%acTcVUsI_fYY4J=> zVZ(Vvx3_s$E??GPnDo6jT{JN}GSx&J5Zslwex%&AE?P(tM}46R~Gz?+&|X z3~UcPI(u+^_VE7eQjq3$mDx4iLu^AgTaIZ zmFbu3ea6eMYxku!4xM~zD*3itN!FteC+m z+JQ;4^VQV?dNI3q5A0r@Nk-31jlGKS=$?_UGHP6nx%IMZZ&c$zrcu(^r*@AIFGKl1 z`93_>Ygju#4C0sy4Sl4i(rA5K&v~+v)v}N;5H6n6tZOK~>4sB+ccyN+*`*DfoB4~* zp?m_hMuZa*98y#~g13v2*X}&1D+BkEw6-q0>pagrKt1~hwg!b%(9hzPK45*hE$d?3 zgPU7F-5;vVcR`Q$cuX$LmJK;#PyM#&!n-dQzN>ImyTEp;>RyTgG|nRYN@L1SJvlWq zR)4)FV_O$x+l&|+$&3rnTlgjwq`Fux>cm9#^zaHf^3|2OX{}#pn5&7ty1C9zh@qzD)Vq&QZazMBHto!|V{gsv2=4kt7I0N*pj>CaeO?JI zi$u<3KCnJke!T^u7gNcrCjN0g@DU4fGV$YdE*(>@)th4js;kFL%koS&@bjC*`223BFnwqB?Ej6Fg<>#1Ol=~+U$ zj#=I-Z5;yx`Rr_=>Dd|M+5vW@NP>Dk>|R4h`D*T&(m+gQ)isF%Q&egs&*mJ{zz0q8 zO_9~F5g{QK7ln{Qq9mk-05ZtP;h3@hy|=L)M{h`}ySkpt$>u`T51YuhJu|b+wCYh~ z*GsB4k>nE$7kru{Q>Yt6Xa(!q0@Yzf{>#aC+^5!upUnuiy_WFd17BbK;EUHh{%b8A zg{-WtD(!>XI3=WFk>Z*5L;9_HmKO$VBJOng=4)x|r36>z?9!6ld(lKA)9A8MkLdM% zt=VujP9wgHEdpHOue{hL?&o_F=VgQj^n&-z_-~4x_dZvmwBH~*Jdg&PAP2Cy4~w4P`e#T~sAJ9^Y(_)V>s@_Tq&XGMrG`-M!nraQH@ z)$cG=dvVO9?hq1LbjODnoSQ2x_;h#CrWBP$mJgR|9^~7Qga~$rL;kou6j#@jSTD9G z=yo9-6O*Cn>>H>HC+gj!3%Czj;C&rwzj%(^N_kwXlAyaPvb-Cj));!?$@Sa zLv!5R(?+>9bJo_a$&fx1**lKw-xIdLNMt8C+AGRrfBa@qtNNPXO7gpfF&(Yd=h`B~ z2)fsvEtHq9U3hUTt+d_!I_+34o>rPiv*MC)ifz#_>?Y>y*>38Bz0UG%%Z1&Ua5Y-W zHl@b&ts`KaPPypjU=xWjq;|b~3&JU`WPdM@TET%*-LB?_)A%qBsrpW6V6Fd+AfEQY z7Tql{K}=!&swX$2wk-$~w1GM9e_N$%VnHg&r z7UIF$OKSD&4(?2LdF>?Y^<2o|1exCg+O^8(*1fgVt^=*Z9C4x_%j>w&CmUbL&i$i< fUv}i;R#4bg)~&@p<6D+qjj5xluaT>EG~j;#%hx&p literal 0 HcmV?d00001 diff --git a/tmerclub-auth/src/main/resources/captcha/slidingBlock/3.png b/tmerclub-auth/src/main/resources/captcha/slidingBlock/3.png new file mode 100644 index 0000000000000000000000000000000000000000..cdbb0b18c46c25c9d4573f60ad6031d70b99b872 GIT binary patch literal 21660 zcmeI42{@E%-@qpcNzo#ECOVcFvtbs4I(8*X2svqt!5qvmGcpK?ic;DvS=(&cjv{5v zmZDI$vJ8bJG})qvZ=@!tQ|FuaI`8{_*LPhr7v|r6|Ci_f-S_>!|Ic$>J>h114A%0C z^8)~YwMK@z7R+xj^EaN4hxvE>aAhO&Yqh7LEd>BrvvKiv1t2a#6ad&MPO!A0+L-J{ z<47JVSSOMrUWMl2$^#vro+gV&bWTcO@A5 zk@0)|_E_Tl+;Au-8Eq|o3=Pe6;DM)Nfiw?yA_Yy;l=^!nA|_(9YA9L?uyNNk0k6>i%h9=A4+Auwwu4dObXT z7@9)WJH$lr1?dkhDVDyTc(4VYLh>f#@Op=sLy`T_=qXeS{I}U*!xdBghmNQO=b!jl z?D;7KJdN-Zv&Ehzv(Ia4X{s?yXlNZW9!n*WElDJIt)=B^_H{0RIy#HX69H5(!Qu$S z#R*cxfWJ5TwsgMv!|P(HcrB(a5(H5P!H||v1e*Dys;UG*q9KrFPL?#k^I<}AA~^eg z^8tl2_l6}@6|D+G!(q#PEYtkn2XiYrVX0WQye!vU=En(#b|#TMuv9IA2i64-_9VJs zz~35|X|fh5T8HFLA~P=wuLZ||f7HCp>hq#S8xbi~ED?t{($!)%s1OKFXeYcn)*0sr z0b#K)BuEtpM}Uw>xHAan3{^+M5D--)UiC9X6O-lUe{ro#!g()lJf`cV9OXp9G2MT= zECkdMp^m^igOG4F6bK5%BbkA)Y9K694Uck0szLEs*w;YIoc$$`DVe}bp;-52I*Vg* zVg`daA>j}dQVrw?Wjco9RN){L1nUICVbz%f!{d-@PROqze&FUWp$rKW=6dyAwvL&r z`E!!oi}(6->(>rTeSI{63|%OVw%*#Ep8CJ69)XJ z)^C@^vixF3`0I4ChhWM7GV`Cu@NvZx|89FNx%#a2b0-v%Gt~!6#_x1tu8^Pa{e1+Y z6Um3d-1$ph|7`ZXdklE-SaB!(2PT4oJ@n6}0pW^mHfSu!|cKe2D1ur5a)7F(8!$T$ZAjxG(eZ zUmU9wo=o^x*6FgVWMKmSKO6Hu-kA_Q3JOK4<3Q>NXBY?ySH*#_>dwq#2!TL2!Vy?C zC=&a1{c?8Zw-aY6*ZzaU?H|t^dzH%4hWr<2?#ET%zcZ&UFKd_l{{7+hZ_BDnr{tgO zm9I6>U+bI2x|&(&=`Lj!{l$E^IPw2`Im4_-n0FZHW!%3OnCu>f-8Q>u37Lf_1j;Oxmo9agvmeDG{nIjYDasGre2eyV z9+u%=R?J`)Z@|#ZI+a;7eLjw~pcwF9+Ln3y+-I{`Z@PPbt|t*N2=fDmF8=*uy1e^) zQ`^5cUEck@={HL&B7v&KEaX35%y-SptQPMQmu_J8GM|j#wba$r;A$A~_s!p1m=S1r zcN<*-^G<`ZSTU<2zSw-<@k2w~Z-!8{uhBkRF6;SXxwLPVJ;eAtGfS<^Ma zg$H;d^DPHH%-0!oCGp;2z6t?|Gqf-P0Q`Od0FHzJ03Q~Z-$MX^Hv|B9a}WSP#{vK% zr1K6n`T)R&IV0Vjmb8wMMBlUcX{#RXL7$*$df_x(Q&Y3~mg~0D(dUGoMyPk%VK&$S zWVb>#Wf)5)R4aPU12fF@w#Qz#SQX2)!O-4o!@c`F0+p}_XWX4Yx8034hg3(XUK6vu zb}1>vKeafmy|8!kpL`vXbV59%1YX8RRH>opQ z==?KWWk#`t*#+kRB z{@vPAVq#iNqlc7sj2~*er~g7v*Vs$ar*U`V+*6S)ALdSIee4O05;>Cu9&x#cTj`EC>iRQy?SN z_yb74qj^P+G~iYH@bF#2H(Ix!2Gpe-DMcKpKaF_1C15^RaNaqsTTHO3sk}SG)}v{p z4z({iDe1!{(@!tteFv&HRZRiR`MuV?qbWDo8UNy%lQh_Rsl5r%$s9lu#c*wu`S{$t`Q`-=Yy8^R7I)osTMFYXcy)C`bb7^ncc|V>Q z+#C~bTso|@9&_^mcrptZ9S+jjE#RWOs#sL2$1B}BH<8y~w5F%cdw0^1a=otZBYmDL z!E^oL7ku;v#y?#>YVVdEpBe6&{o3u~A8j%RDj_E)>BFR(4F84l{(ahWSQsvBvZFeD z<)-kw34PO_nYKBw+pcew7y6y*4RIW%yTz`LtJNbr;W@_o z6D?@ro-HoIo$tV^ikVvu{%?a8dKxkLDdh*`Of>AhJ|LAcQM`htdv8RKIac`d%<_8D zp%}B2W@4Wj4NQ|%&^f;%F~Of$bW!s{rleNX-qDg?hrpRz?SX_m-{0cIo|c5DOhYw! zFYOZZ;O4$v)1MME5rEM8WB8Rs?t+W4VuJs0jmHF2|#uEAUpEht>9RWB4(mYo^TdQs~apYdfE5`X(J7^12jRWFO0C=za-!8#9-Z zJ27Tz;?=B%&$*jYfyW&W-gTdVzu9WHkGDhOW{H9E%hI@n*Vo)FZn#9pCL*Zuil6Lc zy~6E_6d3ElZh`cA)l&POQ{Dq=Du_^FJ$qrB*k6XIt0h9*w^&ESa9t0QRC!(%b6{Qo zQWG@O>(NDNcYaj4i8rlYRchTiK2slA@3Z6d6UMsY0qbq)Tl1RQ%fnxsGud{(H%mvC z{zq;~D576s{o1mKwiP?M(>EC>StQGa-E&qPdb*+iH=0M1fwoWB!zZy4hXgC@U^ZI? zWOdC*bw^06B3(h%1Fn)kgb#NacWYp3nw=yDRtsXpI(ZsM8;X?@*0frzWh9nVC`%Yc zB|%zLJ68|J_}eNo@>hHBSof^jTv5+e>EN$na3KTWmK7xv+znTw4l0jGO26nDl9LXa z6vAFNzjC=irW*Ec#I}r_U&ZCwI)Tkb^PjGBGw-= zq)X$Jx|v-!-k!gOeQ-l581BOUH@;U3cjqxxIgV15(YaKl`eFF(YyW^K(zVA|S(kN}s0*%II z^n<7Gv-`l2k*0@pNS-s(eRoRE%XPy_HDGDMy5Zzz_$h&@m}f!Lk>r6^e^Ci3xm|I} z3EKJ&^V^Fv4Q8tQD07tt4ggA=R;!&+kN52SQ^AtKw5J-3vf&E9 zl=q=t#ESm1ygPASl%l;onfyUyVQ!+`A?TA}yTobv3){kvI(%#b=j3-J zhD*iR7ckCfyzkLgM}JiElH39s>a{GeX8tcxv)Qf(&r)S`y>E|1-W;kEJfKw{*&P6l zA!Xn4tQdbH?=X;;Ytn2d6z8&)PoTZ)@cI;!mE7Cq(p$03&hu}YHk8lh>9}`eDr!Vd zd--9Htvu1-^{R#IH2J~!9BiT)yQuPU(YlD;=)Lro4Wdcp)b8 z^yvU=#nyAGLp%+>iO#n6xvka{nA7egD>b)*!}d9r#m$sV?XmuA$)7?_ZJy_iiChy9 zkH9uzyboUL`PdJgpF7qJ7V^lrY1T@jqo{Ca+Q^?RN>i*@Z z@ewx{s){}E-LL1-M|T*W55>5eb>EH8x7Irx>X3x@dSlg+YBXQp7;q#xkP)DbK<7;% z3ZVB1*|+Qp&ZiQ%&Stj{xS4xAy}rL2WAE!;`!-X0w*G_iOMk zm5+%UX=!`cC8KJ0B_BTLzeZqr~VJZaUjiYwGH_v^HK0b$a>k z{=vknT2FylHQU-YpbTE^xPecAVkVv{b$K;E_vbax4>C9vR@mk^T3B96Z4fi}o4Wbi zeup{jw66KcfRC7K>t{+3YQe`J??*sUc`Lg`UsXOOjJH}jZ-#HSj?VDt*zIvR^w=@= zgBg+m3*12c1d3o^kp0ZHuSJP%`o4q4)Ko>4HrU zogd;%%5WQL>55fNO@Op`Nc=HndEn+>*Jm9vOxkF-wIyy3VkMlHsBi+oyQw{x|baot(XVQ%c?{PCoVF1(hr7AT;XT-5n;P zYjsLYeLp-qmET$4E7@R|;B{vnt@A|GNF^U0BD*7dA7Ahd$~@ z7g)EUxTMy6UP6*QHYszT}Q7P)!5wC`G@?u3>%sUb; z8=E?)7M+>_Vs+e(?9V3aLa0{O5L&b@+ zk)`8xL7)0e4@a!5ZGd;V?kL{pPs@URJ>W8t9wYM)|4W z!F6*pdc`Uq$AW_c<1#ZPwdc1tVy5s1(BzBrzl&w#5+-aU4`6l*opnLoys4X^bv!+6 z{@m*E^haF}uk~-hZj(`I{bN+PI>#4x+3c!9jW9JUJj(?|dE{X8>oETYTG8Dr{;#-a zF8aUqKO#8ytaMZG#gT^MPQ&|@2o{rJYSW$~?>jx%#l=2id1<2yK6=Xz&cn_A=oUAH3qG~$U_9E*_r-_1# z;&$Z=8YiY!czGWYH7Rbs;$%^m61%5k=c+i>U3@ZnHfJtrYt$Rd56%})n|6B-KOS_5 zM^n6_U8WTH<2B^u1x@$t(XuD025R$79%G(m!38%gbT{oN?!MYNBoumdx^%}lSKTUw zRjAD=P9{zkmX+JFmX)F*)mBBnt!xuIzBL?53*9Y~z}xI`p;KVBtinE9W0-q1yac~y zmo3-M-6DF$ory&sw&` zk%2M###;RL0e<65HFKMH#%5Q;qVzW&dGj#fzSvb{>dOj=Rea|r472r#!gi|!1O)Oh zK`VwaMV9hsGO1PDTm3F!>Q}kMV194tgZUM?Ha+h2GZFXcu}h9gvPvBEF4qT|z{fEL zLr2UEdd&1R4WGpedmW{0HA*vy+g6=|wmly_dA1Z`JSPyD}0~atmpT}^N0`+zQ}lM z=9(7oFs~ehKc8qt-%iDC=|FQaVbSWrQmZz_cW*k?QhI*XJWCq6I-iQk<+62?L+ZB4 ztzOZtVJMXK*z_o0(A)U4M*uGxP`TqE)CdUqqUQPtthry|}<3z_I-sGlY&& zdO@W-L{<#8w>Xd39sGE@GL7!vPAI5Abv%C6`IKz5o9k0mZ@t^r!Lqw6UbeZI>^$Gx zAk`*5P}<{J>>z=QJ`H{B|MqV2#X*$$rhwX&2@^erdwRMU_8YY;{7mJ3ZF#*?IOI2m zeJS09fjU3wXV<+AH#@^;8`l_?ZsjTAmUnx@A(gTdSb4Y z)LufQI)6yL@Bp#LG3xxml;`NZH(G;SJP-D^*tztBvcZXmlS?*a ze^Ys{#HbPT35p*D;i+jAfGFqbd;E~7(;odY6aABiNsM!&3u^(I?MP%o?9=JR_lFwk M?a|Ho_2AL}0V@#a%K!iX literal 0 HcmV?d00001 diff --git a/tmerclub-auth/src/main/resources/logback.xml b/tmerclub-auth/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-auth/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-auth/src/main/resources/mapper/AuthSocialMapper.xml b/tmerclub-auth/src/main/resources/mapper/AuthSocialMapper.xml new file mode 100644 index 0000000..2bb88bc --- /dev/null +++ b/tmerclub-auth/src/main/resources/mapper/AuthSocialMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + `id`,`create_time`,`update_time`,`uid`,`social_type`,`nick_name`,`image_url`,`biz_user_id`,`biz_unionid`,`temp_uid`,`biz_temp_session` + + + + insert into auth_social (`uid`,`social_type`,`nick_name`,`image_url`,`biz_user_id`,`biz_unionid`,`temp_uid`,`biz_temp_session`) + values (#{authSocial.uid},#{authSocial.socialType},#{authSocial.nickName},#{authSocial.imageUrl},#{authSocial.bizUserId},#{authSocial.bizUnionid},#{authSocial.tempUid},#{authSocial.bizTempSession}); + + + update auth_social + + + `create_time` = #{authSocial.createTime}, + + + `update_time` = #{authSocial.updateTime}, + + + `uid` = #{authSocial.uid}, + + + `social_type` = #{authSocial.socialType}, + + + `nick_name` = #{authSocial.nickName}, + + + `image_url` = #{authSocial.imageUrl}, + + + `biz_user_id` = #{authSocial.bizUserId}, + + + `biz_unionid` = #{authSocial.bizUnionid}, + + + `temp_uid` = #{authSocial.tempUid}, + + + `biz_temp_session` = #{authSocial.bizTempSession}, + + + where id = #{authSocial.id} + + + + + + update auth_social set uid = #{uid} where temp_uid = #{tempUid} + + + + + + + + update auth_social set uid = null where biz_user_id = #{bizUserId} and social_type = #{socialType} + + + + update auth_social set uid = null where uid = #{uid} + + + + diff --git a/tmerclub-auth/src/main/resources/mapper/RoleMapper.xml b/tmerclub-auth/src/main/resources/mapper/RoleMapper.xml new file mode 100644 index 0000000..cdeea60 --- /dev/null +++ b/tmerclub-auth/src/main/resources/mapper/RoleMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + `role_id`,`create_time`,`update_time`,`role_name`,`remark`,`create_user_id`,`biz_type`, `tenant_id` + + + + + insert into role (`role_name`,`remark`,`create_user_id`,`biz_type`, `tenant_id`) + values (#{role.roleName},#{role.remark},#{role.createUserId},#{role.bizType}, #{role.tenantId}); + + + update role + + + role_name = #{role.roleName}, + + + remark = #{role.remark}, + + + create_user_id = #{role.createUserId}, + + + biz_type = #{role.bizType}, + + + where role_id = #{role.roleId} + + + delete from role where role_id = #{roleId} and biz_type = #{sysType} + + + + + diff --git a/tmerclub-biz/Dockerfile b/tmerclub-biz/Dockerfile new file mode 100644 index 0000000..0b93728 --- /dev/null +++ b/tmerclub-biz/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms512m", "-Xmx512m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/config/AwsS3Config.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/config/AwsS3Config.java new file mode 100644 index 0000000..1a536b8 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/config/AwsS3Config.java @@ -0,0 +1,215 @@ +package com.tmerclub.cloud.biz.config; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.common.bean.UploadFile; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StorageTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.S3Configuration; +import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; +import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest; +import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest; + +import java.net.URI; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 亚马逊文件上传s3协议配置类 + * @author gaozijie + * @date 2023-10-25 + */ +@Configuration +public class AwsS3Config { + + @Autowired + private FeignShopConfig feignShopConfig; + + private S3Client getS3Client(UploadFile config) { + // aws-s3会自动转成桶域名进行访问(https://bucketName.endpoint),minio不存在桶域名概念,需固定访问路径样式 + boolean isForcePathStyle = Objects.equals(StorageTypeEnum.MINIO.getValue(), config.getStorageType()); + return S3Client.builder() + .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(config.getAccessKey(), config.getSecretKey()))) + .region(Region.AWS_GLOBAL) + .endpointOverride(URI.create(config.getEndPoint())) + .serviceConfiguration(S3Configuration.builder() + .pathStyleAccessEnabled(isForcePathStyle) + .chunkedEncodingEnabled(false) + .build()) + .build(); + } + + private S3Presigner getS3Presigner(UploadFile config) { + // aws-s3会自动转成桶域名进行访问(https://bucketName.endpoint),minio不存在桶域名概念,需固定访问路径样式 + boolean isForcePathStyle = Objects.equals(StorageTypeEnum.MINIO.getValue(), config.getStorageType()); + return S3Presigner.builder() + .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(config.getAccessKey(), config.getSecretKey()))) + .region(Region.AWS_GLOBAL) + .endpointOverride(URI.create(config.getEndPoint())) + .serviceConfiguration(S3Configuration.builder() + .pathStyleAccessEnabled(isForcePathStyle) + .chunkedEncodingEnabled(false) + .build()) + .build(); + } + + /** + * 获取预签名url + * @param fileName 文件名(支持路径形式'xx/xx/xxx.png') + * @return 预签名url + */ + public String getPreSignUrl(String fileName) { + UploadFile config = this.getConfig(); + S3Presigner s3Presigner = this.getS3Presigner(config); + PutObjectPresignRequest presignRequest = this.buildPreSignReq(fileName, config.getBucketName()); + PresignedPutObjectRequest presignedRequest = s3Presigner.presignPutObject(presignRequest); + return presignedRequest.url().toString(); + } + + /** + * 批量获取预签名url + * @param fileNames 文件名集合(支持路径形式'xx/xx/xxx.png') + * @return 预签名url集合 + */ + public List getBatchPreSignUrl(List fileNames) { + if (CollectionUtils.isEmpty(fileNames)) { + return new ArrayList<>(); + } + UploadFile config = this.getConfig(); + S3Presigner s3Presigner = this.getS3Presigner(config); + List preSignUrls = new ArrayList<>(fileNames.size()); + PresignedPutObjectRequest presignedRequest; + for (String fileName : fileNames) { + presignedRequest = s3Presigner.presignPutObject(this.buildPreSignReq(fileName, config.getBucketName())); + preSignUrls.add(presignedRequest.url().toString()); + } + return preSignUrls; + } + + /** + * 上传文件(通过预签名url) + * @param preSignUrl 预签名url + * @param fileData 文件二进制数据 + */ + public void uploadFileByPreSignUrl(String preSignUrl, byte[] fileData) { + HttpRequest httpRequest = HttpRequest.put(preSignUrl) + .body(fileData); + try (HttpResponse resp = httpRequest.execute()) { + if (!resp.isOk()) { + throw new RuntimeException("presignUrl文件上传失败!原因为:" + resp.body()); + } + } + } + + /** + * 上传文件 + * @param fileName 文件名(支持路径形式'xx/xx/xxx.png') + * @param fileData 文件二进制数据 + */ + public void uploadFile(String fileName, byte[] fileData) { + UploadFile config = this.getConfig(); + S3Client s3Client = this.getS3Client(config); + PutObjectRequest request = this.buildPutReq(fileName, config.getBucketName()); + s3Client.putObject(request, RequestBody.fromBytes(fileData)); + } + + /** + * 删除文件 + * @param fileName 文件名(支持路径形式'xx/xx/xxx.png') + */ + public void deleteFile(String fileName) { + UploadFile config = this.getConfig(); + S3Client s3Client = this.getS3Client(config); + DeleteObjectRequest deleteObjectRequest = this.buildDeleteReq(fileName, config.getBucketName()); + s3Client.deleteObject(deleteObjectRequest); + } + + /** + * 批量删除文件 + * @param fileNames 文件名集合(支持路径形式'xx/xx/xxx.png') + */ + public void deleteBatchFile(List fileNames) { + if (CollectionUtils.isEmpty(fileNames)) { + return; + } + UploadFile config = this.getConfig(); + S3Client s3Client = this.getS3Client(config); + for (String fileName : fileNames) { + s3Client.deleteObject(this.buildDeleteReq(fileName, config.getBucketName())); + } + } + + /** + * 构建上传对象预签名请求 + * @param fileName 文件名 + * @param bucketName 桶名 + * @return 上传对象预签名请求 + */ + private PutObjectPresignRequest buildPreSignReq(String fileName, String bucketName) { + return PutObjectPresignRequest.builder() + .signatureDuration(Duration.ofSeconds(Constant.S3_URL_DURATION_SECONDS)) + .putObjectRequest(PutObjectRequest.builder() + .bucket(bucketName) + .key(fileName) + .build()) + .build(); + } + + /** + * 构建上传对象请求 + * @param fileName 文件名 + * @param bucketName 桶名 + * @return 上传对象请求 + */ + private PutObjectRequest buildPutReq(String fileName, String bucketName) { + return PutObjectRequest.builder() + .bucket(bucketName) + .key(fileName) + .build(); + } + + /** + * 构建删除对象请求 + * @param fileName 文件名 + * @param bucketName 桶名 + * @return 删除对象请求 + */ + private DeleteObjectRequest buildDeleteReq(String fileName, String bucketName) { + return DeleteObjectRequest.builder() + .bucket(bucketName) + .key(fileName) + .build(); + } + + /** + * 获取文件上传配置,并检查参数 + * @return 文件上传配置 + */ + private UploadFile getConfig() { + UploadFile config = feignShopConfig.getUploadFile(); + // 校验配置参数 + boolean isEmpty = ObjectUtils.isEmpty(config.getEndPoint()) + || ObjectUtils.isEmpty(config.getBucketName()) + || ObjectUtils.isEmpty(config.getAccessKey()) + || ObjectUtils.isEmpty(config.getSecretKey()); + if (isEmpty) { + throw new LuckException("请先去后台配置文件上传参数"); + } + return config; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/config/WxConfig.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/config/WxConfig.java new file mode 100644 index 0000000..6d97d31 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/config/WxConfig.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.config; + + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceHttpClientImpl; +import cn.binarywang.wx.miniapp.config.impl.WxMaRedissonConfigImpl; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.common.bean.WxMiniApp; +import com.tmerclub.cloud.common.bean.WxMp; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpServiceHttpClientImpl; +import me.chanjar.weixin.mp.config.impl.WxMpRedissonConfigImpl; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 通过微信配置获取微信的支付信息,登陆信息等 + * + * @author FrozenWatermelon + */ +@Component +public class WxConfig { + + + @Autowired + private FeignShopConfig feignShopConfig; + + @Autowired + private RedissonClient redissonClient; + + + private static final String MA_CONFIG_KEY_PREFIX = "mall4cloud:ma_config_key_prefix"; + + private static final String MP_CONFIG_KEY_PREFIX = "mall4cloud:mp_config_key_prefix"; + + public WxMaService getWxMaService() { + WxMiniApp wxMiniApp = feignShopConfig.getWxMiniApp(); + // access token用redis缓存 + WxMaRedissonConfigImpl maRedissonConfig = new WxMaRedissonConfigImpl(redissonClient, MA_CONFIG_KEY_PREFIX); + maRedissonConfig.setAppid(wxMiniApp.getAppId()); + maRedissonConfig.setSecret(wxMiniApp.getSecret()); + + WxMaServiceHttpClientImpl wxMaServiceHttpClient = new WxMaServiceHttpClientImpl(); + wxMaServiceHttpClient.setWxMaConfig(maRedissonConfig); + return wxMaServiceHttpClient; + } + + public WxMpService getWxMpService() { + WxMp wxMp = feignShopConfig.getWxMp(); + // access token用redis缓存 + WxMpRedissonConfigImpl wxMpRedisConfig = new WxMpRedissonConfigImpl(redissonClient, MP_CONFIG_KEY_PREFIX); + wxMpRedisConfig.setAppId(wxMp.getAppId()); + wxMpRedisConfig.setSecret(wxMp.getSecret()); + + WxMpServiceHttpClientImpl wxMpServiceHttpClient = new WxMpServiceHttpClientImpl(); + wxMpServiceHttpClient.setWxMpConfigStorage(wxMpRedisConfig); + return wxMpServiceHttpClient; + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/constant/NotifyType.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/constant/NotifyType.java new file mode 100644 index 0000000..d7e1a1f --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/constant/NotifyType.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.constant; + +/** + * 通知类型 1.短信发送 2.公众号订阅消息 3.站内消息 + * + * @author lhd + * @date 2021-04-12 09:36:59 + */ +public enum NotifyType { + + + /** + * 短信发送 + */ + SMS(1), + + /** + * 公众号订阅消息 + */ + MP(2), + + /** + * 站内消息 + */ + APP(3); + + private final Integer num; + + public Integer value() { + return num; + } + + NotifyType(Integer num) { + this.num = num; + } + + public static NotifyType instance(Integer value) { + NotifyType[] enums = values(); + for (NotifyType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/AttachFileController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/AttachFileController.java new file mode 100644 index 0000000..edd5290 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/AttachFileController.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.admin; + + +import cn.hutool.core.util.BooleanUtil; +import com.tmerclub.cloud.biz.dto.AttachFileDTO; +import com.tmerclub.cloud.biz.model.AttachFile; +import com.tmerclub.cloud.biz.service.AttachFileService; +import com.tmerclub.cloud.biz.vo.AttachFileVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 上传文件记录表 + * + * @author YXF + * @date 2020-11-21 10:21:40 + */ +@RestController("adminAttachFileController") +@RequestMapping("/mp/attach_file") +@Tag(name = "admin-上传文件记录表") +public class AttachFileController { + + @Autowired + private AttachFileService attachFileService; + + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + @GetMapping("/page") + @Operation(summary = "获取上传文件记录表列表", description = "分页获取上传文件记录表列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, AttachFileDTO attachFileDTO) { + if (Objects.equals(attachFileDTO.getAttachFileGroupId(), 0L)) { + attachFileDTO.setAttachFileGroupId(null); + } + attachFileDTO.setSysType(AuthUserContext.get().getSysType()); + PageVO attachFilePage = attachFileService.page(pageDTO, attachFileDTO); + return ServerResponseEntity.success(attachFilePage); + } + + @PostMapping + @Operation(summary = "保存上传文件记录", description = "保存上传文件记录") + public ServerResponseEntity save(@RequestBody List attachFileDtos) { + List attachFiles = BeanUtil.mapAsList(attachFileDtos, AttachFile.class); + attachFileService.save(attachFiles); + return ServerResponseEntity.success(); + } + + /** + * 更改文件名或分组 + */ + @PutMapping("/update_file") + @Operation(summary = "更新文件记录", description = "更新文件记录") + public ServerResponseEntity updateFileName(@RequestBody AttachFileDTO attachFileDto) { + if (Objects.isNull(attachFileDto.getFileName())) { + // 文件名称不能为空 + throw new LuckException("文件名称不能为空"); + } + AttachFile attachFile = BeanUtil.map(attachFileDto, AttachFile.class); + attachFileService.updateFileName(attachFile); + return ServerResponseEntity.success(Boolean.TRUE); + } + + @DeleteMapping + @Operation(summary = "删除上传文件记录", description = "根据上传文件记录表id删除上传文件记录") + public ServerResponseEntity delete(@RequestParam Long fileId) { + // 屏蔽线上演示账号 平台/商家home 的图片资源删除功能 此处判断可删除 + Integer sysType = AuthUserContext.get().getSysType(); + Long tenantId = AuthUserContext.get().getTenantId(); + boolean isPlatform = Objects.equals(sysType, SysTypeEnum.PLATFORM.value()) && Objects.equals(tenantId, Constant.PLATFORM_SHOP_ID); + boolean isHome = Objects.equals(sysType, SysTypeEnum.MULTISHOP.value()) && Objects.equals(tenantId, 4L); + if (BooleanUtil.isFalse(permission) && (isPlatform || isHome)) { + throw new LuckException("抱歉,当前无操作权限"); + } + attachFileService.deleteById(fileId); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/NotifyLogController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/NotifyLogController.java new file mode 100644 index 0000000..e9b3160 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/NotifyLogController.java @@ -0,0 +1,112 @@ +package com.tmerclub.cloud.biz.controller.admin; + + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.nacos.common.utils.CollectionUtils; +import com.tmerclub.cloud.biz.constant.NotifyType; +import com.tmerclub.cloud.biz.dto.NotifyLogDTO; +import com.tmerclub.cloud.biz.service.NotifyLogService; +import com.tmerclub.cloud.biz.vo.NotifyLogVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author lhd + * @date 2020-05-12 08:21:24 + */ +@RestController("adminNotifyLogController") +@RequestMapping("/mp/notify_log") +@Tag(name = "商家端和供应商端消息通知") +public class NotifyLogController { + + @Autowired + private NotifyLogService notifyLogService; + + + /** + * 查询用户未读消息数量 + */ + @GetMapping("/unread_count") + @Operation(summary = "查询用户未读消息数量", description = "查询用户未读消息数量") + public ServerResponseEntity getNotifyCount() { + Long tenantId = AuthUserContext.get().getTenantId(); + return ServerResponseEntity.success(notifyLogService.countUnreadBySendTypeAndRemindType(tenantId, Constant.MSG_TYPE)); + } + + + /** + * 查询未读消息列表 + */ + @GetMapping("/unread_count_list") + @Operation(summary = "查询消息列表", description = "查询消息列表") + @Parameter(name = "status", description = "状态 0未读 1已读 不传查询全部按照已读未读排序") + public ServerResponseEntity> getUnReadCountList(@Valid PageDTO page, NotifyLogDTO notifyLogDTO) { + Long tenantId = AuthUserContext.get().getTenantId(); + notifyLogDTO.setShopId(tenantId); + notifyLogDTO.setSysType(AuthUserContext.get().getSysType()); + notifyLogDTO.setRemindType(NotifyType.APP.value()); + PageVO notifyLogPageVO = notifyLogService.pageShopNotifyLogByParam(page, notifyLogDTO); + List records = notifyLogPageVO.getList(); + List updateList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (NotifyLogVO record : records) { + if (!Objects.equals(StatusEnum.DISABLE.value(), record.getStatus())) { + continue; + } + NotifyLogVO notifyLogVO = new NotifyLogVO(); + notifyLogVO.setStatus(StatusEnum.ENABLE.value()); + notifyLogVO.setLogId(record.getLogId()); + updateList.add(notifyLogVO); + } + if (CollectionUtils.isNotEmpty(updateList)) { + notifyLogService.updateBatchById(updateList); + } + return ServerResponseEntity.success(notifyLogPageVO); + } + + @GetMapping("/info") + @Operation(summary = "获取消息详情", description = "根据id获取消息详情") + public ServerResponseEntity getById(@RequestParam Long logId) { + notifyLogService.updateStatus(logId); + NotifyLogVO notifyLogVO = notifyLogService.getByLogId(logId); + if (Objects.isNull(notifyLogVO)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + return ServerResponseEntity.success(notifyLogVO); + } + + @PutMapping("/is_read") + @Operation(summary = "批量设置消息为已读状态 ", description = "批量设置消息为已读状态") + @Parameters({ + @Parameter(name = "logIds", description = "消息id", required = true), + @Parameter(name = "type", description = "数据类型 1全部 0已选") + }) + public ServerResponseEntity isRead(@RequestParam(value = "logIds", required = false) List logIds, Integer type) { + Long tenantId = AuthUserContext.get().getTenantId(); + if (Objects.equals(type, 1)) { + notifyLogService.isReadByShopId(tenantId); + } else if (Objects.equals(type, 0) && CollUtil.isNotEmpty(logIds)) { + notifyLogService.isReadByIds(logIds); + } + return ServerResponseEntity.success(); + } + + +} + diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/AttachFileController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/AttachFileController.java new file mode 100644 index 0000000..6e8aeef --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/AttachFileController.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.app; + + +import com.tmerclub.cloud.biz.service.AttachFileService; +import com.tmerclub.cloud.biz.vo.AttachFileVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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; + +/** + * 上传文件记录表 + * + * @author YXF + * @date 2020-11-21 10:21:40 + */ +@RestController("appAttachFileController") +@RequestMapping("/attach_file") +@Tag(name = "app-文件记录表") +public class AttachFileController { + + @Autowired + private AttachFileService attachFileService; + + @GetMapping("/get_file_by_id") + @Operation(summary = "根据文件id获取文件信息") + public ServerResponseEntity getFileById(Long fileId) { + AttachFileVO attachFileVO = attachFileService.getById(fileId); + return ServerResponseEntity.success(attachFileVO); + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/NotifyTemplateRemindController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/NotifyTemplateRemindController.java new file mode 100644 index 0000000..973d28d --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/NotifyTemplateRemindController.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.app; + +import com.tmerclub.cloud.biz.dto.NotifyTemplateRemindDTO; +import com.tmerclub.cloud.biz.model.NotifyTemplateRemind; +import com.tmerclub.cloud.biz.service.NotifyTemplateRemindService; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 消息提醒设置 + * + * @author FrozenWatermelon + * @date 2022-10-24 13:48:38 + */ +@RestController("appNotifyTemplateRemindController") +@RequestMapping("/notify_template_remind") +@Tag(name = "消息提醒设置") +public class NotifyTemplateRemindController { + + @Autowired + private NotifyTemplateRemindService notifyTemplateRemindService; + + + + @GetMapping + @Operation(summary = "获取消息提醒设置", description = "根据notifyTemplateRemindId获取消息提醒设置") + public ServerResponseEntity getByNotifyTemplateRemindId(@RequestParam Long notifyTemplateRemindId) { + return ServerResponseEntity.success(notifyTemplateRemindService.getByNotifyTemplateRemindId(notifyTemplateRemindId)); + } + + @PostMapping + @Operation(summary = "保存消息提醒设置", description = "保存消息提醒设置") + public ServerResponseEntity save(@Valid @RequestBody NotifyTemplateRemindDTO notifyTemplateRemindDTO) { + NotifyTemplateRemind notifyTemplateRemind = BeanUtil.map(notifyTemplateRemindDTO, NotifyTemplateRemind.class); + notifyTemplateRemindService.save(notifyTemplateRemind); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新消息提醒设置", description = "更新消息提醒设置") + public ServerResponseEntity update(@Valid @RequestBody NotifyTemplateRemindDTO notifyTemplateRemindDTO) { + NotifyTemplateRemind notifyTemplateRemind = BeanUtil.map(notifyTemplateRemindDTO, NotifyTemplateRemind.class); + notifyTemplateRemindService.update(notifyTemplateRemind); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除消息提醒设置", description = "根据消息提醒设置id删除消息提醒设置") + public ServerResponseEntity delete(@RequestParam Long notifyTemplateRemindId) { + notifyTemplateRemindService.deleteById(notifyTemplateRemindId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/multishop/AttachFileController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/multishop/AttachFileController.java new file mode 100644 index 0000000..6795e52 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/multishop/AttachFileController.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.multishop; + +import com.tmerclub.cloud.biz.constant.FileType; +import com.tmerclub.cloud.biz.dto.AttachFileDTO; +import com.tmerclub.cloud.biz.model.AttachFile; +import com.tmerclub.cloud.biz.service.AttachFileService; +import com.tmerclub.cloud.biz.vo.AttachFileVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/6/1 15:20 + */ +@RestController("multishopAttachFileController") +@RequestMapping("/m/attach_file") +@Tag(name = "multishop-上传文件记录表") +public class AttachFileController { + + @Autowired + private AttachFileService attachFileService; + + + @DeleteMapping("/delete_by_ids") + @Operation(summary = "根据文件id列表批量删除文件记录", description = "根据文件id列表批量删除文件记录") + public ServerResponseEntity deleteByIds(@RequestBody List ids) { + Long shopId = AuthUserContext.get().getTenantId(); + attachFileService.deleteByIdsAndShopId(ids, shopId); + return ServerResponseEntity.success(); + } + + @PutMapping("/batch_move") + @Operation(summary = "根据文件id列表与分组id批量移动文件", description = "根据文件id列表与分组id批量移动文件") + public ServerResponseEntity batchMove(@RequestBody List ids, @RequestParam(value = "groupId", required = false, defaultValue = "") Long groupId) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + attachFileService.batchMoveByShopIdAndIdsAndGroupId(shopId, ids, groupId, sysType); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_file_by_id") + @Operation(summary = "根据文件id获取文件信息") + public ServerResponseEntity getFileById(Long fileId) { + AttachFileVO attachFileVO = attachFileService.getById(fileId); + Long shopId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(shopId, attachFileVO.getShopId())) { + throw new LuckException("无法查看非本店铺的文件"); + } + return ServerResponseEntity.success(attachFileVO); + } + + @PostMapping("/save_pdf_file") + @Operation(summary = "保存商家发票") + public ServerResponseEntity savePdfFile(@RequestBody AttachFileDTO attachFileDTO) { + AttachFile attachFile = BeanUtil.map(attachFileDTO, AttachFile.class); + attachFile.setType(FileType.FILE.value()); + attachFile.setShopId(AuthUserContext.get().getTenantId()); + attachFileService.saveFile(attachFile); + return ServerResponseEntity.success(attachFileService.getById(attachFile.getFileId())); + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/multishop/SmsController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/multishop/SmsController.java new file mode 100644 index 0000000..f0c4966 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/multishop/SmsController.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.multishop; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.google.common.collect.Maps; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.multishop.feign.ShopUserFeignClient; +import com.tmerclub.cloud.biz.dto.SendAndCheckSmsDTO; +import com.tmerclub.cloud.biz.service.SmsLogService; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/6/10 14:34 + */ +@RestController("multishopSmsController") +@RequestMapping("/m/sms") +@Tag(name = "multishop-短信接口") +public class SmsController { + + @Autowired + private SmsLogService smsLogService; + @DubboReference + private AccountFeignClient accountFeignClient; + @DubboReference + private ShopUserFeignClient shopUserFeignClient; + public static final String CHECK_UPDATE_SMS_FLAG = "checkUpdatePwdSmsFlag"; + + @PutMapping("/send_withdraw_code") + @Operation(summary = "给商家手机号发送申请提现验证码", description = "给商家手机号发送申请提现验证码,返回商家手机号") + public ServerResponseEntity applyShopSms() { + Integer sysType = AuthUserContext.get().getSysType(); + ServerResponseEntity merchantInfoRes = accountFeignClient.getAccountInfoByTenantId(AuthUserContext.get().getTenantId(), sysType); + if (!merchantInfoRes.isSuccess()) { + throw new LuckException("服务器繁忙"); + } + smsLogService.sendSmsCode(SendTypeEnum.VALID, merchantInfoRes.getData().getPhone(), Maps.newHashMap()); + return ServerResponseEntity.success(merchantInfoRes.getData().getPhone()); + } + + @PutMapping("/send_auth_shop_user_code") + @Operation(summary = "发送认证店铺员工/子账号验证码", description = "发送认证店铺员工/子账号验证码") + public ServerResponseEntity sendAuthShopUserSms(@RequestBody SendAndCheckSmsDTO sendAndCheckSmsDTO) { + String phone = sendAndCheckSmsDTO.getMobile(); + if (StrUtil.isBlank(phone) || !PrincipalUtil.isMobile(phone)) { + throw new LuckException("手机号格式不正确"); + } + smsLogService.sendSmsCode(SendTypeEnum.VALID, phone, Maps.newHashMap()); + return ServerResponseEntity.success(); + } + + /** + * 发送忘记密码验证码接口 + */ + @PostMapping("/ua/update_pwd") + @Operation(summary = "发送忘记密码验证码接口", description = "发送忘记密码验证码接口") + public ServerResponseEntity sendUpdatePwdCode(@RequestBody SendAndCheckSmsDTO sendSmsParam) { + if (Objects.equals(shopUserFeignClient.countAccoutByMobile(sendSmsParam.getMobile()).getData(), 0)) { + throw new LuckException("该手机号码未注册"); + } + // 每个手机号每分钟只能发十个注册的验证码,免得接口被利用 + smsLogService.sendSmsCode(SendTypeEnum.UPDATE_PASSWORD, sendSmsParam.getMobile(), Maps.newHashMap()); + return ServerResponseEntity.success(); + } + + @PutMapping("/ua/check_update_pwd") + @Operation(summary = "校验用户忘记密码时的验证码", description = "校验验证码返回校验成功的标识") + public ServerResponseEntity checkUpdatePwdSms(@Valid @RequestBody SendAndCheckSmsDTO sendAndCheckSmsDto) { + // 每个ip每分钟只能发十个注册的验证码,免得接口被利用 + String mobile = sendAndCheckSmsDto.getMobile(); + if (!smsLogService.checkValidCode(mobile, sendAndCheckSmsDto.getValidCode(), SendTypeEnum.UPDATE_PASSWORD)) { + // 验证码有误或已过期 + return ServerResponseEntity.fail(ResponseEnum.VERIFICATION_CODE_ERROR); + } + String checkUpdatePwdSmsFlag = IdUtil.simpleUUID(); + RedisUtil.set(CHECK_UPDATE_SMS_FLAG + checkUpdatePwdSmsFlag, mobile, 600); + return ServerResponseEntity.success(checkUpdatePwdSmsFlag); + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/platform/NotifyLogController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/platform/NotifyLogController.java new file mode 100644 index 0000000..946d738 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/platform/NotifyLogController.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.platform; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import com.tmerclub.cloud.biz.dto.NotifyLogDTO; +import com.tmerclub.cloud.biz.service.NotifyLogService; +import com.tmerclub.cloud.biz.vo.NotifyLogVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Objects; + +/** + * @author lhd + * @date 2021-05-14 09:35:32 + */ +@RestController("platformNotifyLogController") +@RequestMapping("/p/notify_log") +@Tag(name = "消息日志") +public class NotifyLogController { + + @Autowired + private NotifyLogService notifyLogService; + + @GetMapping("/page") + @Operation(summary = "获取列表", description = "分页获取列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, NotifyLogDTO notifyLogDTO) { + PageVO notifyLogPage = notifyLogService.page(pageDTO, notifyLogDTO); + + for (NotifyLogVO record : notifyLogPage.getList()) { + if (Objects.nonNull(record.getUserMobile())) { + record.setUserMobile(PhoneUtil.hideBetween(record.getUserMobile()).toString()); + } + } + return ServerResponseEntity.success(notifyLogPage); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/supplier/AttachFileController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/supplier/AttachFileController.java new file mode 100644 index 0000000..8afe0d3 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/supplier/AttachFileController.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.supplier; + +import cn.hutool.core.util.BooleanUtil; +import com.tmerclub.cloud.biz.constant.FileType; +import com.tmerclub.cloud.biz.dto.AttachFileDTO; +import com.tmerclub.cloud.biz.model.AttachFile; +import com.tmerclub.cloud.biz.service.AttachFileService; +import com.tmerclub.cloud.biz.vo.AttachFileVO; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/6/1 15:20 + */ +@RestController("supplierAttachFileController") +@RequestMapping("/s/attach_file") +@Tag(name = "supplier-上传文件记录表") +public class AttachFileController { + + @Autowired + private AttachFileService attachFileService; + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + + @DeleteMapping("/delete_by_ids") + @Operation(summary = "根据文件id列表批量删除文件记录", description = "根据文件id列表批量删除文件记录") + public ServerResponseEntity deleteByIds(@RequestBody List ids) { + Long shopId = AuthUserContext.get().getTenantId(); + attachFileService.deleteByIdsAndShopId(ids, shopId); + return ServerResponseEntity.success(); + } + + @PutMapping("/batch_move") + @Operation(summary = "根据文件id列表与分组id批量移动文件", description = "根据文件id列表与分组id批量移动文件") + public ServerResponseEntity batchMove(@RequestBody List ids, @RequestParam(value = "groupId", required = false, defaultValue = "") Long groupId) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + attachFileService.batchMoveByShopIdAndIdsAndGroupId(shopId, ids, groupId, sysType); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_file_by_id") + @Operation(summary = "根据文件id获取文件信息") + public ServerResponseEntity getFileById(Long fileId) { + AttachFileVO attachFileVO = attachFileService.getById(fileId); + Long shopId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(shopId, attachFileVO.getShopId())) { + throw new LuckException("无法查看非本店铺的文件"); + } + return ServerResponseEntity.success(attachFileVO); + } + + @PostMapping("/save_pdf_file") + @Operation(summary = "保存商家发票") + public ServerResponseEntity savePdfFile(@RequestBody AttachFileDTO attachFileDTO) { + AttachFile attachFile = BeanUtil.map(attachFileDTO, AttachFile.class); + attachFile.setSysType(AuthUserContext.get().getSysType()); + attachFile.setType(FileType.FILE.value()); + attachFile.setShopId(AuthUserContext.get().getTenantId()); + attachFileService.saveFile(attachFile); + return ServerResponseEntity.success(attachFileService.getById(attachFile.getFileId())); + } + + @GetMapping("/page") + @Operation(summary = "获取上传文件记录表列表", description = "分页获取上传文件记录表列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, AttachFileDTO attachFileDTO) { + if (Objects.equals(attachFileDTO.getAttachFileGroupId(), 0L)) { + attachFileDTO.setAttachFileGroupId(null); + } + attachFileDTO.setSysType(3); + attachFileDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO attachFilePage = attachFileService.page(pageDTO, attachFileDTO); + return ServerResponseEntity.success(attachFilePage); + } + + @DeleteMapping + @Operation(summary = "删除上传文件记录", description = "根据上传文件记录表id删除上传文件记录") + public ServerResponseEntity delete(@RequestParam Long fileId) { + Long tenantId = AuthUserContext.get().getTenantId(); + boolean isHome = Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.SUPPLIER.value()) && Objects.equals(tenantId, 69L); + if (BooleanUtil.isFalse(permission) && isHome) { + throw new LuckException("抱歉,当前无操作权限"); + } + attachFileService.deleteById(fileId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/AttachFileDTO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/AttachFileDTO.java new file mode 100644 index 0000000..5353e8a --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/AttachFileDTO.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 上传文件记录表DTO + * + * @author YXF + * @date 2020-11-21 10:21:40 + */ +public class AttachFileDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long fileId; + + @Schema(description = "文件路径") + private String filePath; + + @Schema(description = "文件类型") + private String fileType; + + @Schema(description = "文件名") + private String fileName; + + @Schema(description = "文件大小") + private Integer fileSize; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "uid") + private Long uid; + + @Schema(description = "文件 1:图片 2:视频 3:文件") + private Integer type; + + @Schema(description = "文件分组id") + private Long attachFileGroupId; + + @Schema(description = "系统类型 1.商家端 2.平台端 3.供应商端") + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public Long getFileId() { + return fileId; + } + + public void setFileId(Long fileId) { + this.fileId = fileId; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public Integer getFileSize() { + return fileSize; + } + + public void setFileSize(Integer fileSize) { + this.fileSize = fileSize; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getAttachFileGroupId() { + return attachFileGroupId; + } + + public void setAttachFileGroupId(Long attachFileGroupId) { + this.attachFileGroupId = attachFileGroupId; + } + + @Override + public String toString() { + return "AttachFileDTO{" + + "fileId=" + fileId + + ", filePath='" + filePath + '\'' + + ", fileType='" + fileType + '\'' + + ", fileName='" + fileName + '\'' + + ", fileSize=" + fileSize + + ", shopId=" + shopId + + ", uid=" + uid + + ", type=" + type + + ", attachFileGroupId=" + attachFileGroupId + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyLogDTO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyLogDTO.java new file mode 100644 index 0000000..75e830d --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyLogDTO.java @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * DTO + * + * @author lhd + * @date 2021-05-14 09:35:32 + */ +public class NotifyLogDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "消息记录表") + private Long logId; + + @Schema(description = "用户昵称or手机号") + private String nickName; + + @Schema(description = "发送手机号") + private String userMobile; + + @Schema(description = "通知的用户id") + private String remindId; + + @Schema(description = "系统类型 0用户端 1商家端 2平台端 3供应商端") + private Integer sysType; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "关联的订单id(等级)") + private Long bizId; + + @Schema(description = "通知类型 1.短信发送 2.公众号订阅消息 3.站内消息") + private Integer remindType; + + @Schema(description = "通知模板") + private Long templateId; + + @Schema(description = "1.订单催付 2.付款成功通知 3.商家同意退款 4.商家拒绝退款 5.核销提醒 6.发货提醒 7.拼团失败提醒 8.拼团成功提醒 9.拼团开团提醒 10.会员升级提醒 101.退款临近超时提醒 102.确认收货提醒 103.买家发起退款提醒 104.买家已退货提醒 105用户支付成功提醒 106商品下架提醒 107商品审核结果提醒 108代销商品变更提醒 109待发货提醒 110待采购提醒 111待收货提醒 112营销活动下架 113活动审核结果提醒") + private Integer sendType; + + @Schema(description = "通知内容") + private String message; + + @Schema(description = "是否阅读 1已读 0未读") + private Integer status; + + /** + * 开始时间 + */ + @Schema(description = "发布开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + /** + * 结束时间 + */ + @Schema(description = "发布结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getLogId() { + return logId; + } + + public void setLogId(Long logId) { + this.logId = logId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getRemindType() { + return remindType; + } + + public void setRemindType(Integer remindType) { + this.remindType = remindType; + } + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + @Override + public String toString() { + return "NotifyLogDTO{" + + "logId=" + logId + + ", nickName='" + nickName + '\'' + + ", userMobile='" + userMobile + '\'' + + ", remindId='" + remindId + '\'' + + ", sysType=" + sysType + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", bizId=" + bizId + + ", remindType=" + remindType + + ", templateId=" + templateId + + ", sendType=" + sendType + + ", message='" + message + '\'' + + ", status=" + status + + ", startTime=" + startTime + + ", endTime=" + endTime + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyTemplateDTO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyTemplateDTO.java new file mode 100644 index 0000000..6e80363 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyTemplateDTO.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * DTO + * + * @author lhd + * @date 2021-05-14 09:35:32 + */ +public class NotifyTemplateDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "消息模板表") + private Long templateId; + + @Schema(description = "通知类型") + private Integer sendType; + + @Schema(description = "通知内容") + private String message; + + @Schema(description = "通知方式集合用逗号分隔 1.短信 2.公众号 3.站内消息") + private String notifyTypes; + + @Schema(description = "短信模板code") + private String templateCode; + + @Schema(description = "公众号消息模板code") + private String mpCode; + + @Schema(description = "消息发送类型 1.平台自行发送类型 2.商家 3.供应商") + private Integer msgType; + + @Schema(description = "1启用 0禁用") + private Integer status; + + /** + * 可用通知方式集合用逗号分隔 1.短信 2.公众号 3.站内消息 + */ + private List templateTypeList; + + /** + * tagId 会员标签 + */ + private List tagIds; + + public List getTemplateTypeList() { + return templateTypeList; + } + + public void setTemplateTypeList(List templateTypeList) { + this.templateTypeList = templateTypeList; + } + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getNotifyTypes() { + return notifyTypes; + } + + public void setNotifyTypes(String notifyTypes) { + this.notifyTypes = notifyTypes; + } + + public String getTemplateCode() { + return templateCode; + } + + public void setTemplateCode(String templateCode) { + this.templateCode = templateCode; + } + + public String getMpCode() { + return mpCode; + } + + public void setMpCode(String mpCode) { + this.mpCode = mpCode; + } + + public Integer getMsgType() { + return msgType; + } + + public void setMsgType(Integer msgType) { + this.msgType = msgType; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public List getTagIds() { + return tagIds; + } + + public void setTagIds(List tagIds) { + this.tagIds = tagIds; + } + + @Override + public String toString() { + return "NotifyTemplateDTO{" + + "templateId=" + templateId + + ", sendType=" + sendType + + ", message='" + message + '\'' + + ", notifyTypes='" + notifyTypes + '\'' + + ", templateCode='" + templateCode + '\'' + + ", mpCode='" + mpCode + '\'' + + ", msgType=" + msgType + + ", status=" + status + + ", templateTypeList=" + templateTypeList + + ", tagIds=" + tagIds + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyTemplateTagDTO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyTemplateTagDTO.java new file mode 100644 index 0000000..2d17cea --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyTemplateTagDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * DTO + * + * @author cl + * @date 2021-05-20 11:09:53 + */ +public class NotifyTemplateTagDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "标签消息通知关联表") + private Long notifyTagId; + + @Schema(description = "标签id") + private Long userTagId; + + @Schema(description = "模板id") + private Long templateId; + + public Long getNotifyTagId() { + return notifyTagId; + } + + public void setNotifyTagId(Long notifyTagId) { + this.notifyTagId = notifyTagId; + } + + public Long getUserTagId() { + return userTagId; + } + + public void setUserTagId(Long userTagId) { + this.userTagId = userTagId; + } + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + @Override + public String toString() { + return "NotifyTemplateTagDTO{" + + "notifyTagId=" + notifyTagId + + ",userTagId=" + userTagId + + ",templateId=" + templateId + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/QrcodeTicketDTO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/QrcodeTicketDTO.java new file mode 100644 index 0000000..041627f --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/QrcodeTicketDTO.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 二维码数据信息DTO + * + * @author cl + * @date 2021-08-13 15:32:12 + */ +public class QrcodeTicketDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "二维码ticket id") + private Long ticketId; + + @Schema(description = "二维码ticket") + private String ticket; + + @Schema(description = "过期时间") + private Date expireTime; + + @Schema(description = "二维码类型(1. 小程序团购页面)") + private Integer type; + + @Schema(description = "二维码实际内容") + private String content; + + @Schema(description = "这个二维码要跳转的url") + private String ticketUrl; + + public Long getTicketId() { + return ticketId; + } + + public void setTicketId(Long ticketId) { + this.ticketId = ticketId; + } + + public String getTicket() { + return ticket; + } + + public void setTicket(String ticket) { + this.ticket = ticket; + } + + public Date getExpireTime() { + return expireTime; + } + + public void setExpireTime(Date expireTime) { + this.expireTime = expireTime; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getTicketUrl() { + return ticketUrl; + } + + public void setTicketUrl(String ticketUrl) { + this.ticketUrl = ticketUrl; + } + + @Override + public String toString() { + return "QrcodeTicketDTO{" + + "ticketId=" + ticketId + + ",ticket=" + ticket + + ",expireTime=" + expireTime + + ",type=" + type + + ",content=" + content + + ",ticketUrl=" + ticketUrl + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendOrderToPurchaseNotifyToShopConsumer.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendOrderToPurchaseNotifyToShopConsumer.java new file mode 100644 index 0000000..648292c --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendOrderToPurchaseNotifyToShopConsumer.java @@ -0,0 +1,25 @@ +package com.tmerclub.cloud.biz.linstener; + +import com.tmerclub.cloud.biz.service.SendMessageService; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +/** + * @author lanhai + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SEND_ORDER_TO_PURCHASE_NOTIFY_TO_SHOP_TOPIC, consumerGroup = RocketMqConstant.SEND_ORDER_TO_PURCHASE_NOTIFY_TO_SHOP_TOPIC) +public class SendOrderToPurchaseNotifyToShopConsumer implements RocketMQListener> { + @Autowired + private SendMessageService sendMessageService; + + @Override + public void onMessage(List sendNotify) { + sendMessageService.sendOrderToPurchaseNotifyMsgToShop(sendNotify); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/AttachFileMapper.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/AttachFileMapper.java new file mode 100644 index 0000000..3e1bda8 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/AttachFileMapper.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.mapper; + + +import com.tmerclub.cloud.biz.dto.AttachFileDTO; +import com.tmerclub.cloud.biz.model.AttachFile; +import com.tmerclub.cloud.biz.vo.AttachFileVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 上传文件记录表 + * + * @author YXF + * @date 2020-11-21 10:21:40 + */ +public interface AttachFileMapper { + + /** + * 获取上传文件记录表列表 + * + * @param attachFile + * @return 文件记录表列表 + */ + List list(@Param("attachFile") AttachFileDTO attachFile); + + /** + * 根据店铺id保存文件记录 + * + * @param attachFiles 上传文件记录表 + * @param shopId 店铺id + * @param uid uid + * @param sysType 系统类型 + */ + void save(@Param("attachFiles") List attachFiles, @Param("shopId") Long shopId, @Param("uid") Long uid, @Param("sysType") Integer sysType); + + /** + * 更新上传文件记录表 + * + * @param attachFile + * @param attachFile 上传文件记录表 + */ + void update(@Param("attachFile") AttachFile attachFile); + + /** + * 根据上传文件记录表id删除上传文件记录表 + * + * @param fileId + */ + void deleteById(@Param("fileId") Long fileId); + + /** + * 根据id获取文件信息 + * + * @param fileId + * @return + */ + AttachFile getById(@Param("fileId") Long fileId); + + /** + * 批量更新文件的分组 + * + * @param attachFileGroupId + */ + void updateBatchByAttachFileGroupId(@Param("attachFileGroupId") Long attachFileGroupId); + + /** + * 根据id列表获取文件信息列表 + * + * @param ids + * @return + */ + List getByIds(@Param("ids") List ids); + + /** + * 根据id列表批量删除文件记录 + * + * @param ids + */ + void batchDeleteByIds(@Param("ids") List ids); + + /** + * 根据店铺id与文件id列表与分组id批量移动文件 + * @param shopId + * @param ids + * @param groupId + * @param sysType + */ + void batchMoveByShopIdAndIdsAndGroupId(@Param("shopId") Long shopId, @Param("ids") List ids, @Param("groupId") Long groupId, @Param("sysType") Integer sysType); + + /** + * 根据uid更新店铺id + * + * @param shopId + * @param uid + */ + void updateShopIdByUid(@Param("shopId") Long shopId, @Param("uid") Long uid); + + /** + * 保存上传文件记录表 + * + * @param attachFile 上传文件记录表 + * @param uid + */ + void saveFile(@Param("attachFile") AttachFile attachFile, @Param("uid") Long uid); + + /** + * 根据文件路径获取文件类型 + * + * @param filePath + * @return + */ + String getfileTypeByfilePath(@Param("filePath") String filePath); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyTemplateRemindMapper.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyTemplateRemindMapper.java new file mode 100644 index 0000000..4d7657c --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyTemplateRemindMapper.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.mapper; + +import com.tmerclub.cloud.biz.dto.NotifyTemplateRemindDTO; +import com.tmerclub.cloud.biz.model.NotifyTemplateRemind; +import com.tmerclub.cloud.biz.vo.NotifyTemplateRemindVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 消息提醒设置 + * + * @author FrozenWatermelon + * @date 2022-10-24 13:48:38 + */ +public interface NotifyTemplateRemindMapper { + + /** + * 获取消息提醒设置列表 + * @param notifyTemplateRemindDTO + * @return 消息提醒设置列表 + */ + List list(@Param("notifyTemplateRemindDTO") NotifyTemplateRemindDTO notifyTemplateRemindDTO); + + /** + * 根据消息提醒设置id获取消息提醒设置 + * + * @param notifyTemplateRemindId 消息提醒设置id + * @return 消息提醒设置 + */ + NotifyTemplateRemind getByNotifyTemplateRemindId(@Param("notifyTemplateRemindId") Long notifyTemplateRemindId); + + /** + * 保存消息提醒设置 + * + * @param notifyTemplateRemind 消息提醒设置 + */ + void save(@Param("notifyTemplateRemind") NotifyTemplateRemind notifyTemplateRemind); + + /** + * 更新消息提醒设置 + * + * @param notifyTemplateRemind 消息提醒设置 + */ + void update(@Param("notifyTemplateRemind") NotifyTemplateRemind notifyTemplateRemind); + + /** + * 根据消息提醒设置id删除消息提醒设置 + * + * @param notifyTemplateRemindId + */ + void deleteById(@Param("notifyTemplateRemindId") Long notifyTemplateRemindId); + + /** + * 根据模板id、店铺id、系统类型查询消息提醒设置 + * + * @param templateId + * @param shopId + * @param sysType + * @return + */ + NotifyTemplateRemindVO getByTemplateIdAndShopIdAndSysType(@Param("templateId") Long templateId, @Param("shopId") Long shopId, @Param("sysType") Integer sysType); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/QrcodeTicketMapper.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/QrcodeTicketMapper.java new file mode 100644 index 0000000..d3c587f --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/QrcodeTicketMapper.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.mapper; + +import com.tmerclub.cloud.biz.model.QrcodeTicket; +import com.tmerclub.cloud.biz.vo.QrcodeTicketVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 二维码数据信息 + * + * @author cl + * @date 2021-08-13 15:32:12 + */ +public interface QrcodeTicketMapper { + + /** + * 获取二维码数据信息列表 + * @return 二维码数据信息列表 + */ + List list(); + + /** + * 根据二维码数据信息id获取二维码数据信息 + * + * @param ticketId 二维码数据信息id + * @return 二维码数据信息 + */ + QrcodeTicket getByTicketId(@Param("ticketId") Long ticketId); + + /** + * 保存二维码数据信息 + * @param qrcodeTicket 二维码数据信息 + */ + void save(@Param("qrcodeTicket") QrcodeTicket qrcodeTicket); + + /** + * 更新二维码数据信息 + * @param qrcodeTicket 二维码数据信息 + */ + void update(@Param("qrcodeTicket") QrcodeTicket qrcodeTicket); + + /** + * 根据二维码数据信息id删除二维码数据信息 + * @param ticketId + */ + void deleteById(@Param("ticketId") Long ticketId); + + /** + * 根据二维码获取二维码信息 + * @param ticket 二维码 + * @return 二维码信息 + */ + QrcodeTicketVO getByTicket(@Param("ticket") String ticket); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/AttachFile.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/AttachFile.java new file mode 100644 index 0000000..58f5aa6 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/AttachFile.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 上传文件记录表 + * + * @author FrozenWatermelon + * @date 2020-11-21 10:21:40 + */ +public class AttachFile extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long fileId; + + /** + * 文件路径 + */ + private String filePath; + + /** + * 文件类型 + */ + private String fileType; + + /** + * 文件名 + */ + private String fileName; + + /** + * 文件大小 + */ + private Integer fileSize; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 文件 1:图片 2:视频 3:文件 + */ + private Integer type; + + /** + * 文件分组id(0:默认为所有) + */ + private Long attachFileGroupId; + + @Schema(description = "系统类型 1.商家端 2.平台端 3.供应商端") + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getFileId() { + return fileId; + } + + public void setFileId(Long fileId) { + this.fileId = fileId; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public Integer getFileSize() { + return fileSize; + } + + public void setFileSize(Integer fileSize) { + this.fileSize = fileSize; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getAttachFileGroupId() { + return attachFileGroupId; + } + + public void setAttachFileGroupId(Long attachFileGroupId) { + this.attachFileGroupId = attachFileGroupId; + } + + @Override + public String toString() { + return "AttachFile{" + + "fileId=" + fileId + + ", filePath='" + filePath + '\'' + + ", fileType='" + fileType + '\'' + + ", fileName='" + fileName + '\'' + + ", fileSize=" + fileSize + + ", shopId=" + shopId + + ", type=" + type + + ", attachFileGroupId=" + attachFileGroupId + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/AttachFileGroup.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/AttachFileGroup.java new file mode 100644 index 0000000..9d1c6d5 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/AttachFileGroup.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author YXF + * @date 2020-12-04 16:15:02 + */ +public class AttachFileGroup extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long attachFileGroupId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 用户uid + */ + private Long uid; + + /** + * 分组名称 + */ + private String name; + + /** + * 1:图片 2:视频 3:文件 + */ + private Integer type; + /** + * 系统类型 1.商家端 2.平台端 3.供应商端 + */ + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public Long getAttachFileGroupId() { + return attachFileGroupId; + } + + public void setAttachFileGroupId(Long attachFileGroupId) { + this.attachFileGroupId = attachFileGroupId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "AttachFileGroup{" + + "attachFileGroupId=" + attachFileGroupId + + ", shopId=" + shopId + + ", uid=" + uid + + ", name='" + name + '\'' + + ", type=" + type + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplate.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplate.java new file mode 100644 index 0000000..4aa13b2 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplate.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author FrozenWatermelon + * @date 2021-01-16 15:01:14 + */ +public class NotifyTemplate extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 消息模板表 + */ + private Long templateId; + + /** + * 1.订单催付 2.付款成功通知 3.商家同意退款 4.商家拒绝退款 5.核销提醒 6.发货提醒 7.拼团失败提醒 8.拼团成功提醒 9.拼团开团提醒 10.会员升级提醒 + * 11.退款临近超时提醒 102.确认收货提醒 103.买家发起退款提醒 104.买家已退货提醒 + */ + private Integer sendType; + + /** + * 通知内容 + */ + private String message; + + /** + * 通知方式集合用逗号分隔 1.短信 2.公众号 3.站内消息 + */ + private String notifyTypes; + + /** + * 短信模板code + */ + private String templateCode; + + /** + * 公众号消息模板code + */ + private String mpCode; + + /** + * 0.自定义消息 1.为全部发送给用户消息,2.为发送给商家的 + */ + private Integer msgType; + + /** + * 1启用 0禁用 + */ + private Integer status; + + /** + * 可用通知方式集合用逗号分隔 1.短信 2.公众号 3.站内消息 + */ + private static final Boolean SMS = false; + + private static final Boolean APP = false; + + private static final Boolean SUB = false; + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getNotifyTypes() { + return notifyTypes; + } + + public void setNotifyTypes(String notifyTypes) { + this.notifyTypes = notifyTypes; + } + + public String getTemplateCode() { + return templateCode; + } + + public void setTemplateCode(String templateCode) { + this.templateCode = templateCode; + } + + public String getMpCode() { + return mpCode; + } + + public void setMpCode(String mpCode) { + this.mpCode = mpCode; + } + + public Integer getMsgType() { + return msgType; + } + + public void setMsgType(Integer msgType) { + this.msgType = msgType; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "NotifyTemplate{" + + "templateId=" + templateId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",sendType=" + sendType + + ",message=" + message + + ",notifyTypes=" + notifyTypes + + ",templateCode=" + templateCode + + ",mpCode=" + mpCode + + ",msgType=" + msgType + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplateRemind.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplateRemind.java new file mode 100644 index 0000000..1aa6529 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplateRemind.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 消息提醒设置 + * + * @author FrozenWatermelon + * @date 2022-10-24 13:48:38 + */ +public class NotifyTemplateRemind extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 消息提醒设置 + */ + private Long notifyTemplateRemindId; + + /** + * 消息模板id + */ + private Long templateId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 是否开启提醒 1开启 0关闭 + */ + private Integer isRemind; + + /** + * 系统类型(1.店铺 2.平台端 3.供应商) + */ + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getNotifyTemplateRemindId() { + return notifyTemplateRemindId; + } + + public void setNotifyTemplateRemindId(Long notifyTemplateRemindId) { + this.notifyTemplateRemindId = notifyTemplateRemindId; + } + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getIsRemind() { + return isRemind; + } + + public void setIsRemind(Integer isRemind) { + this.isRemind = isRemind; + } + + @Override + public String toString() { + return "NotifyTemplateRemind{" + + "notifyTemplateRemindId=" + notifyTemplateRemindId + + ", templateId=" + templateId + + ", shopId=" + shopId + + ", isRemind=" + isRemind + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/QrcodeTicket.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/QrcodeTicket.java new file mode 100644 index 0000000..447cbe5 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/QrcodeTicket.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 二维码数据信息 + * + * @author cl + * @date 2021-08-13 15:32:12 + */ +public class QrcodeTicket extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 二维码ticket id + */ + private Long ticketId; + + /** + * 二维码ticket + */ + private String ticket; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 二维码类型(1. 小程序团购页面) + */ + private Integer type; + + /** + * 二维码实际内容 + */ + private String content; + + /** + * 这个二维码要跳转的url + */ + private String ticketUrl; + + public Long getTicketId() { + return ticketId; + } + + public void setTicketId(Long ticketId) { + this.ticketId = ticketId; + } + + public String getTicket() { + return ticket; + } + + public void setTicket(String ticket) { + this.ticket = ticket; + } + + public Date getExpireTime() { + return expireTime; + } + + public void setExpireTime(Date expireTime) { + this.expireTime = expireTime; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getTicketUrl() { + return ticketUrl; + } + + public void setTicketUrl(String ticketUrl) { + this.ticketUrl = ticketUrl; + } + + @Override + public String toString() { + return "QrcodeTicket{" + + "ticketId=" + ticketId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",ticket=" + ticket + + ",expireTime=" + expireTime + + ",type=" + type + + ",content=" + content + + ",ticketUrl=" + ticketUrl + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/AttachFileService.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/AttachFileService.java new file mode 100644 index 0000000..1fa93ac --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/AttachFileService.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service; + +import com.tmerclub.cloud.biz.dto.AttachFileDTO; +import com.tmerclub.cloud.biz.model.AttachFile; +import com.tmerclub.cloud.biz.vo.AttachFileVO; +import com.tmerclub.cloud.biz.vo.PreSignUrlVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; + +import java.util.List; + +/** + * 上传文件记录表 + * + * @author YXF + * @date 2020-11-21 10:21:40 + */ +public interface AttachFileService { + + /** + * 分页获取上传文件记录表列表 + * @param pageDTO 分页参数 + * @param attachFileDTO 文件名 + * @return 上传文件记录表列表分页数据 + */ + PageVO page(PageDTO pageDTO, AttachFileDTO attachFileDTO); + + /** + * 根据文件id查询文件信息 + * @param fileId + * @return + */ + AttachFileVO getById(Long fileId); + + /** + * 保存多个上传文件记录表 + * @param attachFiles 上传多个文件记录表 + */ + void save(List attachFiles); + + /** + * 更新上传文件记录表 + * @param attachFile 上传文件记录表 + */ + void update(AttachFile attachFile); + + /** + * 根据上传文件记录表id删除上传文件记录表 + * @param fileId + */ + void deleteById(Long fileId); + + /** + * 更新文件名称 + * @param attachFile + */ + void updateFileName(AttachFile attachFile); + + /** + * 根据文件Id列表与店铺id批量删除文件记录 + * @param ids + * @param shopId + */ + void deleteByIdsAndShopId(List ids, Long shopId); + + /** + * 根据店铺id与文件id列表与分组id批量移动文件 + * @param shopId + * @param ids + * @param groupId + * @param sysType + */ + void batchMoveByShopIdAndIdsAndGroupId(Long shopId, List ids, Long groupId, Integer sysType); + + /** + * 根据uid更新店铺id + * @param shopId + * @param uid + */ + void updateShopIdByUid(Long shopId, Long uid); + + /** + * 保存上传文件记录表 + * @param attachFile 上传文件记录表 + */ + void saveFile(AttachFile attachFile); + + /** + * 根据文件路径获取文件类型 + * @param filePath + * @return + */ + String getfileTypeByfilePath(String filePath); + + /** + * 批量获取预签名url + * @param fileNames 文件名集合 + * @return 预签名vo集合 + */ + List getBatchPreSignUrl(List fileNames); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateRemindService.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateRemindService.java new file mode 100644 index 0000000..d2be36a --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateRemindService.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service; + +import com.tmerclub.cloud.biz.dto.NotifyTemplateRemindDTO; +import com.tmerclub.cloud.biz.model.NotifyTemplateRemind; +import com.tmerclub.cloud.biz.vo.NotifyTemplateRemindVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; + +/** + * 消息提醒设置 + * + * @author FrozenWatermelon + * @date 2022-10-24 13:48:38 + */ +public interface NotifyTemplateRemindService { + + /** + * 分页获取消息提醒设置列表 + * @param pageDTO 分页参数 + * @param notifyTemplateRemindDTO + * @return 消息提醒设置列表分页数据 + */ + PageVO page(PageDTO pageDTO, NotifyTemplateRemindDTO notifyTemplateRemindDTO); + + /** + * 根据消息提醒设置id获取消息提醒设置 + * + * @param notifyTemplateRemindId 消息提醒设置id + * @return 消息提醒设置 + */ + NotifyTemplateRemind getByNotifyTemplateRemindId(Long notifyTemplateRemindId); + + /** + * 保存消息提醒设置 + * @param notifyTemplateRemind 消息提醒设置 + */ + void save(NotifyTemplateRemind notifyTemplateRemind); + + /** + * 更新消息提醒设置 + * @param notifyTemplateRemind 消息提醒设置 + */ + void update(NotifyTemplateRemind notifyTemplateRemind); + + /** + * 根据消息提醒设置id删除消息提醒设置 + * @param notifyTemplateRemindId 消息提醒设置id + */ + void deleteById(Long notifyTemplateRemindId); + + /** + * 根据信息获取 + * @param templateId + * @param shopId + * @param sysType + * @return + */ + NotifyTemplateRemindVO getByTemplateIdAndShopIdAndSysType(Long templateId, Long shopId, Integer sysType); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateService.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateService.java new file mode 100644 index 0000000..243e097 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateService.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service; + +import com.tmerclub.cloud.biz.dto.NotifyTemplateDTO; +import com.tmerclub.cloud.biz.model.NotifyTemplate; +import com.tmerclub.cloud.biz.vo.NotifyTemplateVO; +import com.tmerclub.cloud.biz.vo.SmsCodeTemplateVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; + +/** + * + * + * @author FrozenWatermelon + * @date 2021-01-16 15:01:14 + */ +public interface NotifyTemplateService { + + /** + * 分页获取列表 + * @param pageDTO 分页参数 + * @param notifyTemplate + * @return 列表分页数据 + */ + PageVO page(PageDTO pageDTO, NotifyTemplateDTO notifyTemplate); + + /** + * 根据id获取 + * + * @param templateId id + * @return + */ + NotifyTemplateVO getByTemplateId(Long templateId); + + /** + * 保存 + * @param notifyTemplate + */ + void save(NotifyTemplate notifyTemplate); + + /** + * 更新 + * @param notifyTemplate + */ + void update(NotifyTemplate notifyTemplate); + + /** + * 根据id删除 + * @param templateId id + */ + void deleteById(Long templateId); + + + /** + * 根据发送类型和店铺id,获取通知模板及店家发送类型 + * @param sendType 发送类型 + * @return 通知模板 + */ + NotifyTemplateVO getBySendType(Integer sendType); + + /** + * 获取短信验证码模板信息 + * @param sendType 模板类型 + * @return 短信验证码模板信息 + */ + SmsCodeTemplateVO getSmsCodeTemplateBySendType(Integer sendType); + + /** + * 根据发送类型及非当前模板id获取当前消息类型数量 + * @param sendType 发送类型 + * @param templateId 模板id + * @return 数量 + */ + Integer countBySendType(Integer sendType, Long templateId); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateTagService.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateTagService.java new file mode 100644 index 0000000..ea652d6 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateTagService.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service; + +import com.tmerclub.cloud.biz.dto.NotifyTemplateDTO; +import com.tmerclub.cloud.biz.model.NotifyTemplate; +import com.tmerclub.cloud.biz.model.NotifyTemplateTag; +import com.tmerclub.cloud.biz.vo.NotifyTemplateVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; + +import java.util.List; + +/** + * + * + * @author cl + * @date 2021-05-20 11:09:53 + */ +public interface NotifyTemplateTagService { + + /** + * 分页获取列表 + * @param pageDTO 分页参数 + * @return 列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据id获取 + * + * @param notifyTagId id + * @return + */ + NotifyTemplateTag getByNotifyTagId(Long notifyTagId); + + /** + * 保存 + * @param notifyTemplateTag + */ + void save(NotifyTemplateTag notifyTemplateTag); + + /** + * 更新 + * @param notifyTemplateTag + */ + void update(NotifyTemplateTag notifyTemplateTag); + + /** + * 根据id删除 + * @param notifyTagId id + */ + void deleteById(Long notifyTagId); + + /** + * 分页获取标签消息列表 + * @param pageDTO 分页参数 + * @return + */ + PageVO pageTagNotify(PageDTO pageDTO); + + /** + * 保存标签消息模板 + * @param notifyTemplate 消息模板 + * @param tagIds 标签id + */ + void saveTagNotify(NotifyTemplate notifyTemplate, List tagIds); + + /** + * 删除模板并且删除模板下的所有关联标签信息 + * @param templateId 模板id + * @return 删除行数 + */ + void deleteTemplateTagByTempLateId(Long templateId); + + /** + * 给模板消息的标签用户发送站内小心 + * @param templateId + */ + void sendMsg(Long templateId); + + /** + * 根据模板id获取模板信息 + * @param templateId 模板id + * @return 模板信息(包含模板下的标签信息) + */ + NotifyTemplateVO getByTemplateId(Long templateId); + + /** + * 修改消息模板(包含模板下的标签信息) + * @param notifyTemplateDTO 模板参数 + */ + void updateTemplateAndTag(NotifyTemplateDTO notifyTemplateDTO); + + /** + * 根据标签id删除模板与标签关联关系 + * @param tagId + */ + void deleteByTagId(Long tagId); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/AttachFileServiceImpl.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/AttachFileServiceImpl.java new file mode 100644 index 0000000..1adcb2b --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/AttachFileServiceImpl.java @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.biz.config.AwsS3Config; +import com.tmerclub.cloud.biz.dto.AttachFileDTO; +import com.tmerclub.cloud.biz.mapper.AttachFileMapper; +import com.tmerclub.cloud.biz.model.AttachFile; +import com.tmerclub.cloud.biz.service.AttachFileGroupService; +import com.tmerclub.cloud.biz.service.AttachFileService; +import com.tmerclub.cloud.biz.vo.AttachFileGroupVO; +import com.tmerclub.cloud.biz.vo.AttachFileVO; +import com.tmerclub.cloud.biz.vo.PreSignUrlVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 上传文件记录表 + * + * @author YXF + */ +@SuppressWarnings("CommentedOutCode") +@Service +public class AttachFileServiceImpl implements AttachFileService { + + /** + * 上传的文件夹(根据时间确定) + */ + public static final String NORM_DAY_PATTERN = "yyyy/MM/dd"; + + @Autowired + private AttachFileMapper attachFileMapper; + + @Autowired + private AttachFileGroupService attachFileGroupService; + + @Autowired + private AwsS3Config awsS3Config; + + @Override + public PageVO page(PageDTO pageDTO, AttachFileDTO attachFileDTO) { + if (Objects.equals(AuthUserContext.get().getTenantId(), Constant.DEFAULT_SHOP_ID) || Objects.equals(AuthUserContext.get().getTenantId(), Constant.DEFAULT_SUPPLIER_ID)) { + // 如果店铺id还没有生成,使用uid查找文件信息 + attachFileDTO.setShopId(null); + attachFileDTO.setUid(AuthUserContext.getAccountUid()); + } else { + attachFileDTO.setUid(null); + attachFileDTO.setShopId(AuthUserContext.get().getTenantId()); + } + attachFileDTO.setSysType(AuthUserContext.get().getSysType()); + return PageUtil.doPage(pageDTO, () -> attachFileMapper.list(attachFileDTO)); + } + + @Override + public AttachFileVO getById(Long fileId) { + return BeanUtil.map(attachFileMapper.getById(fileId), AttachFileVO.class); + } + + @Override + public void save(List attachFiles) { + attachFileMapper.save(attachFiles, AuthUserContext.get().getTenantId(), AuthUserContext.getAccountUid(), AuthUserContext.get().getSysType()); + } + + @Override + public void update(AttachFile attachFile) { + attachFileMapper.update(attachFile); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteById(Long fileId) { + AttachFile attachFile = attachFileMapper.getById(fileId); + // 获取文件的实际路径--数据库中保存的文件路径为: / + 实际的文件路径 + String filePath = attachFile.getFilePath(); + if (StrUtil.isNotBlank(filePath)) { + filePath = filePath.substring(1); + } + awsS3Config.deleteFile(filePath); + attachFileMapper.deleteById(fileId); + } + + @Override + public void updateFileName(AttachFile attachFile) { + if (Objects.isNull(attachFile.getFileName()) && Objects.isNull(attachFile.getAttachFileGroupId())) { + return; + } + attachFileMapper.update(attachFile); + } + + @Override + public void deleteByIdsAndShopId(List ids, Long shopId) { + List attachFileList = attachFileMapper.getByIds(ids); + // 获取文件的实际路径--数据库中保存的文件路径为: / + 实际的文件路径 + List filePaths = attachFileList.stream().map(item -> { + if (!Objects.equals(item.getShopId(), shopId)) { + throw new LuckException("存在非本店铺下的文件,删除失败"); + } + return item.getFilePath().substring(1); + }).collect(Collectors.toList()); + awsS3Config.deleteBatchFile(filePaths); + attachFileMapper.batchDeleteByIds(ids); + } + + @Override + public void batchMoveByShopIdAndIdsAndGroupId(Long shopId, List ids, Long groupId, Integer sysType) { + if (Objects.nonNull(groupId)) { + AttachFileGroupVO attachFileGroupVO = attachFileGroupService.getByAttachFileGroupId(groupId); + if (Objects.isNull(attachFileGroupVO)) { + throw new LuckException("当前分组已不存在,请刷新后重试"); + } + if (!Objects.equals(attachFileGroupVO.getShopId(), shopId)) { + throw new LuckException("分组信息错误"); + } + } + attachFileMapper.batchMoveByShopIdAndIdsAndGroupId(shopId, ids, groupId, sysType); + } + + @Override + public void updateShopIdByUid(Long shopId, Long uid) { + attachFileMapper.updateShopIdByUid(shopId, uid); + } + + @Override + public void saveFile(AttachFile attachFile) { + attachFileMapper.saveFile(attachFile, AuthUserContext.getAccountUid()); + } + + @Override + public String getfileTypeByfilePath(String filePath) { + return attachFileMapper.getfileTypeByfilePath(filePath); + } + + @Override + public List getBatchPreSignUrl(List fileNames) { + if (CollectionUtils.isEmpty(fileNames)) { + return new ArrayList<>(); + } + List preSignUrlVOList = new ArrayList<>(fileNames.size()); + List filePaths = new ArrayList<>(fileNames.size()); + PreSignUrlVO preSignUrlVO; + for (String fileName : fileNames) { + this.checkFileName(fileName); + preSignUrlVO = new PreSignUrlVO(); + preSignUrlVO.setDir(DateUtil.format(new Date(), NORM_DAY_PATTERN) + "/"); + preSignUrlVO.setFileName(IdUtil.simpleUUID() + "." + FileUtil.extName(fileName)); + preSignUrlVOList.add(preSignUrlVO); + filePaths.add(preSignUrlVO.getDir() + preSignUrlVO.getFileName()); + } + // 批量获取预签名 + List preSignUrls = awsS3Config.getBatchPreSignUrl(filePaths); + for (int i=0; i pageBySendTypeAndRemindType(PageDTO page, Long userId, Integer msgType, Integer status) { + // 不要用已读未读及更新时间作为排序的条件,查询消息列表时未读消息会更新为已读消息,此时消息读取状态发生、更新时间发生改变 + return PageUtil.doPage(page, () -> notifyLogMapper.listBySendTypeAndRemindType(userId, msgType, status)); + } + + @Override + public PageVO pageShopNotifyLogByParam(PageDTO page, NotifyLogDTO notifyLogDTO) { + return PageUtil.doPage(page, () -> notifyLogMapper.list(notifyLogDTO)); + } + + @Override + public void updateBatchById(List notifyLogList) { + notifyLogMapper.updateBatchById(notifyLogList); + } + + @Override + public int countUnreadBySendTypeAndRemindType(Long userId, Integer msgType) { + List notifyLogList = notifyLogMapper.listBySendTypeAndRemindType(userId, msgType, StatusEnum.DISABLE.value()); + + return CollectionUtil.isEmpty(notifyLogList) ? 0 : notifyLogList.size(); + } + + @Override + public void saveBatch(List notifyLogs) { + notifyLogMapper.saveBatch(notifyLogs); + } + + @Override + public PageVO page(PageDTO pageDTO, NotifyLogDTO notifyLogDTO) { + PageVO page = PageUtil.doPage(pageDTO, () -> notifyLogMapper.list(notifyLogDTO)); + return page; + } + + @Override + public int countNotifyByConditions(Long orderId, Integer level, Long userId, Integer sendType) { + return notifyLogMapper.countNotifyByConditions(orderId, level, userId, sendType); + } + + private ShopSimpleBO getShopInfo(List shopSimpleList, Long shopId) { + if (CollUtil.isEmpty(shopSimpleList) || Objects.isNull(shopId)) { + return null; + } + int leftIndex = 0, rightIndex = shopSimpleList.size() - 1, midIndex; + while (leftIndex <= rightIndex) { + midIndex = leftIndex + ((rightIndex - leftIndex) >>> 1); + ShopSimpleBO shopSimpleBO = shopSimpleList.get(midIndex); + if (Objects.equals(shopSimpleBO.getShopId(), shopId)) { + return shopSimpleBO; + } + if (shopSimpleBO.getShopId() < shopId) { + leftIndex = midIndex + 1; + } else { + rightIndex = midIndex - 1; + } + } + return null; + } + + @Override + public void updateStatus(Long id) { + notifyLogMapper.updateStatus(id); + } + + @Override + public NotifyLogVO getByLogId(Long logId) { + return notifyLogMapper.getByLogId(logId); + } + + @Override + public void isReadByIds(List logIds) { + notifyLogMapper.isReadByIds(logIds); + } + + @Override + public void isReadByShopId(Long shopId) { + notifyLogMapper.isReadByShopId(shopId); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateServiceImpl.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateServiceImpl.java new file mode 100644 index 0000000..7e5e1db --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateServiceImpl.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service.impl; + +import com.tmerclub.cloud.biz.dto.NotifyTemplateDTO; +import com.tmerclub.cloud.biz.mapper.NotifyTemplateMapper; +import com.tmerclub.cloud.biz.model.NotifyTemplate; +import com.tmerclub.cloud.biz.service.NotifyTemplateService; +import com.tmerclub.cloud.biz.vo.NotifyTemplateVO; +import com.tmerclub.cloud.biz.vo.SmsCodeTemplateVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +/** + * @author FrozenWatermelon + * @date 2021-01-16 15:01:14 + */ +@Service +public class NotifyTemplateServiceImpl implements NotifyTemplateService { + + @Autowired + private NotifyTemplateMapper notifyTemplateMapper; + + @Override + public PageVO page(PageDTO pageDTO, NotifyTemplateDTO notifyTemplate) { + return PageUtil.doPage(pageDTO, () -> notifyTemplateMapper.list(notifyTemplate)); + } + + @Override + public NotifyTemplateVO getByTemplateId(Long templateId) { + return notifyTemplateMapper.getByTemplateId(templateId); + } + + @Override + @CacheEvict(cacheNames = CacheNames.SMS_CODE_KEY, key = "#notifyTemplate.sendType") + public void save(NotifyTemplate notifyTemplate) { + notifyTemplateMapper.save(notifyTemplate); + } + + @Override + @CacheEvict(cacheNames = CacheNames.SMS_CODE_KEY, key = "#notifyTemplate.sendType") + public void update(NotifyTemplate notifyTemplate) { + notifyTemplateMapper.update(notifyTemplate); + } + + @Override + public void deleteById(Long templateId) { + notifyTemplateMapper.deleteById(templateId); + } + + @Override + public NotifyTemplateVO getBySendType(Integer sendType) { + return notifyTemplateMapper.getBySendType(sendType); + } + + @Override + @Cacheable(cacheNames = CacheNames.SMS_CODE_KEY, key = "#sendType") + public SmsCodeTemplateVO getSmsCodeTemplateBySendType(Integer sendType) { + return notifyTemplateMapper.getSmsCodeTemplateBySendType(sendType); + } + + @Override + public Integer countBySendType(Integer sendType, Long templateId) { + return notifyTemplateMapper.countBySendType(sendType, templateId); + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateShopServiceImpl.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateShopServiceImpl.java new file mode 100644 index 0000000..a8b5f8a --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateShopServiceImpl.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service.impl; + +import com.tmerclub.cloud.biz.mapper.NotifyTemplateShopMapper; +import com.tmerclub.cloud.biz.model.NotifyTemplateShop; +import com.tmerclub.cloud.biz.service.NotifyTemplateShopService; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * + * + * @author FrozenWatermelon + * @date 2021-01-16 15:01:14 + */ +@Service +public class NotifyTemplateShopServiceImpl implements NotifyTemplateShopService { + + @Autowired + private NotifyTemplateShopMapper notifyTemplateShopMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> notifyTemplateShopMapper.list()); + } + + @Override + public NotifyTemplateShop getByNotifyShopId(Long notifyShopId) { + return notifyTemplateShopMapper.getByNotifyShopId(notifyShopId); + } + + @Override + public void save(NotifyTemplateShop notifyTemplateShop) { + notifyTemplateShopMapper.save(notifyTemplateShop); + } + + @Override + public void update(NotifyTemplateShop notifyTemplateShop) { + notifyTemplateShopMapper.update(notifyTemplateShop); + } + + @Override + public void deleteById(Long notifyShopId) { + notifyTemplateShopMapper.deleteById(notifyShopId); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/QrcodeTicketServiceImpl.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/QrcodeTicketServiceImpl.java new file mode 100644 index 0000000..d4d1cbc --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/QrcodeTicketServiceImpl.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service.impl; + +import com.tmerclub.cloud.biz.mapper.QrcodeTicketMapper; +import com.tmerclub.cloud.biz.model.QrcodeTicket; +import com.tmerclub.cloud.biz.service.QrcodeTicketService; +import com.tmerclub.cloud.biz.vo.QrcodeTicketVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 二维码数据信息 + * + * @author cl + * @date 2021-08-13 15:32:12 + */ +@Service +public class QrcodeTicketServiceImpl implements QrcodeTicketService { + + @Autowired + private QrcodeTicketMapper qrcodeTicketMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> qrcodeTicketMapper.list()); + } + + @Override + public QrcodeTicket getByTicketId(Long ticketId) { + return qrcodeTicketMapper.getByTicketId(ticketId); + } + + @Override + public void save(QrcodeTicket qrcodeTicket) { + qrcodeTicketMapper.save(qrcodeTicket); + } + + @Override + public void update(QrcodeTicket qrcodeTicket) { + qrcodeTicketMapper.update(qrcodeTicket); + } + + @Override + public void deleteById(Long ticketId) { + qrcodeTicketMapper.deleteById(ticketId); + } + + @Override + public QrcodeTicketVO getByTicket(String ticket) { + return qrcodeTicketMapper.getByTicket(ticket); + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/SendMessageServiceImpl.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/SendMessageServiceImpl.java new file mode 100644 index 0000000..ba5289e --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/SendMessageServiceImpl.java @@ -0,0 +1,558 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service.impl; + +import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; +import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.api.supplier.bo.SupplierDetailBO; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.biz.config.WxConfig; +import com.tmerclub.cloud.biz.constant.NotifyType; +import com.tmerclub.cloud.biz.constant.RemindType; +import com.tmerclub.cloud.biz.model.NotifyLog; +import com.tmerclub.cloud.biz.service.*; +import com.tmerclub.cloud.biz.vo.NotifyParamVO; +import com.tmerclub.cloud.biz.vo.NotifyTemplateRemindVO; +import com.tmerclub.cloud.biz.vo.NotifyTemplateVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import me.chanjar.weixin.common.error.WxErrorException; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.BooleanUtils; +import org.apache.dubbo.config.annotation.DubboReference; +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 java.util.*; + + +/** + * 统一发送通知的事件 + * + * @author lhd + */ +@Service +public class SendMessageServiceImpl implements SendMessageService { + + private static final Logger logger = LoggerFactory.getLogger(SendMessageServiceImpl.class); + + @Autowired + private NotifyLogService notifyLogService; + @Autowired + private SmsLogService smsLogService; + @Autowired + private FeignShopConfig feignShopConfig; + @Autowired + private WxConfig wxConfig; + @Autowired + private NotifyTemplateService notifyTemplateService; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @DubboReference + private UserFeignClient userFeignClient; + @Autowired + private NotifyTemplateRemindService notifyTemplateRemindService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void sendMsg(NotifyParamVO notifyParamVO) { + if (Objects.isNull(notifyParamVO)) { + return; + } + //发送给供应商的消息提醒 + SupplierDetailBO supplierDetailBO = new SupplierDetailBO(); + if (Objects.isNull(notifyParamVO.getShopId()) && Objects.nonNull(notifyParamVO.getSupplierId())) { + supplierDetailBO = supplierDetailFeignClient.getSupplierBySupplierId(notifyParamVO.getSupplierId()).getData(); + notifyParamVO.setMobile(supplierDetailBO.getContactPhone()); + } + EsShopDetailBO shopDetailBO = shopDetailFeignClient.getShopByShopId(notifyParamVO.getShopId()).getData(); + String shopName = getAndSetShopName(notifyParamVO, supplierDetailBO, shopDetailBO); + // 判断是什么类型,如果是发送给商家的,则修改手机号码,并且只需要推送手机号码即可 + SendTypeEnum sendTypeEnum = SendTypeEnum.instance(notifyParamVO.getSendType()); + if (Objects.nonNull(sendTypeEnum) && Objects.equals(sendTypeEnum.getType(), SendTypeEnum.RECEIPT_ORDER.getType())) { + notifyParamVO.setMobile(shopDetailBO.getContactPhone()); + } + //获取模板的发送方式,获取商家选择的发送方式 + NotifyTemplateVO template = notifyTemplateService.getBySendType(notifyParamVO.getSendType()); + //是否开启消息提醒 + Boolean notifyLogStatus = false; + + //判断商家端和供应商的消息提醒设置 + Integer sysType = Objects.nonNull(notifyParamVO.getShopId()) ? SysTypeEnum.MULTISHOP.value() : SysTypeEnum.SUPPLIER.value(); + Long tenantId = Objects.nonNull(notifyParamVO.getShopId()) ? notifyParamVO.getShopId() : notifyParamVO.getSupplierId(); + NotifyTemplateRemindVO notifyTemplateRemindVO = notifyTemplateRemindService.getByTemplateIdAndShopIdAndSysType(template.getTemplateId(), tenantId, sysType); + if (Objects.equals(template.getStatus(), StatusEnum.DISABLE.value())) { + return; + } + //设置关闭消息提醒 则生不成消息记录 + if (Objects.nonNull(notifyTemplateRemindVO) && Objects.equals(notifyTemplateRemindVO.getIsRemind(), RemindType.CLOSED.value())) { + notifyLogStatus = true; + } + setNotifyParamInfo(notifyParamVO, tenantId); + String openId = ""; + if(Objects.nonNull(notifyParamVO.getUserId())) { + ServerResponseEntity userData = userFeignClient.getUserAndOpenIdsByUserId(notifyParamVO.getUserId()); + UserApiVO user = userData.getData(); + + if (Objects.nonNull(user)) { + if (CollectionUtils.isNotEmpty(user.getBizUserIdList())) { + openId = user.getBizUserIdList().get(0); + } + notifyParamVO.setNickName(user.getNickName()); + // 截取字符串,处理过长名称 + user.setNickName(user.getNickName().substring(0, Math.min(19, user.getNickName().length() - 1))); + } + } + + // 分别根据平台和商家的配置进行设置可以发送通知的类型 + // 设置平台的消息通知类型 + setNotifyType(template); + // 获取对应map + Map smsParam = getSmsParam(notifyParamVO, shopName); + String content = replaceContent(smsParam, template.getMessage()); + // 保存的通知集合 + List notifyLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + boolean sendSms = false; + if (template.getSms() && BooleanUtils.isFalse(notifyLogStatus)) { + if (Objects.nonNull(sendTypeEnum) && Objects.equals(sendTypeEnum.getType(), SendTypeEnum.RECEIPT_ORDER.getType()) && StrUtil.isBlank(notifyParamVO.getMobile())) { + logger.warn("{}店铺暂未配置接收通知的手机号,无法推送消息", shopName); + return; + } + // 替换消息内容 + addNotifyLog(notifyParamVO, content, template, true, NotifyType.SMS.value(), notifyLogs); + sendSms = true; + } + //站内消息 + if (template.getApp() && BooleanUtils.isFalse(notifyLogStatus)) { + notifyParamVO.setShopName(shopName); + addNotifyLog(notifyParamVO, content, template, false, NotifyType.APP.value(), notifyLogs); + } + // 公众号 + if (template.getSub() && StrUtil.isNotBlank(openId) && BooleanUtils.isFalse(notifyLogStatus)) { + sendMessage(template, notifyParamVO, openId, shopName); + addNotifyLog(notifyParamVO, content, template, true, NotifyType.MP.value(), notifyLogs); + } + + if (CollectionUtils.isNotEmpty(notifyLogs)) { + notifyLogService.saveBatch(notifyLogs); + } + if (sendSms) { + smsLogService.sendMsgSms(template.getTemplateCode(), notifyParamVO.getMobile(), smsParam); + } + + } + + private static void setNotifyParamInfo(NotifyParamVO notifyParamVO, Long tenantId) { + // 截取字符串,处理过长商品名称 + if (StrUtil.isNotBlank(notifyParamVO.getSpuName())) { + notifyParamVO.setSpuName(notifyParamVO.getSpuName()); + } + // 处理数据 + notifyParamVO.setShopId(tenantId); + notifyParamVO.setHour(Objects.isNull(notifyParamVO.getHour()) ? 0 : notifyParamVO.getHour()); + notifyParamVO.setProdNum(Objects.isNull(notifyParamVO.getProdNum()) ? 0 : notifyParamVO.getProdNum()); + notifyParamVO.setGroupCount(Objects.isNull(notifyParamVO.getGroupCount()) ? 0 : notifyParamVO.getGroupCount()); + notifyParamVO.setPrice(Objects.isNull(notifyParamVO.getPrice()) ? 0.0 : notifyParamVO.getPrice()); + notifyParamVO.setPayType(Objects.isNull(notifyParamVO.getPayType()) ? 1 : notifyParamVO.getPayType()); + notifyParamVO.setDvyTime(Objects.isNull(notifyParamVO.getDvyTime()) ? new Date() : notifyParamVO.getDvyTime()); + } + + private static String getAndSetShopName(NotifyParamVO notifyParamVO, SupplierDetailBO supplierDetailBO, EsShopDetailBO shopDetailBO) { + String shopName; + if (Objects.equals(notifyParamVO.getShopId(), Constant.PLATFORM_SHOP_ID)) { + shopName = Constant.PLATFORM_SHOP_NAME; + } else { + shopName = Objects.nonNull(notifyParamVO.getShopId()) ? shopDetailBO.getShopName() : supplierDetailBO.getSupplierName(); + } + notifyParamVO.setShopName(shopName); + return shopName; + } + + @Override + public void sendOrderNotifyMsgToUser(List notifyList) { + SendNotifyBO sendNotifyBO = notifyList.get(0); + // 注意幂等性,判断下消息是否已经推送过 + if (checkNotifyIsSend(sendNotifyBO.getBizId(), sendNotifyBO.getUserId(), sendNotifyBO.getSendType())) { + return; + } + // 批量推送订单事件消息给用户 + List notifyParamList = BeanUtil.mapAsList(notifyList, NotifyParamVO.class); + for (NotifyParamVO notifyParamVO : notifyParamList) { + sendMsg(notifyParamVO); + } + + } + + @Override + public void sendOrderNotifyMsgToShop(SendNotifyBO sendNotifyBO) { + // 注意幂等性,判断下消息是否已经推送过 + if (checkNotifyIsSend(sendNotifyBO.getBizId(), sendNotifyBO.getShopId(), sendNotifyBO.getSendType())) { + return; + } + // 发送店铺消息(订单确认收货、买家发起退款、买家已退货) + NotifyParamVO paramVO = BeanUtil.map(sendNotifyBO, NotifyParamVO.class); + sendMsg(paramVO); + } + + @Override + public void sendProductNotifyMsgToShop(List notifyList) { + // 批量推送商品事件消息给商家 + List notifyParamList = BeanUtil.mapAsList(notifyList, NotifyParamVO.class); + for (NotifyParamVO notifyParamVO : notifyParamList) { + sendMsg(notifyParamVO); + } + } + + @Override + public void sendOrderToPurchaseNotifyMsgToShop(List sendNotify) { + SendNotifyBO sendNotifyBO = sendNotify.get(0); + // 注意幂等性,判断下消息是否已经推送过 + if (checkNotifyIsSend(sendNotifyBO.getBizId(), sendNotifyBO.getShopId(), sendNotifyBO.getSendType())) { + return; + } + // 批量推送商品事件消息给商家 + List notifyParamList = BeanUtil.mapAsList(sendNotify, NotifyParamVO.class); + for (NotifyParamVO notifyParamVO : notifyParamList) { + sendMsg(notifyParamVO); + } + } + + @Override + public void sendActivityNotifyMsgToShop(SendNotifyBO sendNotifyBO) { + // 注意幂等性,判断下消息是否已经推送过 +// if(checkNotifyIsSend(sendNotifyBO.getBizId(),null,sendNotifyBO.getShopId(), sendNotifyBO.getSendType())){ +// return; +// } + // 发送店铺消息 + NotifyParamVO paramVO = BeanUtil.map(sendNotifyBO, NotifyParamVO.class); + sendMsg(paramVO); + } + + /** + * 检查通知是否已经发送 + * + * @param orderId 订单id + * @param userId 接受通知的用户id(店铺id) + * @param sendType 发送类型 + * @return 结果 + */ + private boolean checkNotifyIsSend(Long orderId, Long userId, Integer sendType) { + int num = notifyLogService.countNotifyByConditions(orderId, null, userId, sendType); + return num > 0; + } + + private void setNotifyType(NotifyTemplateVO template) { + List templates = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (String templateStr : template.getNotifyTypes().split(StrUtil.COMMA)) { + templates.add(Integer.valueOf(templateStr)); + } + template.setSms(false); + template.setSub(false); + template.setApp(false); + for (Integer type : templates) { + template.setSms(Objects.equals(type, NotifyType.SMS.value()) || template.getSms()); + template.setSub(Objects.equals(type, NotifyType.MP.value()) || template.getSub()); + template.setApp(Objects.equals(type, NotifyType.APP.value()) || template.getApp()); + } + } + + /** + * 发送微信模板信息 + */ + private void sendMessage(NotifyTemplateVO template, NotifyParamVO notifyParamVO, String bizUserId, String shopName) { + WxMaUniformMessage wxMaUniformMessage = new WxMaUniformMessage(); + wxMaUniformMessage.setMpTemplateMsg(true); + wxMaUniformMessage.setToUser(bizUserId); + wxMaUniformMessage.setAppid(feignShopConfig.getWxMp().getAppId()); + //模板id + wxMaUniformMessage.setTemplateId(template.getMpCode()); + //模板数据集合 + wxMaUniformMessage.setData(getWxMaTemplateDataList(notifyParamVO, shopName)); + try { + wxConfig.getWxMaService().getMsgService().sendUniformMsg(wxMaUniformMessage); + } catch (WxErrorException e) { + //用户未关注公众号,导致的消息发送失败异常 + if (Objects.nonNull(e.getError()) && e.getError().getErrorCode() == Constant.WX_MAX_NOT_FOLLOW) { + logger.info("用户({})没有关注公众号,导致消息发送失败", notifyParamVO.getUserId()); + } + //其他异常 + else { + logger.error("异常", e); + } + } + } + + + /** + * 获取微信通知模板列表 + * + * @param notifyParamVO 通知内容 + * @param shopName 店铺名称 + * @return 微信通知模板列表 + */ + private List getWxMaTemplateDataList(NotifyParamVO notifyParamVO, String shopName) { + Map> mpMap = new HashMap<>(24); + List dataList; + String priceStr = notifyParamVO.getPrice() + "元"; + // 订单微信通知模板 + orderWxMaTemplate(notifyParamVO, shopName, mpMap, priceStr); + // 团购微信通知模板 + groupWxMaTemplate(notifyParamVO, mpMap, priceStr); + // 商家微信通知模板 + multishopWxMaTemplate(notifyParamVO, mpMap, priceStr); + // 会员升级微信通知模板 + dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dataList.add(new WxMaTemplateData("first", "会员升级通知")); + dataList.add(new WxMaTemplateData("keyword1", notifyParamVO.getLevelName())); + dataList.add(new WxMaTemplateData("keyword2", "成功!")); + dataList.add(new WxMaTemplateData("remark", "感谢您的支持!")); + mpMap.put(SendTypeEnum.MEMBER_LEVEL.getValue(), dataList); + + return mpMap.get(notifyParamVO.getSendType()); + } + + /** + * @param notifyParamVO 通知信息 + * @param shopName 店铺名称 + * @param mpMap 模板map + * @param priceStr 价格 + */ + private void orderWxMaTemplate(NotifyParamVO notifyParamVO, String shopName, Map> mpMap, String priceStr) { + List dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + String firstData = "亲爱的" + notifyParamVO.getNickName() + ",您在商城购买的宝贝还未付款哦!为确保您心爱的宝贝早日启程、顺利抵达,记得尽早付款哦!"; + dataList.add(new WxMaTemplateData("first", firstData)); + dataList.add(new WxMaTemplateData("keyword1", notifyParamVO.getBizId().toString())); + dataList.add(new WxMaTemplateData("keyword2", DateUtil.format(notifyParamVO.getCreateTime(), DatePattern.NORM_DATETIME_PATTERN))); + dataList.add(new WxMaTemplateData("keyword3", notifyParamVO.getSpuName())); + dataList.add(new WxMaTemplateData("remark", "请您及时付款以免订单过期。")); + mpMap.put(SendTypeEnum.PRESS_PAY.getValue(), dataList); + + dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dataList.add(new WxMaTemplateData("first", "你好,你的订单已付款成功。")); + dataList.add(new WxMaTemplateData("keyword1", notifyParamVO.getBizId().toString())); + dataList.add(new WxMaTemplateData("keyword2", notifyParamVO.getSpuName())); + dataList.add(new WxMaTemplateData("keyword3", DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN))); + dataList.add(new WxMaTemplateData("keyword4", priceStr)); + dataList.add(new WxMaTemplateData("remark", "感谢您的支持!")); + mpMap.put(SendTypeEnum.PAY_SUCCESS.getValue(), dataList); + + dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dataList.add(new WxMaTemplateData("first", "您的退款申请商家已同意")); + dataList.add(new WxMaTemplateData("keyword1", notifyParamVO.getBizId().toString())); + dataList.add(new WxMaTemplateData("keyword2", notifyParamVO.getSpuName())); + dataList.add(new WxMaTemplateData("keyword3", priceStr)); + dataList.add(new WxMaTemplateData("remark", "请及时登录商城,查看退款信息")); + mpMap.put(SendTypeEnum.AGREE_REFUND.getValue(), dataList); + + dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dataList.add(new WxMaTemplateData("first", "你的退款申请被商家驳回,可与商家协商沟通")); + dataList.add(new WxMaTemplateData("keyword1", notifyParamVO.getBizId().toString())); + dataList.add(new WxMaTemplateData("keyword2", priceStr)); + dataList.add(new WxMaTemplateData("keyword3", notifyParamVO.getRejectMessage())); + dataList.add(new WxMaTemplateData("remark", "请及时登录商城,查看退款信息")); + mpMap.put(SendTypeEnum.REFUSE_REFUND.getValue(), dataList); + + dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dataList.add(new WxMaTemplateData("first", "尊敬的客户,您的订单提货成功啦。")); + dataList.add(new WxMaTemplateData("keyword1", notifyParamVO.getSpuName())); + dataList.add(new WxMaTemplateData("keyword2", priceStr)); + dataList.add(new WxMaTemplateData("keyword3", notifyParamVO.getProdNum().toString())); + dataList.add(new WxMaTemplateData("keyword4", DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN))); + dataList.add(new WxMaTemplateData("remark", "商城感谢您的支持!")); + mpMap.put(SendTypeEnum.WRITE_OFF.getValue(), dataList); + + dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dataList.add(new WxMaTemplateData("first", "商品已在送往客官的路上")); + dataList.add(new WxMaTemplateData("keyword1", notifyParamVO.getSpuName())); + dataList.add(new WxMaTemplateData("keyword2", "已发货")); + dataList.add(new WxMaTemplateData("keyword3", notifyParamVO.getDvyName())); + dataList.add(new WxMaTemplateData("keyword4", notifyParamVO.getDvyFlowId())); + dataList.add(new WxMaTemplateData("remark", DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN))); + mpMap.put(SendTypeEnum.DELIVERY.getValue(), dataList); + + dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dataList.add(new WxMaTemplateData("first", "您有退款单即将超时,请及时联系商家处理")); + dataList.add(new WxMaTemplateData("keyword1", shopName)); + dataList.add(new WxMaTemplateData("keyword2", "1笔")); + dataList.add(new WxMaTemplateData("remark", "如有疑问请及时与客服联系!")); + mpMap.put(SendTypeEnum.REFUND_OUT_TIME.getValue(), dataList); + } + + /** + * 团购微信通知模板 + * + * @param notifyParamVO 通知信息 + * @param mpMap 模板map + * @param priceStr 价格 + */ + private void groupWxMaTemplate(NotifyParamVO notifyParamVO, Map> mpMap, String priceStr) { + List dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dataList.add(new WxMaTemplateData("first", "您参加的拼团因为有效期内未成团,我们将在3个工作日内为您安排自动退款")); + dataList.add(new WxMaTemplateData("keyword1", notifyParamVO.getSpuName())); + dataList.add(new WxMaTemplateData("keyword2", priceStr)); + dataList.add(new WxMaTemplateData("keyword3", "商城")); + dataList.add(new WxMaTemplateData("remark", "点击进入订单详情页,查看退款进度!")); + mpMap.put(SendTypeEnum.GROUP_FAIL.getValue(), dataList); + + dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dataList.add(new WxMaTemplateData("first", "恭喜你,拼团已经成功!")); + dataList.add(new WxMaTemplateData("keyword1", notifyParamVO.getSpuName())); + dataList.add(new WxMaTemplateData("keyword2", priceStr)); + dataList.add(new WxMaTemplateData("remark", "请登录商城,查看订单发货信息")); + mpMap.put(SendTypeEnum.GROUP_SUCCESS.getValue(), dataList); + + dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dataList.add(new WxMaTemplateData("first", "恭喜你,开团已经成功!")); + dataList.add(new WxMaTemplateData("keyword1", notifyParamVO.getSpuName())); + dataList.add(new WxMaTemplateData("keyword2", priceStr)); + dataList.add(new WxMaTemplateData("remark", "快去小程序将参团链接分享给好友进行参团吧!")); + mpMap.put(SendTypeEnum.GROUP_START.getValue(), dataList); + } + + /** + * 商家微信通知模板 + * + * @param notifyParamVO 通知信息 + * @param mpMap 模板map + * @param priceStr 价格 + */ + private void multishopWxMaTemplate(NotifyParamVO notifyParamVO, Map> mpMap, String priceStr) { + List dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dataList.add(new WxMaTemplateData("first", "亲,物流显示您的订单买家已经确认收货!")); + dataList.add(new WxMaTemplateData("keyword1", notifyParamVO.getBizId().toString())); + dataList.add(new WxMaTemplateData("keyword2", notifyParamVO.getSpuName())); + dataList.add(new WxMaTemplateData("keyword3", "已确认收货")); + dataList.add(new WxMaTemplateData("remark", "如有疑问请及时与客服联系!")); + mpMap.put(SendTypeEnum.RECEIPT_ORDER.getValue(), dataList); + + dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dataList.add(new WxMaTemplateData("first", "店铺有新的退款申请,请及时处理")); + dataList.add(new WxMaTemplateData("keyword1", priceStr)); + dataList.add(new WxMaTemplateData("keyword2", notifyParamVO.getRejectMessage())); + dataList.add(new WxMaTemplateData("keyword3", DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN))); + dataList.add(new WxMaTemplateData("keyword4", "退款金额原路返回")); + dataList.add(new WxMaTemplateData("keyword5", notifyParamVO.getRemark())); + dataList.add(new WxMaTemplateData("remark", "请您尽快请登录商家后台操作处理。")); + mpMap.put(SendTypeEnum.LAUNCH_REFUND.getValue(), dataList); + + dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dataList.add(new WxMaTemplateData("first", "你的买家已退货,请及时处理")); + dataList.add(new WxMaTemplateData("keyword1", notifyParamVO.getBizId().toString())); + dataList.add(new WxMaTemplateData("keyword2", notifyParamVO.getRemark())); + dataList.add(new WxMaTemplateData("remark", "如有疑问请及时与客服联系!")); + mpMap.put(SendTypeEnum.RETURN_REFUND.getValue(), dataList); + } + + /** + * 添加消息 + * + * @notifyParamVO notifyParamVO 参数 + * @notifyParamVO content 消息内容 + * @notifyParamVO template 模板 + * @notifyParamVO isSend 发送状态 + * @notifyParamVO value 发送类型 + * @notifyParamVO notifyLogs 消息集合 + */ + private void addNotifyLog(NotifyParamVO notifyParamVO, String content, NotifyTemplateVO template, Boolean isSend, Integer value, List notifyLogs) { + NotifyLog notifyLog = new NotifyLog(); + notifyLog.setCreateTime(new Date()); + notifyLog.setShopId(notifyParamVO.getShopId()); + notifyLog.setShopName(notifyParamVO.getShopName()); + // 如果大于则为店铺自行接收的消息 + if (notifyParamVO.getSendType() >= Constant.MULTI_SHOP_MESSAGE_TYPE) { + notifyLog.setRemindId(Objects.nonNull(notifyParamVO.getShopId()) ? notifyParamVO.getShopId().toString() : notifyParamVO.getSupplierId().toString()); + } else { + notifyLog.setRemindId(Objects.isNull(notifyParamVO.getUserId()) ? "" : notifyParamVO.getUserId().toString()); + } + notifyLog.setSendType(notifyParamVO.getSendType()); + notifyLog.setBizId(notifyParamVO.getBizId()); + notifyLog.setSpuId(notifyParamVO.getSpuId()); + notifyLog.setShopName(notifyParamVO.getShopName()); + notifyLog.setMessage(content); + notifyLog.setNickName(notifyParamVO.getNickName()); + notifyLog.setUserMobile(notifyParamVO.getMobile()); + notifyLog.setRemindType(value); + notifyLog.setTemplateId(template.getTemplateId()); + notifyLog.setStatus(isSend ? 1 : 0); + + notifyLogs.add(notifyLog); + + } + + + private Map getSmsParam(NotifyParamVO notifyParamVO, String shopName) { + Map smsParam = new HashMap<>(20); + // 没有orderNumber用orderId + if (Objects.nonNull(notifyParamVO.getBizId())) { + smsParam.put("orderNumber", notifyParamVO.getBizId().toString()); + } + smsParam.put("shopName", shopName); + smsParam.put("prodName", notifyParamVO.getSpuName()); + if (StrUtil.isNotBlank(notifyParamVO.getNickName())) { + smsParam.put("nickName", notifyParamVO.getNickName()); + } else { + smsParam.put("nickName", "用户"); + } + smsParam.put("levelName", notifyParamVO.getLevelName()); + smsParam.put("date", DateUtil.format(notifyParamVO.getDvyTime(), + DatePattern.NORM_DATETIME_PATTERN)); + smsParam.put("cancelTime", notifyParamVO.getCancelTime()); + smsParam.put("price", String.valueOf(notifyParamVO.getPrice())); + smsParam.put("dvyFlowId", notifyParamVO.getDvyFlowId()); + smsParam.put("stationName", notifyParamVO.getStationName()); + smsParam.put("dvyName", notifyParamVO.getDvyName()); + smsParam.put("dvyTime", DateUtil.format(notifyParamVO.getDvyTime(), + DatePattern.NORM_DATETIME_PATTERN)); + smsParam.put("day", String.valueOf(Constant.MAX_REFUND_APPLY_TIME)); + smsParam.put("hour", notifyParamVO.getHour().toString()); + smsParam.put("spuId", Objects.nonNull(notifyParamVO.getSpuId()) ? notifyParamVO.getSpuId().toString() : null); + smsParam.put("spuName", Objects.nonNull(notifyParamVO.getSpuName()) ? notifyParamVO.getSpuName() : null); + smsParam.put("activityId", Objects.nonNull(notifyParamVO.getActivityId()) ? notifyParamVO.getActivityId().toString() : null); + smsParam.put("activityName", Objects.nonNull(notifyParamVO.getActivityName()) ? notifyParamVO.getActivityName() : null); + smsParam.put("supplierName", Objects.nonNull(notifyParamVO.getSupplierName()) ? notifyParamVO.getSupplierName() : null); + return smsParam; + } + + + /** + * 短信内容替换 + * + * @notifyParamVO maps 替换内容 + */ + private String replaceContent(Map maps, String content) { + for (Map.Entry element : maps.entrySet()) { + if (StrUtil.isNotBlank(element.getValue())) { + content = content.replace("${" + element.getKey() + "}", element.getValue()); + } + } + return content; + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/SmsLogServiceImpl.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/SmsLogServiceImpl.java new file mode 100644 index 0000000..d482477 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/SmsLogServiceImpl.java @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service.impl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; +import com.aliyuncs.CommonRequest; +import com.aliyuncs.CommonResponse; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.http.MethodType; +import com.aliyuncs.profile.DefaultProfile; +import com.aliyuncs.profile.IClientProfile; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.biz.mapper.SmsLogMapper; +import com.tmerclub.cloud.biz.model.SmsLog; +import com.tmerclub.cloud.biz.service.NotifyTemplateService; +import com.tmerclub.cloud.biz.service.SmsLogService; +import com.tmerclub.cloud.biz.vo.SmsCodeTemplateVO; +import com.tmerclub.cloud.common.bean.DaYu; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.util.Json; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 短信记录表 + * + * @author lhd + * @date 2021-01-04 13:36:52 + */ +@Service +public class SmsLogServiceImpl implements SmsLogService { + + /** + * 当天最大验证码短信发送量 + */ + private static final int TODAY_MAX_SEND_VALID_SMS_NUMBER = 10; + + /** + * 一段时间内短信验证码的最大验证次数 + */ + private static final int TIMES_CHECK_VALID_CODE_NUM = 10; + /** + * 产品域名,开发者无需替换 + */ + private static final String DOMAIN = "dysmsapi.aliyuncs.com"; + /** + * 产品RegionId,开发者无需替换 + */ + private static final String REGION_ID = "cn-hangzhou"; + + /** + * 产品version,开发者无需替换 + */ + private static final String VERSION = "2017-05-25"; + + /** + * 产品Action,开发者无需替换 + */ + private static final String ACTION = "SendSms"; + /** + * 短信验证码的前缀 + */ + private static final String CHECK_VALID_CODE_NUM_PREFIX = "checkValidCodeNum_"; + + private static final Logger logger = LoggerFactory.getLogger(SmsLogServiceImpl.class); + + @Autowired + private SmsLogMapper smsLogMapper; + + @Autowired + private FeignShopConfig feignShopConfig; + + @Autowired + private NotifyTemplateService notifyTemplateService; + + /** + * 短信验证码的前缀 + */ + private static final String CHECK_VALID_CODE_LOCK_PREFIX = "checkValidLock_"; + + private static final String MESSAGE = "Message"; + + @Autowired + private RedissonClient redissonClient; + + @Override + @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) + public void sendSmsCode(SendTypeEnum sendType, String mobile, Map params) { + RLock lock = redissonClient.getLock(CHECK_VALID_CODE_LOCK_PREFIX + mobile); + lock.lock(); + try { + SmsLogService smsLogService = (SmsLogService) AopContext.currentProxy(); + smsLogService.checkAndSendSmsCode(sendType, mobile, params); + } finally { + lock.unlock(); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void checkAndSendSmsCode(SendTypeEnum sendType, String mobile, Map params) { + SmsCodeTemplateVO smsCodeTemplateVO = notifyTemplateService.getSmsCodeTemplateBySendType(sendType.getValue()); + SmsLog smsLog = new SmsLog(); + // 验证码类短信需要检验发送次数 + checkValidSendCount(sendType, mobile, params); + smsLog.setType(sendType.getValue()); + smsLog.setMobileCode(params.get("code")); + smsLog.setStatus(1); + smsLog.setUserPhone(mobile); + smsLog.setContent(formatContent(smsCodeTemplateVO.getMessage(), params)); + smsLogMapper.save(smsLog); + Boolean flag = this.sendSms(mobile, smsCodeTemplateVO.getTemplateCode(), params); + if (!flag) { + // 发送短信失败,请稍后再试 + throw new LuckException("发送短信失败,请稍后再试"); + } + } + + private void checkValidSendCount(SendTypeEnum sendType, String mobile, Map params) { + boolean isTrue = Objects.equals(SendTypeEnum.REGISTER, sendType) || Objects.equals(SendTypeEnum.LOGIN, sendType) + || Objects.equals(SendTypeEnum.UPDATE_PASSWORD, sendType) || Objects.equals(SendTypeEnum.VALID, sendType); + + if (isTrue) { + List smsLogList = smsLogMapper.listByMobileAndTypeAndToday(DateUtil.beginOfDay(new Date()), DateUtil.endOfDay(new Date()), mobile, sendType.getValue()); + if (smsLogList.size() >= TODAY_MAX_SEND_VALID_SMS_NUMBER) { + // 今日发送短信验证码次数已达到上限 + throw new LuckException("今日发送短信验证码次数已达到上限"); + } + + if (smsLogList.size() > 0) { + SmsLog smsLogLast = smsLogList.get(0); + long currentTimeMillis = System.currentTimeMillis(); + long timeDb = DateUtil.offsetSecond(smsLogLast.getCreateTime(), 60).getTime(); + if (currentTimeMillis < timeDb) { + // 一分钟内只能发送一次验证码 + throw new LuckException("一分钟内只能发送一次验证码"); + } + } + // 将上一条验证码失效 + smsLogMapper.invalidSmsByMobileAndType(mobile, sendType.getValue()); + String code = RandomUtil.randomNumbers(6); + params.put("code", code); + } + } + + + @Override + public Boolean sendMsgSms(String templateCode, String userMobile, Map smsParam) { + return sendSms(userMobile, templateCode, smsParam); + } + + @Override + public Boolean checkValidCode(String mobile, String validCode, SendTypeEnum sendType) { + long checkValidCodeNum = RedisUtil.incr(CHECK_VALID_CODE_NUM_PREFIX + mobile, 1); + // 半小时后失效 + RedisUtil.expire(CHECK_VALID_CODE_NUM_PREFIX + mobile, 1800); + if (checkValidCodeNum >= TIMES_CHECK_VALID_CODE_NUM) { + throw new LuckException("验证码校验过频繁,请稍后再试"); + } + + SmsLog dbSms = smsLogMapper.getByMobileAndCodeAndType(mobile, validCode, sendType.getValue()); + // 没有找到当前的验证码 + if (dbSms == null) { + RedisUtil.decr(CHECK_VALID_CODE_NUM_PREFIX + mobile, 1); + return false; + } + RedisUtil.del(CHECK_VALID_CODE_NUM_PREFIX + mobile); + // 标记为失效状态 + dbSms.setStatus(0); + smsLogMapper.update(dbSms); + // 验证码已过期 + DateTime offsetMinute = DateUtil.offsetMinute(dbSms.getCreateTime(), 5); + if (offsetMinute.getTime() < System.currentTimeMillis()) { + RedisUtil.incr(CHECK_VALID_CODE_NUM_PREFIX + mobile, 1); + return false; + } + + return true; + } + + private Boolean sendSms(String mobile, String templateCode, Map params) { + DaYu aLiDaYu = feignShopConfig.getDaYu(); + + //初始化acsClient,暂不支持region化 + IClientProfile profile = DefaultProfile.getProfile(REGION_ID, aLiDaYu.getAccessKeyId(), aLiDaYu.getAccessKeySecret()); + IAcsClient acsClient = new DefaultAcsClient(profile); + + //组装请求对象-具体描述见控制台-文档部分内容 + + CommonRequest request = new CommonRequest(); + request.setSysMethod(MethodType.POST); + request.setSysDomain(DOMAIN); + request.setSysVersion(VERSION); + request.setSysAction(ACTION); + request.putQueryParameter("RegionId", REGION_ID); + //必填:待发送手机号 + request.putQueryParameter("PhoneNumbers", mobile); + //必填:短信签名-可在短信控制台中找到 + request.putQueryParameter("SignName", aLiDaYu.getSignName()); + //必填:短信模板-可在短信控制台中找到 + request.putQueryParameter("TemplateCode", templateCode); + request.putQueryParameter("TemplateParam", Json.toJsonString(params)); + + try { + CommonResponse response = acsClient.getCommonResponse(request); + logger.info(response.getData()); + String errorValue = "\"该账号下找不到对应签名\""; + if (Objects.equals(Json.parseJson(response.getData()).get(MESSAGE).toString(), errorValue)) { + throw new LuckException("发送短信失败:", Json.parseJson(response.getData()).get(MESSAGE).toString()); + } + return true; + } catch (ClientException e) { + logger.error("发送短信失败,请稍后再试:{}", e.getMessage()); + return false; + } + } + + private String formatContent(String content, Map params) { + + for (Map.Entry element : params.entrySet()) { + content = content.replace("${" + element.getKey() + "}", element.getValue()); + } + return content; + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/AttachFileGroupVO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/AttachFileGroupVO.java new file mode 100644 index 0000000..63df1be --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/AttachFileGroupVO.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * VO + * + * @author YXF + * @date 2020-12-04 16:15:02 + */ +public class AttachFileGroupVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long attachFileGroupId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "分组名称") + private String name; + + @Schema(description = "1:图片 2:视频 3:文件") + private Integer type; + + @Schema(description = "系统类型 1.商家端 2.平台端 3.供应商端") + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getAttachFileGroupId() { + return attachFileGroupId; + } + + public void setAttachFileGroupId(Long attachFileGroupId) { + this.attachFileGroupId = attachFileGroupId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "AttachFileGroupVO{" + + "attachFileGroupId=" + attachFileGroupId + + ", shopId=" + shopId + + ", name='" + name + '\'' + + ", type=" + type + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyTemplateVO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyTemplateVO.java new file mode 100644 index 0000000..92bfc4f --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyTemplateVO.java @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * VO + * + * @author lhd + * @date 2021-01-04 09:32:38 + */ +public class NotifyTemplateVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "消息模板表") + private Long templateId; + + @Schema(description = "1.订单催付 2.付款成功通知 3.商家同意退款 4.商家拒绝退款 5.核销提醒 6.发货提醒 7.拼团失败提醒 8.拼团成功提醒 " + + "9.拼团开团提醒 10.会员升级提醒11.退款临近超时提醒 102.确认收货提醒 103.买家发起退款提醒 104.买家已退货提醒") + private Integer sendType; + + @Schema(description = "通知内容") + private String message; + + @Schema(description = "通知方式集合用逗号分隔 1.短信 2.公众号 3.站内消息") + private String notifyTypes; + + @Schema(description = "公众号消息模板code") + private String mpCode; + + @Schema(description = "消息发送类型 1.平台自行发送类型 2.商家") + private Integer msgType; + + @Schema(description = "1启用 0禁用") + private Integer status; + + @Schema(description = "短信模板code") + private String templateCode; + + /** + * 可用通知方式集合用逗号分隔 1.短信 2.公众号 3.站内消息 + */ + private List templateTypeList; + /** + * 可用通知方式集合用逗号分隔 1.短信 2.公众号 3.站内消息 + */ + private Boolean sms; + + private Boolean app; + + private Boolean sub; + + /** + * 模板关联的会员标签id + */ + private List tagIds; + + public List getTemplateTypeList() { + return templateTypeList; + } + + public void setTemplateTypeList(List templateTypeList) { + this.templateTypeList = templateTypeList; + } + + public Boolean getSms() { + return sms; + } + + public void setSms(Boolean sms) { + this.sms = sms; + } + + public Boolean getApp() { + return app; + } + + public void setApp(Boolean app) { + this.app = app; + } + + public Boolean getSub() { + return sub; + } + + public void setSub(Boolean sub) { + this.sub = sub; + } + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public String getTemplateCode() { + return templateCode; + } + + public void setTemplateCode(String templateCode) { + this.templateCode = templateCode; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getNotifyTypes() { + return notifyTypes; + } + + public void setNotifyTypes(String notifyTypes) { + this.notifyTypes = notifyTypes; + } + + public String getMpCode() { + return mpCode; + } + + public void setMpCode(String mpCode) { + this.mpCode = mpCode; + } + + public Integer getMsgType() { + return msgType; + } + + public void setMsgType(Integer msgType) { + this.msgType = msgType; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public List getTagIds() { + return tagIds; + } + + public void setTagIds(List tagIds) { + this.tagIds = tagIds; + } + + @Override + public String toString() { + return "NotifyTemplateVO{" + + "templateId=" + templateId + + ", sendType=" + sendType + + ", message='" + message + '\'' + + ", notifyTypes='" + notifyTypes + '\'' + + ", mpCode='" + mpCode + '\'' + + ", msgType=" + msgType + + ", status=" + status + + ", templateCode='" + templateCode + '\'' + + ", templateTypeList=" + templateTypeList + + ", sms=" + sms + + ", app=" + app + + ", sub=" + sub + + ", tagIds=" + tagIds + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/SmsCodeTemplateVO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/SmsCodeTemplateVO.java new file mode 100644 index 0000000..e6be547 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/SmsCodeTemplateVO.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * VO + * + * @author FrozenWatermelon + * @date 2021-01-25 09:32:38 + */ +public class SmsCodeTemplateVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "通知内容") + private String message; + + @Schema(description = "短信模板code") + private String templateCode; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getTemplateCode() { + return templateCode; + } + + public void setTemplateCode(String templateCode) { + this.templateCode = templateCode; + } + + @Override + public String toString() { + return "SmsCodeTemplateVO{" + + "message='" + message + '\'' + + ", templateCode='" + templateCode + '\'' + + '}'; + } +} diff --git a/tmerclub-biz/src/main/resources/logback.xml b/tmerclub-biz/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-biz/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-biz/src/main/resources/mapper/AttachFileMapper.xml b/tmerclub-biz/src/main/resources/mapper/AttachFileMapper.xml new file mode 100644 index 0000000..60980a7 --- /dev/null +++ b/tmerclub-biz/src/main/resources/mapper/AttachFileMapper.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + `file_id`,`file_path`,`file_type`,`file_name`,`file_size`,`shop_id`,`type`,`create_time`,`update_time`,`attach_file_group_id` + + + + insert into attach_file (`file_path`,`file_type`,`file_name`,`file_size`,`shop_id`,`uid`,`type`,`attach_file_group_id`, `sys_type`) + values + + (#{attachFile.filePath},#{attachFile.fileType},#{attachFile.fileName},#{attachFile.fileSize},#{shopId},#{uid},#{attachFile.type},#{attachFile.attachFileGroupId},#{sysType}) + + + + update attach_file + + + `file_name` = #{attachFile.fileName}, + + + `attach_file_group_id` = #{attachFile.attachFileGroupId}, + + + where file_id = #{attachFile.fileId} + + + delete from attach_file where file_id = #{fileId} + + + delete from attach_file where file_id in + + #{id} + + + + + + + + update attach_file + set attach_file_group_id = 0 + where attach_file_group_id = #{attachFileGroupId} + + + update attach_file set `attach_file_group_id` = #{groupId} where shop_id = #{shopId} and sys_type = #{sysType} and file_id IN + + #{id} + + + + update attach_file set shop_id = #{shopId} where uid = #{uid} + + + insert into attach_file (`file_path`,`file_type`,`file_name`,`file_size`,`shop_id`,`uid`,`type`,`attach_file_group_id`, `sys_type`) + values(#{attachFile.filePath},#{attachFile.fileType},#{attachFile.fileName},#{attachFile.fileSize},#{attachFile.shopId},#{uid},#{attachFile.type},#{attachFile.attachFileGroupId}, #{attachFile.sysType}) + + diff --git a/tmerclub-biz/src/main/resources/mapper/NotifyLogMapper.xml b/tmerclub-biz/src/main/resources/mapper/NotifyLogMapper.xml new file mode 100644 index 0000000..4f443e0 --- /dev/null +++ b/tmerclub-biz/src/main/resources/mapper/NotifyLogMapper.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + `log_id`,`create_time`,`update_time`,`nick_name`,`user_mobile`,`remind_id`,`shop_id`,`shop_name`,`remind_type`,`template_id`,`send_type`,`message`,`status`, `spu_id`, `activity_id` + + + + + + insert into notify_log (`nick_name`, `user_mobile`, `remind_id`, `shop_id`, `shop_name`, `remind_type`, `template_id`, `send_type`,`message`, `status`, biz_id, spu_id, activity_id) values + + (#{notifyLog.nickName}, #{notifyLog.userMobile}, #{notifyLog.remindId}, #{notifyLog.shopId}, #{notifyLog.shopName}, #{notifyLog.remindType}, + #{notifyLog.templateId}, #{notifyLog.sendType}, #{notifyLog.message},#{notifyLog.status}, #{notifyLog.bizId}, #{notifyLog.spuId}, #{notifyLog.activityId}) + + + + + + update notify_log + + + `nick_name` = #{notifyLog.nickName}, + + + `user_mobile` = #{notifyLog.userMobile}, + + + `remind_id` = #{notifyLog.remindId}, + + + `shop_id` = #{notifyLog.shopId}, + + + `remind_type` = #{notifyLog.remindType}, + + + `template_id` = #{notifyLog.templateId}, + + + `send_type` = #{notifyLog.sendType}, + + + `message` = #{notifyLog.message}, + + + `status` = #{notifyLog.status}, + + + where log_id = #{notifyLog.logId}; + + + + update notify_log set status = 1 where log_id = #{logId} + + + + + update notify_log + set status = 1 + where log_id = #{logId}; + + + + update notify_log set status =1 where shop_id = #{shopId} + + + + + + + + diff --git a/tmerclub-biz/src/main/resources/mapper/NotifyTemplateTagMapper.xml b/tmerclub-biz/src/main/resources/mapper/NotifyTemplateTagMapper.xml new file mode 100644 index 0000000..b84139f --- /dev/null +++ b/tmerclub-biz/src/main/resources/mapper/NotifyTemplateTagMapper.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `notify_tag_id`,`create_time`,`update_time`,`user_tag_id`,`template_id` + + + + + + + + insert into notify_template_tag (`user_tag_id`,`template_id`) + values (#{notifyTemplateTag.userTagId},#{notifyTemplateTag.templateId}); + + + insert into notify_template_tag (`user_tag_id`,`template_id`) + values + + (#{notifyTemplateTag.userTagId},#{notifyTemplateTag.templateId}) + + + + update notify_template_tag + + + `user_tag_id` = #{notifyTemplateTag.userTagId}, + + + `template_id` = #{notifyTemplateTag.templateId}, + + + where notify_tag_id = #{notifyTemplateTag.notifyTagId} + + + delete from notify_template_tag where notify_tag_id = #{notifyTagId} + + + delete from notify_template_tag where template_id = #{templateId} + + + delete from notify_template_tag where user_tag_id = #{tagId} + + + + diff --git a/tmerclub-biz/src/main/resources/mapper/NoyifyTemplateRemindMapper.xml b/tmerclub-biz/src/main/resources/mapper/NoyifyTemplateRemindMapper.xml new file mode 100644 index 0000000..4aa57a8 --- /dev/null +++ b/tmerclub-biz/src/main/resources/mapper/NoyifyTemplateRemindMapper.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + `notify_template_remind_id`,`template_id`,`shop_id`,`is_remind`, `sys_type` + + + + + + + insert into notify_template_remind (`template_id`,`shop_id`,`is_remind`, `sys_type`) + values (#{notifyTemplateRemind.templateId},#{notifyTemplateRemind.shopId},#{notifyTemplateRemind.isRemind}, #{notifyTemplateRemind.sysType}); + + + update notify_template_remind + + + `template_id` = #{notifyTemplateRemind.templateId}, + + + `shop_id` = #{notifyTemplateRemind.shopId}, + + + `is_remind` = #{notifyTemplateRemind.isRemind}, + + + where notify_template_remind_id = #{notifyTemplateRemind.notifyTemplateRemindId} + + + delete from notify_template_remind where notify_template_remind_id = #{notifyTemplateRemindId} + + + diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/adapter/CacheTtlAdapter.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/adapter/CacheTtlAdapter.java new file mode 100644 index 0000000..c2ecd81 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/adapter/CacheTtlAdapter.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.adapter; + +import com.tmerclub.cloud.common.cache.bo.CacheNameWithTtlBO; + +import java.util.List; + +/** + * 实现该接口之后,根据缓存的cacheName和ttl将缓存进行过期 + * + * @author FrozenWatermelon + * @date 2020/7/4 + */ +public interface CacheTtlAdapter { + + /** + * 根据缓存的cacheName和ttl将缓存进行过期 + * @return 需要独立设置过期时间的缓存列表 + */ + List listCacheNameWithTtl(); + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/AofRedisBO.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/AofRedisBO.java new file mode 100644 index 0000000..c31953b --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/AofRedisBO.java @@ -0,0 +1,55 @@ +package com.tmerclub.cloud.common.cache.bo; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lgh + */ +@ConfigurationProperties(prefix = "redis.aof") +@Component +public class AofRedisBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String password; + + private String redisAddr; + + private Integer database; + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getDatabase() { + return database; + } + + public void setDatabase(Integer database) { + this.database = database; + } + + public String getRedisAddr() { + return redisAddr; + } + + public void setRedisAddr(String redisAddr) { + this.redisAddr = redisAddr; + } + + @Override + public String toString() { + return "AofRedisBO{" + + "password='" + password + '\'' + + ", redisAddr='" + redisAddr + '\'' + + ", database=" + database + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/CacheNameWithTtlBO.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/CacheNameWithTtlBO.java new file mode 100644 index 0000000..02cd883 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/CacheNameWithTtlBO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 通过 cacheName 配置 和 时间告诉缓存多久清楚一遍 + * + * @author FrozenWatermelon + * @date 2020/7/4 + */ +public class CacheNameWithTtlBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String cacheName; + + private Integer ttl; + + public CacheNameWithTtlBO(String cacheName, Integer ttl) { + this.cacheName = cacheName; + this.ttl = ttl; + } + + public String getCacheName() { + return cacheName; + } + + public void setCacheName(String cacheName) { + this.cacheName = cacheName; + } + + public Integer getTtl() { + return ttl; + } + + public void setTtl(Integer ttl) { + this.ttl = ttl; + } + + @Override + public String toString() { + return "CacheNameWithTtlBO{" + "cacheName='" + cacheName + '\'' + ", ttl=" + ttl + '}'; + } + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/MultiDecrementBO.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/MultiDecrementBO.java new file mode 100644 index 0000000..c80d1a6 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/MultiDecrementBO.java @@ -0,0 +1,192 @@ +package com.tmerclub.cloud.common.cache.bo; + +import com.tmerclub.cloud.common.cache.enums.MultiStockEnum; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author LGH + */ +public class MultiDecrementBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 进行多redis扣减库存的操作fang方,比如抢秒杀商品,也可能是双十一抢优惠券 + */ + private MultiStockEnum multiStockEnum; + /** + * 用户id,使用用户id的hashCode 作为使用分片的索引 + */ + private Long userId; + /** + * 订单id,为啥要有订单id呢,这个是为了后期能够保证redis库存和mysql订单数量的一致性,要通过这个orderId通过redis的lua加一个锁定的记录在redis当中 + */ + private Long orderId; + /** + * 活动id,对于秒杀来说就是秒杀的活动id,对于优惠券来说就是优惠券id,需要唯一 + */ + private Long activityId; + /** + * skuId 对于秒杀来说就是秒杀的活动skuId,对于优惠券来说就是优惠券id,需要唯一 + */ + private Long skuId; + /** + * 扣减的库存数量 + */ + private Integer prodCount; + /** + * 最大限购数量 + */ + private Integer maxNum; + /** + * 订单信息 + */ + private String orderInfo; + + /** + * 前缀 + */ + private String cachePrefix; + + /** + * 库存点集合 拼接为库存点id_库存 + */ + private List stockPointList; + + /** + * 库存点id + */ + private Long stockPointId; + + public MultiDecrementBO(MultiStockEnum multiStockEnum, Long userId, Long orderId, Long activityId, Long skuId, Integer prodCount, Integer maxNum, String orderInfo, List stockPointList) { + this.multiStockEnum = multiStockEnum; + this.userId = userId; + this.orderId = orderId; + this.activityId = activityId; + this.skuId = skuId; + this.prodCount = prodCount; + this.maxNum = maxNum; + this.orderInfo = orderInfo; + this.cachePrefix = multiStockEnum.value(); + this.stockPointList = stockPointList; + } + + public MultiDecrementBO(MultiStockEnum multiStockEnum, Long userId, Long orderId, Long activityId, Long skuId, Integer prodCount, Integer maxNum, String orderInfo) { + this.multiStockEnum = multiStockEnum; + this.userId = userId; + this.orderId = orderId; + this.activityId = activityId; + this.skuId = skuId; + this.prodCount = prodCount; + this.maxNum = maxNum; + this.orderInfo = orderInfo; + this.cachePrefix = multiStockEnum.value(); + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public List getStockPointList() { + return stockPointList; + } + + public void setStockPointList(List stockPointList) { + this.stockPointList = stockPointList; + } + + public MultiStockEnum getMultiStockEnum() { + return multiStockEnum; + } + + public void setMultiStockEnum(MultiStockEnum multiStockEnum) { + this.multiStockEnum = multiStockEnum; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getProdCount() { + return prodCount; + } + + public void setProdCount(Integer prodCount) { + this.prodCount = prodCount; + } + + public Integer getMaxNum() { + return maxNum; + } + + public void setMaxNum(Integer maxNum) { + this.maxNum = maxNum; + } + + public String getOrderInfo() { + return orderInfo; + } + + public void setOrderInfo(String orderInfo) { + this.orderInfo = orderInfo; + } + + public String getCachePrefix() { + return cachePrefix; + } + + public void setCachePrefix(String cachePrefix) { + this.cachePrefix = cachePrefix; + } + + @Override + public String toString() { + return "MultiDecrementBO{" + + "multiStockEnum=" + multiStockEnum + + ", userId=" + userId + + ", orderId=" + orderId + + ", activityId=" + activityId + + ", skuId=" + skuId + + ", prodCount=" + prodCount + + ", maxNum=" + maxNum + + ", orderInfo='" + orderInfo + '\'' + + ", cachePrefix='" + cachePrefix + '\'' + + ", stockPointList=" + stockPointList + + ", stockPointId='" + stockPointId + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/MultiRedisBO.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/MultiRedisBO.java new file mode 100644 index 0000000..9b969f0 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/bo/MultiRedisBO.java @@ -0,0 +1,56 @@ +package com.tmerclub.cloud.common.cache.bo; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lgh + */ +@ConfigurationProperties(prefix = "redis.multi") +@Component +public class MultiRedisBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String password; + + private List redisAddrs; + + private Integer database; + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getDatabase() { + return database; + } + + public void setDatabase(Integer database) { + this.database = database; + } + + public List getRedisAddrs() { + return redisAddrs; + } + + public void setRedisAddrs(List redisAddrs) { + this.redisAddrs = redisAddrs; + } + + @Override + public String toString() { + return "MultiRedisBO{" + + "password='" + password + '\'' + + ", redisAddrs=" + redisAddrs + + ", database=" + database + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/config/AofRedisConfig.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/config/AofRedisConfig.java new file mode 100644 index 0000000..4fa6499 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/config/AofRedisConfig.java @@ -0,0 +1,75 @@ +package com.tmerclub.cloud.common.cache.config; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.cache.bo.AofRedisBO; +import com.tmerclub.cloud.common.exception.LuckException; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.redisson.config.SingleServerConfig; +import org.redisson.spring.data.connection.RedissonConnectionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.stereotype.Component; + +/** + * 多个redis管理 + * @author LGH + */ +@Component +@ConditionalOnProperty(value = "redis.aof.enable", havingValue = "true") +public class AofRedisConfig implements DisposableBean { + + private static final Logger LOGGER = LoggerFactory.getLogger(AofRedisConfig.class); + + private final StringRedisTemplate stringRedisTemplate; + + private final RedissonClient redissonClient; + + public AofRedisConfig(AofRedisBO aofRedisBO) { + + if (StrUtil.isBlank(aofRedisBO.getRedisAddr())) { + throw new LuckException("请在yml配置好 aofRedis 的配置,见 com.tmerclub.cloud.common.cache.bo.AofRedisBO"); + } + + Config config = new Config(); + + SingleServerConfig singleServerConfig = config.useSingleServer(); + if (StrUtil.isNotBlank(aofRedisBO.getPassword())) { + singleServerConfig.setPassword(aofRedisBO.getPassword()); + } + if (aofRedisBO.getDatabase() != null) { + singleServerConfig.setDatabase(aofRedisBO.getDatabase()); + } else { + singleServerConfig.setDatabase(0); + } + singleServerConfig.setAddress("redis://" + aofRedisBO.getRedisAddr()); + + redissonClient = Redisson.create(config); + LOGGER.info("创建redisson, redisson={}", redissonClient); + + stringRedisTemplate = new StringRedisTemplate(); + + stringRedisTemplate.setValueSerializer(StringRedisSerializer.UTF_8); + stringRedisTemplate.setKeySerializer(StringRedisSerializer.UTF_8); + stringRedisTemplate.setConnectionFactory(new RedissonConnectionFactory(redissonClient)); + + stringRedisTemplate.afterPropertiesSet(); + } + + + public StringRedisTemplate getStringRedisTemplate() { + return stringRedisTemplate; + } + + + @Override + public void destroy() throws Exception { + LOGGER.info("关闭redissonClient, redissonClient={}", redissonClient); + redissonClient.shutdown(); + } +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/BizCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/BizCacheNames.java new file mode 100644 index 0000000..683ab3b --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/BizCacheNames.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author FrozenWatermelon + * @date 2021/01/25 + */ +public interface BizCacheNames { + + /** + * 前缀 + */ + String COUPON_PREFIX = "mall4cloud_biz:"; + + /** + * 验证码key + */ + String SMS_CODE_KEY = COUPON_PREFIX + "sms_code_key:"; + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/ConfigCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/ConfigCacheNames.java new file mode 100644 index 0000000..7903e16 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/ConfigCacheNames.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author lhd + * @date 2020/12/28 + */ +public interface ConfigCacheNames { + + /** + * 缓存配置名称前缀 + */ + String SYS_CONFIG = "sys_config:"; + + /** + * 缓存配置对象前缀 + */ + String SYS_CONFIG_OBJECT = SYS_CONFIG + "object:"; + /** + * 缓存配置对象具体值 + */ + String SYS_CONFIG_VALUE = SYS_CONFIG + "value:"; + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/CouponCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/CouponCacheNames.java new file mode 100644 index 0000000..c0d73c5 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/CouponCacheNames.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface CouponCacheNames { + + /** + * 前缀 + */ + String COUPON_PREFIX = "mall4cloud_coupon:"; + + /** + * 店铺优惠券列表缓存key + */ + String COUPON_LIST_BY_SHOP_KEY = COUPON_PREFIX + "coupon_list_by_shop:"; + + /** + *优惠券及关联商品列表缓存key + */ + String COUPON_AND_SPU_DATA = COUPON_PREFIX + "coupon_by_coupon_id:"; + + /** + * 优惠券库存信息 + */ + String COUPON_STOCK = COUPON_PREFIX + "coupon_stock:"; + + /** + * 优惠券可用分片数量 + */ + String COUPON_STOCK_AVAILABLE_ZONE = COUPON_PREFIX + "coupon_stock_available_zone:"; +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/DiscountCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/DiscountCacheNames.java new file mode 100644 index 0000000..e123036 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/DiscountCacheNames.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author lhd + * @date 2020/12/18 + */ +public interface DiscountCacheNames { + + /** + * 根据满减id获取当前满减详情 + */ + String DISCOUNT_BY_ID = "discount:by_id:"; + + + /** + * 根据店铺id获取当前店铺的所有满减活动 + */ + String DISCOUNT_BY_SHOPID = "discount:by_shop_id:"; + + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/FlowCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/FlowCacheNames.java new file mode 100644 index 0000000..7951221 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/FlowCacheNames.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author lhd + * @date 2020/12/28 + */ +public interface FlowCacheNames { + + /** + * 前缀 + */ + String FLOW_PREFIX = "mall4cloud_flow:"; + + /** + * 用户流量数据 + */ + String FLOW_FLOW_DATA = FLOW_PREFIX + "flow_data:"; + + /** + * 商品数据 + */ + String FLOW_PRODUCT_DATA = FLOW_PREFIX + "product_data:"; + + /** + * 访问留存分析 + */ + String FLOW_VISIT_RETAINED_KEY = FLOW_PREFIX + "visit_retained:"; + + /** + * 报表项 + */ + String FORM_ITEM_KEY = FLOW_PREFIX + "form_item:"; + + /** + * 推荐报表项 + */ + String FORM_RECOMMEND_LIST_KEY = FLOW_PREFIX + "recommend_list:"; + + // ============================ 流量分析 ============================ + + + /** + * 实时商品数据的统计时间 + */ + String SPU_STATISTICS_TIME = FLOW_PREFIX + "spu_statistics_time"; + + + /** + * 实时商品数据的统计时间 + */ + String FLOW_SYSTEM_ALL = FLOW_PREFIX + "system_all"; + + + /** + * 实时商品数据的统计时间 + */ + String MEMBER_SURVEY_NEARLY_TIME = FLOW_PREFIX + "member_survey_nearly_time:"; + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/LuaOperateEnum.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/LuaOperateEnum.java new file mode 100644 index 0000000..fab26ce --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/LuaOperateEnum.java @@ -0,0 +1,87 @@ +package com.tmerclub.cloud.common.cache.constant; + + +/** + * lua脚本操作 + * @author YXF + */ +public enum LuaOperateEnum { + /** + * ====================== sku操作 - 1-100 ====================== + */ + + /** + * 插入库存 + */ + SKU_INSERT(1), + + /** + * 增加库存 + */ + SKU_ADD(2), + /** + * 减少库存 + */ + SKU_SUB(3), + /** + * 替换库存(覆盖原有库存) + */ + SKU_REPLACE(4), + /** + * sku总库存状态变更 0:商品或sku下架、禁用、删除 1:上架状态 提交订单时需要校验此状态 + */ + SKU_STATUS(5), + /** + * sku区域库存状态变更 0:下架此库存,并扣除sku总库存 1:上架此区域库存,并增加sku总库存数量 + */ + SKU_POINT_STATUS(6), + + /** + * ====================== 订单操作 100-200 ====================== + */ + + /** + * 提交订单 - 扣除sku可售库存,增加对应数量的sku锁定库存 + */ + ORDER_SUBMIT(100), + /** + * 订单支付成功 - 扣除sku锁定库存,增加对应数量的sku销量 + */ + ORDER_SUCCESS(101), + /** + * 取消订单 - 扣除sku锁定库存,增加对应数量的sku可售库存 + */ + ORDER_CANCEL(102), + + /** + * ====================== 退款操作 200-300 ====================== + */ + + + /** + * ====================== 采购订单操作 300-400 ====================== + */ + + + ; + + private final Integer value; + + public Integer value() { + return value; + } + + LuaOperateEnum(Integer value) { + this.value = value; + } + + public static LuaOperateEnum instance(Integer value) { + LuaOperateEnum[] enums = values(); + for (LuaOperateEnum stateEnum : enums) { + if (stateEnum.value().equals(value)) { + return stateEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/OauthCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/OauthCacheNames.java new file mode 100644 index 0000000..c9609fe --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/OauthCacheNames.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface OauthCacheNames { + + /** + * oauth 授权相关key + */ + String OAUTH_PREFIX = "mall4cloud_oauth:"; + + /** + * token 授权相关key + */ + String OAUTH_TOKEN_PREFIX = OAUTH_PREFIX + "token:"; + + /** + * 保存token 缓存使用key + */ + String ACCESS = OAUTH_TOKEN_PREFIX + "access:"; + + /** + * 刷新token 缓存使用key + */ + String REFRESH_TO_ACCESS = OAUTH_TOKEN_PREFIX + "refresh_to_access:"; + + /** + * 根据uid获取保存的token key缓存使用的key + */ + String UID_TO_ACCESS = OAUTH_TOKEN_PREFIX + "uid_to_access:"; + + /** + * 保存token的用户信息使用的key + */ + String USER_INFO = OAUTH_TOKEN_PREFIX + "user_info:"; + + /** + * 登录的时候额外要保存的信息 + */ + String LOGIN_INFO = OAUTH_TOKEN_PREFIX + "login_info:"; +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/PlatformCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/PlatformCacheNames.java new file mode 100644 index 0000000..9c6178c --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/PlatformCacheNames.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface PlatformCacheNames { + + /** + * 前缀 + */ + String PLATFORM_PREFIX = "mall4cloud_platform:"; + + + String PLATFORM_SIMPLE_INFO_KEY = PLATFORM_PREFIX + "simple_info:"; + + /** + * 网站配置缓存 + */ + String WEB_CONFIG_ACTIVITY = PLATFORM_PREFIX + "web_config_activity:"; + + /** + * 系统密钥缓存 + */ + String SYS_ACCESS_KEY = PLATFORM_PREFIX + "sys_access_key:"; +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/ProductCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/ProductCacheNames.java new file mode 100644 index 0000000..bc1ca33 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/ProductCacheNames.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface ProductCacheNames { + + /** + * 前缀 + */ + String PRODUCT_PREFIX = "mall4cloud_product:"; + + /** + * 用户端分类列表缓存key + */ + String CATEGORY_INFO = PRODUCT_PREFIX + "category:info:"; + + /** + * 根据店铺id和上级id,获取分类列表缓存key + */ + String CATEGORY_LIST_OF_SHOP = PRODUCT_PREFIX + "category:list_of_shop:"; + + /** + * 根据店铺id获取店铺签约的分类信息(包含签约分类的父分类) + */ + String LIST_SIGNING_CATEGORY = PRODUCT_PREFIX + "category:list_signing_category:"; + + /** + * 根据店铺id和上级id,获取分类列表缓存key + */ + String CATEGORY_RATE = PRODUCT_PREFIX + "category:category_rate:"; + + /** + * 分类下的属性列表缓存key + */ + String ATTRS_BY_CATEGORY_KEY = PRODUCT_PREFIX + "attrs:category_list:"; + + /** + * 分类下的品牌列表缓存key + */ + String BRAND_LIST_BY_CATEGORY = PRODUCT_PREFIX + "brand:list_by_category_id:"; + + /** + * 店铺签约的分类列表缓存key + */ + String SIGNING_CATEGORY_BY_SHOP_KEY = PRODUCT_PREFIX + "category:list_by_shop_id:"; + + /** + * 购物车商品数量 + */ + String SHOP_CART_ITEM_COUNT = "shop_cart:count:"; + + /** + * spu信息缓存key + */ + String SPU_KEY = PRODUCT_PREFIX + "spu:"; + + /** + * spu详情信息缓存key + */ + String SPU_DETAIL_KEY = PRODUCT_PREFIX + "spu:detail:"; + + /** + * spu详情-活动信息缓存key + */ + String SPU_ACTIVITY_KEY = PRODUCT_PREFIX + "spu:activity:"; + + + /** + * 置顶品牌列表信息缓存key + */ + String BRAND_TOP = PRODUCT_PREFIX + "brand:top_list:"; + + /** + * 分组列表信息缓存key + */ + String SPU_TAG_BY_SHOP = PRODUCT_PREFIX + "spu_tag:shop_id:"; + + + /** + * 商品库存/销量/评论数据缓存 + */ + String SPU_EXTENSION_KEY = PRODUCT_PREFIX + "spu_extension:"; + + /** + * 商品属性数据缓存 + */ + String SPU_ATTR_VALUE_KEY = PRODUCT_PREFIX + "spu_attr_value:"; + + /** + * 根据skuId获取sku的缓存key + */ + String SKU_KEY = PRODUCT_PREFIX + "sku:"; + + /** + * 根据spuId获取sku和spu_sku_attr_value里面的数据 + */ + String SKU_WITH_ATTR_LIST_KEY = PRODUCT_PREFIX + "sku:spu_sku_attr_value:"; + + /** + * 供应商开启SKU标识前缀 + */ + String SKU_STATUS_ENABLE = "sku_status_enable:"; + + /** + * 供应商禁用SKU标识前缀 + */ + String SKU_STATUS_DISABLE = "sku_status_disable:"; + + /** + * 供应商删除SKU标识前缀 + */ + String SKU_STATUS_DELETE = "sku_status_delete:"; + + /** + * 供应商插入SKU标识前缀 + */ + String SKU_STATUS_INSERT = "sku_status_insert:"; + + /** + * 代销商品基本信息是否改变缓存key + */ + String SPU_SUPPLIER_CHANGE_LOG = PRODUCT_PREFIX + "spu_supplier_change_log:"; + + /** + * 拼团最低sku价格对应的原价 + */ + String GROUP_SPU_PRICE_FREE = PRODUCT_PREFIX + "group_spu_price_free:"; + + + /** + * sku的库存信息 + */ + String SKU_SOCK = PRODUCT_PREFIX + "sku_sock:"; + + /** + * sku锁定明细记录 + */ + String ORDER_SKU_LOCK = PRODUCT_PREFIX + "order_sku_lock:"; + + /** + * 商品的赠品列表 + */ + String GIVEAWAY_BY_SPU_ID = PRODUCT_PREFIX + "giveaway_by_spu_id:"; + + /** + * 处理sku库存的变化定时任务最后一次统计的时间 + */ + String SKU_CHANGE_STATISTICS_TIME = PRODUCT_PREFIX + "sku_change_statistics_time:"; + + /** + * 供应商代销商品是否下线 + */ + String SUPPLIER_SPU_UPDATE_STATUS = PRODUCT_PREFIX + "supplier_spu_update_status:"; + + /** + * 供应商修改商品代销商品状态无需改变 + */ + String COMMISSION_SPU_STATUS_NO_CHANGE = PRODUCT_PREFIX + "commission_spu_status_no_change:"; + + /** + * 根据运费模板id获取运费模板的缓存key + */ + String WAREHOUSE_BY_ID_PREFIX = PRODUCT_PREFIX + "warehouse:by_id:"; + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/UserCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/UserCacheNames.java new file mode 100644 index 0000000..956cbaa --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/UserCacheNames.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface UserCacheNames { + + /** + * + * 参考CacheKeyPrefix + * UserCacheNames 与 key 之间的默认连接字符 + */ + String UNION = "::"; + + /** + * 前缀 + */ + String USER_PREFIX = "mall4cloud_user:"; + + /** + * 用户默认地址缓存key + */ + String USER_INFO = USER_PREFIX + "info:"; + + /** + * 用户默认地址缓存key + */ + String USER_DEFAULT_ADDR = USER_PREFIX + "user_addr:user_id:"; + + /** + * 用户默认地址缓存key + */ + String USER_DEFAULT_CONSIGNEE = USER_PREFIX + "user_consignee:user_id:"; + + /** + * 用户余额表 + */ + String USER_RECHARGE_LIST = USER_PREFIX + "user_recharge:list:"; + /** + * 用户余额表 + */ + String USER_RECHARGE_INFO = USER_PREFIX + "user_recharge:info:"; + + /** + * 会员等级列表缓存key + */ + String LEVEL_LIST_KEY = USER_PREFIX + "level_list:"; + + /** + * 单个会员等级缓存key + */ + String LEVEL_GET_KEY = USER_PREFIX + "level_get:"; + + /** + * 会员等级缓存key + */ + String LEVEL_GET_LIST_KEY = USER_PREFIX + "level_get_list:"; + + /** + * 单个权益缓存 + */ + String RIGHT_BY_RIGHTS_ID_KEY = USER_PREFIX + "right_by_rights_id:"; + + /** + * 去重后的权益列表缓存 + */ + String RIGHTS_BY_LEVEL_TYPE = USER_PREFIX + "righs_by_level_type:"; + + /** + * 店铺会员的统计更新时间 + */ + String SHOP_CUSTOMER_UPDATE_TIME = USER_PREFIX + "shop_customer_update_time:"; + + /** + * 弹窗广告缓存 + */ + String POPUP_KEY = USER_PREFIX + "popup:"; + + /** + * 是否为店铺会员 + */ + String SHOP_CUSTOMER_KEY = USER_PREFIX + "shop_customer:"; +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/enums/MultiStockEnum.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/enums/MultiStockEnum.java new file mode 100644 index 0000000..c2f37d3 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/enums/MultiStockEnum.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.common.cache.enums; + +/** + * @author LGH + */ + +public enum MultiStockEnum { + + /** + * 秒杀 + */ + SECKILL("mall4cloud_seckill:"), + + /** + * 优惠券 + */ + COUPON("mall4cloud_coupon:"); + + private final String value; + + public String value() { + return value; + } + + MultiStockEnum(String value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/DecrementStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/DecrementStock.lua new file mode 100644 index 0000000..0bca81c --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/DecrementStock.lua @@ -0,0 +1,65 @@ +-- 下单锁库传入的数据格式,对于redis来说,lua是原子性的,有事务的 + +-- 检验库存信息 这里的key是 +local cachePrefix = KEYS[1] +local orderId = KEYS[2] +local activityId = KEYS[3] +local prodCount = tonumber(KEYS[4]) +local userId = KEYS[5] +local orderInfo = KEYS[6] +local maxNum = tonumber(KEYS[7]) +local skuId = KEYS[8] +local pointId = KEYS[9] +local boughtNum = 0 + +-- 限购 +if maxNum ~= -1 then + if (redis.call('exists', cachePrefix.."buy:".. activityId.."_"..userId) == "1") then + -- 用户已购数量 + boughtNum = tonumber(redis.call('get', cachePrefix.."buy:".. activityId.."_"..userId)) + end + if maxNum < (boughtNum + prodCount) then + return "-2" + end +end + +-- 因为有可能库存从别的地方扣减,这里只做锁定和订单的记录 +local mgetSkuKeys = {} +local msetSkuKV = {} +if prodCount > 0 then + -- 下面通过get获取当前的库存数量 + table.insert(mgetSkuKeys, cachePrefix.."stock:"..activityId.."_"..skuId) + table.insert(mgetSkuKeys, cachePrefix.."stock:"..activityId.."_"..skuId.."_"..pointId) + local stockStr = redis.call('mget', unpack(mgetSkuKeys)); + + local stock = tonumber(stockStr[1]) + local pointStock = tonumber(stockStr[2]) + + + + if pointStock == nil or prodCount > pointStock then + -- 库存不足返回-1 + return "-1" + end + + -- 批量更新剩余库存 + + -- 总库存 + table.insert(msetSkuKV, cachePrefix.."stock:"..activityId.."_"..skuId) + table.insert(msetSkuKV, stock - prodCount) + -- 区域库存 + table.insert(msetSkuKV, cachePrefix.."stock:"..activityId.."_"..skuId.."_"..pointId) + table.insert(msetSkuKV, pointStock - prodCount) +end + +-- 保存锁定记录 +table.insert(msetSkuKV, cachePrefix.."lock:"..orderId) +table.insert(msetSkuKV, tostring(prodCount)) +-- 更新购买数量 +table.insert(msetSkuKV, cachePrefix.."buy:"..activityId.."_"..userId) +table.insert(msetSkuKV, boughtNum + prodCount) +redis.call('mset',unpack(msetSkuKV)) +-- 保存订单记录map key=userId value={(status+订单id):1未付款, (info+订单id):orderInfo} +redis.call('HMSET',cachePrefix.."order:"..userId, "status:"..orderId, 1, "info:"..orderId, orderInfo) + +return "1" diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/ReturnStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/ReturnStock.lua new file mode 100644 index 0000000..fbb89e2 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/ReturnStock.lua @@ -0,0 +1,57 @@ +-- 取消订单还原购买数量等传入的数据格式,对于redis来说,lua是原子性的,有事务的 + +-- 检验库存信息 这里的key是 +local cachePrefix = KEYS[1] +local orderId = KEYS[2] +local activityId = KEYS[3] +local prodCount = tonumber(KEYS[4]) +local userId = KEYS[5] +local skuId = KEYS[6] +local pointId = KEYS[7] +--local zoneNo = KEYS[7] +local boughtNum = 0 + + +-- 删除订单锁定记录,还原库存(订单未支付前取消订单) +if (redis.call('exists', cachePrefix.."lock:"..orderId, tostring(prodCount)) == "1") then + local isDelete = redis.call('del', cachePrefix.."lock:"..orderId) + -- 删除锁定标记成功才进行还原购买数量,让方法幂等 + if isDelete > 0 then + -- 如果有限购,则用户已购数量回退 + if (redis.call('exists', cachePrefix.."buy:".. activityId.."_"..userId) == "1") then + -- 用户已购数量 + boughtNum = redis.call('get', cachePrefix.."buy:".. activityId.."_"..userId) + redis.call('set',cachePrefix.."buy:"..activityId.."_"..userId, boughtNum - prodCount) + end + -- 库存回退 + if prodCount ~= 0 then + -- 下面通过get获取当前的库存数量 + -- multiDecrementBO.getCachePrefix() + STOCK + multiDecrementBO.getActivityId() + StrUtil.C_UNDERLINE + multiDecrementBO.getSkuId() + local stock = tonumber(redis.call('get', cachePrefix.."stock:".. activityId.."_"..skuId.."_"..pointId )) + redis.call('set',cachePrefix.."stock:".. activityId.."_"..skuId,tostring(stock + prodCount)) + redis.call('set',cachePrefix.."stock:".. activityId.."_"..skuId.."_"..pointId,tostring(stock + prodCount)) + end + -- 删除订单记录map key=userId value={(status+订单id):1未付款, (info+订单id):orderInfo} + --redis.call('HDEL',cachePrefix.."order:"..userId, "status:"..orderId, "info:"..orderId) + end +end + + +-- 还原库存(订单支付后退款取消) +if (redis.call('exists', cachePrefix.."lock:"..orderId, tostring(prodCount)) ~= "1") then + -- 如果有限购,则用户已购数量回退 + if (redis.call('exists', cachePrefix.."buy:".. activityId.."_"..userId) == "1") then + -- 用户已购数量 + boughtNum = redis.call('get', cachePrefix.."buy:".. activityId.."_"..userId) + redis.call('set',cachePrefix.."buy:"..activityId.."_"..userId, boughtNum - prodCount) + end + -- 库存回退 + if prodCount ~= 0 then + -- 下面通过get获取当前的库存数量 + -- multiDecrementBO.getCachePrefix() + STOCK + multiDecrementBO.getActivityId() + StrUtil.C_UNDERLINE + multiDecrementBO.getSkuId() + local stock = tonumber(redis.call('get', cachePrefix.."stock:".. activityId.."_"..skuId.."_"..pointId )) + redis.call('set',cachePrefix.."stock:".. activityId.."_"..skuId,tostring(stock + prodCount)) + redis.call('set',cachePrefix.."stock:".. activityId.."_"..skuId.."_"..pointId,tostring(stock + prodCount)) + end +end + diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/SeckillSkuStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/SeckillSkuStock.lua new file mode 100644 index 0000000..1c3bd8e --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/SeckillSkuStock.lua @@ -0,0 +1,32 @@ +-- 扣减库存(必须足够扣除的时候才会扣除,如果不够扣除返回负数,如果足够扣除返回剩余库存数量,否则不进行扣减) + +-- 检验库存信息 这里的key是 +-- 总库存key +local skuKey = KEYS[1] +-- 区域库存key +local skuPointKey = KEYS[2] +-- 库存变化数量 +local stockChangeNum = tonumber(KEYS[1]) + +-- 获取区域库存数量 +local pointStock = tonumber(redis.call('get', skuPointKey)) +-- 获取总库存数量 +local stock = tonumber(redis.call('get', skuKey)) +if (pointStock == 0) then + return 0 +end +local canUse = pointStock - stockChangeNum +if (canUse > 0) then + stock = stock - stockChangeNum + pointStock = canUse + redis.call('mset', skuPointKey, canUse, skuKey, stock) +else + stock = stock - pointStock + -- 直到扣减到0为止 + pointStock = 0 +end +redis.call('mset', skuPointKey, pointStock, skuKey, stock) +return canUse + + + diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/SeckillSkuStockMerge.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/SeckillSkuStockMerge.lua new file mode 100644 index 0000000..3a649fb --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/SeckillSkuStockMerge.lua @@ -0,0 +1,24 @@ +-- 合并扣减库存,在通过合并扣减库存的时候,无论库存有多少都会扣减,直到扣减到0为止,返回扣减的数量 + +-- 检验库存信息 这里的key是 +-- 总库存key +local skuKey = KEYS[1] +-- 区域库存key +local skuPointKey = KEYS[2] +-- 库存变化数量 +local stockChangeNum = tonumber(KEYS[1]) + +-- 获取区域库存数量 +local pointStock = tonumber(redis.call('get', skuKey)) +-- 获取总库存数量 +local stock = tonumber(redis.call('get', skuPointKey)) +-- 区域库存扣除,并判断剩余库存数量是否足够扣减 +local canUse = pointStock - stockChangeNum +if (canUse < 0) then + return -1 +end +-- 总库存扣除 +stock = stock - stockChangeNum +-- 批量插入 +redis.call('mset', skuPointKey, canUse, skuKey, stock) +return canUse diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/coupon/DecrementCouponStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/coupon/DecrementCouponStock.lua new file mode 100644 index 0000000..ede505f --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/coupon/DecrementCouponStock.lua @@ -0,0 +1,40 @@ +-- 领券传入的数据格式,对于redis来说,lua是原子性的,有事务的 + +-- 检验库存信息 这里的key是 +local cachePrefix = KEYS[1] +-- 领券id couponUserId +local orderId = KEYS[2] +local activityId = KEYS[3] +local prodCount = tonumber(KEYS[4]) +local userId = KEYS[5] +local maxNum = tonumber(KEYS[6]) +local receiveNum = 0 + +-- 用户领券上限 +if (redis.call('exists', cachePrefix.."receive:".. activityId.."_"..userId) == "1") then + -- 用户领券数量 + receiveNum = tonumber(redis.call('get', cachePrefix.."receive:".. activityId.."_"..userId)) +end +if maxNum < (receiveNum + 1) then + return "-2" +end + +-- 因为有可能库存从别的地方扣减,这里只做锁定的记录 +if prodCount ~= 0 then + -- 下面通过get获取当前的库存数量 + local stock = tonumber(redis.call('get', cachePrefix.."stock:".. activityId.."_"..activityId)) + + if prodCount > stock then + -- 库存不足返回-1 + return "-1" + end + -- 更新剩余库存 + redis.call('set',cachePrefix.."stock:".. activityId.."_"..activityId,tostring(stock - prodCount)) +end + +-- 保存锁定记录 +redis.call('set',cachePrefix.."lock:"..activityId.."_"..userId.."_"..orderId, tostring(prodCount)) +-- 更新领券数量 +redis.call('set',cachePrefix.."receive:"..activityId.."_"..userId, receiveNum + 1) + +return "1" diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/coupon/ReturnCouponStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/coupon/ReturnCouponStock.lua new file mode 100644 index 0000000..0ec67a0 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/coupon/ReturnCouponStock.lua @@ -0,0 +1,32 @@ +-- 领券失败还原领券数量等传入的数据格式,对于redis来说,lua是原子性的,有事务的 + +-- 检验库存信息 这里的key是 +local cachePrefix = KEYS[1] +local orderId = KEYS[2] +local activityId = KEYS[3] +local prodCount = tonumber(KEYS[4]) +local userId = KEYS[5] +local skuId = KEYS[6] +local receiveNum = 0 + + +-- 删除优惠券锁定记录,还原库存 +if (redis.call('exists', cachePrefix.."lock:"..activityId.."_"..userId.."_"..orderId, tostring(prodCount)) == "1") then + local isDelete = redis.call('del', cachePrefix.."lock:"..activityId.."_"..userId.."_"..orderId) + -- 删除锁定标记成功才进行还原领券数量,让方法幂等 + if isDelete > 0 then + -- 如果有限购,则用户领券数量回退 + if (redis.call('exists', cachePrefix.."receive:".. activityId.."_"..userId) == "1") then + -- 用户领券数量 + receiveNum = redis.call('get', cachePrefix.."receive:".. activityId.."_"..userId) + redis.call('set',cachePrefix.."receive:"..activityId.."_"..userId, receiveNum - prodCount) + end + -- 库存回退 + if prodCount ~= 0 then + -- 下面通过get获取当前的库存数量 + local stock = tonumber(redis.call('get', cachePrefix.."stock:".. activityId.."_"..skuId )) + redis.call('set',cachePrefix.."stock:".. activityId.."_"..skuId,tostring(stock + prodCount)) + end + end +end + diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/SkuStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/SkuStock.lua new file mode 100644 index 0000000..e16bb4a --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/SkuStock.lua @@ -0,0 +1,226 @@ +-- Desc: sku库存操作 + +-- 库存操作: 1.插入库存 2.增加库存 3.减少库存 4.替换库存(覆盖) 5.更新库存状态 具体操作可以查看 6.sku区域库存状态变更 LuaOperateEnum +-- sku库存状态: 0:商品或sku下架、禁用、删除 1:上架状态 提交订单时需要校验此状态 2:下线sku区域库存,同时减少sku总库存 +-- KEYS入参格式: skuId_仓库id_库存变动数量_库存状态_库存操作, skuId_仓库id_库存变动数量_库存状态_库存操作... +-- params格式: {{skuId, 仓库id, 库存变动数量, 库存状态, 库存操作}, {skuId, 仓库id, 库存变动数量, 库存状态, 库存操作}} +-- sku总库存key格式-redis: mall4cloud_product:sku_sock:skuId +-- sku区域库存key格式-redis: mall4cloud_product:sku_sock:skuId_仓库id +-- sku库存value格式-redis: 可售库存数量_锁定库存数量_销量_sku库存状态 + +-- 处理流程: +-- 步骤一 将参数字符串(KEYS)拆分为数组(params), 拆分过程中根据库存操作类型处理: +-- 拼接区域库存和总库存的key(mgetSkuKeys:用于批量查询库存数据。 总库存key格式 key名称:skuId; 区域库存key格式 key名称:skuId_仓库id), +-- skuKey:根据数组中的存放的skuId以及仓库id,与批量获取的数据进行匹配(redis mget响应数据顺序对应查询时的key顺序) +-- skuKey中的数据有两种类型,一种是字符类型代表区域库存的skuId和仓库id,数据格式为: skuId_仓库id; 一种是数字类型代表总库存的skuId, 数据格式为:skuId +-- 库存操作:1.插入库存 5.更新库存状态 仅拼接总库存,不拼接区域库存的key +-- 步骤二 批量查询库存信息, 使用步骤一中拼接的key数组(mgetSkuKeys)进行查询 +-- 步骤三 拆分步骤三mget获取的sku库存信息: +-- mget获取的sku库存信息格式为:可售库存数量_锁定库存数量_销量_sku库存状态 +-- 拆分成数组(skuStock)后的格式为:{可售库存数量, 锁定库存数量, 销量,sku库存状态} +-- 库存集合(skuStocks)的数据格式为:map, 其中skukey还可以细分 -- 区域库存:skuId_仓库id(字符串); 总库存:skuId(数字类型) +-- 步骤四 根据操作类型,对sku库存和状态进行计算或者替换 +-- 1.增加库存(操作类型 param[5] == '2'), 根据库存变动数量(param[3])增加区域库存(skuPointStock)、总库存(skuStock)的可售库存数量 +-- 2.增加库存(操作类型 param[5] == '2'), 根据库存变动数量(param[3])增加区域库存(skuPointStock)、总库存(skuStock)的可售库存数量 +-- 3.减少库存(操作类型 param[5] == '3'), 根据库存变动数量(param[3])减少区域库存(skuPointStock)、总库存(skuStock)的可售库存数量 +-- 4.替换库存(操作类型 param[5] == '4'), 库存变动数量(param[3])替换区域库存(skuPointStock)的可售库存数量,同时增加或者减少对应总库存(skuStock)的可售库存数量 +-- 5.更新库存状态(操作类型 param[5] == '5'), 库存状态(param[4])替换总库存(skuStock)的库存状态(skuStock[4]),区域库存状态没有使用,不需要更改 +-- 6.sku区域库存状态变更 0:下架此库存,并扣除sku总库存 1:上架此区域库存,并增加sku总库存数量 +-- 步骤五 拼接将要更新的sku库存key、value, 以及sku库存变动结果(result) +-- 步骤六 批量保存修改后的sku库存信息 + + +-- 参数数组 +local params = {} +-- sku键数组 +local skuKey = {} +-- 批量插入的sku库存key、value数组 +local msetInsert = {} +-- 批量获取sku库存信息的key数组 +local mgetSkuKeys = {} +-- sku库存操作结果 格式: skuId_仓库id_剩余库存,skuId_仓库id_剩余库存... +local result = "" +-- 步骤一 +for index, paramStr in ipairs(KEYS) do + -- 拆分传入的参数, 格式: {skuId, 仓库id, 库存变动数量, 库存状态, 库存操作} + local param = {} + -- 匹配所有数字 + for value in string.gmatch(paramStr, "%d+") do + table.insert(param, value) + end + + ---- 根据操作类型来处理具体 + --if param[5] == '1' then + -- -- 库存操作: 1.插入库存 根据仓库id,又分为两种库存key,仓库id为0:sku总库存 仓库id大于0:sku区域库存(门店或者仓库) + -- if param[2] == '0' then + -- -- mset sku总库存key 格式: key名称:skuId + -- table.insert(msetInsert, "mall4cloud_product:sku_sock:"..param[1]) + -- else + -- -- mset sku区域库存key 格式: key名称:skuId_仓库id + -- table.insert(msetInsert, "mall4cloud_product:sku_sock:"..param[1].."_"..param[2]) + -- end + -- -- mset sku库存value 格式: 可售库存数量_锁定库存数量_销量_sku库存状态 + -- table.insert(msetInsert, param[3].."_0_0_"..param[4]) + -- -- skuId_仓库id_剩余库存,skuId_仓库id_剩余库存... + -- result = result..param[1].."_"..param[2].."_"..param[3].."," + -- -- 说明: 上面mset的key和value分别加入数组,是因为mset的命令格式: mset key1 value1 key2 value2 key3 value3 + --else + -- -- 库存操作: 2.增加库存 3.减少库存 4.替换库存(覆盖) 5.更新库存状态 + -- -- 更新操作才需要将param放到params数组 + -- table.insert(params, param) + -- + -- if param[2] == '0' then + -- key = nil + -- end + --end + + + -- 库存操作: 2.增加库存 3.减少库存 4.替换库存(覆盖) 5.更新库存状态 + -- 更新操作才需要将param放到params数组 + table.insert(params, param) + + -- 避免一个sku同时进行多个操作时,查询和计算的库存数据操作,所以这里要对区域库存和总库存的key去重 + local key = param[1].."_"..param[2] + -- 操作总库存(修改状态)或者插入sku区域库存, 将key设为nil + if param[2] == '0' or param[5] == '1' then + key = nil + end + + local skuId = tonumber(param[1]) + local notExistsKey = true + local notExistsSku = true + + for index, value in ipairs(skuKey) do + if not notExistsKey and not notExistsSku then break end + if key == nil or key == value then + notExistsKey = false + end + if skuId == value then + notExistsSku = false + end + end + + -- 数组没有的sku数组再添加到数组,skuKey用于批量查询后的sku数据绑定 + if key ~= nil and notExistsKey then + -- sku区域库存key格式: key名称:skuId_仓库id + table.insert(mgetSkuKeys, "mall4cloud_product:sku_sock:"..key) + table.insert(skuKey, key) + end + --总库存 + if notExistsSku then + -- sku总库存key格式: key名称:skuId + table.insert(mgetSkuKeys, "mall4cloud_product:sku_sock:"..param[1]) + -- 用数字类型区分总库存 + table.insert(skuKey, skuId) + end +end + +-- ================ 步骤二 通过mget获取所有key的值 ================ +-- call后面是可变长参数,unpack是将数组变成可变长参数 +local skuStr = redis.call('mget', unpack(mgetSkuKeys)); + + +-- ================ 步骤三 拆分mget中获取到的sku库存信息 ================ +-- skuStocks: map skukey:区域库存=skuId_仓库id; 总库存=skuId +local skuStocks = {} +for index, key in ipairs(skuKey) do + -- {可售库存数量, 锁定库存数量, 销量, sku库存状态} + local values = skuStr[index] + if values then + local skuStock = {} + for value in string.gmatch(values, "%d+") do + table.insert(skuStock, tonumber(value)) + end + -- 库存信息 + skuStocks[key] = skuStock + end +end + + +-- ================ 步骤四 根据操作类型,对sku库存和状态进行计算或者替换 ================ +for i = 1,#params do + -- skuId_仓库id_库存变动数量_库存状态_库存操作 + local param = params[i] + local skuPointStock = skuStocks[param[1].."_"..param[2]] + local skuStock = skuStocks[tonumber(param[1])] + + -- 库存变动数量 + local stockChange = tonumber(param[3]) + -- 库存操作: 1.插入库存 2.增加库存 3.减少库存 4.替换库存(覆盖) 5.更新库存状态 + if param[5] == '1' then + if not skuStock then + skuStock = {0,0,0,1} + skuStocks[tonumber(param[1])] = skuStock + end + skuPointStock = {param[3], 0, 0, param[4]} + skuStock[1] = tonumber(skuStock[1]) + tonumber(skuPointStock[1]) + skuStocks[param[1].."_"..param[2]] = skuPointStock + table.insert(skuKey, param[1].."_"..param[2]) + + elseif param[5] == '2' then + -- 2.增加库存: 可售库存 = 可售库存 + 库存变动数量 + skuPointStock[1] = skuPointStock[1] + stockChange + skuStock[1] = skuStock[1] + stockChange + + elseif param[5] == '3' then + -- 3.减少库存: 可售库存 = 可售库存 - 变化库存 + skuPointStock[1] = skuPointStock[1] - stockChange + skuStock[1] = skuStock[1] - stockChange + -- 减少库存需要判断可售库存数量是否足够扣除 + if skuPointStock[1] < 0 then + -- 库存改变后小于0 返回skuId + return param[1] + end + + elseif param[5] == '4' then + -- 4.替换库存(覆盖): 可售库存 = 变化库存 + -- sku总库存 = sku原总库存 + 变化的区域库存(新的区域库存 - 旧的区域库存) + skuStock[1] = tonumber(skuStock[1]) + stockChange - tonumber(skuPointStock[1]) + -- sku区域库存 - 等计算完再赋值 + skuPointStock[1] = stockChange + + elseif param[5] == '5' then + -- 5.更新库存状态: 替换sku状态 + skuStock[4] = param[4] + + elseif param[5] == '6' then + -- 6.sku区域库存状态变更 0:下架此库存,并扣除sku总库存 1:上架此区域库存,并增加sku总库存数量 + -- 状态不一样才需要更改 + if skuPointStock[4] ~= tonumber(param[4]) then + -- 下架区域库存: 区域库存状态设置为0, + if param[4] == '0' then + skuStock[1] = tonumber(skuStock[1]) - tonumber(skuPointStock[1]) + skuPointStock[4] = 0 + elseif param[4] == '1' then + skuStock[1] = tonumber(skuStock[1]) + tonumber(skuPointStock[1]) + skuPointStock[4] = 1 + end + end + end +end + + +-- ================ 步骤五 添加sku库存的key、value ================ +local msetSkuKV = {} +for index, key in ipairs(skuKey) do + -- 库存信息 + local skuStock = skuStocks[key] + -- mset sku库存key 格式: key名称:skuId 或者 key名称:skuId_仓库id + table.insert(msetSkuKV, "mall4cloud_product:sku_sock:"..key) + -- mset sku库存value 格式: 可售库存数量_锁定库存数量_销量_sku库存状态 + table.insert(msetSkuKV, skuStock[1].."_"..skuStock[2].."_"..skuStock[3].."_"..skuStock[4]) + -- skuId_仓库id_剩余库存,skuId_仓库id_剩余库存... + if type(key) == 'number' then + -- 总库存日志 + result = result..key.."_0_"..skuStock[1].."," + else + -- 区域库存日志 + result = result..key.."_"..skuStock[1].."," + end +end + + +-- ================ 步骤六 执行mset批量保存修改后的sku库存信息 ================ +redis.call('mset',unpack(msetSkuKV)) + +return result diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/allot/AllotReduceLockStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/allot/AllotReduceLockStock.lua new file mode 100644 index 0000000..870f750 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/allot/AllotReduceLockStock.lua @@ -0,0 +1,60 @@ +-- Desc: 调拨订单减少锁定库存 + +local params = {} +local skuStockKeys = {} +local totalSkuStockKeys = {} + +-- 将入参KEYS([订单id_仓库id_skuId_lockNum, ...])封装为params二元数组([[订单id, 仓库id, skuId, lockNum], ...]) +-- 并获取对应sku区域库存key和sku总库存key +for index, paramStr in ipairs(KEYS) do + -- 将paramStr解析成param数组 + local param = {} + for value in string.gmatch(paramStr, "%d+") do + table.insert(param, value) + end + table.insert(params, param) + -- 获取sku区域库存key + table.insert(skuStockKeys, "mall4cloud_product:sku_sock:"..param[3].."_"..param[2]) + table.insert(totalSkuStockKeys, "mall4cloud_product:sku_sock:"..param[3]) +end + +-- 执行redis的mget指令,批量获取sku区域库存key和总库存key对应的value值(unpack是将数组变成可变长参数) +local valueStrArr = redis.call('mget', unpack(skuStockKeys)); +local totalValueStrArr = redis.call('mget', unpack(totalSkuStockKeys)) + +-- 删除库存锁定记录,并更新redis-sku库存数据(lua'..'相当于java'+') +-- 将新的key-value封装为数组,方便后续mset +-- 记录执行结果,用于返回(订单id_仓库id_skuId_可用库存) +local result = "" +local skuStockKV = {} +for i = 1, #params do + -- 将valueStr和totalValueStr(可用数量_锁定数量_已售数量_状态)转成value数组([可用数量, 锁定数量, 已售数量, 状态]) + local skuStockValue = {} + for value in string.gmatch(valueStrArr[i], "%d+") do + table.insert(skuStockValue, value) + end + local totalSkuStockValue = {} + for value in string.gmatch(totalValueStrArr[i], "%d+") do + table.insert(totalSkuStockValue, value) + end + -- 执行redis的del指令,删除锁定记录(删除成功才进行更新sku库存) + local param = params[i] + local isDelete = redis.call('del', "mall4cloud_product:allot_order_sku_lock:"..param[1].."_"..param[2].."_"..param[3]) + if isDelete == 0 then return result end + -- 将新的sku库存的key-value封装成数组(减少锁定) + local lockNum = tonumber(param[4]) + local lock = tonumber(skuStockValue[2]) - lockNum + table.insert(skuStockKV, "mall4cloud_product:sku_sock:"..param[3].."_"..param[2]) + table.insert(skuStockKV, skuStockValue[1].."_"..lock.."_"..skuStockValue[3].."_"..skuStockValue[4]) + lock = tonumber(totalSkuStockValue[2]) - lockNum + table.insert(skuStockKV, "mall4cloud_product:sku_sock:"..param[3]) + table.insert(skuStockKV, totalSkuStockValue[1].."_"..lock.."_"..totalSkuStockValue[3].."_"..totalSkuStockValue[4]) + -- 拼接执行结果 + result = result..param[1].."_"..param[2].."_"..param[3].."_"..skuStockValue[1].."," +end + +-- 执行redis的mset指令,更新库存数据 +redis.call('mset', unpack(skuStockKV)) + +-- 返回执行结果 +return result \ No newline at end of file diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/order/OrderMakerUseStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/order/OrderMakerUseStock.lua new file mode 100644 index 0000000..aa96fac --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/order/OrderMakerUseStock.lua @@ -0,0 +1,139 @@ +-- Desc: 订单支付成功, 减少锁定库存,增加销量 + + +-- KEYS入参格式: 订单id_仓库id_skuId_lockNum, 订单id_仓库id_skuId_lockNum... +-- params格式: {{订单id, 仓库id, skuId, lockNum}, {订单id, 仓库id, skuId, lockNum}} +-- sku总库存key格式-redis: mall4cloud_product:sku_sock:skuId +-- sku区域库存key格式-redis: mall4cloud_product:sku_sock:skuId_仓库id +-- sku库存value格式-redis: 可售库存数量_锁定库存数量_销量_sku库存状态 + + +-- 订单支付成功处理流程: +-- 步骤一 将参数字符串(KEYS)拆分为数组(params), 拆分过程中根据库存操作类型处理: +-- 拼接区域库存和总库存的key(mgetSkuKeys:用于批量查询库存数据。 总库存key格式 key名称:skuId; 区域库存key格式 key名称:skuId_仓库id), +-- skuKey:根据数组中的存放的skuId以及仓库id,与批量获取的数据进行匹配(redis mget响应数据顺序对应查询时的key顺序) +-- skuKey中的数据有两种类型,一种是字符类型代表区域库存的skuId和仓库id,数据格式为: skuId_仓库id; 一种是数字类型代表总库存的skuId, 数据格式为:skuId +-- 步骤二 批量查询库存信息, 使用步骤一中拼接的key数组(mgetSkuKeys)进行查询 +-- 步骤三 拆分步骤三mget获取的sku库存信息: +-- mget获取的sku库存信息格式为:可售库存数量_锁定库存数量_销量_sku库存状态 +-- 拆分成数组(skuStock)后的格式为:{可售库存数量, 锁定库存数量, 销量,sku库存状态} +-- 库存集合(skuStocks)的数据格式为:map, 其中skukey还可以细分 -- 区域库存:skuId_仓库id(字符串); 总库存:skuId(数字类型) +-- 步骤四 根据订单数据,减少sku锁定库存,增加对应的sku销量, 以及拼接sku库存变动结果(result) +-- 步骤五 判断步骤四中是否有改动sku库存信息,有改动则拼接要更新的sku库存key、value,并批量保存修改后的sku库存信息 + + +-- sku键数组 +local skuKey = {} +-- 传参数据 +local params = {} +-- 用于批量获取sku库存信息的key集合 +local mgetSkuKeys = {} + +-- 步骤一 入参 KEYS 订单id_仓库id_skuId_lockNum 订单id_仓库id_skuId_lockNum... +for index, paramStr in ipairs(KEYS) do + -- {订单id, 仓库id, skuId, lockNum} + local param = {} + for value in string.gmatch(paramStr, "%d+") do + table.insert(param, value) + end + table.insert(params, param) + + -- 避免一个sku同时进行多个操作时,查询和计算的库存数据操作,所以这里要对区域库存和总库存的key去重 + local key = param[3].."_"..param[2] + local skuId = tonumber(param[3]) + local notExistsKey = true + local notExistsSku = true + for index, value in ipairs(skuKey) do + if not notExistsKey and not notExistsSku then break end + if key == value then + notExistsKey = false + elseif skuId == value then + notExistsSku = false + end + end + -- 数组没有的sku数组再添加到数组,skuKey用于批量查询后的sku数据绑定 + if notExistsKey then + -- sku区域库存key格式: key名称:skuId_仓库id + table.insert(mgetSkuKeys, "mall4cloud_product:sku_sock:"..key) + table.insert(skuKey, key) + --总库存去重 + if notExistsSku then + -- sku总库存key格式: key名称:skuId + table.insert(mgetSkuKeys, "mall4cloud_product:sku_sock:"..param[3]) + -- 用数字类型区分总库存 + table.insert(skuKey, skuId) + end + end +end + + +-- 步骤二 通过mget获取所有key的值,call后面是可变长参数,unpack是将数组变成可变长参数 +local skuStr = redis.call('mget', unpack(mgetSkuKeys)); + + +-- 步骤三 拆分mget中获取到的sku库存信息。 skuStocks: map skukey:区域库存=skuId_仓库id; 总库存=skuId +local skuStocks = {} +for index, key in ipairs(skuKey) do + -- {可售库存数量, 锁定库存数量, 销量, sku库存状态} + local skuStock = {} + for value in string.gmatch(skuStr[index], "%d+") do + table.insert(skuStock, tonumber(value)) + end + -- sku库存列表 + skuStocks[key] = skuStock +end + + +local result = "" +local updateNum = 0 +-- 步骤四 订单支付成功 - 减少sku锁定库存, 增加对应的sku销量 +for i = 1,#params do + -- 订单id_仓库id_skuId_lockNum_库存操作 + local param = params[i] + -- 删除锁定标记 key-订单id_仓库id_skuId + local isDelete = redis.call('del',"mall4cloud_product:order_sku_lock:"..param[1].."_"..param[2].."_"..param[3]) + + -- 删除锁定标记成功才进行还原库存,让方法幂等, 没有删除锁定标记就跳过本次循环 + if isDelete > 0 then + -- 可售库存数量_锁定库存数量_销量_sku库存状态 + local skuPointStock = skuStocks[param[3].."_"..param[2]] + local skuStock = skuStocks[tonumber(param[3])] + + local changeStock = tonumber(param[4]) + -- 修改sku库存记录 + -- 减少sku锁定区域库存 + skuPointStock[2] = tonumber(skuPointStock[2]) - changeStock + -- 减少sku锁定总库存 + skuStock[2] = tonumber(skuStock[2]) - changeStock + -- 增加sku区域销量 + skuPointStock[3] = tonumber(skuPointStock[3]) + changeStock + -- 增加sku总销量 + skuStock[3] = tonumber(skuStock[3]) + changeStock + + -- 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存... + result = result..param[1].."_"..param[2].."_"..param[3].."_"..skuPointStock[1].."," + result = result..param[1].."_0_"..param[3].."_"..skuStock[1].."," + updateNum = updateNum + 1 + end +end + + +-- 用于批量设置sku库存信息的key和value集合 +local msetSkuKV = {} +-- 步骤五 如果更新数量大于0,添加sku库存的key、value +if updateNum > 0 then + for index, key in ipairs(skuKey) do + -- 库存信息 {可售库存数量, 锁定库存数量, 销量, sku库存状态} + local skuStock = skuStocks[key] + -- mset sku库存key 总库存格式: key名称:skuId; 区域库存格式: key名称:skuId_仓库id + table.insert(msetSkuKV, "mall4cloud_product:sku_sock:"..key) + -- mset sku库存value 格式: 可售库存数量_锁定库存数量_销量_sku库存状态 + table.insert(msetSkuKV, skuStock[1].."_"..skuStock[2].."_"..skuStock[3].."_"..skuStock[4]) + end + + -- 修改回redis + redis.call('mset',unpack(msetSkuKV)) +end + + +return result diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/order/OrderStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/order/OrderStock.lua new file mode 100644 index 0000000..3a8c5f5 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/order/OrderStock.lua @@ -0,0 +1,145 @@ +-- Desc: 提交订单,扣除可售库存,增加锁定库存 + + +-- KEYS入参格式: 订单id_仓库id_skuId_lockNum, 订单id_仓库id_skuId_lockNum... +-- params格式: {{订单id, 仓库id, skuId, lockNum}, {订单id, 仓库id, skuId, lockNum}} +-- sku总库存key格式-redis: mall4cloud_product:sku_sock:skuId +-- sku区域库存key格式-redis: mall4cloud_product:sku_sock:skuId_仓库id +-- sku库存value格式-redis: 可售库存数量_锁定库存数量_销量_sku库存状态 + + +-- 提交订单处理流程: +-- 步骤一 将参数字符串(KEYS)拆分为数组(params), 拆分过程中根据库存操作类型处理: +-- 拼接区域库存和总库存的key(mgetSkuKeys:用于批量查询库存数据。 总库存key格式 key名称:skuId; 区域库存key格式 key名称:skuId_仓库id), +-- skuKey:根据数组中的存放的skuId以及仓库id,与批量获取的数据进行匹配(redis mget响应数据顺序对应查询时的key顺序) +-- skuKey中的数据有两种类型,一种是字符类型代表区域库存的skuId和仓库id,数据格式为: skuId_仓库id; 一种是数字类型代表总库存的skuId, 数据格式为:skuId +-- 步骤二 批量查询库存信息, 使用步骤一中拼接的key数组(mgetSkuKeys)进行查询 +-- 步骤三 拆分步骤三mget获取的sku库存信息: +-- mget获取的sku库存信息格式为:可售库存数量_锁定库存数量_销量_sku库存状态 +-- 拆分成数组(skuStock)后的格式为:{可售库存数量, 锁定库存数量, 销量,sku库存状态} +-- 库存集合(skuStocks)的数据格式为:map, 其中skukey还可以细分 -- 区域库存:skuId_仓库id(字符串); 总库存:skuId(数字类型) +-- 步骤四 根据订单数据,减少sku可售库存,增加对应的sku锁定库存, 以及sku库存变动结果(result) +-- 步骤五 拼接将要更新的sku库存key、value +-- 步骤六 批量保存修改后的sku库存信息 + + +-- sku键数组 +local skuKey = {} +-- 传参数据 +local params = {} +-- 用于批量获取sku库存信息的key集合 +local mgetSkuKeys = {} + +-- 步骤一 入参 KEYS 订单id_仓库id_skuId_lockNum 订单id_仓库id_skuId_lockNum... +for index, paramStr in ipairs(KEYS) do + -- {订单id, 仓库id, skuId, lockNum} + local param = {} + for value in string.gmatch(paramStr, "%d+") do + table.insert(param, value) + end + table.insert(params, param) + + -- 避免一个sku同时进行多个操作时,查询和计算的库存数据操作,所以这里要对区域库存和总库存的key去重 + local key = param[3].."_"..param[2] + local skuId = tonumber(param[3]) + local notExistsKey = true + local notExistsSku = true + for index, value in ipairs(skuKey) do + if not notExistsKey and not notExistsSku then break end + if key == value then + notExistsKey = false + elseif skuId == value then + notExistsSku = false + end + end + -- 数组没有的sku数组再添加到数组,skuKey用于批量查询后的sku数据绑定 + if notExistsKey then + -- sku区域库存key格式: key名称:skuId_仓库id + table.insert(mgetSkuKeys, "mall4cloud_product:sku_sock:"..key) + table.insert(skuKey, key) + --总库存去重 + if notExistsSku then + -- sku总库存key格式: key名称:skuId + table.insert(mgetSkuKeys, "mall4cloud_product:sku_sock:"..param[3]) + -- 用数字类型区分总库存 + table.insert(skuKey, skuId) + end + end +end + + +-- 步骤二 通过mget获取所有key的值,call后面是可变长参数,unpack是将数组变成可变长参数 +local skuStr = redis.call('mget', unpack(mgetSkuKeys)); + + +-- 步骤三 拆分mget中获取到的sku库存信息。 skuStocks: map skukey:区域库存=skuId_仓库id; 总库存=skuId +local skuStocks = {} +for index, key in ipairs(skuKey) do + -- {可售库存数量, 锁定库存数量, 销量, sku库存状态} + local skuStock = {} + for value in string.gmatch(skuStr[index], "%d+") do + table.insert(skuStock, tonumber(value)) + end + -- sku库存列表 + skuStocks[key] = skuStock +end + + +local result = "" +-- 用于批量设置sku库存信息的key和value集合 +local msetSkuKV = {} +-- 步骤四 根据订单数据,减少sku可售库存,增加对应的sku锁定库存 +for i = 1,#params do + -- 订单id_仓库id_skuId_lockNum_库存操作 + local param = params[i] + -- 可售库存数量_锁定库存数量_销量_sku库存状态 + local skuPointStock = skuStocks[param[3].."_"..param[2]] + local skuStock = skuStocks[tonumber(param[3])] + + -- 校验库存状态是否为上架 + if skuStock[4] ~= 1 then + -- sku库存状态不等于1(上架状态)。 -1:不是上架的sku,不能参与售卖 + return "-1" + end + -- 校验库存是否充足 + -- 订单id_仓库id_skuId_lockNum + local param = params[i] + local changeStock = tonumber(param[4]) + -- 减少可售库存 + skuPointStock[1] = tonumber(skuPointStock[1]) - changeStock + -- 扣除后,库存数量小于0 + if skuPointStock[1] < 0 then + -- 库存不足返回skuId + return param[3] + end + -- 减少sku可售总库存 + skuStock[1] = tonumber(skuStock[1]) - changeStock + + -- 增加锁定库存 + skuPointStock[2] = tonumber(skuPointStock[2]) + changeStock + skuStock[2] = tonumber(skuStock[2]) + changeStock + + -- 添加锁定明细记录 key-订单id_仓库id_skuId value-操作数量 + redis.call('set',"mall4cloud_product:order_sku_lock:"..param[1].."_"..param[2].."_"..param[3], param[4]) + -- 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存... + result = result..param[1].."_"..param[2].."_"..param[3].."_"..skuPointStock[1].."," + result = result..param[1].."_0_"..param[3].."_"..skuStock[1].."," +end + + +-- 步骤五 添加sku库存的key、value +for index, key in ipairs(skuKey) do + -- 库存信息 {可售库存数量, 锁定库存数量, 销量, sku库存状态} + local skuStock = skuStocks[key] + -- mset sku库存key 总库存格式: key名称:skuId; 区域库存格式: key名称:skuId_仓库id + table.insert(msetSkuKV, "mall4cloud_product:sku_sock:"..key) + -- mset sku库存value 格式: 可售库存数量_锁定库存数量_销量_sku库存状态 + table.insert(msetSkuKV, skuStock[1].."_"..skuStock[2].."_"..skuStock[3].."_"..skuStock[4]) +end + + +-- 步骤七 执行mset批量保存修改后的sku库存信息 +redis.call('mset',unpack(msetSkuKV)) + + +return result diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/purchase/PurchaseReduceLuckStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/purchase/PurchaseReduceLuckStock.lua new file mode 100644 index 0000000..06bc435 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/purchase/PurchaseReduceLuckStock.lua @@ -0,0 +1,60 @@ +-- Desc: 采购订单减少锁定库存 + +local params = {} +local skuStockKeys = {} +local totalSkuStockKeys = {} + +-- 将入参KEYS([订单id_仓库id_skuId_lockNum, ...])封装为params二元数组([[订单id, 仓库id, skuId, lockNum], ...]) +-- 并获取对应sku区域库存key和sku总库存key +for index, paramStr in ipairs(KEYS) do + -- 将paramStr解析成param数组 + local param = {} + for value in string.gmatch(paramStr, "%d+") do + table.insert(param, value) + end + table.insert(params, param) + -- 获取sku区域库存key + table.insert(skuStockKeys, "mall4cloud_product:sku_sock:"..param[3].."_"..param[2]) + table.insert(totalSkuStockKeys, "mall4cloud_product:sku_sock:"..param[3]) +end + +-- 执行redis的mget指令,批量获取sku区域库存key和总库存key对应的value值(unpack是将数组变成可变长参数) +local valueStrArr = redis.call('mget', unpack(skuStockKeys)); +local totalValueStrArr = redis.call('mget', unpack(totalSkuStockKeys)) + +-- 删除库存锁定记录,并更新redis-sku库存数据(lua'..'相当于java'+') +-- 将新的key-value封装为数组,方便后续mset +-- 记录执行结果,用于返回(订单id_仓库id_skuId_可用库存) +local result = "" +local skuStockKV = {} +for i = 1, #params do + -- 将valueStr和totalValueStr(可用数量_锁定数量_已售数量_状态)转成value数组([可用数量, 锁定数量, 已售数量, 状态]) + local skuStockValue = {} + for value in string.gmatch(valueStrArr[i], "%d+") do + table.insert(skuStockValue, value) + end + local totalSkuStockValue = {} + for value in string.gmatch(totalValueStrArr[i], "%d+") do + table.insert(totalSkuStockValue, value) + end + -- 执行redis的del指令,删除锁定记录(删除成功才进行更新sku库存) + local param = params[i] + local isDelete = redis.call('del', "mall4cloud_product:purchase_order_sku_lock:"..param[1].."_"..param[2].."_"..param[3]) + if isDelete == 0 then return result end + -- 将新的sku库存的key-value封装成数组(减少锁定) + local lockNum = tonumber(param[4]) + local lock = tonumber(skuStockValue[2]) - lockNum + table.insert(skuStockKV, "mall4cloud_product:sku_sock:"..param[3].."_"..param[2]) + table.insert(skuStockKV, skuStockValue[1].."_"..lock.."_"..skuStockValue[3].."_"..skuStockValue[4]) + lock = tonumber(totalSkuStockValue[2]) - lockNum + table.insert(skuStockKV, "mall4cloud_product:sku_sock:"..param[3]) + table.insert(skuStockKV, totalSkuStockValue[1].."_"..lock.."_"..totalSkuStockValue[3].."_"..totalSkuStockValue[4]) + -- 拼接执行结果 + result = result..param[1].."_"..param[2].."_"..param[3].."_"..skuStockValue[1].."," +end + +-- 执行redis的mset指令,更新库存数据 +redis.call('mset', unpack(skuStockKV)) + +-- 返回执行结果 +return result \ No newline at end of file diff --git a/tmerclub-common/tmerclub-common-core/pom.xml b/tmerclub-common/tmerclub-common-core/pom.xml new file mode 100644 index 0000000..5e4a962 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/pom.xml @@ -0,0 +1,111 @@ + + + + tmerclub-common + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-common-core + mall4cloud 公共模块核心(公共中的公共代码) + jar + + + + + org.springframework.cloud + spring-cloud-context + + + org.springframework.boot + spring-boot-starter-web + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-json + + + cn.hutool + hutool-core + + + cn.hutool + hutool-crypto + + + cn.hutool + hutool-http + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + + + io.seata + seata-spring-boot-starter + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + com.alibaba + easyexcel + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-ooxml + ${poi.version} + + + com.alibaba + transmittable-thread-local + + + + org.apache.dubbo + dubbo-spring-boot-starter + + + com.google.protobuf + protobuf-java + + + org.springframework.boot + spring-boot-starter-aop + + + com.lzhpo + logging-tracer-dubbo-adapter + + + cn.hutool + hutool-extra + + + + diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Alipay.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Alipay.java new file mode 100644 index 0000000..318d7b4 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Alipay.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.bean; + +/** + * 支付宝配置 + * @author FrozenWatermelon + */ +public class Alipay { + + private String appId; + + /** + * 应用公钥证书 + */ + private String appCertPath; + + /** + * 应用公钥证书内容 + */ + private String appCertContent; + + /** + * 支付宝公钥证书 + */ + private String alipayCertPath; + + /** + * 支付宝公钥证书内容 + */ + private String alipayCertContent; + + /** + * 支付宝根证书 + */ + private String alipayRootCertPath; + + /** + * 支付宝根证书内容 + */ + private String alipayRootCertContent; + + /** + * 应用私钥 + */ + private String appPrivateKey; + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppCertPath() { + return appCertPath; + } + + public void setAppCertPath(String appCertPath) { + this.appCertPath = appCertPath; + } + + public String getAlipayCertPath() { + return alipayCertPath; + } + + public void setAlipayCertPath(String alipayCertPath) { + this.alipayCertPath = alipayCertPath; + } + + public String getAlipayRootCertPath() { + return alipayRootCertPath; + } + + public void setAlipayRootCertPath(String alipayRootCertPath) { + this.alipayRootCertPath = alipayRootCertPath; + } + + public String getAppPrivateKey() { + return appPrivateKey; + } + + public void setAppPrivateKey(String appPrivateKey) { + this.appPrivateKey = appPrivateKey; + } + + public String getAppCertContent() { + return appCertContent; + } + + public void setAppCertContent(String appCertContent) { + this.appCertContent = appCertContent; + } + + public String getAlipayCertContent() { + return alipayCertContent; + } + + public void setAlipayCertContent(String alipayCertContent) { + this.alipayCertContent = alipayCertContent; + } + + public String getAlipayRootCertContent() { + return alipayRootCertContent; + } + + public void setAlipayRootCertContent(String alipayRootCertContent) { + this.alipayRootCertContent = alipayRootCertContent; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Allinpay.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Allinpay.java new file mode 100644 index 0000000..6156fc3 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Allinpay.java @@ -0,0 +1,154 @@ +package com.tmerclub.cloud.common.bean; + +/** + * 通联支付 + * @author TRACK + */ +public class Allinpay { + + /** + * 请求地址 + */ + private String requestUrl; + + /** + * 应用编号 + */ + private String appId; + + /** + * 签名密钥 + */ + private String appSecret; + + /** + * 商户私钥 + */ + private String appPrivateKey; + + /** + * 托管账户集编号(个人,企业会员使用) + */ + private String accountSetNo; + + /** + * 应用公钥证书路径 + */ + private String appCertPath; + + /** + * 应用私钥证书路径 + */ + private String appPrivateCertPath; + + /** + * 通联支付分配的商户号 + */ + private String vspCusId; + + /** + * 微信子商户号 + */ + private String wechatSubAppId; + + /** + * 支付宝子商户号 + */ + private String alipaySubAppId; + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppSecret() { + return appSecret; + } + + public void setAppSecret(String appSecret) { + this.appSecret = appSecret; + } + + public String getAppPrivateKey() { + return appPrivateKey; + } + + public void setAppPrivateKey(String appPrivateKey) { + this.appPrivateKey = appPrivateKey; + } + + public String getAppCertPath() { + return appCertPath; + } + + public void setAppCertPath(String appCertPath) { + this.appCertPath = appCertPath; + } + + public String getAppPrivateCertPath() { + return appPrivateCertPath; + } + + public void setAppPrivateCertPath(String appPrivateCertPath) { + this.appPrivateCertPath = appPrivateCertPath; + } + + public String getAccountSetNo() { + return accountSetNo; + } + + public void setAccountSetNo(String accountSetNo) { + this.accountSetNo = accountSetNo; + } + + public String getRequestUrl() { + return requestUrl; + } + + public void setRequestUrl(String requestUrl) { + this.requestUrl = requestUrl; + } + + public String getVspCusId() { + return vspCusId; + } + + public void setVspCusId(String vspCusId) { + this.vspCusId = vspCusId; + } + + public String getWechatSubAppId() { + return wechatSubAppId; + } + + public void setWechatSubAppId(String wechatSubAppId) { + this.wechatSubAppId = wechatSubAppId; + } + + public String getAlipaySubAppId() { + return alipaySubAppId; + } + + public void setAlipaySubAppId(String alipaySubAppId) { + this.alipaySubAppId = alipaySubAppId; + } + + @Override + public String toString() { + return "Allinpay{" + + "requestUrl='" + requestUrl + '\'' + + ", appId='" + appId + '\'' + + ", appSecret='" + appSecret + '\'' + + ", appPrivateKey='" + appPrivateKey + '\'' + + ", accountSetNo='" + accountSetNo + '\'' + + ", appCertPath='" + appCertPath + '\'' + + ", appPrivateCertPath='" + appPrivateCertPath + '\'' + + ", vspCusId='" + vspCusId + '\'' + + ", wechatSubAppId='" + wechatSubAppId + '\'' + + ", alipaySubAppId='" + alipaySubAppId + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/BmapPoint.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/BmapPoint.java new file mode 100644 index 0000000..fbbaaef --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/BmapPoint.java @@ -0,0 +1,57 @@ +package com.tmerclub.cloud.common.bean; + +import java.util.Objects; + +/** + * @author lanhai + */ +public class BmapPoint { + /** + * 经度 + */ + private double lng; + /** + * 纬度 + */ + private double lat; + + public BmapPoint() { + + } + + public BmapPoint(double lng, double lat) { + this.lng = lng; + this.lat = lat; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof BmapPoint) { + BmapPoint bmapPoint = (BmapPoint) obj; + return bmapPoint.getLng() == lng && bmapPoint.getLat() == lat; + } else { + return false; + } + } + + @Override + public int hashCode() { + return Objects.hash(lng, lat); + } + + public double getLng() { + return lng; + } + + public void setLng(double lng) { + this.lng = lng; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Domain.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Domain.java new file mode 100644 index 0000000..793cf7d --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Domain.java @@ -0,0 +1,45 @@ +package com.tmerclub.cloud.common.bean; +/** + * @author lanhai + */ +public class Domain { + private String apiDomainName; + + private String multishopDomainName; + + private String platformDomainName; + + private String resourcesDomainName; + + public String getApiDomainName() { + return apiDomainName; + } + + public void setApiDomainName(String apiDomainName) { + this.apiDomainName = apiDomainName; + } + + public String getMultishopDomainName() { + return multishopDomainName; + } + + public void setMultishopDomainName(String multishopDomainName) { + this.multishopDomainName = multishopDomainName; + } + + public String getPlatformDomainName() { + return platformDomainName; + } + + public void setPlatformDomainName(String platformDomainName) { + this.platformDomainName = platformDomainName; + } + + public String getResourcesDomainName() { + return resourcesDomainName; + } + + public void setResourcesDomainName(String resourcesDomainName) { + this.resourcesDomainName = resourcesDomainName; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/QuickBird.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/QuickBird.java new file mode 100644 index 0000000..d2dad27 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/QuickBird.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.bean; + + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 快递鸟物流详情查询 + * @author FrozenWatermelon + */ +public class QuickBird extends SwitchBaseModel { + + /** + * 快递鸟中顺丰编码 + */ + @JsonIgnore + public static final String SF_CODE = "SF"; + + private String eBusinessID; + private String appKey; + private String reqUrl; + + public String geteBusinessID() { + return eBusinessID; + } + + public void seteBusinessID(String eBusinessID) { + this.eBusinessID = eBusinessID; + } + + public String getAppKey() { + return appKey; + } + + public void setAppKey(String appKey) { + this.appKey = appKey; + } + + public String getReqUrl() { + return reqUrl; + } + + public void setReqUrl(String reqUrl) { + this.reqUrl = reqUrl; + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/SensitiveWord.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/SensitiveWord.java new file mode 100644 index 0000000..d4488ae --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/SensitiveWord.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.bean; + +/** + * @author Citrus + * @date 2021/8/6 10:25 + */ +public class SensitiveWord { + /** + * 敏感词 + */ + private String sensitiveWords; + + public String getSensitiveWords() { + return sensitiveWords; + } + + public void setSensitiveWords(String sensitiveWords) { + this.sensitiveWords = sensitiveWords; + } + + @Override + public String toString() { + return "SensitiveWord{" + + "sensitiveWords='" + sensitiveWords + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/SwitchBaseModel.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/SwitchBaseModel.java new file mode 100644 index 0000000..541a049 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/SwitchBaseModel.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.bean; + +/** + * @Author lth + * @Date 2022/1/12 10:39 + */ +public class SwitchBaseModel { + + private Boolean isOpen; + + public Boolean getIsOpen() { + return isOpen; + } + + public void setIsOpen(Boolean open) { + isOpen = open; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/UploadFile.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/UploadFile.java new file mode 100644 index 0000000..8c2cb28 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/UploadFile.java @@ -0,0 +1,105 @@ +package com.tmerclub.cloud.common.bean; + + +import com.tmerclub.cloud.common.constant.StorageTypeEnum; + +import java.util.Objects; + +/** + * 文件上传配置 + * @author gaozijie + * @date 2023-11-01 + */ +public class UploadFile { + /** + * 存储类型 + * @see com.tmerclub.cloud.common.constant.StorageTypeEnum + */ + private Integer storageType; + + /** + * 上传终端 + */ + private String endPoint; + + /** + * 账号 + */ + private String accessKey; + + /** + * 密码 + */ + private String secretKey; + + /** + * 桶名 + */ + private String bucketName; + + public UploadFile() { + } + + public Integer getStorageType() { + return storageType; + } + + public void setStorageType(Integer storageType) { + this.storageType = storageType; + } + + public String getEndPoint() { + return endPoint; + } + + public void setEndPoint(String endPoint) { + this.endPoint = endPoint; + } + + public String getAccessKey() { + return accessKey; + } + + public void setAccessKey(String accessKey) { + this.accessKey = accessKey; + } + + public String getSecretKey() { + return secretKey; + } + + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; + } + + public String getBucketName() { + return bucketName; + } + + public void setBucketName(String bucketName) { + this.bucketName = bucketName; + } + + /** + * 获取资源地址 + * @return 资源地址 + */ + public String getResourceUrl() { + if (Objects.equals(this.storageType, StorageTypeEnum.MINIO.getValue())) { + return this.endPoint + "/" + this.bucketName; + } + String[] endpointParam = this.endPoint.split("://"); + return endpointParam[0] + "://" + this.bucketName + "." + endpointParam[1]; + } + + @Override + public String toString() { + return "UploadFile{" + + "storageType=" + storageType + + ", endPoint='" + endPoint + '\'' + + ", accessKey='" + accessKey + '\'' + + ", secretKey='" + secretKey + '\'' + + ", bucketName='" + bucketName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxApp.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxApp.java new file mode 100644 index 0000000..b1927c6 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxApp.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.bean; + +/** + * @author FrozenWatermelon + */ +public class WxApp { + /** + * 设置微信原生的appid + */ + private String appId; + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxMiniApp.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxMiniApp.java new file mode 100644 index 0000000..4b2001d --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxMiniApp.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.bean; + +/** + * @author FrozenWatermelon + */ + +public class WxMiniApp { + /** + * 设置微信小程序的appid + */ + private String appId; + + /** + * 设置微信小程序的Secret + */ + private String secret; + + /** + * + * 是否开启小程序发货 true/false + */ + private Boolean wechatShippingAudit; + + public Boolean getWechatShippingAudit() { + return wechatShippingAudit; + } + + public void setWechatShippingAudit(Boolean wechatShippingAudit) { + this.wechatShippingAudit = wechatShippingAudit; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getSecret() { + return secret; + } + + public void setSecret(String secret) { + this.secret = secret; + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxPay.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxPay.java new file mode 100644 index 0000000..ec5b33c --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxPay.java @@ -0,0 +1,164 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.bean; + +/** + * @author FrozenWatermelon + */ +public class WxPay { + + public static final Integer VERSION_3 = 3; + + /** + * 微信支付mchId + */ + private String mchId; + + /** + * 微信支付mchKey + */ + private String mchKey; + + /** + * 签名类型 + */ + private String signType; + + /** + * 支付证书路径 + */ + private String keyPath; + + // ======== v3 需要======= + /** + * 微信支付版本 2代表用旧的v2支付 3代表用v3支付 + */ + private Integer version; + + /** + * 证书序列号 + */ + private String certSerialNo; + + /** + * apiV3秘钥 + */ + private String apiv3Key; + + /** + * apiv3 商户apiclient_key.pem + */ + private String privateKeyPath; + + /** + * apiv3 商户apiclient_key.pem的内容 + */ + private String privateKeyContent; + + /** + * apiv3 商户apiclient_cert.pem + */ + private String privateCertPath; + + /** + * apiv3 商户apiclient_cert.pem的内容 + */ + private String privateCertContent; + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public String getCertSerialNo() { + return certSerialNo; + } + + public void setCertSerialNo(String certSerialNo) { + this.certSerialNo = certSerialNo; + } + + public String getApiv3Key() { + return apiv3Key; + } + + public void setApiv3Key(String apiv3Key) { + this.apiv3Key = apiv3Key; + } + + public String getPrivateKeyPath() { + return privateKeyPath; + } + + public void setPrivateKeyPath(String privateKeyPath) { + this.privateKeyPath = privateKeyPath; + } + + public String getPrivateCertPath() { + return privateCertPath; + } + + public void setPrivateCertPath(String privateCertPath) { + this.privateCertPath = privateCertPath; + } + + public String getMchId() { + return mchId; + } + + public void setMchId(String mchId) { + this.mchId = mchId; + } + + public String getMchKey() { + return mchKey; + } + + public void setMchKey(String mchKey) { + this.mchKey = mchKey; + } + + public String getSignType() { + return signType; + } + + public void setSignType(String signType) { + this.signType = signType; + } + + public String getKeyPath() { + return keyPath; + } + + public void setKeyPath(String keyPath) { + this.keyPath = keyPath; + } + + public String getPrivateKeyContent() { + return privateKeyContent; + } + + public void setPrivateKeyContent(String privateKeyContent) { + this.privateKeyContent = privateKeyContent; + } + + public String getPrivateCertContent() { + return privateCertContent; + } + + public void setPrivateCertContent(String privateCertContent) { + this.privateCertContent = privateCertContent; + } +} + diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/config/RestTemplateConfig.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/config/RestTemplateConfig.java new file mode 100644 index 0000000..5b9bb33 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/config/RestTemplateConfig.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +/** + * @author FrozenWatermelon + * @date 2020/7/11 + */ +@Configuration +public class RestTemplateConfig { + + @Bean + @ConditionalOnMissingBean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayConstant.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayConstant.java new file mode 100644 index 0000000..248fad9 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayConstant.java @@ -0,0 +1,45 @@ +package com.tmerclub.cloud.common.constant; + +import java.time.LocalTime; + +/** + * @author lanhai + */ +public class AllinpayConstant { + public static final String SHOP = "Mall4jShop" + Constant.DASHED_ENV; + public static final String SUPPLIER = "Mall4jSupplier" + Constant.DASHED_ENV; + public static final String USER = "Mall4jUser" + Constant.DASHED_ENV; + + public static final Integer SHOP_LENGTH = SHOP.length(); + + public static final Integer SUPPLIER_LENGTH = SUPPLIER.length(); + + /** + * 暂时定死行业代码为 1910:其他 + */ + public static final String INDUSTRY_CODE = "1910"; + public static final String INDUSTRY_NAME = "其他"; + + public static final String SET_COMPANY_INFO_RESULT = "当前企业用户已审核通过,无法设置企业信息。"; + + /** + * 通联企业信息审核成功 + */ + public static final String ALLINPAY_AUDIT_SUCCESS = "审核成功"; + + public static final String ID_CARD_UPDATE_SUCCESS = "影印件更新成功"; + + /** + * 通联无感注册默认绑定手机号 + */ + public static final String DEFAULT_BIND_PHONE_NUMBER = "88888888888"; + + /** + * 允许提现起始时间 + */ + public static final LocalTime ALLOW_WITHDRAW_START_TIME = LocalTime.of(7, 0); + /** + * 允许提现结束时间 + */ + public static final LocalTime ALLOW_WITHDRAW_END_TIME = LocalTime.of(20, 0); +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayPayStatus.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayPayStatus.java new file mode 100644 index 0000000..7b07381 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayPayStatus.java @@ -0,0 +1,50 @@ +package com.tmerclub.cloud.common.constant; + +/** + * 通联支付返回状态 + * 1、成功:success + * 2、进行中:pending + * 3、失败:fail + * 4.未支付:unpay + * + * @author TRACK + */ +public enum AllinpayPayStatus { + + /** + * 成功 + */ + SUCCESS("success"), + /** + * 进行中 + */ + PENDING("pending"), + /** + * 失败 + */ + FAIL("fail"), + /** + * 未支付 + */ + UNPAY("unpay"), + + /** + * 提现和充值回调的成功 + */ + OK("OK"), + + /** + * 提现回调的失败 + */ + ERROR("error"); + + private final String value; + + public String value() { + return value; + } + + AllinpayPayStatus(String value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AutoCheckEnum.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AutoCheckEnum.java new file mode 100644 index 0000000..c32507c --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AutoCheckEnum.java @@ -0,0 +1,45 @@ +package com.tmerclub.cloud.common.constant; + + +/** + * @author lhd + */ +public enum AutoCheckEnum { + /** + * 人工判定 + */ + ARTIFICIAL(0, "人工判定"), + /** + * 系统判定 + */ + SYSTEM(1,"系统判定"), + /** + * 无需审核 + */ + NO_AUDIT(2,"无需审核"); + + private final Integer value; + private final String type; + + public Integer value() { + return value; + } + + public String type() { + return type; + } + AutoCheckEnum(Integer value, String desc) { + this.value = value; + this.type = desc; + } + + public static AutoCheckEnum instance(Integer value) { + AutoCheckEnum[] enums = values(); + for (AutoCheckEnum stateEnum : enums) { + if (stateEnum.value().equals(value)) { + return stateEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/CompanyInfoProcessStatus.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/CompanyInfoProcessStatus.java new file mode 100644 index 0000000..0b19c43 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/CompanyInfoProcessStatus.java @@ -0,0 +1,37 @@ +package com.tmerclub.cloud.common.constant; + +/** + * 通联企业信息审核状态 0.未提交 1.待审核 2.审核成功 3.审核失败 + * @author TRACK + */ +public enum CompanyInfoProcessStatus { + /** + * 未提交 + */ + UN_COMMITTED(0), + + /** + * 待审核 + */ + WAIT_AUDIT(1), + + /** + * 审核成功 + */ + SUCCESS(2), + + /** + * 审核失败 + */ + FAIL(3); + + private final Integer num; + + public Integer value() { + return num; + } + + CompanyInfoProcessStatus(Integer num) { + this.num = num; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/DistributedIdKey.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/DistributedIdKey.java new file mode 100644 index 0000000..e69de29 diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/DistributionAudit.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/DistributionAudit.java new file mode 100644 index 0000000..e80013a --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/DistributionAudit.java @@ -0,0 +1,54 @@ +package com.tmerclub.cloud.common.constant; + + +/** + * @author lanhai + */ +public enum DistributionAudit { + + /** + * 提现方式 + */ + Withdrawals_ZERO(0, "无需审核直接发放"), + Withdrawals_ONE(1, "审核后系统发放"), + TWithdrawals_TWO(2, "审核后人工发放"), + /** + * 收入提示 + */ + INCOME_ZERO(0, "正常"), + INCOME_ONE(1, "分销佣金大于或者等于订单项实付金额"), + INCOME_TWO(2, "订单项售后成功"), + INCOME_THREE(3, "订单无效:无效原因:分销佣金小于0.01"), + /** + * 用户分销员绑定状态 + */ + BIND_SYMBOL_ONE(-1, "失效"), + BIND_ZERO(0, "预绑定"), + BIND_ONE(1, "生效"); + + private final Integer value; + private final String info; + + public Integer value() { + return value; + } + + public String info() { + return info; + } + + DistributionAudit(Integer value, String info) { + this.value = value; + this.info = info; + } + + public static DistributionAudit instance(Integer value) { + DistributionAudit[] enums = values(); + for (DistributionAudit distributionAudit : enums) { + if (distributionAudit.value().equals(value)) { + return distributionAudit; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/ExcelConstant.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/ExcelConstant.java new file mode 100644 index 0000000..65aaed9 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/ExcelConstant.java @@ -0,0 +1,16 @@ +package com.tmerclub.cloud.common.constant; + +/** + * @author gaozijie + * @date 2023-06-20 + */ +public interface ExcelConstant { + /** + * 逗号分割符 + */ + String COMMA_SPLIT = ","; + /** + * url前缀 + */ + String URL_PREFIX = "http"; +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/JumpType.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/JumpType.java new file mode 100644 index 0000000..9e01983 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/JumpType.java @@ -0,0 +1,47 @@ +package com.tmerclub.cloud.common.constant; + + +/** + * 类型 1.商品 2.分类 3.店铺 4.页面 5.微页面 6.自定义链接 7.优惠券 + * @author track + */ +public enum JumpType { + /** + * 商品 + */ + SPU("1"), + /** + * 分类 + */ + CATEGORY("2"), + /** + * 店铺 + */ + SHOP("3"), + /** + * 页面 + */ + PAGE("4"), + /** + * 微页面 + */ + MINI_PAGE("5"), + /** + * 自定义链接 + */ + CUSTOM("6"), + /** + * 优惠券 + */ + COUPON("7"); + + private final String value; + + public String value() { + return value; + } + + JumpType(String value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/PayType.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/PayType.java new file mode 100644 index 0000000..a285e65 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/PayType.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.constant; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +public enum PayType { + /** + * 未支付 + */ + UNPAY(-1, "未支付", ""), + + /** + * 积分支付 + */ + SCOREPAY(0, "积分支付", ""), + + /** + * 微信小程序支付,通联为[微信小程序支付_集团(收银宝)] + */ + WECHATPAY(1, "微信小程序支付", "WECHATPAY_MINIPROGRAM_ORG"), + + /** + * 支付宝,电脑网站支付,通联为[支付宝扫码支付(正扫) _集团] + */ + ALIPAY(2, "支付宝", "SCAN_ALIPAY_ORG"), + + /** + * 微信扫码支付,通联为[微信扫码支付(正扫) _集团——收银宝] + */ + WECHATPAY_SWEEP_CODE(3, "微信扫码支付", "SCAN_WEIXIN_ORG"), + + /** + * 微信H5支付,通联在此处[收银宝H5收银台_集团] + */ + WECHATPAY_H5(4, "微信H5支付", "H5_CASHIER_VSP_ORG"), + + /** + * 微信公众号,通联为[微信JS支付(公众号)_集团——收银宝] + */ + WECHATPAY_MP(5, "微信公众号支付", "WECHAT_PUBLIC_ORG"), + + /** + * 支付宝H5支付,手机网站支付,通联为[收银宝H5收银台_集团] + */ + ALIPAY_H5(6, "支付宝H5支付", "H5_CASHIER_VSP_ORG"), + + /** + * 支付宝APP支付,通联为[收银宝支付宝APP支付_集团],通联此支付方式无法使用 + */ + ALIPAY_APP(7, "支付宝APP支付", "ALIPAY_APP_VSP_ORG"), + + /** + * 微信APP支付,通联为[微信原生APP支付] + */ + WECHATPAY_APP(8, "微信APP支付", "WECHATPAY_APP_OPEN"), + + /** + * 余额支付,通联为[账户余额] + */ + BALANCE(9, "余额支付", "BALANCE"), + + /** + * 商家余额支付 + */ + SHOP_BALANCE(10, "商家余额支付", "SHOP_BALANCE"), + + /** + * 平台余额支付 + */ + PLATFORM_BALANCE(11, "平台余额支付", "PLATFORM_BALANCE"); + + + private final Integer num; + + private final String payTypeName; + private final String allinpayCode; + + public Integer value() { + return num; + } + + public String getPayTypeName() { + return payTypeName; + } + + public String getAllinpayCode() { + return allinpayCode; + } + + public static final Integer[] WE_CHAT_PAY_ARRAY = {WECHATPAY.value(), WECHATPAY_APP.value(), WECHATPAY_H5.value(), WECHATPAY_MP.value(), WECHATPAY_SWEEP_CODE.value()}; + public static final Integer[] ALI_PAY_ARRAY = {ALIPAY.value(), ALIPAY_H5.value(), ALIPAY_APP.value()}; + + PayType(Integer num, String payTypeName, String allinpayCode) { + this.num = num; + this.payTypeName = payTypeName; + this.allinpayCode = allinpayCode; + } + + public static PayType instance(Integer value) { + PayType[] enums = values(); + for (PayType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static String getPayTypeName(Integer value) { + PayType[] enums = values(); + for (PayType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum.payTypeName; + } + } + return null; + } + + public static Boolean isWeChatPay(Integer value) { + return Objects.equals(value, WECHATPAY.value()) || Objects.equals(value, WECHATPAY_APP.value()) || + Objects.equals(value, WECHATPAY_H5.value()) || Objects.equals(value, WECHATPAY_MP.value()) || + Objects.equals(value, WECHATPAY_SWEEP_CODE.value()); + } + + public static Boolean isAliPay(Integer value) { + return Objects.equals(value, ALIPAY.value()) || Objects.equals(value, ALIPAY_H5.value()) || + Objects.equals(value, ALIPAY_APP.value()); + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/PicType.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/PicType.java new file mode 100644 index 0000000..8f00bb1 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/PicType.java @@ -0,0 +1,50 @@ +package com.tmerclub.cloud.common.constant; + +/** + * 影印件类型 + * + * @author lanhai + */ +public enum PicType { + + /** + * 营业执照 + */ + BUSINESS_LICENSE(1, "营业执照"), + + /** + * 身份证正面(人像面) + */ + FRONT_OF_ID_CARD(8, "身份证正面(人像面)"), + + /** + * 身份证反面(国徽面) + */ + REVERSE_SIDE_OF_ID_CARD(9, "身份证反面(国徽面)"); + + private final Integer code; + private final String str; + + public Integer getCode() { + return code; + } + + public String getStr() { + return str; + } + + PicType(Integer code, String str) { + this.code = code; + this.str = str; + } + + public static String getPicTypeName(Integer code) { + PicType[] enums = values(); + for (PicType statusEnum : enums) { + if (statusEnum.getCode().equals(code)) { + return statusEnum.getStr(); + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/RetainedDateType.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/RetainedDateType.java new file mode 100644 index 0000000..60e00af --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/RetainedDateType.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.constant; + +/** + * 时间类型 1最近1个月 2最近3个月 3最近6个月 4最近1年 + * + * @author cl + * @date 2021-05-31 11:01:18 + */ +public enum RetainedDateType { + + /** + * 最近1个月 + */ + ONE_MONTH(1, 1), + + /** + * 最近3个月 + */ + THREE_MONTH(2, 3), + + /** + * 最近6个月 + */ + SIX_MONTH(3, 6), + + /** + * 最近1年 + */ + ONE_YEAR(4, 12); + + private final Integer num; + private final Integer monthNum; + + public Integer value() { + return num; + } + + public Integer getMonthNum() { + return monthNum; + } + + RetainedDateType(Integer num, Integer monthNum) { + this.num = num; + this.monthNum = monthNum; + } + + public static RetainedDateType instance(Integer value) { + RetainedDateType[] enums = values(); + for (RetainedDateType typeEnum : enums) { + if (typeEnum.value().equals(value)) { + return typeEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SeckillOrderCacheConstant.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SeckillOrderCacheConstant.java new file mode 100644 index 0000000..c85d01f --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SeckillOrderCacheConstant.java @@ -0,0 +1,15 @@ +package com.tmerclub.cloud.common.constant; + +/** + * @author lhd + */ +public interface SeckillOrderCacheConstant { + /** + * 状态 + */ + String STATUS = "status:"; + /** + * 订单信息 + */ + String ORDER_INFO = "info:"; +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SendTypeEnum.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SendTypeEnum.java new file mode 100644 index 0000000..f4dcdb6 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SendTypeEnum.java @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.constant; + + +/** + * @author lhd + * @date 2020/12/30 + */ +public enum SendTypeEnum { + /** + * 自定义消息 + */ + CUSTOMIZE(0, 0, "自定义消息", null, null), + /** + * 订单催付 + */ + PRESS_PAY(1, 1, "订单催付", null, null), + + /** + * 付款成功通知 + */ + PAY_SUCCESS(2, 1, "付款成功通知", null, null), + + /** + * 商家同意退款 + */ + AGREE_REFUND(3, 1, "商家同意退款", null, null), + + /** + * 商家拒绝退款 + */ + REFUSE_REFUND(4, 1, "商家拒绝退款", null, null), + + /** + * 核销提醒 + */ + WRITE_OFF(5, 1, "核销提醒", null, null), + + /** + * 发货提醒 + */ + DELIVERY(6, 1, "发货提醒", null, null), + + /** + * 拼团失败提醒 + */ + GROUP_FAIL(7, 1, "拼团失败提醒", null, null), + + /** + * 拼团成功提醒 + */ + GROUP_SUCCESS(8, 1, "拼团成功提醒", null, null), + + /** + * 拼团开团提醒 + */ + GROUP_START(9, 1, "拼团开团提醒", null, null), + + /** + * 会员升级通知 + */ + MEMBER_LEVEL(10, 1, "会员升级通知", null, null), + + /** + * 退款临近超时提醒 + */ + REFUND_OUT_TIME(11, 1, "退款临近超时提醒", null, null), + /** + * 用户注册验证码 + */ + REGISTER(12, 1, "用户注册验证码", null, null), + /** + * 发送登录验证码 + */ + LOGIN(13, 1, "发送登录验证码", null, null), + /** + * 修改密码验证码 + */ + UPDATE_PASSWORD(14, 1, "修改密码验证码", null, null), + /** + * 身份验证验证码 + */ + VALID(15, 1, "身份验证验证码", null, null), + /** + * 分销员申请成功 + */ + DISTRIBUTION_APPLY_SUCCESS(16, 1, "分销员申请成功", null, null), + + /** + * 用户确认收货通知 + */ + RECEIPT_ORDER(102, 2, "商家端的用户确认收货通知", "订单", "用户确认收货后"), + + /** + * 买家发起退款提醒 + */ + LAUNCH_REFUND(103, 2, "商家端的买家发起退款提醒", "订单", "用户申请售后,需要商家处理"), + + /** + * 买家已退货提醒 + */ + RETURN_REFUND(104, 2, "商家端的买家已退货提醒", "订单", "买家已退货"), + + /** + * 用户支付成功,发送给卖家 + */ + USER_PAY_SUCCESS(105, 2, "商家端的待发货提醒", "订单", "用户支付成功后,需要发货"), + + /** + * 商品下架提醒 + */ + PRODUCT_OFFLINE(106, 2, "商家端的商品下架提醒", "商品", "平台下架商品后"), + + /** + * 商品审核结果提醒 + */ + PRODUCT_AUDIT(107, 2, "商家端的商品审核结果提醒", "商品", "平台审核商品后"), + + /** + * 代销商品变更提醒 + */ + COMMISSION_CHANGE(108, 2, "商家端的代销商品变更提醒", "商品", "供应商修改商品后"), + + + /** + * 待采购提醒 + */ + TO_PURCHASE(110, 2, "商家端的待采购提醒", "订单", "用户的实付金额低于供货价,这笔订单转成待采购订单时会给商家提醒"), + + + /** + * 营销活动下架 + */ + ACTIVITY_OFFLINE(112, 2, "商家端的营销活动下架", "营销", "平台下架营销活动后"), + + /** + * 活动审核结果提醒 + */ + ACTIVITY_AUDIT(113, 2, "商家端的活动审核结果提醒", "营销", "平台审核营销活动后"), + + + //供应商 + /** + * 用户确认收货通知 + */ + RECEIPT_ORDER_TO_SUPPLIER(1002, 3, "供应商端的用户确认收货通知", "订单", "用户确认收货后"), + + /** + * 买家发起退款提醒 + */ + LAUNCH_REFUND_TO_SUPPLIER(1003, 3, "供应商端的买家发起退款提醒", "订单", "用户申请售后,需要商家处理"), + + /** + * 买家已退货提醒 + */ + RETURN_REFUND_TO_SUPPLIER(1004, 3, "供应商端的买家已退货提醒", "订单", "买家已退货"), + + /** + * 用户支付成功,发送给卖家 + */ + USER_PAY_SUCCESS_TO_SUPPLIER(1005, 3, "供应商端的待发货提醒", "订单", "用户支付成功后,需要发货"), + + /** + * 商品下架提醒 + */ + PRODUCT_OFFLINE_TO_SUPPLIER(1006, 3, "供应商端的商品下架提醒", "商品", "平台下架商品后"), + + /** + * 商品审核结果提醒 + */ + PRODUCT_AUDIT_TO_SUPPLIER(1007, 3, "供应商端的商品审核结果提醒", "商品", "平台审核商品后"), + + + ; + + private final Integer value; + /** + * 0.自定义消息 1.为全部发送给用户消息,2.为发送给商家的 3.为发给供应商的 + */ + private final Integer type; + private final String desc; + private final String menu; + private final String nodeName; + + public Integer getType() { + return type; + } + + public Integer getValue() { + return value; + } + + public String getDesc() { + return desc; + } + + public String getMenu() { + return menu; + } + + public String getNodeName() { + return nodeName; + } + + SendTypeEnum(Integer value, Integer type, String desc, String menu, String nodeName) { + this.value = value; + this.type = type; + this.desc = desc; + this.menu = menu; + this.nodeName = nodeName; + } + + public static SendTypeEnum instance(Integer value) { + SendTypeEnum[] enums = values(); + for (SendTypeEnum statusEnum : enums) { + if (statusEnum.getValue().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/StatusEnum.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/StatusEnum.java new file mode 100644 index 0000000..0beab4d --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/StatusEnum.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.constant; + +import java.util.Objects; + +/** + * 状态 + * + * @author yxf + * @date 2020/11/20 + */ +public enum StatusEnum { + + /** + * 删除 (逻辑删除) + */ + DELETE(-1), + + /** + * 禁用/过期/下架/失效 + */ + DISABLE(0), + + /** + * 启用/未过期/上架/正常 + */ + ENABLE(1), + + /** + * 违规下架/未启用/未开始 + */ + OFFLINE(2), + + /** + * 等待审核 + */ + WAIT_AUDIT(3), + + /** + * 关闭 + */ + FINISHED(4); + + private final Integer value; + + public Integer value() { + return value; + } + + StatusEnum(Integer value) { + this.value = value; + } + + public static StatusEnum instance(Integer value) { + StatusEnum[] enums = values(); + for (StatusEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static Boolean offlineStatus(Integer value) { + StatusEnum[] enums = values(); + for (StatusEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return Boolean.TRUE; + } + } + return Boolean.FALSE; + } + + public static Boolean offlineOrDelete(Integer status) { + if (Objects.equals(status, OFFLINE.value) || Objects.equals(status, DELETE.value) || Objects.equals(status, DISABLE.value)) { + return Boolean.TRUE; + } + return Boolean.FALSE; + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/StorageTypeEnum.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/StorageTypeEnum.java new file mode 100644 index 0000000..21b4420 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/StorageTypeEnum.java @@ -0,0 +1,40 @@ +package com.tmerclub.cloud.common.constant; + +/** + * 存储服务类型 + * @author gaozijie + * @date 2023-11-01 + */ +public enum StorageTypeEnum { + + /** + * minIO + */ + MINIO(1), + /** + * 阿里云 + */ + OSS(2), + /** + * 腾讯云 + */ + COS(3), + /** + * 华为云 + */ + OBS(4), + /** + * 七牛云 + */ + KODO(5); + + private final int value; + + StorageTypeEnum(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/UserAdminType.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/UserAdminType.java new file mode 100644 index 0000000..03deb6d --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/UserAdminType.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.constant; + + +/** + * @author lhd + * @date 2020/12/30 + */ +public enum UserAdminType { + /** + * 管理员 + */ + ADMIN(1), + /** + * 用户 + */ + USER(0), + ; + + private final Integer value; + + public Integer value() { + return value; + } + + public Integer getValue() { + return value; + } + + + UserAdminType(Integer value) { + this.value = value; + } + + public static UserAdminType instance(Integer value) { + UserAdminType[] enums = values(); + for (UserAdminType statusEnum : enums) { + if (statusEnum.getValue().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/dto/BaseDTO.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/dto/BaseDTO.java new file mode 100644 index 0000000..2aacc05 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/dto/BaseDTO.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 阿里java开发手册: 【强制】表必备三字段:id, create_time, update_time。 说明:其中 id 必为主键,类型为 bigint + * unsigned、单表时自增、步长为 1。create_time, update_time 的类型均为 datetime + * 类型,前者现在时表示主动式创建,后者过去分词表示被动式更新。 + * + * @author FrozenWatermelon + */ +public class BaseDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 创建时间 + */ + @Schema(description = "创建时间") + protected Date createTime; + + /** + * 更新时间 + */ + @Schema(description = "更新时间") + protected Date updateTime; + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "BaseDTO{" + "createTime=" + createTime + ", updateTime=" + updateTime + '}'; + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/dubbo/DevProximityLoadBalance.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/dubbo/DevProximityLoadBalance.java new file mode 100644 index 0000000..48480ef --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/dubbo/DevProximityLoadBalance.java @@ -0,0 +1,43 @@ +package com.tmerclub.cloud.common.dubbo; + +import org.apache.dubbo.common.URL; +import org.apache.dubbo.rpc.Invocation; +import org.apache.dubbo.rpc.Invoker; +import org.apache.dubbo.rpc.cluster.loadbalance.RandomLoadBalance; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.List; + +/** + * 以下轮询算法仅在测试环境使用 + * 是本地有服务优先负债到本地服务的算法 + * @author LGH + */ +public class DevProximityLoadBalance extends RandomLoadBalance { + + private final String LOCALHOST; + + private static final String LOCAL_IP = "192.168.1."; + + public DevProximityLoadBalance() throws UnknownHostException { + InetAddress localHost = InetAddress.getLocalHost(); + LOCALHOST = localHost.getHostAddress(); + } + + @Override + protected Invoker doSelect(List> invokers, URL url, Invocation invocation) { + if (invokers.size()==1) { + return invokers.get(0); + } + if (!LOCALHOST.contains(LOCAL_IP)) { + return super.doSelect(invokers, url, invocation); + } + for (Invoker invoker : invokers) { + if (LOCALHOST.contains(invoker.getUrl().getHost())) { + return invoker; + } + } + return super.doSelect(invokers, url, invocation); + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/ExcelMergeHandler.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/ExcelMergeHandler.java new file mode 100644 index 0000000..8e7d839 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/ExcelMergeHandler.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.handler; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.handler.CellWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Objects; + +/** + * excel 单元格合并 + * @author YXF + */ +public class ExcelMergeHandler implements CellWriteHandler { + private int[] mergeColumnIndex; + private int mergeRowIndex; + private static final Logger log = LoggerFactory.getLogger(ExcelMergeHandler.class); + + public ExcelMergeHandler() { + } + + public ExcelMergeHandler(int mergeRowIndex, int[] mergeColumnIndex) { + this.mergeRowIndex = mergeRowIndex; + this.mergeColumnIndex = mergeColumnIndex; + } + + @Override + public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { + + } + + @Override + public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + + } + + @Override + public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, WriteCellData cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + + } + + @Override + public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + + //当前行 + int curRowIndex = cell.getRowIndex(); + //当前列 + int curColIndex = cell.getColumnIndex(); + + if (curRowIndex > mergeRowIndex) { + for (int columnIndex : mergeColumnIndex) { + if (curColIndex == columnIndex) { + mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex); + break; + } + } + } + } + + + /** + * 当前单元格向上合并 + * + * @param writeSheetHolder + * @param cell 当前单元格 + * @param curRowIndex 当前行 + * @param curColIndex 当前列 + */ + private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) { + Object curData = Objects.equals(cell.getCellType(), CellType.STRING) ? cell.getStringCellValue() : cell.getNumericCellValue(); + Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex); + Object preData = Objects.equals(preCell.getCellType(), CellType.STRING) ? preCell.getStringCellValue() : preCell.getNumericCellValue(); + // 将当前单元格数据与上一个单元格数据比较 + Boolean dataBool = preData.equals(curData); + //此处需要注意:因为我是按照订单号确定是否需要合并的,所以获取每一行第二列数据和上一行第一列数据进行比较,如果相等合并 + Boolean bool = cell.getRow().getCell(0).getStringCellValue().equals(cell.getSheet().getRow(curRowIndex - 1).getCell(0).getStringCellValue()); + if (dataBool && bool) { + Sheet sheet = writeSheetHolder.getSheet(); + List mergeRegions = sheet.getMergedRegions(); + boolean isMerged = false; + for (int i = 0; i < mergeRegions.size() && !isMerged; i++) { + CellRangeAddress cellRangeAddr = mergeRegions.get(i); + // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元 + if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) { + sheet.removeMergedRegion(i); + cellRangeAddr.setLastRow(curRowIndex); + sheet.addMergedRegion(cellRangeAddr); + isMerged = true; + } + } + // 若上一个单元格未被合并,则新增合并单元 + if (!isMerged) { + CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex); + sheet.addMergedRegion(cellRangeAddress); + } + } + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/HttpHandler.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/HttpHandler.java new file mode 100644 index 0000000..34e05f1 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/HttpHandler.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.handler; + +import cn.hutool.core.util.CharsetUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/7/16 + */ +@Component +public class HttpHandler { + + private static final Logger logger = LoggerFactory.getLogger(HttpHandler.class); + + @Autowired + private ObjectMapper objectMapper; + + public void printServerResponseToWeb(ServerResponseEntity serverResponseEntity) { + if (serverResponseEntity == null) { + logger.info("print obj is null"); + return; + } + + ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder + .getRequestAttributes(); + if (requestAttributes == null) { + logger.error("requestAttributes is null, can not print to web"); + return; + } + HttpServletResponse response = requestAttributes.getResponse(); + if (response == null) { + logger.error("httpServletResponse is null, can not print to web"); + return; + } + response.setCharacterEncoding(CharsetUtil.UTF_8); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + PrintWriter printWriter; + try { + printWriter = response.getWriter(); + printWriter.write(objectMapper.writeValueAsString(serverResponseEntity)); + } catch (IOException e) { + throw new LuckException("io 异常", e); + } + } + + public void printServerResponseToWeb(LuckException luckException) { + if (luckException == null) { + logger.info("print obj is null"); + return; + } + + if (Objects.nonNull(luckException.getServerResponseEntity())) { + printServerResponseToWeb(luckException.getServerResponseEntity()); + return; + } + + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setCode(luckException.getCode()); + serverResponseEntity.setMsg(luckException.getMessage()); + printServerResponseToWeb(serverResponseEntity); + } + + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/SensitiveHandler.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/SensitiveHandler.java new file mode 100644 index 0000000..850a8b5 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/SensitiveHandler.java @@ -0,0 +1,172 @@ +package com.tmerclub.cloud.common.handler; + +import cn.hutool.core.util.StrUtil; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.tmerclub.cloud.common.bean.SensitiveWord; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.dubbo.CoreConfigFeignClient; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * @author TRACK + */ +@SuppressWarnings("rawtypes") +@Component +public class SensitiveHandler { + + @DubboReference + private CoreConfigFeignClient configFeignClient; + + + /** + * 缓存 + */ + private static final Cache CONFIG_MAP = Caffeine.newBuilder() + // 数量上限 + .maximumSize(1) + // 过期机制 + .expireAfterWrite(5, TimeUnit.MINUTES).build(); + /** + * 最小匹配 + */ + public static final int MIN_MATCH_TYPE = 1; + private static final String IS_END = "isEnd"; + private static final String IS_ONE = "1"; + + + + public String replaceSensitiveWord(String txt, int matchType, String replaceChar) { + String resultTxt = txt; + Set sensitiveWordSet = this.getSensitiveWord(txt, matchType); + Iterator iterator = sensitiveWordSet.iterator(); + String word; + String replaceString; + while (iterator.hasNext()) { + word = iterator.next(); + replaceString = getReplaceChars(replaceChar, word.length()); + resultTxt = resultTxt.replaceAll(word, replaceString); + } + return resultTxt; + } + + + public Set getSensitiveWord(String txt, int matchType) { + Set sensitiveWordList = new HashSet<>(Constant.INITIAL_CAPACITY); + for (int i = 0; i < txt.length(); i++) { + int length = checkSensitiveWord(txt, i, matchType); + if (length > 0) { + sensitiveWordList.add(txt.substring(i, i + length)); + i = i + length - 1; + } + } + return sensitiveWordList; + } + + private String getReplaceChars(String replaceChar, int length) { + StringBuilder resultReplace = new StringBuilder(Constant.INITIAL_CAPACITY); + resultReplace.append(replaceChar); + for (int i = 1; i < length; i++) { + resultReplace.append(replaceChar); + } + return resultReplace.toString(); + } + + private int checkSensitiveWord(String txt, int beginIndex, int matchType) { + Map nowMap = getSensitiveWordMap(); + boolean flag = false; + char word; + int matchFlag = 0; + for (int i = beginIndex; i < txt.length(); i++) { + word = txt.charAt(i); + nowMap = (Map) nowMap.get(word); + if (Objects.isNull(nowMap)) { + break; + } + matchFlag++; + if (isEnd(nowMap)) { + flag = true; + if (Objects.equals(MIN_MATCH_TYPE, matchType)) { + break; + } + } + } + if (matchFlag <= 1 || !flag) { + matchFlag = 0; + } + return matchFlag; + } + + + private boolean isEnd(Map nowMap) { + return Objects.equals(nowMap.get(IS_END), IS_ONE); + } + + + @SuppressWarnings("unchecked") + private Map getSensitiveWordMap() { + Map finalMap = (Map) CONFIG_MAP.get(Constant.SENSITIVE_WORDS, cacheKey -> { + SensitiveWord sensitiveWord; + try { + ServerResponseEntity configResponse = configFeignClient.getConfig(Constant.SENSITIVE_WORDS); + if (!configResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + String value = configResponse.getData(); + sensitiveWord = Json.parseObject(value, SensitiveWord.class); + } catch (Exception e) { + return Collections.emptyMap(); + } + if (StrUtil.isBlank(sensitiveWord.getSensitiveWords())) { + return Collections.emptyMap(); + } + //根据中文逗号分隔 + List sensitiveWordsList = Arrays.asList(sensitiveWord.getSensitiveWords().split(Constant.CN_COMMA)); + Set sensitiveWordSet = new HashSet<>(sensitiveWordsList); + Iterator iterator = sensitiveWordSet.iterator(); + String key; + Map nowMap; + Map newWordMap; + Map sensitiveWordMap = new HashMap<>(sensitiveWordSet.size()); + while (iterator.hasNext()) { + //敏感词 + key = iterator.next(); + nowMap = sensitiveWordMap; + for (int i = 0; i < key.length(); i++) { + //敏 + char charAt = key.charAt(i); + Object wordMap = nowMap.get(charAt); + if (wordMap != null) { + //逐字加入map + nowMap = (Map) wordMap; + } else { + newWordMap = new HashMap<>(sensitiveWordSet.size()); + //最后一个字,加标记 + newWordMap.put("isEnd", "0"); + nowMap.put(charAt, newWordMap); + nowMap = newWordMap; + } + if (i == key.length() - 1) { + //结束 + nowMap.put("isEnd", "1"); + } + } + } + return sensitiveWordMap; + }); + + if (finalMap == null) { + CONFIG_MAP.invalidate(Constant.SENSITIVE_WORDS); + } + + return finalMap; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/I18nMessage.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/I18nMessage.java new file mode 100644 index 0000000..958af15 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/I18nMessage.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.i18n; + + +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.context.support.MessageSourceAccessor; +import org.springframework.context.support.ReloadableResourceBundleMessageSource; + +import java.io.IOException; +import java.util.Locale; + +/** + * 多语言国际化消息工具类 + * + * @author YXF + */ +public class I18nMessage { + private static final MessageSourceAccessor ACCESSOR; + +// private static final String BASE_FOLDE = "i18n"; + + private static final String BASE_NAME = "i18n/messages"; + + static { + ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource(); + reloadableResourceBundleMessageSource.setBasenames(BASE_NAME); + reloadableResourceBundleMessageSource.setCacheSeconds(5); + reloadableResourceBundleMessageSource.setDefaultEncoding("UTF-8"); + ACCESSOR = new MessageSourceAccessor(reloadableResourceBundleMessageSource); + } + + /** + * 获取一条语言配置信息 + * + * @param message 配置信息属性名,eg: api.response.code.user.signUp + * @return + */ + public static String getMessage(String message) { + Locale locale = LocaleContextHolder.getLocale(); + try { + return ACCESSOR.getMessage(message, locale); + } catch (Exception e) { + return message; + } + + } + + /** + * 获取一条语言配置信息(后台管理) + * + * @return + * @throws IOException + */ + public static Integer getLang() { +// Locale locale = LocaleContextHolder.getLocale(); +// return LanguageEnum.valueOf(locale).getLang(); + // 目前只有中文 + return LanguageEnum.LANGUAGE_ZH_CN.getLang(); + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/LanguageEnum.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/LanguageEnum.java new file mode 100644 index 0000000..e9f0eef --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/LanguageEnum.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.i18n; + +import cn.hutool.core.util.StrUtil; + +import java.util.Locale; +import java.util.Objects; + +/** + * 国际化 语言枚举类 + * + * @author FrozenWatermelon + */ +public enum LanguageEnum { + + /** + * 简体中文 + */ + LANGUAGE_ZH_CN("zh", 1), + /** + * 英文 + */ + LANGUAGE_EN("en", 2); + + private final String language; + + private final Integer lang; + + LanguageEnum(String language, Integer lang) { + this.language = language; + this.lang = lang; + } + + public String getLanguage() { + return language; + } + + public Integer getLang() { + return lang; + } + + /** + * 获取指定语言类型(如果没有对应的语言类型,则返回中文) + * + * @param language 语言类型 + * @return + */ + public static String getLanguageType(String language) { + if (StrUtil.isEmpty(language)) { + return LANGUAGE_ZH_CN.language; + } + for (LanguageEnum languageEnum : values()) { + if (languageEnum.language.equalsIgnoreCase(language)) { + return languageEnum.language; + } + } + return LANGUAGE_ZH_CN.language; + } + + + public static LanguageEnum valueOf(int lang) { + for (LanguageEnum languageEnum : values()) { + if (languageEnum.lang == lang) { + return languageEnum; + } + } + return LANGUAGE_ZH_CN; + } + + public static LanguageEnum valueOf(Locale locale) { + for (LanguageEnum languageEnum : values()) { + if (Objects.equals(languageEnum.language, locale.toString())) { + return languageEnum; + } + } + return LANGUAGE_ZH_CN; + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/LuckLocaleChangeFilter.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/LuckLocaleChangeFilter.java new file mode 100644 index 0000000..efd3b85 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/LuckLocaleChangeFilter.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.i18n; + + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.Locale; + +/** + * RequestContextFilter 会传入默认的Locale,优先级(-105) 要比RequestContextFilter优先级高 + * @author FrozenWatermelon + */ +@Component +@Order(-104) +public class LuckLocaleChangeFilter implements Filter { + private static final Logger logger = LoggerFactory.getLogger(LuckLocaleChangeFilter.class); + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + + // 设置国际化语言 + String newLocale = request.getHeader("locale"); + // 目前只有中文 + LocaleContextHolder.setLocale(new Locale(LanguageEnum.LANGUAGE_ZH_CN.getLanguage())); +// LocaleContextHolder.setLocale(getLocal(newLocale)); + filterChain.doFilter(request, response); + } + + private static Locale getLocal(String langStr) { + if (langStr == null) { + return getDefaultLocal(); + } + + if (!StrUtil.contains(langStr, Constant.UNDERLINE)) { + return new Locale(langStr); + } + String[] s = langStr.split(Constant.UNDERLINE); + if (s.length > 1) { + return new Locale(s[0], s[1]); + } + // 数组长度不够代表前端传的语言编码格式有问题,但这里不能报错,所以要判断下长度>1,否则一旦格式出现问题,所有接口都无法使用 + // 改为使用默认语言 + return getDefaultLocal(); + } + + + private static Locale getDefaultLocal() { + String langStr = LanguageEnum.LANGUAGE_ZH_CN.getLanguage(); + return new Locale(langStr); + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/LuckLocaleChangeInterceptor.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/LuckLocaleChangeInterceptor.java new file mode 100644 index 0000000..a2ad993 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/i18n/LuckLocaleChangeInterceptor.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.i18n; + + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; +import org.springframework.web.servlet.support.RequestContextUtils; + +/** + * @author FrozenWatermelon + */ +@SuppressWarnings("NullableProblems") +@Component("localeChangeInterceptor") +public class LuckLocaleChangeInterceptor extends LocaleChangeInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + + String newLocale = request.getHeader(getParamName()); + if (newLocale != null) { + LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request); + if (localeResolver == null) { + throw new IllegalStateException( + "No LocaleResolver found: not in a DispatcherServlet request?"); + } + try { + localeResolver.setLocale(request, response, parseLocaleValue(newLocale)); + } catch (IllegalArgumentException ex) { + if (isIgnoreInvalidLocale()) { + if (logger.isDebugEnabled()) { +// logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage()); + } + } else { + throw ex; + } + } + } + // Proceed in any case. + return true; + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/AnalysisUtil.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/AnalysisUtil.java new file mode 100644 index 0000000..576b904 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/AnalysisUtil.java @@ -0,0 +1,184 @@ +package com.tmerclub.cloud.common.util; + +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.RetainedDateType; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @author TRACK + */ +public class AnalysisUtil { + + public static final double LOW_RATE = -100.0; + + private AnalysisUtil() { + } + + public static Double handleLong(Long value) { + if (Objects.isNull(value)) { + return 0.00; + } + return PriceUtil.toDecimalPrice(value).doubleValue(); + } + + public static Double getDouble(Double value) { + if (Objects.isNull(value)) { + return 0.0; + } + return value; + } + + + public static Double handleDouble(Double value) { + if (Objects.isNull(value)) { + return 0.00; + } + return value; + } + + public static Double divAverage(Integer a, Integer h, Integer scale) { + if (Objects.isNull(h) || 0 == h || Objects.isNull(a)) { + return 0.0; + } + return Arith.div(a, h, scale); + } + + public static Double divAverage(Double a, Integer h, Integer scale) { + if (Objects.isNull(h) || 0 == h || Objects.isNull(a)) { + return 0.0; + } + return Arith.div(a, h, scale); + } + + public static Double divAverage(Double a, Double h, Integer scale) { + if (Objects.isNull(h) || 0 == h || Objects.isNull(a)) { + return 0.0; + } + return Arith.div(a, h, scale); + } + + + public static Double setRate(Double newNum, Double oldNum) { + if (newNum.equals(0.0) && oldNum.equals(0.0)) { + return 0.0; + } else if (0.0 < newNum && oldNum.equals(0.0)) { + return 0.0; + } else if (newNum.equals(0.0) && 0.0 < oldNum) { + return LOW_RATE; + } + double sub = Arith.sub(newNum, oldNum); + return Arith.mul(Arith.div(sub, oldNum, 2), 100); + } + + /** + * @param a dividend + * @param h divisor + * @return 向上取整 + */ + public static int ceil(int a, int h) { + if (0 == a || 0 == h) { + return 0; + } + BigDecimal dividend = new BigDecimal(Integer.toString(a)); + BigDecimal divisor = new BigDecimal(Integer.toString(h)); + BigDecimal divide = dividend.divide(divisor, 0, RoundingMode.UP); + return divide.intValue(); + } + + /** + * 计算百分比 + * + * @param a 被除数 + * @param sub 除数 + * @return 放大倍数后的数值 + */ + public static BigDecimal calculatePercentage(Integer a, Integer sub) { + // 保留小数位默认为2, 放大倍数默认为100 + return calculatePercentage(a, sub, 2, 100); + } + + /** + * 计算百分比 + * + * @param a 被除数 + * @param sub 除数 + * @param scale 保留小数位 + * @param percentage 放大倍数 + * @return 放大倍数后的数值 + */ + public static BigDecimal calculatePercentage(Integer a, Integer sub, int scale, Integer percentage) { + + boolean isCalculate = Objects.isNull(a) || Objects.isNull(sub) || Objects.isNull(percentage) || + a.compareTo(0) == 0 || sub < 0 || percentage.compareTo(0) == 0; + if (isCalculate) { + return new BigDecimal("0"); + } + BigDecimal bigDecimal = new BigDecimal(a.toString()); + BigDecimal divisor = new BigDecimal(sub.toString()); + BigDecimal multiplicand = new BigDecimal(percentage.toString()); + return bigDecimal.multiply(multiplicand).divide(divisor, scale, RoundingMode.HALF_UP); + } + + /** + * 获取时间范围内的所有时间 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return yyyy-MM 的时间字符串列表 + */ + public static List getRangeDate(Date startTime, Date endTime) { + List dateTimes = DateUtil.rangeToList(DateUtil.beginOfMonth(startTime), endTime, DateField.MONTH); + List list = new ArrayList<>(1); + for (DateTime dateTime : dateTimes) { + list.add(DateUtil.format(dateTime, "yyyy-MM")); + } + // 控制月在最近 3 、6、 12个月 + int size = list.size(); + boolean isReduce = size == RetainedDateType.THREE_MONTH.getMonthNum() + 1 || + size == RetainedDateType.SIX_MONTH.getMonthNum() + 1 || + size == RetainedDateType.ONE_YEAR.getMonthNum() + 1; + if (isReduce) { + list.remove(list.get(0)); + } + return list; + } + + /** + * 金额Long格式转换Double + * @param num + * @return 金额字符串 + */ + public static String conversionPrices(String num) { + if (StrUtil.isBlank(num)) { + return num; + } + BigDecimal b1 = new BigDecimal(num); + BigDecimal b2 = new BigDecimal(Constant.PRICE_MAGNIFICATION); + double price = b1.divide(b2, 2, RoundingMode.HALF_UP).doubleValue(); + return Double.toString(price); + } + + public static Double getDefault(Double value) { + if (Objects.nonNull(value)) { + return value; + } + return 0.0D; + } + + public static Integer getDefault(Integer value) { + if (Objects.nonNull(value)) { + return value; + } + return Constant.ZERO_INTEGER; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/Arith.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/Arith.java new file mode 100644 index 0000000..9249bf2 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/Arith.java @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.util; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * @author FrozenWatermelon + */ +public class Arith { + /** + * 默认除法运算精度 + */ + private static final int DEF_DIV_SCALE = 10; + + /** + * 这个类不能实例化 + */ + private Arith() { + } + + /** + * 提供精确的加法运算。. + * + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static double add(double v1, double v2) { + // 必须转换成String + String s1 = Double.toString(v1); + String s2 = Double.toString(v2); + BigDecimal b1 = new BigDecimal(s1); + BigDecimal b2 = new BigDecimal(s2); + return b1.add(b2).doubleValue(); + } + + /** + * 提供精确的减法运算。. + * + * @param v1 被减数 + * @param v2 减数 + * @return 两个参数的差 + */ + public static double sub(double v1, double v2) { + // 必须转换成String + String s1 = Double.toString(v1); + String s2 = Double.toString(v2); + BigDecimal b1 = new BigDecimal(s1); + BigDecimal b2 = new BigDecimal(s2); + return b1.subtract(b2).doubleValue(); + } + + /** + * 提供精确的乘法运算。. + * + * @param v1 被乘数 + * @param v2 乘数 + * @return 两个参数的积 + */ + public static double mul(double v1, double v2) { + // 必须转换成String + String s1 = Double.toString(v1); + String s2 = Double.toString(v2); + BigDecimal b1 = new BigDecimal(s1); + BigDecimal b2 = new BigDecimal(s2); + return b1.multiply(b2).doubleValue(); + } + + /** + * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。. + * + * @param v1 被除数 + * @param v2 除数 + * @return 两个参数的商 + */ + public static double div(double v1, double v2) { + if (v2 == 0) { + return 0.0; + } + return div(v1, v2, DEF_DIV_SCALE); + } + + /** + * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。. + * + * @param v1 被除数 + * @param v2 除数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的商 + */ + public static double div(double v1, double v2, int scale) { + if (scale < 0) { + throw new IllegalArgumentException("The scale must be a positive integer or zero"); + } + if (v2 == 0) { + return 0.0; + } + // 必须转换成String + String s1 = Double.toString(v1); + String s2 = Double.toString(v2); + BigDecimal b1 = new BigDecimal(s1); + BigDecimal b2 = new BigDecimal(s2); + return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); + } + + /** + * 提供精确的小数位四舍五入处理。. + * + * @param v 需要四舍五入的数字 + * @param scale 小数点后保留几位 + * @return 四舍五入后的结果 + */ + public static double round(double v, int scale) { + if (scale < 0) { + throw new IllegalArgumentException("The scale must be a positive integer or zero"); + } + String s1 = Double.toString(v); + BigDecimal b = new BigDecimal(s1); + BigDecimal one = new BigDecimal("1"); + return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue(); + } + + + /** + * @param bigDecimal + * @param bigDecimal2 + * @param bigDecimal3 + * @return + */ + public static double add(BigDecimal bigDecimal, BigDecimal bigDecimal2, BigDecimal bigDecimal3) { + return bigDecimal.add(bigDecimal2).add(bigDecimal3).doubleValue(); + } + + /** + * @param preDepositPrice + * @param finalPrice + * @return + */ + public static double add(BigDecimal preDepositPrice, BigDecimal finalPrice) { + return preDepositPrice.add(finalPrice).doubleValue(); + } + + /** + * 两个浮点数比较是否相等 + * + * @param v1 + * @param v2 + * @return + */ + public static boolean isEquals(double v1, double v2) { + // 必须转换成String + String s1 = Double.toString(v1); + String s2 = Double.toString(v2); + BigDecimal b1 = new BigDecimal(s1); + BigDecimal b2 = new BigDecimal(s2); + return b1.compareTo(b2) == 0; + } + + public static int divToRoundUp(int a, int sub) { + return new BigDecimal(a).divide(new BigDecimal(sub), 0, RoundingMode.UP).intValue(); + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/BeanUtil.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/BeanUtil.java new file mode 100644 index 0000000..6408aea --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/BeanUtil.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.util; + + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; + +import java.util.List; + +/** + * @author lanhai + */ +public class BeanUtil { + public static List mapAsList(final Iterable sourceObject, Class clazz) { + return JSONArray.parseArray(JSONArray.toJSONString(sourceObject), clazz); + } + public static D map(final S sourceObject, Class clazz) { + return JSONObject.parseObject(JSONObject.toJSONString(sourceObject), clazz); + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/CharUtil.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/CharUtil.java new file mode 100644 index 0000000..ad2ffc2 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/CharUtil.java @@ -0,0 +1,29 @@ +package com.tmerclub.cloud.common.util; + +/** + * 获取带有中文字符的长度 + * + * @author yami + */ +public class CharUtil { + /** + * 得到一个字符串的长度,显示的长度,一个汉字或日韩文长度为2,英文字符长度为1 + * + * @param s 需要得到长度的字符串 + * @return int 得到的字符串长度 + */ + public static int length(String s) { + if (s == null) { + return 0; + } + int len = 0; + for (char item : s.toCharArray()) { + len++; + if (item / 0x80 == 0) { + continue; + } + len++; + } + return len; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/ExcelUtil.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/ExcelUtil.java new file mode 100644 index 0000000..b55640f --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/ExcelUtil.java @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.handler.RowWriteHandler; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import com.tmerclub.cloud.common.handler.ExcelMergeHandler; +import com.tmerclub.cloud.common.handler.SheetWrite; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URLEncoder; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 使用说明: + * 导出: + * 1.第一列是作为合并单元格的判断字段, 所以一定要为具有唯一标识的字符串 + * 2.列的宽度是自适应的,不需要额外定义 + * 3.WebConfig 类中的 supportedMediaTypes.add(MediaType.ALL) 不要去掉,虽然不影响使用,但是会报 + * No converter for [class com.tmerclub.cloud.common.response.ServerResponseEntity] with preset Content-Type 'application/vnd.ms-excel;charset=utf-8 + *

+ * 导入: + * + * @author YXF + * @date 2021/3/9 + */ +@SuppressWarnings("rawtypes") +public class ExcelUtil { + + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + private static final String SHEET_NAME = "sheet"; + + /** + * 导出方法,导出包含字段 + * + * @param response + * @param excelName excel文件名 + * @param mergeRowIndex 从哪一行开始填充数据 + * @param mergeColumnIndex 需要合并的列 + * @return + * @throws Exception + */ + public static ExcelWriterBuilder getExcelWriterMerge(HttpServletResponse response, String excelName, int mergeRowIndex, int[] mergeColumnIndex, + Set includeColumnFieldNames, Class clazz) throws Exception { + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + // 这里URLEncoder.encode可以防止中文乱码 + excelName = URLEncoder.encode(excelName, "UTF-8"); + response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue()); + + return EasyExcel.write(response.getOutputStream(), clazz) + // 指定字段导出 + .includeColumnFieldNames(includeColumnFieldNames) + // 自定义合并规则 + .registerWriteHandler(new ExcelMergeHandler(mergeRowIndex, mergeColumnIndex)) + // 宽度自适应 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()); + } + + /** + * 导出方法 + * + * @param response + * @param excelName excel文件名 + * @param mergeRowIndex 从哪一行开始填充数据 + * @param mergeColumnIndex 需要合并的列 + * @return + * @throws Exception + */ + public static ExcelWriterBuilder getExcelWriterMerge(HttpServletResponse response, String excelName, int mergeRowIndex, int[] mergeColumnIndex) throws Exception { + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + // 这里URLEncoder.encode可以防止中文乱码 + excelName = URLEncoder.encode(excelName, "UTF-8"); + response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue()); + + return EasyExcel.write(response.getOutputStream()) + // 自定义合并规则 + .registerWriteHandler(new ExcelMergeHandler(mergeRowIndex, mergeColumnIndex)) + // 宽度自适应 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()); + } + + /** + * 导出模板 + * + * @param excelWriterBuilder + * @param map 自定义下拉框 key:列的索引 value:下拉框中多选值的数组 + * @return + */ + public static ExcelWriterBuilder getExcelModel(ExcelWriterBuilder excelWriterBuilder, Map map, Integer firstRow) { + if (MapUtil.isEmpty(map)) { + return excelWriterBuilder; + } + SheetWrite sheetWrite = new SheetWrite(map, firstRow); + excelWriterBuilder.registerWriteHandler(sheetWrite); + return excelWriterBuilder; + } + + + /** + * 通用导出方法 + * + * @param response + * @param list 导出的数据列表 + * @param excelName excel文件名 + * @param mergeRowIndex 从哪一行开始填充数据 + * @param mergeColumnIndex 需要合并的列 + * @param clazz excel对象 + */ + public static void soleExcel(HttpServletResponse response, List list, String excelName, int mergeRowIndex, int[] mergeColumnIndex, Class clazz) { + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + excelWriter = getExcelWriterMerge(response, excelName, mergeRowIndex, mergeColumnIndex).build(); + // 业务代码 + if (CollUtil.isNotEmpty(list)) { + // 进行写入操作 + WriteSheet sheetWriter = EasyExcel.writerSheet(SHEET_NAME).head(clazz).build(); + excelWriter.write(list, sheetWriter); + } + } catch (Exception e) { + log.error("导出excel失败", e); + } finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + /** + * excel导出(携带处理器) + */ + public static void soleExcelWithHandler(HttpServletResponse response, + List list, + String excelName, + int mergeRowIndex, + int[] mergeColumnIndex, + RowWriteHandler rowWriteHandler, + Class clazz) { + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + excelWriter = getExcelWriterMerge(response, excelName, mergeRowIndex, mergeColumnIndex).build(); + // 业务代码 + if (CollUtil.isNotEmpty(list)) { + // 进行写入操作 + WriteSheet sheetWriter = EasyExcel.writerSheet(SHEET_NAME).head(clazz) + .registerWriteHandler(rowWriteHandler).build(); + excelWriter.write(list, sheetWriter); + } + } catch (Exception e) { + log.error("导出excel失败", e); + } finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + /** + * 指定列导出方法 + * + * @param response + * @param list 导出的数据列表 + * @param excelName excel文件名 + * @param mergeRowIndex 从哪一行开始填充数据 + * @param mergeColumnIndex 需要合并的列 + * @param includeColumnFieldNames 指定需要导出的列名 + * @param clazz excel对象 + */ + public static void soleExcel(HttpServletResponse response, List list, String excelName, int mergeRowIndex, int[] mergeColumnIndex, Set includeColumnFieldNames, Class clazz) { + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + excelWriter = getExcelWriterMerge(response, excelName, mergeRowIndex, mergeColumnIndex, includeColumnFieldNames, clazz).build(); + // 业务代码 + if (CollUtil.isNotEmpty(list)) { + // 进行写入操作 + WriteSheet sheetWriter = EasyExcel.writerSheet(SHEET_NAME).head(clazz).build(); + excelWriter.write(list, sheetWriter); + } + } catch (Exception e) { + log.error("导出excel失败", e); + } finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + } + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/IpHelper.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/IpHelper.java new file mode 100644 index 0000000..575efd4 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/IpHelper.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.util; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * IP帮助工具 + * + * @author FrozenWatermelon + */ +public class IpHelper { + private static final String UNKNOWN = "unknown"; + + + /** + * 得到用户的真实地址,如果有多个就取第一个 + * + * @return + */ + public static String getIpAddr() { + if (RequestContextHolder.getRequestAttributes() == null) { + return ""; + } + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + String[] ips = ip.split(Constant.COMMA); + return ips[0].trim(); + } + + public static long getIpNumber() { + String ipAddress = getIpAddr(); + return ipToLong(ipAddress); + } + public static long ipToLong(String ipAddress) { + long result = 0; + if (StrUtil.isBlank(ipAddress)) { + return result; + } + String[] ipAddressInArray = ipAddress.split("\\."); + for (int i = Constant.THREE; i >= 0; i--) { + long ip = Long.parseLong(ipAddressInArray[3 - i]); + result |= ip << (i * 8); + + } + return result; + } + + public static String longToIp(long ip) { + if (ip == 0) { + return ""; + } + return ((ip >> 24) & 0xFF) + "." + + ((ip >> 16) & 0xFF) + "." + + ((ip >> 8) & 0xFF) + "." + + (ip & 0xFF); + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/LangUtil.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/LangUtil.java new file mode 100644 index 0000000..ace624c --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/LangUtil.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.util; + + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; + +import java.util.Map; +import java.util.Objects; + +/** + * 语言工具类 + * + * @author YXF + * @date 2021/05/14 + */ +public class LangUtil { + + /** + * 获取语言对应的值 + * + * @param langMap + * @return + */ + public static String getLangValue(Map langMap) { + Integer lang = I18nMessage.getLang(); + if (Objects.isNull(lang)) { + lang = LanguageEnum.LANGUAGE_ZH_CN.getLang(); + } + if (Objects.nonNull(langMap.get(lang))) { + return langMap.get(lang); + } + return langMap.get(Constant.DEFAULT_LANG); + } + + /** + * 获取语言对应的值 + * + * @param langMap + * @param lang + * @return + */ + public static String getLangValue(Map langMap, Integer lang) { + if (Objects.nonNull(langMap.get(lang))) { + return langMap.get(lang); + } + return langMap.get(Constant.DEFAULT_LANG); + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/MapUtil.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/MapUtil.java new file mode 100644 index 0000000..be69cde --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/MapUtil.java @@ -0,0 +1,78 @@ +package com.tmerclub.cloud.common.util; + +import jakarta.websocket.Session; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author TRACK + */ +public class MapUtil { + + /** + * map中是否存在key + * @param map + * @param keyPrefix key前缀 + * @return + */ + public static Boolean isExistKeyPrefix(ConcurrentHashMap map, String keyPrefix) { + for (String key : map.keySet()) { + if (key.startsWith(keyPrefix)) { + return true; + } + } + return false; + } + + /** + * map中含有key前缀的会话列表集合 + * @param map + * @param keyPrefix key前缀 + * @return + */ + public static List getSessionByKeyPrefix(ConcurrentHashMap map, String keyPrefix) { + List sessionList = new ArrayList<>(); + for (String key : map.keySet()) { + if (key.startsWith(keyPrefix)) { + sessionList.add(map.get(key)); + } + } + return sessionList; + } + + /** + * map中含有key前缀的key列表集合 + * @param map + * @param keyPrefix key前缀 + * @return + */ + public static List getKeysByKeyPrefix(ConcurrentHashMap map, String keyPrefix) { + List keys = new ArrayList<>(); + for (String key : map.keySet()) { + if (key.startsWith(keyPrefix)) { + keys.add(key); + } + } + return keys; + } + + /** + * map中含有keyPrefix并且不包括key的集合 + * @param map + * @param keyPrefix key前缀 + * @param excludeKey 排除该key + * @return + */ + public static List getKeysByPrefixAndExcludeKey(ConcurrentHashMap map, String keyPrefix, String excludeKey) { + List keys = new ArrayList<>(); + for (String key : map.keySet()) { + if (key.startsWith(keyPrefix) && !Objects.equals(excludeKey, key)) { + keys.add(key); + } + } + return keys; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/PriceUtil.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/PriceUtil.java new file mode 100644 index 0000000..ad49b7f --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/PriceUtil.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.util; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/11/16 + */ +public class PriceUtil { + + /** + * 元和分相差100 + */ + public static final String ONE_HUNDRED = "100"; + + /** + * 元和分相差100 + * 因为分为long类型,: Long.MAX_VALUE = 263-1 + * 所以元的最大值(或阈值)为: MAX_AMOUNT = Long.MAX_VALUE/100 + * Long.MAX_VALUE : 9223372036854775807 + * Long.MAX_VALUE/100 : 92233720368547758 + */ + public static final long MAX_AMOUNT = 92233720368547758L; + public static final String MAX_AMOUNT_STR = "92233720368547758"; + + /** + * 分的最大值 为 MAX_AMOUNT * 100 + */ + public static final long MAX_CENT = 9223372036854775800L; + + + /** + * 分转元 + * + * @param price 分 + * @return 元 + */ + public static BigDecimal toDecimalPrice(Long price) { + if (Objects.isNull(price)) { + return new BigDecimal(0); + } + BigDecimal priceDecimal = new BigDecimal(price.toString()); + // 除以100 + return priceDecimal.divide(new BigDecimal(ONE_HUNDRED), 2, RoundingMode.HALF_EVEN); + } + + + /** + * 分转元 + * + * @param price 分 + * @return 元 + */ + public static Double toDoublePrice(Long price) { + return toDecimalPrice(price).doubleValue(); + } + + + /** + * 分转元 + * + * @param price 分 + * @return 元 + */ + public static String toDecimalPriceStr(Long price) { + return String.valueOf(toDecimalPrice(price)); + } + + /** + * 元转分 + * + * @param price 元 + * @return 分 + */ + public static Long toLongCent(BigDecimal price) { + // 乘以100 + return price.multiply(new BigDecimal(ONE_HUNDRED)).longValue(); + } + + /** + * 相除,用银行家舍入法 + * + * @param a1 除数 + * @param a2 被除数 + * @return 分 + */ + public static Long divideByBankerRounding(long a1, long a2) { + if (a2 == 0L) { + return 0L; + } + return new BigDecimal(a1).divide(new BigDecimal(a2), 0, RoundingMode.HALF_EVEN).longValue(); + } + + /** + * 相除,用银行家舍入法 + * + * @param a1 除数 + * @param a2 被除数 + * @return 分 + */ + public static Long doublerDivideByBankerRounding(double a1, long a2) { + if (a2 == 0L) { + return 0L; + } + return new BigDecimal(a1).divide(new BigDecimal(a2), 0, RoundingMode.HALF_EVEN).longValue(); + } + + /** + * 相除保留两位小数再乘以100,用银行家舍入法 + * + * @param a1 除数 + * @param a2 被除数 + * @param isLess 是否需要乘以100 + * @return 分 + */ + public static Long divideByBankerRoundingThan(long a1, long a2, boolean isLess) { + BigDecimal bigDecimal = new BigDecimal(a1).divide(new BigDecimal(a2), 0, RoundingMode.HALF_EVEN); + if (isLess) { + return bigDecimal.multiply(new BigDecimal(100)).longValue(); + } + return bigDecimal.longValue(); + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/PrincipalUtil.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/PrincipalUtil.java new file mode 100644 index 0000000..8d0e103 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/PrincipalUtil.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.util; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import org.springframework.util.AntPathMatcher; + +import java.util.regex.Pattern; + +/** + * 正则表达式工具 + * + * @author FrozenWatermelon + */ +public class PrincipalUtil { + + /** + * 以1开头,后面跟10位数 + */ + public static final String MOBILE_REGEXP = "1[0-9]{10}"; + + /** + * 带有星号的手机号码 + */ + public static final String MOBILE_REGEXP_WITH_ASTERISK = "^1[0-9]{2}([[0-9]*]{4})[0-9]{4}$"; + + /** + * 1. 用户名不能为纯数字 2. 由数字字母下划线 4-16位组成 + */ + public static final String USER_NAME_REGEXP = "(?!\\d+$)([a-zA-Z0-9_]{4,16})"; + + /** + * 字段名,数字字母下划线 + */ + public static final String FIELD_REGEXP = "([a-zA-Z0-9_]+)"; + + /** + * 由简单的字母数字拼接而成的字符串 不含有下划线,大写字母 + */ + public static final String SIMPLE_CHAR_REGEXP = "([a-z0-9]+)"; + + /** + * 邮箱正则 + */ + public static final String EMAIL_REGEXP = "[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?"; + + /** + * http协议正则 + */ + public static final String HTTP_PROTOCOL_REGEXP = "^((http[s]{0,1})://)"; + + /** + * 不等于0,只能输入数字,最多两位小数 + */ + public static final String UP_TO_TWO_DECIMAL = "^(-)?[1-9]\\d*$|^(-)?[1-9]\\d*\\.\\d\\d?$|^(-)?0\\.\\d\\d?$"; + + /** + * 只能输入数字字母 + */ + public static final String WITHOUT_CHINESE = "^[A-Za-z0-9]+$"; + + /** + * 是否是手机号 + * + * @param value 输入值 + * @return 匹配结果 + */ + public static boolean isMobile(String value) { + return isMatching(MOBILE_REGEXP, value); + } + + public static boolean isAsteriskMobile(String value) { + if(StrUtil.isBlank(value)) { + return false; + } + return Pattern.matches(MOBILE_REGEXP_WITH_ASTERISK, value); + } + + /** + * 是否是用户名 + * + * @param value 输入值 + * @return 匹配结果 + */ + public static boolean isUserName(String value) { + return isMatching(USER_NAME_REGEXP, value); + } + + /** + * 是否符合字段规则 + * + * @param value 输入值 + * @return 匹配结果 + */ + public static boolean isField(String value) { + return !isMatching(FIELD_REGEXP, value); + } + + /** + * 是否是邮箱 + * + * @param value 输入值 + * @return 匹配结果 + */ + public static boolean isEmail(String value) { + return isMatching(EMAIL_REGEXP, value); + } + + /** + * 是否是由简单的字母数字拼接而成的字符串 + * + * @param value 输入值 + * @return 匹配结果 + */ + public static boolean isSimpleChar(String value) { + return isMatching(SIMPLE_CHAR_REGEXP, value); + } + + /** + * 是否是 最多是保留两位小数的数值 + * + * @param value 输入值 + * @return 匹配结果 + */ + public static boolean isMaximumOfTwoDecimal(String value) { + return isMatching(UP_TO_TWO_DECIMAL, value); + } + + /** + * 是否是HTTP协议 + * + * @param value 输入值 + * @return 匹配结果 + */ + public static boolean isHttpProtocol(String value) { + return isFind(HTTP_PROTOCOL_REGEXP, value); + } + + public static boolean isMatching(String regexp, String value) { + if (StrUtil.isBlank(value)) { + return false; + } + return Pattern.matches(regexp, value); + } + + public static boolean isFind(String regexp, String value) { + if (StrUtil.isBlank(value)) { + return false; + } + Pattern pattern = Pattern.compile(regexp); + return pattern.matcher(value).find(); + } + + /** + * 是否符合原数据库手机号码 + * @param phone 传入的手机号码 + * @param dbPhone 数据库存储的手机号码 + * @param canNull 手机号是否能为空 + * @return 匹配结果 + */ + public static boolean isDbPhone(String phone, String dbPhone, Boolean canNull) { + if (StrUtil.isBlank(phone) || StrUtil.isBlank(dbPhone)) { + return canNull; + } + if (!phone.contains(Constant.ASTERISK)) { + // 不含星号默认修改成功 + return true; + } + // 最多的星号数量 + int limit = 4; + AntPathMatcher pathMatcher = new AntPathMatcher(); + if (((phone.length() - phone.replace(Constant.ASTERISK, "").length()) <= limit) + && pathMatcher.match(phone, dbPhone)) { + return true; + } + return false; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/vo/ShopSubstituteSalesVO.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/vo/ShopSubstituteSalesVO.java new file mode 100644 index 0000000..4de079a --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/vo/ShopSubstituteSalesVO.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 代销设置表VO + * + * @author lhd + * @date 2022-06-22 17:09:12 + */ +public class ShopSubstituteSalesVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "代销设置id") + private Long shopSubstituteSalesId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "代销设置类型 0.智能设价 1.手动设价") + private Integer salesType; + + @Schema(description = "默认加价比例 0.按比例加价 1.按固定数值加价") + private Integer salesPriceType; + + @Schema(description = "采购价大于商家收入金额时,0.直接转换为待采购订单(默认选中),1.通过商家已结算金额扣除差价") + private Integer orderShape; + + @Schema(description = "默认加价比例为0时,代表百分比*100,为1时代表实际奖励金额*100") + private Long salesPrice; + + @Schema(description = "操作人id") + private Long modifier; + + @Schema(description = "代销设置类型为1才有:供货价高于代销价时是否自动下架:1.是,0.否") + private Integer automaticOff; + + public Integer getAutomaticOff() { + return automaticOff; + } + + public void setAutomaticOff(Integer automaticOff) { + this.automaticOff = automaticOff; + } + + public Integer getOrderShape() { + return orderShape; + } + + public void setOrderShape(Integer orderShape) { + this.orderShape = orderShape; + } + + public Long getShopSubstituteSalesId() { + return shopSubstituteSalesId; + } + + public void setShopSubstituteSalesId(Long shopSubstituteSalesId) { + this.shopSubstituteSalesId = shopSubstituteSalesId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSalesType() { + return salesType; + } + + public void setSalesType(Integer salesType) { + this.salesType = salesType; + } + + public Integer getSalesPriceType() { + return salesPriceType; + } + + public void setSalesPriceType(Integer salesPriceType) { + this.salesPriceType = salesPriceType; + } + + public Long getSalesPrice() { + return salesPrice; + } + + public void setSalesPrice(Long salesPrice) { + this.salesPrice = salesPrice; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + @Override + public String toString() { + return "ShopSubstituteSalesVO{" + + "shopSubstituteSalesId=" + shopSubstituteSalesId + + ", shopId=" + shopId + + ", salesType=" + salesType + + ", salesPriceType=" + salesPriceType + + ", orderShape=" + orderShape + + ", salesPrice=" + salesPrice + + ", modifier=" + modifier + + ", automaticOff=" + automaticOff + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/wrapper/RequestWrapper.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/wrapper/RequestWrapper.java new file mode 100644 index 0000000..6933ef4 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/wrapper/RequestWrapper.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.wrapper; + +import com.tmerclub.cloud.common.constant.Constant; +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; + +import java.io.*; +import java.nio.charset.StandardCharsets; + +/** + * @author Citrus + * @date 2021/8/13 13:31 + */ +public class RequestWrapper extends HttpServletRequestWrapper { + + private String body; + + /** + * Constructs a request object wrapping the given request. + * + * @param request The request to wrap + * @throws IllegalArgumentException if the request is null + */ + public RequestWrapper(HttpServletRequest request) throws IOException { + super(request); + StringBuilder stringBuilder = new StringBuilder(Constant.INITIAL_CAPACITY); + BufferedReader bufferedReader = null; + try { + InputStream inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + char[] charBuffer = new char[1024]; + int bytesRead; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } + } finally { + if (bufferedReader != null) { + bufferedReader.close(); + } + } + body = stringBuilder.toString(); + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + + @Override + public BufferedReader getReader() { + return new BufferedReader(new InputStreamReader(this.getInputStream(), StandardCharsets.UTF_8)); + } + + @Override + public ServletInputStream getInputStream() { + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8)); + return new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + + } + + @Override + public int read() { + return byteArrayInputStream.read(); + } + }; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance b/tmerclub-common/tmerclub-common-core/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance new file mode 100644 index 0000000..e85b670 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance @@ -0,0 +1 @@ +dev=com.tmerclub.cloud.common.dubbo.DevProximityLoadBalance \ No newline at end of file diff --git a/tmerclub-common/tmerclub-common-database/pom.xml b/tmerclub-common/tmerclub-common-database/pom.xml new file mode 100644 index 0000000..2ccf19c --- /dev/null +++ b/tmerclub-common/tmerclub-common-database/pom.xml @@ -0,0 +1,37 @@ + + + + tmerclub-common + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-common-database + mall4cloud 数据库连接相关公共代码 + jar + + + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + com.mysql + mysql-connector-j + + + + diff --git a/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/config/MybatisConfig.java b/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/config/MybatisConfig.java new file mode 100644 index 0000000..6bcbae2 --- /dev/null +++ b/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/config/MybatisConfig.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.database.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Configuration; + +/** + * @author FrozenWatermelon + * @date 2020/6/24 + */ +@Configuration +@MapperScan("com.moyuer.cloud.**.mapper") +public class MybatisConfig { + + +} diff --git a/tmerclub-common/tmerclub-common-leaf/pom.xml b/tmerclub-common/tmerclub-common-leaf/pom.xml new file mode 100644 index 0000000..35fdbce --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/pom.xml @@ -0,0 +1,21 @@ + + + tmerclub-common + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-common-leaf + mall4cloud 数据库连接相关公共代码 + jar + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/common/Status.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/common/Status.java new file mode 100644 index 0000000..07fc761 --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/common/Status.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.common; + +/** + * @author leaf + */ +public enum Status { + + /** + * success + */ + SUCCESS, + + /** + * exception + */ + EXCEPTION + +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/exception/NoKeyException.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/exception/NoKeyException.java new file mode 100644 index 0000000..c64ea8d --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/exception/NoKeyException.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +/** + * @author leaf + */ +@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR, reason = "Key is none") +public class NoKeyException extends RuntimeException { + +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/manager/SegmentManager.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/manager/SegmentManager.java new file mode 100644 index 0000000..3dce7ff --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/manager/SegmentManager.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.manager; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.format.FastDateFormat; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.leaf.common.Result; +import com.tmerclub.cloud.common.leaf.common.Status; +import com.tmerclub.cloud.common.leaf.constant.DistributedIdSysType; +import com.tmerclub.cloud.common.leaf.constant.GlobalDistributedIdKey; +import com.tmerclub.cloud.common.leaf.exception.LeafServerException; +import com.tmerclub.cloud.common.leaf.exception.NoKeyException; +import com.tmerclub.cloud.common.leaf.service.SegmentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + + +/** + * @author FrozenWatermelon + * @date 2020/7/15 + */ +@Service +public class SegmentManager { + + public static final String DATETIME_PATTERN = "yyMMdd"; + + public static final FastDateFormat DATETIME_FORMAT = FastDateFormat.getInstance(DATETIME_PATTERN); + + /** + * 分片id长度 + */ + public static final int USER_SPLIT_LENGTH = 3; + /** + * 日期长度 + */ + public static final int DATE_LENGTH = 6; + /** + * id默认长度 + */ + public static final int ID_DEFAULT_LENGTH = 15; + + @Autowired + private SegmentService segmentService; + + @Value("${application.workerId:}") + private String workerId; + + @Value("${spring.application.name}") + private String appname; + + /** + * 获取id,从1开始递增 + * @param key + * @return + */ + public Long getSegmentId(String key) { + // 默认我们给个15位 + return genNo(key, ID_DEFAULT_LENGTH); + } + public Long getSegmentId(String key, Integer length) { + return genNo(key, length); + } + + /** + * 获取随机码,用于提货码、核销之类需要固定长度的场景 + * Long类型返回的id,前面无法填充0,导致长度没有固定 + * @param key + * @return + */ + public String getSegmentCode(String key) { + return genNoStr(key, ID_DEFAULT_LENGTH, null); + } + + /** + * 获取随机码,用于提货码、核销之类需要固定长度的场景 + * Long类型返回的id,前面无法填充0,导致长度没有固定 + * @param key + * @param length id的长度 + * @return + */ + public String getSegmentCode(String key, Integer length) { + return genNoStr(key, length, null); + } + + /** + * 批量获取-从1开始递增 + * @param key + * @param size + * @return + */; + public List listSegmentId(String key, Integer size) { + List ids = new ArrayList<>(); + for (int i = 0; i < size; i++) { + ids.add(getSegmentId(key)); + } + return ids; + } + + /** + * 生成携带日期格式的id(非分库分表类型id) + * 默认长度为15位,也是从1开始递增,但前面拼接了日期,所以长度固定,中间使用0来填充,每日可生成的id数量为十亿 + * @param key + * @return + */ + public Long getDateFormatSegmentId(String key) { + return getDateFormatSegmentId(key, ID_DEFAULT_LENGTH); + } + public Long getDateFormatSegmentId(String key, Integer length) { + String id = getDateTime() + genNo(key, length - DATE_LENGTH); + return Long.parseLong(id); + } + + /** + * 用于分库分表的分片字段id + * 初始化到数据库中的key格式为: key名称 + id的后三位, 所以key总数量为1000 + * @param key + * @param id + * @return + */ + public Long getSegmentIdWithDateTime(String key, Long id) { + // 默认生成转换为16位长度的id,js long的精度是16位的,所以默认我们也给个16位 6 + 7 + 最后3位是userId这很关键 + // 这里的7位id其中有x位用来区分测试环境和生产环境,还有7-x位用来生成id,如果是全局id,7-(x+1)位 + // 所以workerId最好是一位数,或者没有 + String idSuf = getUserIdKey(String.valueOf(id)); + return Long.valueOf(getDateTime() + genNoStr(key, 7, idSuf) + idSuf); + } + + private Long genNo(String key, int length) { + // 全局的分布式id键 + if (GlobalDistributedIdKey.containKey(key)) { + return Long.parseLong(getGlobalId(key, length)); + } + Long nextId = get(key, length); + if (StrUtil.isBlank(workerId)) { + return nextId; + } + return Long.parseLong(workerId + nextId); + } + + private String genNoStr(String name, int length, String idSuf){ + String key = name; + if (Objects.nonNull(idSuf)) { + // 拼接key - key名称后面拼接上id, 拼接符:-, 每个id都有对应的key + key = name + StrUtil.DASHED + idSuf; + } + // 全局的分布式id键 + if (GlobalDistributedIdKey.containKey(name)) { + return getGlobalId(key, length); + } + Long nextId = get(key, length); + // 在id前面补零, length为补零后的长度, d:表示为正数类型 + length = length - workerId.length(); + String newId = String.format("%0" + length + "d", nextId); + return workerId + newId; + } + + private String getGlobalId(String key, int length) { + // 获取当前服务id, id为空就加一个服务名称对应的枚举类型 + Integer systemId = DistributedIdSysType.getId(appname); + // length - 1 是为了留一个位置出来补足 systemId + length = length - 1; + Long nextId = get(key, length); + // 在id前面补零, length为补零后的长度, d:表示为正数类型 + length = length - workerId.length(); + // 在id前面补零, length为补零后的长度, d:表示为正数类型 + String newId = String.format("%0" + length + "d", nextId); + return systemId + workerId + newId; + } + + + private Long get(String key, Integer length) { + // length - x 是为了留位置出来补足workId + length = length - workerId.length(); + Result result; + if (key == null || key.isEmpty()) { + throw new NoKeyException(); + } + Result id = segmentService.getId(key, length); + result = id; + if (Objects.equals(result.getStatus(), Status.EXCEPTION)) { + throw new LeafServerException(result.toString()); + } + return result.getId(); + } + + + private String getDateTime() { + return DateUtil.format(new Date(), DATETIME_FORMAT); + } + + + /** + * 截取用户ID的后三位 + */ + private String getUserIdKey(String userId) { + // 如果userId的长度大于或等于3,则直接返回 + if (userId.length() >= USER_SPLIT_LENGTH) { + return userId.substring(userId.length() - USER_SPLIT_LENGTH); + } + // 如果userId的长度大于或等于3,则直接前面补0 + StringBuilder userIdKey = new StringBuilder(userId); + while (userIdKey.length() != USER_SPLIT_LENGTH) { + userIdKey.insert(0, "0"); + } + return userIdKey.toString(); + } + + /** + * 生成key列表sql + * @param args + */ + public static void main(String[] args) { + String begin = "INSERT INTO `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) VALUES"; + System.out.println(begin); + loadKeySql("mall4cloud-group-team", "团购队伍id"); + loadKeySql("mall4cloud-group-order", "团购订单号"); + loadKeySql("mall4cloud-refund", "退款id"); + // 生成的插入sql会在最后多出一个逗号,自行去掉即可 + } + + private static void loadKeySql(String key, String value) { + for (int i = 0; i < 1000; i++) { + String id = String.valueOf(i); + if (id.length() == 1) { + id = "00" + id; + } else if (id.length() == 2) { + id = "0" + id; + } + String sql = "('" + key + "-" + id + "','1','1000','" + value + "'),"; + System.out.println(sql); + } + } +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/SegmentIDGenImpl.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/SegmentIDGenImpl.java new file mode 100644 index 0000000..a5759a8 --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/SegmentIDGenImpl.java @@ -0,0 +1,309 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.segment; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.leaf.IDGen; +import com.tmerclub.cloud.common.leaf.common.Result; +import com.tmerclub.cloud.common.leaf.common.Status; +import com.tmerclub.cloud.common.leaf.segment.dao.IDAllocDao; +import com.tmerclub.cloud.common.leaf.segment.model.LeafAlloc; +import com.tmerclub.cloud.common.leaf.segment.model.Segment; +import com.tmerclub.cloud.common.leaf.segment.model.SegmentBuffer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicLong; + +/** + * @author leaf + */ +@Component +public class SegmentIDGenImpl implements IDGen { + + public SegmentIDGenImpl(IDAllocDao dao) { + this.dao = dao; + logger.info("Init ..."); + // 确保加载到kv后才初始化成功 + updateCacheFromDb(); + initOk = true; + updateCacheFromDbAtEveryMinute(); + logger.info("Segment Service Init Successfully"); + } + + private static final Logger logger = LoggerFactory.getLogger(SegmentIDGenImpl.class); + + /** + * IDCache未初始化成功时的异常码 + */ + private static final long EXCEPTION_ID_IDCACHE_INIT_FALSE = -1; + + /** + * key不存在时的异常码 + */ + private static final long EXCEPTION_ID_KEY_NOT_EXISTS = -2; + + /** + * SegmentBuffer中的两个Segment均未从DB中装载时的异常码 + */ + private static final long EXCEPTION_ID_TWO_SEGMENTS_ARE_NULL = -3; + + /** + * 最大步长不超过100,0000 + */ + private static final int MAX_STEP = 1000000; + + /** + * 一个Segment维持时间为15分钟 + */ + private static final long SEGMENT_DURATION = 15 * 60 * 1000L; + + private final ExecutorService service = new ThreadPoolExecutor(5, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, + new SynchronousQueue<>(), new UpdateThreadFactory()); + + private volatile boolean initOk; + + private final Map cache = new ConcurrentHashMap<>(Constant.INITIAL_CAPACITY); + + @Autowired + private IDAllocDao dao; + + private static final int DEFAULT_LOAD_FACTOR = 2; + + public static class UpdateThreadFactory implements ThreadFactory { + + private static int threadInitNumber; + + private static synchronized int nextThreadNum() { + return threadInitNumber++; + } + + @SuppressWarnings("NullableProblems") + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "Thread-Segment-Update-" + nextThreadNum()); + } + + } + + private void updateCacheFromDbAtEveryMinute() { + ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(r -> { + Thread t = new Thread(r); + t.setName("check-idCache-thread"); + t.setDaemon(true); + return t; + }); + service.scheduleWithFixedDelay(this::updateCacheFromDb, 60, 60, TimeUnit.SECONDS); + } + + private void updateCacheFromDb() { + logger.info("update cache from db"); + try { + List dbTags = dao.getAllTags(); + if (dbTags == null || dbTags.isEmpty()) { + return; + } + List cacheTags = new ArrayList<>(cache.keySet()); + Set insertTagsSet = new HashSet<>(dbTags); + Set removeTagsSet = new HashSet<>(cacheTags); + // db中新加的tags灌进cache + for (String tmp : cacheTags) { + insertTagsSet.remove(tmp); + } + for (String tag : insertTagsSet) { + SegmentBuffer buffer = new SegmentBuffer(); + buffer.setKey(tag); + Segment segment = buffer.getCurrent(); + segment.setValue(new AtomicLong(0)); + segment.setMax(0); + segment.setStep(0); + cache.put(tag, buffer); + logger.debug("Add tag {} from db to IdCache, SegmentBuffer {}", tag, buffer); + } + // cache中已失效的tags从cache删除 + for (String tmp : dbTags) { + removeTagsSet.remove(tmp); + } + for (String tag : removeTagsSet) { + cache.remove(tag); + logger.debug("Remove tag {} from IdCache", tag); + } + } catch (Exception e) { + logger.warn("update cache from db exception", e); + } + } + + @Override + public Result get(String key, int length) { + if (!initOk) { + return new Result(EXCEPTION_ID_IDCACHE_INIT_FALSE, Status.EXCEPTION); + } + SegmentBuffer buffer = cache.get(key); + if (buffer != null) { + if (buffer.isInitOk()) { + synchronized (buffer) { + if (buffer.isInitOk()) { + try { + updateSegmentFromDb(key, buffer.getCurrent(), length); + logger.info("Init buffer. Update leafkey {} {} from db", key, buffer.getCurrent()); + buffer.setInitOk(true); + } catch (Exception e) { + logger.warn("Init buffer {} exception", buffer.getCurrent(), e); + } + } + } + } + return getIdFromSegmentBuffer(cache.get(key), length); + } + return new Result(EXCEPTION_ID_KEY_NOT_EXISTS, Status.EXCEPTION); + } + + public void updateSegmentFromDb(String key, Segment segment, int length) { + SegmentBuffer buffer = segment.getBuffer(); + LeafAlloc leafAlloc; + Long value = null; + if (buffer.isInitOk()) { + leafAlloc = dao.updateMaxIdAndGetLeafAlloc(key, length); + buffer.setStep(leafAlloc.getStep()); + // leafAlloc中的step为DB中的step + buffer.setMinStep(leafAlloc.getStep()); + } else if (buffer.getUpdateTimestamp() == 0) { + leafAlloc = dao.updateMaxIdAndGetLeafAlloc(key, length); + buffer.setUpdateTimestamp(System.currentTimeMillis()); + buffer.setStep(leafAlloc.getStep()); + // leafAlloc中的step为DB中的step + buffer.setMinStep(leafAlloc.getStep()); + } else { + long duration = System.currentTimeMillis() - buffer.getUpdateTimestamp(); + int nextStep = buffer.getStep(); + if (duration < SEGMENT_DURATION) { + if (nextStep * DEFAULT_LOAD_FACTOR > MAX_STEP) { + // do nothing + logger.info("leafKey[{}] reach max step, step[{}]", key, nextStep); + } else { + nextStep = nextStep * DEFAULT_LOAD_FACTOR; + } + } else if (duration < SEGMENT_DURATION * DEFAULT_LOAD_FACTOR) { + // do nothing with nextStep + logger.info("leafKey[{}] reach max step, step[{}]", key, nextStep); + } else { + nextStep = nextStep / DEFAULT_LOAD_FACTOR >= buffer.getMinStep() ? nextStep / DEFAULT_LOAD_FACTOR + : nextStep; + } + logger.info("leafKey[{}], step[{}], duration[{}mins], nextStep[{}]", key, buffer.getStep(), + String.format("%.2f", ((double) duration / (1000 * 60))), nextStep); + LeafAlloc temp = new LeafAlloc(); + temp.setKey(key); + temp.setStep(nextStep); + leafAlloc = dao.updateMaxIdByCustomStepAndGetLeafAlloc(temp, length); + buffer.setUpdateTimestamp(System.currentTimeMillis()); + buffer.setStep(temp.getStep()); + // leafAlloc的step为DB中的step + buffer.setMinStep(leafAlloc.getStep()); + if (Objects.nonNull(temp.getValue())) { + value = leafAlloc.getValue(); + } + } + // must set value before set max + if (Objects.isNull(value)) { + value = leafAlloc.getMaxId() - buffer.getStep(); + } + segment.getValue().set(value); + segment.setMax(leafAlloc.getMaxId()); + segment.setStep(buffer.getStep()); + } + + public Result getIdFromSegmentBuffer(SegmentBuffer buffer, int length) { + while (true) { + buffer.rLock().lock(); + try { + Segment segment = buffer.getCurrent(); + if (!buffer.isNextReady() && (segment.getIdle() < 0.9 * segment.getStep()) + && buffer.getThreadRunning().compareAndSet(false, true)) { + service.execute(() -> { + Segment next = buffer.getSegments()[buffer.nextPos()]; + boolean updateOk = false; + try { + updateSegmentFromDb(buffer.getKey(), next, length); + updateOk = true; + logger.info("update segment {} from db {}", buffer.getKey(), next); + } catch (Exception e) { + logger.warn("{} updateSegmentFromDb exception", buffer.getKey(), e); + } finally { + if (updateOk) { + buffer.wLock().lock(); + buffer.setNextReady(true); + buffer.getThreadRunning().set(false); + buffer.wLock().unlock(); + } else { + buffer.getThreadRunning().set(false); + } + } + }); + } + long value = segment.getValue().getAndIncrement(); + + if (value < segment.getMax()) { + return new Result(value, Status.SUCCESS); + } + } finally { + buffer.rLock().unlock(); + } + waitAndSleep(buffer); + buffer.wLock().lock(); + try { + Segment segment = buffer.getCurrent(); + long value = segment.getValue().getAndIncrement(); + if (value < segment.getMax()) { + return new Result(value, Status.SUCCESS); + } + if (buffer.isNextReady()) { + buffer.switchPos(); + buffer.setNextReady(false); + } else { + logger.error("Both two segments in {} are not ready!", buffer); + return new Result(EXCEPTION_ID_TWO_SEGMENTS_ARE_NULL, Status.EXCEPTION); + } + } finally { + buffer.wLock().unlock(); + } + } + } + + private void waitAndSleep(SegmentBuffer buffer) { + int roll = 0; + while (buffer.getThreadRunning().get()) { + roll += 1; + if (roll > 10000) { + try { + TimeUnit.MILLISECONDS.sleep(10); + break; + } catch (InterruptedException e) { + logger.warn("Thread {} Interrupted, Exception: {}", Thread.currentThread().getName(), e); + break; + } + } + } + } + + public List getAllLeafAllocs() { + return dao.getAllLeafAllocs(); + } + + public Map getCache() { + return cache; + } + + +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/dao/IDAllocDao.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/dao/IDAllocDao.java new file mode 100644 index 0000000..a136cf6 --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/dao/IDAllocDao.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.segment.dao; + +import com.tmerclub.cloud.common.leaf.segment.model.LeafAlloc; + +import java.util.List; + +/** + * @author leaf + */ +public interface IDAllocDao { + + /** + * com.moyuer.cloud.leaf.segment.dao.IDAllocMapper.getAllLeafAllocs + * @return List LeafAlloc + */ + List getAllLeafAllocs(); + + /** + * updateMaxIdAndGetLeafAlloc + * + * @param tag tag + * @param length + * @return LeafAlloc + */ + LeafAlloc updateMaxIdAndGetLeafAlloc(String tag, int length); + + /** + * updateMaxIdByCustomStepAndGetLeafAlloc + * + * @param leafAlloc leafAlloc + * @param length + * @return LeafAlloc + */ + LeafAlloc updateMaxIdByCustomStepAndGetLeafAlloc(LeafAlloc leafAlloc, int length); + + /** + * getAllTags + * @return List String + */ + List getAllTags(); + +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/model/LeafAlloc.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/model/LeafAlloc.java new file mode 100644 index 0000000..531d463 --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/model/LeafAlloc.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.segment.model; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author leaf + */ +public class LeafAlloc implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String key; + private long maxId; + private int step; + private Long value; + private String updateTime; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public long getMaxId() { + return maxId; + } + + public void setMaxId(long maxId) { + this.maxId = maxId; + } + + public int getStep() { + return step; + } + + public void setStep(int step) { + this.step = step; + } + + public Long getValue() { + return value; + } + + public void setValue(Long value) { + this.value = value; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/model/SegmentBuffer.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/model/SegmentBuffer.java new file mode 100644 index 0000000..99f97a1 --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/model/SegmentBuffer.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.segment.model; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Arrays; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +/** + * 双buffer + * + * @author left + */ +public class SegmentBuffer implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String key; + + /** + * 双buffer + */ + private final Segment[] segments; + + /** + * 当前的使用的segment的index + */ + private volatile int currentPos; + + /** + * 下一个segment是否处于可切换状态 + */ + private volatile boolean nextReady; + + /** + * 是否初始化完成 + */ + private volatile boolean initOk; + + /** + * 线程是否在运行中 + */ + private final AtomicBoolean threadRunning; + + private final ReadWriteLock lock; + + private volatile int step; + + private volatile int minStep; + + private volatile long updateTimestamp; + + public SegmentBuffer() { + segments = new Segment[]{new Segment(this), new Segment(this)}; + currentPos = 0; + nextReady = false; + initOk = false; + threadRunning = new AtomicBoolean(false); + lock = new ReentrantReadWriteLock(); + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Segment[] getSegments() { + return segments; + } + + public Segment getCurrent() { + return segments[currentPos]; + } + + public int getCurrentPos() { + return currentPos; + } + + public int nextPos() { + return (currentPos + 1) % 2; + } + + public void switchPos() { + currentPos = nextPos(); + } + + public boolean isInitOk() { + return !initOk; + } + + public void setInitOk(boolean initOk) { + this.initOk = initOk; + } + + public boolean isNextReady() { + return nextReady; + } + + public void setNextReady(boolean nextReady) { + this.nextReady = nextReady; + } + + public AtomicBoolean getThreadRunning() { + return threadRunning; + } + + public Lock rLock() { + return lock.readLock(); + } + + public Lock wLock() { + return lock.writeLock(); + } + + public int getStep() { + return step; + } + + public void setStep(int step) { + this.step = step; + } + + public int getMinStep() { + return minStep; + } + + public void setMinStep(int minStep) { + this.minStep = minStep; + } + + public long getUpdateTimestamp() { + return updateTimestamp; + } + + public void setUpdateTimestamp(long updateTimestamp) { + this.updateTimestamp = updateTimestamp; + } + + @Override + public String toString() { + return "SegmentBuffer{" + "key='" + key + '\'' + + ", segments=" + Arrays.toString(segments) + + ", currentPos=" + currentPos + + ", nextReady=" + nextReady + + ", initOk=" + initOk + + ", threadRunning=" + threadRunning + + ", step=" + step + + ", minStep=" + minStep + + ", updateTimestamp=" + updateTimestamp + + '}'; + } + +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/service/SegmentService.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/service/SegmentService.java new file mode 100644 index 0000000..b408b47 --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/service/SegmentService.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.service; + +import com.tmerclub.cloud.common.leaf.IDGen; +import com.tmerclub.cloud.common.leaf.common.Result; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author left + */ +@Service("SegmentService") +public class SegmentService { + + @Autowired + private IDGen idGen; + + public Result getId(String key, int length) { + return idGen.get(key, length); + } + +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/util/NumberUtil.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/util/NumberUtil.java new file mode 100644 index 0000000..c1058f8 --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/util/NumberUtil.java @@ -0,0 +1,70 @@ +package com.tmerclub.cloud.common.leaf.util; + +/** + * 数字处理工具类 + * + * @author LGH + * @version 1.0 + */ +public class NumberUtil { + + private static final int[] RANGE_1 = {1, 7, 9, 2, 8, 6, 5, 0, 3, 4}; + + private static final int[] RANGE_2 = {6, 2, 7, 0, 9, 5, 3, 1, 4, 8}; + + private static final int[] RANGE_3 = {8, 9, 7, 4, 2, 0, 3, 1, 5, 6}; + + private static final int[] RANGE_4 = {7, 4, 6, 0, 8, 5, 1, 9, 2, 3}; + + private static final int[] RANGE_5 = {3, 2, 0, 8, 6, 4, 1, 7, 9, 5}; + + private static final int[] RANGE_6 = {3, 7, 1, 5, 6, 9, 2, 0, 4, 8}; + + private static final int[] RANGE_7 = {8, 7, 1, 4, 2, 9, 6, 0, 5, 3}; + + private static final int[] RANGE_8 = {0, 1, 5, 4, 2, 3, 8, 9, 7, 6}; + + private static final int[] RANGE_9 = {2, 6, 7, 3, 5, 9, 8, 4, 1, 0}; + + private static final int[] RANGE_10 = {2, 7, 5, 1, 4, 8, 0, 3, 6, 9}; + + private static final int[] RANGE_11 = {3, 6, 0, 1, 2, 5, 8, 9, 7, 4}; + + private static final int[] RANGE_12 = {3, 6, 7, 5, 9, 2, 0, 8, 1, 4}; + + private static final int[] RANGE_13 = {7, 5, 6, 0, 4, 2, 3, 1, 9, 8}; + + private static final int[] RANGE_14 = {5, 8, 0, 7, 1, 3, 4, 6, 9, 2}; + + private static final int[] RANGE_15 = {8, 2, 4, 9, 1, 7, 6, 3, 5, 0}; + + private static final int[] RANGE_16 = {2, 6, 1, 0, 8, 7, 9, 5, 3, 4}; + + private static final int[][] RANGE_ARRAY = + {RANGE_1, RANGE_2, RANGE_3, RANGE_4, RANGE_5, RANGE_6, RANGE_7, RANGE_8, RANGE_9, RANGE_10, RANGE_11, RANGE_12, RANGE_13, RANGE_14, RANGE_15, RANGE_16}; + + /** + * 将有限的数字打乱如100会变成,RANGE_1的第一个数 + RANGE_2第0个数 + RANGE_3 第0个数,会变成768 + * @param id 原id + * @param length id长度 + * @return 新的id + */ + public static long genNo(long id, int length) { + long result = 0; + StringBuilder sb = new StringBuilder(); + sb.append(id); + + while (sb.length() < length) { + sb.insert(0, "0"); + } + for (int i = 0; i < length; i++) { + // ASCII码 char转换为int要-48 + int indexId = sb.charAt(i) - 48; + result += RANGE_ARRAY[i][indexId]; + if (i != length-1) { + result *= 10; + } + } + return result; + } +} diff --git a/tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/bo/order/MongoOrderBO.java b/tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/bo/order/MongoOrderBO.java new file mode 100644 index 0000000..2289948 --- /dev/null +++ b/tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/bo/order/MongoOrderBO.java @@ -0,0 +1,1131 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.mongodb.bo.order; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author YXF + * @date 2022/8/23 + */ +@CompoundIndexes({ + @CompoundIndex(name = "user_idx", def = "{'userId':1}"), + @CompoundIndex(name = "shop_idx", def = "{'shopId':1}"), + @CompoundIndex(name = "supplier_idx", def = "{'supplierId':1}"), + @CompoundIndex(name = "station_idx", def = "{'stationId':1}") +}) +@Document("order") +public class MongoOrderBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Id + @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + @Schema(description = "订单项", requiredMode = Schema.RequiredMode.REQUIRED) + private List orderItems; + + @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long userId; + + @Schema(description = "支付系统类型 0默认 1通联支付", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer paySysType; + + @Schema(description = "总价", requiredMode = Schema.RequiredMode.REQUIRED) + private Long actualTotal; + + @Schema(description = "使用积分", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderScore; + + @Schema(description = "订单状态", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer status; + + @Schema(description = "订单类型(0普通订单 1团购订单 2秒杀订单)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer orderType; + + @Schema(description = "订单退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer refundStatus; + + @Schema(description = "配送类型 1:快递 2:自提 3:无需快递", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer deliveryType; + + @Schema(description = "店铺名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String shopName; + + @Schema(description = "店铺id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + + @Schema(description = "订单运费", requiredMode = Schema.RequiredMode.REQUIRED) + private Long freightAmount; + + @Schema(description = "订单创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date createTime; + + @Schema(description = "商品总数", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer allCount; + + @Schema(description = "订单发票id") + private Long orderInvoiceId; + + @Schema(description = "用户备注信息") + private String remarks; + + @Schema(description = "收货人姓名") + private String consignee; + + @Schema(description = "收货人手机号") + private String mobile; + + /** + * 供应商id + */ + private Long supplierId; + /** + * 是否待采购 1.是 0.否 + */ + private Integer waitPurchase; + + /** + * 平台运费减免金额 + */ + private Long platformFreeFreightAmount; + + /** + * 分销金额 + */ + private Long distributionAmount; + + /** + * 平台佣金 + */ + private Long platformCommission; + + /** + * 用户订单地址Id + */ + private Long orderAddrId; + + /** + * 总值 + */ + private Long total; + + + /** + * 卖家备注 + */ + private String shopRemarks; + + /** + * 支付方式 请参考枚举PayType + */ + private Integer payType; + + /** + * 订单关闭原因 1-超时未支付 2-退款关闭 4-买家取消 15-已通过货到付款交易 + */ + private Integer closeType; + + /** + * 发货时间 + */ + private Date updateTime; + + /** + * 付款时间 + */ + private Date payTime; + + /** + * 发货时间 + */ + private Date deliveryTime; + + /** + * 完成时间 + */ + private Date finallyTime; + + /** + * 取消时间 + */ + private Date cancelTime; + + /** + * 预售发货时间 + */ + private Date bookTime; + + /** + * 是否已支付,1.已支付0.未支付 + */ + private Integer isPayed; + + /** + * 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除 + */ + private Integer deleteStatus; + + /** + * 积分抵扣金额 + */ + private Long scoreAmount; + + /** + * 会员折扣金额 + */ + private Long memberAmount; + + /** + * 平台优惠券优惠金额 + */ + private Long platformCouponAmount; + + /** + * 商家优惠券优惠金额 + */ + private Long shopCouponAmount; + + /** + * 满减优惠金额 + */ + private Long discountAmount; + + /** + * 平台优惠金额 + */ + private Long platformAmount; + + /** + * 优惠总额 + */ + private Long reduceAmount; + + /** + * 店铺改价优惠金额 + */ + private Long shopChangeFreeAmount; + + /** + * 商家运费减免金额 + */ + private Long freeFreightAmount; + + /** + * 供应商商品发货方式 1.供应商发货 2.仓库发货 + */ + private Integer supplierDeliveryType; + /** + * 商家采购价差(需要商家从结算金额补上采购价的金额) + */ + private Long purchaseSpreadAmount; + /** + * 商品编码 + */ + private String spuCodes; + /** + * sku编码 + */ + private String partyCodes; + /** + * 是否已经进行结算 + */ + private Integer isSettled; + + /** + * 省ID + */ + private Long provinceId; + + /** + * 省 + */ + private String province; + + /** + * 城市ID + */ + private Long cityId; + + /** + * 城市 + */ + private String city; + + /** + * 区域ID + */ + private Long areaId; + + /** + * 区 + */ + private String area; + + /** + * 地址 + */ + private String addr; + + /** + * 邮编 + */ + private String postCode; + + /** + * 用户类型 0:普通会员 1:付费会员 + * 用于会员统计时,判断订单是属于普通会员还是付费会员 + */ + private Integer userType; + + /** + * 新成交订单 1:新成交订单 0:旧用户再次消费订单 + * 用于会员统计时,判断用户是否为新成交用户 + */ + private Integer firstOrder; + + /** + * 新成交供应商订单 1:新成交供应商订单 0:旧用户再次消费订单 + * 用于供应商新用户统计时,判断用户是否为该供应商的新用户 + */ + private Integer firstSupplierOrder; + + /** + * 预售类型 -1.未开启预售 0.全款预售类型 1.定金预售 + */ + private Integer preSaleType; + /** + * 是否为虚拟商品订单 1.是 0.否 + */ + private Integer orderMold; + + /** + * 定金金额 + */ + private Long depositAmount; + /** + * 尾款金额 + */ + private Long balanceAmount; + /** + * 预售发货类型 -1.固定时间 x.尾款支付后x天发货 + */ + private Integer preSaleDeliveryType; + /** + * 预售发货时间 + */ + private Date preSaleDeliveryTime; + /** + * 尾款支付开始时间 + */ + private Date balanceStartTime; + /** + * 尾款支付结束时间 + */ + private Date balanceEndTime; + + /** + * 自提点id + */ + private Long stationId; + + /** + * 支付单号,可能有多条所以用字符 + */ + private String payId; + + /** + * 自提点提货码 + */ + private String stationCode; + + /** + * 核销次数 -1.多次核销 0.无需核销 1.单次核销 + */ + private Integer writeOffNum; + + /** + * 多次核销次数 -1.无限次 + */ + private Integer writeOffMultipleCount; + + /** + * 核销开始时间 + */ + private Date writeOffStart; + + /** + * 核销结束时间 + */ + private Date writeOffEnd; + + /** + * 订单核销状态 0.待核销 1.核销完成 + */ + private Integer writeOffStatus; + + /** + * 订单被核销次数 + */ + private Integer writeOffCount; + + /** + * 套餐优惠金额 + */ + private Long shopComboAmount; + + @Schema(description = "核销订单", requiredMode = Schema.RequiredMode.REQUIRED) + private List orderVirtualInfoList; + + public Integer getWriteOffCount() { + return writeOffCount; + } + + public void setWriteOffCount(Integer writeOffCount) { + this.writeOffCount = writeOffCount; + } + + public Long getShopComboAmount() { + return shopComboAmount; + } + + public void setShopComboAmount(Long shopComboAmount) { + this.shopComboAmount = shopComboAmount; + } + + public List getOrderVirtualInfoList() { + return orderVirtualInfoList; + } + + public void setOrderVirtualInfoList(List orderVirtualInfoList) { + this.orderVirtualInfoList = orderVirtualInfoList; + } + + public void setWriteOffStatus(Integer writeOffStatus) { + this.writeOffStatus = writeOffStatus; + } + + public Integer getWriteOffStatus() { + return writeOffStatus; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public String getStationCode() { + return stationCode; + } + + public void setStationCode(String stationCode) { + this.stationCode = stationCode; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getSpuCodes() { + return spuCodes; + } + + public void setSpuCodes(String spuCodes) { + this.spuCodes = spuCodes; + } + + public String getPartyCodes() { + return partyCodes; + } + + public void setPartyCodes(String partyCodes) { + this.partyCodes = partyCodes; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Long getPurchaseSpreadAmount() { + return purchaseSpreadAmount; + } + + public void setPurchaseSpreadAmount(Long purchaseSpreadAmount) { + this.purchaseSpreadAmount = purchaseSpreadAmount; + } + + public Integer getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Integer waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Long getOrderInvoiceId() { + return orderInvoiceId; + } + + public void setOrderInvoiceId(Long orderInvoiceId) { + this.orderInvoiceId = orderInvoiceId; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderAddrId() { + return orderAddrId; + } + + public void setOrderAddrId(Long orderAddrId) { + this.orderAddrId = orderAddrId; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public String getShopRemarks() { + return shopRemarks; + } + + public void setShopRemarks(String shopRemarks) { + this.shopRemarks = shopRemarks; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getFinallyTime() { + return finallyTime; + } + + public void setFinallyTime(Date finallyTime) { + this.finallyTime = finallyTime; + } + + public Date getCancelTime() { + return cancelTime; + } + + public void setCancelTime(Date cancelTime) { + this.cancelTime = cancelTime; + } + + public Date getBookTime() { + return bookTime; + } + + public void setBookTime(Date bookTime) { + this.bookTime = bookTime; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Integer getDeleteStatus() { + return deleteStatus; + } + + public void setDeleteStatus(Integer deleteStatus) { + this.deleteStatus = deleteStatus; + } + + public Long getScoreAmount() { + return scoreAmount; + } + + public void setScoreAmount(Long scoreAmount) { + this.scoreAmount = scoreAmount; + } + + public Long getMemberAmount() { + return memberAmount; + } + + public void setMemberAmount(Long memberAmount) { + this.memberAmount = memberAmount; + } + + public Long getPlatformCouponAmount() { + return platformCouponAmount; + } + + public void setPlatformCouponAmount(Long platformCouponAmount) { + this.platformCouponAmount = platformCouponAmount; + } + + public Long getShopCouponAmount() { + return shopCouponAmount; + } + + public void setShopCouponAmount(Long shopCouponAmount) { + this.shopCouponAmount = shopCouponAmount; + } + + public Long getDiscountAmount() { + return discountAmount; + } + + public void setDiscountAmount(Long discountAmount) { + this.discountAmount = discountAmount; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Long getShopChangeFreeAmount() { + return shopChangeFreeAmount; + } + + public void setShopChangeFreeAmount(Long shopChangeFreeAmount) { + this.shopChangeFreeAmount = shopChangeFreeAmount; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + public Integer getFirstOrder() { + return firstOrder; + } + + public void setFirstOrder(Integer firstOrder) { + this.firstOrder = firstOrder; + } + + public Integer getIsSettled() { + return isSettled; + } + + public void setIsSettled(Integer isSettled) { + this.isSettled = isSettled; + } + + public Integer getFirstSupplierOrder() { + return firstSupplierOrder; + } + + public void setFirstSupplierOrder(Integer firstSupplierOrder) { + this.firstSupplierOrder = firstSupplierOrder; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Integer getOrderMold() { + return orderMold; + } + + public void setOrderMold(Integer orderMold) { + this.orderMold = orderMold; + } + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Integer getPreSaleDeliveryType() { + return preSaleDeliveryType; + } + + public void setPreSaleDeliveryType(Integer preSaleDeliveryType) { + this.preSaleDeliveryType = preSaleDeliveryType; + } + + public Date getPreSaleDeliveryTime() { + return preSaleDeliveryTime; + } + + public void setPreSaleDeliveryTime(Date preSaleDeliveryTime) { + this.preSaleDeliveryTime = preSaleDeliveryTime; + } + + public Date getBalanceStartTime() { + return balanceStartTime; + } + + public void setBalanceStartTime(Date balanceStartTime) { + this.balanceStartTime = balanceStartTime; + } + + public Date getBalanceEndTime() { + return balanceEndTime; + } + + public void setBalanceEndTime(Date balanceEndTime) { + this.balanceEndTime = balanceEndTime; + } + + public String getPayId() { + return payId; + } + + public void setPayId(String payId) { + this.payId = payId; + } + + @SuppressWarnings("AlibabaMethodTooLong") + @Override + public String toString() { + return "MongoOrderBO{" + + "orderItems=" + orderItems + + ", userId=" + userId + + ", orderId=" + orderId + + ", paySysType=" + paySysType + + ", actualTotal=" + actualTotal + + ", status=" + status + + ", orderScore=" + orderScore + + ", orderType=" + orderType + + ", refundStatus=" + refundStatus + + ", deliveryType=" + deliveryType + + ", shopName='" + shopName + '\'' + + ", shopId=" + shopId + + ", freightAmount=" + freightAmount + + ", createTime=" + createTime + + ", allCount=" + allCount + + ", orderInvoiceId=" + orderInvoiceId + + ", remarks='" + remarks + '\'' + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", supplierId=" + supplierId + + ", waitPurchase=" + waitPurchase + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", distributionAmount=" + distributionAmount + + ", platformCommission=" + platformCommission + + ", orderAddrId=" + orderAddrId + + ", total=" + total + + ", shopRemarks='" + shopRemarks + '\'' + + ", payType=" + payType + + ", closeType=" + closeType + + ", updateTime=" + updateTime + + ", payTime=" + payTime + + ", deliveryTime=" + deliveryTime + + ", finallyTime=" + finallyTime + + ", cancelTime=" + cancelTime + + ", bookTime=" + bookTime + + ", isPayed=" + isPayed + + ", deleteStatus=" + deleteStatus + + ", scoreAmount=" + scoreAmount + + ", memberAmount=" + memberAmount + + ", platformCouponAmount=" + platformCouponAmount + + ", shopCouponAmount=" + shopCouponAmount + + ", discountAmount=" + discountAmount + + ", platformAmount=" + platformAmount + + ", reduceAmount=" + reduceAmount + + ", shopChangeFreeAmount=" + shopChangeFreeAmount + + ", freeFreightAmount=" + freeFreightAmount + + ", supplierDeliveryType=" + supplierDeliveryType + + ", purchaseSpreadAmount=" + purchaseSpreadAmount + + ", spuCodes='" + spuCodes + '\'' + + ", partyCodes='" + partyCodes + '\'' + + ", isSettled=" + isSettled + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", addr='" + addr + '\'' + + ", postCode='" + postCode + '\'' + + ", userType=" + userType + + ", firstOrder=" + firstOrder + + ", firstSupplierOrder=" + firstSupplierOrder + + ", preSaleType=" + preSaleType + + ", orderMold=" + orderMold + + ", depositAmount=" + depositAmount + + ", balanceAmount=" + balanceAmount + + ", preSaleDeliveryType=" + preSaleDeliveryType + + ", preSaleDeliveryTime=" + preSaleDeliveryTime + + ", balanceStartTime=" + balanceStartTime + + ", balanceEndTime=" + balanceEndTime + + ", stationId=" + stationId + + ", payId='" + payId + '\'' + + ", stationCode='" + stationCode + '\'' + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", writeOffStatus=" + writeOffStatus + + ", shopComboAmount=" + shopComboAmount + + ", orderVirtualInfoList=" + orderVirtualInfoList + + ", writeOffCount=" + writeOffCount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/bo/order/MongoOrderVirtualInfoBO.java b/tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/bo/order/MongoOrderVirtualInfoBO.java new file mode 100644 index 0000000..316a2ba --- /dev/null +++ b/tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/bo/order/MongoOrderVirtualInfoBO.java @@ -0,0 +1,115 @@ +package com.tmerclub.cloud.common.mongodb.bo.order; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +/** + * @author lanhai + */ +public class MongoOrderVirtualInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "虚拟核销id") + private Long orderVirtualInfoId; + + @Schema(description = "订单ID") + private Long orderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "核销门店id") + private Long stationId; + + @Schema(description = "核销码") + private String writeOffCode; + + @Schema(description = "是否核销 1.已核销 0.未核销") + private Integer isWriteOff; + + @Schema(description = "核销时间") + private Date writeOffTime; + + @Schema(description = "剩余核销次数 -1.无限次") + private Integer writeOffMultipleCount; + + public Long getOrderVirtualInfoId() { + return orderVirtualInfoId; + } + + public void setOrderVirtualInfoId(Long orderVirtualInfoId) { + this.orderVirtualInfoId = orderVirtualInfoId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getWriteOffCode() { + return writeOffCode; + } + + public void setWriteOffCode(String writeOffCode) { + this.writeOffCode = writeOffCode; + } + + public Integer getIsWriteOff() { + return isWriteOff; + } + + public void setIsWriteOff(Integer isWriteOff) { + this.isWriteOff = isWriteOff; + } + + public Date getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(Date writeOffTime) { + this.writeOffTime = writeOffTime; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + @Override + public String toString() { + return "OrderVirtualInfoVO{" + + "orderVirtualInfoId=" + orderVirtualInfoId + + ", orderId=" + orderId + + ", shopId=" + shopId + + ", stationId=" + stationId + + ", writeOffCode='" + writeOffCode + '\'' + + ", isWriteOff=" + isWriteOff + + ", writeOffTime=" + writeOffTime + + ", writeOffMultipleCount=" + writeOffMultipleCount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/util/MongoPageUtil.java b/tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/util/MongoPageUtil.java new file mode 100644 index 0000000..99b5418 --- /dev/null +++ b/tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/util/MongoPageUtil.java @@ -0,0 +1,48 @@ +package com.tmerclub.cloud.common.mongodb.util; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * mongoDB分页工具 + * @author CDT + */ +@Component +public class MongoPageUtil { + + private static final Logger logger = LoggerFactory.getLogger(MongoPageUtil.class); + + private final MongoTemplate mongoTemplate; + + @Autowired + public MongoPageUtil(MongoTemplate mongoTemplate) { + this.mongoTemplate = mongoTemplate; + } + + public PageVO doPage(Class clazz, PageDTO mongoPageDTO, Query query) { + long total = mongoTemplate.count(query, clazz); + + int skip = mongoPageDTO.getPageSize() * (mongoPageDTO.getPageNum() - 1); + query.skip(skip).limit(mongoPageDTO.getPageSize()); + + logger.info("构建MongoPageUtil查询语句: {}", query); + + List list = mongoTemplate.find(query, clazz); + + PageVO mongoPageVO = new PageVO<>(); + mongoPageVO.setTotal(total); + mongoPageVO.setList(list); + mongoPageVO.setPages(PageUtil.getPages(total, mongoPageDTO.getPageSize())); + return mongoPageVO; + } +} + diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/DeliveryModeBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/DeliveryModeBO.java new file mode 100644 index 0000000..5fe1ecd --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/DeliveryModeBO.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 配送方式 + * + * @author FrozenWatermelon + * @date 2020/12/8 + */ +public class DeliveryModeBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户自提 + */ + @Schema(description = "用户自提", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean hasUserPickUp; + + /** + * 店铺配送 + */ + @Schema(description = "店铺配送", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean hasShopDelivery; + + /** + * 同城配送 + */ + @Schema(description = "同城配送", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean hasCityDelivery; + + public Boolean getHasUserPickUp() { + return hasUserPickUp; + } + + public void setHasUserPickUp(Boolean hasUserPickUp) { + this.hasUserPickUp = hasUserPickUp; + } + + public Boolean getHasShopDelivery() { + return hasShopDelivery; + } + + public void setHasShopDelivery(Boolean hasShopDelivery) { + this.hasShopDelivery = hasShopDelivery; + } + + public Boolean getHasCityDelivery() { + return hasCityDelivery; + } + + public void setHasCityDelivery(Boolean hasCityDelivery) { + this.hasCityDelivery = hasCityDelivery; + } + + @Override + public String toString() { + return "DeliveryModeBO{" + + "hasUserPickUp=" + hasUserPickUp + + ", hasShopDelivery=" + hasShopDelivery + + ", hasCityDelivery=" + hasCityDelivery + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/EsOrderBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/EsOrderBO.java new file mode 100644 index 0000000..a70235c --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/EsOrderBO.java @@ -0,0 +1,1145 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021/2/5 + */ +public class EsOrderBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单项", requiredMode = Schema.RequiredMode.REQUIRED) + private List orderItems; + + @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long userId; + + @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + @Schema(description = "总价", requiredMode = Schema.RequiredMode.REQUIRED) + private Long actualTotal; + + @Schema(description = "使用积分", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderScore; + + @Schema(description = "订单状态", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer status; + + @Schema(description = "订单类型(0普通订单 1团购订单 2秒杀订单)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer orderType; + + @Schema(description = "订单退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer refundStatus; + + @Schema(description = "配送类型 1:快递 2:自提 3:无需快递", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer deliveryType; + + @Schema(description = "店铺名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String shopName; + + @Schema(description = "店铺id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + + @Schema(description = "订单运费", requiredMode = Schema.RequiredMode.REQUIRED) + private Long freightAmount; + + @Schema(description = "订单创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date createTime; + + @Schema(description = "商品总数", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer allCount; + + @Schema(description = "订单发票id") + private Long orderInvoiceId; + + @Schema(description = "用户备注信息") + private String remarks; + + @Schema(description = "收货人姓名") + private String consignee; + + @Schema(description = "收货人手机号") + private String mobile; + + @Schema(description = "收货人地址") + private String receivingAddr; + + /** + * 邮编 + */ + private String postCode; + + /** + * 支付单号,可能有多条所以用字符 + */ + private String payId; + + /** + * 供应商id + */ + private Long supplierId; + /** + * 是否待采购 1.是 0.否 + */ + private Integer waitPurchase; + + /** + * 平台运费减免金额 + */ + private Long platformFreeFreightAmount; + + /** + * 分销金额 + */ + private Long distributionAmount; + + /** + * 平台佣金 + */ + private Long platformCommission; + + /** + * 用户订单地址Id + */ + private Long orderAddrId; + + + /** + * 省ID + */ + private Long provinceId; + + /** + * 省 + */ + private String province; + + /** + * 城市ID + */ + private Long cityId; + + /** + * 城市 + */ + private String city; + + /** + * 区域ID + */ + private Long areaId; + + /** + * 区 + */ + private String area; + + /** + * 地址 + */ + private String addr; + + /** + * 总值 + */ + private Long total; + + + /** + * 卖家备注 + */ + private String shopRemarks; + + /** + * 支付方式 请参考枚举PayType + */ + private Integer payType; + + /** + * 订单关闭原因 1-超时未支付 2-退款关闭 4-买家取消 15-已通过货到付款交易 + */ + private Integer closeType; + + /** + * 发货时间 + */ + private Date updateTime; + + /** + * 付款时间 + */ + private Date payTime; + + /** + * 发货时间 + */ + private Date deliveryTime; + + /** + * 完成时间 + */ + private Date finallyTime; + + /** + * 取消时间 + */ + private Date cancelTime; + + /** + * 预售发货时间 + */ + private Date bookTime; + + /** + * 是否已支付,1.已支付0.未支付 + */ + private Integer isPayed; + + /** + * 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除 + */ + private Integer deleteStatus; + + /** + * 积分抵扣金额 + */ + private Long scoreAmount; + + /** + * 会员折扣金额 + */ + private Long memberAmount; + + /** + * 平台优惠券优惠金额 + */ + private Long platformCouponAmount; + + /** + * 商家优惠券优惠金额 + */ + private Long shopCouponAmount; + + /** + * 满减优惠金额 + */ + private Long discountAmount; + + /** + * 套餐优惠金额 + */ + private Long shopComboAmount; + + /** + * 平台优惠金额 + */ + private Long platformAmount; + + /** + * 优惠总额 + */ + private Long reduceAmount; + + /** + * 店铺改价优惠金额 + */ + private Long shopChangeFreeAmount; + + /** + * 商家运费减免金额 + */ + private Long freeFreightAmount; + + /** + * 供应商商品发货方式 1.供应商发货 2.仓库发货 + */ + private Integer supplierDeliveryType; + /** + * 商家采购价差(需要商家从结算金额补上采购价的金额) + */ + private Long purchaseSpreadAmount; + /** + * 商品编码 + */ + private String spuCodes; + /** + * sku编码 + */ + private String partyCodes; + /** + * 预售类型 -1.未开启预售 0.全款预售类型 1.定金预售 + */ + private Integer preSaleType; + /** + * 是否为虚拟商品订单 1.是 0.否 + */ + private Integer orderMold; + + /** + * 定金金额 + */ + private Long depositAmount; + /** + * 尾款金额 + */ + private Long balanceAmount; + /** + * 预售发货类型 -1.固定时间 x.尾款支付后x天发货 + */ + private Integer preSaleDeliveryType; + /** + * 预售发货时间 + */ + private Date preSaleDeliveryTime; + /** + * 尾款支付开始时间 + */ + private Date balanceStartTime; + /** + * 尾款支付结束时间 + */ + private Date balanceEndTime; + /** + * 是否已经进行结算 + */ + private Integer isSettled; + + /** + * 自提点id + */ + private Long stationId; + + /** + * 自提点提货码 + */ + private String stationCode; + + /** + * 核销次数 -1.多次核销 0.无需核销 1.单次核销 + */ + private Integer writeOffNum; + + /** + * 多次核销次数 -1.无限次 + */ + private Integer writeOffMultipleCount; + + /** + * 核销开始时间 + */ + private Date writeOffStart; + + /** + * 核销结束时间 + */ + private Date writeOffEnd; + + /** + * 订单核销状态 0.待核销 1.核销完成 + */ + private Integer writeOffStatus; + + @Schema(description = "核销订单", requiredMode = Schema.RequiredMode.REQUIRED) + private List orderVirtualInfoList; + /** + * 支付系统类型 + */ + private Integer paySysType; + + /** + * 订单被核销次数 + */ + private Integer writeOffCount; + + /** + * 用户类型 0:普通会员 1:付费会员 + * 用于会员统计时,判断订单是属于普通会员还是付费会员 + */ + private Integer userType; + + /** + * 新成交订单 1:新成交订单 0:旧用户再次消费订单 + * 用于会员统计时,判断用户是否为新成交用户 + */ + private Integer firstOrder; + + /** + * 新成交供应商订单 1:新成交供应商订单 0:旧用户再次消费订单 + * 用于供应商新用户统计时,判断用户是否为该供应商的新用户 + */ + private Integer firstSupplierOrder; + + /** + * 主单号,在组合商品拆单时会存在 + */ + private Long mainOrderId; + + public Long getMainOrderId() { + return mainOrderId; + } + + public void setMainOrderId(Long mainOrderId) { + this.mainOrderId = mainOrderId; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Long getOrderInvoiceId() { + return orderInvoiceId; + } + + public void setOrderInvoiceId(Long orderInvoiceId) { + this.orderInvoiceId = orderInvoiceId; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getReceivingAddr() { + return receivingAddr; + } + + public void setReceivingAddr(String receivingAddr) { + this.receivingAddr = receivingAddr; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getPayId() { + return payId; + } + + public void setPayId(String payId) { + this.payId = payId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Integer waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getOrderAddrId() { + return orderAddrId; + } + + public void setOrderAddrId(Long orderAddrId) { + this.orderAddrId = orderAddrId; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public String getShopRemarks() { + return shopRemarks; + } + + public void setShopRemarks(String shopRemarks) { + this.shopRemarks = shopRemarks; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getFinallyTime() { + return finallyTime; + } + + public void setFinallyTime(Date finallyTime) { + this.finallyTime = finallyTime; + } + + public Date getCancelTime() { + return cancelTime; + } + + public void setCancelTime(Date cancelTime) { + this.cancelTime = cancelTime; + } + + public Date getBookTime() { + return bookTime; + } + + public void setBookTime(Date bookTime) { + this.bookTime = bookTime; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Integer getDeleteStatus() { + return deleteStatus; + } + + public void setDeleteStatus(Integer deleteStatus) { + this.deleteStatus = deleteStatus; + } + + public Long getScoreAmount() { + return scoreAmount; + } + + public void setScoreAmount(Long scoreAmount) { + this.scoreAmount = scoreAmount; + } + + public Long getMemberAmount() { + return memberAmount; + } + + public void setMemberAmount(Long memberAmount) { + this.memberAmount = memberAmount; + } + + public Long getPlatformCouponAmount() { + return platformCouponAmount; + } + + public void setPlatformCouponAmount(Long platformCouponAmount) { + this.platformCouponAmount = platformCouponAmount; + } + + public Long getShopCouponAmount() { + return shopCouponAmount; + } + + public void setShopCouponAmount(Long shopCouponAmount) { + this.shopCouponAmount = shopCouponAmount; + } + + public Long getDiscountAmount() { + return discountAmount; + } + + public void setDiscountAmount(Long discountAmount) { + this.discountAmount = discountAmount; + } + + public Long getShopComboAmount() { + return shopComboAmount; + } + + public void setShopComboAmount(Long shopComboAmount) { + this.shopComboAmount = shopComboAmount; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Long getShopChangeFreeAmount() { + return shopChangeFreeAmount; + } + + public void setShopChangeFreeAmount(Long shopChangeFreeAmount) { + this.shopChangeFreeAmount = shopChangeFreeAmount; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Long getPurchaseSpreadAmount() { + return purchaseSpreadAmount; + } + + public void setPurchaseSpreadAmount(Long purchaseSpreadAmount) { + this.purchaseSpreadAmount = purchaseSpreadAmount; + } + + public String getSpuCodes() { + return spuCodes; + } + + public void setSpuCodes(String spuCodes) { + this.spuCodes = spuCodes; + } + + public String getPartyCodes() { + return partyCodes; + } + + public void setPartyCodes(String partyCodes) { + this.partyCodes = partyCodes; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Integer getOrderMold() { + return orderMold; + } + + public void setOrderMold(Integer orderMold) { + this.orderMold = orderMold; + } + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Integer getPreSaleDeliveryType() { + return preSaleDeliveryType; + } + + public void setPreSaleDeliveryType(Integer preSaleDeliveryType) { + this.preSaleDeliveryType = preSaleDeliveryType; + } + + public Date getPreSaleDeliveryTime() { + return preSaleDeliveryTime; + } + + public void setPreSaleDeliveryTime(Date preSaleDeliveryTime) { + this.preSaleDeliveryTime = preSaleDeliveryTime; + } + + public Date getBalanceStartTime() { + return balanceStartTime; + } + + public void setBalanceStartTime(Date balanceStartTime) { + this.balanceStartTime = balanceStartTime; + } + + public Date getBalanceEndTime() { + return balanceEndTime; + } + + public void setBalanceEndTime(Date balanceEndTime) { + this.balanceEndTime = balanceEndTime; + } + + public Integer getIsSettled() { + return isSettled; + } + + public void setIsSettled(Integer isSettled) { + this.isSettled = isSettled; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getStationCode() { + return stationCode; + } + + public void setStationCode(String stationCode) { + this.stationCode = stationCode; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public Integer getWriteOffStatus() { + return writeOffStatus; + } + + public void setWriteOffStatus(Integer writeOffStatus) { + this.writeOffStatus = writeOffStatus; + } + + public List getOrderVirtualInfoList() { + return orderVirtualInfoList; + } + + public void setOrderVirtualInfoList(List orderVirtualInfoList) { + this.orderVirtualInfoList = orderVirtualInfoList; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Integer getWriteOffCount() { + return writeOffCount; + } + + public void setWriteOffCount(Integer writeOffCount) { + this.writeOffCount = writeOffCount; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + public Integer getFirstOrder() { + return firstOrder; + } + + public void setFirstOrder(Integer firstOrder) { + this.firstOrder = firstOrder; + } + + public Integer getFirstSupplierOrder() { + return firstSupplierOrder; + } + + public void setFirstSupplierOrder(Integer firstSupplierOrder) { + this.firstSupplierOrder = firstSupplierOrder; + } + + @Override + public String toString() { + return "EsOrderBO{" + + "orderItems=" + orderItems + + ", userId=" + userId + + ", orderId=" + orderId + + ", actualTotal=" + actualTotal + + ", orderScore=" + orderScore + + ", status=" + status + + ", orderType=" + orderType + + ", refundStatus=" + refundStatus + + ", deliveryType=" + deliveryType + + ", shopName='" + shopName + '\'' + + ", shopId=" + shopId + + ", freightAmount=" + freightAmount + + ", createTime=" + createTime + + ", allCount=" + allCount + + ", orderInvoiceId=" + orderInvoiceId + + ", remarks='" + remarks + '\'' + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", receivingAddr='" + receivingAddr + '\'' + + ", postCode='" + postCode + '\'' + + ", payId='" + payId + '\'' + + ", supplierId=" + supplierId + + ", waitPurchase=" + waitPurchase + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", distributionAmount=" + distributionAmount + + ", platformCommission=" + platformCommission + + ", orderAddrId=" + orderAddrId + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", addr='" + addr + '\'' + + ", total=" + total + + ", shopRemarks='" + shopRemarks + '\'' + + ", payType=" + payType + + ", closeType=" + closeType + + ", updateTime=" + updateTime + + ", payTime=" + payTime + + ", deliveryTime=" + deliveryTime + + ", finallyTime=" + finallyTime + + ", cancelTime=" + cancelTime + + ", bookTime=" + bookTime + + ", isPayed=" + isPayed + + ", deleteStatus=" + deleteStatus + + ", scoreAmount=" + scoreAmount + + ", memberAmount=" + memberAmount + + ", platformCouponAmount=" + platformCouponAmount + + ", shopCouponAmount=" + shopCouponAmount + + ", discountAmount=" + discountAmount + + ", shopComboAmount=" + shopComboAmount + + ", platformAmount=" + platformAmount + + ", reduceAmount=" + reduceAmount + + ", shopChangeFreeAmount=" + shopChangeFreeAmount + + ", freeFreightAmount=" + freeFreightAmount + + ", supplierDeliveryType=" + supplierDeliveryType + + ", purchaseSpreadAmount=" + purchaseSpreadAmount + + ", spuCodes='" + spuCodes + '\'' + + ", partyCodes='" + partyCodes + '\'' + + ", preSaleType=" + preSaleType + + ", orderMold=" + orderMold + + ", depositAmount=" + depositAmount + + ", balanceAmount=" + balanceAmount + + ", preSaleDeliveryType=" + preSaleDeliveryType + + ", preSaleDeliveryTime=" + preSaleDeliveryTime + + ", balanceStartTime=" + balanceStartTime + + ", balanceEndTime=" + balanceEndTime + + ", isSettled=" + isSettled + + ", stationId=" + stationId + + ", stationCode='" + stationCode + '\'' + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", writeOffStatus=" + writeOffStatus + + ", orderVirtualInfoList=" + orderVirtualInfoList + + ", paySysType=" + paySysType + + ", writeOffCount=" + writeOffCount + + ", userType=" + userType + + ", firstOrder=" + firstOrder + + ", firstSupplierOrder=" + firstSupplierOrder + + ", mainOrderId=" + mainOrderId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/OrderStatusBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/OrderStatusBO.java new file mode 100644 index 0000000..16ce719 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/OrderStatusBO.java @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.bo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author FrozenWatermelon + * @date 2020/12/30 + */ +public class OrderStatusBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long orderId; + + private Integer status; + + private Integer deliveryType; + + private Integer orderType; + + private Integer orderMold; + + private Long userId; + + private Long supplierId; + private Long shopId; + + /** + * 是否待采购 1.是 0.否 + */ + private Integer waitPurchase; + + /** + * 实付金额 + */ + private Long actualTotal; + + /** + * 商家采购价差(需要商家从结算金额补上采购价的金额) + */ + private Long purchaseSpreadAmount; + /** + * 尾款 + */ + private Long balanceAmount; + + /** + * 定金 + */ + private Long depositAmount; + + /** + * 预售类型 -1.未开启预售 0.全款预售类型 1.定金预售 + */ + private Integer preSaleType; + /** + * 尾款支付结束时间 + */ + private Date balanceEndTime; + /** + * 运费 + */ + private Long freightAmount; + /** + * 减免运费 + */ + private Long platformFreeFreightAmount; + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getBalanceEndTime() { + return balanceEndTime; + } + + public void setBalanceEndTime(Date balanceEndTime) { + this.balanceEndTime = balanceEndTime; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Integer getOrderMold() { + return orderMold; + } + + public void setOrderMold(Integer orderMold) { + this.orderMold = orderMold; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Long getPurchaseSpreadAmount() { + return purchaseSpreadAmount; + } + + public void setPurchaseSpreadAmount(Long purchaseSpreadAmount) { + this.purchaseSpreadAmount = purchaseSpreadAmount; + } + + public Integer getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Integer waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + @Override + public String toString() { + return "OrderStatusBO{" + + "orderId=" + orderId + + ", status=" + status + + ", deliveryType=" + deliveryType + + ", orderType=" + orderType + + ", orderMold=" + orderMold + + ", userId=" + userId + + ", supplierId=" + supplierId + + ", shopId=" + shopId + + ", waitPurchase=" + waitPurchase + + ", actualTotal=" + actualTotal + + ", purchaseSpreadAmount=" + purchaseSpreadAmount + + ", balanceAmount=" + balanceAmount + + ", depositAmount=" + depositAmount + + ", preSaleType=" + preSaleType + + ", balanceEndTime=" + balanceEndTime + + ", freightAmount=" + freightAmount + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/PayRefundBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/PayRefundBO.java new file mode 100644 index 0000000..7706467 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/PayRefundBO.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 订单退款通知 + * @author FrozenWatermelon + * @date 2020/12/8 + */ +public class PayRefundBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 退款单号 + */ + private Long refundId; + + /** + * 关联的支付订单id + */ + private Long orderId; + + /** + * 关联的支付单id + */ + private Long payId; + + /** + * 关联的支付单id + */ + private String payIds; + + /** + * 退款金额 + */ + private Long refundAmount; + /** + * 退回的商家采购金额,通联支付独有 + */ + private Long allinpayRefundPurchaseAmount; + + /** + * 是否直接退款 + */ + private Integer onlyRefund; + + /** + * 是否为未成团而退款的团购订单 + */ + private Integer unSuccessGroupOrder; + /** + * 店铺id + */ + private Long shopId; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getAllinpayRefundPurchaseAmount() { + return allinpayRefundPurchaseAmount; + } + + public void setAllinpayRefundPurchaseAmount(Long allinpayRefundPurchaseAmount) { + this.allinpayRefundPurchaseAmount = allinpayRefundPurchaseAmount; + } + + public String getPayIds() { + + return payIds; + } + + public void setPayIds(String payIds) { + this.payIds = payIds; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Integer getOnlyRefund() { + return onlyRefund; + } + + public void setOnlyRefund(Integer onlyRefund) { + this.onlyRefund = onlyRefund; + } + + public Integer getUnSuccessGroupOrder() { + return unSuccessGroupOrder; + } + + public void setUnSuccessGroupOrder(Integer unSuccessGroupOrder) { + this.unSuccessGroupOrder = unSuccessGroupOrder; + } + + @Override + public String toString() { + return "PayRefundBO{" + + "refundId=" + refundId + + ", orderId=" + orderId + + ", payId=" + payId + + ", payIds='" + payIds + '\'' + + ", refundAmount=" + refundAmount + + ", allinpayRefundPurchaseAmount=" + allinpayRefundPurchaseAmount + + ", onlyRefund=" + onlyRefund + + ", unSuccessGroupOrder=" + unSuccessGroupOrder + + ", shopId=" + shopId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/RefundStockOperateBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/RefundStockOperateBO.java new file mode 100644 index 0000000..ea44c9e --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/RefundStockOperateBO.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.bo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 订单退款操作BO + * @author FrozenWatermelon + * @date 2020/12/8 + */ +public class RefundStockOperateBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 是否供应商代销商品,1.是 0.否 + */ + private List refundReductionStockList; + + private Long id; + + public RefundStockOperateBO() { + } + + public RefundStockOperateBO(List refundReductionStockList, Long id) { + this.refundReductionStockList = refundReductionStockList; + this.id = id; + } + + public List getRefundReductionStockList() { + return refundReductionStockList; + } + + public void setRefundReductionStockList(List refundReductionStockList) { + this.refundReductionStockList = refundReductionStockList; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + @Override + public String toString() { + return "RefundStockOperateBO{" + + "refundReductionStockList=" + refundReductionStockList + + ", id=" + id + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/OrderCloseType.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/OrderCloseType.java new file mode 100644 index 0000000..d9a9c2c --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/OrderCloseType.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.constant; + +/** + * 订单关闭 + * + * @author YXF + * * @date 2021-01-27 09:10:00 + */ +public enum OrderCloseType { + + /** + * 超时未支付 + */ + OVERTIME(1), + /** + * 退款关闭 + */ + REFUND(2), + + /** + * 买家取消 + */ + BUYER(4), + + /** + * 已通过货到付款交易 + */ + DELIVERY(15), + + /** + * 预售尾款未支付取消 + */ + PRE_SALE_FAIL(16); + + private final Integer code; + + public Integer value() { + return code; + } + + OrderCloseType(Integer code) { + this.code = code; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/PayStatus.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/PayStatus.java new file mode 100644 index 0000000..dec2c53 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/PayStatus.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.constant; + +import java.util.Objects; + +/** + * 支付状态 + * + * @author FrozenWatermelon + */ +public enum PayStatus { + + /** + * 直接进行退款 + */ + REFUND(-1, "退款"), + + /** + * 未支付 + */ + UNPAY(0, "未支付"), + + /** + * 已支付 + */ + PAYED(1, "已支付"); + + private final Integer num; + private final String name; + + public Integer value() { + return num; + } + + PayStatus(Integer num, String name) { + this.num = num; + this.name = name; + } + + public static PayStatus instance(Integer value) { + PayStatus[] enums = values(); + for (PayStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + + public static String getStatusName(Integer value) { + PayStatus payStatus = instance(value); + if (Objects.isNull(payStatus)) { + return null; + } + return payStatus.name; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/ReturnProcessStatusEnum.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/ReturnProcessStatusEnum.java new file mode 100644 index 0000000..862f02c --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/ReturnProcessStatusEnum.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.constant; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +public enum ReturnProcessStatusEnum { + + /** + * 退款申请中 + */ + APPLY(1), + + /** + * 卖家处理退款 + */ + PROCESSING(2), + + /** + * 买家已发货 + */ + CONSIGNMENT(3), + + /** + * 卖家已收货 + */ + RECEIVE(4), + + /** + * 退款成功 + */ + SUCCESS(5), + + /** + * 退款关闭 + */ + FAIL(-1); + + private final Integer num; + + ReturnProcessStatusEnum(Integer num) { + this.num = num; + } + + public Integer value() { + return num; + } + + public static ReturnProcessStatusEnum instance(Integer value) { + ReturnProcessStatusEnum[] enums = values(); + for (ReturnProcessStatusEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static List closeStatus() { + return Arrays.asList(ReturnProcessStatusEnum.APPLY.value(),ReturnProcessStatusEnum.PROCESSING.value(), + ReturnProcessStatusEnum.CONSIGNMENT.value(),ReturnProcessStatusEnum.RECEIVE.value()); + } + + public static Boolean shouldClous(Integer status) { + if (Objects.equals(ReturnProcessStatusEnum.APPLY.value(), status) || Objects.equals(ReturnProcessStatusEnum.PROCESSING.value(), status) + || Objects.equals(ReturnProcessStatusEnum.CONSIGNMENT.value(), status) || Objects.equals(ReturnProcessStatusEnum.RECEIVE.value(), status)) { + return true; + } + return false; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/ShopCartItemDiscountType.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/ShopCartItemDiscountType.java new file mode 100644 index 0000000..16149af --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/ShopCartItemDiscountType.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.constant; + +/** + * @author xxw + * @date 2022/9/21 15:09 + */ +public enum ShopCartItemDiscountType { + /** + * 无 + */ + NO(0), + + /** + * 满减 + */ + Full_REDUCTION(1), + + /** + * 套餐 + */ + COMBO(2); + + private final Integer value; + + public Integer value() { + return this.value; + } + + ShopCartItemDiscountType(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/StockModeEnum.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/StockModeEnum.java new file mode 100644 index 0000000..6b8acfa --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/StockModeEnum.java @@ -0,0 +1,38 @@ +package com.tmerclub.cloud.common.order.constant; + +/** + * 库存模式 + * @author admin + */ +public enum StockModeEnum { + /** + * 共享总部库存 + */ + ALL_STOCK(1, "共享总部库存"), + /** + * 独立销售库存 + */ + SINGLE_STOCK(2, "独立销售库存"); + + private final Integer num; + private final String name; + + public Integer value() { + return num; + } + + StockModeEnum(Integer num, String name) { + this.num = num; + this.name = name; + } + + public static StockModeEnum instance(Integer value) { + StockModeEnum[] enums = values(); + for (StockModeEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/AllotOrderSearchDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/AllotOrderSearchDTO.java new file mode 100644 index 0000000..b037100 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/AllotOrderSearchDTO.java @@ -0,0 +1,96 @@ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @author gaozijie + * @since 2023-11-27 + */ +public class AllotOrderSearchDTO { + + @Schema(description = "调拨订单id") + private Long allotOrderId; + + @Schema(description = "状态(0:已作废, 1:待入库, 2:部分入库, 3:已完成)") + private Integer status; + + @Hidden + @Schema(description = "开始页") + private Integer pageNum; + + @Hidden + @Schema(description = "每页大小") + private Integer pageSize; + + @Hidden + @Schema(description = "店铺id") + private Long shopId; + + @Hidden + @Schema(description = "系统类型(1:商家端, 3:供应商端)") + private Integer sysType; + + public AllotOrderSearchDTO() { + } + + public Long getAllotOrderId() { + return allotOrderId; + } + + public void setAllotOrderId(Long allotOrderId) { + this.allotOrderId = allotOrderId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + @Override + public String toString() { + return "AllotOrderSearchDTO{" + + "allotOrderId=" + allotOrderId + + ", status=" + status + + ", pageNum=" + pageNum + + ", pageSize=" + pageSize + + ", shopId=" + shopId + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/AreaDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/AreaDTO.java new file mode 100644 index 0000000..f98b779 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/AreaDTO.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 省市区地区信息DTO + * + * @author YXF + * @date 2020-11-25 15:16:14 + */ +public class AreaDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long areaId; + + @NotNull(message = "地址不能为空") + @Schema(description = "地址") + private String areaName; + + @NotNull(message = "上级地址不能为空") + @Schema(description = "上级地址") + private Long parentId; + + @NotNull(message = "等级不能为空") + @Schema(description = "等级(从1开始)") + private Integer level; + + public AreaDTO() { + } + + public AreaDTO(Long areaId, String areaName, Long parentId, Integer level) { + this.areaId = areaId; + this.areaName = areaName; + this.parentId = parentId; + this.level = level; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getAreaName() { + return areaName; + } + + public void setAreaName(String areaName) { + this.areaName = areaName; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + @Override + public String toString() { + return "AreaDTO{" + + "areaId=" + areaId + + ",areaName=" + areaName + + ",parentId=" + parentId + + ",level=" + level + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/DvyTypeDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/DvyTypeDTO.java new file mode 100644 index 0000000..07ca5f1 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/DvyTypeDTO.java @@ -0,0 +1,87 @@ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author lanhai + */ +public class DvyTypeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull(message = "店铺id不能为空") + private Long shopId; + + @Schema(description = "用户选择的自提点id - 自提参数") + private Long stationId; + + @Schema(description = "纬度 - 自提参数") + private Double lat; + + @Schema(description = "经度 - 自提参数") + private Double lng; + @NotNull(message = "配送方式不能为空") + @Schema(description = "配送类型 1:快递 2:自提 3:无需快递 4:同城配送") + private Integer dvyType; + + public DvyTypeDTO() { + } + + public DvyTypeDTO(Long shopId, Integer dvyType) { + this.shopId = shopId; + this.dvyType = dvyType; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getDvyType() { + return dvyType; + } + + public void setDvyType(Integer dvyType) { + this.dvyType = dvyType; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + @Override + public String toString() { + return "DvyTypeDTO{" + + "shopId=" + shopId + + ", stationId=" + stationId + + ", lat=" + lat + + ", lng=" + lng + + ", dvyType=" + dvyType + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderDTO.java new file mode 100644 index 0000000..8382538 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderDTO.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单参数 + * + * @author FrozenWatermelon + * @date 2020-12-04 11:27:35 + */ +public class OrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "立即购买时提交的商品项,如果该值为空,则说明是从购物车进入,如果该值不为空则说明为立即购买") + private ShopCartItemDTO shopCartItem; + + @Schema(description = "地址ID,0为默认地址") + @NotNull(message = "地址不能为空") + private Long addrId; + + @Schema(description = "多店铺的商品配送方式") + private List dvyTypes; + + @Schema(description = "用户是否改变了优惠券的选择,如果用户改变了优惠券的选择,则完全根据传入参数进行优惠券的选择") + private Integer userChangeCoupon; + + @Schema(description = "优惠券id数组") + private List couponIds; + + @Schema(description = "用户是否选择积分抵现(0不使用 1使用 默认不使用)") + private Integer isScorePay; + + @Schema(description = "用户是否自己选择使用多少积分,为空则为默认全部使用") + private Long userUseScore; + + @Schema(description = "支付起始时间") + private Date beginPayTime; + + @Schema(description = "是否是成功支付状态") + private Boolean isSuccessPayStatus; + + public Long getAddrId() { + return addrId; + } + + public void setAddrId(Long addrId) { + this.addrId = addrId; + } + + public Integer getUserChangeCoupon() { + return userChangeCoupon; + } + + public void setUserChangeCoupon(Integer userChangeCoupon) { + this.userChangeCoupon = userChangeCoupon; + } + + public List getCouponIds() { + return couponIds; + } + + public void setCouponIds(List couponIds) { + this.couponIds = couponIds; + } + + public Integer getIsScorePay() { + return isScorePay; + } + + public void setIsScorePay(Integer isScorePay) { + this.isScorePay = isScorePay; + } + + public Long getUserUseScore() { + return userUseScore; + } + + public void setUserUseScore(Long userUseScore) { + this.userUseScore = userUseScore; + } + + public ShopCartItemDTO getShopCartItem() { + return shopCartItem; + } + + public void setShopCartItem(ShopCartItemDTO shopCartItem) { + this.shopCartItem = shopCartItem; + } + + public Date getBeginPayTime() { + return beginPayTime; + } + + public void setBeginPayTime(Date beginPayTime) { + this.beginPayTime = beginPayTime; + } + + public Boolean getSuccessPayStatus() { + return isSuccessPayStatus; + } + + public void setSuccessPayStatus(Boolean successPayStatus) { + isSuccessPayStatus = successPayStatus; + } + + public void setDvyTypes(List dvyTypes) { + this.dvyTypes = dvyTypes; + } + + public List getDvyTypes() { + return dvyTypes; + } + + @Override + public String toString() { + return "OrderDTO{" + + "shopCartItem=" + shopCartItem + + ", addrId=" + addrId + + ", dvyTypes=" + dvyTypes + + ", userChangeCoupon=" + userChangeCoupon + + ", couponIds=" + couponIds + + ", isScorePay=" + isScorePay + + ", userUseScore=" + userUseScore + + ", beginPayTime=" + beginPayTime + + ", isSuccessPayStatus=" + isSuccessPayStatus + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderInvoiceSearchDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderInvoiceSearchDTO.java new file mode 100644 index 0000000..4fcdb22 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderInvoiceSearchDTO.java @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author Pineapple + * @date 2021/8/2 8:52 + */ +public class OrderInvoiceSearchDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单发票ID") + private Long orderInvoiceId; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "发票类型 1.电子普通发票") + private Integer invoiceType; + + @Schema(description = "抬头类型 1.单位 2.个人") + private Integer headerType; + + @Schema(description = "抬头名称") + private String headerName; + + @Schema(description = "发票税号") + private String invoiceTaxNumber; + + @Schema(description = "发票内容 1.商品明细") + private Integer invoiceContext; + + @Schema(description = "发票状态 1.申请中 2.已开票") + private Integer invoiceState; + + @Schema(description = "文件id") + private Long fileId; + + @Schema(description = "申请时间") + private Date applicationTime; + + @Schema(description = "上传时间") + private Date uploadTime; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "开始页") + private Integer pageNum; + + @Schema(description = "每页大小") + private Integer pageSize; + + public Long getOrderInvoiceId() { + return orderInvoiceId; + } + + public void setOrderInvoiceId(Long orderInvoiceId) { + this.orderInvoiceId = orderInvoiceId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getInvoiceType() { + return invoiceType; + } + + public void setInvoiceType(Integer invoiceType) { + this.invoiceType = invoiceType; + } + + public Integer getHeaderType() { + return headerType; + } + + public void setHeaderType(Integer headerType) { + this.headerType = headerType; + } + + public String getHeaderName() { + return headerName; + } + + public void setHeaderName(String headerName) { + this.headerName = headerName; + } + + public String getInvoiceTaxNumber() { + return invoiceTaxNumber; + } + + public void setInvoiceTaxNumber(String invoiceTaxNumber) { + this.invoiceTaxNumber = invoiceTaxNumber; + } + + public Integer getInvoiceContext() { + return invoiceContext; + } + + public void setInvoiceContext(Integer invoiceContext) { + this.invoiceContext = invoiceContext; + } + + public Integer getInvoiceState() { + return invoiceState; + } + + public void setInvoiceState(Integer invoiceState) { + this.invoiceState = invoiceState; + } + + public Long getFileId() { + return fileId; + } + + public void setFileId(Long fileId) { + this.fileId = fileId; + } + + public Date getApplicationTime() { + return applicationTime; + } + + public void setApplicationTime(Date applicationTime) { + this.applicationTime = applicationTime; + } + + public Date getUploadTime() { + return uploadTime; + } + + public void setUploadTime(Date uploadTime) { + this.uploadTime = uploadTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + @Override + public String toString() { + return "OrderInvoiceSearchDTO{" + + "orderInvoiceId=" + orderInvoiceId + + ", orderId=" + orderId + + ", invoiceType=" + invoiceType + + ", headerType=" + headerType + + ", headerName='" + headerName + '\'' + + ", invoiceTaxNumber='" + invoiceTaxNumber + '\'' + + ", invoiceContext=" + invoiceContext + + ", invoiceState=" + invoiceState + + ", fileId=" + fileId + + ", applicationTime=" + applicationTime + + ", uploadTime=" + uploadTime + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", pageNum=" + pageNum + + ", pageSize=" + pageSize + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderRefundSearchDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderRefundSearchDTO.java new file mode 100644 index 0000000..4b23936 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderRefundSearchDTO.java @@ -0,0 +1,388 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + + +/** + * @author FrozenWatermelon + */ +public class OrderRefundSearchDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单号") + private Long orderId; + + @Schema(description = "订单号id列表") + private List orderIds; + + @Schema(description = "退款单类型(1:整单退款,2:单个物品退款)") + private Integer refundType; + + @Schema(description = "申请类型:1,仅退款,2退款退货") + private Integer applyType; + + @Schema(description = "手机号码(默认当前订单手机号码)") + private String buyerMobile; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Schema(description = "退款申请开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date beginTime; + + @Schema(description = "退款申请结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "同意退款时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date decisionTime; + + @Schema(description = "同意退款时间开始") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date decisionStartTime; + + @Schema(description = "同意退款时间结束") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date decisionEndTime; + + @Schema(description = "处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭 6.平台介入中)") + private Integer returnMoneySts; + + @Schema(description = "处理退款状态列表:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)") + private List returnMoneyStsList; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "订单类型 1团购订单 2秒杀订单 3积分订单") + private Integer orderType; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "供应商id列表") + private List supplierIds; + + @Schema(description = "店铺id列表") + private List shopIds; + + /** + * 不等于该退款状态 + */ + private Integer returnMoneyStsExclude; + + @Schema(description = "平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功") + private Integer platformInterventionStatus; + + @Schema(description = "申请介入时间") + private Date applyInterventionTime; + + @Schema(description = "开始页") + private Integer pageNum; + + @Schema(description = "每页大小") + private Integer pageSize; + + private Integer sysType; + + /** + * 响应数据字段数组 + */ + private String[] fetchSource; + + public Integer getPlatformInterventionStatus() { + return platformInterventionStatus; + } + + public void setPlatformInterventionStatus(Integer platformInterventionStatus) { + this.platformInterventionStatus = platformInterventionStatus; + } + + public Date getApplyInterventionTime() { + return applyInterventionTime; + } + + public void setApplyInterventionTime(Date applyInterventionTime) { + this.applyInterventionTime = applyInterventionTime; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getRefundType() { + return refundType; + } + + public void setRefundType(Integer refundType) { + this.refundType = refundType; + } + + public Integer getApplyType() { + return applyType; + } + + public void setApplyType(Integer applyType) { + this.applyType = applyType; + } + + public String getBuyerMobile() { + return buyerMobile; + } + + public void setBuyerMobile(String buyerMobile) { + this.buyerMobile = buyerMobile; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Date getBeginTime() { + return beginTime; + } + + public void setBeginTime(Date beginTime) { + this.beginTime = beginTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Date getDecisionTime() { + return decisionTime; + } + + public void setDecisionTime(Date decisionTime) { + this.decisionTime = decisionTime; + } + + public Date getDecisionStartTime() { + return decisionStartTime; + } + + public void setDecisionStartTime(Date decisionStartTime) { + this.decisionStartTime = decisionStartTime; + } + + public Date getDecisionEndTime() { + return decisionEndTime; + } + + public void setDecisionEndTime(Date decisionEndTime) { + this.decisionEndTime = decisionEndTime; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public String[] getFetchSource() { + return fetchSource; + } + + public void setFetchSource(String[] fetchSource) { + this.fetchSource = fetchSource; + } + + public List getReturnMoneyStsList() { + return returnMoneyStsList; + } + + public void setReturnMoneyStsList(List returnMoneyStsList) { + this.returnMoneyStsList = returnMoneyStsList; + } + + public List getOrderIds() { + return orderIds; + } + + public void setOrderIds(List orderIds) { + this.orderIds = orderIds; + } + + public Integer getReturnMoneyStsExclude() { + return returnMoneyStsExclude; + } + + public void setReturnMoneyStsExclude(Integer returnMoneyStsExclude) { + this.returnMoneyStsExclude = returnMoneyStsExclude; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public List getSupplierIds() { + return supplierIds; + } + + public void setSupplierIds(List supplierIds) { + this.supplierIds = supplierIds; + } + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + @Override + public String toString() { + return "OrderRefundSearchDTO{" + + "orderId=" + orderId + + ", orderIds=" + orderIds + + ", refundType=" + refundType + + ", applyType=" + applyType + + ", buyerMobile='" + buyerMobile + '\'' + + ", userId=" + userId + + ", shopId=" + shopId + + ", refundId=" + refundId + + ", startTime=" + startTime + + ", beginTime=" + beginTime + + ", endTime=" + endTime + + ", decisionTime=" + decisionTime + + ", decisionStartTime=" + decisionStartTime + + ", decisionEndTime=" + decisionEndTime + + ", returnMoneySts=" + returnMoneySts + + ", returnMoneyStsList=" + returnMoneyStsList + + ", shopName='" + shopName + '\'' + + ", orderType=" + orderType + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", supplierIds=" + supplierIds + + ", shopIds=" + shopIds + + ", returnMoneyStsExclude=" + returnMoneyStsExclude + + ", pageNum=" + pageNum + + ", pageSize=" + pageSize + + ", sysType=" + sysType + + ", fetchSource=" + Arrays.toString(fetchSource) + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderShopDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderShopDTO.java new file mode 100644 index 0000000..7cc0b86 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderShopDTO.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + */ +public class OrderShopDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺ID + **/ + @Schema(description = "店铺id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + + /** + * 订单备注信息 + */ + @Schema(description = "订单备注信息", requiredMode = Schema.RequiredMode.REQUIRED) + private String remarks; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "OrderShopDTO{" + + "shopId=" + shopId + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderSubmitShopCartItemDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderSubmitShopCartItemDTO.java new file mode 100644 index 0000000..27f3ab8 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderSubmitShopCartItemDTO.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serializable; +import java.util.List; + +/** + * 购物车物品参数 + * + * @author FrozenWatermelon + * @date 2020-12-04 11:27:35 + */ +public class OrderSubmitShopCartItemDTO implements Serializable { + public OrderSubmitShopCartItemDTO() { + } + + public OrderSubmitShopCartItemDTO(Long userId, List shopCartItemIds) { + this.userId = userId; + this.shopCartItemIds = shopCartItemIds; + } + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "购物车项id列表") + private List shopCartItemIds; + + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public List getShopCartItemIds() { + return shopCartItemIds; + } + + public void setShopCartItemIds(List shopCartItemIds) { + this.shopCartItemIds = shopCartItemIds; + } + + @Override + public String toString() { + return "OrderSubmitShopCartItemDTO{" + + "userId=" + userId + + ", shopCartItemIds=" + shopCartItemIds + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderVirtualInfoDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderVirtualInfoDTO.java new file mode 100644 index 0000000..6772589 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderVirtualInfoDTO.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单虚拟商品信息DTO + * + * @author FrozenWatermelon + * @date 2023-02-24 13:55:55 + */ +public class OrderVirtualInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long orderVirtualInfoId; + + @Schema(description = "订单ID") + private Long orderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "核销门店id") + private Long stationId; + + @Schema(description = "核销码") + private String writeOffCode; + + @Schema(description = "是否核销 1.已核销 0.未核销") + private Integer isWriteOff; + + @Schema(description = "核销时间") + private Date writeOffTime; + + @Schema(description = "剩余核销次数 -1.无限次") + private Integer writeOffMultipleCount; + + public Long getOrderVirtualInfoId() { + return orderVirtualInfoId; + } + + public void setOrderVirtualInfoId(Long orderVirtualInfoId) { + this.orderVirtualInfoId = orderVirtualInfoId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getWriteOffCode() { + return writeOffCode; + } + + public void setWriteOffCode(String writeOffCode) { + this.writeOffCode = writeOffCode; + } + + public Integer getIsWriteOff() { + return isWriteOff; + } + + public void setIsWriteOff(Integer isWriteOff) { + this.isWriteOff = isWriteOff; + } + + public Date getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(Date writeOffTime) { + this.writeOffTime = writeOffTime; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + @Override + public String toString() { + return "OrderVirtualInfoDTO{" + + "orderVirtualInfoId=" + orderVirtualInfoId + + ",orderId=" + orderId + + ",shopId=" + shopId + + ",stationId=" + stationId + + ",writeOffCode=" + writeOffCode + + ",isWriteOff=" + isWriteOff + + ",writeOffTime=" + writeOffTime + + ",writeOffMultipleCount=" + writeOffMultipleCount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/VirtualRemarkDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/VirtualRemarkDTO.java new file mode 100644 index 0000000..2bb0bf3 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/VirtualRemarkDTO.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 虚拟商品留言信息 + * + * @author lhd + */ +public class VirtualRemarkDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品id + */ + @Schema(description = "商品id") + private Long spuId; + /** + * 留言标题 + */ + @Schema(description = "留言标题", requiredMode = Schema.RequiredMode.REQUIRED) + private String name; + /** + * 留言内容 + */ + @Schema(description = "留言内容", requiredMode = Schema.RequiredMode.REQUIRED) + private String value; + + /** + * 是否必填 + */ + @Schema(description = "是否必填", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean isRequired; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public Boolean getRequired() { + return isRequired; + } + + public void setRequired(Boolean required) { + isRequired = required; + } + + @Override + public String toString() { + return "VirtualRemarkDTO{" + + "spuId=" + spuId + + ", name='" + name + '\'' + + ", value='" + value + '\'' + + ", isRequired=" + isRequired + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/feign/OrderShopDetailFeignClient.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/feign/OrderShopDetailFeignClient.java new file mode 100644 index 0000000..e48352f --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/feign/OrderShopDetailFeignClient.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.feign; + +import com.tmerclub.cloud.common.order.vo.ShopInfoInOrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface OrderShopDetailFeignClient { + + + /** + * 根据店铺id获取店铺在订单当中的信息 + * + * @param shopId 店铺id + * @return 店铺名称 + */ + ServerResponseEntity getShopInfoInOrderByShopId(Long shopId); + +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/util/OrderLangUtil.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/util/OrderLangUtil.java new file mode 100644 index 0000000..f878dc2 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/util/OrderLangUtil.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.util; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.util.LangUtil; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 订单语言工具类 + * @author YXF + * @date 2021/05/19 + */ +public class OrderLangUtil { + + /** + * 订单项数据国际化 + * @param orderItemList 订单项 + */ + public static void orderItemVOList(List orderItemList) { + for (OrderItemVO orderItemVO : orderItemList) { + handleOrderItemVO(orderItemVO); + } + } + + /** + * 退款订单项数据国际化 + * @param orderItemList 订单项 + */ + public static void orderRefundVOList(List orderItemList) { + for (RefundOrderItemVO orderItemVO : orderItemList) { + handleOrderItem(orderItemVO); + } + } + + + /** + * 购物车数据国际化 + * @param shopCartItem 订单项 + */ + public static void shopCartItemLang(ShopCartItemVO shopCartItem) { + shopCartItem.setSpuName(getSpuName(shopCartItem.getSpuLangList())); + shopCartItem.setSkuName(getSkuName(shopCartItem.getSkuLangList())); + } + + + /** + * 购物车数据国际化 + * @param shopCartItems 订单项 + */ + public static void shopCartItemList(List shopCartItems) { + for (ShopCartItemVO shopCartItem : shopCartItems) { + shopCartItemLang(shopCartItem); + } + } + + /** + * es订单项数据国际化 + * @param orderItems 订单项 + */ + public static void esOrderList(List orderItems) { + for (EsOrderItemVO orderItem : orderItems) { + handleEsOrderItem(orderItem); + } + } + + + /** + * es订单项数据国际化 + * @param list + */ + public static void esOrderLang(List list) { + for (EsOrderVO esOrderVO : list) { + esOrderList(esOrderVO.getOrderItems()); + } + } + + + /** + * 处理退款订单项信息 + * @param orderItem 订单项国际化信息列表 + */ + public static void handleOrderItem(RefundOrderItemVO orderItem) { + OrderItemLangVO orderItemLangVO = handleOrderItemLangVO(orderItem.getOrderItemLangList()); + if (Objects.isNull(orderItemLangVO)) { + return; + } + orderItem.setSpuName(orderItemLangVO.getSpuName()); + orderItem.setSkuName(orderItemLangVO.getSkuName()); + orderItem.setOrderItemLangList(null); + } + + /** + * 处理订单项信息 + * @param orderItem 订单项国际化信息列表 + */ + private static void handleOrderItemVO(OrderItemVO orderItem) { + OrderItemLangVO orderItemLangVO = handleOrderItemLangVO(orderItem.getOrderItemLangList()); + orderItem.setSpuName(orderItemLangVO.getSpuName()); + orderItem.setSkuName(orderItemLangVO.getSkuName()); + orderItem.setOrderItemLangList(null); + } + + + /** + * 处理es订单项信息 + * @param orderItem 订单项国际化信息列表 + */ + private static void handleEsOrderItem(EsOrderItemVO orderItem) { + OrderItemLangVO orderItemLangVO = handleOrderItemLangVO(orderItem.getOrderItemLangList()); + orderItem.setSpuName(orderItemLangVO.getSpuName()); + orderItem.setSkuName(orderItemLangVO.getSkuName()); + orderItem.setOrderItemLangList(null); + } + + /** + * 处理订单项语言信息 + * @param orderItemLangList 订单项国际化信息列表 + */ + public static OrderItemLangVO handleOrderItemLangVO(List orderItemLangList) { + Map spuNameMap = orderItemLangList.stream().collect(Collectors.toMap(OrderItemLangVO::getLang, o -> o)); + OrderItemLangVO orderItemLangVO = spuNameMap.get(I18nMessage.getLang()); + if (Objects.isNull(orderItemLangVO)) { + orderItemLangVO = spuNameMap.get(Constant.DEFAULT_LANG); + } + return orderItemLangVO; + } + + /** + * 获取spu名称 + * @param orderSpuLangList spu国际化信息列表 + */ + public static String getSpuName(List orderSpuLangList) { + Map spuMap = orderSpuLangList.stream() + .filter(orderSpuLangVO -> StrUtil.isNotBlank(orderSpuLangVO.getSpuName())) + .collect(Collectors.toMap(OrderSpuLangVO::getLang, OrderSpuLangVO::getSpuName)); + return LangUtil.getLangValue(spuMap); + } + + /** + * 获取sku名称 + * @param orderSkuLangList sku国际化信息列表 + */ + public static String getSkuName(List orderSkuLangList) { + Map spuMap = orderSkuLangList.stream() + .filter(orderSkuLangVO -> StrUtil.isNotBlank(orderSkuLangVO.getSkuName())) + .collect(Collectors.toMap(OrderSkuLangVO::getLang, OrderSkuLangVO::getSkuName)); + return LangUtil.getLangValue(spuMap); + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/AreaVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/AreaVO.java new file mode 100644 index 0000000..22a34f0 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/AreaVO.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 省市区地区信息VO + * + * @author YXF + * @date 2020-11-25 15:16:14 + */ +public class AreaVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long areaId; + + @Schema(description = "地址") + private String areaName; + + @Schema(description = "上级地址") + private Long parentId; + + @Schema(description = "等级(从1开始)") + private Integer level; + + private Integer check; + + /** + * 下级地址集合 + */ + private List areas; + + /** + * 下级地址的areaId + */ + private List areaIds; + + public Long getAreaId() { + return areaId; + } + + public Integer getCheck() { + return check; + } + + public void setCheck(Integer check) { + this.check = check; + } + + public List getAreas() { + return areas; + } + + public void setAreas(List areas) { + this.areas = areas; + } + + public List getAreaIds() { + return areaIds; + } + + public void setAreaIds(List areaIds) { + this.areaIds = areaIds; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getAreaName() { + return areaName; + } + + public void setAreaName(String areaName) { + this.areaName = areaName; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + @Override + public String toString() { + return "AreaDTO{" + + "areaId=" + areaId + + ", areaName='" + areaName + '\'' + + ", parentId=" + parentId + + ", level=" + level + + ", check=" + check + + ", areas=" + areas + + ", areaIds=" + areaIds + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/CouponOrderVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/CouponOrderVO.java new file mode 100644 index 0000000..afe4bd9 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/CouponOrderVO.java @@ -0,0 +1,252 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/9 + */ +public class CouponOrderVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "优惠券ID") + private Long couponId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "优惠券名称") + private String couponName; + + @Schema(description = "使用条件") + private Long cashCondition; + + @Schema(description = "减免金额") + private Long reduceAmount; + + @Schema(description = "折扣额度") + private Double couponDiscount; + + @Schema(description = "开始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; + + @Schema(description = "指定的商品id") + private List spuIds; + + @Schema(description = "适用商品类型 0全部商品参与 1指定商品参与") + private Integer suitableProdType; + + @Schema(description = "是否可用") + private Boolean canUse; + + @Schema(description = "是否选中") + private Boolean isChoose; + + @Schema(description = "优惠类型 1:代金券 2:折扣券 3:兑换券") + private Integer couponType; + + @Schema(description = "用户优惠券id") + private Long couponUserId; + + /** + * 使用该优惠券的订单id + */ + private Long orderId; + /** + * 使用该优惠券的订单ids + */ + private List orderIds; + + /** + * 可用优惠券的商品实际金额 + */ + private Long prodCanUseCouponActualTotal; + + /** + * 优惠券优惠金额 + */ + private Long couponReduce; + + public List getOrderIds() { + return orderIds; + } + + public void setOrderIds(List orderIds) { + this.orderIds = orderIds; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getCouponName() { + return couponName; + } + + public void setCouponName(String couponName) { + this.couponName = couponName; + } + + public Long getCashCondition() { + return cashCondition; + } + + public void setCashCondition(Long cashCondition) { + this.cashCondition = cashCondition; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Double getCouponDiscount() { + return couponDiscount; + } + + public void setCouponDiscount(Double couponDiscount) { + this.couponDiscount = couponDiscount; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public Integer getSuitableProdType() { + return suitableProdType; + } + + public void setSuitableProdType(Integer suitableProdType) { + this.suitableProdType = suitableProdType; + } + + public Boolean getCanUse() { + return canUse; + } + + public void setCanUse(Boolean canUse) { + this.canUse = canUse; + } + + public Boolean getChoose() { + return isChoose; + } + + public void setChoose(Boolean choose) { + isChoose = choose; + } + + public Integer getCouponType() { + return couponType; + } + + public void setCouponType(Integer couponType) { + this.couponType = couponType; + } + + public Long getCouponUserId() { + return couponUserId; + } + + public void setCouponUserId(Long couponUserId) { + this.couponUserId = couponUserId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getProdCanUseCouponActualTotal() { + return prodCanUseCouponActualTotal; + } + + public void setProdCanUseCouponActualTotal(Long prodCanUseCouponActualTotal) { + this.prodCanUseCouponActualTotal = prodCanUseCouponActualTotal; + } + + public Long getCouponReduce() { + return couponReduce; + } + + public void setCouponReduce(Long couponReduce) { + this.couponReduce = couponReduce; + } + + @Override + public String toString() { + return "CouponOrderVO{" + + "couponId=" + couponId + + ", shopId=" + shopId + + ", couponName='" + couponName + '\'' + + ", cashCondition=" + cashCondition + + ", reduceAmount=" + reduceAmount + + ", couponDiscount=" + couponDiscount + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", spuIds=" + spuIds + + ", suitableProdType=" + suitableProdType + + ", canUse=" + canUse + + ", isChoose=" + isChoose + + ", couponType=" + couponType + + ", couponUserId=" + couponUserId + + ", orderId=" + orderId + + ", orderIds=" + orderIds + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/DiscountOrderVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/DiscountOrderVO.java new file mode 100644 index 0000000..5b24206 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/DiscountOrderVO.java @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 满减满折优惠VO + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:38 + */ +public class DiscountOrderVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "满减满折优惠id") + private Long discountId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "活动名称") + private String discountName; + + @Schema(description = "枚举DiscountRule(0 满钱减钱 3满件打折)") + private Integer discountRule; + + @Schema(description = "减免类型 0按满足最高层级减一次 1每满一次减一次") + private Integer discountType; + + @Schema(description = "适用商品类型 0全部商品参与 1指定商品参与") + private Integer suitableSpuType; + + @Schema(description = "最多减多少") + private Long maxReduceAmount; + + @Schema(description = "开始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; + + @Schema(description = "活动状态:(0:关闭、1:开启、2:违规下线、3:平台审核)") + private Integer status; + + @Schema(description = "手机端活动图片") + private String mobilePic; + + @Schema(description = "pc端活动列表图片") + private String pcPic; + + @Schema(description = "pc端活动背景图片") + private String pcBackgroundPic; + + @Schema(description = "活动项") + private List discountItems; + + + @Schema(description = "可用商品列表,如果为全部则为空") + private List spuIds; + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getDiscountName() { + return discountName; + } + + public void setDiscountName(String discountName) { + this.discountName = discountName; + } + + public Integer getDiscountRule() { + return discountRule; + } + + public void setDiscountRule(Integer discountRule) { + this.discountRule = discountRule; + } + + public Integer getDiscountType() { + return discountType; + } + + public void setDiscountType(Integer discountType) { + this.discountType = discountType; + } + + public Integer getSuitableSpuType() { + return suitableSpuType; + } + + public void setSuitableSpuType(Integer suitableSpuType) { + this.suitableSpuType = suitableSpuType; + } + + public Long getMaxReduceAmount() { + return maxReduceAmount; + } + + public void setMaxReduceAmount(Long maxReduceAmount) { + this.maxReduceAmount = maxReduceAmount; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getMobilePic() { + return mobilePic; + } + + public void setMobilePic(String mobilePic) { + this.mobilePic = mobilePic; + } + + public String getPcPic() { + return pcPic; + } + + public void setPcPic(String pcPic) { + this.pcPic = pcPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + + public List getDiscountItems() { + return discountItems; + } + + public void setDiscountItems(List discountItems) { + this.discountItems = discountItems; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + @Override + public String toString() { + return "DiscountOrderVO{" + + "discountId=" + discountId + + ", shopId=" + shopId + + ", discountName='" + discountName + '\'' + + ", discountRule=" + discountRule + + ", discountType=" + discountType + + ", suitableSpuType=" + suitableSpuType + + ", maxReduceAmount=" + maxReduceAmount + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", status=" + status + + ", mobilePic='" + mobilePic + '\'' + + ", pcPic='" + pcPic + '\'' + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", discountItems=" + discountItems + + ", spuIds=" + spuIds + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsAllotOrderItemVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsAllotOrderItemVO.java new file mode 100644 index 0000000..d16b3e0 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsAllotOrderItemVO.java @@ -0,0 +1,109 @@ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @since 2023-11-27 + */ +public class EsAllotOrderItemVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "调拨订单商品id") + private Long allotOrderItemId; + + @Schema(description = "商品spuId") + private Long spuId; + + @Schema(description = "商品spu名称") + private String spuName; + + @Schema(description = "商品skuId") + private Long skuId; + + @Schema(description = "商品skuName") + private String skuName; + + @Schema(description = "调拨数量") + private Integer allotCount; + + @Schema(description = "调拨入库数量") + private Integer allotInCount; + + public EsAllotOrderItemVO() { + } + + public Long getAllotOrderItemId() { + return allotOrderItemId; + } + + public void setAllotOrderItemId(Long allotOrderItemId) { + this.allotOrderItemId = allotOrderItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Integer getAllotCount() { + return allotCount; + } + + public void setAllotCount(Integer allotCount) { + this.allotCount = allotCount; + } + + public Integer getAllotInCount() { + return allotInCount; + } + + public void setAllotInCount(Integer allotInCount) { + this.allotInCount = allotInCount; + } + + @Override + public String toString() { + return "EsAllotOrderItemVO{" + + "allotOrderItemId=" + allotOrderItemId + + ", spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", skuId=" + skuId + + ", skuName='" + skuName + '\'' + + ", allotCount=" + allotCount + + ", allotInCount=" + allotInCount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderRefundItemVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderRefundItemVO.java new file mode 100644 index 0000000..45c3054 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderRefundItemVO.java @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 订单退款记录信息 + * + * @author YXF + * @date 2022/8/23 + */ +public class EsOrderRefundItemVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单项id") + private Long orderItemId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "商品图片") + private String pic; + + @Schema(description = "商品数量") + private Integer count; + + @Schema(description = "商品价格") + private Long price; + + @Schema(description = "产品总价格") + private Long spuTotalAmount; + + @Schema(description = "商品实际金额") + private Long actualTotal; + + @Schema(description = "平台优惠金额") + private Long platformShareReduce; + + @Schema(description = "退还积分") + private Long refundScore; + + @Schema(description = "赠品列表") + private List giveawayList; + + @Schema(description = "组合列表") + private List comboList; + + @Schema(description = "活动id") + private Long activityId; + + /** + * 活动类型 OrderActivityType + */ + @Schema(description = "活动类型") + private Integer activityType; + + /** + * 供应商图片 + */ + @Schema(description = "供应商图片") + private String supplierPic; + + /** + * 供应商商品名称 + */ + @Schema(description = "供应商商品名称") + private String supplierSpuName; + + /** + * 供应商sku名称 + */ + @Schema(description = "供应商sku名称") + private String supplierSkuName; + + public List getComboList() { + return comboList; + } + + public void setComboList(List comboList) { + this.comboList = comboList; + } + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public String getSupplierSkuName() { + return supplierSkuName; + } + + public void setSupplierSkuName(String supplierSkuName) { + this.supplierSkuName = supplierSkuName; + } + + public String getSupplierPic() { + return supplierPic; + } + + public void setSupplierPic(String supplierPic) { + this.supplierPic = supplierPic; + } + + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getActivityType() { + return activityType; + } + + public void setActivityType(Integer activityType) { + this.activityType = activityType; + } + + public List getGiveawayList() { + return giveawayList; + } + + public void setGiveawayList(List giveawayList) { + this.giveawayList = giveawayList; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getSpuTotalAmount() { + return spuTotalAmount; + } + + public void setSpuTotalAmount(Long spuTotalAmount) { + this.spuTotalAmount = spuTotalAmount; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getPlatformShareReduce() { + return platformShareReduce; + } + + public void setPlatformShareReduce(Long platformShareReduce) { + this.platformShareReduce = platformShareReduce; + } + + public Long getRefundScore() { + return refundScore; + } + + public void setRefundScore(Long refundScore) { + this.refundScore = refundScore; + } + + @Override + public String toString() { + return "EsOrderRefundItemVO{" + + "orderItemId=" + orderItemId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", pic='" + pic + '\'' + + ", count=" + count + + ", price=" + price + + ", spuTotalAmount=" + spuTotalAmount + + ", actualTotal=" + actualTotal + + ", platformShareReduce=" + platformShareReduce + + ", refundScore=" + refundScore + + ", giveawayList=" + giveawayList + + ", comboList=" + comboList + + ", activityId=" + activityId + + ", activityType=" + activityType + + ", supplierPic='" + supplierPic + '\'' + + ", supplierSpuName='" + supplierSpuName + '\'' + + ", supplierSkuName='" + supplierSkuName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderVirtualInfoVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderVirtualInfoVO.java new file mode 100644 index 0000000..786b3bf --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderVirtualInfoVO.java @@ -0,0 +1,115 @@ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +/** + * @author lanhai + */ +public class EsOrderVirtualInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "虚拟核销id") + private Long orderVirtualInfoId; + + @Schema(description = "订单ID") + private Long orderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "核销门店id") + private Long stationId; + + @Schema(description = "核销码") + private String writeOffCode; + + @Schema(description = "是否核销 1.已核销 0.未核销") + private Integer isWriteOff; + + @Schema(description = "核销时间") + private Date writeOffTime; + + @Schema(description = "剩余核销次数 -1.无限次") + private Integer writeOffMultipleCount; + + public Long getOrderVirtualInfoId() { + return orderVirtualInfoId; + } + + public void setOrderVirtualInfoId(Long orderVirtualInfoId) { + this.orderVirtualInfoId = orderVirtualInfoId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getWriteOffCode() { + return writeOffCode; + } + + public void setWriteOffCode(String writeOffCode) { + this.writeOffCode = writeOffCode; + } + + public Integer getIsWriteOff() { + return isWriteOff; + } + + public void setIsWriteOff(Integer isWriteOff) { + this.isWriteOff = isWriteOff; + } + + public Date getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(Date writeOffTime) { + this.writeOffTime = writeOffTime; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + @Override + public String toString() { + return "OrderVirtualInfoVO{" + + "orderVirtualInfoId=" + orderVirtualInfoId + + ", orderId=" + orderId + + ", shopId=" + shopId + + ", stationId=" + stationId + + ", writeOffCode='" + writeOffCode + '\'' + + ", isWriteOff=" + isWriteOff + + ", writeOffTime=" + writeOffTime + + ", writeOffMultipleCount=" + writeOffMultipleCount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderCountVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderCountVO.java new file mode 100644 index 0000000..5572883 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderCountVO.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + */ +@Schema(description = "我的订单数量") +public class OrderCountVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "所有订单数量") + private Integer allCount; + + @Schema(description = "待付款") + private Integer unPay; + + @Schema(description = "待发货") + private Integer payed; + + @Schema(description = "待收货") + private Integer consignment; + + @Schema(description = "等评价") + private Integer comment; + + @Schema(description = "已完成") + private Integer success; + + @Schema(description = "待成团") + private Integer grouping; + + @Schema(description = "代付尾款") + private Integer preSale; + @Schema(description = "退款订单") + private Integer refund; + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Integer getUnPay() { + return unPay; + } + + public void setUnPay(Integer unPay) { + this.unPay = unPay; + } + + public Integer getPayed() { + return payed; + } + + public void setPayed(Integer payed) { + this.payed = payed; + } + + public Integer getConsignment() { + return consignment; + } + + public void setConsignment(Integer consignment) { + this.consignment = consignment; + } + + public Integer getSuccess() { + return success; + } + + public void setSuccess(Integer success) { + this.success = success; + } + + public Integer getGrouping() { + return grouping; + } + + public void setGrouping(Integer grouping) { + this.grouping = grouping; + } + + public Integer getPreSale() { + return preSale; + } + + public void setPreSale(Integer preSale) { + this.preSale = preSale; + } + + public Integer getRefund() { + return refund; + } + + public void setRefund(Integer refund) { + this.refund = refund; + } + + public Integer getComment() { + return comment; + } + + public void setComment(Integer comment) { + this.comment = comment; + } + + @Override + public String toString() { + return "OrderCountVO{" + + "allCount=" + allCount + + ", unPay=" + unPay + + ", payed=" + payed + + ", consignment=" + consignment + + ", comment=" + comment + + ", success=" + success + + ", grouping=" + grouping + + ", preSale=" + preSale + + ", refund=" + refund + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderItemVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderItemVO.java new file mode 100644 index 0000000..82d61e8 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderItemVO.java @@ -0,0 +1,916 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单项VO + * + * @author FrozenWatermelon + * @date 2020-12-04 11:27:35 + */ +public class OrderItemVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单项ID") + private Long orderItemId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "产品ID") + private Long spuId; + + @Schema(description = "产品SkuID") + private Long skuId; + + @Schema(description = "分类ID") + private Long categoryId; + + @Schema(description = "用户Id") + private Long userId; + + @Schema(description = "最终的退款id") + private Long finalRefundId; + + @Schema(description = "推广员id") + private Long distributionUserId; + + @Schema(description = "库存点id 自提:自提点id, 其他:仓库id") + private Long stockPointId; + + @Schema(description = "购物车产品个数") + private Integer count; + + @Schema(description = "产品名称") + private String spuName; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "产品主图片路径") + private String pic; + + @Schema(description = "是否以评价(0.未评价1.已评价)") + private Integer isComm; + + @Schema(description = "订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)") + private Integer refundStatus; + + @Schema(description = "0全部发货 其他数量为剩余待发货数量") + private Integer beDeliveredNum; + + @Schema(description = "单个orderItem的配送类型 1:快递 2:自提 3:无需快递 4:同城配送") + private Integer deliveryType; + + @Schema(description = "加入购物车时间") + private Date shopCartTime; + + @Schema(description = "产品价格") + private Long price; + + @Schema(description = "商品总金额") + private Long spuTotalAmount; + + @Schema(description = "商品实际金额 = 商品总金额 - 分摊的优惠金额") + private Long actualTotal; + + @Schema(description = "分摊的优惠金额") + private Long shareReduce; + + @Schema(description = "平台优惠金额") + private Long platformShareReduce; + + @Schema(description = "推广员佣金") + private Long distributionAmount; + + @Schema(description = "上级推广员佣金") + private Long distributionParentAmount; + + @Schema(description = "积分价格(单价)") + private Long scoreFee; + + @Schema(description = "积分抵扣金额") + private Long scoreAmount; + + @Schema(description = "使用积分") + private Long useScore; + + @Schema(description = "获得积分") + private Long gainScore; + + @Schema(description = "评论时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date commTime; + + @Schema(description = "发货改变的数量") + private Integer changeNum; + + @Schema(description = "平台佣金") + private Long platformCommission; + + + @Schema(description = "运费金额") + private Long freeFreightAmount; + + + @Schema(description = "佣金比例") + private Double rate; + + @Schema(description = "sku编码") + private String partyCode; + + @Schema(description = "spu编码") + private String spuCode; + + @Schema(description = "店铺改价优惠金额") + private Long shopChangeFreeAmount; + + @Schema(description = "订单项信息") + private List orderItemLangList; + + @Schema(description = "采购金额") + private Long itemPurchaseAmount; + + @Schema(description = "供应商佣金比例") + private Double supplierRate; + + @Schema(description = "供应商佣金金额") + private Long purchasePlatformCommission; + + @Schema(description = "供应商商品id") + private Long supplierSpuId; + + @Schema(description = "供应商规格id") + private Long supplierSkuId; + + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品") + private Integer spuMold; + + @Schema(description = "是否可以退款 1.可以 0不可以") + private Integer isRefund; + + @Schema(description = "虚拟商品的留言备注") + private String virtualRemark; + + @Schema(description = "定金金额") + private Long depositAmount; + + @Schema(description = "套餐优惠金额") + private Long comboAmount; + + @Schema(description = "活动id") + private Long activityId; + + /** + * 活动类型 OrderActivityType + */ + @Schema(description = "活动类型") + private Integer activityType; + + @Schema(description = "赠品金额") + private Long giveawayAmount; + + @Schema(description = "主赠品 1:主赠品 0:赠品") + private Integer mainGiveaway; + + @Schema(description = "主商品关联退款赠品id") + private String returnGiveawayIds; + + @Schema(description = "赠品信息") + private GiveawayVO giveawayVO; + + @Schema(description = "订单项赠品列表", requiredMode = Schema.RequiredMode.REQUIRED) + private List giveawayList; + + @Schema(description = "订单项组合列表", requiredMode = Schema.RequiredMode.REQUIRED) + private List comboItemList; + + @Schema(description = "处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)") + private Integer returnMoneySts; + + @Schema(description = "供应商商品图片") + private String supplierPic; + + @Schema(description = "供应商商品名称") + private String supplierSpuName; + + @Schema(description = "供应商sku名称") + private String supplierSkuName; + + @Schema(description = "核销次数 -1.多次核销 0.无需核销 1.单次核销") + private Integer writeOffNum; + + @Schema(description = "多次核销次数 -1.无限次") + private Integer writeOffMultipleCount; + + @Schema(description = "核销开始时间") + private Date writeOffStart; + + @Schema(description = "核销结束时间") + private Date writeOffEnd; + + @Schema(description = "主商品组合订单项id") + private Long mainComboItemId; + + /** + * 会员折扣金额 + */ + private Long memberAmount; + + /** + * 平台优惠券优惠金额 + */ + private Long platformCouponAmount; + + /** + * 商家优惠券优惠金额 + */ + private Long shopCouponAmount; + + /** + * 满减优惠金额 + */ + private Long discountAmount; + + /** + * 旧itemId + */ + private Long oldOderItemId; + + + @Schema(description = "平台运费减免金额") + private Long platformFreeFreightAmount; + + public List getComboItemList() { + return comboItemList; + } + + public void setComboItemList(List comboItemList) { + this.comboItemList = comboItemList; + } + + public Long getMainComboItemId() { + return mainComboItemId; + } + + public void setMainComboItemId(Long mainComboItemId) { + this.mainComboItemId = mainComboItemId; + } + + public Long getOldOderItemId() { + return oldOderItemId; + } + + public void setOldOderItemId(Long oldOderItemId) { + this.oldOderItemId = oldOderItemId; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getMemberAmount() { + return memberAmount; + } + + public void setMemberAmount(Long memberAmount) { + this.memberAmount = memberAmount; + } + + public Long getPlatformCouponAmount() { + return platformCouponAmount; + } + + public void setPlatformCouponAmount(Long platformCouponAmount) { + this.platformCouponAmount = platformCouponAmount; + } + + public Long getShopCouponAmount() { + return shopCouponAmount; + } + + public void setShopCouponAmount(Long shopCouponAmount) { + this.shopCouponAmount = shopCouponAmount; + } + + public Long getDiscountAmount() { + return discountAmount; + } + + public void setDiscountAmount(Long discountAmount) { + this.discountAmount = discountAmount; + } + + public Long getScoreAmount() { + return scoreAmount; + } + + public void setScoreAmount(Long scoreAmount) { + this.scoreAmount = scoreAmount; + } + + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public String getSupplierSkuName() { + return supplierSkuName; + } + + public void setSupplierSkuName(String supplierSkuName) { + this.supplierSkuName = supplierSkuName; + } + + public String getSupplierPic() { + return supplierPic; + } + + public void setSupplierPic(String supplierPic) { + this.supplierPic = supplierPic; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public Long getComboAmount() { + return comboAmount; + } + + public void setComboAmount(Long comboAmount) { + this.comboAmount = comboAmount; + } + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public Integer getIsRefund() { + return isRefund; + } + + public void setIsRefund(Integer isRefund) { + this.isRefund = isRefund; + } + + public String getVirtualRemark() { + return virtualRemark; + } + + public void setVirtualRemark(String virtualRemark) { + this.virtualRemark = virtualRemark; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public Long getSupplierSkuId() { + return supplierSkuId; + } + + public void setSupplierSkuId(Long supplierSkuId) { + this.supplierSkuId = supplierSkuId; + } + + public Long getGiveawayAmount() { + return giveawayAmount; + } + + public void setGiveawayAmount(Long giveawayAmount) { + this.giveawayAmount = giveawayAmount; + } + + public String getReturnGiveawayIds() { + return returnGiveawayIds; + } + + public void setReturnGiveawayIds(String returnGiveawayIds) { + this.returnGiveawayIds = returnGiveawayIds; + } + + public GiveawayVO getGiveawayVO() { + return giveawayVO; + } + + public void setGiveawayVO(GiveawayVO giveawayVO) { + this.giveawayVO = giveawayVO; + } + + public List getGiveawayList() { + return giveawayList; + } + + public void setGiveawayList(List giveawayList) { + this.giveawayList = giveawayList; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public Double getSupplierRate() { + return supplierRate; + } + + public void setSupplierRate(Double supplierRate) { + this.supplierRate = supplierRate; + } + + public Long getPurchasePlatformCommission() { + return purchasePlatformCommission; + } + + public void setPurchasePlatformCommission(Long purchasePlatformCommission) { + this.purchasePlatformCommission = purchasePlatformCommission; + } + + public Long getItemPurchaseAmount() { + return itemPurchaseAmount; + } + + public void setItemPurchaseAmount(Long itemPurchaseAmount) { + this.itemPurchaseAmount = itemPurchaseAmount; + } + + public Integer getChangeNum() { + return changeNum; + } + + public void setChangeNum(Integer changeNum) { + this.changeNum = changeNum; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getFinalRefundId() { + return finalRefundId; + } + + public void setFinalRefundId(Long finalRefundId) { + this.finalRefundId = finalRefundId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getIsComm() { + return isComm; + } + + public void setIsComm(Integer isComm) { + this.isComm = isComm; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Integer getBeDeliveredNum() { + return beDeliveredNum; + } + + public void setBeDeliveredNum(Integer beDeliveredNum) { + this.beDeliveredNum = beDeliveredNum; + } + + public Date getShopCartTime() { + return shopCartTime; + } + + public void setShopCartTime(Date shopCartTime) { + this.shopCartTime = shopCartTime; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getShareReduce() { + return shareReduce; + } + + public void setShareReduce(Long shareReduce) { + this.shareReduce = shareReduce; + } + + public Long getPlatformShareReduce() { + return platformShareReduce; + } + + public void setPlatformShareReduce(Long platformShareReduce) { + this.platformShareReduce = platformShareReduce; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getDistributionParentAmount() { + return distributionParentAmount; + } + + public void setDistributionParentAmount(Long distributionParentAmount) { + this.distributionParentAmount = distributionParentAmount; + } + + public Long getUseScore() { + return useScore; + } + + public void setUseScore(Long useScore) { + this.useScore = useScore; + } + + public Long getGainScore() { + return gainScore; + } + + public void setGainScore(Long gainScore) { + this.gainScore = gainScore; + } + + public Long getSpuTotalAmount() { + return spuTotalAmount; + } + + public void setSpuTotalAmount(Long spuTotalAmount) { + this.spuTotalAmount = spuTotalAmount; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Date getCommTime() { + return commTime; + } + + public void setCommTime(Date commTime) { + this.commTime = commTime; + } + + public List getOrderItemLangList() { + return orderItemLangList; + } + + public void setOrderItemLangList(List orderItemLangList) { + this.orderItemLangList = orderItemLangList; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + + public Long getShopChangeFreeAmount() { + return shopChangeFreeAmount; + } + + public void setShopChangeFreeAmount(Long shopChangeFreeAmount) { + this.shopChangeFreeAmount = shopChangeFreeAmount; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getActivityType() { + return activityType; + } + + public void setActivityType(Integer activityType) { + this.activityType = activityType; + } + + public Integer getMainGiveaway() { + return mainGiveaway; + } + + public void setMainGiveaway(Integer mainGiveaway) { + this.mainGiveaway = mainGiveaway; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + @Override + public String toString() { + return "OrderItemVO{" + + "orderItemId=" + orderItemId + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", categoryId=" + categoryId + + ", userId=" + userId + + ", finalRefundId=" + finalRefundId + + ", distributionUserId=" + distributionUserId + + ", stockPointId=" + stockPointId + + ", count=" + count + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", pic='" + pic + '\'' + + ", isComm=" + isComm + + ", refundStatus=" + refundStatus + + ", beDeliveredNum=" + beDeliveredNum + + ", deliveryType=" + deliveryType + + ", shopCartTime=" + shopCartTime + + ", price=" + price + + ", spuTotalAmount=" + spuTotalAmount + + ", actualTotal=" + actualTotal + + ", shareReduce=" + shareReduce + + ", platformShareReduce=" + platformShareReduce + + ", distributionAmount=" + distributionAmount + + ", distributionParentAmount=" + distributionParentAmount + + ", scoreFee=" + scoreFee + + ", scoreAmount=" + scoreAmount + + ", useScore=" + useScore + + ", gainScore=" + gainScore + + ", commTime=" + commTime + + ", changeNum=" + changeNum + + ", platformCommission=" + platformCommission + + ", freeFreightAmount=" + freeFreightAmount + + ", rate=" + rate + + ", partyCode='" + partyCode + '\'' + + ", spuCode='" + spuCode + '\'' + + ", shopChangeFreeAmount=" + shopChangeFreeAmount + + ", orderItemLangList=" + orderItemLangList + + ", itemPurchaseAmount=" + itemPurchaseAmount + + ", supplierRate=" + supplierRate + + ", purchasePlatformCommission=" + purchasePlatformCommission + + ", supplierSpuId=" + supplierSpuId + + ", supplierSkuId=" + supplierSkuId + + ", spuMold=" + spuMold + + ", isRefund=" + isRefund + + ", virtualRemark='" + virtualRemark + '\'' + + ", depositAmount=" + depositAmount + + ", comboAmount=" + comboAmount + + ", activityId=" + activityId + + ", activityType=" + activityType + + ", giveawayAmount=" + giveawayAmount + + ", mainGiveaway=" + mainGiveaway + + ", returnGiveawayIds='" + returnGiveawayIds + '\'' + + ", giveawayVO=" + giveawayVO + + ", giveawayList=" + giveawayList + + ", comboItemList=" + comboItemList + + ", returnMoneySts=" + returnMoneySts + + ", supplierPic='" + supplierPic + '\'' + + ", supplierSpuName='" + supplierSpuName + '\'' + + ", supplierSkuName='" + supplierSkuName + '\'' + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", mainComboItemId=" + mainComboItemId + + ", memberAmount=" + memberAmount + + ", platformCouponAmount=" + platformCouponAmount + + ", shopCouponAmount=" + shopCouponAmount + + ", discountAmount=" + discountAmount + + ", oldOderItemId=" + oldOderItemId + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderSpuLangVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderSpuLangVO.java new file mode 100644 index 0000000..f2749fe --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderSpuLangVO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单sku-国际化表VO + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class OrderSpuLangVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "语言 1.中文 2.英文") + private Integer lang; + + @Schema(description = "sku名称") + private String spuName; + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + @Override + public String toString() { + return "OrderSpuLangVO{" + + "lang=" + lang + + ", spuName='" + spuName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderStationSpuDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderStationSpuDTO.java new file mode 100644 index 0000000..7d9a758 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderStationSpuDTO.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * sku信息DTO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class OrderStationSpuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "属性id") + private Long skuId; + @Schema(description = "购买数量") + private Integer count; + /** + * 枚举类 SpuMold + */ + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品") + private Integer spuMold; + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + @Override + public String toString() { + return "OrderStationSpuDTO{" + + "skuId=" + skuId + + ", count=" + count + + ", spuMold=" + spuMold + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/RefundOrderItemVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/RefundOrderItemVO.java new file mode 100644 index 0000000..25e5800 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/RefundOrderItemVO.java @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 退款订单项 + * + * @author FrozenWatermelon + */ +public class RefundOrderItemVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单项目id") + private Long orderItemId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "产品名称") + private String spuName; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "产品图片") + private String pic; + + @Schema(description = "sku编码") + private String partyCode; + + @Schema(description = "物品数量") + private Integer count; + + @Schema(description = "产品价格") + private Long price; + + @Schema(description = "产品总价格") + private Long spuTotalAmount; + + @Schema(description = "商品实际金额") + private Long actualTotal; + + @Schema(description = "平台优惠金额") + private Long platformShareReduce; + + @Schema(description = "退还积分") + private Long refundScore; + + @Schema(description = "订单项赠品列表", requiredMode = Schema.RequiredMode.REQUIRED) + private List giveawayList; + + @Schema(description = "订单项组合列表", requiredMode = Schema.RequiredMode.REQUIRED) + private List comboList; + + @Schema(description = "赠品金额") + private Long giveawayAmount; + + + @Schema(description = "活动id") + private Long activityId; + + /** + * 活动类型 OrderActivityType + */ + @Schema(description = "活动类型") + private Integer activityType; + + @Schema(description = "供应商图片") + private String supplierPic; + + @Schema(description = "供应商商品名称") + private String supplierSpuName; + + @Schema(description = "供应商sku名称") + private String supplierSkuName; + + public List getComboList() { + return comboList; + } + + public void setComboList(List comboList) { + this.comboList = comboList; + } + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public String getSupplierSkuName() { + return supplierSkuName; + } + + public void setSupplierSkuName(String supplierSkuName) { + this.supplierSkuName = supplierSkuName; + } + + public String getSupplierPic() { + return supplierPic; + } + + public void setSupplierPic(String supplierPic) { + this.supplierPic = supplierPic; + } + + public Long getGiveawayAmount() { + return giveawayAmount; + } + + public void setGiveawayAmount(Long giveawayAmount) { + this.giveawayAmount = giveawayAmount; + } + + public List getGiveawayList() { + return giveawayList; + } + + public void setGiveawayList(List giveawayList) { + this.giveawayList = giveawayList; + } + + private List orderItemLangList; + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getSpuTotalAmount() { + return spuTotalAmount; + } + + public void setSpuTotalAmount(Long spuTotalAmount) { + this.spuTotalAmount = spuTotalAmount; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public List getOrderItemLangList() { + return orderItemLangList; + } + + public void setOrderItemLangList(List orderItemLangList) { + this.orderItemLangList = orderItemLangList; + } + + public Long getPlatformShareReduce() { + return platformShareReduce; + } + + public void setPlatformShareReduce(Long platformShareReduce) { + this.platformShareReduce = platformShareReduce; + } + + public Long getRefundScore() { + return refundScore; + } + + public void setRefundScore(Long refundScore) { + this.refundScore = refundScore; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getActivityType() { + return activityType; + } + + public void setActivityType(Integer activityType) { + this.activityType = activityType; + } + + @Override + public String toString() { + return "RefundOrderItemVO{" + + "orderItemId=" + orderItemId + + ", spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", pic='" + pic + '\'' + + ", partyCode='" + partyCode + '\'' + + ", count=" + count + + ", price=" + price + + ", spuTotalAmount=" + spuTotalAmount + + ", actualTotal=" + actualTotal + + ", platformShareReduce=" + platformShareReduce + + ", refundScore=" + refundScore + + ", giveawayList=" + giveawayList + + ", comboList=" + comboList + + ", giveawayAmount=" + giveawayAmount + + ", activityId=" + activityId + + ", activityType=" + activityType + + ", supplierPic='" + supplierPic + '\'' + + ", supplierSpuName='" + supplierSpuName + '\'' + + ", supplierSkuName='" + supplierSkuName + '\'' + + ", orderItemLangList=" + orderItemLangList + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartItemDiscountVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartItemDiscountVO.java new file mode 100644 index 0000000..0643684 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartItemDiscountVO.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Set; + +/** + * @author FrozenWatermelon + * @date 2020-11-20 15:47:32 + */ +public class ShopCartItemDiscountVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "已选满减项", requiredMode = Schema.RequiredMode.REQUIRED) + private ChooseDiscountItemVO chooseDiscountItem; + + @Schema(description = "商品列表") + private List shopCartItems; + + @Schema(description = "主组合商品skuIds") + private Set comboMainSkuIds; + + @Schema(description = "购物车商品活动类型:0无 1满减 2套餐") + private Integer type; + + @Schema(description = "已选套餐项", requiredMode = Schema.RequiredMode.REQUIRED) + private ChooseComboItemVo chooseComboItemVo; + + @Schema(description = "套餐加入时间") + private Date comboJoinTime; + + + public Set getComboMainSkuIds() { + return comboMainSkuIds; + } + + public void setComboMainSkuIds(Set comboMainSkuIds) { + this.comboMainSkuIds = comboMainSkuIds; + } + + public Date getComboJoinTime() { + return comboJoinTime; + } + + public void setComboJoinTime(Date comboJoinTime) { + this.comboJoinTime = comboJoinTime; + } + + public ChooseComboItemVo getChooseComboItemVo() { + return chooseComboItemVo; + } + + public void setChooseComboItemVo(ChooseComboItemVo chooseComboItemVo) { + this.chooseComboItemVo = chooseComboItemVo; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public ChooseDiscountItemVO getChooseDiscountItem() { + return chooseDiscountItem; + } + + public void setChooseDiscountItem(ChooseDiscountItemVO chooseDiscountItem) { + this.chooseDiscountItem = chooseDiscountItem; + } + + public List getShopCartItems() { + return shopCartItems; + } + + public void setShopCartItems(List shopCartItems) { + this.shopCartItems = shopCartItems; + } + + @Override + public String toString() { + return "ShopCartItemDiscountVO{" + + "chooseDiscountItem=" + chooseDiscountItem + + ", shopCartItems=" + shopCartItems + + ", comboSpuIds=" + comboMainSkuIds + + ", type=" + type + + ", chooseComboItemVo=" + chooseComboItemVo + + ", comboJoinTime=" + comboJoinTime + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartOrderVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartOrderVO.java new file mode 100644 index 0000000..401aec4 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartOrderVO.java @@ -0,0 +1,516 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 单个店铺的订单信息 + * + * @author FrozenWatermelon + */ +public class ShopCartOrderVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + @Schema(description = "店铺id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + + @Schema(description = "店铺名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String shopName; + + @Schema(description = "店铺类型1自营店 2普通店") + private Integer shopType; + + @Schema(description = "实际总值", requiredMode = Schema.RequiredMode.REQUIRED) + private Long actualTotal; + + @Schema(description = "商品总值", requiredMode = Schema.RequiredMode.REQUIRED) + private Long total; + + @Schema(description = "商品总数", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer totalCount; + + @Schema(description = "平台等级免运费金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long levelFreeTransfee; + + @Schema(description = "店家包邮金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long freeTransfee; + + @Schema(description = "运费", requiredMode = Schema.RequiredMode.REQUIRED) + private Long transfee; + + @Schema(description = "促销活动优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long discountReduce; + + @Schema(description = "优惠券优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long couponReduce; + + @Schema(description = "平台优惠券优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long platformCouponReduce; + + @Schema(description = "积分优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long scoreReduce; + + @Schema(description = "使用积分", requiredMode = Schema.RequiredMode.REQUIRED) + private Long useScore; + + @Schema(description = "平台优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long platformAmount; + + @Schema(description = "平台佣金", requiredMode = Schema.RequiredMode.REQUIRED) + private Long platformCommission; + + @Schema(description = "平台供应商佣金", requiredMode = Schema.RequiredMode.REQUIRED) + private Long totalPurchasePlatformCommission; + + + @Schema(description = "等级优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long levelReduce; + + /** + * 这个是一个店铺的总分摊,如果要算店铺的单独分摊 = 总分摊 - 平台分摊 + */ + @Schema(description = "店铺优惠金额(促销活动 + 优惠券 + 积分优惠金额 + 其他)", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopReduce; + + @Schema(description = "订单备注信息", requiredMode = Schema.RequiredMode.REQUIRED) + private String remarks; + + @Schema(description = "订单类型") + private Integer orderType; + + @Schema(description = "购物车商品", requiredMode = Schema.RequiredMode.REQUIRED) + private List shopCartItemDiscounts; + + @Schema(description = "整个店铺可以使用的优惠券列表", requiredMode = Schema.RequiredMode.REQUIRED) + private List coupons; + + @Schema(description = "发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "同城配送可用状态 : 0 不可用 1 可用 -1 不在范围内 -2 商品没有配置同城配送信息 -3 起送费不够", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer shopCityStatus; + + @Schema(description = "同城配送起送费", requiredMode = Schema.RequiredMode.REQUIRED) + private Double startDeliveryFee; + + @Schema(description = "是否可以退款 1.可以 0.不可以", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer isRefund; + + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品") + private Integer spuMold; + + @Schema(description = "套餐优惠金额") + private Long shopComboAmount; + + @Schema(description = "预售类型 -1.未开启预售 0.全款预售类型 1.定金预售") + private Integer preSaleType; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "核销次数 -1.多次核销 0.无需核销 1.单次核销") + private Integer writeOffNum; + + @Schema(description = "多次核销次数 -1.无限次") + private Integer writeOffMultipleCount; + + @Schema(description = "核销有效期 -1.长期有效 0.自定义 x.x天内有效") + private Integer writeOffTime; + + @Schema(description = "核销开始时间") + private Date writeOffStart; + + @Schema(description = "核销结束时间") + private Date writeOffEnd; + + @Schema(description = "包含套餐提交订单 true: 包含 false: 不包含") + private Boolean hasComboOrder; + + @Schema(description = "主单号,在组合商品拆单时会存在") + private Long mainOrderId; + + public Long getMainOrderId() { + return mainOrderId; + } + + public void setMainOrderId(Long mainOrderId) { + this.mainOrderId = mainOrderId; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Integer getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(Integer writeOffTime) { + this.writeOffTime = writeOffTime; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getShopComboAmount() { + return shopComboAmount; + } + + public void setShopComboAmount(Long shopComboAmount) { + this.shopComboAmount = shopComboAmount; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public Integer getIsRefund() { + return isRefund; + } + + public void setIsRefund(Integer isRefund) { + this.isRefund = isRefund; + } + + public Double getStartDeliveryFee() { + return startDeliveryFee; + } + + public void setStartDeliveryFee(Double startDeliveryFee) { + this.startDeliveryFee = startDeliveryFee; + } + + public Integer getShopCityStatus() { + return shopCityStatus; + } + + public void setShopCityStatus(Integer shopCityStatus) { + this.shopCityStatus = shopCityStatus; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Long getTotalPurchasePlatformCommission() { + return totalPurchasePlatformCommission; + } + + public void setTotalPurchasePlatformCommission(Long totalPurchasePlatformCommission) { + this.totalPurchasePlatformCommission = totalPurchasePlatformCommission; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Integer getTotalCount() { + return totalCount; + } + + public void setTotalCount(Integer totalCount) { + this.totalCount = totalCount; + } + + public Long getFreeTransfee() { + return freeTransfee; + } + + public void setFreeTransfee(Long freeTransfee) { + this.freeTransfee = freeTransfee; + } + + public Long getTransfee() { + return transfee; + } + + public void setTransfee(Long transfee) { + this.transfee = transfee; + } + + public Long getDiscountReduce() { + return discountReduce; + } + + public void setDiscountReduce(Long discountReduce) { + this.discountReduce = discountReduce; + } + + public Long getCouponReduce() { + return couponReduce; + } + + public void setCouponReduce(Long couponReduce) { + this.couponReduce = couponReduce; + } + + public Long getScoreReduce() { + return scoreReduce; + } + + public void setScoreReduce(Long scoreReduce) { + this.scoreReduce = scoreReduce; + } + + public Long getUseScore() { + return useScore; + } + + public void setUseScore(Long useScore) { + this.useScore = useScore; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getLevelReduce() { + return levelReduce; + } + + public void setLevelReduce(Long levelReduce) { + this.levelReduce = levelReduce; + } + + public Long getShopReduce() { + return shopReduce; + } + + public void setShopReduce(Long shopReduce) { + this.shopReduce = shopReduce; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public List getShopCartItemDiscounts() { + return shopCartItemDiscounts; + } + + public void setShopCartItemDiscounts(List shopCartItemDiscounts) { + this.shopCartItemDiscounts = shopCartItemDiscounts; + } + + public List getCoupons() { + return coupons; + } + + public void setCoupons(List coupons) { + this.coupons = coupons; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Integer getShopType() { + return shopType; + } + + public void setShopType(Integer shopType) { + this.shopType = shopType; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getPlatformCouponReduce() { + return platformCouponReduce; + } + + public void setPlatformCouponReduce(Long platformCouponReduce) { + this.platformCouponReduce = platformCouponReduce; + } + + public Long getLevelFreeTransfee() { + return levelFreeTransfee; + } + + public void setLevelFreeTransfee(Long levelFreeTransfee) { + this.levelFreeTransfee = levelFreeTransfee; + } + + public Boolean getHasComboOrder() { + return hasComboOrder; + } + + public void setHasComboOrder(Boolean hasComboOrder) { + this.hasComboOrder = hasComboOrder; + } + + @Override + public String toString() { + return "ShopCartOrderVO{" + + "orderId=" + orderId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", shopType=" + shopType + + ", actualTotal=" + actualTotal + + ", total=" + total + + ", totalCount=" + totalCount + + ", levelFreeTransfee=" + levelFreeTransfee + + ", freeTransfee=" + freeTransfee + + ", transfee=" + transfee + + ", discountReduce=" + discountReduce + + ", couponReduce=" + couponReduce + + ", platformCouponReduce=" + platformCouponReduce + + ", scoreReduce=" + scoreReduce + + ", useScore=" + useScore + + ", platformAmount=" + platformAmount + + ", platformCommission=" + platformCommission + + ", totalPurchasePlatformCommission=" + totalPurchasePlatformCommission + + ", levelReduce=" + levelReduce + + ", shopReduce=" + shopReduce + + ", remarks='" + remarks + '\'' + + ", orderType=" + orderType + + ", shopCartItemDiscounts=" + shopCartItemDiscounts + + ", coupons=" + coupons + + ", supplierDeliveryType=" + supplierDeliveryType + + ", supplierId=" + supplierId + + ", shopCityStatus=" + shopCityStatus + + ", startDeliveryFee=" + startDeliveryFee + + ", isRefund=" + isRefund + + ", spuMold=" + spuMold + + ", shopComboAmount=" + shopComboAmount + + ", preSaleType=" + preSaleType + + ", userId=" + userId + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffTime=" + writeOffTime + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", hasComboOrder=" + hasComboOrder + + ", mainOrderId=" + mainOrderId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartVO.java new file mode 100644 index 0000000..a555881 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartVO.java @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 购物车VO + * + * @author FrozenWatermelon + * @date 2020-11-20 15:47:32 + */ +public class ShopCartVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + + @Schema(description = "店铺名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String shopName; + + @Schema(description = "店铺类型1自营店 2普通店") + private Integer shopType; + + @Schema(description = "购物车满减活动携带的商品", requiredMode = Schema.RequiredMode.REQUIRED) + private List shopCartItemDiscounts; + + @Schema(description = "店铺优惠金额(促销活动 + 优惠券 + 积分优惠金额 + 其他)", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopReduce; + + @Schema(description = "促销活动优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long discountReduce; + + @Schema(description = "实际总值(商品总值 - 优惠)", requiredMode = Schema.RequiredMode.REQUIRED) + private Long actualTotal; + + @Schema(description = "商品总值", requiredMode = Schema.RequiredMode.REQUIRED) + private Long total; + + @Schema(description = "商品积分总值") + private Long scoreTotal; + + @Schema(description = "整个店铺可以使用的优惠券列表", requiredMode = Schema.RequiredMode.REQUIRED) + private List coupons; + + @Schema(description = "优惠券优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long couponReduce; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer totalCount; + + @Schema(description = "运费", requiredMode = Schema.RequiredMode.REQUIRED) + private Long transfee; + + @Schema(description = "等级免运费金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long freeTransfee; + + @Schema(description = "套餐优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopComboAmount; + + public Long getShopComboAmount() { + return shopComboAmount; + } + + public void setShopComboAmount(Long shopComboAmount) { + this.shopComboAmount = shopComboAmount; + } + + public Long getFreeTransfee() { + return freeTransfee; + } + + public void setFreeTransfee(Long freeTransfee) { + this.freeTransfee = freeTransfee; + } + + public Long getTransfee() { + return transfee; + } + + public void setTransfee(Long transfee) { + this.transfee = transfee; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public List getShopCartItemDiscounts() { + return shopCartItemDiscounts; + } + + public void setShopCartItemDiscounts(List shopCartItemDiscounts) { + this.shopCartItemDiscounts = shopCartItemDiscounts; + } + + public Long getShopReduce() { + return shopReduce; + } + + public void setShopReduce(Long shopReduce) { + this.shopReduce = shopReduce; + } + + public Long getDiscountReduce() { + return discountReduce; + } + + public void setDiscountReduce(Long discountReduce) { + this.discountReduce = discountReduce; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Long getCouponReduce() { + return couponReduce; + } + + public void setCouponReduce(Long couponReduce) { + this.couponReduce = couponReduce; + } + + public List getCoupons() { + return coupons; + } + + public void setCoupons(List coupons) { + this.coupons = coupons; + } + + public Integer getShopType() { + return shopType; + } + + public void setShopType(Integer shopType) { + this.shopType = shopType; + } + + public Integer getTotalCount() { + return totalCount; + } + + public void setTotalCount(Integer totalCount) { + this.totalCount = totalCount; + } + + public Long getScoreTotal() { + return scoreTotal; + } + + public void setScoreTotal(Long scoreTotal) { + this.scoreTotal = scoreTotal; + } + + @Override + public String toString() { + return "ShopCartVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", shopType=" + shopType + + ", shopCartItemDiscounts=" + shopCartItemDiscounts + + ", shopReduce=" + shopReduce + + ", discountReduce=" + discountReduce + + ", actualTotal=" + actualTotal + + ", total=" + total + + ", scoreTotal=" + scoreTotal + + ", coupons=" + coupons + + ", couponReduce=" + couponReduce + + ", totalCount=" + totalCount + + ", transfee=" + transfee + + ", freeTransfee=" + freeTransfee + + ", shopComboAmount=" + shopComboAmount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCityStatusVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCityStatusVO.java new file mode 100644 index 0000000..1647680 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCityStatusVO.java @@ -0,0 +1,51 @@ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lanhai + */ +public class ShopCityStatusVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "同城配送可用状态 : 1 可用 -1 不在范围内 -2 商家没有配置同城配送信息 -3 起送费不够", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer shopCityStatus; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getShopCityStatus() { + return shopCityStatus; + } + + public void setShopCityStatus(Integer shopCityStatus) { + this.shopCityStatus = shopCityStatus; + } + + public ShopCityStatusVO() { + } + + public ShopCityStatusVO(Long shopId, Integer shopCityStatus) { + this.shopId = shopId; + this.shopCityStatus = shopCityStatus; + } + + @Override + public String toString() { + return "ShopCityStatusVO{" + + "shopId=" + shopId + + ", shopCityStatus=" + shopCityStatus + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/TransfeeFreeVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/TransfeeFreeVO.java new file mode 100644 index 0000000..dffcadf --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/TransfeeFreeVO.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 指定条件包邮项VO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class TransfeeFreeVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "指定条件包邮项id") + private Long transfeeFreeId; + + @Schema(description = "运费模板id") + private Long transportId; + + @Schema(description = "包邮方式 (0 满x件/重量/体积包邮 1满金额包邮 2满x件/重量/体积且满金额包邮)") + private Integer freeType; + + @Schema(description = "需满金额") + private Long amount; + + @Schema(description = "包邮x件/重量/体积") + private Double piece; + + @Schema(description = "指定条件包邮城市项", requiredMode = Schema.RequiredMode.REQUIRED) + private List freeCityList; + + public List getFreeCityList() { + return freeCityList; + } + + public void setFreeCityList(List freeCityList) { + this.freeCityList = freeCityList; + } + + public Long getTransfeeFreeId() { + return transfeeFreeId; + } + + public void setTransfeeFreeId(Long transfeeFreeId) { + this.transfeeFreeId = transfeeFreeId; + } + + public Long getTransportId() { + return transportId; + } + + public void setTransportId(Long transportId) { + this.transportId = transportId; + } + + public Integer getFreeType() { + return freeType; + } + + public void setFreeType(Integer freeType) { + this.freeType = freeType; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Double getPiece() { + return piece; + } + + public void setPiece(Double piece) { + this.piece = piece; + } + + @Override + public String toString() { + return "TransfeeFreeVO{" + + "transfeeFreeId=" + transfeeFreeId + + ", transportId=" + transportId + + ", freeType=" + freeType + + ", amount=" + amount + + ", piece=" + piece + + ", freeCityList=" + freeCityList + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/TransfeeVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/TransfeeVO.java new file mode 100644 index 0000000..1cb2c7d --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/TransfeeVO.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 运费项VO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class TransfeeVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "运费项id") + private Long transfeeId; + + @Schema(description = "运费模板id") + private Long transportId; + + @Schema(description = "续件数量") + private Double continuousPiece; + + @Schema(description = "首件数量") + private Double firstPiece; + + @Schema(description = "续件费用") + private Long continuousFee; + + @Schema(description = "首件费用") + private Long firstFee; + + @Schema(description = "指定条件运费城市项") + private List cityList; + + public List getCityList() { + return cityList; + } + + public void setCityList(List cityList) { + this.cityList = cityList; + } + + public Long getTransfeeId() { + return transfeeId; + } + + public void setTransfeeId(Long transfeeId) { + this.transfeeId = transfeeId; + } + + public Long getTransportId() { + return transportId; + } + + public void setTransportId(Long transportId) { + this.transportId = transportId; + } + + public Double getContinuousPiece() { + return continuousPiece; + } + + public void setContinuousPiece(Double continuousPiece) { + this.continuousPiece = continuousPiece; + } + + public Double getFirstPiece() { + return firstPiece; + } + + public void setFirstPiece(Double firstPiece) { + this.firstPiece = firstPiece; + } + + public Long getContinuousFee() { + return continuousFee; + } + + public void setContinuousFee(Long continuousFee) { + this.continuousFee = continuousFee; + } + + public Long getFirstFee() { + return firstFee; + } + + public void setFirstFee(Long firstFee) { + this.firstFee = firstFee; + } + + @Override + public String toString() { + return "TransfeeVO{" + + "transfeeId=" + transfeeId + + ", transportId=" + transportId + + ", continuousPiece=" + continuousPiece + + ", firstPiece=" + firstPiece + + ", continuousFee=" + continuousFee + + ", firstFee=" + firstFee + + ", cityList=" + cityList + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/UserOrderStatisticVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/UserOrderStatisticVO.java new file mode 100644 index 0000000..66e1666 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/UserOrderStatisticVO.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户相关订单统计数据 + * + * @author: cl + * @date: 2021-04-14 14:04:01 + */ +public class UserOrderStatisticVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "最近消费时间") + private Date reConsTime; + + @Schema(description = "消费金额") + private BigDecimal consAmount; + + @Schema(description = "实付金额") + private BigDecimal actualAmount; + + @Schema(description = "消费次数") + private Integer consTimes; + + @Schema(description = "下单次数") + private Integer allCount; + + @Schema(description = "平均折扣") + private BigDecimal averDiscount; + + @Schema(description = "优惠总金额") + private BigDecimal reduceAmount; + + @Schema(description = "售后金额") + private BigDecimal afterSaleAmount; + + @Schema(description = "售后次数") + private Integer afterSaleTimes; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Date getReConsTime() { + return reConsTime; + } + + public void setReConsTime(Date reConsTime) { + this.reConsTime = reConsTime; + } + + public BigDecimal getConsAmount() { + return consAmount; + } + + public void setConsAmount(BigDecimal consAmount) { + this.consAmount = consAmount; + } + + public BigDecimal getActualAmount() { + return actualAmount; + } + + public void setActualAmount(BigDecimal actualAmount) { + this.actualAmount = actualAmount; + } + + public Integer getConsTimes() { + return consTimes; + } + + public void setConsTimes(Integer consTimes) { + this.consTimes = consTimes; + } + + public BigDecimal getAverDiscount() { + return averDiscount; + } + + public void setAverDiscount(BigDecimal averDiscount) { + this.averDiscount = averDiscount; + } + + public BigDecimal getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(BigDecimal reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public BigDecimal getAfterSaleAmount() { + return afterSaleAmount; + } + + public void setAfterSaleAmount(BigDecimal afterSaleAmount) { + this.afterSaleAmount = afterSaleAmount; + } + + public Integer getAfterSaleTimes() { + return afterSaleTimes; + } + + public void setAfterSaleTimes(Integer afterSaleTimes) { + this.afterSaleTimes = afterSaleTimes; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + @Override + public String toString() { + return "UserOrderStatisticVO{" + + "userId=" + userId + + ", reConsTime=" + reConsTime + + ", consAmount=" + consAmount + + ", actualAmount=" + actualAmount + + ", consTimes=" + consTimes + + ", allCount=" + allCount + + ", averDiscount=" + averDiscount + + ", reduceAmount=" + reduceAmount + + ", afterSaleAmount=" + afterSaleAmount + + ", afterSaleTimes=" + afterSaleTimes + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/VirtualRemarkVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/VirtualRemarkVO.java new file mode 100644 index 0000000..462bfdd --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/VirtualRemarkVO.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 虚拟商品留言信息 + * + * @author lhd + */ +public class VirtualRemarkVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品id + */ + @Schema(description = "商品id") + private Long spuId; + /** + * 留言标题 + */ + @Schema(description = "留言标题", requiredMode = Schema.RequiredMode.REQUIRED) + private String name; + /** + * 留言内容 + */ + @Schema(description = "留言内容", requiredMode = Schema.RequiredMode.REQUIRED) + private String value; + + /** + * 是否必填 + */ + @Schema(description = "是否必填", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean isRequired; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public Boolean getIsRequired() { + return isRequired; + } + + public void setIsRequired(Boolean isRequired) { + this.isRequired = isRequired; + } + + @Override + public String toString() { + return "VirtualRemarkDTO{" + + "spuId=" + spuId + + ", name='" + name + '\'' + + ", value='" + value + '\'' + + ", isRequired=" + isRequired + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsAttrBO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsAttrBO.java new file mode 100644 index 0000000..42d45d6 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsAttrBO.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public class EsAttrBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 规格id + */ + private Long attrId; + + /** + * 中文规格名 + */ + private String attrNameZh; + + /** + * 英文规格名 + */ + private String attrNameEn; + + /** + * 规格值id + */ + private Long attrValueId; + + /** + * 中文规格值名称 + */ + private String attrValueNameZh; + + /** + * 英文规格值名称 + */ + private String attrValueNameEn; + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public String getAttrNameZh() { + return attrNameZh; + } + + public void setAttrNameZh(String attrNameZh) { + this.attrNameZh = attrNameZh; + } + + public String getAttrNameEn() { + return attrNameEn; + } + + public void setAttrNameEn(String attrNameEn) { + this.attrNameEn = attrNameEn; + } + + public Long getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Long attrValueId) { + this.attrValueId = attrValueId; + } + + public String getAttrValueNameZh() { + return attrValueNameZh; + } + + public void setAttrValueNameZh(String attrValueNameZh) { + this.attrValueNameZh = attrValueNameZh; + } + + public String getAttrValueNameEn() { + return attrValueNameEn; + } + + public void setAttrValueNameEn(String attrValueNameEn) { + this.attrValueNameEn = attrValueNameEn; + } + + @Override + public String toString() { + return "EsAttrBO{" + + "attrId=" + attrId + + ", attrNameZh='" + attrNameZh + '\'' + + ", attrNameEn='" + attrNameEn + '\'' + + ", attrValueId=" + attrValueId + + ", attrValueNameZh='" + attrValueNameZh + '\'' + + ", attrValueNameEn='" + attrValueNameEn + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsBrandBO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsBrandBO.java new file mode 100644 index 0000000..cb5c4cf --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsBrandBO.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.bo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public class EsBrandBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 品牌id + */ + private Long brandId; + + /** + * 品牌图片 + */ + private String brandImg; + + /** + * 中文品牌名称 + */ + private String brandNameZh; + + /** + * 英文品牌名称 + */ + private String brandNameEn; + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public String getBrandImg() { + return brandImg; + } + + public void setBrandImg(String brandImg) { + this.brandImg = brandImg; + } + + public String getBrandNameZh() { + return brandNameZh; + } + + public void setBrandNameZh(String brandNameZh) { + this.brandNameZh = brandNameZh; + } + + public String getBrandNameEn() { + return brandNameEn; + } + + public void setBrandNameEn(String brandNameEn) { + this.brandNameEn = brandNameEn; + } + + @Override + public String toString() { + return "EsBrandBO{" + + "brandId=" + brandId + + ", brandImg='" + brandImg + '\'' + + ", brandNameZh='" + brandNameZh + '\'' + + ", brandNameEn='" + brandNameEn + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsCategoryBO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsCategoryBO.java new file mode 100644 index 0000000..886d9b4 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsCategoryBO.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public class EsCategoryBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分类id + */ + private Long categoryId; + + /** + * 中文分类名称 + */ + private String categoryNameZh; + + /** + * 英文分类名称 + */ + private String categoryNameEn; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public String getCategoryNameZh() { + return categoryNameZh; + } + + public void setCategoryNameZh(String categoryNameZh) { + this.categoryNameZh = categoryNameZh; + } + + public String getCategoryNameEn() { + return categoryNameEn; + } + + public void setCategoryNameEn(String categoryNameEn) { + this.categoryNameEn = categoryNameEn; + } + + @Override + public String toString() { + return "EsCategoryBO{" + + "categoryId=" + categoryId + + ", categoryNameZh='" + categoryNameZh + '\'' + + ", categoryNameEn='" + categoryNameEn + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsDeliveryModeBO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsDeliveryModeBO.java new file mode 100644 index 0000000..46f129d --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsDeliveryModeBO.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.bo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public class EsDeliveryModeBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户自提 + */ + private Boolean hasUserPickUp; + + /** + * 店铺配送 + */ + private Boolean hasShopDelivery; + + /** + * 同城配送 + */ + private Boolean hasCityDelivery; + + public Boolean getHasUserPickUp() { + return hasUserPickUp; + } + + public void setHasUserPickUp(Boolean hasUserPickUp) { + this.hasUserPickUp = hasUserPickUp; + } + + public Boolean getHasShopDelivery() { + return hasShopDelivery; + } + + public void setHasShopDelivery(Boolean hasShopDelivery) { + this.hasShopDelivery = hasShopDelivery; + } + + public Boolean getHasCityDelivery() { + return hasCityDelivery; + } + + public void setHasCityDelivery(Boolean hasCityDelivery) { + this.hasCityDelivery = hasCityDelivery; + } + + @Override + public String toString() { + return "EsDeliveryModeBO{" + + "hasUserPickUp=" + hasUserPickUp + + ", hasShopDelivery=" + hasShopDelivery + + ", hasCityDelivery=" + hasCityDelivery + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsProductBO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsProductBO.java new file mode 100644 index 0000000..20a6301 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsProductBO.java @@ -0,0 +1,937 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.bo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Set; + +/** + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public class EsProductBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品id + */ + private Long spuId; + + /** + * 中文商品名称-分词搜索字段 + */ + private String spuNameZh; + + /** + * 中文商品名称-模糊搜索字段 + */ + private String spuNameLikeZh; + + /** + * 英文商品名称-分词搜索字段 + */ + private String spuNameEn; + + /** + * 英文商品名称-模糊搜索字段 + */ + private String spuNameLikeEn; + + /** + * 中文卖点 + */ + private String sellingPointZh; + + /** + * 英文卖点 + */ + private String sellingPointEn; + + /** + * 商品积分价 + */ + private Long scoreFee; + + /** + * 商品售价 + */ + private Long priceFee; + + /** + * 市场价,整数方式保存 + */ + private Long marketPriceFee; + + /** + * 商品介绍主图 + */ + private String mainImgUrl; + + /** + * 商品类型 + */ + private Integer spuType; + /** + * 商品类别 0.实物商品 1. 虚拟商品 2.组合商品 2.组合商品 + */ + private Integer spuMold; + /** + * 是否可以退款 1.可以 0不可以 + */ + private Integer isRefund; + + + /** + * 店铺名称 搜索华为的时候,可以把华为的旗舰店搜索出来 + */ + private String shopName; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺logo + */ + private String shopImg; + + /** + * 店铺类型1自营店 2普通店 3供应商 + */ + private Integer shopType; + + /** + * 商品状态 + */ + private Integer spuStatus; + + /** + * 商品编码列表 + */ + private Set partyCodes; + + /** + * 商品条形码列表 + */ + private Set modelIds; + + /** + * 是否有库存 + */ + private Boolean hasStock; + + /** + * 库存 + */ + private Integer stock; + + /** + * 销量 + */ + private Integer saleNum; + + /** + * 实际销量 + */ + private Integer actualSoldNum; + + /** + * 注水销量 + */ + private Integer waterSoldNum; + + /** + * 评论数 + */ + private Integer commentNum; + + /** + * 好评量 + */ + private Integer goodReviewNum; + + /** + * 商品创建时间 + */ + private Date createTime; + + /** + * 商品更新时间 + */ + private Date updateTime; + + /** + * 活动开始时间 + */ + private Long activityStartTime; + + /** + * 活动开始时间 + */ + private Integer selectedLot; + + /** + * 秒杀商品分类 + */ + private Long seckillCategoryId; + + /** + * 品牌信息 + */ + private EsBrandBO brand; + + /** + * 商品序号 + */ + private Integer seq; + + /** + * 是否置顶 + */ + private Integer isTop; + + /** + * 活动id + */ + private Long activityId; + + /** + * 商家一级分类id + */ + private Long shopPrimaryCategoryId; + + /** + * 商家二级分类信息 + */ + private EsCategoryBO shopCategory; + + /** + * 平台一级分类id + */ + private Long primaryCategoryId; + + /** + * 平台二级分类id + */ + private Long secondaryCategoryId; + + /** + * 平台三级分类信息 + */ + private EsCategoryBO category; + + /** + * 商品分组id列表 + */ + private List tagIds; + + /** + * 商品用于搜索的规格属性 + */ + private List attrs; + + /** + * 品牌id + */ + private Long brandId; + + /** + * 平台分类id + */ + private Long categoryId; + + /** + * 店铺分类id + */ + private Long shopCategoryId; + + /** + * 用户端显示该商品(0:不显示, 1:显示) + */ + private Boolean appDisplay; + + /** + * 是否属于分销商品(true: 是,false: 否) + */ + private Boolean distributionSpu; + + /** + * 商品分销信息 + */ + private EsDistributionInfoBO distributionInfo; + + /** + * 供应商商品类型 0.否 1.是 2.商家代销 + */ + private Integer supplierSpuType; + + /** + * 平台分类 一级分类/二级分类/三级分类 示例 服装鞋包/服装/上衣 + */ + private String categoryNames; + + /** + * 供应商名字 + */ + private String supplierName; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 发货方式 1.供应商发货 2.仓库发货 + */ + private Integer supplierDeliveryType; + + /** + * 代销商品规格选择状态,1: 全选 2:部分选择 + */ + private Integer skuChoiceStatus; + + /** + * 代销商品状态 1:上架 2:部分上架 3:下架 4:部分下架 + */ + private Integer commissionSpuStatus; + + /** + * 供应商商品id,只有供应商商品类型为2时才会有 + */ + private Long supplierSpuId; + + /** + * SPU编码 + */ + private String spuCode; + /** + * 预售类型 -1:未开启 0.全款预售 1.定金预售 + */ + private Integer preSaleType; + + /** + * SKU编码 + */ + private String skuCode; + + /** + * 虚拟商品的留言备注 + */ + private String virtualRemark; + /** + * 库存预警数量 + */ + private Integer stockWarning; + + /** + * 配送方式 + */ + private EsDeliveryModeBO deliveryMode; + + /** + * 配送方式 + */ + private String deliveryModeVO; + + public String getDeliveryModeVO() { + return deliveryModeVO; + } + + public void setDeliveryModeVO(String deliveryModeVO) { + this.deliveryModeVO = deliveryModeVO; + } + + public EsDeliveryModeBO getDeliveryMode() { + return deliveryMode; + } + + public void setDeliveryMode(EsDeliveryModeBO deliveryMode) { + this.deliveryMode = deliveryMode; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSpuNameZh() { + return spuNameZh; + } + + public void setSpuNameZh(String spuNameZh) { + this.spuNameZh = spuNameZh; + } + + public String getSpuNameEn() { + return spuNameEn; + } + + public void setSpuNameEn(String spuNameEn) { + this.spuNameEn = spuNameEn; + } + + public String getSellingPointZh() { + return sellingPointZh; + } + + public void setSellingPointZh(String sellingPointZh) { + this.sellingPointZh = sellingPointZh; + } + + public String getSellingPointEn() { + return sellingPointEn; + } + + public void setSellingPointEn(String sellingPointEn) { + this.sellingPointEn = sellingPointEn; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public Integer getIsRefund() { + return isRefund; + } + + public void setIsRefund(Integer isRefund) { + this.isRefund = isRefund; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopImg() { + return shopImg; + } + + public void setShopImg(String shopImg) { + this.shopImg = shopImg; + } + + public Integer getShopType() { + return shopType; + } + + public void setShopType(Integer shopType) { + this.shopType = shopType; + } + + public Integer getSpuStatus() { + return spuStatus; + } + + public void setSpuStatus(Integer spuStatus) { + this.spuStatus = spuStatus; + } + + public Set getPartyCodes() { + return partyCodes; + } + + public void setPartyCodes(Set partyCodes) { + this.partyCodes = partyCodes; + } + + public Set getModelIds() { + return modelIds; + } + + public void setModelIds(Set modelIds) { + this.modelIds = modelIds; + } + + public Boolean getHasStock() { + return hasStock; + } + + public void setHasStock(Boolean hasStock) { + this.hasStock = hasStock; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Integer getActualSoldNum() { + return actualSoldNum; + } + + public void setActualSoldNum(Integer actualSoldNum) { + this.actualSoldNum = actualSoldNum; + } + + public Integer getWaterSoldNum() { + return waterSoldNum; + } + + public void setWaterSoldNum(Integer waterSoldNum) { + this.waterSoldNum = waterSoldNum; + } + + public Integer getCommentNum() { + return commentNum; + } + + public void setCommentNum(Integer commentNum) { + this.commentNum = commentNum; + } + + public Integer getGoodReviewNum() { + return goodReviewNum; + } + + public void setGoodReviewNum(Integer goodReviewNum) { + this.goodReviewNum = goodReviewNum; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Long getActivityStartTime() { + return activityStartTime; + } + + public void setActivityStartTime(Long activityStartTime) { + this.activityStartTime = activityStartTime; + } + + public Integer getSelectedLot() { + return selectedLot; + } + + public void setSelectedLot(Integer selectedLot) { + this.selectedLot = selectedLot; + } + + public Long getSeckillCategoryId() { + return seckillCategoryId; + } + + public void setSeckillCategoryId(Long seckillCategoryId) { + this.seckillCategoryId = seckillCategoryId; + } + + public EsBrandBO getBrand() { + return brand; + } + + public void setBrand(EsBrandBO brand) { + this.brand = brand; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Long getShopPrimaryCategoryId() { + return shopPrimaryCategoryId; + } + + public void setShopPrimaryCategoryId(Long shopPrimaryCategoryId) { + this.shopPrimaryCategoryId = shopPrimaryCategoryId; + } + + public EsCategoryBO getShopCategory() { + return shopCategory; + } + + public void setShopCategory(EsCategoryBO shopCategory) { + this.shopCategory = shopCategory; + } + + public Long getPrimaryCategoryId() { + return primaryCategoryId; + } + + public void setPrimaryCategoryId(Long primaryCategoryId) { + this.primaryCategoryId = primaryCategoryId; + } + + public Long getSecondaryCategoryId() { + return secondaryCategoryId; + } + + public void setSecondaryCategoryId(Long secondaryCategoryId) { + this.secondaryCategoryId = secondaryCategoryId; + } + + public EsCategoryBO getCategory() { + return category; + } + + public void setCategory(EsCategoryBO category) { + this.category = category; + } + + public List getTagIds() { + return tagIds; + } + + public void setTagIds(List tagIds) { + this.tagIds = tagIds; + } + + public List getAttrs() { + return attrs; + } + + public void setAttrs(List attrs) { + this.attrs = attrs; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopCategoryId() { + return shopCategoryId; + } + + public void setShopCategoryId(Long shopCategoryId) { + this.shopCategoryId = shopCategoryId; + } + + public Boolean getAppDisplay() { + return appDisplay; + } + + public void setAppDisplay(Boolean appDisplay) { + this.appDisplay = appDisplay; + } + + public Boolean getDistributionSpu() { + return distributionSpu; + } + + public void setDistributionSpu(Boolean distributionSpu) { + this.distributionSpu = distributionSpu; + } + + public EsDistributionInfoBO getDistributionInfo() { + return distributionInfo; + } + + public void setDistributionInfo(EsDistributionInfoBO distributionInfo) { + this.distributionInfo = distributionInfo; + } + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public String getCategoryNames() { + return categoryNames; + } + + public void setCategoryNames(String categoryNames) { + this.categoryNames = categoryNames; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Integer getSkuChoiceStatus() { + return skuChoiceStatus; + } + + public void setSkuChoiceStatus(Integer skuChoiceStatus) { + this.skuChoiceStatus = skuChoiceStatus; + } + + public Integer getCommissionSpuStatus() { + return commissionSpuStatus; + } + + public void setCommissionSpuStatus(Integer commissionSpuStatus) { + this.commissionSpuStatus = commissionSpuStatus; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public String getSkuCode() { + return skuCode; + } + + public void setSkuCode(String skuCode) { + this.skuCode = skuCode; + } + + public String getVirtualRemark() { + return virtualRemark; + } + + public void setVirtualRemark(String virtualRemark) { + this.virtualRemark = virtualRemark; + } + + public Integer getStockWarning() { + return stockWarning; + } + + public void setStockWarning(Integer stockWarning) { + this.stockWarning = stockWarning; + } + + public String getSpuNameLikeZh() { + return spuNameLikeZh; + } + + public void setSpuNameLikeZh(String spuNameLikeZh) { + this.spuNameLikeZh = spuNameLikeZh; + } + + public String getSpuNameLikeEn() { + return spuNameLikeEn; + } + + public void setSpuNameLikeEn(String spuNameLikeEn) { + this.spuNameLikeEn = spuNameLikeEn; + } + + @Override + public String toString() { + return "EsProductBO{" + + "spuId=" + spuId + + ", spuNameZh='" + spuNameZh + '\'' + + ", spuNameLikeZh='" + spuNameLikeZh + '\'' + + ", spuNameEn='" + spuNameEn + '\'' + + ", spuNameLikeEn='" + spuNameLikeEn + '\'' + + ", sellingPointZh='" + sellingPointZh + '\'' + + ", sellingPointEn='" + sellingPointEn + '\'' + + ", scoreFee=" + scoreFee + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", spuType=" + spuType + + ", spuMold=" + spuMold + + ", isRefund=" + isRefund + + ", shopName='" + shopName + '\'' + + ", shopId=" + shopId + + ", shopImg='" + shopImg + '\'' + + ", shopType=" + shopType + + ", spuStatus=" + spuStatus + + ", partyCodes=" + partyCodes + + ", modelIds=" + modelIds + + ", hasStock=" + hasStock + + ", stock=" + stock + + ", saleNum=" + saleNum + + ", actualSoldNum=" + actualSoldNum + + ", waterSoldNum=" + waterSoldNum + + ", commentNum=" + commentNum + + ", goodReviewNum=" + goodReviewNum + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", activityStartTime=" + activityStartTime + + ", selectedLot=" + selectedLot + + ", seckillCategoryId=" + seckillCategoryId + + ", brand=" + brand + + ", seq=" + seq + + ", isTop=" + isTop + + ", activityId=" + activityId + + ", shopPrimaryCategoryId=" + shopPrimaryCategoryId + + ", shopCategory=" + shopCategory + + ", primaryCategoryId=" + primaryCategoryId + + ", secondaryCategoryId=" + secondaryCategoryId + + ", category=" + category + + ", tagIds=" + tagIds + + ", attrs=" + attrs + + ", brandId=" + brandId + + ", categoryId=" + categoryId + + ", shopCategoryId=" + shopCategoryId + + ", appDisplay=" + appDisplay + + ", distributionSpu=" + distributionSpu + + ", distributionInfo=" + distributionInfo + + ", supplierSpuType=" + supplierSpuType + + ", categoryNames='" + categoryNames + '\'' + + ", supplierName='" + supplierName + '\'' + + ", supplierId=" + supplierId + + ", supplierDeliveryType=" + supplierDeliveryType + + ", skuChoiceStatus=" + skuChoiceStatus + + ", commissionSpuStatus=" + commissionSpuStatus + + ", supplierSpuId=" + supplierSpuId + + ", spuCode='" + spuCode + '\'' + + ", preSaleType=" + preSaleType + + ", skuCode='" + skuCode + '\'' + + ", virtualRemark='" + virtualRemark + '\'' + + ", stockWarning=" + stockWarning + + ", deliveryMode='" + deliveryMode + '\'' + + ", deliveryModeVO='" + deliveryModeVO + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ComboSpuType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ComboSpuType.java new file mode 100644 index 0000000..0e590fd --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ComboSpuType.java @@ -0,0 +1,36 @@ +package com.tmerclub.cloud.common.product.constant;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +/** + * @author xxw + * 套餐商品类型 + * @date 2022/8/25 15:23 + */ +public enum ComboSpuType { + /** + * 主商品 + */ + MAIN_SPU(1), + + /** + * 搭配商品 + */ + MATCH_SPU(2); + + private final Integer value; + + public Integer value() { + return value; + } + + ComboSpuType(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ComboStatus.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ComboStatus.java new file mode 100644 index 0000000..71b4d7b --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ComboStatus.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * @author xxw + * @date 2022/8/16 15:43 + * 套餐状态 + */ +public enum ComboStatus { + /** + * 已删除 + */ + DELETE(-1), + + /** + * 关闭 + */ + CLOSE(0), + + /** + * 进行中 + */ + PROCEED(1); + + private final Integer value; + + public Integer value() { + return this.value; + } + + ComboStatus(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/CommissionSpuOffType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/CommissionSpuOffType.java new file mode 100644 index 0000000..268144b --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/CommissionSpuOffType.java @@ -0,0 +1,41 @@ +package com.tmerclub.cloud.common.product.constant;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +/** + * @author xxw + * @date 2022/8/5 17:13 + * 代销商品下架类型 + */ +public enum CommissionSpuOffType { + /** + * 全部 + */ + ALL(0), + + /** + * 供应商发货的代销商品 + */ + SUPPLIER_DELIVERY_SPU(1), + + /** + * 商家自己发货的代销商品 + */ + SHOP_DELIVERY(2); + + private final Integer value; + + public Integer value() { + return this.value; + } + + CommissionSpuOffType(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ContentValue.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ContentValue.java new file mode 100644 index 0000000..fd58a94 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ContentValue.java @@ -0,0 +1,38 @@ +package com.tmerclub.cloud.common.product.constant;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +/** + * @author xxw + * @date 2022/7/13 16:06 + */ +public enum ContentValue { + /** + * 商品上架 + */ + SPU_PUT("商品上架"), + + SPU_OFF("商品下架"), + + SKU_CHANGE("代销SKU信息变更"), + + ADD_SKU("新增SKU"), + + SPU_CHANGE("代销SPU信息变更"); + + private final String value; + + public String value() { + return value; + } + + ContentValue(String value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/IsCommission.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/IsCommission.java new file mode 100644 index 0000000..cc48da1 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/IsCommission.java @@ -0,0 +1,36 @@ +package com.tmerclub.cloud.common.product.constant;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + + +/** + * @author xxw + * @date 2022/7/14 15:21 + * 是否代销了 + */ +public enum IsCommission { + /** + * 代销了 + */ + YES(1), + + /** + * 未代销 + */ + NO(0); + private final Integer value; + + public Integer value() { + return value; + } + + IsCommission(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/IsSynUpdate.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/IsSynUpdate.java new file mode 100644 index 0000000..5b797d3 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/IsSynUpdate.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * @author xxw + * @date 2022/7/19 9:34 + * 供应商商品更新后代销商品是否已同步更新 + */ +public enum IsSynUpdate { + /** + * 已更新 + */ + YEW_CHANGE(1), + + /** + * 未更新 + */ + NO_CHANGE(-1); + + public final Integer value; + + public Integer value() { + return value; + } + + IsSynUpdate(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/PreSaleType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/PreSaleType.java new file mode 100644 index 0000000..2f0078a --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/PreSaleType.java @@ -0,0 +1,33 @@ +package com.tmerclub.cloud.common.product.constant; + +/** + * 商品预售类型 + * + * @author chiley + * @date 2022/8/19 14:09 + */ +public enum PreSaleType { + /** + * 未开启预售 + */ + DISABLE(-1), + + /** + * 全款预售 + */ + FULLPAY(0), + /** + * 定金预售 + */ + DEPOSIT(1); + + private final Integer value; + + public Integer value() { + return value; + } + + PreSaleType(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SalesPriceType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SalesPriceType.java new file mode 100644 index 0000000..6b66e34 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SalesPriceType.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * @author xxw + * @date 2022/7/18 9:08 + * 代销设置智能设价的加价类型 + */ +public enum SalesPriceType { + /** + * 比例加价 + */ + PROPORTION_PRICE(0), + + /** + * 固定数值加价 + */ + FIXED_NUMBER_PRICE(1); + + private final Integer value; + + public Integer value() { + return value; + } + + SalesPriceType(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SalesType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SalesType.java new file mode 100644 index 0000000..683298d --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SalesType.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * @author xxw + * @date 2022/7/28 9:47 + * 代销设置类型 + */ +public enum SalesType { + /** + * 智能设价 + */ + SMART_PRICE(0), + + /** + * 手动设价 + */ + MANUAL_OPERATION_PRICE(1); + + private final Integer value; + + public Integer value() { + return value; + } + + SalesType(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SearchType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SearchType.java new file mode 100644 index 0000000..55d637b --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SearchType.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * 属性的搜素类型 + * + * @author yxf + * @date 2020/11/20 + */ +public enum SearchType { + + /** + * 不需要作为搜索参数 + */ + NOT_SEARCH(0), + + /** + * 搜索参数 + */ + SEARCH(1); + + private final Integer value; + + public Integer value() { + return value; + } + + SearchType(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SkuChoiceStatus.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SkuChoiceStatus.java new file mode 100644 index 0000000..4837b06 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SkuChoiceStatus.java @@ -0,0 +1,34 @@ +package com.tmerclub.cloud.common.product.constant;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +/** + * @author xxw + * @date 2022/7/5 11:32 + * 代销商品规格选择状态 + */ +public enum SkuChoiceStatus { + /** + * 全选 + */ + ALL_CHOICE(1), + /** + * 部分选择 + */ + PART_CHOICE(2); + private final Integer value; + + SkuChoiceStatus(Integer value) { + this.value = value; + } + + public Integer value() { + return value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SpuType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SpuType.java new file mode 100644 index 0000000..5211fe0 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SpuType.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * 商品类型 + * + * @author yxf + * @date 2020/11/20 + */ +public enum SpuType { + + /** + * 普通商品类型 + */ + NORMAL(0, "普通商品"), + + /** + * 团购商品类型 + */ + GROUP(1, "团购商品"), + /** + * 秒杀商品类型 + */ + SECKILL(2, "秒杀商品"), + /** + * 积分商品类型 + */ + SCORE(3, "积分商品"), + /** + * 预售商品类型 + */ + PRESALE(4, "预售商品"), + /** + * 活动商品类型 + */ + ACTIVE(5, "活动商品"); + + private final Integer value; + + private final String spuTypeName; + + public Integer value() { + return value; + } + + public String getSpuTypeName() { + return spuTypeName; + } + + SpuType(Integer value, String spuTypeName) { + this.value = value; + this.spuTypeName = spuTypeName; + } + + public static String getSpuTypeName(Integer value) { + SpuType[] enums = values(); + for (SpuType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum.spuTypeName; + } + } + return null; + } + +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockBillType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockBillType.java new file mode 100644 index 0000000..50b6b82 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockBillType.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * @Author lth + * @Date 2021/9/9 15:49 + */ +public enum StockBillType { + /** + * 采购入库 + */ + PURCHASE_STORAGE(1, StockType.WAREHOUSING, "采购入库", "Purchasing Inbound"), + /** + * 退货入库 + */ + RETURN_STORAGE(2, StockType.WAREHOUSING, "退款入库", "Refunds to the Treasury"), + /** + * 其他入库 + */ + OTHER_STORAGE(3, StockType.WAREHOUSING, "其他入库", "Other inbound"), + /** + * 销售出库 + */ + PURCHASE_OUTBOUND(4, StockType.OUT_OF_STOCK, "销售出库", "Sales out"), + /** + * 编辑出库 + */ + EDIT_OUTBOUND(5, StockType.OUT_OF_STOCK, "编辑出库", "Edit Out"), + /** + * 其他出库 + */ + OTHER_OUTBOUND(6, StockType.OUT_OF_STOCK, "其他出库", "Other Outbound"), + /** + * 库存初始化 + */ + INITIALIZE(7, StockType.WAREHOUSING, "库存初始化", "Inventory initialization"), + + /** + * 订单取消 + */ + ORDER_CANCEL(8, StockType.WAREHOUSING, "订单取消", "Order Cancel"), + + /** + * 编辑入库 + */ + EDIT_STORAGE(9, StockType.WAREHOUSING, "编辑入库", "Edit In"), + + /** + * 盘盈入库 + */ + PROFIT_STORAGE(10, StockType.WAREHOUSING, "盘盈入库", "Inventory"), + + /** + * 盘亏出库 + */ + LOSS_OUTBOUND(11, StockType.OUT_OF_STOCK, "盘亏出库", "Inventory out"), + + /** + * 调拨入库 + */ + ALLOT_IN(12, StockType.WAREHOUSING, "调拨入库", "Allot In"), + + /** + * 调拨出库 + */ + ALLOT_OUT(13, StockType.OUT_OF_STOCK, "调拨出库", "Allot Out"), + + /** + * 库存模式切换出库 + */ + SWITCH_STATION(14, StockType.OUT_OF_STOCK, "库存模式切换出库", "Swtich Station"), + + /** + * 库存模式切换入库 + */ + SWITCH_WAREHOUSE(15, StockType.WAREHOUSING, "库存模式切换入库", "Swtich Warehouse"), + + /** + * 秒杀补充库存 + */ + SECKILL_STOCK(16, StockType.WAREHOUSING, "秒杀补充库存", "seckill stock"); + + private final Integer id; + + private final String remark; + + private final String remarkEn; + + private final StockType stockType; + + public Integer value() { + return id; + } + + public String text() { + return remark; + } + + public String textEn() { + return remarkEn; + } + + StockBillType(Integer id, StockType stockType, String remark, String remarkEn) { + this.id = id; + this.stockType = stockType; + this.remark = remark; + this.remarkEn = remarkEn; + } + + public static StockBillType instance(Integer value) { + StockBillType[] enums = values(); + for (StockBillType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public StockType getStockType() { + return stockType; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockPointType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockPointType.java new file mode 100644 index 0000000..cb739d9 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockPointType.java @@ -0,0 +1,35 @@ +package com.tmerclub.cloud.common.product.constant; + +/** + * 库存点类型 + * @author gaozijie + * @date 2023-11-09 + */ +public enum StockPointType { + /** + * 仓库 + */ + WAREHOUSE(1, "仓库"), + + /** + * 门店 + */ + STATION(2, "门店"); + + private final int value; + + private final String desc; + + StockPointType(int value, String desc) { + this.value = value; + this.desc = desc; + } + + public int getValue() { + return value; + } + + public String getDesc() { + return desc; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockType.java new file mode 100644 index 0000000..f2a3451 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockType.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * 出入库类型 + * + * @Author lth + * @Date 2021/9/9 13:38 + */ +public enum StockType { + + /** + * 出库 + */ + OUT_OF_STOCK(1, "出库"), + + /** + * 入库 + */ + WAREHOUSING(2, "入库"); + + private final Integer id; + + private final String remark; + + public Integer value() { + return id; + } + + public String text() { + return remark; + } + + StockType(Integer id, String remark) { + this.id = id; + this.remark = remark; + } + + public static StockType instance(Integer value) { + StockType[] enums = values(); + for (StockType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SupplierSpuType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SupplierSpuType.java new file mode 100644 index 0000000..043afba --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SupplierSpuType.java @@ -0,0 +1,38 @@ +package com.tmerclub.cloud.common.product.constant;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +/** + * @author xxw + * @date 2022/7/5 11:35 + * 供应商商品类型 + */ +public enum SupplierSpuType { + /** + * 否 + */ + NO(0), + /** + * 是 + */ + YES(1), + /** + * 商家代销 + */ + CONSIGNMENT(2); + private final Integer value; + + SupplierSpuType(Integer value) { + this.value = value; + } + + public Integer value() { + return value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/TakeStockBillStatus.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/TakeStockBillStatus.java new file mode 100644 index 0000000..af2fdb6 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/TakeStockBillStatus.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * 盘点状态 + * + * @author Citrus + */ +public enum TakeStockBillStatus { + + /** + * 已作废 + */ + VOIDED(0, "已作废", "VOIDED"), + + /** + * 盘点中 + */ + TAKING(1, "盘点中", "TAKING"), + + /** + * 已完成 + */ + COMPLETED(2, "已完成", "COMPLETED"), + ; + + private final Integer num; + private final String strCn; + private final String strEn; + + public Integer value() { + return num; + } + + public String strCn() { + return strCn; + } + + public String strEn() { + return strEn; + } + + TakeStockBillStatus(Integer num, String strCn, String strEn) { + this.num = num; + this.strCn = strCn; + this.strEn = strEn; + } + + public static TakeStockBillStatus instance(Integer value) { + TakeStockBillStatus[] enums = values(); + for (TakeStockBillStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/TakeStockExceptionEnum.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/TakeStockExceptionEnum.java new file mode 100644 index 0000000..a0d8211 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/TakeStockExceptionEnum.java @@ -0,0 +1,55 @@ +package com.tmerclub.cloud.common.product.constant; + +/** + * @author lanhai + */ +public enum TakeStockExceptionEnum { + + /** + * 删除商品 + */ + DELETE_PROD(1, "删除商品", "Delete product"), + + /** + * 盘点期间有库存变动 + */ + PROD_CHANGE(2, "盘点期间有库存变动", "Inventory movements during the stocktaking period"), + + /** + * 其他 + */ + OTHER(3, "其他", "Other"), + ; + + private final Integer num; + private final String strCn; + private final String strEn; + + public Integer value() { + return num; + } + + public String strCn() { + return strCn; + } + + public String strEn() { + return strEn; + } + + TakeStockExceptionEnum(Integer num, String strCn, String strEn) { + this.num = num; + this.strCn = strCn; + this.strEn = strEn; + } + + public static TakeStockExceptionEnum instance(Integer value) { + TakeStockExceptionEnum[] enums = values(); + for (TakeStockExceptionEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/AttrLangDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/AttrLangDTO.java new file mode 100644 index 0000000..b649e97 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/AttrLangDTO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 属性-国际化表DTO + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class AttrLangDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "属性id") + private Long attrId; + + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "属性名称") + private String name; + + @Schema(description = "属性描述") + private String desc; + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + @Override + public String toString() { + return "AttrLangDTO{" + + "attrId=" + attrId + + ",lang=" + lang + + ",name=" + name + + ",desc=" + desc + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/AttrValueLangDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/AttrValueLangDTO.java new file mode 100644 index 0000000..cb1cafd --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/AttrValueLangDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 属性值-国际化表DTO + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class AttrValueLangDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "属性值id") + private Long attrValueId; + + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "属性值") + private String value; + + public Long getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Long attrValueId) { + this.attrValueId = attrValueId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "AttrValueLangDTO{" + + "attrValueId=" + attrValueId + + ",lang=" + lang + + ",value=" + value + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/CartComboMatchSpuDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/CartComboMatchSpuDTO.java new file mode 100644 index 0000000..0669ae6 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/CartComboMatchSpuDTO.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author xxw + * @date 2022/8/26 10:04 + */ +public class CartComboMatchSpuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐搭配商品id") + private Long spuId; + + @Schema(description = "套餐搭配商品skuId") + private Long skuId; + + @Schema(description = "套餐搭配商品旧skuId") + private Long oldSkuId; + + @Schema(description = "数量") + private Integer count; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getOldSkuId() { + return oldSkuId; + } + + public void setOldSkuId(Long oldSkuId) { + this.oldSkuId = oldSkuId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "CartComboMatchSpuDTO{" + + "spuId=" + spuId + + ", skuId=" + skuId + + ", oldSkuId=" + oldSkuId + + ", count=" + count + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ComboOrderDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ComboOrderDTO.java new file mode 100644 index 0000000..f664770 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ComboOrderDTO.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 套餐订单表DTO + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboOrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐订单id") + private Long comboOrderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "user_id") + private Long userId; + + @Schema(description = "套餐数量") + private Integer comboNum; + + @Schema(description = "支付金额") + private Long payPrice; + + @Schema(description = "订单编号") + private Long orderNumber; + + @Schema(description = "状态(0:待支付、1:支付成功)") + private Integer status; + + public Long getComboOrderId() { + return comboOrderId; + } + + public void setComboOrderId(Long comboOrderId) { + this.comboOrderId = comboOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getComboNum() { + return comboNum; + } + + public void setComboNum(Integer comboNum) { + this.comboNum = comboNum; + } + + public Long getPayPrice() { + return payPrice; + } + + public void setPayPrice(Long payPrice) { + this.payPrice = payPrice; + } + + public Long getOrderNumber() { + return orderNumber; + } + + public void setOrderNumber(Long orderNumber) { + this.orderNumber = orderNumber; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "ComboOrderDTO{" + + "comboOrderId=" + comboOrderId + + ",shopId=" + shopId + + ",comboId=" + comboId + + ",userId=" + userId + + ",comboNum=" + comboNum + + ",payPrice=" + payPrice + + ",orderNumber=" + orderNumber + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ProductSearchDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ProductSearchDTO.java new file mode 100644 index 0000000..3d00e1c --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ProductSearchDTO.java @@ -0,0 +1,942 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * @author FrozenWatermelon + * @date 2020/11/16 + */ +public class ProductSearchDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "页面传递过来的全文匹配关键字") + private String keyword; + + @Schema(description = "品牌id,可以多选") + private String brandIds; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商家一级分类id") + private Long shopPrimaryCategoryId; + + @Schema(description = "商家二级分类id") + private Long shopSecondaryCategoryId; + + @Schema(description = "平台一级分类id") + private Long primaryCategoryId; + + @Schema(description = "平台二级分类id") + private Long secondaryCategoryId; + + @Schema(description = "平台三级分类id") + private Long categoryId; + + /** + * 参考EsProductSortEnum + */ + @Schema(description = "排序:1新品,2销量倒序,3销量正序,4商品价格倒序,5商品价格正序,6评论,21spu编码正序, 22spu编码倒序, 23spu状态正序, 24spu状态倒序") + private Integer sort; + + @Schema(description = "自营店 1:自营店 2:非自营店") + private Integer selfShop; + + @Schema(description = "商品类型(0普通商品 1拼团 2秒杀 3积分)") + private Integer spuType; + + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品 2.组合商品") + private Integer spuMold; + + @Schema(description = "不为商品类别 0.实物商品 1. 虚拟商品 2.组合商品 2.组合商品") + private Integer notSpuMold; + + @Schema(description = "所选批次(0-23,一个数字代表一个时间段,每个时间段两小时,共24个)") + private Integer selectedLot; + + @Schema(description = "秒杀分类id") + private Integer seckillCategoryId; + + @Schema(description = "是否显示有货") + private Integer hasStock; + + @Schema(description = "价格区间查询-最低价") + private Long minPrice; + + @Schema(description = "价格区间查询-最高价") + private Long maxPrice; + + @Schema(description = "销量区间查询-最低销量") + private Long minSaleNum; + + @Schema(description = "销量区间查询-最高销量") + private Long maxSaleNum; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺id列表") + private List shopIds; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "商品状态") + private Integer spuStatus; + + @Schema(description = "属性值ids(属性之间用^拼接;属性于属性值id用_拼接;多个属性值id间用,拼接)") + private String attrIds; + + @Schema(description = "spuId列表") + private List spuIds; + + @Schema(description = "不为该spuId列表") + private List spuIdsExclude; + + @Schema(description = "分组id") + private Long tagId; + + @Schema(description = "活动id(关联prod_type)") + private Long activityId; + + @Schema(description = "是否需要活动信息 1:需要 0:不需要") + private Integer needActivity; + + @Schema(description = "商品编码列表(逗号分隔)") + private String partyCodes; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "商品条形码列表(逗号分隔)") + private String modelIds; + + @Schema(description = "0.全部 1.销售中 2.已售罄 3.已下架") + private Integer dataType; + + @Schema(description = "活动时间") + private Long activityTime; + + @Schema(description = "是否属于分销商品): 否") + private Boolean distributionSpu; + + @Schema(description = "分销状态(0:商家下架 1:商家上架 2:违规下架 3:平台审核)") + private Integer distributionState; + + @Schema(description = "奖励方式(0 按比例 1 按固定数值)") + private Integer awardMode; + + @Schema(description = "不匹配的商品类型(0普通商品 1拼团 2秒杀 3积分 4套餐 5活动)") + private List mustNotProdTypes; + + /** + * 非该平台一级分类id + */ + private Long notPrimaryCategoryId; + + /** + * 是否获取被删除的商品[装修+商品同步es定时任务使用] + */ + private Integer getDelete; + + /** + * 非商品模板使用 + */ + @Schema(description = "当前页") + private Integer pageNum; + + /** + * 非商品模板使用 + */ + @Schema(description = "每页大小") + private Integer pageSize; + + /** + * 0.非用户端搜索,1:用户端搜索 + */ + private Boolean appDisplay; + + /** + * 响应数据字段数组 + */ + private String[] fetchSource; + + /** + * 搜索属性信息 + */ + private Map> attrMap; + + @Schema(description = "供应商商品类型 0.否 1.是 2.商家代销") + private Integer supplierSpuType; + + @Schema(description = "店铺类型1自营店 2普通店 3供应商") + private Integer shopType; + + @Schema(description = "供货价") + private Double supplyPrice; + + @Schema(description = "供应商id集合") + private List supplierIds; + + @Schema(description = "分类ids") + private List categoryIds; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "SPU编码") + private String spuCode; + + @Schema(description = "SKU编码") + private String skuCode; + + @Schema(description = "是否库存预警商品 1.是 0.否") + private Integer stockWarning; + + @Schema(description = "skuIds") + private List skuIds; + + @Schema(description = "商家搜索供应商商品/代销商品标识") + private Boolean shopQuerySupplierSpu; + + @Schema(description = "是否展示预售商品 1.展示定金预售 0.否 2.展示全款预售") + private Integer canDeposit; + + @Schema(description = "代销商品状态 1:上架 2:部分上架 3:下架 4:部分下架 ") + private Integer commissionSpuStatus; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "是否筛选掉活动商品,空代表筛选,1代表不筛选") + private Integer isActive; + + @Schema(description = "是否筛选掉虚拟商品,空代表不筛选,1代表筛选") + private Integer isVirtual; + + @Schema(description = "是否为赠品活动的赠品") + private Integer isGiveaway; + + @Schema(description = "是否筛选掉供应商发货的代销商品,空代表不筛选,1代表筛选(去除供应商发货的商品)") + private Integer isSupplierDelivery; + + @Schema(description = "供应商商品发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + @Schema(description = "是否过滤掉供应商商品但不过滤导入的代销商品 0不过滤, 1过滤") + private Integer isSupplierType; + @Schema(description = "商品来源 0商家 1供应商 为空则不筛选") + private Integer spuOrigin; + + @Schema(description = "展示商品类型 0.展示指定的商品ids 1.展示瀑布流商品集合") + private Integer showSpuType; + + /** + * 装修商品时间排序规则参考,EsTimeRangeEnum + */ + @Schema(description = "装修商品时间排序规则 0.全部 1.最近一年 2.最近三个月 3.最近一个月 4.最近一个星期") + private Integer esTimeRange; + + /** + * 装修商品排序规则参考,EsRenovationProductSortEnum + */ + @Schema(description = "装修商品排序规则 0.上架时间升序 1.上架时间降序 2.销量倒序 3.销量正序 4.评论数倒序 5.评论数正序") + private Integer esRenovationSpuSort; + + @Schema(description = "是否为代销商品 0.否 1.是") + private Integer isCommission; + + private Integer lang; + + @Schema(description = "是否自提") + private Boolean hasUserPickUp; + + public Boolean getHasUserPickUp() { + return hasUserPickUp; + } + + public void setHasUserPickUp(Boolean hasUserPickUp) { + this.hasUserPickUp = hasUserPickUp; + } + + public Integer getSpuOrigin() { + return spuOrigin; + } + + public void setSpuOrigin(Integer spuOrigin) { + this.spuOrigin = spuOrigin; + } + public Integer getNotSpuMold() { + return notSpuMold; + } + + public void setNotSpuMold(Integer notSpuMold) { + this.notSpuMold = notSpuMold; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public Integer getShowSpuType() { + return showSpuType; + } + + public void setShowSpuType(Integer showSpuType) { + this.showSpuType = showSpuType; + } + + public Integer getEsTimeRange() { + return esTimeRange; + } + + public void setEsTimeRange(Integer esTimeRange) { + this.esTimeRange = esTimeRange; + } + + public Integer getEsRenovationSpuSort() { + return esRenovationSpuSort; + } + + public void setEsRenovationSpuSort(Integer esRenovationSpuSort) { + this.esRenovationSpuSort = esRenovationSpuSort; + } + + public Integer getIsSupplierType() { + return isSupplierType; + } + + public void setIsSupplierType(Integer isSupplierType) { + this.isSupplierType = isSupplierType; + } + + public Integer getIsGiveaway() { + return isGiveaway; + } + + public void setIsGiveaway(Integer isGiveaway) { + this.isGiveaway = isGiveaway; + } + + public Integer getCanDeposit() { + return canDeposit; + } + + public void setCanDeposit(Integer canDeposit) { + this.canDeposit = canDeposit; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Integer getStockWarning() { + return stockWarning; + } + + public void setStockWarning(Integer stockWarning) { + this.stockWarning = stockWarning; + } + + public Boolean getShopQuerySupplierSpu() { + return shopQuerySupplierSpu; + } + + public void setShopQuerySupplierSpu(Boolean shopQuerySupplierSpu) { + this.shopQuerySupplierSpu = shopQuerySupplierSpu; + } + + public List getSkuIds() { + return skuIds; + } + + public void setSkuIds(List skuIds) { + this.skuIds = skuIds; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public String getSkuCode() { + return skuCode; + } + + public void setSkuCode(String skuCode) { + this.skuCode = skuCode; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getIsSupplierDelivery() { + return isSupplierDelivery; + } + + public void setIsSupplierDelivery(Integer isSupplierDelivery) { + this.isSupplierDelivery = isSupplierDelivery; + } + + public Integer getIsVirtual() { + return isVirtual; + } + + public void setIsVirtual(Integer isVirtual) { + this.isVirtual = isVirtual; + } + + public Integer getIsActive() { + return isActive; + } + + public void setIsActive(Integer isActive) { + this.isActive = isActive; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public List getCategoryIds() { + return categoryIds; + } + + public void setCategoryIds(List categoryIds) { + this.categoryIds = categoryIds; + } + + public Integer getCommissionSpuStatus() { + return commissionSpuStatus; + } + + public void setCommissionSpuStatus(Integer commissionSpuStatus) { + this.commissionSpuStatus = commissionSpuStatus; + } + + public List getSupplierIds() { + return supplierIds; + } + + public void setSupplierIds(List supplierIds) { + this.supplierIds = supplierIds; + } + + public Double getSupplyPrice() { + return supplyPrice; + } + + public void setSupplyPrice(Double supplyPrice) { + this.supplyPrice = supplyPrice; + } + + public Integer getShopType() { + return shopType; + } + + public void setShopType(Integer shopType) { + this.shopType = shopType; + } + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public Integer getDistributionState() { + return distributionState; + } + + public void setDistributionState(Integer distributionState) { + this.distributionState = distributionState; + } + + public Integer getAwardMode() { + return awardMode; + } + + public void setAwardMode(Integer awardMode) { + this.awardMode = awardMode; + } + + public List getMustNotProdTypes() { + return mustNotProdTypes; + } + + public void setMustNotProdTypes(List mustNotProdTypes) { + this.mustNotProdTypes = mustNotProdTypes; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public Boolean getDistributionSpu() { + return distributionSpu; + } + + public void setDistributionSpu(Boolean distributionSpu) { + this.distributionSpu = distributionSpu; + } + + public Long getActivityTime() { + return activityTime; + } + + public void setActivityTime(Long activityTime) { + this.activityTime = activityTime; + } + + public Integer getSeckillCategoryId() { + return seckillCategoryId; + } + + public void setSeckillCategoryId(Integer seckillCategoryId) { + this.seckillCategoryId = seckillCategoryId; + } + + public Integer getSelectedLot() { + return selectedLot; + } + + public void setSelectedLot(Integer selectedLot) { + this.selectedLot = selectedLot; + } + + public String getKeyword() { + return keyword; + } + + public void setKeyword(String keyword) { + this.keyword = keyword; + } + + public String getBrandIds() { + return brandIds; + } + + public void setBrandIds(String brandIds) { + this.brandIds = brandIds; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopPrimaryCategoryId() { + return shopPrimaryCategoryId; + } + + public void setShopPrimaryCategoryId(Long shopPrimaryCategoryId) { + this.shopPrimaryCategoryId = shopPrimaryCategoryId; + } + + public Long getShopSecondaryCategoryId() { + return shopSecondaryCategoryId; + } + + public void setShopSecondaryCategoryId(Long shopSecondaryCategoryId) { + this.shopSecondaryCategoryId = shopSecondaryCategoryId; + } + + public Long getPrimaryCategoryId() { + return primaryCategoryId; + } + + public void setPrimaryCategoryId(Long primaryCategoryId) { + this.primaryCategoryId = primaryCategoryId; + } + + public Long getNotPrimaryCategoryId() { + return notPrimaryCategoryId; + } + + public void setNotPrimaryCategoryId(Long notPrimaryCategoryId) { + this.notPrimaryCategoryId = notPrimaryCategoryId; + } + + public Long getSecondaryCategoryId() { + return secondaryCategoryId; + } + + public void setSecondaryCategoryId(Long secondaryCategoryId) { + this.secondaryCategoryId = secondaryCategoryId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public Integer getSelfShop() { + return selfShop; + } + + public void setSelfShop(Integer selfShop) { + this.selfShop = selfShop; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public Integer getHasStock() { + return hasStock; + } + + public void setHasStock(Integer hasStock) { + this.hasStock = hasStock; + } + + public Long getMinPrice() { + return minPrice; + } + + public void setMinPrice(Long minPrice) { + this.minPrice = minPrice; + } + + public Long getMaxPrice() { + return maxPrice; + } + + public void setMaxPrice(Long maxPrice) { + this.maxPrice = maxPrice; + } + + public Long getMinSaleNum() { + return minSaleNum; + } + + public void setMinSaleNum(Long minSaleNum) { + this.minSaleNum = minSaleNum; + } + + public Long getMaxSaleNum() { + return maxSaleNum; + } + + public void setMaxSaleNum(Long maxSaleNum) { + this.maxSaleNum = maxSaleNum; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSpuStatus() { + return spuStatus; + } + + public void setSpuStatus(Integer spuStatus) { + this.spuStatus = spuStatus; + } + + public String getAttrIds() { + return attrIds; + } + + public void setAttrIds(String attrIds) { + this.attrIds = attrIds; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public List getSpuIdsExclude() { + return spuIdsExclude; + } + + public void setSpuIdsExclude(List spuIdsExclude) { + this.spuIdsExclude = spuIdsExclude; + } + + public Long getTagId() { + return tagId; + } + + public void setTagId(Long tagId) { + this.tagId = tagId; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getNeedActivity() { + return needActivity; + } + + public void setNeedActivity(Integer needActivity) { + this.needActivity = needActivity; + } + + public String getPartyCodes() { + return partyCodes; + } + + public void setPartyCodes(String partyCodes) { + this.partyCodes = partyCodes; + } + + public String getModelIds() { + return modelIds; + } + + public void setModelIds(String modelIds) { + this.modelIds = modelIds; + } + + public Integer getDataType() { + return dataType; + } + + public void setDataType(Integer dataType) { + this.dataType = dataType; + } + + public Map> getAttrMap() { + return attrMap; + } + + public void setAttrMap(Map> attrMap) { + this.attrMap = attrMap; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Boolean getAppDisplay() { + return appDisplay; + } + + public void setAppDisplay(Boolean appDisplay) { + this.appDisplay = appDisplay; + } + + public String[] getFetchSource() { + return fetchSource; + } + + public void setFetchSource(String[] fetchSource) { + this.fetchSource = fetchSource; + } + + public Integer getGetDelete() { + return getDelete; + } + + public void setGetDelete(Integer getDelete) { + this.getDelete = getDelete; + } + + public Integer getIsCommission() { + return isCommission; + } + + public void setIsCommission(Integer isCommission) { + this.isCommission = isCommission; + } + + @Override + public String toString() { + return "ProductSearchDTO{" + + "keyword='" + keyword + '\'' + + ", brandIds='" + brandIds + '\'' + + ", spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", shopPrimaryCategoryId=" + shopPrimaryCategoryId + + ", shopSecondaryCategoryId=" + shopSecondaryCategoryId + + ", primaryCategoryId=" + primaryCategoryId + + ", secondaryCategoryId=" + secondaryCategoryId + + ", categoryId=" + categoryId + + ", sort=" + sort + + ", selfShop=" + selfShop + + ", spuType=" + spuType + + ", spuMold=" + spuMold + + ", notSpuMold=" + notSpuMold + + ", selectedLot=" + selectedLot + + ", seckillCategoryId=" + seckillCategoryId + + ", hasStock=" + hasStock + + ", minPrice=" + minPrice + + ", maxPrice=" + maxPrice + + ", minSaleNum=" + minSaleNum + + ", maxSaleNum=" + maxSaleNum + + ", shopId=" + shopId + + ", shopIds=" + shopIds + + ", shopName='" + shopName + '\'' + + ", spuStatus=" + spuStatus + + ", attrIds='" + attrIds + '\'' + + ", spuIds=" + spuIds + + ", spuIdsExclude=" + spuIdsExclude + + ", tagId=" + tagId + + ", activityId=" + activityId + + ", needActivity=" + needActivity + + ", partyCodes='" + partyCodes + '\'' + + ", partyCode='" + partyCode + '\'' + + ", modelIds='" + modelIds + '\'' + + ", dataType=" + dataType + + ", activityTime=" + activityTime + + ", distributionSpu=" + distributionSpu + + ", distributionState=" + distributionState + + ", awardMode=" + awardMode + + ", mustNotProdTypes=" + mustNotProdTypes + + ", notPrimaryCategoryId=" + notPrimaryCategoryId + + ", getDelete=" + getDelete + + ", pageNum=" + pageNum + + ", pageSize=" + pageSize + + ", appDisplay=" + appDisplay + + ", fetchSource=" + Arrays.toString(fetchSource) + + ", attrMap=" + attrMap + + ", supplierSpuType=" + supplierSpuType + + ", shopType=" + shopType + + ", supplyPrice=" + supplyPrice + + ", supplierIds=" + supplierIds + + ", categoryIds=" + categoryIds + + ", supplierId=" + supplierId + + ", spuCode='" + spuCode + '\'' + + ", skuCode='" + skuCode + '\'' + + ", stockWarning=" + stockWarning + + ", skuIds=" + skuIds + + ", shopQuerySupplierSpu=" + shopQuerySupplierSpu + + ", canDeposit=" + canDeposit + + ", commissionSpuStatus=" + commissionSpuStatus + + ", supplierName='" + supplierName + '\'' + + ", isActive=" + isActive + + ", isVirtual=" + isVirtual + + ", isGiveaway=" + isGiveaway + + ", isSupplierDelivery=" + isSupplierDelivery + + ", supplierDeliveryType=" + supplierDeliveryType + + ", isSupplierType=" + isSupplierType + + ", spuOrigin=" + spuOrigin + + ", hasUserPickUp=" + hasUserPickUp + + ", showSpuType=" + showSpuType + + ", esTimeRange=" + esTimeRange + + ", esRenovationSpuSort=" + esRenovationSpuSort + + ", isCommission=" + isCommission + + ", lang=" + lang + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ProductSearchLimitDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ProductSearchLimitDTO.java new file mode 100644 index 0000000..fec10a5 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ProductSearchLimitDTO.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021/06/29 + */ +public class ProductSearchLimitDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public ProductSearchLimitDTO() { + } + + public ProductSearchLimitDTO(Integer size) { + this.size = size; + } + + @Schema(description = "店铺id列表") + private List shopIds; + + @Schema(description = "供应商id列表") + private List supplierIds; + + @Schema(description = "品牌id列表") + private List brandIds; + + @Schema(description = "商品分组id列表") + private List tagIds; + + @Schema(description = "大小") + private Integer size; + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public List getBrandIds() { + return brandIds; + } + + public void setBrandIds(List brandIds) { + this.brandIds = brandIds; + } + + public List getTagIds() { + return tagIds; + } + + public void setTagIds(List tagIds) { + this.tagIds = tagIds; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public List getSupplierIds() { + return supplierIds; + } + + public void setSupplierIds(List supplierIds) { + this.supplierIds = supplierIds; + } + + @Override + public String toString() { + return "ProductSearchLimitDTO{" + + "shopIds=" + shopIds + + ", supplierIds=" + supplierIds + + ", brandIds=" + brandIds + + ", tagIds=" + tagIds + + ", size=" + size + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SkuLangDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SkuLangDTO.java new file mode 100644 index 0000000..51a123b --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SkuLangDTO.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * sku-国际化表DTO + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class SkuLangDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public SkuLangDTO() { + } + + public SkuLangDTO(Integer lang, String skuName, String attrs) { + this.lang = lang; + this.skuName = skuName; + this.attrs = attrs; + } + + @Schema(description = "sku id") + private Long skuId; + + @Schema(description = "语言 1.中文 2.英文") + private Integer lang; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "多个销售属性值id逗号分隔") + private String attrs; + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getAttrs() { + return attrs; + } + + public void setAttrs(String attrs) { + this.attrs = attrs; + } + + @Override + public String toString() { + return "SkuLang{" + + "skuId=" + skuId + + ", lang=" + lang + + ", skuName='" + skuName + '\'' + + ", attrs='" + attrs + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuSkuAttrValueLangDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuSkuAttrValueLangDTO.java new file mode 100644 index 0000000..c2aaf25 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuSkuAttrValueLangDTO.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品sku属性值-国际化表DTO + * + * @author YXF + * @date 2021-04-09 17:30:44 + */ +public class SpuSkuAttrValueLangDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "销售属性值ID") + private Long spuSkuAttrId; + + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "销售属性名称") + private String attrName; + + + @Schema(description = "销售属性值") + private String attrValueName; + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public Long getSpuSkuAttrId() { + return spuSkuAttrId; + } + + public void setSpuSkuAttrId(Long spuSkuAttrId) { + this.spuSkuAttrId = spuSkuAttrId; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + @Override + public String toString() { + return "SpuSkuAttrValueLangDTO{" + + "spuSkuAttrId=" + spuSkuAttrId + + ", lang=" + lang + + ", attrName='" + attrName + '\'' + + ", attrValueName='" + attrValueName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/StockPointSkuDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/StockPointSkuDTO.java new file mode 100644 index 0000000..cdc10ae --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/StockPointSkuDTO.java @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * DTO + * + * @author FrozenWatermelon + * @date 2023-11-09 18:00:43 + */ +public class StockPointSkuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "库存商品关联skuid") + private Long stockPointSkuId; + + @Schema(description = "库存点id") + private Long stockPointId; + + @Schema(description = "库存点类型 1仓库 2门店 ") + private Integer stockPointType; + + @Schema(description = "spuId") + private Long spuId; + + @Schema(description = "skuid") + private Long skuId; + + @Schema(description = "sku商品编码") + private String partyCode; + + @Schema(description = "当商品为代销商品时,供应商商品skuid") + private Long supplierSkuId; + + @Schema(description = "状态 1:enable, 0:disable, -1:deleted") + private Integer status; + + @Schema(description = "库存") + private Integer stock; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "仓库类型(0默认仓库,1区域仓库)") + private Integer type; + + @Schema(description = "入库仓库id") + private Long inStockPointId; + + @Schema(description = "库存模式") + private Integer stockMode; + + @Schema(description = "更新时,变化的库存") + private Integer changeStock; + + @Hidden + @Schema(description = "库存点id集合") + private List stockPointIds; + + @Hidden + @Schema(description = "spuId集合") + private List spuIds; + + @Hidden + @Schema(description = "skuId集合") + private List skuIds; + + @Hidden + @Schema(description = "不包含skuId集合的集合") + private List notInSkuIds; + + @Hidden + @Schema(description = "分类id集合") + private List categoryIds; + + @Hidden + @Schema(description = "商品类别 0.实物商品 1.虚拟商品 2.组合商品") + private Integer spuMold; + + public StockPointSkuDTO(){ + } + + public StockPointSkuDTO(Long stockPointId, Integer stockPointType, Long spuId, Long skuId, Integer status, Integer type, Integer stockMode) { + this.stockPointId = stockPointId; + this.stockPointType = stockPointType; + this.spuId = spuId; + this.skuId = skuId; + this.status = status; + this.type = type; + this.stockMode = stockMode; + } + + public Integer getChangeStock() { + return changeStock; + } + + public void setChangeStock(Integer changeStock) { + this.changeStock = changeStock; + } + + public Integer getStockMode() { + return stockMode; + } + + public void setStockMode(Integer stockMode) { + this.stockMode = stockMode; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getStockPointSkuId() { + return stockPointSkuId; + } + + public void setStockPointSkuId(Long stockPointSkuId) { + this.stockPointSkuId = stockPointSkuId; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Long getSupplierSkuId() { + return supplierSkuId; + } + + public void setSupplierSkuId(Long supplierSkuId) { + this.supplierSkuId = supplierSkuId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getInStockPointId() { + return inStockPointId; + } + + public void setInStockPointId(Long inStockPointId) { + this.inStockPointId = inStockPointId; + } + + public List getStockPointIds() { + return stockPointIds; + } + + public void setStockPointIds(List stockPointIds) { + this.stockPointIds = stockPointIds; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public List getSkuIds() { + return skuIds; + } + + public void setSkuIds(List skuIds) { + this.skuIds = skuIds; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public List getNotInSkuIds() { + return notInSkuIds; + } + + public void setNotInSkuIds(List notInSkuIds) { + this.notInSkuIds = notInSkuIds; + } + + public List getCategoryIds() { + return categoryIds; + } + + public void setCategoryIds(List categoryIds) { + this.categoryIds = categoryIds; + } + + @Override + public String toString() { + return "StockPointSkuDTO{" + + "stockPointSkuId=" + stockPointSkuId + + ", stockPointId=" + stockPointId + + ", stockPointType=" + stockPointType + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", partyCode='" + partyCode + '\'' + + ", supplierSkuId=" + supplierSkuId + + ", status=" + status + + ", stock=" + stock + + ", spuName='" + spuName + '\'' + + ", categoryId=" + categoryId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", type=" + type + + ", inStockPointId=" + inStockPointId + + ", stockMode=" + stockMode + + ", changeStock=" + changeStock + + ", stockPointIds=" + stockPointIds + + ", spuIds=" + spuIds + + ", skuIds=" + skuIds + + ", notInSkuIds=" + notInSkuIds + + ", categoryIds=" + categoryIds + + ", spuMold=" + spuMold + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/TackStockDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/TackStockDTO.java new file mode 100644 index 0000000..4f3b290 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/TackStockDTO.java @@ -0,0 +1,115 @@ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lanhai + */ +public class TackStockDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "实物盘点id") + private Long takeStockId; + + @Schema(description = "盘点单号") + private String takeStockNo; + + @Schema(description = "盘点状态 0已作废 1盘点中 2已完成") + private Integer billStatus; + + @Schema(description = "制单人") + private Long maker; + + @Schema(description = "盘点区域名称") + private String stockRegionName; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "制单人手机号") + private String makerMobile; + + public Long getTakeStockId() { + return takeStockId; + } + + public void setTakeStockId(Long takeStockId) { + this.takeStockId = takeStockId; + } + + public String getTakeStockNo() { + return takeStockNo; + } + + public void setTakeStockNo(String takeStockNo) { + this.takeStockNo = takeStockNo; + } + + public Integer getBillStatus() { + return billStatus; + } + + public void setBillStatus(Integer billStatus) { + this.billStatus = billStatus; + } + + public Long getMaker() { + return maker; + } + + public void setMaker(Long maker) { + this.maker = maker; + } + + public String getStockRegionName() { + return stockRegionName; + } + + public void setStockRegionName(String stockRegionName) { + this.stockRegionName = stockRegionName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + @Override + public String toString() { + return "TackStockDTO{" + + "takeStockId=" + takeStockId + + ", takeStockNo='" + takeStockNo + '\'' + + ", billStatus=" + billStatus + + ", maker=" + maker + + ", stockRegionName='" + stockRegionName + '\'' + + ", remark='" + remark + '\'' + + ", shopId=" + shopId + + ", makerMobile='" + makerMobile + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrCategoryVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrCategoryVO.java new file mode 100644 index 0000000..8ab4053 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrCategoryVO.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 属性与属性分组关联信息VO + * + * @author YXF + * @date 2020-11-23 16:20:01 + */ +public class AttrCategoryVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "属性与分类关联id") + private Long attrCategoryId; + + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "属性id") + private Long attrId; + + public Long getAttrCategoryId() { + return attrCategoryId; + } + + public void setAttrCategoryId(Long attrCategoryId) { + this.attrCategoryId = attrCategoryId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + @Override + public String toString() { + return "AttrCategoryVO{" + + "attrCategoryId=" + attrCategoryId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",categoryId=" + categoryId + + ",attrId=" + attrId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrVO.java new file mode 100644 index 0000000..8f0de8c --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrVO.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 属性信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:23 + */ +public class AttrVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "attr id") + private Long attrId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "属性多语言信息") + private List attrLangList; + + @Schema(description = "属性名称") + private String name; + + @Schema(description = "属性描述") + private String desc; + + @Schema(description = "作为搜索参数 0:不需要,1:需要") + private Integer searchType; + + @Schema(description = "属性类型 0:销售属性,1:基本属性") + private Integer attrType; + + @Schema(description = "属性值列表") + private List attrValues; + + @Schema(description = "分类列表") + private List categories; + + @Schema(description = "系统类型 1.店铺 2.平台端 3.供应商") + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public Integer getAttrType() { + return attrType; + } + + public void setAttrType(Integer attrType) { + this.attrType = attrType; + } + + public Integer getSearchType() { + return searchType; + } + + public void setSearchType(Integer searchType) { + this.searchType = searchType; + } + + public List getAttrValues() { + return attrValues; + } + + public void setAttrValues(List attrValues) { + this.attrValues = attrValues; + } + + public List getCategories() { + return categories; + } + + public void setCategories(List categories) { + this.categories = categories; + } + + public List getAttrLangList() { + return attrLangList; + } + + public void setAttrLangList(List attrLangList) { + this.attrLangList = attrLangList; + } + + @Override + public String toString() { + return "AttrVO{" + + "attrId=" + attrId + + ", shopId=" + shopId + + ", attrLangList=" + attrLangList + + ", name='" + name + '\'' + + ", desc='" + desc + '\'' + + ", searchType=" + searchType + + ", attrType=" + attrType + + ", attrValues=" + attrValues + + ", categories=" + categories + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrValueVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrValueVO.java new file mode 100644 index 0000000..5a0ffed --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrValueVO.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 属性值信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class AttrValueVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "属性id") + private Long attrValueId; + + @Schema(description = "属性ID") + private Long attrId; + + @Schema(description = "属性值") + private String value; + + @Schema(description = "属性值多语言") + private List values; + + public Long getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Long attrValueId) { + this.attrValueId = attrValueId; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public List getValues() { + return values; + } + + public void setValues(List values) { + this.values = values; + } + + @Override + public String toString() { + return "AttrValueVO{" + + "attrValueId=" + attrValueId + + ",attrId=" + attrId + + ",value=" + value + + ",values=" + values + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/BrandVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/BrandVO.java new file mode 100644 index 0000000..b53ba83 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/BrandVO.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 品牌信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class BrandVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "brand_id") + private Long brandId; + + @Schema(description = "品牌多语言列表") + private List brandLangList; + + @Schema(description = "品牌名称") + private String name; + + @Schema(description = "品牌描述") + private String desc; + + @Schema(description = "品牌logo图片") + private String imgUrl; + + @Schema(description = "检索首字母") + private String firstLetter; + + @Schema(description = "排序") + private Integer seq; + + @Schema(description = "状态 1:enable, 0:disable, -1:deleted") + private Integer status; + + @Schema(description = "分类") + private List categories; + + @Schema(description = "分类id列表") + private List categoryIds; + + @Schema(description = "是否置顶 0:不置顶 1:置顶") + private Integer isTop; + + @Schema(description = "品牌下的商品数量") + private Integer spuCount; + + @Schema(description = "关联系统类型 1.店铺 2.平台端 3.供应商") + private Integer sysType; + + @Schema(description = "商品列表") + private List spuList; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public List getBrandLangList() { + return brandLangList; + } + + public void setBrandLangList(List brandLangList) { + this.brandLangList = brandLangList; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getFirstLetter() { + return firstLetter; + } + + public void setFirstLetter(String firstLetter) { + this.firstLetter = firstLetter; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public List getCategories() { + return categories; + } + + public void setCategories(List categories) { + this.categories = categories; + } + + public List getCategoryIds() { + return categoryIds; + } + + public void setCategoryIds(List categoryIds) { + this.categoryIds = categoryIds; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public Integer getSpuCount() { + return spuCount; + } + + public void setSpuCount(Integer spuCount) { + this.spuCount = spuCount; + } + + public List getSpuList() { + return spuList; + } + + public void setSpuList(List spuList) { + this.spuList = spuList; + } + + @Override + public String toString() { + return "BrandVO{" + + "brandId=" + brandId + + ", brandLangList=" + brandLangList + + ", name='" + name + '\'' + + ", desc='" + desc + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", firstLetter='" + firstLetter + '\'' + + ", seq=" + seq + + ", status=" + status + + ", categories=" + categories + + ", categoryIds=" + categoryIds + + ", isTop=" + isTop + + ", spuCount=" + spuCount + + ", sysType=" + sysType + + ", spuList=" + spuList + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/CategoryLangVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/CategoryLangVO.java new file mode 100644 index 0000000..1aaa5b8 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/CategoryLangVO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分类-国际化表VO + * + * @author YXF + * @date 2021-04-22 17:48:16 + */ +public class CategoryLangVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "分类名称") + private String name; + + @Schema(description = "父级分类名称") + private String parentName; + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "CategoryLangVO{" + + "lang=" + lang + + ", name='" + name + '\'' + + ", parentName='" + parentName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ComboOrderVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ComboOrderVO.java new file mode 100644 index 0000000..16b6aea --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ComboOrderVO.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 套餐订单表VO + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboOrderVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐订单id") + private Long comboOrderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "user_id") + private Long userId; + + @Schema(description = "套餐数量") + private Integer comboNum; + + @Schema(description = "支付金额") + private Long payPrice; + + @Schema(description = "订单编号") + private Long orderNumber; + + @Schema(description = "状态(0:待支付、1:支付成功)") + private Integer status; + + public Long getComboOrderId() { + return comboOrderId; + } + + public void setComboOrderId(Long comboOrderId) { + this.comboOrderId = comboOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getComboNum() { + return comboNum; + } + + public void setComboNum(Integer comboNum) { + this.comboNum = comboNum; + } + + public Long getPayPrice() { + return payPrice; + } + + public void setPayPrice(Long payPrice) { + this.payPrice = payPrice; + } + + public Long getOrderNumber() { + return orderNumber; + } + + public void setOrderNumber(Long orderNumber) { + this.orderNumber = orderNumber; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "ComboOrderVO{" + + "comboOrderId=" + comboOrderId + + ",shopId=" + shopId + + ",comboId=" + comboId + + ",userId=" + userId + + ",comboNum=" + comboNum + + ",payPrice=" + payPrice + + ",orderNumber=" + orderNumber + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/GiveawaySpuVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/GiveawaySpuVO.java new file mode 100644 index 0000000..c5f8369 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/GiveawaySpuVO.java @@ -0,0 +1,254 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 赠品套装商品项VO + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:59 + */ +public class GiveawaySpuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "赠品商品项id") + private Long giveawaySpuId; + + @Schema(description = "赠品id") + private Long giveawayId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "赠送数量") + private Integer giveawayNum; + + @Schema(description = "退货价") + private Long refundPrice; + + @Schema(description = "状态 1:正常 0:失效 -1:删除") + private Integer status; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品图片") + private String mainImgUrl; + + @Schema(description = "sku主图片") + private String skuImgUrl; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "商品现价") + private Long priceFee; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "平台分类id") + private Long categoryId; + + @Schema(description = "sku库存") + private Integer skuStock; + + @Schema(description = "sku编码") + private String partyCode; + + /** + * 订单项id + * id生成位置: SubmitOrderManager.loadOrderDateId() + * 业务位置: 提交订单- SubmitOrderManager.checkSubmitInfo() + */ + @Schema(description = "订单项id") + private Long orderItemId; + + @Schema(description = "库存关联列表") + private List stockPointList; + + public Long getGiveawaySpuId() { + return giveawaySpuId; + } + + public void setGiveawaySpuId(Long giveawaySpuId) { + this.giveawaySpuId = giveawaySpuId; + } + + public Long getGiveawayId() { + return giveawayId; + } + + public void setGiveawayId(Long giveawayId) { + this.giveawayId = giveawayId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getGiveawayNum() { + return giveawayNum; + } + + public void setGiveawayNum(Integer giveawayNum) { + this.giveawayNum = giveawayNum; + } + + public Long getRefundPrice() { + return refundPrice; + } + + public void setRefundPrice(Long refundPrice) { + this.refundPrice = refundPrice; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Integer getSkuStock() { + return skuStock; + } + + public void setSkuStock(Integer skuStock) { + this.skuStock = skuStock; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSkuImgUrl() { + return skuImgUrl; + } + + public void setSkuImgUrl(String skuImgUrl) { + this.skuImgUrl = skuImgUrl; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public List getStockPointList() { + return stockPointList; + } + + public void setStockPointList(List stockPointList) { + this.stockPointList = stockPointList; + } + + @Override + public String toString() { + return "GiveawaySpuVO{" + + "giveawaySpuId=" + giveawaySpuId + + ", giveawayId=" + giveawayId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", giveawayNum=" + giveawayNum + + ", refundPrice=" + refundPrice + + ", status=" + status + + ", spuName='" + spuName + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", skuImgUrl='" + skuImgUrl + '\'' + + ", skuName='" + skuName + '\'' + + ", priceFee=" + priceFee + + ", shopId=" + shopId + + ", categoryId=" + categoryId + + ", skuStock=" + skuStock + + ", partyCode='" + partyCode + '\'' + + ", orderItemId=" + orderItemId + + ", stockPointList=" + stockPointList + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/GiveawayVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/GiveawayVO.java new file mode 100644 index 0000000..3f18500 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/GiveawayVO.java @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 赠品表VO + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:58 + */ +public class GiveawayVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "赠品id") + private Long giveawayId; + + @Schema(description = "赠品名称") + @NotBlank(message = "赠品名称不能为空") + @Length(max = 20, message = "赠品名称长度不能超过20") + private String name; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "活动开始时间") + @NotNull(message = "活动开始时间不能为空") + private Date startTime; + + @Schema(description = "活动结束时间") + @NotNull(message = "活动结束时间不能为空") + private Date endTime; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "主商品id") + @NotNull(message = "主商品不能为空") + private Long spuId; + + @Schema(description = "商品价格") + private Double price; + + @Schema(description = "主商品图片") + private String mainImgUrl; + + @Schema(description = "主商品名称") + private String spuName; + + @Schema(description = "主商品名称") + private String giveawaySpuName; + + @Schema(description = "购买数量(购买了多少件才赠送赠品)") + @NotNull(message = "购买数量不能为空") + private Integer buyNum; + + @Schema(description = "状态 -1:已删除 0:关闭 1:开启 2:未开启") + private Integer status; + + @Schema(description = "赠送商品列表") + @Valid + private List giveawaySpus; + + public Long getGiveawayId() { + return giveawayId; + } + + public void setGiveawayId(Long giveawayId) { + this.giveawayId = giveawayId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public Date getCreateTime() { + return createTime; + } + + @Override + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + @Override + public Date getUpdateTime() { + return updateTime; + } + + @Override + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getGiveawaySpuName() { + return giveawaySpuName; + } + + public void setGiveawaySpuName(String giveawaySpuName) { + this.giveawaySpuName = giveawaySpuName; + } + + public Integer getBuyNum() { + return buyNum; + } + + public void setBuyNum(Integer buyNum) { + this.buyNum = buyNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public List getGiveawaySpus() { + return giveawaySpus; + } + + public void setGiveawaySpus(List giveawaySpus) { + this.giveawaySpus = giveawaySpus; + } + + @Override + public String toString() { + return "GiveawayVO{" + + "giveawayId=" + giveawayId + + ", name='" + name + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", shopId=" + shopId + + ", spuId=" + spuId + + ", price=" + price + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", spuName='" + spuName + '\'' + + ", giveawaySpuName='" + giveawaySpuName + '\'' + + ", buyNum=" + buyNum + + ", status=" + status + + ", giveawaySpus=" + giveawaySpus + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/GroupActivitySpuVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/GroupActivitySpuVO.java new file mode 100644 index 0000000..57734a2 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/GroupActivitySpuVO.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 拼团活动表VO + * + * @author YXF + * @date 2021-03-20 10:39:31 + */ +public class GroupActivitySpuVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "拼团活动id") + private Long groupActivityId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "成团人数") + private Integer groupNumber; + + @Schema(description = "已成团人数(统计)") + private Long groupOrderCount; + + @Schema(description = "商品价格(sku最低价)") + private Long price; + + @Schema(description = "活动开始时间") + private Long startTime; + + @Schema(description = "活动状态") + private Integer status; + + public Long getStartTime() { + return startTime; + } + + public void setStartTime(Long startTime) { + this.startTime = startTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getGroupNumber() { + return groupNumber; + } + + public void setGroupNumber(Integer groupNumber) { + this.groupNumber = groupNumber; + } + + public Long getGroupOrderCount() { + return groupOrderCount; + } + + public void setGroupOrderCount(Long groupOrderCount) { + this.groupOrderCount = groupOrderCount; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + @Override + public String toString() { + return "GroupActivitySpuVO{" + + "groupActivityId=" + groupActivityId + + ", spuId=" + spuId + + ", groupNumber=" + groupNumber + + ", groupOrderCount=" + groupOrderCount + + ", price=" + price + + ", startTime=" + startTime + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuAddrVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuAddrVO.java new file mode 100644 index 0000000..3b189e3 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuAddrVO.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author Citrus + * @date 2021/11/26 14:36 + */ +public class SkuAddrVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "属性id") + private Long skuId; + + @Schema(description = "SPU id") + private Long spuId; + + @Schema(description = "shopId") + private Long shopId; + + @Schema(description = "商品重量") + private BigDecimal weight; + + @Schema(description = "商品体积") + private BigDecimal volume; + + @Schema(description = "运费模板id") + private Long deliveryTemplateId; + /** + * 商品类别 0.实物商品 1. 虚拟商品 2.组合商品 + */ + private Integer spuMold; + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public BigDecimal getWeight() { + return weight; + } + + public void setWeight(BigDecimal weight) { + this.weight = weight; + } + + public BigDecimal getVolume() { + return volume; + } + + public void setVolume(BigDecimal volume) { + this.volume = volume; + } + + public Long getDeliveryTemplateId() { + return deliveryTemplateId; + } + + public void setDeliveryTemplateId(Long deliveryTemplateId) { + this.deliveryTemplateId = deliveryTemplateId; + } + + @Override + public String toString() { + return "SkuAddrVO{" + + "skuId=" + skuId + + ", spuId=" + spuId + + ", shopId=" + shopId + + ", weight=" + weight + + ", volume=" + volume + + ", deliveryTemplateId=" + deliveryTemplateId + + ", spuMold=" + spuMold + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuComboVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuComboVO.java new file mode 100644 index 0000000..5e77021 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuComboVO.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 规格组合商品管理表VO + * + * @author lhd + * @date 2023-11-06 11:00:41 + */ +public class SkuComboVO extends BaseVO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "规格id") + private Long skuId; + + @Schema(description = "主商品id") + private Long spuId; + + @Schema(description = "组合的skuid") + private Long comboSkuId; + + @Schema(description = "图片") + private String imgUrl; + @Schema(description = "组合数量") + private Integer comboCount; + @Schema(description = "组合总价") + private Long totalComboAmount; + + @Schema(description = "商品id") + private Long comboSpuId; + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "规格名称") + private String skuName; + + @Schema(description = "原销售价") + private Long priceFee; + + @Schema(description = "库存") + private Integer stock; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Long getTotalComboAmount() { + return totalComboAmount; + } + + public void setTotalComboAmount(Long totalComboAmount) { + this.totalComboAmount = totalComboAmount; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Long getComboSpuId() { + return comboSpuId; + } + + public void setComboSpuId(Long comboSpuId) { + this.comboSpuId = comboSpuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Integer getComboCount() { + return comboCount; + } + + public void setComboCount(Integer comboCount) { + this.comboCount = comboCount; + } + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getComboSkuId() { + return comboSkuId; + } + + public void setComboSkuId(Long comboSkuId) { + this.comboSkuId = comboSkuId; + } + + @Override + public String toString() { + return "SkuComboVO{" + + "skuId=" + skuId + + ", spuId=" + spuId + + ", comboSkuId=" + comboSkuId + + ", imgUrl='" + imgUrl + '\'' + + ", comboCount=" + comboCount + + ", totalComboAmount=" + totalComboAmount + + ", comboSpuId=" + comboSpuId + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", priceFee=" + priceFee + + ", stock=" + stock + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuLangVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuLangVO.java new file mode 100644 index 0000000..248189f --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuLangVO.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * sku-国际化表VO + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class SkuLangVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "sku id") + private Long skuId; + + @Schema(description = "语言 1.中文 2.英文") + private Integer lang; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "组合主sku名称") + private String comboSkuName; + + @Schema(description = "多个销售属性值id逗号分隔") + private String attrs; + + public String getComboSkuName() { + return comboSkuName; + } + + public void setComboSkuName(String comboSkuName) { + this.comboSkuName = comboSkuName; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getAttrs() { + return attrs; + } + + public void setAttrs(String attrs) { + this.attrs = attrs; + } + + @Override + public String toString() { + return "SkuLangVO{" + + "skuId=" + skuId + + ",lang=" + lang + + ",skuName=" + skuName + + ",attrs=" + attrs + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuVO.java new file mode 100644 index 0000000..a231548 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SkuVO.java @@ -0,0 +1,405 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * sku信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SkuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "属性id") + private Long skuId; + + @Schema(description = "旧id") + private Long oldSkuId; + + @Schema(description = "SPU id") + private Long spuId; + + @Schema(description = "spu名称") + private String spuName; + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "sku国际化信息") + private List skuLangList; + + @Schema(description = "主图:sku有图片使用sku图片,否则使用商品主图") + private String mainImgUrl; + + @Schema(description = "sku图片") + private String imgUrl; + + @Schema(description = "售价,整数方式保存") + private Long priceFee; + + @Schema(description = "市场价,整数方式保存") + private Long marketPriceFee; + + @Schema(description = "状态 1:enable, 0:disable, -1:deleted") + private Integer status; + + @Schema(description = "库存") + private Integer stock; + + @Schema(description = "供应商品库存") + private Integer supplierStock; + + @Schema(description = "商品销量") + private Integer saleNum; + + @Schema(description = "积分价格") + private Long scoreFee; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "商品条形码") + private String modelId; + + @Schema(description = "商品重量") + private BigDecimal weight; + + @Schema(description = "商品体积") + private BigDecimal volume; + + @Schema(description = "当前sku规格列表") + private List spuSkuAttrValues; + + @Schema(description = "供应商商品sku编码") + private String supplierSkuCode; + + @Schema(description = "当前供应商品sku是否可卖 0不可售,1可售") + private Integer isSell; + + @Schema(description = "供货价") + private Long supplyPriceFee; + + @Schema(description = "当商品为代销商品时,供应商商品skuid") + private Long supplierSkuId; + + @Schema(description = "库存预警数量") + private Long stockWarning; + + @Schema(description = "供应商sku状态") + private Integer supplierSkuStatus; + + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品") + private Integer spuMold; + + @Schema(description = "当前sku组合的sku列表") + private List skuComboList; + + @Schema(description = "库存点id") + private Long stockPointId; + + @Schema(description = "库存关联列表") + private List stockPointList; + + @Schema(description = "入库库存点商品库存") + private Integer inStockPointStock; + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public List getStockPointList() { + return stockPointList; + } + + public void setStockPointList(List stockPointList) { + this.stockPointList = stockPointList; + } + + public List getSkuComboList() { + return skuComboList; + } + + public void setSkuComboList(List skuComboList) { + this.skuComboList = skuComboList; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getSupplierSkuStatus() { + return supplierSkuStatus; + } + + public void setSupplierSkuStatus(Integer supplierSkuStatus) { + this.supplierSkuStatus = supplierSkuStatus; + } + + public Integer getSupplierStock() { + return supplierStock; + } + + public void setSupplierStock(Integer supplierStock) { + this.supplierStock = supplierStock; + } + + public Long getStockWarning() { + return stockWarning; + } + + public void setStockWarning(Long stockWarning) { + this.stockWarning = stockWarning; + } + + public Long getSupplierSkuId() { + return supplierSkuId; + } + + public void setSupplierSkuId(Long supplierSkuId) { + this.supplierSkuId = supplierSkuId; + } + + public Long getOldSkuId() { + return oldSkuId; + } + + public void setOldSkuId(Long oldSkuId) { + this.oldSkuId = oldSkuId; + } + + public String getSupplierSkuCode() { + return supplierSkuCode; + } + + public void setSupplierSkuCode(String supplierSkuCode) { + this.supplierSkuCode = supplierSkuCode; + } + + public Integer getIsSell() { + return isSell; + } + + public void setIsSell(Integer isSell) { + this.isSell = isSell; + } + + public Long getSupplyPriceFee() { + return supplyPriceFee; + } + + public void setSupplyPriceFee(Long supplyPriceFee) { + this.supplyPriceFee = supplyPriceFee; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public BigDecimal getWeight() { + return weight; + } + + public void setWeight(BigDecimal weight) { + this.weight = weight; + } + + public BigDecimal getVolume() { + return volume; + } + + public void setVolume(BigDecimal volume) { + this.volume = volume; + } + + public List getSpuSkuAttrValues() { + return spuSkuAttrValues; + } + + public void setSpuSkuAttrValues(List spuSkuAttrValues) { + this.spuSkuAttrValues = spuSkuAttrValues; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Long getSkuId() { + return skuId; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public List getSkuLangList() { + return skuLangList; + } + + public void setSkuLangList(List skuLangList) { + this.skuLangList = skuLangList; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Integer getInStockPointStock() { + return inStockPointStock; + } + + public void setInStockPointStock(Integer inStockPointStock) { + this.inStockPointStock = inStockPointStock; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + @Override + public String toString() { + return "SkuVO{" + + "skuId=" + skuId + + ", oldSkuId=" + oldSkuId + + ", spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", skuLangList=" + skuLangList + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", status=" + status + + ", stock=" + stock + + ", supplierStock=" + supplierStock + + ", saleNum=" + saleNum + + ", scoreFee=" + scoreFee + + ", partyCode='" + partyCode + '\'' + + ", modelId='" + modelId + '\'' + + ", weight=" + weight + + ", volume=" + volume + + ", spuSkuAttrValues=" + spuSkuAttrValues + + ", supplierSkuCode='" + supplierSkuCode + '\'' + + ", isSell=" + isSell + + ", supplyPriceFee=" + supplyPriceFee + + ", supplierSkuId=" + supplierSkuId + + ", stockWarning=" + stockWarning + + ", supplierSkuStatus=" + supplierSkuStatus + + ", spuMold=" + spuMold + + ", skuComboList=" + skuComboList + + ", stockPointId=" + stockPointId + + ", stockPointList=" + stockPointList + + ", inStockPointStock=" + inStockPointStock + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuActivityAppVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuActivityAppVO.java new file mode 100644 index 0000000..b958e31 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuActivityAppVO.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * spu活动VO + * + * @author YXF + * @date 2021-03-03 09:00:09 + */ +public class SpuActivityAppVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "满减活动") + private List discountList; + + @Schema(description = "优惠券活动") + private List couponList; + + @Schema(description = "满减活动") + private GroupActivitySpuVO groupActivity; + + @Schema(description = "秒杀活动活动") + private SekillActivitySpuVO sekillActivitySpuVO; + + public SekillActivitySpuVO getSekillActivitySpuVO() { + return sekillActivitySpuVO; + } + + public void setSekillActivitySpuVO(SekillActivitySpuVO sekillActivitySpuVO) { + this.sekillActivitySpuVO = sekillActivitySpuVO; + } + + public List getDiscountList() { + return discountList; + } + + public void setDiscountList(List discountList) { + this.discountList = discountList; + } + + public List getCouponList() { + return couponList; + } + + public void setCouponList(List couponList) { + this.couponList = couponList; + } + + public GroupActivitySpuVO getGroupActivity() { + return groupActivity; + } + + public void setGroupActivity(GroupActivitySpuVO groupActivity) { + this.groupActivity = groupActivity; + } + + @Override + public String toString() { + return "SpuActivityAppVO{" + + "discountList=" + discountList + + ", couponList=" + couponList + + ", groupActivity=" + groupActivity + + ", sekillActivitySpuVO=" + sekillActivitySpuVO + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuAndSkuVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuAndSkuVO.java new file mode 100644 index 0000000..0ec390a --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuAndSkuVO.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/12/8 + */ +public class SpuAndSkuVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "spuId") + private Long spuId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "spu信息") + private SpuVO spu; + + @Schema(description = "sku信息") + private SkuVO sku; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public SpuVO getSpu() { + return spu; + } + + public void setSpu(SpuVO spu) { + this.spu = spu; + } + + public SkuVO getSku() { + return sku; + } + + public void setSku(SkuVO sku) { + this.sku = sku; + } + + @Override + public String toString() { + return "SpuAndSkuVO{" + + "spuId=" + spuId + + ", skuId=" + skuId + + ", spu=" + spu + + ", sku=" + sku + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuAttrValueLangVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuAttrValueLangVO.java new file mode 100644 index 0000000..b8ae7fb --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuAttrValueLangVO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 属性值-国际化表VO + * + * @author YXF + * @date 2021-04-15 16:47:33 + */ +public class SpuAttrValueLangVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "属性名称") + private String attrName; + + @Schema(description = "属性值") + private String attrValueName; + + @Schema(description = "属性值") + private String attrDesc; + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + public String getAttrDesc() { + return attrDesc; + } + + public void setAttrDesc(String attrDesc) { + this.attrDesc = attrDesc; + } + + @Override + public String toString() { + return "SpuAttrValueLangVO{" + + ",lang=" + lang + + ",attrName=" + attrName + + ",attrValueName=" + attrValueName + + ",attrDesc=" + attrDesc + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuCouponAppVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuCouponAppVO.java new file mode 100644 index 0000000..291f9f8 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuCouponAppVO.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 优惠券VO + * + * @author YXF + * @date 2020-12-08 17:22:56 + */ +public class SpuCouponAppVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "优惠券ID") + private Long couponId; + + @Schema(description = "优惠类型 1:代金券 2:折扣券 3:兑换券") + private Integer couponType; + + @Schema(description = "使用条件") + private Long cashCondition; + + @Schema(description = "减免金额") + private Long reduceAmount; + + @Schema(description = "折扣额度") + private Double couponDiscount; + + @Schema(description = "领券后X天起生效") + private Integer afterReceiveDays; + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Integer getCouponType() { + return couponType; + } + + public void setCouponType(Integer couponType) { + this.couponType = couponType; + } + + public Long getCashCondition() { + return cashCondition; + } + + public void setCashCondition(Long cashCondition) { + this.cashCondition = cashCondition; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Double getCouponDiscount() { + return couponDiscount; + } + + public void setCouponDiscount(Double couponDiscount) { + this.couponDiscount = couponDiscount; + } + + public Integer getAfterReceiveDays() { + return afterReceiveDays; + } + + public void setAfterReceiveDays(Integer afterReceiveDays) { + this.afterReceiveDays = afterReceiveDays; + } + + @Override + public String toString() { + return "SpuCouponAppVO{" + + "couponId=" + couponId + + ", couponType=" + couponType + + ", cashCondition=" + cashCondition + + ", reduceAmount=" + reduceAmount + + ", couponDiscount=" + couponDiscount + + ", afterReceiveDays=" + afterReceiveDays + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuSkuAttrValueVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuSkuAttrValueVO.java new file mode 100644 index 0000000..b0a1c69 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuSkuAttrValueVO.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 商品sku销售属性关联信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SpuSkuAttrValueVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品sku销售属性关联信息id") + private Long spuSkuAttrId; + + @Schema(description = "SPU ID") + private Long spuId; + + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "SKU ID") + private Long skuId; + + @Schema(description = "销售属性ID") + private Long attrId; + + @Schema(description = "销售属性国际化信息") + private List spuSkuAttrValueLangList; + + @Schema(description = "销售属性名称") + private String attrName; + + @Schema(description = "销售属性值ID") + private Integer attrValueId; + + @Schema(description = "销售属性值") + private String attrValueName; + + @Schema(description = "状态 1:enable, 0:disable, -1:deleted") + private Integer status; + + public Long getSpuSkuAttrId() { + return spuSkuAttrId; + } + + public void setSpuSkuAttrId(Long spuSkuAttrId) { + this.spuSkuAttrId = spuSkuAttrId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public Integer getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Integer attrValueId) { + this.attrValueId = attrValueId; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public List getSpuSkuAttrValueLangList() { + return spuSkuAttrValueLangList; + } + + public void setSpuSkuAttrValueLangList(List spuSkuAttrValueLangList) { + this.spuSkuAttrValueLangList = spuSkuAttrValueLangList; + } + + @Override + public String toString() { + return "SpuSkuAttrValueVO{" + + "spuSkuAttrId=" + spuSkuAttrId + + ", spuId=" + spuId + + ", lang=" + lang + + ", skuId=" + skuId + + ", attrId=" + attrId + + ", attrName='" + attrName + '\'' + + ", attrValueId=" + attrValueId + + ", attrValueName='" + attrValueName + '\'' + + ", status=" + status + + ", spuSkuAttrValueLangList=" + spuSkuAttrValueLangList + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuVO.java new file mode 100644 index 0000000..27bdf1a --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuVO.java @@ -0,0 +1,1084 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * spu信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SpuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "spu id") + private Long spuId; + + @Schema(description = "旧spuId") + private Long oldSpuId; + + @Schema(description = "品牌ID") + private Long brandId; + + @Schema(description = "分类ID") + private Long categoryId; + + @Schema(description = "店铺分类ID") + private Long shopCategoryId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "多语言信息列表") + private List spuLangList; + + @Schema(description = "spu名称") + private String name; + + @Schema(description = "卖点") + private String sellingPoint; + + @Schema(description = "商品介绍主图") + private String mainImgUrl; + + @Schema(description = "商品介绍主图 多个图片逗号分隔") + private String imgUrls; + + @Schema(description = "商品视频") + private String video; + + @Schema(description = "售价,整数方式保存") + private Long priceFee; + + @Schema(description = "市场价,整数方式保存") + private Long marketPriceFee; + + @Schema(description = "状态 1:enable, 0:disable, -1:deleted, 2:违规下架 3:等待审核") + private Integer status; + + @Schema(description = "sku是否含有图片 0无 1有") + private Integer hasSkuImg; + + @Schema(description = "商品详情") + private String detail; + + @Schema(description = "商品详情列表") + private List detailList; + + + @Schema(description = "总库存") + private Integer totalStock; + + @Schema(description = "规格属性") + private List spuAttrValues; + @Schema(description = "sku列表") + private List skus; + + @Schema(description = "配送方式json见TransportModeVO") + private String deliveryMode; + + @Schema(description = "运费模板id -1固定运费 0包邮") + private Long deliveryTemplateId; + + @Schema(description = "固定运费金额") + private Long deliveryAmount; + + @Schema(description = "商品类型(0普通商品 1拼团 2秒杀 3积分)") + private Integer spuType; + + @Schema(description = "活动id(关联prod_type)") + private Long activityId; + + + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品") + private Integer spuMold; + + @Schema(description = "是否可以退款 1.可以 0.不可以") + private Integer isRefund; + + @Schema(description = "虚拟商品的留言备注") + private String virtualRemark; + @Schema(description = "序号") + private Integer seq; + + @Schema(description = "是否置顶") + private Integer isTop; + + @Schema(description = "品牌信息") + private BrandVO brand; + + @Schema(description = "商品销量") + private Integer saleNum; + + @Schema(description = "评论数量") + private Integer commentNum; + + @Schema(description = "物流信息") + private DeliveryModeVO deliveryModeVO; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "分类信息") + private CategoryVO category; + + @Schema(description = "店铺分类信息") + private CategoryVO shopCategory; + + @Schema(description = "分组商品关联id") + private Long referenceId; + + @Schema(description = "积分价格") + private Long scoreFee; + @Schema(description = "平台佣金扣率") + private Double rate; + + @Schema(description = "spu编码") + private String spuCode; + + @Schema(description = "供应商商品类型 0.否 1.是 2.商家代销") + private Integer supplierSpuType; + + @Schema(description = "关联商品商品id,只有供应商商品为2才有") + private Long supplierSpuId; + + @Schema(description = "发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "供应商分类ID") + private Long supplierCategoryId; + + @Schema(description = "供应商分类信息") + private CategoryVO supplierCategory; + + @Schema(description = "供应商商品更新后代销商品是否已同步更新 1:已更新 -1:未更新") + private Integer isSynUpdate; + + @Schema(description = "供应商品状态") + private Integer supplierSpuStatus; + + @Schema(description = "商家导入供应商品是否以改变商品图片或名称,0:未改变 1:改变了商品图片 2:改变了商品名字") + private Integer isUpdateMsg; + + @Schema(description = "预售类型 -1:未开启 0.全款预售 1.定金预售") + private Integer preSaleType; + + @Schema(description = "定金收取类型 0.按比例 1.按金额") + private Integer depositType; + + @Schema(description = "定金数额(定金收取类型比例为0时,代表百分比*100,为1时代表实际金额*100)") + private Long depositAmount; + + @Schema(description = "定金数值") + private BigDecimal depositValue; + + @Schema(description = "定金膨胀数额(定金收取类型比例为0时,代表百分比*100,为1时代表实际金额*100)") + private Long depositExpansionAmount; + + @Schema(description = "定金膨胀数值") + private BigDecimal depositExpansionValue; + + @Schema(description = "定金支付开始时间") + private Date depositStartTime; + + @Schema(description = "定金支付结束时间") + private Date depositEndTime; + + @Schema(description = "尾款支付开始时间") + private Date balanceStartTime; + + @Schema(description = "尾款支付结束时间") + private Date balanceEndTime; + + @Schema(description = "预售发货类型 -1.固定时间 x.尾款支付后x天发货") + private Integer preSaleDeliveryType; + + @Schema(description = "预售发货时间") + private Date preSaleDeliveryTime; + + @Schema(description = "默认加价比例 0.按比例加价 1.按固定数值加价") + private Integer salesPriceType; + + @Schema(description = "默认加价比例为0时,代表百分比*100,为1时代表实际奖励金额*100") + private Long salesPrice; + + @Schema(description = "供应商分账比例", requiredMode = Schema.RequiredMode.REQUIRED) + private Double supplierRate; + + @Schema(description = "计量单位") + private String measureUnit; + + @Schema(description = "代销商品规格选择状态,1: 全选 2:部分选择") + private Integer skuChoiceStatus; + + @Schema(description = "代销设置类型 0.智能设价 1.手动设价") + private Integer salesType; + + @Schema(description = "是否为套餐商品") + private Boolean isComboSpu; + + @Schema(description = "系统id") + private Integer sysType; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "核销次数 -1.多次核销 0.无需核销 1.单次核销") + private Integer writeOffNum; + + @Schema(description = "多次核销次数 -1.无限次") + private Integer writeOffMultipleCount; + + @Schema(description = "核销有效期 -1.长期有效 0.自定义 x.x天内有效") + private Integer writeOffTime; + + @Schema(description = "核销开始时间") + private Date writeOffStart; + + @Schema(description = "核销结束时间") + private Date writeOffEnd; + + @Schema(description = "是否开启同城配送") + private Boolean cityDelivery; + + @Schema(description = "是否库存预警商品 1.是 0.否, 仅用于更新es商品的库存预警状态") + private Integer stockWarning; + + @Schema(description = "赠品") + private GiveawayVO giveawayVO; + + public Long getDeliveryAmount() { + return deliveryAmount; + } + + public void setDeliveryAmount(Long deliveryAmount) { + this.deliveryAmount = deliveryAmount; + } + + public SpuVO() { + } + + public Boolean getCityDelivery() { + return cityDelivery; + } + + public void setCityDelivery(Boolean cityDelivery) { + this.cityDelivery = cityDelivery; + } + + public Boolean getComboSpu() { + return isComboSpu; + } + + public void setComboSpu(Boolean comboSpu) { + isComboSpu = comboSpu; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Integer getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(Integer writeOffTime) { + this.writeOffTime = writeOffTime; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Boolean getIsComboSpu() { + return isComboSpu; + } + + public void setIsComboSpu(Boolean ComboSpu) { + isComboSpu = ComboSpu; + } + + public Double getSupplierRate() { + return supplierRate; + } + + public void setSupplierRate(Double supplierRate) { + this.supplierRate = supplierRate; + } + + public Long getSalesPrice() { + return salesPrice; + } + + public void setSalesPrice(Long salesPrice) { + this.salesPrice = salesPrice; + } + + public Integer getSalesPriceType() { + return salesPriceType; + } + + public void setSalesPriceType(Integer salesPriceType) { + this.salesPriceType = salesPriceType; + } + + public Long getDepositExpansionAmount() { + return depositExpansionAmount; + } + + public void setDepositExpansionAmount(Long depositExpansionAmount) { + this.depositExpansionAmount = depositExpansionAmount; + } + + public BigDecimal getDepositExpansionValue() { + return depositExpansionValue; + } + + public void setDepositExpansionValue(BigDecimal depositExpansionValue) { + this.depositExpansionValue = depositExpansionValue; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Integer getDepositType() { + return depositType; + } + + public void setDepositType(Integer depositType) { + this.depositType = depositType; + } + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public BigDecimal getDepositValue() { + return depositValue; + } + + public void setDepositValue(BigDecimal depositValue) { + this.depositValue = depositValue; + } + + public Date getDepositStartTime() { + return depositStartTime; + } + + public void setDepositStartTime(Date depositStartTime) { + this.depositStartTime = depositStartTime; + } + + public Date getDepositEndTime() { + return depositEndTime; + } + + public void setDepositEndTime(Date depositEndTime) { + this.depositEndTime = depositEndTime; + } + + public Date getBalanceStartTime() { + return balanceStartTime; + } + + public void setBalanceStartTime(Date balanceStartTime) { + this.balanceStartTime = balanceStartTime; + } + + public Date getBalanceEndTime() { + return balanceEndTime; + } + + public void setBalanceEndTime(Date balanceEndTime) { + this.balanceEndTime = balanceEndTime; + } + + public Integer getPreSaleDeliveryType() { + return preSaleDeliveryType; + } + + public void setPreSaleDeliveryType(Integer preSaleDeliveryType) { + this.preSaleDeliveryType = preSaleDeliveryType; + } + + public Date getPreSaleDeliveryTime() { + return preSaleDeliveryTime; + } + + public void setPreSaleDeliveryTime(Date preSaleDeliveryTime) { + this.preSaleDeliveryTime = preSaleDeliveryTime; + } + + public Integer getIsUpdateMsg() { + return isUpdateMsg; + } + + public void setIsUpdateMsg(Integer isUpdateMsg) { + this.isUpdateMsg = isUpdateMsg; + } + + public Integer getSupplierSpuStatus() { + return supplierSpuStatus; + } + + public void setSupplierSpuStatus(Integer supplierSpuStatus) { + this.supplierSpuStatus = supplierSpuStatus; + } + + public Integer getIsSynUpdate() { + return isSynUpdate; + } + + public void setIsSynUpdate(Integer isSynUpdate) { + this.isSynUpdate = isSynUpdate; + } + + public Long getSupplierCategoryId() { + return supplierCategoryId; + } + + public void setSupplierCategoryId(Long supplierCategoryId) { + this.supplierCategoryId = supplierCategoryId; + } + + public CategoryVO getSupplierCategory() { + return supplierCategory; + } + + public void setSupplierCategory(CategoryVO supplierCategory) { + this.supplierCategory = supplierCategory; + } + + public Integer getSalesType() { + return salesType; + } + + public void setSalesType(Integer salesType) { + this.salesType = salesType; + } + + public Long getOldSpuId() { + return oldSpuId; + } + + public void setOldSpuId(Long oldSpuId) { + this.oldSpuId = oldSpuId; + } + + public Integer getSkuChoiceStatus() { + return skuChoiceStatus; + } + + public void setSkuChoiceStatus(Integer skuChoiceStatus) { + this.skuChoiceStatus = skuChoiceStatus; + } + + public String getMeasureUnit() { + return measureUnit; + } + + public void setMeasureUnit(String measureUnit) { + this.measureUnit = measureUnit; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopCategoryId() { + return shopCategoryId; + } + + public void setShopCategoryId(Long shopCategoryId) { + this.shopCategoryId = shopCategoryId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public List getSpuLangList() { + return spuLangList; + } + + public void setSpuLangList(List spuLangList) { + this.spuLangList = spuLangList; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSellingPoint() { + return sellingPoint; + } + + public void setSellingPoint(String sellingPoint) { + this.sellingPoint = sellingPoint; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getHasSkuImg() { + return hasSkuImg; + } + + public void setHasSkuImg(Integer hasSkuImg) { + this.hasSkuImg = hasSkuImg; + } + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + public List getDetailList() { + return detailList; + } + + public void setDetailList(List detailList) { + this.detailList = detailList; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public List getSpuAttrValues() { + return spuAttrValues; + } + + public void setSpuAttrValues(List spuAttrValues) { + this.spuAttrValues = spuAttrValues; + } + + public List getSkus() { + return skus; + } + + public void setSkus(List skus) { + this.skus = skus; + } + + public String getDeliveryMode() { + return deliveryMode; + } + + public void setDeliveryMode(String deliveryMode) { + this.deliveryMode = deliveryMode; + } + + public Long getDeliveryTemplateId() { + return deliveryTemplateId; + } + + public void setDeliveryTemplateId(Long deliveryTemplateId) { + this.deliveryTemplateId = deliveryTemplateId; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public Integer getIsRefund() { + return isRefund; + } + + public void setIsRefund(Integer isRefund) { + this.isRefund = isRefund; + } + + public String getVirtualRemark() { + return virtualRemark; + } + + public void setVirtualRemark(String virtualRemark) { + this.virtualRemark = virtualRemark; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public BrandVO getBrand() { + return brand; + } + + public void setBrand(BrandVO brand) { + this.brand = brand; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Integer getCommentNum() { + return commentNum; + } + + public void setCommentNum(Integer commentNum) { + this.commentNum = commentNum; + } + + public DeliveryModeVO getDeliveryModeVO() { + return deliveryModeVO; + } + + public void setDeliveryModeVO(DeliveryModeVO deliveryModeVO) { + this.deliveryModeVO = deliveryModeVO; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public CategoryVO getCategory() { + return category; + } + + public void setCategory(CategoryVO category) { + this.category = category; + } + + public CategoryVO getShopCategory() { + return shopCategory; + } + + public void setShopCategory(CategoryVO shopCategory) { + this.shopCategory = shopCategory; + } + + public Long getReferenceId() { + return referenceId; + } + + public void setReferenceId(Long referenceId) { + this.referenceId = referenceId; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + + @Schema(description = "供应商spu编码") + private String supplierSpuCode; + + public void setSupplierSpuCode(String supplierSpuCode) { + this.supplierSpuCode = supplierSpuCode; + } + + public String getSupplierSpuCode() { + return supplierSpuCode; + } + + public Integer getStockWarning() { + return stockWarning; + } + + public void setStockWarning(Integer stockWarning) { + this.stockWarning = stockWarning; + } + + public GiveawayVO getGiveawayVO() { + return giveawayVO; + } + + public void setGiveawayVO(GiveawayVO giveawayVO) { + this.giveawayVO = giveawayVO; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public static class DeliveryModeVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户自提 + */ + @Schema(description = "用户自提", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean hasUserPickUp; + + /** + * 店铺配送 + */ + @Schema(description = "店铺配送", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean hasShopDelivery; + + /** + * 同城配送 + */ + @Schema(description = "同城配送", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean hasCityDelivery; + + public Boolean getHasUserPickUp() { + return hasUserPickUp; + } + + public void setHasUserPickUp(Boolean hasUserPickUp) { + this.hasUserPickUp = hasUserPickUp; + } + + public Boolean getHasShopDelivery() { + return hasShopDelivery; + } + + public void setHasShopDelivery(Boolean hasShopDelivery) { + this.hasShopDelivery = hasShopDelivery; + } + + public Boolean getHasCityDelivery() { + return hasCityDelivery; + } + + public void setHasCityDelivery(Boolean hasCityDelivery) { + this.hasCityDelivery = hasCityDelivery; + } + + @Override + public String toString() { + return "DeliveryModeVO{" + + "hasUserPickUp=" + hasUserPickUp + + ", hasShopDelivery=" + hasShopDelivery + + ", hasCityDelivery=" + hasCityDelivery + + '}'; + } + } + + @Override + public String toString() { + return "SpuVO{" + + "spuId=" + spuId + + ", oldSpuId=" + oldSpuId + + ", brandId=" + brandId + + ", categoryId=" + categoryId + + ", shopCategoryId=" + shopCategoryId + + ", shopId=" + shopId + + ", spuLangList=" + spuLangList + + ", name='" + name + '\'' + + ", sellingPoint='" + sellingPoint + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", video='" + video + '\'' + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", status=" + status + + ", hasSkuImg=" + hasSkuImg + + ", detail='" + detail + '\'' + + ", detailList=" + detailList + + ", totalStock=" + totalStock + + ", spuAttrValues=" + spuAttrValues + + ", skus=" + skus + + ", deliveryMode='" + deliveryMode + '\'' + + ", deliveryTemplateId=" + deliveryTemplateId + + ", deliveryAmount=" + deliveryAmount + + ", spuType=" + spuType + + ", activityId=" + activityId + + ", spuMold=" + spuMold + + ", isRefund=" + isRefund + + ", virtualRemark='" + virtualRemark + '\'' + + ", seq=" + seq + + ", isTop=" + isTop + + ", brand=" + brand + + ", saleNum=" + saleNum + + ", commentNum=" + commentNum + + ", deliveryModeVO=" + deliveryModeVO + + ", shopName='" + shopName + '\'' + + ", category=" + category + + ", shopCategory=" + shopCategory + + ", referenceId=" + referenceId + + ", scoreFee=" + scoreFee + + ", rate=" + rate + + ", spuCode='" + spuCode + '\'' + + ", supplierSpuType=" + supplierSpuType + + ", supplierSpuId=" + supplierSpuId + + ", supplierDeliveryType=" + supplierDeliveryType + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", supplierCategoryId=" + supplierCategoryId + + ", supplierCategory=" + supplierCategory + + ", isSynUpdate=" + isSynUpdate + + ", supplierSpuStatus=" + supplierSpuStatus + + ", isUpdateMsg=" + isUpdateMsg + + ", preSaleType=" + preSaleType + + ", depositType=" + depositType + + ", depositAmount=" + depositAmount + + ", depositValue=" + depositValue + + ", depositExpansionAmount=" + depositExpansionAmount + + ", depositExpansionValue=" + depositExpansionValue + + ", depositStartTime=" + depositStartTime + + ", depositEndTime=" + depositEndTime + + ", balanceStartTime=" + balanceStartTime + + ", balanceEndTime=" + balanceEndTime + + ", preSaleDeliveryType=" + preSaleDeliveryType + + ", preSaleDeliveryTime=" + preSaleDeliveryTime + + ", salesPriceType=" + salesPriceType + + ", salesPrice=" + salesPrice + + ", supplierRate=" + supplierRate + + ", measureUnit='" + measureUnit + '\'' + + ", skuChoiceStatus=" + skuChoiceStatus + + ", salesType=" + salesType + + ", isComboSpu=" + isComboSpu + + ", sysType=" + sysType + + ", userId=" + userId + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffTime=" + writeOffTime + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", cityDelivery=" + cityDelivery + + ", stockWarning=" + stockWarning + + ", giveawayVO=" + giveawayVO + + ", supplierSpuCode='" + supplierSpuCode + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockBillLogVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockBillLogVO.java new file mode 100644 index 0000000..02f3a4c --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockBillLogVO.java @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 出入库明细VO + * + * @author lhd + * @date 2022-06-22 16:57:26 + */ +public class StockBillLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "出入库明细id") + private Long stockBillLogId; + + @Schema(description = "出入库单号") + private String stockBillNo; + + @Schema(description = "关联订单号") + private String sourceOrderNo; + + @Schema(description = "单据类型") + private Integer stockBillType; + + @Schema(description = "出入库原因id") + private Long stockChangeReasonId; + + @Schema(description = "操作员工id") + private Long employeeId; + + @Schema(description = "状态,0:已作废,1:已出/入库,2:待提交") + private Integer status; + + @Schema(description = "出入库时间") + private Date businessTime; + + @Schema(description = "总出入库数量") + private Integer totalCount; + + @Schema(description = "总出入库金额") + private Long totalAmount; + + @Schema(description = "出入库凭证") + private String qualifications; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "类型,1:出库 2:入库") + private Integer type; + + @Schema(description = "制单人手机号") + private String makerMobile; + + @Schema(description = "库存记录item") + private List stockBillLogItems; + + @Schema(description = "库存点id") + private Long stockPointId; + + @Schema(description = "库存点类型(1:仓库, 2:门店)") + private Integer stockPointType; + + @Hidden + @Schema(description = "是否修改库存") + Boolean isChangeStock; + + @Schema(description = "仓库类型 0默认仓库,1区域仓库") + private Integer warehouseType; + + public Integer getWarehouseType() { + return warehouseType; + } + + public void setWarehouseType(Integer warehouseType) { + this.warehouseType = warehouseType; + } + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public String getStockBillNo() { + return stockBillNo; + } + + public void setStockBillNo(String stockBillNo) { + this.stockBillNo = stockBillNo; + } + + public String getSourceOrderNo() { + return sourceOrderNo; + } + + public void setSourceOrderNo(String sourceOrderNo) { + this.sourceOrderNo = sourceOrderNo; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Date getBusinessTime() { + return businessTime; + } + + public void setBusinessTime(Date businessTime) { + this.businessTime = businessTime; + } + + public Integer getTotalCount() { + return totalCount; + } + + public void setTotalCount(Integer totalCount) { + this.totalCount = totalCount; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + public String getQualifications() { + return qualifications; + } + + public void setQualifications(String qualifications) { + this.qualifications = qualifications; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public List getStockBillLogItems() { + return stockBillLogItems; + } + + public void setStockBillLogItems(List stockBillLogItems) { + this.stockBillLogItems = stockBillLogItems; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Boolean getChangeStock() { + return isChangeStock; + } + + public void setChangeStock(Boolean changeStock) { + isChangeStock = changeStock; + } + + @Override + public String toString() { + return "StockBillLogVO{" + + "stockBillLogId=" + stockBillLogId + + ", stockBillNo='" + stockBillNo + '\'' + + ", sourceOrderNo='" + sourceOrderNo + '\'' + + ", stockBillType=" + stockBillType + + ", stockChangeReasonId=" + stockChangeReasonId + + ", employeeId=" + employeeId + + ", status=" + status + + ", businessTime=" + businessTime + + ", totalCount=" + totalCount + + ", totalAmount=" + totalAmount + + ", qualifications='" + qualifications + '\'' + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", remark='" + remark + '\'' + + ", type=" + type + + ", makerMobile='" + makerMobile + '\'' + + ", stockBillLogItems=" + stockBillLogItems + + ", stockPointId=" + stockPointId + + ", stockPointType=" + stockPointType + + ", isChangeStock=" + isChangeStock + + ", warehouseType=" + warehouseType + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockPointSkuVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockPointSkuVO.java new file mode 100644 index 0000000..a564307 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockPointSkuVO.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * VO + * + * @author FrozenWatermelon + * @date 2023-11-09 18:00:43 + */ +public class StockPointSkuVO extends BaseVO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "库存商品关联skuid") + private Long stockPointSkuId; + + @Schema(description = "库存点id") + private Long stockPointId; + + @Schema(description = "库存点类型 1仓库 2门店 ") + private Integer stockPointType; + + @Schema(description = "spuId") + private Long spuId; + + @Schema(description = "skuid") + private Long skuId; + + @Schema(description = "当商品为代销商品时,供应商商品skuid") + private Long supplierSkuId; + + @Schema(description = "状态(对应sku的状态) 1:enable, 0:disable, -1:deleted") + private Integer status; + + @Schema(description = "库存") + private Integer stock; + + @Schema(description = "仓库类型 0默认仓库 1区域仓库 ") + private Integer type; + + @Schema(description = "库存模式") + private Integer stockMode; + + public StockPointSkuVO() { + } + + public StockPointSkuVO(Long skuId, Long stockPointId) { + this.skuId = skuId; + this.stockPointId = stockPointId; + } + + public Integer getStockMode() { + return stockMode; + } + + public void setStockMode(Integer stockMode) { + this.stockMode = stockMode; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Long getStockPointSkuId() { + return stockPointSkuId; + } + + public void setStockPointSkuId(Long stockPointSkuId) { + this.stockPointSkuId = stockPointSkuId; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSupplierSkuId() { + return supplierSkuId; + } + + public void setSupplierSkuId(Long supplierSkuId) { + this.supplierSkuId = supplierSkuId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "StockPointSkuVO{" + + "stockPointSkuId=" + stockPointSkuId + + ", stockPointId=" + stockPointId + + ", stockPointType=" + stockPointType + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", supplierSkuId=" + supplierSkuId + + ", status=" + status + + ", stock=" + stock + + ", type=" + type + + ", stockMode=" + stockMode + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/BrandAppVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/BrandAppVO.java new file mode 100644 index 0000000..7ed5a12 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/BrandAppVO.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.app; + +import com.tmerclub.cloud.common.product.vo.BrandLangVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 品牌信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class BrandAppVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "brand_id") + private Long brandId; + + @Schema(description = "品牌名称") + private String name; + + @Schema(description = "品牌logo图片") + private String imgUrl; + + @Schema(description = "检索首字母") + private String firstLetter; + + @Schema(description = "商品列表") + private List spuList; + + /** + * 品牌多语言列表 + */ + private List langList; + + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getFirstLetter() { + return firstLetter; + } + + public void setFirstLetter(String firstLetter) { + this.firstLetter = firstLetter; + } + + public List getSpuList() { + return spuList; + } + + public void setSpuList(List spuList) { + this.spuList = spuList; + } + + public List getLangList() { + return langList; + } + + public void setLangList(List langList) { + this.langList = langList; + } + + @Override + public String toString() { + return "BrandAppVO{" + + "brandId=" + brandId + + ", name='" + name + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", firstLetter='" + firstLetter + '\'' + + ", spuList=" + spuList + + ", langList=" + langList + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/CategoryAppVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/CategoryAppVO.java new file mode 100644 index 0000000..fb4f99f --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/CategoryAppVO.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.app; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 分类信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class CategoryAppVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "父ID") + private Long parentId; + + @Schema(description = "分类名称") + private String name; + + @Schema(description = "父分类名称") + private String parentName; + + @Schema(description = "分类图标") + private String icon; + + @Schema(description = "分类的显示图片") + private String imgUrl; + + @Schema(description = "分类层级 从0开始") + private Integer level; + + @Schema(description = "上级/子分类列表") + private List categories; + + @Schema(description = "平台一级分类id") + private Long primaryCategoryId; + + @Schema(description = "分类扣率") + private Double deductionRate; + + @Schema(description = "分类状态") + private Integer status; + + /** + * 序号 + */ + private Integer seq; + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public Double getDeductionRate() { + return deductionRate; + } + + public void setDeductionRate(Double deductionRate) { + this.deductionRate = deductionRate; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public List getCategories() { + return categories; + } + + public void setCategories(List categories) { + this.categories = categories; + } + + public Long getPrimaryCategoryId() { + return primaryCategoryId; + } + + public void setPrimaryCategoryId(Long primaryCategoryId) { + this.primaryCategoryId = primaryCategoryId; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "CategoryAppVO{" + + "categoryId=" + categoryId + + ", shopId=" + shopId + + ", parentId=" + parentId + + ", name='" + name + '\'' + + ", parentName='" + parentName + '\'' + + ", icon='" + icon + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", level=" + level + + ", categories=" + categories + + ", primaryCategoryId=" + primaryCategoryId + + ", deductionRate=" + deductionRate + + ", seq=" + seq + + ", status=" + status + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/SkuAppVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/SkuAppVO.java new file mode 100644 index 0000000..a51f315 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/SkuAppVO.java @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.app; + +import com.tmerclub.cloud.common.product.vo.SkuComboVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * sku信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SkuAppVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "属性id") + private Long skuId; + + @Schema(description = "SPU id") + private Long spuId; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "主图:sku有图片使用sku图片,否则使用商品主图") + private String mainImgUrl; + + @Schema(description = "banner图片") + private String imgUrl; + + @Schema(description = "售价,整数方式保存") + private Long priceFee; + + @Schema(description = "市场价,整数方式保存") + private Long marketPriceFee; + + @Schema(description = "商品sku销量") + private Integer saleNum; + + @Schema(description = "库存") + private Integer stock; + + @Schema(description = "库存预警") + private Integer stockWarning; + + @Schema(description = "组合商品列表") + private List skuComboList; + + public List getSkuComboList() { + return skuComboList; + } + + public void setSkuComboList(List skuComboList) { + this.skuComboList = skuComboList; + } + + public Integer getStockWarning() { + return stockWarning; + } + + public void setStockWarning(Integer stockWarning) { + this.stockWarning = stockWarning; + } + + public Integer getSupplierStock() { + return supplierStock; + } + + public void setSupplierStock(Integer supplierStock) { + this.supplierStock = supplierStock; + } + + @Schema(description = "供应商品库存") + private Integer supplierStock; + + @Schema(description = "积分价格") + private Long scoreFee; + + @Schema(description = "属性") + private String properties; + + @Schema(description = "当商品为代销商品时,供应商商品skuId") + private Long supplierSkuId; + + @Schema(description = "定金数额") + private Long depositAmount; + @Schema(description = "定金膨胀数额") + private Long depositExpansionAmount; + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Long getDepositExpansionAmount() { + return depositExpansionAmount; + } + + public void setDepositExpansionAmount(Long depositExpansionAmount) { + this.depositExpansionAmount = depositExpansionAmount; + } + + public Long getSupplierSkuId() { + return supplierSkuId; + } + + public void setSupplierSkuId(Long supplierSkuId) { + this.supplierSkuId = supplierSkuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public String getProperties() { + return properties; + } + + public void setProperties(String properties) { + this.properties = properties; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + @Override + public String toString() { + return "SkuAppVO{" + + "skuId=" + skuId + + ", spuId=" + spuId + + ", skuName='" + skuName + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", saleNum=" + saleNum + + ", stock=" + stock + + ", stockWarning=" + stockWarning + + ", skuComboList=" + skuComboList + + ", supplierStock=" + supplierStock + + ", scoreFee=" + scoreFee + + ", properties='" + properties + '\'' + + ", supplierSkuId=" + supplierSkuId + + ", depositAmount=" + depositAmount + + ", depositExpansionAmount=" + depositExpansionAmount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/AttrValueSearchVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/AttrValueSearchVO.java new file mode 100644 index 0000000..5e193af --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/AttrValueSearchVO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.search; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/11/17 + */ +public class AttrValueSearchVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "规格值id") + private Long attrValueId; + + @Schema(description = "规格值名称") + private String attrValueName; + + public Long getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Long attrValueId) { + this.attrValueId = attrValueId; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + @Override + public String toString() { + return "AttrValueVO{" + + "attrValueId=" + attrValueId + + ", attrValueName='" + attrValueName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/CategorySearchVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/CategorySearchVO.java new file mode 100644 index 0000000..2aff132 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/CategorySearchVO.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.search; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分类信息VO + * + * @author YXF + * @date 2020-1-05 15:37:24 + */ +public class CategorySearchVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "分类名称") + private String name; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "CategorySearchVO{" + + "categoryId=" + categoryId + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/DistributionInfoVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/DistributionInfoVO.java new file mode 100644 index 0000000..f722b55 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/DistributionInfoVO.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.search; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author lth + * @Date 2021/8/10 15:17 + */ +public class DistributionInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分销商品表id") + private Long distributionSpuId; + + @Schema(description = "状态(0:商家下架 1:商家上架 2:违规下架 3:平台审核)") + private Integer state; + + @Schema(description = "奖励方式(0 按比例 1 按固定数值)") + private Integer awardMode; + + @Schema(description = "上级奖励设置(0 关闭 1开启)") + private Integer parentAwardSet; + + @Schema(description = "奖励数额(奖励方式为0时,代表百分比*100,为1时代表实际奖励金额*100)") + private Long awardNumbers; + + @Schema(description = "上级奖励数额(奖励方式为0时,表示百分比*100,为1时代表实际奖励金额*100)") + private Long parentAwardNumbers; + + public Long getDistributionSpuId() { + return distributionSpuId; + } + + public void setDistributionSpuId(Long distributionSpuId) { + this.distributionSpuId = distributionSpuId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getAwardMode() { + return awardMode; + } + + public void setAwardMode(Integer awardMode) { + this.awardMode = awardMode; + } + + public Integer getParentAwardSet() { + return parentAwardSet; + } + + public void setParentAwardSet(Integer parentAwardSet) { + this.parentAwardSet = parentAwardSet; + } + + public Long getAwardNumbers() { + return awardNumbers; + } + + public void setAwardNumbers(Long awardNumbers) { + this.awardNumbers = awardNumbers; + } + + public Long getParentAwardNumbers() { + return parentAwardNumbers; + } + + public void setParentAwardNumbers(Long parentAwardNumbers) { + this.parentAwardNumbers = parentAwardNumbers; + } + + @Override + public String toString() { + return "DistributionInfoBO{" + + "distributionSpuId=" + distributionSpuId + + ", state=" + state + + ", awardProportion=" + awardMode + + ", parentAwardSet=" + parentAwardSet + + ", awardNumbers=" + awardNumbers + + ", parentAwardNumbers=" + parentAwardNumbers + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/ProductSearchVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/ProductSearchVO.java new file mode 100644 index 0000000..557f9dc --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/ProductSearchVO.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.search; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/16 + */ +public class ProductSearchVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "店铺信息") + private ShopInfoSearchVO shopInfo; + + @Schema(description = "规格属性列表") + private List attrs; + + @Schema(description = "品牌列表信息") + private List brands; + + @Schema(description = "分类列表信息") + private List categorys; + + @Schema(description = "spu列表信息") + private List spus; + + @Schema(description = "搜索项信息") + private SearchItemVO searchItem; + + public ShopInfoSearchVO getShopInfo() { + return shopInfo; + } + + public void setShopInfo(ShopInfoSearchVO shopInfo) { + this.shopInfo = shopInfo; + } + + public List getAttrs() { + return attrs; + } + + public void setAttrs(List attrs) { + this.attrs = attrs; + } + + public List getBrands() { + return brands; + } + + public void setBrands(List brands) { + this.brands = brands; + } + + public List getSpus() { + return spus; + } + + public void setSpus(List spus) { + this.spus = spus; + } + + public List getCategorys() { + return categorys; + } + + public void setCategorys(List categorys) { + this.categorys = categorys; + } + + public SearchItemVO getSearchItem() { + return searchItem; + } + + public void setSearchItem(SearchItemVO searchItem) { + this.searchItem = searchItem; + } + + @Override + public String toString() { + return "ProductSearchVO{" + + "shopInfo=" + shopInfo + + ", attrs=" + attrs + + ", brands=" + brands + + ", categorys=" + categorys + + ", spus=" + spus + + ", searchItem=" + searchItem + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/ShopInfoSearchVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/ShopInfoSearchVO.java new file mode 100644 index 0000000..d4a8ac0 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/ShopInfoSearchVO.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.search; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/11/17 + */ +public class ShopInfoSearchVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺名称 搜索华为的时候,可以把华为的旗舰店搜索出来") + private String shopName; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺logo") + private String shopLogo; + + @Schema(description = "店铺商品总销量") + private Integer saleNum; + + @Schema(description = "店铺类型1自营店 2普通店") + private Integer type; + + @Schema(description = "用户总收藏量") + private Integer collectionNum; + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Integer getCollectionNum() { + return collectionNum; + } + + public void setCollectionNum(Integer collectionNum) { + this.collectionNum = collectionNum; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "ShopInfoSearchVO{" + + "shopName='" + shopName + '\'' + + ", shopId=" + shopId + + ", type=" + type + + ", shopLogo='" + shopLogo + '\'' + + ", saleNum=" + saleNum + + ", collectionNum=" + collectionNum + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-rocketmq/pom.xml b/tmerclub-common/tmerclub-common-rocketmq/pom.xml new file mode 100644 index 0000000..7c0b7f6 --- /dev/null +++ b/tmerclub-common/tmerclub-common-rocketmq/pom.xml @@ -0,0 +1,29 @@ + + + + tmerclub-common + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-common-rocketmq + jar + mall4cloud rocketmq相关公共代码 + + + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + org.apache.rocketmq + rocketmq-spring-boot-starter + + + + diff --git a/tmerclub-common/tmerclub-common-rocketmq/src/main/java/com/tmerclub/cloud/common/rocketmq/config/RocketMqAdapter.java b/tmerclub-common/tmerclub-common-rocketmq/src/main/java/com/tmerclub/cloud/common/rocketmq/config/RocketMqAdapter.java new file mode 100644 index 0000000..6c8f693 --- /dev/null +++ b/tmerclub-common/tmerclub-common-rocketmq/src/main/java/com/tmerclub/cloud/common/rocketmq/config/RocketMqAdapter.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.rocketmq.config; + +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.producer.TransactionMQProducer; +import org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.apache.rocketmq.spring.support.RocketMQMessageConverter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * @author FrozenWatermelon + * @date 2021/3/30 + */ +@RefreshScope +@Configuration +@Import({RocketMQAutoConfiguration.class}) +public class RocketMqAdapter { + + @Autowired + private RocketMQMessageConverter rocketMQMessageConverter; + + @Value("${rocketmq.name-server:}") + private String nameServer; + + public RocketMQTemplate getTemplateByTopicName(String topic) { + RocketMQTemplate mqTemplate = new RocketMQTemplate(); + DefaultMQProducer producer = new DefaultMQProducer(topic); + producer.setNamesrvAddr(nameServer); + producer.setRetryTimesWhenSendFailed(2); + producer.setSendMsgTimeout((int) RocketMqConstant.TIMEOUT); + mqTemplate.setProducer(producer); + mqTemplate.setMessageConverter(rocketMQMessageConverter.getMessageConverter()); + return mqTemplate; + } + + public RocketMQTemplate getTransactionTemplateByTopicName(String topic) { + RocketMQTemplate mqTemplate = new RocketMQTemplate(); + TransactionMQProducer producer = new TransactionMQProducer(topic); + producer.setNamesrvAddr(nameServer); + producer.setRetryTimesWhenSendFailed(2); + producer.setSendMsgTimeout((int) RocketMqConstant.TIMEOUT); + mqTemplate.setProducer(producer); + mqTemplate.setMessageConverter(rocketMQMessageConverter.getMessageConverter()); + return mqTemplate; + } +} diff --git a/tmerclub-common/tmerclub-common-rocketmq/src/main/java/com/tmerclub/cloud/common/rocketmq/config/RocketMqConstant.java b/tmerclub-common/tmerclub-common-rocketmq/src/main/java/com/tmerclub/cloud/common/rocketmq/config/RocketMqConstant.java new file mode 100644 index 0000000..a5b39d1 --- /dev/null +++ b/tmerclub-common/tmerclub-common-rocketmq/src/main/java/com/tmerclub/cloud/common/rocketmq/config/RocketMqConstant.java @@ -0,0 +1,534 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.rocketmq.config; + +import com.tmerclub.cloud.common.constant.Constant; + +/** + * nameserver用;分割 + * 同步消息,如果两次 + * + * @author FrozenWatermelon + * @date 2021/3/25 + */ +public class RocketMqConstant { + + // 延迟消息 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h (1-18) + + /** + * 取消订单时间,实际上30分钟 + */ + public static final int CANCEL_ORDER_DELAY_LEVEL = 16; + + /** + * 订单取消时间 30分钟 + */ + public static final int CANCEL_TIME_INTERVAL = 30 * 60 * 1000; + + /** + * 更新套餐销量时间,实际上5分钟 + */ + public static final int COMBO_ORDER_DELAY_LEVEL = 2; + + /** + * 默认发送消息超时时间 + */ + public static final long TIMEOUT = 3000; + + /** + * 商品搜索topic + */ + public static final String CANAL_TOPIC = Constant.NAME_SPACE + "canal-topic"; + + /** + * 取消订单的库存解锁topic + */ + public static final String STOCK_UNLOCK_TOPIC_BY_ORDER_ID = Constant.NAME_SPACE + "stock-unlock-topic"; + + /** + * 优惠券解锁topic + */ + public static final String COUPON_UNLOCK_TOPIC = Constant.NAME_SPACE + "coupon-unlock-topic"; + + /** + * 优惠券赠送topic + */ + public static final String COUPON_GIVE_TOPIC = Constant.NAME_SPACE + "coupon-give-topic"; + /** + * 等级提升赠送优惠券topic + */ + public static final String LEVEL_UP_COUPON_GIVE_TOPIC = Constant.NAME_SPACE + "level-up-coupon-give-topic"; + + /** + * 等级降低失效会员优惠券topic + */ + public static final String LEVEL_DOWN_COUPON_EXPIRE_TOPIC = Constant.NAME_SPACE + "level-down-coupon-expire-topic"; + + /** + * 订单取消 + */ + public static final String ORDER_CANCEL_TOPIC = Constant.NAME_SPACE + "order-cancel-topic"; + + /** + * 提交订单后,清除购物车 + */ + public static final String ORDER_SUBMIT_SHOP_CART = Constant.NAME_SPACE + "order-submit-shop-cart"; + + /** + * 订单支付成功 + */ + public static final String ORDER_NOTIFY_TOPIC = Constant.NAME_SPACE + "order-notify-topic"; + /** + * 订单采购成功 通知商家分账服务 + */ + public static final String ORDER_PURCHASE_NOTIFY_SHOP_TOPIC = Constant.NAME_SPACE + "order-purchase-notify-shop-topic"; + + /** + * 订单支付成功 通知其他服务 总topic(包括优惠券,库存,团购,秒杀,商家分账,余额支付成功通知) + */ + public static final String ORDER_NOTIFY_SERVICE_TOPIC = Constant.NAME_SPACE + "order-notify-service-topic"; + + /** + * 订单支付成功 通知优惠券服务 + */ + public static final String ORDER_NOTIFY_COUPON_GROUP = Constant.NAME_SPACE + "order-notify-coupon-group"; + + /** + * 订单支付成功 通知库存服务 + */ + public static final String ORDER_NOTIFY_STOCK_GROUP = Constant.NAME_SPACE + "order-notify-stock-group"; + + /** + * 订单支付成功 通知团购服务 + */ + public static final String ORDER_NOTIFY_GROUP_GROUP = Constant.NAME_SPACE + "order-notify-group-group"; + + /** + * 订单支付成功 通知秒杀服务 + */ + public static final String ORDER_NOTIFY_SECKILL_GROUP = Constant.NAME_SPACE + "order-notify-seckill-group"; + + /** + * 订单支付成功 通知商家分账服务 + */ + public static final String ORDER_NOTIFY_SHOP_GROUP = Constant.NAME_SPACE + "order-notify-shop-group"; + + /** + * 订单确认收货 通知自己然后向周围广播 + */ + public static final String ORDER_RECEIPT_TOPIC = Constant.NAME_SPACE + "order-receipt-topic"; + + /** + * 订单退款 通知自己然后向周围广播 + */ + public static final String ORDER_REFUND_TOPIC = Constant.NAME_SPACE + "order-refund-topic"; + + /** + * 订单退款 支付服务,开始进行退款啦 + */ + public static final String ORDER_REFUND_PAYMENT_TOPIC = Constant.NAME_SPACE + "order-refund-payment-topic"; + + /** + * 订单退款退款成功 + */ + public static final String ORDER_REFUND_SUCCESS_TOPIC = Constant.NAME_SPACE + "order-refund-success-topic"; + /** + * 订单部分退款且订单关闭后结算的消息 + */ + public static final String ORDER_REFUND_SUCCESS_SETTLEMENT_TOPIC = Constant.NAME_SPACE + "order-refund-success-settlement-topic"; + + /** + * 订单退款 商家减少余额 + */ + public static final String ORDER_REFUND_SHOP_TOPIC = Constant.NAME_SPACE + "order-refund-shop-topic"; + + /** + * 退款还原库存 + */ + public static final String ORDER_REFUND_SUCCESS_STOCK_TOPIC = Constant.NAME_SPACE + "order-refund-success-stock-topic"; + + /** + * 退款成功 通知其他服务 总topic(包括优惠券,成长值,积分) + */ + public static final String ORDER_REFUND_SUCCESS_SERVICE_TOPIC = Constant.NAME_SPACE + "order-refund-success-service-topic"; + + /** + * 退款成功 退款还原使用的优惠券 + */ + public static final String ORDER_REFUND_SUCCESS_COUPON_GROUP = Constant.NAME_SPACE + "order-refund-success-coupon-group"; + + /** + * 退款成功 确认收货订单退货退款还原用户成长值 + */ + public static final String ORDER_REFUND_SUCCESS_GROWTH_GROUP = Constant.NAME_SPACE + "order-refund-success-growth-group"; + + /** + * 退款成功 确认收货订单退货退款退款用户购物抵扣使用的积分 + */ + public static final String ORDER_REFUND_SUCCESS_SCORE_GROUP = Constant.NAME_SPACE + "order-refund-success-score-group"; + + /** + * 团购订单创建通知 + */ + public static final String GROUP_ORDER_CREATE_TOPIC = Constant.NAME_SPACE + "group-order-create-topic"; + + /** + * 团购订单取消总topic(包括订单和团队的取消) + */ + public static final String GROUP_ORDER_CANCEL_TOPIC = Constant.NAME_SPACE + "group-order-cancel-topic"; + + /** + * 团购订单取消 订单取消 + */ + public static final String GROUP_ORDER_CANCEL_ORDER_GROUP = Constant.NAME_SPACE + "group-order-cancel-order-group"; + + /** + * 团购订单取消 团队取消 + */ + public static final String GROUP_ORDER_CANCEL_TEAM_GROUP = Constant.NAME_SPACE + "group-order-cancel-team-group"; + + /** + * 拼团参团或开团成功,更新团队和订单 + */ + public static final String GROUP_ORDER_OPEN_AND_JOIN_GROUP_TOPIC = Constant.NAME_SPACE + "group-order-open-and-join-group-topic"; + + /** + * 拼团成团成功通知总topic(包括订单更新和订单存储mongodb) + */ + public static final String GROUP_ORDER_SUCCESS_TOPIC = Constant.NAME_SPACE + "group-order-success-topic"; + + /** + * 拼团成团成功通知 订单更新 + */ + public static final String GROUP_ORDER_SUCCESS_GROUP = Constant.NAME_SPACE + "group-order-success-group"; + + /** + * 拼团成团成功通知 保存拼团记录到mongodb + */ + public static final String GROUP_ORDER_SAVE_GROUP = Constant.NAME_SPACE + "group-order-save-group"; + + /** + * 提交订单保存拼团记录到mongodb总topic(包括订单和团队保存) + */ + public static final String GROUP_ORDER_SAVE_TOPIC = Constant.NAME_SPACE + "group-order-save-topic"; + + /** + * 提交订单保存拼团记录到mongodb 团队 + */ + public static final String GROUP_ORDER_SAVE_TEAM_GROUP = Constant.NAME_SPACE + "group-order-save-team-group"; + + /** + * 提交订单保存拼团记录到mongodb 订单 + */ + public static final String GROUP_ORDER_SAVE_ORDER_GROUP = Constant.NAME_SPACE + "group-order-save-order-group"; + + /** + * 拼团订单成团失败通知 + */ + public static final String GROUP_ORDER_UN_SUCCESS_TOPIC = Constant.NAME_SPACE + "group-order-un-success-topic"; + + /** + * 拼团失败进行退款 + */ + public static final String GROUP_ORDER_UN_SUCCESS_REFUND_TOPIC = Constant.NAME_SPACE + "group-order-un-success-refund-topic"; + + /** + * 秒杀订单超时创建通知 + */ + public static final String SECKILL_ORDER_TIME_OUT_CANCEL_TOPIC = Constant.NAME_SPACE + "seckill-order-time-out-topic"; + /** + * 秒杀订单创建通知 + */ + public static final String SECKILL_ORDER_CREATE_TOPIC = Constant.NAME_SPACE + "seckill-order-create-topic"; + + /** + * 秒杀订单取消 + */ + public static final String SECKILL_ORDER_CANCEL_TOPIC = Constant.NAME_SPACE + "seckill-order-cancel-topic"; + + /** + * 秒杀订单退款 + */ + public static final String SECKILL_ORDER_REFUND_TOPIC = Constant.NAME_SPACE + "seckill-order-refund-topic"; + + /** + * 订单支付成功 商家分账 总topic(包括分销分账,供应商分账,通知订单采购) + */ + public static final String SHOP_WALLET_NOTIFY_SERVICE_TOPIC = Constant.NAME_SPACE + "shop-wallet-notify-service-topic"; + + /** + * 订单支付成功 商家分账 通知分销服务分账 + */ + public static final String ORDER_NOTIFY_DISTRIBUTION_GROUP = Constant.NAME_SPACE + "order-notify-distribution-group"; + + /** + * 订单支付成功 商家分账 通知供应商分账 + */ + public static final String ORDER_NOTIFY_SUPPLIER_GROUP = Constant.NAME_SPACE + "order-notify-supplier-group"; + + /** + * 订单支付成功 商家分账 通知订单进行采购 + */ + public static final String ORDER_NOTIFY_PURCHASE_GROUP = Constant.NAME_SPACE + "order-notify-purchase-group"; + + /** + * 分销金额计算完成 通知其他服务总topic(包括订单,商家) + */ + public static final String DISTRIBUTION_NOTIFY_ORDER_SHOP_TOPIC = Constant.NAME_SPACE + "distribution-notify-order-shop-topic"; + + /** + * 分销金额计算完成 分销通知订单服务 + */ + public static final String DISTRIBUTION_NOTIFY_ORDER_GROUP = Constant.NAME_SPACE + "distribution-notify-order-group"; + + /** + * 分销金额计算完成 分销通知商家服务 + */ + public static final String DISTRIBUTION_NOTIFY_SHOP_GROUP = Constant.NAME_SPACE + "distribution-notify-shop-group"; + + /** + * 用户服务通知分销服务分销员修改分销员信息 + */ + public static final String USER_NOTIFY_DISTRIBUTION_USER_TOPIC = Constant.NAME_SPACE + "user-notify-distribution-user-topic"; + + /** + * 退款,商家钱包通知服务总topic(包括回退分销佣金,供应商减少未结算金额) + */ + public static final String REFUND_SHOP_NOTIFY_SERVICE_TOPIC = Constant.NAME_SPACE + "refund-shop-notify-service-topic"; + + /** + * 退款,通知分销服务,回退分销佣金 + */ + public static final String REFUND_SHOP_NOTIFY_DISTRIBUTION_GROUP = Constant.NAME_SPACE + "refund-shop-notify-distribution-group"; + + /** + * 退款,通知供应商服务,供应商减少未结算金额 + */ + public static final String REFUND_SHOP_NOTIFY_SUPPLIER_GROUP = Constant.NAME_SPACE + "refund-shop-notify-supplier-group"; + + + /** + * 用户充值成功 + */ + public static final String USER_RECHARGE_NOTIFY_TOPIC = Constant.NAME_SPACE + "user-recharge-notify-topic"; + + /** + * 商家充值成功 + */ + public static final String SHOP_RECHARGE_NOTIFY_TOPIC = Constant.NAME_SPACE + "shop-recharge-notify-topic"; + + /** + * 购买会员成功 + */ + public static final String BUY_VIP_NOTIFY_TOPIC = Constant.NAME_SPACE + "buy-vip-notify-topic"; + + /** + * 余额支付 + */ + public static final String BALANCE_PAY_TOPIC = Constant.NAME_SPACE + "balance-pay-topic"; + + /** + * 批量用户注册事件 + */ + public static final String BATCH_USER_REGISTER_TOPIC = Constant.NAME_SPACE + "batch-user-register-topic"; + + /** + * 发送给用户的消息(订单支付成功、发货、退款同意、退款拒绝) 通知消息服务 + */ + public static final String SEND_NOTIFY_TO_USER_TOPIC = Constant.NAME_SPACE + "send-notify-to-user-topic"; + + /** + * 推送用户积分、成长值增加的通知 + */ + public static final String SEND_NOTIFY_TO_USER_EXTENSION_TOPIC = Constant.NAME_SPACE + "send-notify-to-user-extension-topic"; + + /** + * 发送事件进行添加商品库存出入库记录 + */ + public static final String STOCK_BILL_LOG_TOPIC = Constant.NAME_SPACE + "stock-bill-log-topic"; + + /** + * 发送事件进行添加采购出入库的库存记录 + */ + public static final String STOCK_BILL_LOG_PURCHASE_STORAGE_TOPIC = Constant.NAME_SPACE + "stock-bill-log-purchase-storage-topic"; + + /** + * 发送店铺消息(订单确认收货、买家发起退款、买家已退货) 通知消息服务 + */ + public static final String SEND_NOTIFY_TO_SHOP_TOPIC = Constant.NAME_SPACE + "send-notify-to-shop-topic"; + + /** + * 发送商品下架、审核、变更相关消息给店铺 + */ + public static final String SEND_PRODUCT_NOTIFY_TO_SHOP_TOPIC = Constant.NAME_SPACE + "send-product-notify-to-shop-topic"; + + /** + * 发送订单待采购提醒给店铺 + */ + public static final String SEND_ORDER_TO_PURCHASE_NOTIFY_TO_SHOP_TOPIC = Constant.NAME_SPACE + "send-order-to-purchase-notify-to-shop-topic"; + + /** + * 发送营销活动下线消息给店铺 + */ + public static final String SEND_ACTIVITY_OFFLINE_NOTIFY_TO_SHOP_TOPIC = Constant.NAME_SPACE + "send-activity-offline-notify-to-shop-topic"; + + /** + * 发送营销活动审核消息给店铺 + */ + public static final String SEND_ACTIVITY_AUDIT_NOTIFY_TO_SHOP_TOPIC = Constant.NAME_SPACE + "send-activity-audit-notify-to-shop-topic"; + /** + * 发送开团成团相关通知给用户(开团成功、拼团成功、拼团失败) + */ + public static final String SEND_GROUP_NOTIFY_TO_USER_TOPIC = Constant.NAME_SPACE + "send-group-notify-to-user-topic"; + + /** + * 订单15天通知店铺进行结算 + */ + public static final String ORDER_SETTLED_SHOP_TOPIC = Constant.NAME_SPACE + "order-settled-shop-topic"; + /** + * 积分解锁topic + */ + public static final String SCORE_UNLOCK_TOPIC = Constant.NAME_SPACE + "score-unlock-topic"; + /** + * 订单部分退款且订单关闭后供应商结算的消息 + */ + public static final String ORDER_REFUND_SUCCESS_SETTLEMENT_SUPPLIER_TOPIC = Constant.NAME_SPACE + "order-refund-success-settlement-supplier-topic"; + /** + * 通知库存添加一条出库明细 + */ + public static final String OUT_STOCK_LOG_TOPIC = Constant.NAME_SPACE + "out-stock-log-topic"; + + /** + * 添加店铺钱包日志列表信息到mongodb + */ + public static final String ADD_SHOP_WALLET_LOG_TOPIC = Constant.NAME_SPACE + "add-shop-wallet-log-topic"; + + /** + * 店铺余额充值回调更新日志 + */ + public static final String UPDATE_SHOP_RECHARGE_SUCCESS_TOPIC = Constant.NAME_SPACE + "update-shop-recharge-success-topic"; + + /** + * 添加供应商钱包日志列表信息到mongodb + */ + public static final String ADD_SUPPLIER_WALLET_LOG_TOPIC = Constant.NAME_SPACE + "add-supplier-wallet-log-topic"; + + /** + * 订单超时未支付尾款 商家结算 + */ + public static final String ORDER_PRE_SALE_FAIL_SETTLEMENT_TOPIC = Constant.NAME_SPACE + "order-pre-sale-fail-settlement-topic"; + + /** + * 套餐商品sku项状态变为删除或者失效时移除用户购物车中的商品 + */ + public static final String COMBO_SKU_STATUS_TOPIC = Constant.NAME_SPACE + "combo-sku-status-topic"; + + /** + * 套餐删除或者失效时移除优化购物车套餐商品 + */ + public static final String COMBO_DELETE_OR_DISABLED = Constant.NAME_SPACE + "combo-delete-or-disabled"; + + /** + * 预售订单-尾款时间过期未支付时的处理 + */ + public static final String PRESALE_ORDER_CANAL_TOPIC = Constant.NAME_SPACE + "presale-order-canal-topic"; + /** + * 订单支付成功处理套餐订单消息 + */ + public static final String COMBO_ORDER_TOPIC = Constant.NAME_SPACE + "combo-order-topic"; + + + /** + * 取消申请超时的订单,无论该超时订单处于任何状态 + */ + public static final String ORDER_REFUND_CANAL_TOPIC = Constant.NAME_SPACE + "order-refund-canal-topic"; + + /** + * 取消平台介入超时的退款 + */ + public static final String REFUND_INTERVENTION_CANAL_TOPIC = Constant.NAME_SPACE + "refund-intervention-topic"; + + /** + * 发放退款 + */ + public static final String ORDER_REFUND_REQUEST_TOPIC = Constant.NAME_SPACE + "order-refund-request-topic"; + + /** + * 支付宝电脑支付回调 + */ + public static final String ORDER_REFUND_UPDATE_REFUND_STATUS = Constant.NAME_SPACE + "order-refund-update-refund-status"; + + /** + * 供应商品信息更新 + */ + public static final String SUPPLIER_PRODUCT_UPDATE = Constant.NAME_SPACE + "supplier-product-update-topic"; + + /** + * 套餐商品起搭数量修改时同步更新用户购物车套餐商品数量 + */ + public static final String COMBO_SPU_COUNT_CHANGE = Constant.NAME_SPACE + "combo-spu-count-change"; + + /** + * 商家余额支付成功,通知修改订单为已采购状态及后续操作 + */ + public static final String SHOP_BALANCE_PAY_SUCCESS_TOPIC = Constant.NAME_SPACE + "shop-balance-pay-success-topic"; + + /** + * 平台转账 + */ + public static final String PLATFORM_TRANSFER_TOPIC = Constant.NAME_SPACE + "platform-transfer-topic"; + + /** + * 订单15天通知店铺进行结算(通联结算) + */ + public static final String ORDER_SETTLED_SHOP_BY_ALLINPAY_TOPIC = Constant.NAME_SPACE + "order-settled-shop-by-allinpay-topic"; + + /** + * 通联余额支付订单成功 + */ + public static final String ALLINPAY_BALANCE_ORDER_SUCCESS_TOPIC = Constant.NAME_SPACE + "allinpay-balance-order-success-topic"; + /** + * 开通通联支付事件(订单,商品,用户,商家,供应商) + */ + public static final String OPEN_ALLINPAY_TOPIC = Constant.NAME_SPACE + "open-Allinpay-topic"; + /** + * 开通通联支付后订单的处理 + */ + public static final String OPEN_ALLINPAY_ORDER_TOPIC = Constant.NAME_SPACE + "open-Allinpay-order-topic"; + + /** + * 开通通联支付后商家的处理 + */ + public static final String OPEN_ALLINPAY_SHOP_TOPIC = Constant.NAME_SPACE + "open-Allinpay-shop-topic"; + + /** + * 开通通联支付后供应商的处理 + */ + public static final String OPEN_ALLINPAY_SUPPLIER_TOPIC = Constant.NAME_SPACE + "open-Allinpay-supplier-topic"; + + /** + * 新增采购金额日志 + */ + public static final String ADD_PURCHASE_AMOUNT_LOG_TOPIC = Constant.NAME_SPACE + "add-purchase-amount-log-topic"; + + /** + * 新增用户积分日志 + */ + public static final String ADD_USER_SCORE_LOG_TOPIC = Constant.NAME_SPACE + "add-user-score-log-topic"; + /** + * 新增用户余额日志 + */ + public static final String ADD_USER_BALANCE_LOG_TOPIC = Constant.NAME_SPACE + "add-user-balance-log-topic"; + + /** + * 增加优惠券库存 + */ + public static final String ADD_COUPON_STOCK_TOPIC = Constant.NAME_SPACE + "add-coupon-stock-topic"; +} diff --git a/tmerclub-common/tmerclub-common-security/pom.xml b/tmerclub-common/tmerclub-common-security/pom.xml new file mode 100644 index 0000000..60f0152 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/pom.xml @@ -0,0 +1,58 @@ + + + + tmerclub-common + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-common-security + jar + mall4cloud 安全相关公共代码 + + + + + com.moyuer.cloud + tmerclub-api-auth + ${project.version} + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + com.moyuer.cloud + tmerclub-common-cache + ${project.version} + + + org.springframework.boot + spring-boot-starter-security + + + + cn.dev33 + sa-token-spring-boot3-starter + + + + cn.dev33 + sa-token-redis-fastjson2 + + + cn.dev33 + sa-token-dubbo3 + + + + diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/PmsContext.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/PmsContext.java new file mode 100644 index 0000000..1b0ae35 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/PmsContext.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security; + + +import com.alibaba.ttl.TransmittableThreadLocal; +import com.tmerclub.cloud.api.platform.vo.UriPermissionVO; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/7/16 + */ +public class PmsContext { + + private static final ThreadLocal> PMS_HOLDER = new TransmittableThreadLocal<>(); + + public static List get() { + return PMS_HOLDER.get(); + } + + public static void set(List prems) { + PMS_HOLDER.set(prems); + } + public static void clean() { + if (PMS_HOLDER.get() != null) { + PMS_HOLDER.remove(); + } + } +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/adapter/AuthConfigAdapter.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/adapter/AuthConfigAdapter.java new file mode 100644 index 0000000..95cf0aa --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/adapter/AuthConfigAdapter.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security.adapter; + +import java.util.List; +import java.util.Set; + +/** + * 实现该接口之后,修改需要授权登陆的路径,不需要授权登陆的路径 + * + * @author FrozenWatermelon + * @date 2020/7/4 + */ +public interface AuthConfigAdapter { + + + /** + * 外部直接调用接口,无需登录权限 unwanted auth + */ + String EXTERNAL_URI = "/**/ua/**"; + + /** + * 也许需要登录才可用的url + */ + String MAYBE_AUTH_URI = "/**/ma/**"; + + /** + * 平台端uri + */ + String PLATFORM_URI = "/p/**"; + + /** + * 商家端uri + */ + String MULTISHOP_URI = "/m/**"; + + /** + * 商家端uri + */ + String SUPPLIER_URI = "/s/**"; + + /** + * 平台端和商家端都可用的uri + */ + String MULTISHOP_PLATFORM_URI = "/mp/**"; + + /** + * 商家开店时可用的uri + */ + String MULTSHOP_APPLY_URI = "/**/apply_shop/**"; + /** + * 商家开店时可用的uri + */ + String SUPPLIER_APPLY_URI = "/**/apply_supplier/**"; + + /** + * swagger + */ + String DOC_URI = "/v3/api-docs/default"; + + /** + * 退出登录uri + */ + String LOGIN_OUT_URI = "/ma/login_out"; + + /** + * 需要授权登陆的路径 + * + * @return 需要授权登陆的路径列表 + */ + List pathPatterns(); + + /** + * 不需要授权登陆的路径 + * + * @param paths + * @return 不需要授权登陆的路径列表 + */ + Set excludePathPatterns(String... paths); + +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/bo/SignResponse.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/bo/SignResponse.java new file mode 100644 index 0000000..f0ec5c5 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/bo/SignResponse.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security.bo; + +import com.tmerclub.cloud.api.platform.vo.SysAccessKeyVO; +import jakarta.servlet.http.HttpServletRequest; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Map; + +/** + * 签名校验完毕之后返回的信息 + * @author FrozenWatermelon + * @date 2021/12/29 + */ +public class SignResponse implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 改写后的http请求信息,如果是json格式的数据的话,这边是需要进行改写的 + */ + private HttpServletRequest req; + /** + * data所在那一层的map数据 + */ + private Map dataMap; + + private String appSecret; + + private Long timestamp; + + private SysAccessKeyVO sysAccessKeyVO; + + public SysAccessKeyVO getSysAccessKeyVO() { + return sysAccessKeyVO; + } + + public void setSysAccessKeyVO(SysAccessKeyVO sysAccessKeyVO) { + this.sysAccessKeyVO = sysAccessKeyVO; + } + + public HttpServletRequest getReq() { + return req; + } + + public void setReq(HttpServletRequest req) { + this.req = req; + } + + public Map getDataMap() { + return dataMap; + } + + public void setDataMap(Map dataMap) { + this.dataMap = dataMap; + } + + public String getAppSecret() { + return appSecret; + } + + public void setAppSecret(String appSecret) { + this.appSecret = appSecret; + } + + public Long getTimestamp() { + return timestamp; + } + + public void setTimestamp(Long timestamp) { + this.timestamp = timestamp; + } + + @Override + public String toString() { + return "SignResponse{" + + "req=" + req + + ", dataMap=" + dataMap + + ", appSecret='" + appSecret + '\'' + + ", timestamp=" + timestamp + + ", sysAccessKeyVO=" + sysAccessKeyVO + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/bo/TokenInfoBO.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/bo/TokenInfoBO.java new file mode 100644 index 0000000..b42d697 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/bo/TokenInfoBO.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security.bo; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import java.io.Serial; +import java.io.Serializable; + +/** + * token信息,该信息存在redis中 + * + * @author FrozenWatermelon + * @date 2020/7/2 + */ +public class TokenInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 保存在token信息里面的用户信息 + */ + private UidInfoBO uidInfoBO; + + private String accessToken; + + /** + * 在多少秒后过期 + */ + private Integer expiresIn; + + public UidInfoBO getUidInfoBO() { + return uidInfoBO; + } + + public void setUidInfoBO(UidInfoBO uidInfoBO) { + this.uidInfoBO = uidInfoBO; + } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public Integer getExpiresIn() { + return expiresIn; + } + + public void setExpiresIn(Integer expiresIn) { + this.expiresIn = expiresIn; + } + + @Override + public String toString() { + return "TokenInfoBO{" + + "uidInfoBO=" + uidInfoBO + + ", accessToken='" + accessToken + '\'' + + ", expiresIn=" + expiresIn + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/config/PasswordConfig.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/config/PasswordConfig.java new file mode 100644 index 0000000..ac9a92e --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/config/PasswordConfig.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +/** + * @author FrozenWatermelon + * @date 2020/7/3 + */ +@Configuration +public class PasswordConfig { + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/config/SensitiveWordConfig.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/config/SensitiveWordConfig.java new file mode 100644 index 0000000..8058757 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/config/SensitiveWordConfig.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security.config; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.security.adapter.AuthConfigAdapter; + +import java.util.HashSet; +import java.util.Set; + +/** + * @author Citrus + * @date 2021/8/6 14:32 + */ +public class SensitiveWordConfig { + + private static final String SAVE_SENSITIVE_WORD = "/p/sys_config/save/"; + private static final String FEIGN_URL = "/feign/**"; + private static final String ALLINPAY_URL = "/ua/notice/allinpay/member/**"; + + static final Set SENSITIVE_WHITE_SET; + + static { + SENSITIVE_WHITE_SET = new HashSet<>(Constant.INITIAL_CAPACITY); + SENSITIVE_WHITE_SET.add(AuthConfigAdapter.DOC_URI); + SENSITIVE_WHITE_SET.add(SAVE_SENSITIVE_WORD); + SENSITIVE_WHITE_SET.add(FEIGN_URL); + SENSITIVE_WHITE_SET.add(ALLINPAY_URL); + } + + private SensitiveWordConfig() { + + } + + public static Set getSensitiveWhiteSet() { + return SENSITIVE_WHITE_SET; + } +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/AuthFilter.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/AuthFilter.java new file mode 100644 index 0000000..2532196 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/AuthFilter.java @@ -0,0 +1,330 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security.filter; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysAccessKeyVO; +import com.tmerclub.cloud.api.rbac.constant.HttpMethodEnum; +import com.tmerclub.cloud.api.rbac.feign.PermissionFeignClient; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.handler.HttpHandler; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthTokenContext; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.security.PmsContext; +import com.tmerclub.cloud.common.security.adapter.AuthConfigAdapter; +import com.tmerclub.cloud.common.security.adapter.DefaultSignAuthAdapter; +import com.tmerclub.cloud.common.security.bo.SignResponse; +import com.tmerclub.cloud.common.security.util.SignUtils; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.wrapper.ResponseWrapper; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.util.AntPathMatcher; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.*; + +/** + * 授权过滤,只要实现AuthConfigAdapter接口,添加对应路径即可: + * + * @author FrozenWatermelon + * @date 2020/7/11 + */ +@Component +public class AuthFilter implements Filter { + + private static final Logger logger = LoggerFactory.getLogger(AuthFilter.class); + + @Value("${sa-token.token-name}") + private String tokenName; + @Autowired + private AuthConfigAdapter authConfigAdapter; + @Autowired + private HttpHandler httpHandler; + @Autowired + private SignUtils signUtils; + @Autowired + private DefaultSignAuthAdapter defaultSignAuthAdapter; + @DubboReference + private TokenFeignClient tokenFeignClient; + @DubboReference + private PermissionFeignClient permissionFeignClient; + /** + * 成功状态码 + */ + public static final int SUCCESS_CODE = 200; + + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + + String requestUri = req.getRequestURI(); + + Set excludePathPatterns = authConfigAdapter.excludePathPatterns(); + + AntPathMatcher pathMatcher = new AntPathMatcher(); + String accessToken = req.getHeader(tokenName); + AuthTokenContext.setToken(accessToken); + // 如果匹配不需要授权的路径,就不需要校验是否需要授权 + if (CollectionUtil.isNotEmpty(excludePathPatterns)) { + for (String excludePathPattern : excludePathPatterns) { + if (pathMatcher.match(excludePathPattern, requestUri)) { + chain.doFilter(req, resp); + AuthTokenContext.cleanToken(); + return; + } + } + } + + String grantType = req.getHeader(SignUtils.GRANT_TYPE); + // 也许需要登录,不登陆也能用的uri + // 比如优惠券接口,登录的时候可以判断是否已经领取过 + // 不能登录的时候会看所有的优惠券,等待领取的时候再登录 + boolean mayAuth = pathMatcher.match(AuthConfigAdapter.MAYBE_AUTH_URI, requestUri); + + + UidInfoBO uidInfoBO = null; + + try { + // 通过签名访问 + if (Objects.equals(grantType, SignUtils.GRANT_TYPE_VALUE)) { + signAccess(chain, req, resp); + return; + } + + // 如果有token,就要获取token + else if (StrUtil.isNotBlank(accessToken)) { + // 校验登录,并从缓存中取出用户信息 + ServerResponseEntity uidInfoBOVoServerResponseEntity = checkUriAndGetToken(req, accessToken, mayAuth, pathMatcher); + if (!uidInfoBOVoServerResponseEntity.isSuccess()) { + httpHandler.printServerResponseToWeb(uidInfoBOVoServerResponseEntity); + return; + } + uidInfoBO = uidInfoBOVoServerResponseEntity.getData(); + } else if (!mayAuth) { + httpHandler.printServerResponseToWeb(ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED)); + return; + } + // 保存上下文 + AuthUserContext.set(uidInfoBO); + + chain.doFilter(req, resp); + } catch (Exception e) { + if (e instanceof LuckException) { + httpHandler.printServerResponseToWeb((LuckException) e); + return; + } + throw e; + } finally { + AuthUserContext.clean(); + AuthTokenContext.cleanToken(); + PmsContext.clean(); + } + + } + + /** + * 根据不同平台的token判断是否有url的权限 + */ + private ServerResponseEntity checkUriAndGetToken(HttpServletRequest req, String accessToken, boolean mayAuth, AntPathMatcher pathMatcher) { + // 校验token,并返回用户信息 + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(accessToken); + if (Objects.isNull(uidInfoBO) && !mayAuth) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + String requestUri = req.getRequestURI(); + // 退出登录的url是统一的 + if (Objects.isNull(uidInfoBO) || pathMatcher.match(AuthConfigAdapter.LOGIN_OUT_URI, requestUri)) { + return ServerResponseEntity.success(uidInfoBO); + } + + boolean isPlatform = pathMatcher.match(AuthConfigAdapter.PLATFORM_URI, requestUri); + boolean isMultiShop = pathMatcher.match(AuthConfigAdapter.MULTISHOP_URI, requestUri); + boolean isSupplier = pathMatcher.match(AuthConfigAdapter.SUPPLIER_URI, requestUri); + boolean isStation = Objects.equals(SysTypeEnum.STATION.value(), uidInfoBO.getSysType()); + boolean isPlatformOrMultiShop = pathMatcher.match(AuthConfigAdapter.MULTISHOP_PLATFORM_URI, requestUri); + // 平台端的uri问题 + if (isPlatform && !Objects.equals(SysTypeEnum.PLATFORM.value(), uidInfoBO.getSysType())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + + // 商家端的uri问题 + if (isMultiShop) { + if (!Objects.equals(SysTypeEnum.MULTISHOP.value(), uidInfoBO.getSysType())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + if (Objects.equals(uidInfoBO.getIsPassShop(), StatusEnum.DISABLE.value()) && !pathMatcher.match(AuthConfigAdapter.MULTSHOP_APPLY_URI, requestUri)) { + // 当商家处于申请开店状态并且调用不属于开店接口时 + throw new LuckException("你没有权限访问该页面"); + } + } + // 供应商端的uri问题 + if (isSupplier) { + if (!Objects.equals(SysTypeEnum.SUPPLIER.value(), uidInfoBO.getSysType())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + if (Objects.equals(uidInfoBO.getIsPassShop(), StatusEnum.DISABLE.value()) && !pathMatcher.match(AuthConfigAdapter.SUPPLIER_APPLY_URI, requestUri)) { + // 当供应商处于申请开店状态并且调用不属于开店接口时 + throw new LuckException("你没有权限访问该页面"); + } + } + // 商家、供应商或平台的uri + if (isPlatformOrMultiShop && !Objects.equals(SysTypeEnum.PLATFORM.value(), uidInfoBO.getSysType()) + && !Objects.equals(SysTypeEnum.MULTISHOP.value(), uidInfoBO.getSysType()) + && !Objects.equals(SysTypeEnum.SUPPLIER.value(), uidInfoBO.getSysType())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + + // 平台和商家和供应商还需要校验用户角色权限 + if (isPlatform || isMultiShop || isSupplier || isPlatformOrMultiShop) { + // 需要用户角色权限,就去根据用户角色权限判断是否 + if (!checkRbac(uidInfoBO, requestUri, req.getMethod())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + } + + // 用户端的uri问题 + if (!isPlatform && !isMultiShop && !isSupplier && !isPlatformOrMultiShop + && !isStation + && !Objects.equals(SysTypeEnum.ORDINARY.value(), uidInfoBO.getSysType())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + return ServerResponseEntity.success(uidInfoBO); + } + /** + * 用户角色权限校验 + * + * @param uri uri + * @return 是否校验成功 + */ + public boolean checkRbac(UidInfoBO uidInfoBO, String uri, String method) { + ServerResponseEntity booleanServerResponseEntity = permissionFeignClient + .checkPermission(uidInfoBO.getUserId(), uidInfoBO.getSysType(), uri, uidInfoBO.getIsAdmin(), HttpMethodEnum.valueOf(method.toUpperCase(Locale.ROOT)).value()); + + if (!booleanServerResponseEntity.isSuccess()) { + return false; + } + + return booleanServerResponseEntity.getData(); + } + + @SuppressWarnings("unchecked") + private void signAccess(FilterChain chain, HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { + UidInfoBO uidInfoBO; + ServerResponseEntity verifyResponse = signUtils.verify(req); + SignResponse signResponse = verifyResponse.getData(); + SysAccessKeyVO sysAccessKey = signResponse.getSysAccessKeyVO(); + long timestamp = System.currentTimeMillis(); + + if (!verifyResponse.isSuccess()) { + verifyResponse.setSign(SignUtils.sign(signResponse.getAppSecret(), timestamp, null)); + verifyResponse.setTimestamp(timestamp); + verifyResponse.setData(null); + ServerResponseEntity response = ServerResponseEntity.success(Json.toJsonString(verifyResponse)); + response.setSign(verifyResponse.getSign()); + httpHandler.printServerResponseToWeb(response); + return; + } + ServerResponseEntity tokenResponse = defaultSignAuthAdapter.loadUserInfoInToken(signResponse.getDataMap()); + if (!tokenResponse.isSuccess()) { + verifyResponse.setSign(SignUtils.sign(signResponse.getAppSecret(), timestamp, null)); + verifyResponse.setTimestamp(timestamp); + verifyResponse.setData(null); + verifyResponse.setMsg(tokenResponse.getMsg()); + ServerResponseEntity response = ServerResponseEntity.success(Json.toJsonString(verifyResponse)); + response.setSign(verifyResponse.getSign()); + httpHandler.printServerResponseToWeb(response); + return; + } + // 商家端、平台端、供应商端将权限保存至上下文 + if (Objects.equals(sysAccessKey.getSysType(), SysTypeEnum.PLATFORM.value()) + || Objects.equals(sysAccessKey.getSysType(), SysTypeEnum.MULTISHOP.value()) + ||Objects.equals(sysAccessKey.getSysType(), SysTypeEnum.SUPPLIER.value())) { + PmsContext.set(sysAccessKey.getPrems()); + } + + + uidInfoBO = tokenResponse.getData(); + // 校验权限 + if (!checkRbac(uidInfoBO, req.getRequestURI(), req.getMethod())) { + verifyResponse.setSign(SignUtils.sign(signResponse.getAppSecret(), timestamp, null)); + verifyResponse.setTimestamp(timestamp); + verifyResponse.setData(null); + verifyResponse.setMsg(ResponseEnum.UNAUTHORIZED.getMsg()); + verifyResponse.setCode(ResponseEnum.UNAUTHORIZED.value()); + ServerResponseEntity response = ServerResponseEntity.success(Json.toJsonString(verifyResponse)); + response.setSign(verifyResponse.getSign()); + httpHandler.printServerResponseToWeb(response); + return; + } + // 保存上下文 + AuthUserContext.set(uidInfoBO); + + ResponseWrapper responseWrapper = new ResponseWrapper(resp); + chain.doFilter(signResponse.getReq(), responseWrapper); + byte[] content = responseWrapper.getContent(); + // 获取相应数据 + String data = null; + if (content.length > 0) { + data = new String(content, StandardCharsets.UTF_8); + } + + ServerResponseEntity successResponse; + + if (StrUtil.isNotBlank(data)) { + successResponse = Json.parseObject(data, ServerResponseEntity.class); + } else if (responseWrapper.getStatus() != SUCCESS_CODE) { + successResponse = ServerResponseEntity.showFailMsg(data); + } else { + successResponse = ServerResponseEntity.success(data); + } + + if (Objects.nonNull(successResponse)) { + String responseData = JSON.toJSONString(successResponse.getData()); + + successResponse.setSign(SignUtils.sign(signResponse.getAppSecret(), timestamp, responseData)); + successResponse.setTimestamp(timestamp); + successResponse.setData(responseData); + httpHandler.printServerResponseToWeb(successResponse); + } + } + + private static Map getFeignMap(HttpServletRequest req) { + Map dataMap = new HashMap<>(6); + dataMap.put("sysType", req.getHeader("sysType")); + dataMap.put("sysUserId", req.getHeader("sysUserId")); + dataMap.put("shopId", req.getHeader("shopId")); + dataMap.put("userId", req.getHeader("userId")); + dataMap.put("supplierId", req.getHeader("supplierId")); + dataMap.put("stationId", req.getHeader("stationId")); + return dataMap; + } + +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/dubbo/DubboExceptionFilter.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/dubbo/DubboExceptionFilter.java new file mode 100644 index 0000000..23ba6c5 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/dubbo/DubboExceptionFilter.java @@ -0,0 +1,94 @@ +package com.tmerclub.cloud.common.security.filter.dubbo; + +import com.tmerclub.cloud.common.exception.LuckException; +import org.apache.dubbo.common.constants.CommonConstants; +import org.apache.dubbo.common.extension.Activate; +import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; +import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.common.utils.ReflectUtils; +import org.apache.dubbo.common.utils.StringUtils; +import org.apache.dubbo.rpc.*; +import org.apache.dubbo.rpc.filter.ExceptionFilter; +import org.apache.dubbo.rpc.service.GenericService; + +import java.lang.reflect.Method; + +import static org.apache.dubbo.common.constants.LoggerCodeConstants.CONFIG_FILTER_VALIDATION_EXCEPTION; + +/** + * @author YXF + */ +@Activate(group = CommonConstants.PROVIDER) +public class DubboExceptionFilter implements Filter, Filter.Listener { + private ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(ExceptionFilter.class); + + @Override + public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { + return invoker.invoke(invocation); + } + + @Override + public void onResponse(Result appResponse, Invoker invoker, Invocation invocation) { + if (appResponse.hasException() && GenericService.class != invoker.getInterface()) { + try { + Throwable exception = appResponse.getException(); + + // 自定义异常在dubbo中都属于运行时异常 + if (!(exception instanceof RuntimeException) && (exception instanceof Exception)) { + return; + } + // directly throw if the exception appears in the signature + try { + Method method = invoker.getInterface().getMethod(invocation.getMethodName(), invocation.getParameterTypes()); + Class[] exceptionClasses = method.getExceptionTypes(); + for (Class exceptionClass : exceptionClasses) { + if (exception.getClass().equals(exceptionClass)) { + return; + } + } + } catch (NoSuchMethodException e) { + return; + } + + // for the exception not found in method's signature, print ERROR message in server's log. + logger.error(CONFIG_FILTER_VALIDATION_EXCEPTION, "", "", "Got unchecked and undeclared exception which called by " + RpcContext.getServiceContext().getRemoteHost() + ". service: " + invoker.getInterface().getName() + ", method: " + invocation.getMethodName() + ", exception: " + exception.getClass().getName() + ": " + exception.getMessage(), exception); + + // directly throw if exception class and interface class are in the same jar file. + String serviceFile = ReflectUtils.getCodeBase(invoker.getInterface()); + String exceptionFile = ReflectUtils.getCodeBase(exception.getClass()); + if (serviceFile == null || exceptionFile == null || serviceFile.equals(exceptionFile)) { + return; + } + // directly throw if it's JDK exception + String className = exception.getClass().getName(); + if (className.startsWith("java.") || className.startsWith("javax.")) { + return; + } + // directly throw if it's dubbo exception + if (exception instanceof RpcException) { + return; + } + + // 自定义异常 + if (exception instanceof LuckException) { + return; + } + + // otherwise, wrap with RuntimeException and throw back to the client + appResponse.setException(new RuntimeException(StringUtils.toString(exception))); + } catch (Throwable e) { + logger.warn(CONFIG_FILTER_VALIDATION_EXCEPTION, "", "", "Fail to ExceptionFilter when called by " + RpcContext.getServiceContext().getRemoteHost() + ". service: " + invoker.getInterface().getName() + ", method: " + invocation.getMethodName() + ", exception: " + e.getClass().getName() + ": " + e.getMessage(), e); + } + } + } + + @Override + public void onError(Throwable e, Invoker invoker, Invocation invocation) { + logger.error(CONFIG_FILTER_VALIDATION_EXCEPTION, "", "", "Got unchecked and undeclared exception which called by " + RpcContext.getServiceContext().getRemoteHost() + ". service: " + invoker.getInterface().getName() + ", method: " + invocation.getMethodName() + ", exception: " + e.getClass().getName() + ": " + e.getMessage(), e); + } + + // For test purpose + public void setLogger(ErrorTypeAwareLogger logger) { + this.logger = logger; + } +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter b/tmerclub-common/tmerclub-common-security/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter new file mode 100644 index 0000000..eea004a --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter @@ -0,0 +1,4 @@ +userInfoConsumerFilter=com.tmerclub.cloud.common.security.filter.dubbo.UserInfoConsumerFilter +userInfoProviderFilter=com.tmerclub.cloud.common.security.filter.dubbo.UserInfoProviderFilter + +dubboExceptionFilter=com.tmerclub.cloud.common.security.filter.dubbo.DubboExceptionFilter diff --git a/tmerclub-common/tmerclub-common-sharding-proxy/pom.xml b/tmerclub-common/tmerclub-common-sharding-proxy/pom.xml new file mode 100644 index 0000000..c0f4e7e --- /dev/null +++ b/tmerclub-common/tmerclub-common-sharding-proxy/pom.xml @@ -0,0 +1,98 @@ + + + + tmerclub-common + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-common-sharding-proxy + 因为shardingsphere proxy分库分表的规则需要class来指定,所以这里面的这个jar是专门给shardingsphere proxy中间件去写插件的 + jar + + + + + + org.apache.shardingsphere + shardingsphere-sharding-api + 5.4.1 + + + org.apache.shardingsphere + shardingsphere-infra-binder + + + org.apache.shardingsphere + shardingsphere-infra-common + + + + + org.apache.shardingsphere + shardingsphere-infra-common + 5.4.1 + + + org.apache.shardingsphere + shardingsphere-infra-util + + + org.apache.shardingsphere + shardingsphere-infra-database-mysql + + + org.apache.shardingsphere + shardingsphere-infra-database-mariadb + + + org.apache.shardingsphere + shardingsphere-infra-database-postgresql + + + org.apache.shardingsphere + shardingsphere-infra-database-opengauss + + + org.apache.shardingsphere + shardingsphere-infra-database-oracle + + + org.apache.shardingsphere + shardingsphere-infra-database-sqlserver + + + org.apache.shardingsphere + shardingsphere-infra-database-h2 + + + org.apache.shardingsphere + shardingsphere-infra-database-sql92 + + + org.apache.shardingsphere + shardingsphere-infra-data-source-pool-hikari + + + org.apache.shardingsphere + shardingsphere-parser-sql-engine + + + + + org.apache.shardingsphere + shardingsphere-infra-spi + 5.4.1 + + + org.apache.shardingsphere + shardingsphere-infra-exception-core + + + + + + diff --git a/tmerclub-common/tmerclub-common-sharding-proxy/src/main/java/com/tmerclub/cloud/common/sharding/proxy/ShardingAlgorithmHelper.java b/tmerclub-common/tmerclub-common-sharding-proxy/src/main/java/com/tmerclub/cloud/common/sharding/proxy/ShardingAlgorithmHelper.java new file mode 100644 index 0000000..67cc5f3 --- /dev/null +++ b/tmerclub-common/tmerclub-common-sharding-proxy/src/main/java/com/tmerclub/cloud/common/sharding/proxy/ShardingAlgorithmHelper.java @@ -0,0 +1,51 @@ +package com.tmerclub.cloud.common.sharding.proxy; + + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +/** + * 分片策略辅助组件 + * @author FrozenWatermelon + * @version 1.0 + */ +@SuppressWarnings("MethodMayBeStatic") +public class ShardingAlgorithmHelper { + + /** + * 每个库的分表数量 默认25 + */ + protected static int TABLE_SIZE = 50; + + + /** + * 计算table的后缀 + * @param valueSuffix 分片键的值后三位 + * @return 表名后缀 + */ + public static String getTableSuffix(int valueSuffix) { + return "_" + valueSuffix % TABLE_SIZE; + } + + /** + * 获取真实的表名 + * @param columnValues 分片键的值 + * @return 匹配的表名集合 + */ + public static Set getTableNames(Collection tableNames, Collection columnValues) { + Set set = new HashSet<>(10); + for (Object columnValueObj : columnValues) { + String columnValue = String.valueOf(columnValueObj); + // 获取用户ID后三位 + String valueSuffix = (columnValue.length() < 3) ? columnValue : columnValue.substring(columnValue.length() - 3); + String databaseSuffix = ShardingAlgorithmHelper.getTableSuffix(Integer.parseInt(valueSuffix)); + for (String tableName : tableNames) { + if (tableName.endsWith(databaseSuffix)) { + set.add(tableName); + } + } + } + return set; + } +} diff --git a/tmerclub-flow/pom.xml b/tmerclub-flow/pom.xml new file mode 100644 index 0000000..0abaf99 --- /dev/null +++ b/tmerclub-flow/pom.xml @@ -0,0 +1,98 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-flow + jar + + 用户流量分析 + + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + com.moyuer.cloud + tmerclub-common-cache + ${project.version} + + + com.moyuer.cloud + tmerclub-common-security + ${project.version} + + + com.moyuer.cloud + tmerclub-common-leaf + ${project.version} + + + com.xuxueli + xxl-job-core + + + com.moyuer.cloud + tmerclub-api-order + ${project.version} + + + com.moyuer.cloud + tmerclub-api-product + ${project.version} + + + com.moyuer.cloud + tmerclub-api-user + ${project.version} + + + com.moyuer.cloud + tmerclub-api-flow + ${project.version} + + + com.moyuer.cloud + tmerclub-api-search + ${project.version} + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.moyuer.cloud + tmerclub-common-mongodb + ${project.version} + + + org.lionsoul + ip2region + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + + diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSpuBO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSpuBO.java new file mode 100644 index 0000000..c843f4b --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSpuBO.java @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.bo; + +import com.tmerclub.cloud.common.model.BaseModel; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; + + +/** + * 商品数据统计 + * + * @author YXF + * @date 2020-07-13 13:18:33 + */ +@CompoundIndexes({ + @CompoundIndex(name = "data_type_shop_idx", def = "{'dateType':1, 'shopId':1}") +}) +@Document("flow_spu") +public class FlowSpuBO extends BaseModel implements Serializable{ + + public static final Integer ID_LENGTH = 19; + + + /** + * id: 日期(yyMMdd) + 递增id + * 长度:19位 + */ + @Id + private Long id; + + + /** + * 日期类型:日、周、月 + */ + private Integer dateType; + + /** + * 商品id + */ + private Long spuId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 供应商商品id + */ + private Long supplierSpuId; + + /** + * 供应商商品id + */ + private Long supplierId; + + /** + * 曝光次数-浏览量 + */ + private Long visit; + + /** + * 曝光人数-浏览人数 + */ + private Integer visitUser; + + + /** + * 加购件数 + */ + private Integer plusShopCart; + + + /** + * 加购人数 + */ + private Integer plusShopCartUser; + + /** + * 下单人数 + */ + private Integer placeOrderUser; + + /** + * 支付人数 + */ + private Integer payUser; + + /** + * 下单件数 + */ + private Integer placeOrderNum; + + /** + * 支付件数 + */ + private Integer payNum; + + /** + * 下单金额 + */ + private Long placeOrderAmount; + + /** + * 支付金额 + */ + private Long payAmount; + + /** + * 申请退款订单数 + */ + private Integer applyRefundOrder; + + /** + * 申请退款人数 + */ + private Integer applyRefundUser; + + /** + * 申请退款金额 + */ + private Long applyRefundAmount; + + /** + * 成功退款订单数 + */ + private Integer successRefundOrder; + + /** + * 成功退款人数 + */ + private Integer successRefundUser; + + /** + * 成功退款金额 + */ + private Long successRefundAmount; + + /** + * 成功退款率 + */ + private Double refundRate; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getDateType() { + return dateType; + } + + public void setDateType(Integer dateType) { + this.dateType = dateType; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getVisit() { + return visit; + } + + public void setVisit(Long visit) { + this.visit = visit; + } + + public Integer getVisitUser() { + return visitUser; + } + + public void setVisitUser(Integer visitUser) { + this.visitUser = visitUser; + } + + public Integer getPlusShopCart() { + return plusShopCart; + } + + public void setPlusShopCart(Integer plusShopCart) { + this.plusShopCart = plusShopCart; + } + + public Integer getPlusShopCartUser() { + return plusShopCartUser; + } + + public void setPlusShopCartUser(Integer plusShopCartUser) { + this.plusShopCartUser = plusShopCartUser; + } + + public Integer getPlaceOrderUser() { + return placeOrderUser; + } + + public void setPlaceOrderUser(Integer placeOrderUser) { + this.placeOrderUser = placeOrderUser; + } + + public Integer getPayUser() { + return payUser; + } + + public void setPayUser(Integer payUser) { + this.payUser = payUser; + } + + public Integer getPlaceOrderNum() { + return placeOrderNum; + } + + public void setPlaceOrderNum(Integer placeOrderNum) { + this.placeOrderNum = placeOrderNum; + } + + public Integer getPayNum() { + return payNum; + } + + public void setPayNum(Integer payNum) { + this.payNum = payNum; + } + + public Long getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Long placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getApplyRefundOrder() { + return applyRefundOrder; + } + + public void setApplyRefundOrder(Integer applyRefundOrder) { + this.applyRefundOrder = applyRefundOrder; + } + + public Integer getApplyRefundUser() { + return applyRefundUser; + } + + public void setApplyRefundUser(Integer applyRefundUser) { + this.applyRefundUser = applyRefundUser; + } + + public Integer getSuccessRefundOrder() { + return successRefundOrder; + } + + public void setSuccessRefundOrder(Integer successRefundOrder) { + this.successRefundOrder = successRefundOrder; + } + + public Integer getSuccessRefundUser() { + return successRefundUser; + } + + public void setSuccessRefundUser(Integer successRefundUser) { + this.successRefundUser = successRefundUser; + } + + public Long getApplyRefundAmount() { + return applyRefundAmount; + } + + public void setApplyRefundAmount(Long applyRefundAmount) { + this.applyRefundAmount = applyRefundAmount; + } + + public Long getSuccessRefundAmount() { + return successRefundAmount; + } + + public void setSuccessRefundAmount(Long successRefundAmount) { + this.successRefundAmount = successRefundAmount; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Double getRefundRate() { + return refundRate; + } + + public void setRefundRate(Double refundRate) { + this.refundRate = refundRate; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + @Override + public String toString() { + return "FlowSpuBO{" + + "id=" + id + + ", dateType=" + dateType + + ", spuId=" + spuId + + ", shopId=" + shopId + + ", supplierSpuId=" + supplierSpuId + + ", supplierId=" + supplierId + + ", visit=" + visit + + ", visitUser=" + visitUser + + ", plusShopCart=" + plusShopCart + + ", plusShopCartUser=" + plusShopCartUser + + ", placeOrderUser=" + placeOrderUser + + ", payUser=" + payUser + + ", placeOrderNum=" + placeOrderNum + + ", payNum=" + payNum + + ", placeOrderAmount=" + placeOrderAmount + + ", payAmount=" + payAmount + + ", applyRefundOrder=" + applyRefundOrder + + ", applyRefundUser=" + applyRefundUser + + ", applyRefundAmount=" + applyRefundAmount + + ", successRefundOrder=" + successRefundOrder + + ", successRefundUser=" + successRefundUser + + ", successRefundAmount=" + successRefundAmount + + ", refundRate=" + refundRate + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSpuUserBO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSpuUserBO.java new file mode 100644 index 0000000..590d6e9 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSpuUserBO.java @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.bo; + +import com.tmerclub.cloud.common.model.BaseModel; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; + + +/** + * 商城用户操作行为统计 + * + * @author YXF + * @date 2020-07-13 13:18:33 + */ +@CompoundIndexes({ + @CompoundIndex(name = "spu_user_idx", def = "{'spuId':1, 'userId':1}") +}) +@Document("flow_spu_user") +public class FlowSpuUserBO extends BaseModel implements Serializable{ + + + + /** + * id: 日期(yyMMdd)+ 编号 + * 长度:18位 + */ + @Id + private Long id; + /** + * 用户id + */ + private Long userId; + /** + * 商品id + */ + private Long spuId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 供应商商品id + */ + private Long supplierSpuId; + + /** + * 供应商商品id + */ + private Long supplierId; + + /** + * 省id + */ + private Long provinceId; + + /** + * 是否浏览 1:是 0 + */ + private Integer visit; + + /** + * 浏览量 + */ + private Integer visitNum; + + /** + * 是否加购 1:加购 0:未加购 + */ + private Integer plusShopCart; + + /** + * 加购数量 + */ + private Integer plusShopCartNum; + + /** + * 是否为新访客数 1:新访客(新用户+新访客) 0:旧访客(旧用户) + */ + private Integer newVisit; + + /** + * operateId + */ + private Long oid; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public Integer getVisit() { + return visit; + } + + public void setVisit(Integer visit) { + this.visit = visit; + } + + public Integer getPlusShopCart() { + return plusShopCart; + } + + public void setPlusShopCart(Integer plusShopCart) { + this.plusShopCart = plusShopCart; + } + + public Integer getPlusShopCartNum() { + return plusShopCartNum; + } + + public void setPlusShopCartNum(Integer plusShopCartNum) { + this.plusShopCartNum = plusShopCartNum; + } + + public Integer getVisitNum() { + return visitNum; + } + + public void setVisitNum(Integer visitNum) { + this.visitNum = visitNum; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getOid() { + return oid; + } + + public void setOid(Long oid) { + this.oid = oid; + } + + public Integer getNewVisit() { + return newVisit; + } + + public void setNewVisit(Integer newVisit) { + this.newVisit = newVisit; + } + + @Override + public String toString() { + return "FlowSpuUserBO{" + + "id=" + id + + ", userId=" + userId + + ", spuId=" + spuId + + ", shopId=" + shopId + + ", supplierSpuId=" + supplierSpuId + + ", supplierId=" + supplierId + + ", provinceId=" + provinceId + + ", visit=" + visit + + ", visitNum=" + visitNum + + ", plusShopCart=" + plusShopCart + + ", plusShopCartNum=" + plusShopCartNum + + ", newVisit=" + newVisit + + ", oid=" + oid + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSystemUserBO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSystemUserBO.java new file mode 100644 index 0000000..c50748b --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSystemUserBO.java @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.bo; + +import com.tmerclub.cloud.common.model.BaseModel; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; + + +/** + * 各平台端用户记录 + * + * @author YXF + * @date 2020-07-13 13:18:33 + */ +@CompoundIndexes({ + @CompoundIndex(name = "user_idx", def = "{'userId':1}"), + @CompoundIndex(name = "date_type_system_type_idx", def = "{'dateType':1, 'systemType':1}") +}) +@Document("flow_system_user") +public class FlowSystemUserBO extends BaseModel implements Serializable{ + + public static final Integer ID_LENGTH = 18; + + + /** + * id: 日期(yyMMdd)+ 日期类型(日周月) + 系统类型 + 编号 + * 长度:18位 + */ + @Id + private Long id; + + /** + * 用户id + */ + private Long userId; + + + /** + * 系统类型 0:全部 1:pc 2:h5 3:小程序 4:安卓 5:ios + */ + private Integer systemType; + + /** + * 日、周、月 + */ + private Integer dateType; + + /** + * 是否加购 0: 否 1:是 + */ + private Integer plusShopCart; + + /** + * 新访客 0: 否 1:是 + */ + private Integer newVisitUser; + + /** + * 是否跳失 0: 否 1:是 + */ + private Integer loss; + + /** + * 是否下单 0: 否 1:是 + */ + private Integer placeOrder; + + /** + * 是否支付 0: 否 1:是 + */ + private Integer pay; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + public Integer getDateType() { + return dateType; + } + + public void setDateType(Integer dateType) { + this.dateType = dateType; + } + + public Integer getPlusShopCart() { + return plusShopCart; + } + + public void setPlusShopCart(Integer plusShopCart) { + this.plusShopCart = plusShopCart; + } + + public Integer getNewVisitUser() { + return newVisitUser; + } + + public void setNewVisitUser(Integer newVisitUser) { + this.newVisitUser = newVisitUser; + } + + public Integer getLoss() { + return loss; + } + + public void setLoss(Integer loss) { + this.loss = loss; + } + + public Integer getPlaceOrder() { + return placeOrder; + } + + public void setPlaceOrder(Integer placeOrder) { + this.placeOrder = placeOrder; + } + + public Integer getPay() { + return pay; + } + + public void setPay(Integer pay) { + this.pay = pay; + } + + @Override + public String toString() { + return "SystemUserAnalyseBO{" + + "id=" + id + + ", userId=" + userId + + ", systemType=" + systemType + + ", dateType=" + dateType + + ", plusShopCart=" + plusShopCart + + ", newVisitUser=" + newVisitUser + + ", loss=" + loss + + ", placeOrder=" + placeOrder + + ", pay=" + pay + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserBO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserBO.java new file mode 100644 index 0000000..54852bc --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserBO.java @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.bo; + +import com.tmerclub.cloud.common.model.BaseModel; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; + + +/** + * 商城用户操作行为统计 + * + * @author YXF + * @date 2020-07-13 13:18:33 + */ +@CompoundIndexes({ + @CompoundIndex(name = "date_type_type_idx", def = "{'dateType':1, 'type':1}") +}) +@Document("flow_user") +public class FlowUserBO extends BaseModel implements Serializable { + + public static final Integer ID_LENGTH = 16; + + /** + * id: 日期(yyMMdd)+ 时间类型 + 编号 + * 长度:16位 + */ + @Id + private Long id; + + /** + * 日、周、月 + */ + private Integer dateType; + + /** + * 数据类型 0: 所有用户 1:免费用户 2 付费用户 + */ + private Integer type; + + /** + * 用户数 + */ + private Integer userNum; + + /** + * 领券用户数 + */ + private Integer receiveCouponUser; + + /** + * 新增用户数 + */ + private Integer newUserNum; + + /** + * 支付用户数 + */ + private Integer payUser; + + /** + * 支付订单数 + */ + private Integer payOrder; + + /** + * 支付金额 + */ + private Long payAmount; + + public FlowUserBO() { + this.userNum = 0; + this.receiveCouponUser = 0; + this.newUserNum = 0; + this.payUser = 0; + this.payOrder = 0; + this.payAmount = 0L; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getDateType() { + return dateType; + } + + public void setDateType(Integer dateType) { + this.dateType = dateType; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getUserNum() { + return userNum; + } + + public void setUserNum(Integer userNum) { + this.userNum = userNum; + } + + public Integer getReceiveCouponUser() { + return receiveCouponUser; + } + + public void setReceiveCouponUser(Integer receiveCouponUser) { + this.receiveCouponUser = receiveCouponUser; + } + + public Integer getNewUserNum() { + return newUserNum; + } + + public void setNewUserNum(Integer newUserNum) { + this.newUserNum = newUserNum; + } + + public Integer getPayUser() { + return payUser; + } + + public void setPayUser(Integer payUser) { + this.payUser = payUser; + } + + public Integer getPayOrder() { + return payOrder; + } + + public void setPayOrder(Integer payOrder) { + this.payOrder = payOrder; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + @Override + public String toString() { + return "UserStatisticsBO{" + + "id=" + id + + ", dateType=" + dateType + + ", type=" + type + + ", userNum=" + userNum + + ", receiveCouponUser=" + receiveCouponUser + + ", newUserNum=" + newUserNum + + ", payUser=" + payUser + + ", payOrder=" + payOrder + + ", payAmount=" + payAmount + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserOperationBO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserOperationBO.java new file mode 100644 index 0000000..b893df9 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserOperationBO.java @@ -0,0 +1,280 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.bo; + +import com.tmerclub.cloud.common.model.BaseModel; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; + + +/** + * 商城用户操作行为统计 + * + * @author YXF + * @date 2020-07-13 13:18:33 + */ +@CompoundIndexes({ + @CompoundIndex(name = "user_idx", def = "{'userId':1}") +}) +@Document("flow_user_operation") +public class FlowUserOperationBO extends BaseModel implements Serializable{ + + + + /** + * id: 日期(yyMMdd)+ 会员类型(1:会员 0:访客) +编号 + * 长度:18位 + */ + @Id + private Long id; + /** + * 用户id + */ + private Long userId; + + + /** + * 步骤数 + */ + private Integer step; + + /** + * 省id + */ + private Long provinceId; + + /** + * 浏览量 + */ + private Integer visitNum; + + /** + * 加购数量 + */ + private Integer plusShopCartNum; + + /** + * 是否新用户 1:新注册用户 0:老用户 + */ + private Integer newUser; + + /** + * 是否新会员(付费) 1:新付费会员 0:非新付费会员 + */ + private Integer newVipUser; + + /** + * 是否付费会员 1:付费会员 0:普通会员 + */ + private Integer vipUser; + + /** + * 是否为会员 1:会员 0:访客 + */ + private Integer membership; + + /** + * 是否领优惠券 1:领券 0:未领券 + */ + private Integer receiveCoupon; + + /** + * 是否下单 1:是 0:否 + */ + private Integer placeOrder; + + /** + * 是否支付 1:是 0:否 + */ + private Integer pay; + + /** + * 下单数量 + */ + private Integer placeOrderNum; + + /** + * 支付数量 + */ + private Integer payNum; + + /** + * 下单金额 + */ + private Integer placeOrderAmount; + + /** + * 支付金额 + */ + private Integer payAmount; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getStep() { + return step; + } + + public void setStep(Integer step) { + this.step = step; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public Integer getVisitNum() { + return visitNum; + } + + public void setVisitNum(Integer visitNum) { + this.visitNum = visitNum; + } + + public Integer getPlusShopCartNum() { + return plusShopCartNum; + } + + public void setPlusShopCartNum(Integer plusShopCartNum) { + this.plusShopCartNum = plusShopCartNum; + } + + public Integer getNewUser() { + return newUser; + } + + public void setNewUser(Integer newUser) { + this.newUser = newUser; + } + + public Integer getNewVipUser() { + return newVipUser; + } + + public void setNewVipUser(Integer newVipUser) { + this.newVipUser = newVipUser; + } + + public Integer getVipUser() { + return vipUser; + } + + public void setVipUser(Integer vipUser) { + this.vipUser = vipUser; + } + + public Integer getMembership() { + return membership; + } + + public void setMembership(Integer membership) { + this.membership = membership; + } + + public Integer getReceiveCoupon() { + return receiveCoupon; + } + + public void setReceiveCoupon(Integer receiveCoupon) { + this.receiveCoupon = receiveCoupon; + } + + public Integer getPlaceOrder() { + return placeOrder; + } + + public void setPlaceOrder(Integer placeOrder) { + this.placeOrder = placeOrder; + } + + public Integer getPay() { + return pay; + } + + public void setPay(Integer pay) { + this.pay = pay; + } + + public Integer getPlaceOrderNum() { + return placeOrderNum; + } + + public void setPlaceOrderNum(Integer placeOrderNum) { + this.placeOrderNum = placeOrderNum; + } + + public Integer getPayNum() { + return payNum; + } + + public void setPayNum(Integer payNum) { + this.payNum = payNum; + } + + public Integer getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Integer placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Integer getPayAmount() { + return payAmount; + } + + public void setPayAmount(Integer payAmount) { + this.payAmount = payAmount; + } + + @Override + public String toString() { + return "UserAnalyseLogBO{" + + "id=" + id + + ", userId=" + userId + + ", step=" + step + + ", provinceId=" + provinceId + + ", visitNum=" + visitNum + + ", plusShopCartNum=" + plusShopCartNum + + ", newUser=" + newUser + + ", newVipUser=" + newVipUser + + ", vipUser=" + vipUser + + ", membership=" + membership + + ", receiveCoupon=" + receiveCoupon + + ", placeOrder=" + placeOrder + + ", pay=" + pay + + ", placeOrderNum=" + placeOrderNum + + ", payNum=" + payNum + + ", placeOrderAmount=" + placeOrderAmount + + ", payAmount=" + payAmount + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserRetainBO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserRetainBO.java new file mode 100644 index 0000000..7cc3b56 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserRetainBO.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.bo; + +import com.tmerclub.cloud.common.model.BaseModel; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; + + +/** + * 商城用户留存统计 + * + * @author YXF + * @date 2020-07-13 13:18:33 + */@CompoundIndexes({ + @CompoundIndex(name = "retain_type_idx", def = "{'retainType':1}") +}) +@Document("flow_user_retain") +public class FlowUserRetainBO extends BaseModel implements Serializable{ + + public static final Integer ID_LENGTH = 5; + + /** + * id: 日期(yyMM) + retainType + * 长度:5位 + */ + @Id + private Integer id; + + /** + * 留存类型 1: 访问留存 2:成交留存 + */ + private Integer retainType; + + /** + * 新访问/成交客户数 + */ + private Integer newCustomers; + + /** + * 第1月留存 + */ + private Integer firstMonthRemain; + + + /** + * 第2月留存 + */ + private Integer secondMonthRemain; + + /** + * 第3月留存 + */ + private Integer thirdMonthRemain; + + /** + * 第4月留存 + */ + private Integer fourthMonthRemain; + + + /** + * 第5月留存 + */ + private Integer fifthMonthRemain; + + /** + * 第6月留存 + */ + private Integer sixthMonthRemain; + + + public FlowUserRetainBO() { + this.newCustomers = 0; + this.firstMonthRemain = 0; + this.secondMonthRemain = 0; + this.thirdMonthRemain = 0; + this.fourthMonthRemain = 0; + this.fifthMonthRemain = 0; + this.sixthMonthRemain = 0; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getNewCustomers() { + return newCustomers; + } + + public void setNewCustomers(Integer newCustomers) { + this.newCustomers = newCustomers; + } + + public Integer getFirstMonthRemain() { + return firstMonthRemain; + } + + public void setFirstMonthRemain(Integer firstMonthRemain) { + this.firstMonthRemain = firstMonthRemain; + } + + public Integer getSecondMonthRemain() { + return secondMonthRemain; + } + + public void setSecondMonthRemain(Integer secondMonthRemain) { + this.secondMonthRemain = secondMonthRemain; + } + + public Integer getThirdMonthRemain() { + return thirdMonthRemain; + } + + public void setThirdMonthRemain(Integer thirdMonthRemain) { + this.thirdMonthRemain = thirdMonthRemain; + } + + public Integer getFourthMonthRemain() { + return fourthMonthRemain; + } + + public void setFourthMonthRemain(Integer fourthMonthRemain) { + this.fourthMonthRemain = fourthMonthRemain; + } + + public Integer getFifthMonthRemain() { + return fifthMonthRemain; + } + + public void setFifthMonthRemain(Integer fifthMonthRemain) { + this.fifthMonthRemain = fifthMonthRemain; + } + + public Integer getSixthMonthRemain() { + return sixthMonthRemain; + } + + public void setSixthMonthRemain(Integer sixthMonthRemain) { + this.sixthMonthRemain = sixthMonthRemain; + } + + public Integer getRetainType() { + return retainType; + } + + public void setRetainType(Integer retainType) { + this.retainType = retainType; + } + + @Override + public String toString() { + return "FlowUserRetainBO{" + + "id=" + id + + ", retainType=" + retainType + + ", newCustomers=" + newCustomers + + ", firstMonthRemain=" + firstMonthRemain + + ", secondMonthRemain=" + secondMonthRemain + + ", thirdMonthRemain=" + thirdMonthRemain + + ", fourthMonthRemain=" + fourthMonthRemain + + ", fifthMonthRemain=" + fifthMonthRemain + + ", sixthMonthRemain=" + sixthMonthRemain + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/config/Ip2RegionConfig.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/config/Ip2RegionConfig.java new file mode 100644 index 0000000..bc51c0b --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/config/Ip2RegionConfig.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.config; + + +import org.springframework.context.annotation.Configuration; + +/** + * 获取IP + * @author YXF + * @date 2021-06-02 + */ +@Configuration +public class Ip2RegionConfig { + +// private static final Logger log = LoggerFactory.getLogger(Ip2RegionConfig.class); +// +// @Bean(destroyMethod = "close") +// public Searcher searcher() throws IOException { +// // 获取ip库路径 +// ClassPathResource classPathResource = new ClassPathResource("ip2region.xdb"); +// if (classPathResource.getClassLoader() == null){ +// log.error("ip2region.xdb 存储路径发生错误,没有被发现"); +// return null; +// } +// InputStream inputStream = classPathResource.getInputStream(); +// // 1、从 dbPath 加载整个 xdb 到内存。 +// byte[] cBuff = IoUtil.readBytes(inputStream); +// +// // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。 +// Searcher searcher = null; +// try { +// searcher = Searcher.newWithBuffer(cBuff); +// } catch (Exception e) { +// System.out.printf("failed to create content cached searcher: %s\n", e); +// } +// return searcher; +// } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowLogPageEnum.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowLogPageEnum.java new file mode 100644 index 0000000..f3f1abd --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowLogPageEnum.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.constant; + +/** + * 页面编号(编号的顺序对数据没有影响) + * + * @author + */ +public enum FlowLogPageEnum { + + /** 首页*/ + HOME(1, "首页"), + /** 商品详情(普通) */ + PROD_INFO(2, "商品详情页"), + /** 分类 */ + CATEGORY(3, "分类页"), + + /** + * =================== 100+ 以上是活动页面 =================== + */ + + /** 满减 */ + DISCOUNT(101, "满减活动"), + /** 领券中心 */ + COUPON(102, "领券中心"), + /** 购物车 */ + GROUP(103, "团购活动"), + /** 购物车 */ + SECKILL(104, "秒杀活动"), + /** 购物车 */ + DISTRIBUTION(105, "分销页面"), + + + /** + * =================== 200+ 是订单页面 =================== + */ + + /** 购物车 */ + SHOP_CAT(201, "购物车页"), + /** 订单详情 */ + PLACE_ORDER(202, "订单详情页"), + /** 订单列表 */ + ORDER_LIST(203, "订单列表页"), + /** 支付页面 */ + PAY(204, "支付页"), + /** 支付成功页面 */ + PAY_SUCCESS(205, "支付成功页"), + /** 生成订单结算页面 */ + ORDER_CONFIRM(206, "生成订单结算页面"), + /** 订单退款详情 */ + ORDER_REFUND_DETAILS(207, "订单退款详情"), + /** 申请退款 */ + ORDER_REFUND_APPLY(208, "生成订单结算页面"), + + + /** + * =================== 300+ 是会员页面 =================== + */ + + /** 个人中心 */ + USER_CENTER(301, "个人中心首页"), + /* 会员中心 */ + USER(302, "会员中心"), + /* 我的余额 */ + USER_RECHARGE(303, "我的余额"); + + private final Integer id; + private final String name; + + public Integer value() { + return id; + } + + public static String name(Integer id) { + FlowLogPageEnum[] enums = values(); + for (FlowLogPageEnum statusEnum : enums) { + if (statusEnum.value().equals(id)) { + return statusEnum.name; + } + } + return null; + } + + FlowLogPageEnum(Integer id, String name) { + this.id = id; + this.name = name; + } + + public static FlowLogPageEnum[] allEnum() { + return values(); + } + +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowUserTypeEnum.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowUserTypeEnum.java new file mode 100644 index 0000000..a7ae263 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowUserTypeEnum.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.constant; + + +/** + * 页面操作 + * + * @author + */ +public enum FlowUserTypeEnum { + /** + * 新用户 + */ + NEW_USER(0), + /** + * 旧用户 + */ + OLDER_USER(1), + /** + * 未登陆用户 + */ + NOT_LOGIN(2); + + private final Integer id; + + public Integer value() { + return id; + } + + FlowUserTypeEnum(Integer id) { + this.id = id; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowVisitEnum.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowVisitEnum.java new file mode 100644 index 0000000..3a8783b --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowVisitEnum.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.constant; + + +/** + * 页面操作 + * + * @author yxf + */ +public enum FlowVisitEnum { + /** + * 访问页面 + */ + VISIT(1), + /** 加购 */ + SHOP_CAT(2), + /** 收藏 */ + COLLECT(3), + /** 提交订单 */ + CONFIRM_ORDER(4), + /** 支付成功 */ + PAY_SUCCESS(5); + private final Integer id; + + public final Integer value() { + return id; + } + + FlowVisitEnum(Integer id) { + this.id = id; + } + + public static FlowVisitEnum instance (String value) { + FlowVisitEnum[] enums = values(); + for (FlowVisitEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static FlowVisitEnum[] allEnum () { + FlowVisitEnum[] enums = values(); + return enums; + } + + + public static Boolean isVisitOrShare (Integer id){ + if (id.equals(VISIT.value())){ + return true; + } + return false; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FormItemEnum.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FormItemEnum.java new file mode 100644 index 0000000..8f36066 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FormItemEnum.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.constant; + +/** + * 报表项内容 + * + * @author TRACK + */ +public enum FormItemEnum { + /** + * 客单价 (支付金额/支付人数) + */ + CUSTOMER_UNIT_PRICE(1, "客单价", "Customer Unit Price", 0, "customerUnitPrice"), + + /** + * 总成交金额 + */ + TOTAL_TRANSACTION_AMOUNT(2, "总成交金额", "Total transaction amount", 0, "totalTransactionAmount"), + + /** + * 自营客单价 (自营金额/自营下单人数) + */ + SELF_OPERATED_CUSTOMER_UNIT_PRICE(3, "自营客单价", "Self-employed customer unit price", 1, "selfCustomerUnitPrice"), + + /** + * 自营金额 + */ + SELF_OPERATED_AMOUNT(4, "自营金额", "Self-employed amount", 1, "selfAmount"), + + /** + * 自营订单数 + */ + SELF_OPERATED_ORDER_NUMS(5, "自营订单数", "Number of self-operated orders", 1, "selfOrders"), + + /** + * 自营商品数 + */ + SELF_OPERATED_PRODUCT_NUMS(6, "自营商品数", "Number of self-operated products", 1, "selfProducts"), + + /** + * 下单金额 + */ + ORDER_AMOUNT(7, "下单金额", "Order amount", 0, "orderAmount"), + + /** + * 下单人数 + */ + USER_NUMS(8, "下单人数", "Number of people placing orders", 0, "peopleOrderNums"), + + /** + * 下单笔数 + */ + ORDER_NUMS(9, "下单笔数", "Number of orders", 0, "orderNums"), + + /** + * 下单商品数 + */ + PRODUCT_NUMS(10, "下单商品数", "Number of products ordered", 0, "orderProducts"), + + /** + * 支付金额 + */ + PAY_AMOUNT(11, "支付金额", "Payment amount", 0, "paymentAmount"), + + /** + * 支付人数 + */ + PAY_USER_NUMS(12, "支付人数", "Number of people paid", 0, "payPeopleNums"), + + /** + * 支付订单数 + */ + PAY_ORDER_NUMS(13, "支付订单数", "Number of paid orders", 0, "payOrderNums"), + + /** + * 支付商品数 + */ + PAY_PRODUCT_NUMS(14, "支付商品数", "Number of paid products", 0, "payProductNums"), + + /** + * 成功退款金额 + */ + SUCCESS_REFUND_AMOUNT(15, "成功退款金额", "Successful refund amount", 0, "successRefundAmount"), + + /** + * 退款订单数量 + */ + REFUND_ORDER_NUMS(16, "退款订单数量", "Number of refund orders", 0, "refundOrderNums"), + + /** + * 下单-支付转化率 (支付订单数量/下单订单数量) + */ + ORDER_TO_PAY_RATE(17, "下单-支付转化率", "Order-Payment Conversion Rate", 0, "orderPaymentRate"), + + /** + * 退款率 (退款订单数量/订单数量) + */ + REFUND_RATE(18, "退款率", "Refund Rate", 0, "refundRate"), + + /** + * 自营下单人数 + */ + SELF_OPERATED_NUMS(19, "自营下单人数", "Number of self-operated orders", 1, "selfNums"); + + private final Integer num; + + private final String name; + + private final String nameEn; + + /** + * 0:通用,1:平台 2:商家端 + */ + private final Integer type; + + private final String columnStr; + + public Integer value() { + return num; + } + + public String getName() { + return name; + } + + public String getNameEn() { + return nameEn; + } + + public Integer getType() { + return type; + } + + public String getColumnStr() { + return columnStr; + } + + FormItemEnum(Integer num, String name, String nameEn, Integer type, String columnStr) { + this.num = num; + this.name = name; + this.nameEn = nameEn; + this.type = type; + this.columnStr = columnStr; + } + + public static FormItemEnum instance(Integer value) { + FormItemEnum[] enums = values(); + for (FormItemEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static FormItemEnum[] allEnum() { + return values(); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/SystemTypeEnum.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/SystemTypeEnum.java new file mode 100644 index 0000000..8b4995f --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/SystemTypeEnum.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.constant; + + +/** + * 页面编号(编号的顺序对数据没有影响) + * + * @author YXF + * @date 2021-05-22 + */ +public enum SystemTypeEnum { + /** + * 商城 + */ + ALL(0), + /** + * PC + */ + PC(1), + /** + * H4 + */ + H5(2), + /** + * 小程序 + */ + APPLETS(3), + /** + * 安卓 + */ + ANDROID(4), + /** + * IOS + */ + IOS(5); + + private final Integer id; + + public Integer value() { + return id; + } + + SystemTypeEnum(Integer id) { + this.id = id; + } + + public static SystemTypeEnum instance(Integer value) { + SystemTypeEnum[] enums = values(); + for (SystemTypeEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return H5; + } + +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/admin/ProductAnalyseController.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/admin/ProductAnalyseController.java new file mode 100644 index 0000000..24b51ac --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/admin/ProductAnalyseController.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.controller.admin; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.flow.dto.SingleProdTrendDTO; +import com.tmerclub.cloud.flow.service.ProductAnalyseService; +import com.tmerclub.cloud.flow.vo.SingleProdTrendVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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.util.List; +import java.util.Objects; + +/** + * 流量分析—商品分析 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +@RestController +@RequestMapping("/mp/product_analyse") +@Tag(name = "admin流量分析—商品分析") +public class ProductAnalyseController { + + @Autowired + private ProductAnalyseService productAnalyseService; + + @GetMapping("/get_single_prod_trend") + @Operation(summary = "获得单个商品趋势图") + public ServerResponseEntity> getSingleProdTrend(SingleProdTrendDTO singleProdTrendDTO) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + if (Objects.equals(SysTypeEnum.MULTISHOP.value(), uidInfoBO.getSysType())) { + singleProdTrendDTO.setShopId(uidInfoBO.getTenantId()); + } + List singleProdTend = productAnalyseService.getSingleProdTend(singleProdTrendDTO); + return ServerResponseEntity.success(singleProdTend); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/app/FlowLogController.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/app/FlowLogController.java new file mode 100644 index 0000000..0579a37 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/app/FlowLogController.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.controller.app; + +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.flow.constant.DistributedIdKey; +import com.tmerclub.cloud.flow.constant.FlowLogPageEnum; +import com.tmerclub.cloud.flow.constant.FlowVisitEnum; +import com.tmerclub.cloud.flow.dto.FlowLogDTO; +import com.tmerclub.cloud.flow.service.FlowService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; +import java.util.regex.Pattern; + +/** + * 流量分析—页面分析 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +@RestController("appPageAnalyseController") +@RequestMapping("/ma/flow") +@Tag(name = "app流量分析—页面分析") +public class FlowLogController { + + private static final Logger log = LoggerFactory.getLogger(FlowLogController.class); + + @Autowired + private FlowService flowService; + @Autowired + private SegmentManager segmentManager; + + private static final Pattern SPU_ID_PATTERN = Pattern.compile("[0-9]+"); + + @PostMapping + @Operation(summary = "保存用户操作信息", description = "保存用户操作信息") + public ServerResponseEntity page(@RequestBody FlowLogDTO flowLogDTO) { + // 数据为空,打印日志 + if (checkDate(flowLogDTO)) { + return ServerResponseEntity.success(); + } + flowService.log(flowLogDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/getId") + @Operation(summary = "获取用户操作id", description = "获取用户操作id") + public ServerResponseEntity getId() { + Long data = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_FLOW_USER_ID); + return ServerResponseEntity.success(data); + } + /** + * 数据是否错误 + * @param flowLogDTO + * @return + */ + private Boolean checkDate(FlowLogDTO flowLogDTO) { + if(Objects.isNull(flowLogDTO.getPid()) || Objects.isNull(flowLogDTO.getOid()) || + Objects.isNull(flowLogDTO.getVe()) || Objects.isNull(flowLogDTO.getS()) || Objects.isNull(flowLogDTO.getSt())){ + log.error("用户流量记录-基本数据不全:{}", flowLogDTO); + return Boolean.TRUE; + } + if (Objects.equals(flowLogDTO.getVe(), FlowVisitEnum.SHOP_CAT.value())) { + if (Objects.isNull(flowLogDTO.getBid())) { + log.error("用户流量记录-购物车:商品id为空{}", flowLogDTO); + return Boolean.TRUE; + } + if (Objects.isNull(flowLogDTO.getN())) { + log.error("用户流量记录-加购:加购数量为空{}", flowLogDTO); + return Boolean.TRUE; + } + } + if (Objects.equals(flowLogDTO.getPid(), FlowLogPageEnum.PROD_INFO.value())) { + if (Objects.isNull(flowLogDTO.getBid())) { + log.error("用户流量记录-商品详情:商品id为空{}", flowLogDTO); + return Boolean.TRUE; + } + if (!SPU_ID_PATTERN.matcher(flowLogDTO.getBid()).matches()) { + log.error("用户流量记录-商品详情:商品id数据错误{}", flowLogDTO); + return Boolean.TRUE; + } + } + boolean order = Objects.equals(flowLogDTO.getPid(), FlowVisitEnum.CONFIRM_ORDER.value()) || + Objects.equals(flowLogDTO.getPid(), FlowVisitEnum.PAY_SUCCESS.value()); + if (order && Objects.isNull(flowLogDTO.getBid())) { + log.error("用户流量记录-支付:支付单号为空{}", flowLogDTO); + return Boolean.TRUE; + } + return Boolean.FALSE; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/multishop/FormController.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/multishop/FormController.java new file mode 100644 index 0000000..82ed5ab --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/multishop/FormController.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.controller.multishop; + +import com.tmerclub.cloud.api.order.vo.FormExcelParamVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.flow.dto.FormDTO; +import com.tmerclub.cloud.flow.model.Form; +import com.tmerclub.cloud.flow.service.FormService; +import com.tmerclub.cloud.flow.vo.FormExcelVO; +import com.tmerclub.cloud.flow.vo.FormItemVO; +import com.tmerclub.cloud.flow.vo.FormVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 数据表格 + * + * @author TRACK + */ +@RestController("multishopFormController") +@RequestMapping("/m/form") +@Tag(name = "数据表格") +public class FormController { + + @Autowired + private FormService formService; + + + @GetMapping("/page") + @Operation(summary = "获取数据表格列表", description = "分页获取数据表格列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, FormDTO formParam) { + Long shopId = AuthUserContext.get().getTenantId(); + formParam.setShopId(shopId); + PageVO

formPage = formService.page(pageDTO, formParam); + return ServerResponseEntity.success(formPage); + } + + @GetMapping + @Operation(summary = "获取数据表格", description = "根据formId获取数据表格") + public ServerResponseEntity getByFormId(@RequestParam Long formId) { + Form form = formService.getByFormId(formId); + if (Objects.isNull(form)) { + throw new LuckException("当前报表不存在,请刷新页面重试"); + } + return ServerResponseEntity.success(form); + } + + @PostMapping + @Operation(summary = "保存数据表格", description = "保存数据表格") + public ServerResponseEntity save(@Valid @RequestBody FormDTO formDTO) { + Form form = BeanUtil.map(formDTO, Form.class); + form.setShopId(AuthUserContext.get().getTenantId()); + form.setFormId(null); + formService.save(form); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新数据表格", description = "更新数据表格") + public ServerResponseEntity update(@Valid @RequestBody FormDTO formDTO) { + Form form = BeanUtil.map(formDTO, Form.class); + Long shopId = AuthUserContext.get().getTenantId(); + Form byFormId = formService.getByFormId(form.getFormId()); + if (!Objects.equals(byFormId.getShopId(), shopId)) { + throw new LuckException("您没有权限更改该报表的数据"); + } + formService.update(form); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除数据表格", description = "根据数据表格id删除数据表格") + public ServerResponseEntity delete(@RequestParam Long formId) { + formService.deleteById(formId); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_form_item") + @Operation(summary = "获取报表项列表", description = "获取报表项列表") + public ServerResponseEntity> getFormItem() { + List formItemEnumList = formService.getFormItem(2, I18nMessage.getLang()); + return ServerResponseEntity.success(formItemEnumList); + } + + @GetMapping("/form_excel") + @Operation(summary = "根据报表id生成对应的报表统计数据", description = "根据报表id生成对应的报表统计数据") + public void formExcel(@RequestParam("formId") Long formId, HttpServletResponse response) { + Form form = formService.getByFormId(formId); + if (Objects.isNull(form)) { + throw new LuckException("商家报表不存在"); + } + FormExcelParamVO excelParam = formService.getExcelParam(form); + List list = formService.listExcel(form, excelParam); + ExcelUtil.soleExcel(response, list, form.getFormName(), FormExcelVO.MERGE_ROW_INDEX, FormExcelVO.MERGE_COLUMN_INDEX, excelParam.getFormItemNames(), FormExcelVO.class); + } + + @GetMapping("/get_recommend_form_list") + @Operation(summary = "获取全部推荐报表", description = "获取全部推荐报表") + public ServerResponseEntity> getRecommendFormList() { + List formList = formService.getRecommendFormList(); + return ServerResponseEntity.success(formList); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/FlowAnalysisController.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/FlowAnalysisController.java new file mode 100644 index 0000000..3987126 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/FlowAnalysisController.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.controller.platform; + + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.flow.dto.FlowAnalysisDTO; +import com.tmerclub.cloud.flow.service.FlowService; +import com.tmerclub.cloud.flow.service.FlowUserAnalysisService; +import com.tmerclub.cloud.flow.vo.FlowAnalysisDataExcelVO; +import com.tmerclub.cloud.flow.vo.FlowAnalysisVO; +import com.tmerclub.cloud.flow.vo.FlowSourDataExcelVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +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.util.List; + + +/** + * 流量概括 + * + * @author YXF + * @date 2021-06-02 + */ +@RestController +@RequestMapping("/p/flow_analysis") +@Tag(name = "platform-流量概括") +public class FlowAnalysisController { + + @Autowired + private FlowUserAnalysisService flowUserAnalysisService; + + @Autowired + private FlowService flowService; + + + + @GetMapping("/handle") + @Operation(summary = "处理统计数据", description = "处理统计数据") + public ServerResponseEntity handle() { + flowService.statisticalFlowUserLog(); + return ServerResponseEntity.success(); + } + + + /** + * 流量总览 + */ + @GetMapping("/flow_all") + @Operation(summary = "流量总览", description = "流量总览") + public ServerResponseEntity page(FlowAnalysisDTO flowAnalysisDTO) { + //获取时间范围内的统计数据 + FlowAnalysisVO flowAnalysisDto = flowUserAnalysisService.getFlowAnalysisData(flowAnalysisDTO); + return ServerResponseEntity.success(flowAnalysisDto); + } + + /** + * 流量趋势 + */ + @GetMapping("/flow_trend") + @Operation(summary = "流量趋势", description = "流量趋势") + public ServerResponseEntity> flowTrend(FlowAnalysisDTO flowAnalysisDTO) { + // 获取开始和结束时间 + List flowAnalysisDtoList = flowUserAnalysisService.flowTrend(flowAnalysisDTO); + return ServerResponseEntity.success(flowAnalysisDtoList); + } + + /** + * 流量来源构成 + */ + @GetMapping("/flow_sour") + @Operation(summary = "流量来源构成", description = "流量来源构成") + public ServerResponseEntity> flowSour(FlowAnalysisDTO flowAnalysisDTO) { + List flowAnalysisDtoList = flowUserAnalysisService.flowSour(flowAnalysisDTO); + return ServerResponseEntity.success(flowAnalysisDtoList); + } + + @GetMapping("/analysis_data_export") + @Operation(summary = "导出excel", description = "导出流量总览") + public ServerResponseEntity analysisDataExport(HttpServletResponse response, FlowAnalysisDTO flowAnalysisDTO) { + List list = flowUserAnalysisService.listFlowAnalysisDataExcel(flowAnalysisDTO); + ExcelUtil.soleExcel(response, list, FlowAnalysisDataExcelVO.EXCEL_NAME, FlowAnalysisDataExcelVO.MERGE_ROW_INDEX, FlowAnalysisDataExcelVO.MERGE_COLUMN_INDEX, FlowAnalysisDataExcelVO.class); + return ServerResponseEntity.success(); + } + + @GetMapping("/flow_trend_export") + @Operation(summary = "导出excel", description = "导出流量趋势") + public ServerResponseEntity flowTrendExport(HttpServletResponse response, FlowAnalysisDTO flowAnalysisDTO) { + flowUserAnalysisService.exportFlowTrend(response, flowAnalysisDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/flow_sour_export") + @Operation(summary = "导出excel", description = "导出成交转换") + public ServerResponseEntity flowSourExport(HttpServletResponse response, FlowAnalysisDTO flowAnalysisDTO) { + List list = flowUserAnalysisService.listFlowSourDataExcel(flowAnalysisDTO); + ExcelUtil.soleExcel(response, list, FlowSourDataExcelVO.EXCEL_NAME, FlowSourDataExcelVO.MERGE_ROW_INDEX, FlowSourDataExcelVO.MERGE_COLUMN_INDEX, FlowSourDataExcelVO.class); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/ProductAnalyseController.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/ProductAnalyseController.java new file mode 100644 index 0000000..57901bd --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/ProductAnalyseController.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.controller.platform; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.product.dto.ProdEffectDTO; +import com.tmerclub.cloud.api.product.vo.ProdEffectRespVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.flow.service.ProductAnalyseService; +import com.tmerclub.cloud.flow.vo.FlowProdEffectDataExcelVO; +import com.tmerclub.cloud.flow.vo.ShopFlowInfoVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 流量分析—商品分析 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +@RestController("platformProductAnalyseController") +@RequestMapping("/p/product_analyse") +@Tag(name = "platform-商品分析") +public class ProductAnalyseController { + + @Autowired + private ProductAnalyseService productAnalyseService; + + @GetMapping("/get_product_effect") + @Operation(summary = "获取平台端商品洞察数据", description = "获取商品洞察数据") + public ServerResponseEntity> getProductEffect(@Valid PageDTO pageDTO, ProdEffectDTO prodEffectDTO) { + prodEffectDTO.setLang(I18nMessage.getLang()); + return ServerResponseEntity.success(productAnalyseService.getProductEffect(pageDTO,prodEffectDTO)); + } + + @GetMapping("/prod_effect_export") + @Operation(summary = "导出excel", description = "导出商品洞察数据") + public ServerResponseEntity prodEffectExport(HttpServletResponse response, ProdEffectDTO prodEffectDTO) { + prodEffectDTO.setLang(I18nMessage.getLang()); + PageDTO pageDTO = new PageDTO(); + pageDTO.setPageNum(0); + pageDTO.setPageSize(PageDTO.MAX_PAGE_SIZE); + List list = productAnalyseService.listProdEffectExcel(pageDTO, prodEffectDTO); + ExcelUtil.soleExcel(response, list, FlowProdEffectDataExcelVO.EXCEL_NAME, FlowProdEffectDataExcelVO.MERGE_ROW_INDEX, FlowProdEffectDataExcelVO.MERGE_COLUMN_INDEX, FlowProdEffectDataExcelVO.class); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_shop_ranking_by_flow") + @Operation(summary = "获取店铺流量排行榜", description = "获取店铺流量排行榜") + @Parameters({ + @Parameter(name = "dayCount", description = "天数(几天内的排行榜)"), + @Parameter(name = "limit", description = "排行榜条数") + }) + public ServerResponseEntity> listShopRankIngByFlow(@RequestParam(value = "dayCount", defaultValue = "30") Integer dayCount, + @RequestParam(value = "limit", defaultValue = "10") Integer limit) { + List shopFlowInfoVOList = productAnalyseService.listShopRankIngByFlow(DateUtil.endOfDay(DateUtil.date()), dayCount, limit); + return ServerResponseEntity.success(shopFlowInfoVOList); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/UserVisitAnalysisController.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/UserVisitAnalysisController.java new file mode 100644 index 0000000..d5be19e --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/UserVisitAnalysisController.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.controller.platform; + + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.flow.dto.FlowAnalysisDTO; +import com.tmerclub.cloud.flow.service.UserVisitAnalysisService; +import com.tmerclub.cloud.flow.vo.FlowUserAnalysisVO; +import com.tmerclub.cloud.flow.vo.UserAnalysisDataExcelVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +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.util.List; + +/** + * 流量分析—用户访问数据 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +@RestController("platformUserVisitAnalysisController") +@RequestMapping("/p/user_visit_analysis") +@Tag(name = "platform-用户访问统计") +public class UserVisitAnalysisController { + + @Autowired + private UserVisitAnalysisService userVisitAnalysisService; + + @GetMapping("/get_user_analysis_data") + @Operation(summary = "获取访客分析数据", description = "获取访客分析数据") + public ServerResponseEntity getUserAnalysisData(FlowAnalysisDTO flowAnalysisDTO) { + FlowUserAnalysisVO flowUserAnalysisVO = userVisitAnalysisService.getUserAnalysisData(flowAnalysisDTO); + return ServerResponseEntity.success(flowUserAnalysisVO); + } + + @GetMapping("/user_analysis_data_export") + @Operation(summary = "导出excel", description = "导出会员分析数据-地图") + public ServerResponseEntity userAnalysisDataExport(HttpServletResponse response, FlowAnalysisDTO flowAnalysisDTO) { + List list = userVisitAnalysisService.listUserAnalysisDataExcel(flowAnalysisDTO); + ExcelUtil.soleExcel(response, list, UserAnalysisDataExcelVO.EXCEL_NAME, UserAnalysisDataExcelVO.MERGE_ROW_INDEX, UserAnalysisDataExcelVO.MERGE_COLUMN_INDEX, UserAnalysisDataExcelVO.class); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/supplier/ProductAnalyseController.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/supplier/ProductAnalyseController.java new file mode 100644 index 0000000..38f5af7 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/supplier/ProductAnalyseController.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.controller.supplier; + +import com.tmerclub.cloud.api.product.dto.ProdEffectDTO; +import com.tmerclub.cloud.api.product.vo.ProdEffectRespVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.flow.service.ProductAnalyseService; +import com.tmerclub.cloud.flow.vo.ShopFlowInfoVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author chiley + * @date 2022/6/23 16:03 + */ + +@RestController("supplierProductAnalyseController") +@RequestMapping("/s/product_analyse") +@Tag(name = "supplier-商品分析") +public class ProductAnalyseController { + + @Autowired + private ProductAnalyseService productAnalyseService; + + @GetMapping("/get_product_effect") + @Operation(summary = "获取商家端商品洞察数据", description = "获取商品洞察数据") + public ServerResponseEntity> getProductEffect(@Valid PageDTO pageDTO, ProdEffectDTO prodEffectDTO) { + prodEffectDTO.setShopId(AuthUserContext.get().getTenantId()); + prodEffectDTO.setLang(I18nMessage.getLang()); + return ServerResponseEntity.success(productAnalyseService.getProductEffect(pageDTO, prodEffectDTO)); + } + + @GetMapping("/get_shop_product_flow_info") + @Operation(summary = "获取供应商店铺流量信息和近30天的商品访问流量排行榜", description = "获取店铺商品浏览量、新老访客数量和近30天的商品访问流量排行榜") + @Parameters({ + @Parameter(name = "dayCount", description = "天数(几天内的排行榜)"), + @Parameter(name = "limit", description = "排行榜条数")}) + public ServerResponseEntity getShopFlowInfoAndProdRankIng(@RequestParam(value = "dayCount", defaultValue = "30") Integer dayCount, + @RequestParam(value = "limit", defaultValue = "5") Integer limit){ + return ServerResponseEntity.success(productAnalyseService.getSupplierFlowInfoAndProdRankIng(dayCount, limit)); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/FlowAnalysisDTO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/FlowAnalysisDTO.java new file mode 100644 index 0000000..fe58cf7 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/FlowAnalysisDTO.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 流量分析—页面数据统计表 + * + * @author YXF + * @date 2021-06-02 + */ +public class FlowAnalysisDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "时间类型 1:自然日 2:自然周 3:自然月 4:今日实时 5:近七天 6:近30天") + @NotNull(message = "时间类型不能为空") + private Integer dateType; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "开始时间") + private Date startTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "结束时间") + private Date endTime; + /** + * 开始时间(时间戳) + */ + private Long start; + /** + * 类型 1:页面统计数据 2:商品详情页数据 + */ + private Integer pageType; + /** + * 系统类型 0:全部 1:pc 2:h5 3:小程序 4:安卓 5:ios + */ + private Integer systemType; + + public Integer getDateType() { + return dateType; + } + + public void setDateType(Integer dateType) { + this.dateType = dateType; + } + + public Integer getPageType() { + return pageType; + } + + public void setPageType(Integer pageType) { + this.pageType = pageType; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getStart() { + return start; + } + + public void setStart(Long start) { + this.start = start; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + @Override + public String toString() { + return "FlowAnalysisDTO{" + + "dateType=" + dateType + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", start=" + start + + ", pageType=" + pageType + + ", systemType=" + systemType + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/ProductAnalyseDTO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/ProductAnalyseDTO.java new file mode 100644 index 0000000..6dd0b92 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/ProductAnalyseDTO.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流量分析—商品分析DTO + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public class ProductAnalyseDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long productAnalyseId; + + @Schema(description = "创建日期") + private Date createDate; + + @Schema(description = "页面编号") + private Long pageId; + + @Schema(description = "系统类型") + private Integer systemType; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "访问次数") + private Long visis; + + @Schema(description = "点击数") + private Long click; + + @Schema(description = "分享访问次数") + private Long shareVisit; + + @Schema(description = "下单金额") + private Double placeOrderAmount; + + @Schema(description = "支付金额") + private Double payAmount; + + @Schema(description = "加购数量") + private Integer plusShopCart; + + public Long getProductAnalyseId() { + return productAnalyseId; + } + + public void setProductAnalyseId(Long productAnalyseId) { + this.productAnalyseId = productAnalyseId; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public Long getPageId() { + return pageId; + } + + public void setPageId(Long pageId) { + this.pageId = pageId; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getVisis() { + return visis; + } + + public void setVisis(Long visis) { + this.visis = visis; + } + + public Long getClick() { + return click; + } + + public void setClick(Long click) { + this.click = click; + } + + public Long getShareVisit() { + return shareVisit; + } + + public void setShareVisit(Long shareVisit) { + this.shareVisit = shareVisit; + } + + public Double getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Double placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Double getPayAmount() { + return payAmount; + } + + public void setPayAmount(Double payAmount) { + this.payAmount = payAmount; + } + + public Integer getPlusShopCart() { + return plusShopCart; + } + + public void setPlusShopCart(Integer plusShopCart) { + this.plusShopCart = plusShopCart; + } + + @Override + public String toString() { + return "ProductAnalyseDTO{" + + "productAnalyseId=" + productAnalyseId + + ",createDate=" + createDate + + ",pageId=" + pageId + + ",systemType=" + systemType + + ",spuId=" + spuId + + ",shopId=" + shopId + + ",visis=" + visis + + ",click=" + click + + ",shareVisit=" + shareVisit + + ",placeOrderAmount=" + placeOrderAmount + + ",payAmount=" + payAmount + + ",plusShopCart=" + plusShopCart + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/SingleProdTrendDTO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/SingleProdTrendDTO.java new file mode 100644 index 0000000..ea46167 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/SingleProdTrendDTO.java @@ -0,0 +1,75 @@ +package com.tmerclub.cloud.flow.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 单个商品趋势图 + * @author gaozijie + * @date 2023-10-09 + */ +public class SingleProdTrendDTO { + + @Schema(description = "商品id") + private Long spuId; + + @Hidden + @Schema(description = "商家id") + private Long shopId; + + @Schema(description = "起始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + public SingleProdTrendDTO() { + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + @Override + public String toString() { + return "SingleProdTrendDTO{" + + "spuId=" + spuId + + ", shopId=" + shopId + + ", startTime=" + startTime + + ", endTime=" + endTime + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/UserVisitProdAnalysisDTO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/UserVisitProdAnalysisDTO.java new file mode 100644 index 0000000..92ce4aa --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/UserVisitProdAnalysisDTO.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流量分析—用户流量商品数据DTO + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public class UserVisitProdAnalysisDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户访问商品id") + private Long userVisitProdAnalysisId; + + @Schema(description = "用户路径id") + private Long userAnalysisId; + + @Schema(description = "创建日期") + private Date createDate; + + @Schema(description = "商品id") + private Long spuId; + + public Long getUserVisitProdAnalysisId() { + return userVisitProdAnalysisId; + } + + public void setUserVisitProdAnalysisId(Long userVisitProdAnalysisId) { + this.userVisitProdAnalysisId = userVisitProdAnalysisId; + } + + public Long getUserAnalysisId() { + return userAnalysisId; + } + + public void setUserAnalysisId(Long userAnalysisId) { + this.userAnalysisId = userAnalysisId; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + @Override + public String toString() { + return "UserVisitProdAnalysisDTO{" + + "userVisitProdAnalysisId=" + userVisitProdAnalysisId + + ", userAnalysisId=" + userAnalysisId + + ", createDate=" + createDate + + ", spuId=" + spuId + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/mapper/FormMapper.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/mapper/FormMapper.java new file mode 100644 index 0000000..c71fd83 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/mapper/FormMapper.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.mapper; + +import com.tmerclub.cloud.flow.dto.FormDTO; +import com.tmerclub.cloud.flow.model.Form; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 数据表格 + * @author TRACK + */ +public interface FormMapper { + + /** + * 获取数据表格列表 + * @param formParam + * @return 数据表格列表 + */ + List list(@Param("formParam") FormDTO formParam); + + /** + * 根据数据表格id获取数据表格 + * @param formId 数据表格id + * @return 数据表格 + */ + Form getByFormId(@Param("formId") Long formId); + + /** + * 保存数据表格 + * @param form 数据表格 + */ + void save(@Param("form") Form form); + + /** + * 更新数据表格 + * @param form 数据表格 + */ + void update(@Param("form") Form form); + + /** + * 根据数据表格id删除数据表格 + * @param formId + */ + void deleteById(@Param("formId") Long formId); +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/ProductAnalyse.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/ProductAnalyse.java new file mode 100644 index 0000000..1cbc7a4 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/ProductAnalyse.java @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 流量分析—商品分析 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public class ProductAnalyse extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long productAnalyseId; + + /** + * 创建日期 + */ + private Date createDate; + + /** + * 系统类型 + */ + private Integer systemType; + + /** + * 商品id + */ + private Long spuId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 访问次数 + */ + private Long visis; + + /** + * 点击数 + */ + private Long click; + + /** + * 分享访问次数 + */ + private Long shareVisit; + + /** + * 加购数量 + */ + private Integer plusShopCart; + + /** + * 操作信息 + */ + private List productAnalyseUsers; + + public Long getProductAnalyseId() { + return productAnalyseId; + } + + public void setProductAnalyseId(Long productAnalyseId) { + this.productAnalyseId = productAnalyseId; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getVisis() { + return visis; + } + + public void setVisis(Long visis) { + this.visis = visis; + } + + public Long getClick() { + return click; + } + + public void setClick(Long click) { + this.click = click; + } + + public Long getShareVisit() { + return shareVisit; + } + + public void setShareVisit(Long shareVisit) { + this.shareVisit = shareVisit; + } + + + public Integer getPlusShopCart() { + return plusShopCart; + } + + public void setPlusShopCart(Integer plusShopCart) { + this.plusShopCart = plusShopCart; + } + + public List getProductAnalyseUsers() { + return productAnalyseUsers; + } + + public void setProductAnalyseUsers(List productAnalyseUsers) { + this.productAnalyseUsers = productAnalyseUsers; + } + + @Override + public String toString() { + return "ProductAnalyse{" + + "productAnalyseId=" + productAnalyseId + + ",createDate=" + createDate + + ",systemType=" + systemType + + ",spuId=" + spuId + + ",shopId=" + shopId + + ",visis=" + visis + + ",click=" + click + + ",shareVisit=" + shareVisit + + ",plusShopCart=" + plusShopCart + + ",productAnalyseUsers=" + productAnalyseUsers + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/UserAnalysis.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/UserAnalysis.java new file mode 100644 index 0000000..90acff0 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/UserAnalysis.java @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 流量分析—用户数据 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public class UserAnalysis extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long userAnalysisId; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 用户Id(用户未登陆时,为uuid) + */ + private String userId; + + /** + * 省Id + */ + private Long provinceId; + + /** + * 加购数量 + */ + private Integer plusShopCart; + + /** + * 下单金额 + */ + private Long placeOrderAmount; + + /** + * 支付金额 + */ + private Long payAmount; + + /** + * 浏览量 + */ + private Integer visitNums; + + /** + * 点击量 + */ + private Integer clickNums; + + /** + * 0:旧用户, 1:新用户, 2.未登陆用户 + */ + private Integer userType; + + /** + * 系统类型 (1:pc 2:h5 3:小程序 4:安卓 5:ios) + */ + private Integer systemType; + + /** + * 商品id列表 + */ + private List spuIds; + + /** + * 用户浏览的商品信息 + * + * @return + */ + private List userVisitProdAnalyses; + + public Long getUserAnalysisId() { + return userAnalysisId; + } + + public void setUserAnalysisId(Long userAnalysisId) { + this.userAnalysisId = userAnalysisId; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public Integer getPlusShopCart() { + return plusShopCart; + } + + public void setPlusShopCart(Integer plusShopCart) { + this.plusShopCart = plusShopCart; + } + + public Long getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Long placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getVisitNums() { + return visitNums; + } + + public void setVisitNums(Integer visitNums) { + this.visitNums = visitNums; + } + + public Integer getClickNums() { + return clickNums; + } + + public void setClickNums(Integer clickNums) { + this.clickNums = clickNums; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public List getUserVisitProdAnalyses() { + return userVisitProdAnalyses; + } + + public void setUserVisitProdAnalyses(List userVisitProdAnalyses) { + this.userVisitProdAnalyses = userVisitProdAnalyses; + } + + @Override + public String toString() { + return "UserAnalysis{" + + "userAnalysisId=" + userAnalysisId + + ", createDate=" + createDate + + ", userId='" + userId + '\'' + + ", provinceId=" + provinceId + + ", plusShopCart=" + plusShopCart + + ", placeOrderAmount=" + placeOrderAmount + + ", payAmount=" + payAmount + + ", visitNums=" + visitNums + + ", clickNums=" + clickNums + + ", userType=" + userType + + ", systemType=" + systemType + + ", spuIds=" + spuIds + + ", userVisitProdAnalyses=" + userVisitProdAnalyses + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/CustomerAnalysisService.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/CustomerAnalysisService.java new file mode 100644 index 0000000..1a8a574 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/CustomerAnalysisService.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service; + + +import com.tmerclub.cloud.api.order.dto.CustomerRetainedDTO; +import com.tmerclub.cloud.api.order.vo.CustomerRetainVO; +import com.tmerclub.cloud.api.user.dto.MemberReqDTO; +import com.tmerclub.cloud.api.user.vo.MemberContributeRespVO; +import com.tmerclub.cloud.api.user.vo.MemberDealRespVO; +import com.tmerclub.cloud.api.user.vo.MemberTrendRespVO; +import com.tmerclub.cloud.flow.vo.MemberSurveyRespVO; +import com.tmerclub.cloud.flow.vo.MemberTrendExcelVO; + +import java.util.List; + +/** + * @author lgh on 2018/10/26. + */ +public interface CustomerAnalysisService { + + /** + * 会员分析,会员贡献价值分析 + * + * @param param 参数 + * @return 会员分析,会员贡献价值分析 + */ + MemberContributeRespVO getMemberContributeValue(MemberReqDTO param); + + /** + * 会员分析,新老会员成交分析 + * + * @param param 参数 + * @return 新老会员成交分析 + */ + MemberDealRespVO getMemberDeal(MemberReqDTO param); + + /** + * 访问留存数据 + * + * @param customerRetainedDTO 条件参数 + * @return 留存数据 + */ + List getCustomerRetained(CustomerRetainedDTO customerRetainedDTO); + + /** + * 获取会员分析 + * + * @param param + * @return + */ + List getMemberTrend(MemberReqDTO param); + + /** + * 获取要导出的会员分析列表 + * + * @param memberReqDTO + * @return + */ + List listMemberTrend(MemberReqDTO memberReqDTO); + + /** + * 统计会员分析 -> 会员概况的数据 + * @param param + * @return + */ + MemberSurveyRespVO getMemberSurvey(MemberReqDTO param); +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/FormService.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/FormService.java new file mode 100644 index 0000000..4aa2e47 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/FormService.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service; + +import com.tmerclub.cloud.api.order.vo.FormExcelParamVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.flow.dto.FormDTO; +import com.tmerclub.cloud.flow.model.Form; +import com.tmerclub.cloud.flow.vo.FormExcelVO; +import com.tmerclub.cloud.flow.vo.FormItemVO; +import com.tmerclub.cloud.flow.vo.FormVO; + +import java.util.List; + +/** + * 数据表格 + * @author TRACK + */ +public interface FormService { + + /** + * 分页获取数据表格列表 + * @param pageDTO 分页参数 + * @param formParam 搜索参数 + * @return 数据表格列表分页数据 + */ + PageVO page(PageDTO pageDTO, FormDTO formParam); + + /** + * 根据数据表格id获取数据表格 + * @param formId 数据表格id + * @return 数据表格 + */ + Form getByFormId(Long formId); + + /** + * 保存数据表格 + * @param form 数据表格 + */ + void save(Form form); + + /** + * 更新数据表格 + * @param form 数据表格 + */ + void update(Form form); + + /** + * 根据数据表格id删除数据表格 + * @param formId 数据表格id + */ + void deleteById(Long formId); + + /** + * 获取所有的表格选择指标的枚举对象 + * @param type 1:平台端 2:商家端 + * @param lang + * @return + */ + List getFormItem(Integer type, Integer lang); + + /** + * 获取excel导出的列名 + * @param form + * @return + */ + FormExcelParamVO getExcelParam(Form form); + + /** + * 获取导出列表 + * @param form + * @param formExcelParamVO + * @return + */ + List listExcel(Form form, FormExcelParamVO formExcelParamVO); + + /** + * 获取推荐报表列表 + * @return + */ + List getRecommendFormList(); + + /** + * 分页获取推荐报表 + * @param page + * @param form + * @return + */ + PageVO getRecommendFormPage(PageDTO page, FormDTO form); + + /** + * 清除缓存 + */ + void removeCache(); +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/ProductAnalyseService.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/ProductAnalyseService.java new file mode 100644 index 0000000..c660355 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/ProductAnalyseService.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service; + +import cn.hutool.core.date.DateTime; +import com.tmerclub.cloud.api.product.dto.ProdEffectDTO; +import com.tmerclub.cloud.api.product.vo.ProdEffectRespVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.flow.dto.SingleProdTrendDTO; +import com.tmerclub.cloud.flow.vo.FlowProdEffectDataExcelVO; +import com.tmerclub.cloud.flow.vo.ShopFlowInfoVO; +import com.tmerclub.cloud.flow.vo.SingleProdTrendVO; + +import java.util.List; + +/** + * 流量分析—商品分析 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public interface ProductAnalyseService { + + /** + * 获取商品洞察-商品效果分析 + * + * @param pageDTO 分页参数 + * @param prodEffectDTO 筛选参数 + * @return 商品效果分析数据 + */ + PageVO getProductEffect(PageDTO pageDTO, ProdEffectDTO prodEffectDTO); + + /** + * 获取商品洞察导出数据 + * @param pageDTO + * @param prodEffectDTO + * @return + */ + List listProdEffectExcel(PageDTO pageDTO, ProdEffectDTO prodEffectDTO); + + /** + * 获取店铺流量排行榜 + * + * @param endTime 结束时间 + * @param dayCount 天数 + * @param limit 条数 + * @return + */ + List listShopRankIngByFlow(DateTime endTime, Integer dayCount, Integer limit); + + /** + * 删除商品统计数据 + * + * @param spuId 商品id + */ + void deleteSpuDataBySpuId(Long spuId); + + /** + * 获取供应商店铺流量信息和近30天的商品访问流量排行榜 + * @param dayCount 天数 + * @param limit 排行榜条数 + * @return + */ + ShopFlowInfoVO getSupplierFlowInfoAndProdRankIng(Integer dayCount, Integer limit); + + /** + * 获取单个商品趋势图 + * @param singleProdTrendDTO 筛选参数 + * @return 单个商品趋势图 + */ + List getSingleProdTend(SingleProdTrendDTO singleProdTrendDTO); +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/SystemUserAnalyseMongoService.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/SystemUserAnalyseMongoService.java new file mode 100644 index 0000000..27335b1 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/SystemUserAnalyseMongoService.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service; + +import java.util.Date; + +/** + * 流量分析—页面数据统计表 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public interface SystemUserAnalyseMongoService { + + /** + * 统计当天各端的流量数据 + * + * 统计数据存储表:flow_system_user + * 数据统计来源表:flow_user_log + * @param dateType + * @param beginDate + * @param endDate + * @return 统计的数据 + */ + void statisticsAndSaveSystemUserOfDay(Integer dateType, Date beginDate, Date endDate); +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/UserAnalyseMongoService.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/UserAnalyseMongoService.java new file mode 100644 index 0000000..53c5807 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/UserAnalyseMongoService.java @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service; + + +import com.tmerclub.cloud.api.user.vo.MemberContributeValueVO; +import com.tmerclub.cloud.api.user.vo.MemberTrendRespVO; +import com.tmerclub.cloud.flow.bo.FlowRegionalBO; +import com.tmerclub.cloud.flow.bo.FlowUserBO; +import com.tmerclub.cloud.flow.bo.FlowUserFootprintBO; +import com.tmerclub.cloud.flow.bo.FlowUserRetainBO; +import org.springframework.data.mongodb.core.aggregation.AggregationOperation; + +import java.util.Date; +import java.util.List; + +/** + * 流量分析—页面数据统计表 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public interface UserAnalyseMongoService { + + /** + * 统计当天用户操作记录 + * + * 统计数据存储表:flow_user_operation + * 数据统计来源表:flow_user_log + * @param beginDate + * @param endDate + */ + void statisticsAndSaveUserOfDay(Date beginDate, Date endDate); + + /** + * 插入访问深度统计 + * + * 统计数据存储表:flow_user_footprint + * 数据统计来源表:flow_user_operation + * @param dateType + * @param beginDate + * @param endDate + */ + void statisticsAndSaveUserFootprintOfDay(int dateType, Date beginDate, Date endDate); + + /** + * 插入访问深度统计 + * + * 统计数据存储表:flow_user_footprint + * 数据统计来源表:flow_user_operation + * @param dateType + * @param beginDate + * @param endDate + */ + void statisticsAndSaveUserFootprintOfTime(int dateType, Date beginDate, Date endDate); + + /** + * 获取访问深度统计列表 + * + * 数据统计来源表:flow_user_operation + * @param dateType + * @param beginDate + * @param endDate + * @return + */ + List listUserFootprintOfTime(int dateType, Date beginDate, Date endDate); + + /** + * 插入访问深度统计 + * + * 统计数据存储表:flow_user_footprint + * 数据统计来源表:flow_user_operation + * @param dateType + * @param beginDate + * @param endDate + * @param aggregationOperationList + * @return + */ + List statisticsUserFootprintOfTime(int dateType, Date beginDate, Date endDate, List aggregationOperationList); + + /** + * 插入访问地域统计 + * + * 统计数据存储表:flow_regional + * 数据统计来源表:flow_user_operation、flow_spu_user + * @param dateType + * @param beginDate + * @param endDate + */ + void statisticsAndSaveRegionalOfTime(int dateType, Date beginDate, Date endDate); + + /** + * 获取访问地域统计列表 + * + * 数据统计来源表:flow_user_operation + * @param dateType + * @param beginDate + * @param endDate + * @return + */ + List listFlowRegional(Date beginDate, Date endDate, int dateType); + + /** + * 插入访问地域统计 + * + * 统计数据存储表:flow_regional + * 数据统计来源表:flow_user_operation、flow_spu_user + * @param beginDate + * @param endDate + * @return + */ + List statisticsRegionalOfTime(Date beginDate, Date endDate); + + /** + * 统计会员概括 + * + * 统计数据存储表:flow_user + * 数据统计来源表:flow_user_operation + * @param dateType + * @param beginTime + * @param endTime + * @return + */ + List statisticsUserOfTime(int dateType, Date beginTime, Date endTime); + + /** + * 插入会员概括统计 + * + * 统计数据存储表:flow_user + * 数据统计来源表:flow_user_operation + * @param dateType + * @param beginTime + * @param endTime + */ + void statisticsAndSaveUserOfTime(int dateType, Date beginTime, Date endTime); + + /** + * 获取用户访问深度列表 + * @param startTime + * @param endTime + * @param timeType + * @return + */ + List listUserFootprint(Date startTime, Date endTime, Integer timeType); + + /** + * 实时统计会员数量列表 + * @param startTime + * @param endTime + * @param dateType + * @return + */ + List statisticsRealMemberTrend(Date startTime, Date endTime, Integer dateType); + + /** + * 获取会员数量列表 + * @param startTime + * @param endTime + * @return + */ + List listUserNumAndTypeByTime(Date startTime, Date endTime); + + /** + * 获取指定时间的会员概况 + * @param startTime + * @param endTime + * @param dateType + * @param memberType + * @return + */ + FlowUserBO getFlowUserByTimeAndUserType(Date startTime, Date endTime, Integer dateType, Integer memberType); + + /** + * 获取会员概况列表 + * @param startTime + * @param endTime + * @param dateType + * @param memberType + * @return + */ + List listFlowUserByTimeAndUserType(Date startTime, Date endTime, Integer dateType, Integer memberType); + + /** + * 实时会员贡献价值分析 + * + * 接口用途: 平台端 -> 会员分析 -> 会员贡献价值分析 + * @param startTime + * @param endTime + * @return + */ + List statisticsRealMemberContributeValue(Date startTime, Date endTime); + + /** + * 获取用户统计数据的最新时间 + * @return + */ + Date getLatestTime(); + + /** + * 统计并保存客户留存信息 + */ + void statisticsAndSaveUserRetained(); + + /** + * 统计客户留存信息 + * @param startTime + * @param endTime + * @return + */ + List statisticsUserRetained(Date startTime, Date endTime); + + /** + * 统计当月客户留存信息 + */ + void statisticsAndSaveUserRetainedOfCurrent(); + + /** + * 获取客户留存信息 + * @param startTime + * @param endTime + * @param retainType + * @return + */ + List listFlowUserRetain(Date startTime, Date endTime, Integer retainType); +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/CustomerAnalysisServiceImpl.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/CustomerAnalysisServiceImpl.java new file mode 100644 index 0000000..8f04274 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/CustomerAnalysisServiceImpl.java @@ -0,0 +1,648 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service.impl; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.coupon.feign.CouponFeignClient; +import com.tmerclub.cloud.api.order.dto.CustomerRetainedDTO; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.order.vo.CustomerRetainVO; +import com.tmerclub.cloud.api.user.bo.UserOrderStatisticBO; +import com.tmerclub.cloud.api.user.bo.UserOrderStatisticListBO; +import com.tmerclub.cloud.api.user.dto.MemberReqDTO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.*; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.FlowCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.util.*; +import com.tmerclub.cloud.flow.bo.FlowUserBO; +import com.tmerclub.cloud.flow.bo.FlowUserRetainBO; +import com.tmerclub.cloud.flow.constant.FlowDateTypeEnum; +import com.tmerclub.cloud.flow.service.CustomerAnalysisService; +import com.tmerclub.cloud.flow.service.UserAnalyseMongoService; +import com.tmerclub.cloud.flow.util.FlowUtil; +import com.tmerclub.cloud.flow.vo.MemberSurveyRespVO; +import com.tmerclub.cloud.flow.vo.MemberTrendExcelVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author lgh on 2018/10/26. + */ +@Service +public class CustomerAnalysisServiceImpl implements CustomerAnalysisService { + @DubboReference + private UserFeignClient userFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + @DubboReference + private CouponFeignClient couponFeignClient; + @Autowired + private UserAnalyseMongoService userAnalyseMongoService; + + @Override + public MemberDealRespVO getMemberDeal(MemberReqDTO param) { + FlowUtil.handleTime(param); + MemberDealRespVO respParam = new MemberDealRespVO(); + Date startTime = param.getStartTime(); + Date beforeYear = DateUtils.getBeforeYear(startTime, -2); + param.setBeforeYear(beforeYear); + param.setDateTime(null); + param.setDayStartTime(startTime); + // 获取会员成交数据 + UserOrderStatisticListBO data = orderFeignClient.getMemberPayData(param).getData(); + List oldUserOrderStatistic = data.getOldUserOrderStatisticList(); + List newUserOrderStatistic = data.getNewUserOrderStatisticList(); + // 支付客户数 + MemberDealVO allMember = new MemberDealVO(); + MemberDealVO oldMember = handleMemberPayInfo(oldUserOrderStatistic); + MemberDealVO newMember = handleMemberPayInfo(newUserOrderStatistic); + + allMember.setPayMemberNum(oldMember.getPayMemberNum() + newMember.getPayMemberNum()); + // 成交会员占比 + Integer payMemberNum = allMember.getPayMemberNum(); + allMember.setPayMemberNumRate(1.0); + newMember.setPayMemberNumRate(AnalysisUtil.divAverage(newMember.getPayMemberNum(), payMemberNum, 4)); + oldMember.setPayMemberNumRate(AnalysisUtil.divAverage(oldMember.getPayMemberNum(), payMemberNum, 4)); + // 付款金额,占比 + allMember.setPayAmount(Arith.add(oldMember.getPayAmount(), newMember.getPayAmount())); + allMember.setPayAmountRate(1.0); + newMember.setPayAmountRate(AnalysisUtil.divAverage(newMember.getPayAmount(), allMember.getPayAmount(), 4)); + oldMember.setPayAmountRate(Arith.sub(allMember.getPayAmountRate(), newMember.getPayAmountRate())); + // 客单价 + double priceMember = (double) Math.round(divAverage(Arith.mul(allMember.getPayAmount() , 100), allMember.getPayMemberNum(), 2)); + allMember.setPricePerMember(Arith.div(priceMember,100)); + // 支付订单数 + allMember.setPayOrderNum(newMember.getPayOrderNum() + oldMember.getPayOrderNum()); + + respParam.setAllMember(allMember); + respParam.setNewMember(newMember); + respParam.setOldMember(oldMember); + + respParam.setTrendParam(handleMamberDealList(data, param)); + return respParam; + } + + @Override + public List getCustomerRetained(CustomerRetainedDTO customerRetainedDTO) { + // 访问留存 + // 访问时间,是每一个月的时间 (例如: 2021-05, 2021-06) + // 新访问客户数:之前没有访问过,第一次登录访问后,下个月再次登录访问的用户。(包含未注册登录的访客) + // 因为要计算用户第一次的访问时间所以一定有全表扫描的 + // 第一月留存:新访问的客户,在第一次访问后的下一个月,是否有再次访问成功的人数 + // eg:假设2021年1月份,A B C D 四位客户登录访问;2月份 A B 访问;3月份 D访问,4月份B C D有访问。求 1月份客户在后续2,3,4月份的留存率分别是多少? + // 根据前面的算法公式,则: + // 2月份的留存数是 2,留存率 = 2 /4 = 50% + // 3月份的留存数是 1,留存率 = 1/4 = 25% + // 4月份的留存数是 3,留存率 = 3/4 = 75% + Date endTime = DateUtil.beginOfMonth(DateUtil.offsetMonth(customerRetainedDTO.getEndTime(), 1)); + + List flowUserRetainList = userAnalyseMongoService.listFlowUserRetain(customerRetainedDTO.getStartTime(), endTime, customerRetainedDTO.getRetainType()); + + Map map = flowUserRetainList.stream() + .collect(Collectors.toMap(flowUserRetainBO -> flowUserRetainBO.getCreateTime().getTime(), f -> f)); + + List customerRetainList = new ArrayList<>(); + Date startTime = customerRetainedDTO.getStartTime(); + while (startTime.getTime() < endTime.getTime()) { + FlowUserRetainBO flowUserRetainBO = map.get(startTime.getTime()); + if (Objects.isNull(flowUserRetainBO)) { + flowUserRetainBO = new FlowUserRetainBO(); + } + CustomerRetainVO customerRetainVO = BeanUtil.map(flowUserRetainBO, CustomerRetainVO.class); + customerRetainVO.setCurrentMonth(DateUtil.format(startTime, "yyyy-MM")); + customerRetainVO.setFirstMonthRemainRate(AnalysisUtil.calculatePercentage(customerRetainVO.getFirstMonthRemain(), customerRetainVO.getNewCustomers())); + customerRetainVO.setSecondMonthRemainRate(AnalysisUtil.calculatePercentage(customerRetainVO.getSecondMonthRemain(), customerRetainVO.getNewCustomers())); + customerRetainVO.setThirdMonthRemainRate(AnalysisUtil.calculatePercentage(customerRetainVO.getThirdMonthRemain(), customerRetainVO.getNewCustomers())); + customerRetainVO.setFourthMonthRemainRate(AnalysisUtil.calculatePercentage(customerRetainVO.getFourthMonthRemain(), customerRetainVO.getNewCustomers())); + customerRetainVO.setFifthMonthRemainRate(AnalysisUtil.calculatePercentage(customerRetainVO.getFifthMonthRemain(), customerRetainVO.getNewCustomers())); + customerRetainVO.setSixthMonthRemainRate(AnalysisUtil.calculatePercentage(customerRetainVO.getSixthMonthRemain(), customerRetainVO.getNewCustomers())); + customerRetainList.add(customerRetainVO); + startTime = DateUtil.beginOfMonth(DateUtil.offsetMonth(startTime, 1)); + } + return customerRetainList; + } + @Override + public List getMemberTrend(MemberReqDTO param) { + // 初始化时间 + FlowUtil.handleTime(param); + // 查询免费、付费会员的数量数据 + List memberTrendRespList; + // 今日实时 + if (Objects.equals(FlowDateTypeEnum.REAL_TIME.value(), param.getDateType())) { + // 从redis中获取 + memberTrendRespList = userAnalyseMongoService.statisticsRealMemberTrend(param.getStartTime(), param.getEndTime(), param.getDateType()); + } + // 日、周、月、近7天、近30天 + else { + memberTrendRespList = userAnalyseMongoService.listUserNumAndTypeByTime(param.getStartTime(), param.getEndTime()); + } + + Map memberTrendRespMap = memberTrendRespList.stream().collect(Collectors.toMap(MemberTrendRespVO::getCurrentDay, m -> m)); + + memberTrendRespList.clear(); + Date startTime = param.getStartTime(); + long endTime = param.getEndTime().getTime(); + + while (startTime.getTime() < endTime) { + MemberTrendRespVO memberTrendRespVO = memberTrendRespMap.get(String.valueOf(startTime.getTime())); + if (Objects.isNull(memberTrendRespVO)) { + memberTrendRespVO = new MemberTrendRespVO(); + } + if (Objects.isNull(memberTrendRespVO.getMemberNum())) { + memberTrendRespVO.setMemberNum(0); + } + if (Objects.isNull(memberTrendRespVO.getVipMemberNum())) { + memberTrendRespVO.setVipMemberNum(0); + } + memberTrendRespVO.setCurrentDay(DateUtils.dateToStrYmd(startTime)); +// // 筛选时间类的每一天注册的会员数数据,不是每一天平台的总会员数 +// int total = memberTrendRespVO.getMemberNum() + memberTrendRespVO.getVipMemberNum(); + if (Objects.equals(param.getMemberType(), 1)) { + } else { + } + startTime = DateUtil.offsetDay(startTime, 1); + memberTrendRespList.add(memberTrendRespVO); + } + return memberTrendRespList; + } + + @Override + public List listMemberTrend(MemberReqDTO memberReqDTO) { + memberReqDTO.setMemberType(1); + List ordinaryMember = this.getMemberTrend(memberReqDTO); + memberReqDTO.setMemberType(2); + List payMember = this.getMemberTrend(memberReqDTO); + Map payMemberMap = payMember.stream().collect(Collectors.toMap(MemberTrendRespVO::getCurrentDay, MemberTrendRespVO::getMemberNum)); + List resList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (MemberTrendRespVO memberTrendRespVO : ordinaryMember) { + MemberTrendExcelVO memberTrendExcelVO = new MemberTrendExcelVO(); + Date date = DateUtil.parse(memberTrendRespVO.getCurrentDay(), "yyyyMMdd"); + memberTrendExcelVO.setDate(DateUtils.dateToStrYmd(date)); + memberTrendExcelVO.setNormal(Objects.isNull(memberTrendRespVO.getMemberNum()) ? 0 : memberTrendRespVO.getMemberNum()); + memberTrendExcelVO.setPay(payMemberMap.get(memberTrendRespVO.getCurrentDay())); + resList.add(memberTrendExcelVO); + } + return resList; + } + + @Override + public MemberSurveyRespVO getMemberSurvey(MemberReqDTO param) { + FlowUtil.handleTime(param); + // 时间类型 + FlowUserBO flowUserBO = null; + // 当前数据 + FlowDateTypeEnum flowDateTypeEnum = FlowDateTypeEnum.instance(param.getDateType()); + int offset = flowDateTypeEnum.getNum(); + if (FlowDateTypeEnum.weekOrMonth(param.getDateType())) { + offset = 11; + } else if (offset > 1){ + offset = offset - 1; + } + Date beginTime = FlowUtil.previousTime(param.getStartTime(), param.getDateType(), offset); + MemberOverviewVO memberOverviewVO = null; + // 实时统计 + if (Objects.equals(FlowDateTypeEnum.REAL_TIME.value(), param.getDateType())) { + // 累计会员数、新增会员数 + memberOverviewVO = this.realMemberSurvey(param); + List memberSurveyResp = userAnalyseMongoService.listFlowUserByTimeAndUserType(beginTime, param.getStartTime(), param.getDateType(), param.getMemberType()); + if(CollUtil.isNotEmpty(memberSurveyResp)){ + flowUserBO = memberSurveyResp.get(0); + } + } + // 日、周、月 + else if (FlowDateTypeEnum.dayOrWeekOrMonth(param.getDateType())) { + List flowUserList = userAnalyseMongoService.listFlowUserByTimeAndUserType(param.getStartTime(), param.getEndTime(), param.getDateType(), param.getMemberType()); + if (CollUtil.isNotEmpty(flowUserList)) { + memberOverviewVO = this.toMemberSurveyRespVO(flowUserList).get(0); + } + List memberSurveyResp = userAnalyseMongoService.listFlowUserByTimeAndUserType(beginTime, param.getStartTime(), param.getDateType(), param.getMemberType()); + if(CollUtil.isNotEmpty(memberSurveyResp)){ + flowUserBO = memberSurveyResp.get(0); + } + } + // 近7天、近30天 + else { + // 直接查询新旧数据即可 + memberOverviewVO = this.toMemberSurveyRespVO(userAnalyseMongoService.getFlowUserByTimeAndUserType(param.getStartTime(), param.getEndTime(), param.getDateType(), param.getMemberType())); + // 缓存中查询上一轮统计的数据,缓存时间为24小时,key中有时间不会查到前一天的统计数据 + String format = DateUtil.format(param.getStartTime(), DatePattern.NORM_DATE_PATTERN); + String key = FlowCacheNames.MEMBER_SURVEY_NEARLY_TIME + CacheNames.UNION + format + param.getDateType(); + List memberSurveyResp = RedisUtil.get(key); + if (Objects.isNull(memberSurveyResp)) { + memberSurveyResp = userAnalyseMongoService.statisticsUserOfTime(param.getDateType(), param.getStartTime(), param.getEndTime()); + RedisUtil.set(key, memberSurveyResp, Constant.DAY_SECOND); + } + // 从列表总获取对应的数据类型 + if(CollUtil.isNotEmpty(memberSurveyResp)){ + for (FlowUserBO userBO : memberSurveyResp) { + if (Objects.equals(userBO.getType(), param.getMemberType())) { + flowUserBO = userBO; + break; + } + } + } + } + + if (Objects.isNull(memberOverviewVO)) { + memberOverviewVO = new MemberOverviewVO(); + } + + MemberOverviewVO oldMemberOverviewVO; + if (Objects.isNull(flowUserBO)) { + oldMemberOverviewVO = new MemberOverviewVO(); + } else { + oldMemberOverviewVO = this.toMemberSurveyRespVO(flowUserBO); + } + + memberOverviewVO.setCreateTime(param.getStartTime()); + + this.getGeneralizeRate(memberOverviewVO, oldMemberOverviewVO); + + MemberSurveyRespVO memberSurveyRespVO = new MemberSurveyRespVO(); + + memberSurveyRespVO.setMemberOverviewModel(memberOverviewVO); + + // 获取列表 + this.setMemberOverviewList(param, memberOverviewVO, memberSurveyRespVO); + + return memberSurveyRespVO; + } + + @Override + public MemberContributeRespVO getMemberContributeValue(MemberReqDTO param) { + FlowUtil.handleTime(param); + // 当前筛选条件下的所有订单信息 + MemberContributeRespVO memberContributeRespVO = new MemberContributeRespVO(); + param.setDateTime(null); + + // 累计会员数 累计会员占比 成交会员数 支付订单数 支付金额 + Map memberContributeValueMap = new HashMap<>(4); + + this.statisticsMemberContributeValue(param, memberContributeValueMap); + + // 设置普通会员和付费会员数据的订单相关数据 + MemberContributeValueVO publicMember; + MemberContributeValueVO paidMember; + publicMember = memberContributeValueMap.get(1); + if (Objects.isNull(publicMember)) { + publicMember = new MemberContributeValueVO(); + } + paidMember = memberContributeValueMap.get(2); + if (Objects.isNull(paidMember)) { + paidMember = new MemberContributeValueVO(); + } + // 占比信息 + publicMember.setTotalMemberRate(divAverage(publicMember.getTotalMember(),publicMember.getTotalMember()+paidMember.getTotalMember())); + paidMember.setTotalMemberRate(Arith.sub(1,publicMember.getTotalMemberRate())); + publicMember.setPayMemberNumRate(divAverage(publicMember.getPayMemberNum(),publicMember.getPayMemberNum()+ paidMember.getPayMemberNum())); + paidMember.setPayMemberNumRate(Arith.sub(1,publicMember.getPayMemberNumRate())); + publicMember.setPayAmountRate(divAverage(publicMember.getPayAmount(),Arith.add(publicMember.getPayAmount(),paidMember.getPayAmount()))); + paidMember.setPayAmountRate(Arith.sub(1,publicMember.getPayAmountRate())); + publicMember.setPricePerMember(divAverage(publicMember.getPayAmount(),publicMember.getPayMemberNum(), 2)); + paidMember.setPricePerMember(divAverage(paidMember.getPayAmount(),paidMember.getPayMemberNum(), 2)); + publicMember.setFrequencyOfConsume(divAverage(publicMember.getPayOrderNum().doubleValue(),publicMember.getPayMemberNum(), 2)); + paidMember.setPricePerMember(divAverage(paidMember.getPayOrderNum().doubleValue(),paidMember.getPayMemberNum(), 2)); + + memberContributeRespVO.setPublicMember(publicMember); + memberContributeRespVO.setPaidMember(paidMember); + return memberContributeRespVO; + } + + private List handleMamberDealList(UserOrderStatisticListBO data, MemberReqDTO param) { + List trend = new ArrayList<>(Constant.INITIAL_CAPACITY); + Date startTime = param.getStartTime(); + long endTime = param.getEndTime().getTime(); + Map newUserMap; + Map oldUserMap; + if (CollUtil.isEmpty(data.getNewUserOrderStatisticList())) { + newUserMap = new HashMap<>(0); + } else { + newUserMap = data.getNewUserOrderStatisticList().stream().collect(Collectors.toMap(UserOrderStatisticBO::getTimeData, u -> u)); + } + if (CollUtil.isEmpty(data.getOldUserOrderStatisticList())) { + oldUserMap = new HashMap<>(0); + } else { + oldUserMap = data.getOldUserOrderStatisticList().stream().collect(Collectors.toMap(UserOrderStatisticBO::getTimeData, u -> u)); + } + + + while (startTime.getTime() < endTime) { + String timeKey = DateUtils.dateToStrYmd(startTime); + MemberDealTreadVO res = new MemberDealTreadVO(); + // 获取会员成交数据 + MemberDealVO oldMemberItem = getMemberPayInfo(oldUserMap.get(timeKey)); + MemberDealVO newMemberItem = getMemberPayInfo(newUserMap.get(timeKey)); + res.setCurrentDay(DateUtils.dateToNumber(startTime)); + // 支付会员数 + res.setOldPayMemberNum(oldMemberItem.getPayMemberNum()); + res.setNewPayMemberNum(newMemberItem.getPayMemberNum()); + // 支付订单数 + res.setNewPayOrderNum(newMemberItem.getPayOrderNum()); + res.setOldPayOrderNum(oldMemberItem.getPayOrderNum()); + // 支付金额 + res.setOldPayAmount(oldMemberItem.getPayAmount()); + res.setNewPayAmount(newMemberItem.getPayAmount()); + // 客单价 + res.setOldPricePerMember(AnalysisUtil.divAverage(res.getOldPayAmount(), res.getOldPayMemberNum(), 2)); + res.setNewPricePerMember(AnalysisUtil.divAverage(res.getNewPayAmount(), res.getNewPayMemberNum(), 2)); + trend.add(res); + startTime = DateUtil.offsetDay(startTime, 1); + } + return trend; + } + + private void statisticsMemberContributeValue(MemberReqDTO param, Map memberContributeValueMap) { + // 今日实时 order、 user 中统计 + if (Objects.equals(FlowDateTypeEnum.REAL_TIME.value(), param.getDateType())) { + List memberContributeValueList = userAnalyseMongoService.statisticsRealMemberContributeValue( + param.getStartTime(), + param.getEndTime() + ); + + MemberCountVO memberCountVO = userFeignClient.statisticsUserNum(new MemberReqDTO(param.getStartTime(), param.getEndTime())); + + + // 累计会员数 + Map map = memberContributeValueList.stream().collect(Collectors.toMap(MemberContributeValueVO::getUserType, f -> f)); + for (int i = 1; i < Constant.THREE; i++) { + MemberContributeValueVO memberContributeValueVO = map.get(i); + if (Objects.isNull(memberContributeValueVO)) { + memberContributeValueVO = new MemberContributeValueVO(); + } + if (i == 1) { + // 普通会员数 = 总会员数 - 付费会员数 + memberContributeValueVO.setTotalMember(memberCountVO.getTotalMember() - memberCountVO.getPaidMember()); + } else { + memberContributeValueVO.setTotalMember(memberCountVO.getPaidMember()); + } + memberContributeValueMap.put(i, memberContributeValueVO); + } + } + + // 日、周、月、近7天、近30天 flow_user中查询 + else { + List flowUserList = userAnalyseMongoService.listFlowUserByTimeAndUserType( + param.getStartTime(), + param.getEndTime(), + param.getDateType(), + null); + + for (FlowUserBO flowUserBO : flowUserList) { + if (Objects.isNull(flowUserBO.getType()) || flowUserBO.getType() < 1 || flowUserBO.getType() > 2) { + continue; + } + MemberContributeValueVO memberContributeValueVO = new MemberContributeValueVO(); + memberContributeValueVO.setTotalMember(flowUserBO.getUserNum()); + memberContributeValueVO.setPayMemberNum(flowUserBO.getPayUser()); + memberContributeValueVO.setPayOrderNum(flowUserBO.getPayOrder()); + memberContributeValueVO.setPayAmount(handleLong(flowUserBO.getPayAmount())); + memberContributeValueMap.put(flowUserBO.getType(), memberContributeValueVO); + } + } + } + + private void setMemberOverviewList(MemberReqDTO param, MemberOverviewVO memberOverviewVO, MemberSurveyRespVO memberSurveyRespVO) { + // 查询每天的统计数据 + List flowUserList = userAnalyseMongoService.listFlowUserByTimeAndUserType(param.getStartTime(), param.getEndTime(), FlowDateTypeEnum.DAY.value(), param.getMemberType()); + List memberOverviewList = this.toMemberSurveyRespVO(flowUserList); + Map map = memberOverviewList.stream().collect(Collectors.toMap(memberOverview -> memberOverview.getCreateTime().getTime(), k -> k)); + // 今日实时要加上当天统计的数据 + if (Objects.equals(FlowDateTypeEnum.REAL_TIME.value(), param.getDateType())) { + map.put(memberOverviewVO.getCreateTime().getTime(), memberOverviewVO); + } + memberOverviewList.clear(); + + // 根据时间顺序,处理查询的每日统计数据 + Date currentTime = param.getStartTime(); + long endTime = param.getEndTime().getTime(); + while (currentTime.getTime() < endTime) { + MemberOverviewVO memberOverview = map.get(currentTime.getTime()); + if (Objects.isNull(memberOverview)) { + memberOverview = new MemberOverviewVO(); + memberOverview.setCreateTime(currentTime); + } + memberOverview.setCurrentDay(DateUtils.dateToNumber(currentTime)); + memberOverviewList.add(memberOverview); + // 增加一天,继续下一轮循环 + currentTime = FlowUtil.increaseByDateType(currentTime, param.getDateType()); + } + + memberSurveyRespVO.setMemberOverviewModelList(memberOverviewList); + } + + private void getGeneralizeRate(MemberOverviewVO memberOverviewVO, MemberOverviewVO oldMemberOverviewVO){ + memberOverviewVO.setMemberSingleAmount(Arith.div(memberOverviewVO.getMemberPayAmount(),memberOverviewVO.getPayMember(),2)); + oldMemberOverviewVO.setMemberSingleAmount(Arith.div(oldMemberOverviewVO.getMemberPayAmount(),oldMemberOverviewVO.getPayMember(),2)); + memberOverviewVO.setTotalMemberRate(setRate(memberOverviewVO.getTotalMember().doubleValue(),oldMemberOverviewVO.getTotalMember().doubleValue())); + memberOverviewVO.setNewMemberRate(setRate(memberOverviewVO.getNewMember().doubleValue(),oldMemberOverviewVO.getNewMember().doubleValue())); + memberOverviewVO.setCouponMemberRate(setRate(memberOverviewVO.getCouponMember().doubleValue(),oldMemberOverviewVO.getCouponMember().doubleValue())); + memberOverviewVO.setPayMemberRate(setRate(memberOverviewVO.getPayMember().doubleValue(),oldMemberOverviewVO.getPayMember().doubleValue())); + memberOverviewVO.setMemberPayAmountRate(setRate(memberOverviewVO.getMemberPayAmount(),oldMemberOverviewVO.getMemberPayAmount())); + memberOverviewVO.setMemberPayOrderRate(setRate(memberOverviewVO.getMemberPayOrder().doubleValue(),oldMemberOverviewVO.getMemberPayOrder().doubleValue())); + memberOverviewVO.setMemberSingleAmountRate(setRate(memberOverviewVO.getMemberSingleAmount(),oldMemberOverviewVO.getMemberSingleAmount())); + + } + + private MemberOverviewVO toMemberSurveyRespVO(FlowUserBO flowUser) { + return this.toMemberSurveyRespVO(Collections.singletonList(flowUser)).get(0); + } + + private List toMemberSurveyRespVO(List flowUserList) { + List memberOverviewVOList = new ArrayList<>(); + if (CollUtil.isEmpty(flowUserList)) { + return memberOverviewVOList; + } + + + for (FlowUserBO flowUserBO : flowUserList) { + MemberOverviewVO memberOverviewVO = new MemberOverviewVO(); + memberOverviewVO.setCreateTime(flowUserBO.getCreateTime()); + // 累积会员数 + if (Objects.nonNull(flowUserBO.getUserNum())) { + memberOverviewVO.setTotalMember(flowUserBO.getUserNum()); + } + // 新增会员数 + if (Objects.nonNull(flowUserBO.getNewUserNum())) { + memberOverviewVO.setNewMember(flowUserBO.getNewUserNum()); + } + // 支付会员数 + if (Objects.nonNull(flowUserBO.getPayUser())) { + memberOverviewVO.setPayMember(flowUserBO.getPayUser()); + } + // 领券会员数 + if (Objects.nonNull(flowUserBO.getReceiveCouponUser())) { + memberOverviewVO.setCouponMember(flowUserBO.getReceiveCouponUser()); + } + // 会员支付金额 + if (Objects.nonNull(flowUserBO.getPayAmount())) { + memberOverviewVO.setMemberPayAmount(handleLong(flowUserBO.getPayAmount())); + } + // 会员支付订单数 + if (Objects.nonNull(flowUserBO.getPayOrder())) { + memberOverviewVO.setMemberPayOrder(flowUserBO.getPayOrder()); + } + memberOverviewVOList.add(memberOverviewVO); + } + return memberOverviewVOList; + } + + private MemberOverviewVO realMemberSurvey(MemberReqDTO param) { + MemberOverviewVO memberOverviewVO = statisticsMemberOrderInfo(param); + // 领券会员数 + // 获取领取的所有优惠券的用户和优惠券数量集合 + List receiverUserIds = couponFeignClient.countMemberCouponByParam(param.getShopId(), param.getStartTime(), param.getEndTime()).getData(); + if(CollectionUtil.isEmpty(receiverUserIds)){ + // 领券会员数 + memberOverviewVO.setCouponMember(0); + }else{ + // 如果不为0则筛选一下当前满足条件的用户 + if (!Objects.equals(param.getMemberType(), 0)) { + // 筛选交集的用户 + param.setUserIds(receiverUserIds); + receiverUserIds = userFeignClient.getMeetConditionsUserIds(param).getData(); + } + // 领券会员数 + memberOverviewVO.setCouponMember(CollectionUtil.isEmpty(receiverUserIds) ? 0 : receiverUserIds.size()); + } + return memberOverviewVO; + } + + private MemberOverviewVO statisticsMemberOrderInfo(MemberReqDTO param) { + // 查询当前的用户数量,不需要传开始时间 + MemberCountVO memberCountVO = userFeignClient.statisticsUserNum(param); + + MemberOverviewVO memberOverviewVO = new MemberOverviewVO(); + + // 累积会员数、新增会员数 + this.setMenberNum(param.getMemberType(), memberCountVO, memberOverviewVO); + + // 支付会员数、会员支付金额、会员支付订单数、会员客单价 + UserOrderStatisticBO userOrderStatisticBO = orderFeignClient.getPaidMemberByParam(param).getData(); + if(Objects.isNull(userOrderStatisticBO)){ + // 会员支付金额 + memberOverviewVO.setMemberPayAmount(0.00); + // 会员支付订单数 + memberOverviewVO.setMemberPayOrder(0); + // 会员客单价 + memberOverviewVO.setMemberSingleAmount(0.0); + // 支付会员数 + memberOverviewVO.setPayMember(0); + }else { + // 会员支付金额,分转换成元 + memberOverviewVO.setMemberPayAmount(handDouble(PriceUtil.toDecimalPrice(userOrderStatisticBO.getActualAmount()).doubleValue())); + // 支付会员数 + memberOverviewVO.setPayMember(userOrderStatisticBO.getPayUserCount()); + // 会员支付订单数 + memberOverviewVO.setMemberPayOrder(userOrderStatisticBO.getConsTimes()); + // 会员客单价 + memberOverviewVO.setMemberSingleAmount(divAverage(memberOverviewVO.getMemberPayAmount(), memberOverviewVO.getPayMember(), 2)); + } + return memberOverviewVO; + } + + private void setMenberNum(Integer memberType, MemberCountVO memberCountVO, MemberOverviewVO memberOverviewVO) { + if (Objects.isNull(memberType) || Objects.equals(memberType, 0)) { + memberOverviewVO.setTotalMember(memberCountVO.getTotalMember()); + memberOverviewVO.setNewMember(memberCountVO.getNewMember()); + } else if (Objects.equals(memberType, 1)) { + memberOverviewVO.setTotalMember(memberCountVO.getTotalMember() - memberCountVO.getPaidMember()); + memberOverviewVO.setNewMember(memberCountVO.getNewMember()); + } else { + memberOverviewVO.setTotalMember(memberCountVO.getPaidMember()); + memberOverviewVO.setNewMember(memberCountVO.getNewPaidMember()); + } + } + + private MemberDealVO handleMemberPayInfo(List userOrderStatisticList) { + if (CollUtil.isEmpty(userOrderStatisticList)) { + return getMemberPayInfo(null); + } + return getMemberPayInfo(userOrderStatisticList.get(0)); + } + + private MemberDealVO getMemberPayInfo(UserOrderStatisticBO userOrderStatistic) { + MemberDealVO memberDealVO = new MemberDealVO(); + if (Objects.isNull(userOrderStatistic)) { + memberDealVO.setPayMemberNum(0); + memberDealVO.setPayAmount(0.00); + memberDealVO.setPricePerMember(0.00); + memberDealVO.setPayOrderNum(0); + } else { + memberDealVO.setPayMemberNum(userOrderStatistic.getPayUserCount()); + Double payAmount = userOrderStatistic.getConsAmount(); + if (Objects.isNull(payAmount)) { + payAmount = 0.00; + } + memberDealVO.setPayAmount(payAmount/100); + double priceMember = (double) Math.round(divAverage(payAmount, memberDealVO.getPayMemberNum(), 2)); + memberDealVO.setPricePerMember(priceMember/100); + memberDealVO.setPayOrderNum(userOrderStatistic.getConsTimes()); + } + return memberDealVO; + } + + private Double handleLong(Long value){ + if (Objects.isNull(value)){ + return 0.00; + } + return PriceUtil.toDecimalPrice(value).doubleValue(); + } + + private Double divAverage(Integer a, Integer b) { + if (Objects.isNull(b) || b == 0 || Objects.isNull(a)) { + return 0.0; + } + return Arith.div(a, b, 4); + } + + private Double divAverage(Double a, Integer b, Integer scale) { + if (Objects.isNull(b) || b == 0 || Objects.isNull(a)) { + return 0.0; + } + return Arith.div(a, b, scale); + } + private Double divAverage(Double a, Double b) { + if (Objects.isNull(b) || b == 0 || Objects.isNull(a)) { + return 0.0; + } + return Arith.div(a, b, 4); + } + + + private Double setRate(Double newNum,Double oldNum){ + if (newNum.equals(0.0) && oldNum.equals(0.0)){ + return 0.0; + }else if (newNum > 0.0 && oldNum.equals(0.0)){ + return 0.0; + }else if (newNum.equals(0.0) && oldNum > 0.0){ + return -100.0; + } + double sub = Arith.sub(newNum, oldNum); + return Arith.mul(Arith.div(sub,oldNum,2),100); + } + + private Double handDouble(Double value){ + if (Objects.isNull(value)){ + return 0.00; + } + return value; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FlowServiceImpl.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FlowServiceImpl.java new file mode 100644 index 0000000..2ec5f03 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FlowServiceImpl.java @@ -0,0 +1,364 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.Week; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.flow.bo.FlowLogBO; +import com.tmerclub.cloud.flow.bo.FlowSpuUserBO; +import com.tmerclub.cloud.flow.bo.FlowSystemUserBO; +import com.tmerclub.cloud.flow.bo.FlowUserOperationBO; +import com.tmerclub.cloud.flow.constant.*; +import com.tmerclub.cloud.flow.dto.FlowLogDTO; +import com.tmerclub.cloud.flow.service.*; +import com.tmerclub.cloud.flow.util.FlowUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 流量分析 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +@SuppressWarnings({"rawtypes", "unchecked"}) +@Service +public class FlowServiceImpl implements FlowService { + + private static final Logger log = LoggerFactory.getLogger(FlowServiceImpl.class); + + @Autowired + private FlowUserMongoService flowUserMongoService; + @Autowired + private UserAnalyseMongoService userAnalyseMongoService; + @Autowired + private SystemAnalyseMongoService systemAnalyseMongoService; + @Autowired + private SystemUserAnalyseMongoService systemUserAnalyseMongoService; + @Autowired + private SpuAnalyseMongoService spuAnalyseMongoService; + @Autowired + private MongoTemplate mongoTemplate; + @DubboReference + private UserFeignClient userFeignClient; + @Autowired + private SegmentManager segmentManager; + + + @Override + public void log(FlowLogDTO flowLogDTO) { + flowLogDTO.setCreateTime(DateUtil.beginOfDay(new Date())); + UidInfoBO uidInfoBO = AuthUserContext.get(); + long oid = flowLogDTO.getOid() * 10; + long ip = IpHelper.getIpNumber(); + Date date = new Date(); + Long bid = null; + // 批量处理 + if (StrUtil.isNotBlank(flowLogDTO.getBid()) && flowLogDTO.getBid().contains(Constant.COMMA)) { + String[] split = flowLogDTO.getBid().split(Constant.COMMA); + flowLogDTO.setBid(null); + List flowLogList = new ArrayList<>(); + for (String s : split) { + FlowLogBO flowLogBO = BeanUtil.map(flowLogDTO, FlowLogBO.class); + this.handleFlowLog(uidInfoBO, oid, ip, Long.parseLong(s), date, flowLogBO); + flowLogList.add(flowLogBO); + } + mongoTemplate.insertAll(flowLogList); + return; + } else if (StrUtil.isNotBlank(flowLogDTO.getBid())) { + bid = Long.parseLong(flowLogDTO.getBid()); + } + FlowLogBO flowLogBO = BeanUtil.map(flowLogDTO, FlowLogBO.class); + this.handleFlowLog(uidInfoBO, oid, ip, bid, date, flowLogBO); + mongoTemplate.save(flowLogBO); + } + + @Override + public void paySuccessLog(Integer sysType, String orderIds, Long userId) { + List flowLogs = new ArrayList<>(); + // 根据订单id查进入到支付页面的日志,然后对应步数+1就是支付成功的步数 + boolean isMulti = StrUtil.isNotBlank(orderIds) && orderIds.contains(Constant.COMMA); + String[] orderIdStrArr = orderIds.split(StrUtil.COMMA); + if (isMulti) { + for (String orderId : orderIdStrArr) { + List multiList = flowUserMongoService.getFlowLogByOrderIds(FlowLogPageEnum.ORDER_CONFIRM.value(), userId, orderId); + flowLogs.addAll(multiList); + } + } else { + flowLogs = flowUserMongoService.getFlowLogByOrderIds(FlowLogPageEnum.ORDER_CONFIRM.value(), userId, orderIds); + } + // 如果没有支付页面的日志,就给他加一条 + if (CollUtil.isEmpty(flowLogs)) { + log.error("提交订单的流量记录不存在,orderIds:{},userId:{}", orderIds, userId); + addSubmitOrderLog(sysType, orderIds, userId, flowLogs); + } + // 如果有多条记录,保留第一条,剩下的全删了 + else if (!isMulti && flowLogs.size() > 1) { + List oids = flowLogs.stream().map(FlowLogBO::getOid).collect(Collectors.toList()); + oids.remove(0); + mongoTemplate.remove(new Query(Criteria.where("oid").in(oids)), FlowLogBO.class); + } else if (isMulti) { + // 多单结算 + mulitSave(sysType, flowLogs, orderIdStrArr); + return; + } + FlowLogBO flowLogBO = getFlowLogBO(sysType, orderIds, flowLogs.get(0)); + mongoTemplate.save(flowLogBO); + } + + private void mulitSave(Integer sysType, List flowLogs, String[] orderIdStrArr) { + if (flowLogs.size() > orderIdStrArr.length) { + Map> map = flowLogs.stream().collect(Collectors.groupingBy(FlowLogBO::getBid)); + flowLogs.clear(); + for (Long bid : map.keySet()) { + List flowLogBOList = map.get(bid); + flowLogs.add(flowLogBOList.get(0)); + } + } + List insertList = new ArrayList<>(); + for (FlowLogBO flowLog : flowLogs) { + FlowLogBO flowLogBO = getFlowLogBO(sysType, String.valueOf(flowLog.getBid()), flowLog); + insertList.add(flowLogBO); + } + mongoTemplate.insertAll(insertList); + } + + private static FlowLogBO getFlowLogBO(Integer sysType, String orderIds, FlowLogBO flowLogBO) { + flowLogBO.setSt(sysType); + flowLogBO.setPid(FlowLogPageEnum.PAY_SUCCESS.value()); + flowLogBO.setVe(FlowVisitEnum.PAY_SUCCESS.value()); + flowLogBO.setDt(new Date()); + flowLogBO.setS(flowLogBO.getS() + 1); + // 如果没有支付系统类型,默认给个H5,并且记录下来日志 + if (Objects.isNull(flowLogBO.getSt())) { + log.error("订单支付成功的用户操作记录没有系统类型,orderIds:{}", orderIds); + flowLogBO.setSt(SystemTypeEnum.H5.value()); + } + return flowLogBO; + } + + private void addSubmitOrderLog(Integer sysType, String orderIds, Long userId, List flowLogs) { + FlowLogBO flowLogBO = flowUserMongoService.getUserLastLog(userId); + Long oid = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_FLOW_USER_ID); + String[] orderIdStrArr = orderIds.split(StrUtil.COMMA); + for (String orderId : orderIdStrArr) { + if (Objects.isNull(flowLogBO)) { + flowLogBO = new FlowLogBO(); + setFlowInfo(sysType, orderId, flowLogBO, oid); + flowLogBO.setS(1); + flowLogBO.setUid(userId); + flowLogBO.setIp(IpHelper.getIpNumber()); + mongoTemplate.save(flowLogBO); + } + setFlowInfo(sysType, orderId, flowLogBO, oid); + flowLogBO.setS(flowLogBO.getS() + 1); + flowLogs.add(flowLogBO); + } + mongoTemplate.insertAll(flowLogs); + } + + private static void setFlowInfo(Integer sysType, String orderIds, FlowLogBO flowLogBO, Long oid) { + flowLogBO.setOid(oid * 10); + flowLogBO.setSt(sysType); + flowLogBO.setPid(FlowLogPageEnum.ORDER_CONFIRM.value()); + flowLogBO.setVe(FlowVisitEnum.CONFIRM_ORDER.value()); + flowLogBO.setBid(Long.parseLong(orderIds)); + flowLogBO.setN(0); + flowLogBO.setDt(new Date()); + // 如果没有支付系统类型,默认给个H5,并且记录下来日志 + if (Objects.isNull(flowLogBO.getSt())) { + log.error("订单支付成功的用户操作记录没有系统类型,orderIds:{}", orderIds); + flowLogBO.setSt(SystemTypeEnum.H5.value()); + } + } + + private void handleFlowLog(UidInfoBO uidInfoBO, long oid, long ip, Long bid, Date date, FlowLogBO flowLogBO) { + // 登陆后,插入用户id + if (Objects.nonNull(uidInfoBO) && Objects.nonNull(uidInfoBO.getUserId())) { + flowLogBO.setUid(uidInfoBO.getUserId()); + } + // 跟用户id做个区分,oid是13为,uid是12位 + flowLogBO.setOid(oid); + flowLogBO.setBid(bid); + flowLogBO.setIp(ip); + flowLogBO.setDt(date); + } + + @Override + public void statisticalFlowUserLog() { + // 先获取用户操作记录中最早的日期,然后根据日期天统计,一直统计到当前日期 + + Date beginDate = this.getBeginDate(); + log.info("统计流量分析数据开始,开始时间:{}", beginDate); + long today = DateUtil.beginOfDay(new Date()).getTime(); + + // 时间循环开始 while + while (beginDate.getTime() < today) { + int dateType = FlowDateTypeEnum.DAY.value(); + Date endDate = DateUtil.offsetDay(beginDate, 1); + Date startTime = beginDate; + log.info("统计流量分析数据开始,统计时间:{}", startTime); + // ====================== 从flow_user_log中统计当天的数据 ====================== + this.statisticsBaseData(dateType, endDate, startTime); + + // ====================== 根据上一步统计的数据整合为流量分析的数据 ====================== + // 日 ---- 统计当天商城用户的操作数据 + log.info("统计流量分析数据开始-统计当天商城用户的操作数据"); + this.statisticsDayOfData(dateType, startTime, endDate); + + // 周 ---- 统计该日期所在周的数据 + if (Objects.equals(Week.MONDAY, DateUtil.dayOfWeekEnum(startTime))) { + log.info("统计流量分析数据开始-统计该日期所在周的数据"); + startTime = DateUtil.beginOfWeek(beginDate); + this.statisticalDataBasedOnDateType(FlowDateTypeEnum.WEEK.value(), startTime, endDate); + } + + // 月 ---- 统计该日期所在月的数据 + if (Objects.equals(DateUtil.dayOfMonth(startTime), 1)) { + log.info("统计流量分析数据开始-统计该日期所在月的数据"); + startTime = DateUtil.beginOfMonth(beginDate); + this.statisticalDataBasedOnDateType(FlowDateTypeEnum.MONTH.value(), startTime, endDate); + // 客户留存 + userAnalyseMongoService.statisticsAndSaveUserRetained(); + } + // 统计完当天的数据后,删除当天的用户操作记录 flow_user_log +// mongoTemplate.remove(Query.query(Criteria.where("dt").gte(beginDate).lt(endDate)), FlowLogBO.class); + // 日期加1天继续循环 + beginDate = DateUtil.offsetDay(beginDate, 1); + } + + Date endDate = DateUtil.beginOfDay(new Date()); + // ====================== 统计近7天的数据 ====================== + beginDate = DateUtil.offsetDay(endDate, -FlowDateTypeEnum.NEARLY_WEEK.getNum()); + log.info("统计流量分析数据,近7天数据统计的开始时间:{}, 结束时间: {}", beginDate, endDate); + this.statisticalDataBasedOnDateType(FlowDateTypeEnum.NEARLY_WEEK.value(), beginDate, endDate); + + // ====================== 统计近30天的数据 ====================== + beginDate = DateUtil.offsetDay(endDate, -FlowDateTypeEnum.NEARLY_MONTH.getNum()); + log.info("统计流量分析数据,近30天数据统计的开始时间:{}, 结束时间: {}", beginDate, endDate); + this.statisticalDataBasedOnDateType(FlowDateTypeEnum.NEARLY_MONTH.value(), beginDate, endDate); + + // 统计当月客户留存数据 + userAnalyseMongoService.statisticsAndSaveUserRetainedOfCurrent(); + + beginDate = DateUtil.offsetDay(endDate, -70); + // 删除flow_system_user中70天前的数据 + mongoTemplate.remove(new Query(Criteria.where("_id").lte(FlowUtil.timeToId(beginDate, FlowSystemUserBO.ID_LENGTH))), FlowSystemUserBO.class); + + // 删除flow_spu_user中70天前的数据 + mongoTemplate.remove(new Query(Criteria.where("_id").lte(FlowUtil.timeToId(beginDate))), FlowSpuUserBO.class); + + // 删除flow_user_operation中200天前的数据 + beginDate = DateUtil.offsetDay(endDate, -240); + mongoTemplate.remove(new Query(Criteria.where("_id").lte(FlowUtil.timeToId(beginDate))), FlowUserOperationBO.class); + } + + private Date getBeginDate() { + // 获取流量统计的最初时间 + Date flowLogTime = flowUserMongoService.getBeginDate(); + + // 获取用户数据统计的最新时间 + Date userLatestTime = userAnalyseMongoService.getLatestTime(); + + // 如果为空就代表还没有统计过用户数据,所以查询第一个用户的注册时间,作为统计的开始时间 + if (Objects.isNull(userLatestTime)) { + // 获取第一个用户的注册时间 + ServerResponseEntity userResponseEntity = userFeignClient.getInitialRegistrationTime(); + if (!userResponseEntity.isSuccess()) { + throw new LuckException(userResponseEntity.getMsg()); + } + userLatestTime = userResponseEntity.getData(); + } + + // 如果用户数据统计的最新时间小于流量统计的最小时间,就以用户统计时间为准 + if (Objects.nonNull(userLatestTime) && userLatestTime.getTime() < flowLogTime.getTime()) { + flowLogTime = userLatestTime; + } + + return DateUtil.beginOfDay(flowLogTime); + } + + private void statisticsBaseData(int dateType, Date endDate, Date startTime) { + // 统计系统数据 -flow_system_user --flow_user_log + systemUserAnalyseMongoService.statisticsAndSaveSystemUserOfDay(dateType, startTime, endDate); + + // 统计用户操作数据 -flow_user_operation --flow_user_log + // 先统计每个用户的操作记录 + userAnalyseMongoService.statisticsAndSaveUserOfDay(startTime, endDate); + + // 统计商品数据 -flow_spu_user --flow_user_log + spuAnalyseMongoService.statisticsAndSaveSpuUserOfDay(startTime, endDate); + } + + private void statisticsDayOfData(Integer dateType, Date beginDate, Date endDate) { + + // 统计系统数据 - system_analyse --flow_user_log + log.info("统当天商城用户的操作数据-统计系统数据"); + systemAnalyseMongoService.statisticsAndSaveSystemOfDay(beginDate, endDate); + + // 访问深度 -flow_user_footprint --flow_user_operation + log.info("统当天商城用户的操作数据-访问深度"); + userAnalyseMongoService.statisticsAndSaveUserFootprintOfDay(dateType, beginDate, endDate); + + // 访问地域 -flow_regional --flow_user_operation、flow_spu_user + log.info("统当天商城用户的操作数据-访问地域"); + userAnalyseMongoService.statisticsAndSaveRegionalOfTime(dateType, beginDate, endDate); + + // 会员概括 -flow_user --flow_user_operation + log.info("统当天商城用户的操作数据-会员概括"); + userAnalyseMongoService.statisticsAndSaveUserOfTime(dateType, beginDate, endDate); + + // 商品概况 -flow_spu --flow_user_log + log.info("统当天商城用户的操作数据-商品概况"); + spuAnalyseMongoService.statisticsAndSaveSpuOfDay(dateType, beginDate, endDate); + } + + private void statisticalDataBasedOnDateType(int dateType, Date beginDate, Date endDate){ + // 统计系统数据 - flow_system --flow_system、flow_system_user + log.info("统计指定范围内的数据-系统数据"); + systemAnalyseMongoService.statisticsAndSaveSystemOfTime(dateType, beginDate, endDate); + + // 访问深度 -flow_user_footprint --flow_user_operation + log.info("统计指定范围内的数据-访问深度"); + userAnalyseMongoService.statisticsAndSaveUserFootprintOfTime(dateType, beginDate, endDate); + + // 访问地域 -flow_regional --flow_user_operation、flow_spu_user + log.info("统计指定范围内的数据-访问地域"); + userAnalyseMongoService.statisticsAndSaveRegionalOfTime(dateType, beginDate, endDate); + + // 会员概括 -flow_user --flow_user_operation + log.info("统计指定范围内的数据-会员概括"); + userAnalyseMongoService.statisticsAndSaveUserOfTime(dateType, beginDate, endDate); + + // 商品概况 -flow_spu --flow_spu、flow_spu_user + log.info("统计指定范围内的数据-商品概况"); + spuAnalyseMongoService.statisticsAndSaveSpuOfTime(dateType, beginDate, endDate); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FlowUserAnalysisServiceImpl.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FlowUserAnalysisServiceImpl.java new file mode 100644 index 0000000..391fb6c --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FlowUserAnalysisServiceImpl.java @@ -0,0 +1,540 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.flow.bo.FlowSystemBO; +import com.tmerclub.cloud.flow.constant.FlowDateTypeEnum; +import com.tmerclub.cloud.flow.constant.SystemTypeEnum; +import com.tmerclub.cloud.flow.dto.FlowAnalysisDTO; +import com.tmerclub.cloud.flow.service.FlowUserAnalysisService; +import com.tmerclub.cloud.flow.service.FlowUserMongoService; +import com.tmerclub.cloud.flow.service.SystemAnalyseMongoService; +import com.tmerclub.cloud.flow.util.FlowArithUtil; +import com.tmerclub.cloud.flow.util.FlowUtil; +import com.tmerclub.cloud.flow.vo.*; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 流量分析—用户访问数据 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +@Service +public class FlowUserAnalysisServiceImpl implements FlowUserAnalysisService { + + private static final Logger log = LoggerFactory.getLogger(FlowUserAnalysisServiceImpl.class); + @Autowired + private FlowUserMongoService flowUserMongoService; + @Autowired + private SystemAnalyseMongoService systemAnalyseMongoService; + + private static final String[] SYSTEM_TYPE = {"全部", "PC", "H5", "微信小程序", "安卓", "IOS"}; + + @Override + public FlowAnalysisVO getFlowAnalysisData(FlowAnalysisDTO flowAnalysisDTO) { + FlowUtil.handleTime(flowAnalysisDTO); + //获取用于跟新数据比较的旧数据的开始时间 + List flowSystemList; + Date beginTime = FlowUtil.previousTime(flowAnalysisDTO.getStartTime(), flowAnalysisDTO.getDateType()); + // 今日实时 + if (Objects.equals(flowAnalysisDTO.getDateType(), FlowDateTypeEnum.REAL_TIME.value())) { + // 统计当日的数据 + flowSystemList = systemAnalyseMongoService.listRealTimeStatistics(null, null, flowAnalysisDTO.getSystemType()); + } + // 日、周、月、近7天、近30天 + else { + flowSystemList = systemAnalyseMongoService.listFlowSystemByDateTypeAndSystemType( + beginTime, + flowAnalysisDTO.getEndTime(), + flowAnalysisDTO.getDateType(), + flowAnalysisDTO.getSystemType()); + } + + // 今日实时、近7天、近30天 的旧数据,用于计算上升、下降率 (有缓存) + if (Objects.equals(flowAnalysisDTO.getDateType(), FlowDateTypeEnum.REAL_TIME.value()) || FlowDateTypeEnum.nearlyTime(flowAnalysisDTO.getDateType())) { + // 根据时间类型和beginTime进行缓存,缓存时间为一天 + this.loadOldFlowSystem(flowAnalysisDTO, flowSystemList, beginTime); + } + + if (CollUtil.isEmpty(flowSystemList)) { + flowSystemList.add(new FlowSystemBO()); + flowSystemList.add(new FlowSystemBO()); + flowSystemList.get(0).setCreateTime(flowAnalysisDTO.getStartTime()); + flowSystemList.get(1).setCreateTime(beginTime); + } else if (flowSystemList.size() == 1) { + flowSystemList.add(new FlowSystemBO()); + // 如果数据库中的数据的开始时间大于等于查询的开始时间,那么就将查询的开始时间赋值给数据库中的数据的开始时间 + if (flowSystemList.get(0).getCreateTime().getTime() >= flowAnalysisDTO.getStartTime().getTime()) { + flowSystemList.get(1).setCreateTime(beginTime); + } else { + flowSystemList.get(1).setCreateTime(flowAnalysisDTO.getStartTime()); + } + } + + // 统计数据库中无法获取的数据 + List flowAnalysisList = this.dbDataToFlowAnalysis(flowSystemList); + // 统计数据增减的比例 + return calculateProportion(flowAnalysisList); + } + + @Override + public List flowTrend(FlowAnalysisDTO flowAnalysisDTO) { + FlowUtil.handleTime(flowAnalysisDTO); + + // 统计数据的最开始时间 + int offset = 0; + if (Objects.equals(flowAnalysisDTO.getDateType(), FlowDateTypeEnum.REAL_TIME.value()) || + Objects.equals(FlowDateTypeEnum.DAY.value(), flowAnalysisDTO.getDateType())) { + // 今日实时 + offset = 29; + } else if (FlowDateTypeEnum.weekOrMonth(flowAnalysisDTO.getDateType())) { + // 周、月 + offset = 11; + } + + Date beginTime; + + if (offset == 0) { + beginTime = flowAnalysisDTO.getStartTime(); + } else { + beginTime = FlowUtil.previousTime(flowAnalysisDTO.getStartTime(), flowAnalysisDTO.getDateType(), offset); + } + + List flowSystemList = new ArrayList<>(); + + // 实时数据 - 使用当天数据进行统计 + if (Objects.equals(flowAnalysisDTO.getDateType(), FlowDateTypeEnum.REAL_TIME.value())) { + List flowSystemBOList = systemAnalyseMongoService.listRealTimeStatistics(null,null, flowAnalysisDTO.getSystemType()); + for (FlowSystemBO flowSystemBO : flowSystemBOList) { + // 统计当日的数据 + if (Objects.equals(flowSystemBO.getSystemType(), flowAnalysisDTO.getSystemType())) { + flowSystemList.add(flowSystemBO); + } + } + } + int dateType; + if (FlowDateTypeEnum.nearlyTime(flowAnalysisDTO.getDateType()) || Objects.equals(flowAnalysisDTO.getDateType(), FlowDateTypeEnum.REAL_TIME.value())) { + dateType = FlowDateTypeEnum.DAY.value(); + } else { + dateType = flowAnalysisDTO.getDateType(); + } + + // 查询前30天的数据 + flowSystemList.addAll(systemAnalyseMongoService.listFlowSystemByDateTypeAndSystemType( + beginTime, + flowAnalysisDTO.getEndTime(), + dateType, + flowAnalysisDTO.getSystemType())); + + Map map = flowSystemList.stream().collect(Collectors.toMap(flowSystemBO -> flowSystemBO.getCreateTime().getTime(), f -> f)); + + long endTime = flowAnalysisDTO.getEndTime().getTime(); + flowSystemList.clear(); + + // 循环生成数据 + while (beginTime.getTime() < endTime){ + FlowSystemBO flowSystemBO = map.get(beginTime.getTime()); + if (Objects.isNull(flowSystemBO)){ + flowSystemBO = new FlowSystemBO(); + } + flowSystemBO.setCreateTime(beginTime); + beginTime = getNextTime(beginTime, flowAnalysisDTO.getDateType()); + flowSystemList.add(flowSystemBO); + } + + List flowAnalysisList = dbDataToFlowAnalysis(flowSystemList); + for (FlowAnalysisVO flowAnalysisVO : flowAnalysisList) { + flowAnalysisVO.setSystemType(flowAnalysisDTO.getSystemType()); + flowAnalysisVO.setDateTime(FlowUtil.formatOnDateType(flowAnalysisVO.getDay(), flowAnalysisDTO.getDateType())); + } + return flowAnalysisList; + } + + @Override + public List flowSour(FlowAnalysisDTO flowAnalysisDTO) { + FlowUtil.handleTime(flowAnalysisDTO); + // 获取数据 + List flowSystemList = new ArrayList<>(); + + // 实时数据 - 使用当天数据进行统计 + if (Objects.equals(flowAnalysisDTO.getDateType(), FlowDateTypeEnum.REAL_TIME.value())) { + flowSystemList = systemAnalyseMongoService.listRealTimeStatistics(null, null, flowAnalysisDTO.getSystemType()); + } + + // 日、周、月、近7天、近30天 - 直接从flow_system中查询已统计的数据 + else { + // 查询flow_system表中指定日期的所有数据的数据 + flowSystemList = systemAnalyseMongoService.listFlowSystemByDateTypeAndSystemType( + flowAnalysisDTO.getStartTime(), + flowAnalysisDTO.getEndTime(), + flowAnalysisDTO.getDateType(), + null + ); + } + List flowSourList = this.dbDataToFlowAnalysis(flowSystemList); + return flowSourList; + } + + @Override + public List listFlowAnalysisDataExcel(FlowAnalysisDTO flowAnalysisDTO) { + FlowUtil.handleTime(flowAnalysisDTO); + List flowSystemList; + Date beginTime = FlowUtil.previousTime(flowAnalysisDTO.getStartTime(), flowAnalysisDTO.getDateType()); + // 今日实时 + if (Objects.equals(flowAnalysisDTO.getDateType(), FlowDateTypeEnum.REAL_TIME.value())) { + // 统计当日的数据 + flowSystemList = systemAnalyseMongoService.listRealTimeStatistics(flowAnalysisDTO.getStartTime(), flowAnalysisDTO.getEndTime(), null); + } + // 日、周、月、近7天、近30天 + else { + // 统计当日的数据 + flowSystemList = systemAnalyseMongoService.listFlowSystemByDateTypeAndSystemType( + beginTime, + flowAnalysisDTO.getEndTime(), + flowAnalysisDTO.getDateType(), + null); + } + // list类型更改为ArrayList + flowSystemList = new ArrayList<>(flowSystemList); + + List systemTypes = flowSystemList.stream().map(FlowSystemBO::getSystemType).collect(Collectors.toList()); + for (SystemTypeEnum systemTypeEnum : SystemTypeEnum.values()) { + if (systemTypes.contains(systemTypeEnum.value())) { + continue; + } + FlowSystemBO flowSystemBO = new FlowSystemBO(); + flowSystemBO.setSystemType(systemTypeEnum.value()); + flowSystemList.add(flowSystemBO); + } + + // 统计数据增减的比例 + List flowAnalysisList = this.dbDataToFlowAnalysis(flowSystemList); + calculateProportion(flowAnalysisList); + + Map map = flowAnalysisList.stream().collect(Collectors.toMap(FlowAnalysisVO::getSystemType, f -> f)); + + FlowAnalysisVO all = map.get(SystemTypeEnum.ALL.value()); + FlowAnalysisVO pc = map.get(SystemTypeEnum.PC.value()); + FlowAnalysisVO h5 = map.get(SystemTypeEnum.H5.value()); + FlowAnalysisVO wx = map.get(SystemTypeEnum.APPLETS.value()); + FlowAnalysisVO android = map.get(SystemTypeEnum.ANDROID.value()); + FlowAnalysisVO ios = map.get(SystemTypeEnum.IOS.value()); + + List resList = new ArrayList<>(Constant.INITIAL_CAPACITY); + getFlowAnalysisDataExcel("访客数", all.getUserNums().toString(), pc.getUserNums().toString(), h5.getUserNums().toString(), wx.getUserNums().toString(), android.getUserNums().toString(), ios.getUserNums().toString(), resList); + getFlowAnalysisDataExcel("浏览量", all.getVisitNums().toString(), pc.getVisitNums().toString(), h5.getVisitNums().toString(), wx.getVisitNums().toString(), android.getVisitNums().toString(), ios.getVisitNums().toString(), resList); + getFlowAnalysisDataExcel("人均浏览量", all.getAverageVisitNums().toString(), pc.getAverageVisitNums().toString(), h5.getAverageVisitNums().toString(), wx.getAverageVisitNums().toString(), android.getAverageVisitNums().toString(), ios.getAverageVisitNums().toString(), resList); + getFlowAnalysisDataExcel("支付人数", all.getPayUser().toString(), pc.getPayUser().toString(), h5.getPayUser().toString(), wx.getPayUser().toString(), android.getPayUser().toString(), ios.getPayUser().toString(), resList); + getFlowAnalysisDataExcel("下单人数", all.getPlaceOrderUser().toString(), pc.getPlaceOrderUser().toString(), h5.getPlaceOrderUser().toString(), wx.getPlaceOrderUser().toString(), android.getPlaceOrderUser().toString(), ios.getPlaceOrderUser().toString(), resList); + if (!Objects.equals(flowAnalysisDTO.getDateType(), FlowDateTypeEnum.REAL_TIME.value())) { + getFlowAnalysisDataExcel("新访客数", all.getNewUserNums().toString(), pc.getNewUserNums().toString(), h5.getNewUserNums().toString(), wx.getNewUserNums().toString(), android.getNewUserNums().toString(), ios.getNewUserNums().toString(), resList); + getFlowAnalysisDataExcel("跳失率", all.getLossUserRate().toString(), pc.getLossUserRate().toString(), h5.getLossUserRate().toString(), wx.getLossUserRate().toString(), android.getLossUserRate().toString(), ios.getLossUserRate().toString(), resList); + getFlowAnalysisDataExcel("访问-支付转化率", all.getPayRate().toString(), pc.getPayRate().toString(), h5.getPayRate().toString(), wx.getPayRate().toString(), android.getPayRate().toString(), ios.getPayRate().toString(), resList); + getFlowAnalysisDataExcel("访问-下单转化率", all.getPlaceOrderRate().toString(), pc.getPlaceOrderRate().toString(), h5.getPlaceOrderRate().toString(), wx.getPlaceOrderRate().toString(), android.getPlaceOrderRate().toString(), ios.getPlaceOrderRate().toString(), resList); + } + return resList; + } + + @Override + public void exportFlowTrend(HttpServletResponse response, FlowAnalysisDTO flowAnalysisDTO) { + FlowUtil.handleTime(flowAnalysisDTO); + Map map = new HashMap<>(8); + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + ExcelWriterBuilder excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, FlowTrendExcelVO.EXCEL_NAME, FlowTrendExcelVO.MERGE_ROW_INDEX, FlowTrendExcelVO.MERGE_COLUMN_INDEX); + excelWriter = ExcelUtil.getExcelModel(excelWriterMerge, map, Constant.START_ROW).build(); + // 业务代码 + for (SystemTypeEnum systemTypeEnum : SystemTypeEnum.values()) { + flowAnalysisDTO.setSystemType(systemTypeEnum.value()); + // 进行写入操作 + List flowAnalysisVOList = this.flowTrend(flowAnalysisDTO); + List resList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (FlowAnalysisVO flowAnalysisVO : flowAnalysisVOList) { + FlowTrendExcelVO date = new FlowTrendExcelVO(); + date.setDate(flowAnalysisVO.getDateTime()); + date.setUserNums(flowAnalysisVO.getUserNums()); + date.setNewUserNums(flowAnalysisVO.getNewUserNums()); + date.setVisitNums(flowAnalysisVO.getVisitNums()); + date.setAverageVisitNums(flowAnalysisVO.getAverageVisitNums()); + date.setPlusShopCart(flowAnalysisVO.getPlusShopCart()); + date.setLossUserRate(flowAnalysisVO.getLossUserRate()); + date.setPlaceOrderUser(flowAnalysisVO.getPlaceOrderUser()); + date.setPayUser(flowAnalysisVO.getPayUser()); + resList.add(date); + } + if (CollUtil.isNotEmpty(resList)) { + resList.add(new FlowTrendExcelVO()); + } + WriteSheet sheetWriter = EasyExcel.writerSheet(systemTypeEnum.value()).head(FlowTrendExcelVO.class).build(); + excelWriter.write(resList, sheetWriter); + } + } catch (Exception e) { + log.error("导出流量趋势分析失败", e); + } finally { + if (excelWriter != null) { + excelWriter.finish(); + } + } + + } + + @Override + public List listFlowSourDataExcel(FlowAnalysisDTO flowAnalysisDTO) { + List flowAnalysisVOList = flowSour(flowAnalysisDTO); + Map flowAnalysisMap = flowAnalysisVOList.stream().collect(Collectors.toMap(FlowAnalysisVO::getSystemType, f -> f)); + FlowAnalysisVO pc = flowAnalysisMap.containsKey(SystemTypeEnum.PC.value()) ? flowAnalysisMap.get(SystemTypeEnum.PC.value()) : getNewFlowAnalysis(); + FlowAnalysisVO h5 = flowAnalysisMap.containsKey(SystemTypeEnum.H5.value()) ? flowAnalysisMap.get(SystemTypeEnum.H5.value()) : getNewFlowAnalysis(); + FlowAnalysisVO weChat = flowAnalysisMap.containsKey(SystemTypeEnum.APPLETS.value()) ? flowAnalysisMap.get(SystemTypeEnum.APPLETS.value()) : getNewFlowAnalysis(); + FlowAnalysisVO android = flowAnalysisMap.containsKey(SystemTypeEnum.ANDROID.value()) ? flowAnalysisMap.get(SystemTypeEnum.ANDROID.value()) : getNewFlowAnalysis(); + FlowAnalysisVO ios = flowAnalysisMap.containsKey(SystemTypeEnum.IOS.value()) ? flowAnalysisMap.get(SystemTypeEnum.IOS.value()) : getNewFlowAnalysis(); + int userAll = pc.getUserNums() + h5.getUserNums() + weChat.getUserNums() + android.getUserNums() + ios.getUserNums(); + List resList = new ArrayList<>(Constant.INITIAL_CAPACITY); + getFlowSourDataExcel("访客数占比", FlowArithUtil.getRatio(pc.getUserNums(), userAll, 4).toString(), FlowArithUtil.getRatio(h5.getUserNums(), userAll, 4).toString(), FlowArithUtil.getRatio(weChat.getUserNums(), userAll, 4).toString(), FlowArithUtil.getRatio(android.getUserNums(), userAll, 4).toString(), FlowArithUtil.getRatio(ios.getUserNums(), userAll, 4).toString(), resList); + getFlowSourDataExcel("访客数", pc.getUserNums().toString(), h5.getUserNums().toString(), weChat.getUserNums().toString(), android.getUserNums().toString(), ios.getUserNums().toString(), resList); + getFlowSourDataExcel("UV价值", pc.getUvAmount().toString(), h5.getUvAmount().toString(), weChat.getUvAmount().toString(), android.getUvAmount().toString(), ios.getUvAmount().toString(), resList); + getFlowSourDataExcel("加购人数", pc.getPlusShopCartUser().toString(), h5.getPlusShopCartUser().toString(), weChat.getPlusShopCartUser().toString(), android.getPlusShopCartUser().toString(), ios.getPlusShopCartUser().toString(), resList); + getFlowSourDataExcel("下单人数", pc.getPlaceOrderUser().toString(), h5.getPlaceOrderUser().toString(), weChat.getPlaceOrderUser().toString(), android.getPlaceOrderUser().toString(), ios.getPlaceOrderUser().toString(), resList); + getFlowSourDataExcel("下单金额", PriceUtil.toDecimalPrice(pc.getPlaceOrderAmount()).toString(), PriceUtil.toDecimalPrice(h5.getPlaceOrderAmount()).toString(), PriceUtil.toDecimalPrice(weChat.getPlaceOrderAmount()).toString(), PriceUtil.toDecimalPrice(android.getPlaceOrderAmount()).toString(), PriceUtil.toDecimalPrice(ios.getPlaceOrderAmount()).toString(), resList); + getFlowSourDataExcel("访问-下单转化率", pc.getPlaceOrderRate().toString(), h5.getPlaceOrderRate().toString(), weChat.getPlaceOrderRate().toString(), android.getPlaceOrderRate().toString(), ios.getPlaceOrderRate().toString(), resList); + getFlowSourDataExcel("支付人数", pc.getPayUser().toString(), h5.getPayUser().toString(), weChat.getPayUser().toString(), android.getPayUser().toString(), ios.getPayUser().toString(), resList); + getFlowSourDataExcel("支付金额", PriceUtil.toDecimalPrice(pc.getPayAmount()).toString(), PriceUtil.toDecimalPrice(h5.getPayAmount()).toString(), PriceUtil.toDecimalPrice(weChat.getPayAmount()).toString(), PriceUtil.toDecimalPrice(android.getPayAmount()).toString(), PriceUtil.toDecimalPrice(ios.getPayAmount()).toString(), resList); + getFlowSourDataExcel("访问-支付转化率", pc.getPayRate().toString(), h5.getPayRate().toString(), weChat.getPayRate().toString(), android.getPayRate().toString(), ios.getPayRate().toString(), resList); + getFlowSourDataExcel("客单价", PriceUtil.toDecimalPrice(pc.getCustomerAmount()).toString(), PriceUtil.toDecimalPrice(h5.getCustomerAmount()).toString(), PriceUtil.toDecimalPrice(weChat.getCustomerAmount()).toString(), PriceUtil.toDecimalPrice(android.getCustomerAmount()).toString(), PriceUtil.toDecimalPrice(ios.getCustomerAmount()).toString(), resList); + return resList; + } + + private void loadOldFlowSystem(FlowAnalysisDTO flowAnalysisDTO, List flowSystemList, Date beginTime) { + String key = CacheNames.FLOW_SYSTEM_ALL + CacheNames.UNION + + flowAnalysisDTO.getDateType() + CacheNames.UNION + + FlowUtil.dateToString(beginTime); + String data = RedisUtil.get(key); + FlowSystemBO flowSystemBO; + // 缓存中有数据,直接返回 + if (StrUtil.isNotBlank(data)) { + flowSystemBO = JSON.parseObject(data, FlowSystemBO.class); + flowSystemList.add(flowSystemBO); + return; + } + // 没有数据就先统计,然后放入缓存 + List flowSystems; + if (true) { + // 查询今日实时前一天(昨天)的数据 + flowSystems = systemAnalyseMongoService.listFlowSystemByDateTypeAndSystemType( + beginTime, + flowAnalysisDTO.getStartTime(), + flowAnalysisDTO.getDateType(), + flowAnalysisDTO.getSystemType()); + + } else { + // 统计7天、30天的旧数据(8-14或者31-60天之间的数据) + flowSystems = systemAnalyseMongoService.statisticsSystemTypeListOfTime( + beginTime, + flowAnalysisDTO.getStartTime(), + flowAnalysisDTO.getSystemType()); + } + if (CollUtil.isNotEmpty(flowSystems)) { + flowSystemBO = flowSystems.get(0); + } else { + flowSystemBO = new FlowSystemBO(); + } + + flowSystemBO.setCreateTime(beginTime); + flowSystemBO.setDateType(flowAnalysisDTO.getDateType()); + RedisUtil.set(key, JSON.toJSONString(flowSystemBO), Constant.DAY_SECOND); + flowSystemList.add(flowSystemBO); + } + + private void getFlowSourDataExcel(String type, String pc, String h5, String weChat, String android, String ios, List resList) { + FlowSourDataExcelVO data = new FlowSourDataExcelVO(); + data.setType(type); + data.setPc(pc); + data.setH5(h5); + data.setWx(weChat); + data.setAndroid(android); + data.setIos(ios); + resList.add(data); + } + + private void getFlowAnalysisDataExcel(String type, String all, String pc, String h5, String wx, String android, String ios, List resList) { + FlowAnalysisDataExcelVO data = new FlowAnalysisDataExcelVO(); + data.setType(type); + data.setAll(all); + data.setPc(pc); + data.setH5(h5); + data.setWx(wx); + data.setAndroid(android); + data.setIos(ios); + resList.add(data); + } + + /** + * 处理数据库中无法获取的数据 + * @param flowSystemList + */ + private List dbDataToFlowAnalysis(List flowSystemList) { + + List flowAnalysisList = new ArrayList<>(); + for (FlowSystemBO flowSystemBO : flowSystemList) { + FlowAnalysisVO flowAnalysis = BeanUtil.map(flowSystemBO, FlowAnalysisVO.class); + flowAnalysis.setDay(flowSystemBO.getCreateTime()); + flowAnalysis.setUserNums(flowSystemBO.getVisitUser()); + if (Objects.isNull(flowSystemBO.getVisitUser())) { + flowAnalysis.setUserNums(0); + } + flowAnalysis.setNewUserNums(flowSystemBO.getNewVisitUser()); + if (Objects.isNull(flowSystemBO.getNewVisitUser())) { + flowAnalysis.setNewUserNums(0); + } + flowAnalysis.setVisitNums(flowSystemBO.getVisit()); + if (Objects.isNull(flowSystemBO.getVisit())) { + flowAnalysis.setVisitNums(0); + } + flowAnalysis.setAverageVisitNums(0D); + if (Objects.isNull(flowSystemBO.getLossUser())) { + flowAnalysis.setLossUser(0); + } + if (Objects.isNull(flowSystemBO.getPlusShopCartUser())) { + flowAnalysis.setPlusShopCartUser(0); + } + if (Objects.isNull(flowSystemBO.getPlaceOrderUser())) { + flowAnalysis.setPlaceOrderUser(0); + } + if (Objects.isNull(flowSystemBO.getPayUser())) { + flowAnalysis.setPayUser(0); + } + if (Objects.isNull(flowSystemBO.getPlaceOrderAmount())) { + flowAnalysis.setPlaceOrderAmount(Constant.ZERO_LONG); + } + if (Objects.isNull(flowSystemBO.getPayAmount())) { + flowAnalysis.setPayAmount(Constant.ZERO_LONG); + } + flowAnalysis.setAverageVisitNums(FlowArithUtil.getAverage(flowAnalysis.getVisitNums(),flowAnalysis.getUserNums())); + flowAnalysis.setLossUserRate(FlowArithUtil.getRatio(flowAnalysis.getLossUser(), flowAnalysis.getUserNums())); + flowAnalysis.setPayRate(FlowArithUtil.getRatio(flowAnalysis.getPayUser(),flowAnalysis.getUserNums())); + flowAnalysis.setPlaceOrderRate(FlowArithUtil.getRatio(flowAnalysis.getPlaceOrderUser(),flowAnalysis.getUserNums())); + flowAnalysis.setUvAmount(FlowArithUtil.getAnalysisAmount(flowAnalysis.getPayAmount(),flowAnalysis.getUserNums())); + flowAnalysis.setCustomerAmount(FlowArithUtil.getAnalysisAmount(flowAnalysis.getPayAmount(),flowAnalysis.getPayUser())); + flowAnalysisList.add(flowAnalysis); + } + return flowAnalysisList; + } + + /** + * 获取下一次循环的开始时间,以及设置后台显示的时间字符串 + * @param startTime 开始时间 + * @param type 时间类型 + * @return + */ + private Date getNextTime(Date startTime,Integer type){ + if (type.equals(FlowDateTypeEnum.WEEK.value())) { + //时间类型 2:自然周 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startTime); + //设置周一为每周的开始日期 + calendar.setFirstDayOfWeek(Calendar.MONDAY); + startTime = DateUtil.beginOfWeek(DateUtil.offsetWeek(startTime,1)); + }else if (type.equals(FlowDateTypeEnum.MONTH.value())){ + //时间类型 3:自然月 + startTime = DateUtil.beginOfMonth(DateUtil.offsetMonth(startTime,1)); + }else { + startTime = DateUtil.offsetDay(startTime, 1); + } + return startTime; + } + + /** + * 统计数据的增减比例 + * + * @param flowAnalysisVOList + */ + private FlowAnalysisVO calculateProportion(List flowAnalysisVOList) { + FlowAnalysisVO flowAnalysisVO; + FlowAnalysisVO oldFlowAnalysisVO; + if (flowAnalysisVOList.get(0).getDay().getTime() > flowAnalysisVOList.get(1).getDay().getTime()) { + flowAnalysisVO = flowAnalysisVOList.get(0); + oldFlowAnalysisVO = flowAnalysisVOList.get(1); + } else { + flowAnalysisVO = flowAnalysisVOList.get(1); + oldFlowAnalysisVO = flowAnalysisVOList.get(0); + } + FlowAnalysisRatioVO ratio = new FlowAnalysisRatioVO(); + flowAnalysisVO.setRatio(ratio); + //获取比例大小 + ratio.setUserNumsRatio(FlowArithUtil.getIncreaseRatio(flowAnalysisVO.getUserNums(), oldFlowAnalysisVO.getUserNums())); + ratio.setNewUserNumsRatio(FlowArithUtil.getIncreaseRatio(flowAnalysisVO.getNewUserNums(), oldFlowAnalysisVO.getNewUserNums())); + ratio.setLossUserRatio(FlowArithUtil.getIncreaseRatio(flowAnalysisVO.getLossUserRate(), oldFlowAnalysisVO.getLossUserRate())); + ratio.setVisitNumsRatio(FlowArithUtil.getIncreaseRatio(flowAnalysisVO.getVisitNums(), oldFlowAnalysisVO.getVisitNums())); + ratio.setAverageVisitNumsRatio(FlowArithUtil.getIncreaseRatio(flowAnalysisVO.getAverageVisitNums(), oldFlowAnalysisVO.getAverageVisitNums())); + ratio.setPlusShopCartUserRatio(FlowArithUtil.getIncreaseRatio(flowAnalysisVO.getPlusShopCartUser(), oldFlowAnalysisVO.getPlusShopCartUser())); + ratio.setPlaceOrderRatio(Arith.sub(flowAnalysisVO.getPlaceOrderRate(), oldFlowAnalysisVO.getPlaceOrderRate())); + ratio.setPlaceOrderUserRatio(FlowArithUtil.getIncreaseRatio(flowAnalysisVO.getPlaceOrderUser(), oldFlowAnalysisVO.getPayUser())); + ratio.setPayRatio(Arith.sub(flowAnalysisVO.getPayRate(), oldFlowAnalysisVO.getPayRate())); + ratio.setPayUserRatio(FlowArithUtil.getIncreaseRatio(flowAnalysisVO.getPayUser(), oldFlowAnalysisVO.getPayUser())); + return flowAnalysisVO; + } + + /** + * 获取用户比较上一段统计时间的开始时间 + * + * @param timeType 时间类型 + * @param startTime 当前统计数据的开始时间 + * @return 上一段统计时间的开始时间 + */ + public Date getOldStartTime(Integer timeType, Date startTime) { + FlowDateTypeEnum flowDateTypeEnum = FlowDateTypeEnum.instance(timeType); + return DateUtil.offsetDay(startTime, -flowDateTypeEnum.getNum()); + } + + private FlowAnalysisVO getNewFlowAnalysis() { + FlowAnalysisVO flowAnalysis = new FlowAnalysisVO(); + flowAnalysis.setUserNums(0); + flowAnalysis.setNewUserNums(0); + flowAnalysis.setVisitNums(0); + flowAnalysis.setAverageVisitNums(0.0D); + flowAnalysis.setLossUser(0); + flowAnalysis.setPlusShopCart(0); + flowAnalysis.setPlusShopCartUser(0); + flowAnalysis.setPlaceOrderUser(0); + flowAnalysis.setPayUser(0); + flowAnalysis.setPlaceOrderAmount(Constant.ZERO_LONG); + flowAnalysis.setPayAmount(Constant.ZERO_LONG); + flowAnalysis.setLossUserRate(0.0D); + flowAnalysis.setAverageVisitNums(0.0D); + flowAnalysis.setPayRate(0.0D); + flowAnalysis.setUvAmount(Constant.ZERO_LONG); + flowAnalysis.setPlaceOrderRate(0.0D); + flowAnalysis.setCustomerAmount(Constant.ZERO_LONG); + return flowAnalysis; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FlowUserMongoServiceImpl.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FlowUserMongoServiceImpl.java new file mode 100644 index 0000000..46d33af --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FlowUserMongoServiceImpl.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service.impl; + +import com.tmerclub.cloud.flow.bo.FlowLogBO; +import com.tmerclub.cloud.flow.service.FlowUserMongoService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 流量分析—用户访问数据 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +@Service +public class FlowUserMongoServiceImpl implements FlowUserMongoService { + + private static final Logger log = LoggerFactory.getLogger(FlowUserMongoServiceImpl.class); + + @Autowired + private MongoTemplate mongoTemplate; + + @Override + public Date getBeginDate() { + FlowLogBO flowLogBO = mongoTemplate.findOne(new Query().with(Sort.by(Sort.Direction.ASC, "_id")), FlowLogBO.class); + if (Objects.nonNull(flowLogBO)) { + return flowLogBO.getDt(); + } + return new Date(); + } + + @Override + public List getFlowLogByOrderIds(Integer pid, Long userId, String orderIds) { + Criteria criteria = Criteria.where("pid").is(pid) + .and("uid").is(userId) + .and("bid").is(Long.parseLong(orderIds)); + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + return mongoTemplate.find(query, FlowLogBO.class); + } + + @Override + public FlowLogBO getUserLastLog(Long userId) { + Query query = new Query(Criteria.where("userId").is(userId)); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + return mongoTemplate.findOne(query, FlowLogBO.class); + } + +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FormServiceImpl.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FormServiceImpl.java new file mode 100644 index 0000000..f5ef21d --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/FormServiceImpl.java @@ -0,0 +1,495 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateUtil; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.tmerclub.cloud.api.order.dto.FormExcelDTO; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.order.vo.FormExcelParamVO; +import com.tmerclub.cloud.common.cache.constant.FlowCacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.flow.constant.FlowDateTypeEnum; +import com.tmerclub.cloud.flow.constant.FormItemEnum; +import com.tmerclub.cloud.flow.dto.FormDTO; +import com.tmerclub.cloud.flow.mapper.FormMapper; +import com.tmerclub.cloud.flow.model.Form; +import com.tmerclub.cloud.flow.service.FormService; +import com.tmerclub.cloud.flow.vo.FormExcelVO; +import com.tmerclub.cloud.flow.vo.FormItemVO; +import com.tmerclub.cloud.flow.vo.FormVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 数据表格 + * + * @author TRACK + */ +@Service +public class FormServiceImpl implements FormService { + + @Autowired + private FormMapper formMapper; + @DubboReference + private OrderFeignClient orderFeignClient; + + @Override + public PageVO page(PageDTO pageDTO, FormDTO formParam) { + return PageUtil.doPage(pageDTO, () -> formMapper.list(formParam)); + } + + @Override + public Form getByFormId(Long formId) { + return formMapper.getByFormId(formId); + } + + @Override + public void save(Form form) { + formMapper.save(form); + } + + @Override + public void update(Form form) { + formMapper.update(form); + } + + @Override + public void deleteById(Long formId) { + formMapper.deleteById(formId); + } + + @Override + @Cacheable(cacheNames = FlowCacheNames.FORM_ITEM_KEY, key = "#type + '-' + #lang") + public List getFormItem(Integer type, Integer lang) { + //type 1:平台端 2:商家端 + //获取所有的枚举对象 + FormItemEnum[] formItemEnums = FormItemEnum.allEnum(); + FormItemVO formItem; + List formItemList = Lists.newArrayList(); + //把枚举的数据保存到集合中 + for (FormItemEnum formItemEnum : formItemEnums) { + if (formItemEnum.getType() == 0 || Objects.equals(formItemEnum.getType(), type)) { + formItem = new FormItemVO(); + formItem.setId(formItemEnum.value()); + formItem.setValue(Objects.equals(lang, LanguageEnum.LANGUAGE_ZH_CN.getLang()) ? formItemEnum.getName() : formItemEnum.getNameEn()); + formItemList.add(formItem); + } + } + return formItemList; + } + + @Override + public FormExcelParamVO getExcelParam(Form form) { + FormExcelParamVO formExcelParam = new FormExcelParamVO(); + formExcelParam.setShopId(form.getShopId()); + formExcelParam.setTimeType(form.getTimeType()); + setDefault(formExcelParam); + //设置开始/结束时间 + setTime(form, formExcelParam); + //获取报表列名称的集合 + Set formItemNameSet = new HashSet<>(Constant.INITIAL_CAPACITY); + //模板中选择的报表指标 + List formItemIdList = Lists.newArrayList(); + formItemNameSet.add("date"); + String[] formItemIds = form.getFormItemIds().split(","); + //根据报表模板中的指标数据,设置需要查询的参数和报表的列名 + for (String formItemId : formItemIds) { + setColumn(formExcelParam, formItemNameSet, formItemId, formItemIdList); + } + formExcelParam.setFormItemNames(formItemNameSet); + formExcelParam.setFormItemIdList(formItemIdList); + return formExcelParam; + } + + private void setDefault(FormExcelParamVO formExcelParam) { + formExcelParam.setOrderAmount(Boolean.FALSE); + formExcelParam.setOrderNums(Boolean.FALSE); + formExcelParam.setProductNums(Boolean.FALSE); + formExcelParam.setUserNums(Boolean.FALSE); + formExcelParam.setSelfOperatedAmount(Boolean.FALSE); + formExcelParam.setSelfOperatedOrderNums(Boolean.FALSE); + formExcelParam.setSelfOperatedProductNums(Boolean.FALSE); + formExcelParam.setSelfOperatedUserNums(Boolean.FALSE); + formExcelParam.setPayAmount(Boolean.FALSE); + formExcelParam.setPayOrderNums(Boolean.FALSE); + formExcelParam.setPayProductNums(Boolean.FALSE); + formExcelParam.setPayUserNums(Boolean.FALSE); + formExcelParam.setRefundAmount(Boolean.FALSE); + formExcelParam.setRefundOrderNums(Boolean.FALSE); + } + + private void setColumn(FormExcelParamVO formExcelParam, Set formItemNameSet, String idStr, List formItemIdList) { + int id = Integer.parseInt(idStr); + formItemIdList.add(id); + if (Objects.equals(FormItemEnum.CUSTOMER_UNIT_PRICE.value(), id)) { + //客单价 (支付金额/支付人数) + formExcelParam.setPayAmount(Boolean.TRUE); + formExcelParam.setPayUserNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.CUSTOMER_UNIT_PRICE.getColumnStr()); + } else if (FormItemEnum.TOTAL_TRANSACTION_AMOUNT.value() == id) { + formExcelParam.setPayAmount(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.TOTAL_TRANSACTION_AMOUNT.getColumnStr()); + } else if (FormItemEnum.SELF_OPERATED_CUSTOMER_UNIT_PRICE.value() == id) { + //自营客单价 (自营金额/自营下单人数) + formExcelParam.setSelfOperatedAmount(Boolean.TRUE); + formExcelParam.setSelfOperatedUserNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.SELF_OPERATED_CUSTOMER_UNIT_PRICE.getColumnStr()); + } else if (FormItemEnum.SELF_OPERATED_AMOUNT.value() == id) { + formExcelParam.setSelfOperatedAmount(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.SELF_OPERATED_AMOUNT.getColumnStr()); + } else if (FormItemEnum.SELF_OPERATED_ORDER_NUMS.value() == id) { + formExcelParam.setSelfOperatedOrderNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.SELF_OPERATED_ORDER_NUMS.getColumnStr()); + } else if (FormItemEnum.SELF_OPERATED_PRODUCT_NUMS.value() == id) { + formExcelParam.setSelfOperatedProductNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.SELF_OPERATED_PRODUCT_NUMS.getColumnStr()); + } else if (FormItemEnum.SELF_OPERATED_NUMS.value() == id) { + formExcelParam.setSelfOperatedUserNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.SELF_OPERATED_NUMS.getColumnStr()); + } else if (FormItemEnum.ORDER_AMOUNT.value() == id) { + formExcelParam.setOrderAmount(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.ORDER_AMOUNT.getColumnStr()); + } else if (FormItemEnum.USER_NUMS.value() == id) { + formExcelParam.setUserNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.USER_NUMS.getColumnStr()); + } else if (FormItemEnum.ORDER_NUMS.value() == id) { + formExcelParam.setOrderNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.ORDER_NUMS.getColumnStr()); + } else if (FormItemEnum.PRODUCT_NUMS.value() == id) { + formExcelParam.setProductNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.PRODUCT_NUMS.getColumnStr()); + } else if (FormItemEnum.PAY_AMOUNT.value() == id) { + formExcelParam.setPayAmount(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.PAY_AMOUNT.getColumnStr()); + } else if (FormItemEnum.PAY_USER_NUMS.value() == id) { + formExcelParam.setPayUserNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.PAY_USER_NUMS.getColumnStr()); + } else if (FormItemEnum.PAY_ORDER_NUMS.value() == id) { + formExcelParam.setPayOrderNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.PAY_ORDER_NUMS.getColumnStr()); + } else if (FormItemEnum.PAY_PRODUCT_NUMS.value() == id) { + formExcelParam.setPayProductNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.PAY_PRODUCT_NUMS.getColumnStr()); + } else if (FormItemEnum.SUCCESS_REFUND_AMOUNT.value() == id) { + formExcelParam.setRefundAmount(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.SUCCESS_REFUND_AMOUNT.getColumnStr()); + } else if (FormItemEnum.REFUND_ORDER_NUMS.value() == id) { + formExcelParam.setRefundOrderNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.REFUND_ORDER_NUMS.getColumnStr()); + } else if (FormItemEnum.ORDER_TO_PAY_RATE.value() == id) { + //下单-支付转化率 (支付订单数量/下单订单数量) + formExcelParam.setPayOrderNums(Boolean.TRUE); + formExcelParam.setOrderNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.ORDER_TO_PAY_RATE.getColumnStr()); + } else if (FormItemEnum.REFUND_RATE.value() == id) { + //退款率(退款订单数量/订单数量) + formExcelParam.setRefundOrderNums(Boolean.TRUE); + formExcelParam.setPayOrderNums(Boolean.TRUE); + formItemNameSet.add(FormItemEnum.REFUND_RATE.getColumnStr()); + } + } + + private void setTime(Form form, FormExcelParamVO formExcelParam) { + if (Objects.equals(form.getTimeFormat(), FlowDateTypeEnum.DAY.value())) { + // 自定义时间查询,直接set开始和结束时间 + if (Objects.equals(form.getTimeType(), FlowDateTypeEnum.DAY.value())) { + formExcelParam.setStartTime(DateUtil.beginOfDay(form.getStartTime())); + formExcelParam.setEndTime(DateUtil.endOfDay(form.getEndTime())); + } else if (Objects.equals(form.getTimeType(), FlowDateTypeEnum.WEEK.value())) { + formExcelParam.setStartTime(DateUtil.beginOfWeek(form.getStartTime())); + formExcelParam.setEndTime(DateUtil.endOfWeek(form.getEndTime())); + } else { + formExcelParam.setStartTime(DateUtil.beginOfMonth(form.getStartTime())); + formExcelParam.setEndTime(DateUtil.endOfMonth(form.getEndTime())); + } + } else { + //获取当天的开始时间 + Calendar calendar = DateUtil.beginOfDay(Calendar.getInstance()); + int timeRange = form.getTimeRange() - 1; + //当天开始时间减去报表模板的时间范围,得到报表数据的开始时间 + if (Objects.equals(formExcelParam.getTimeType(), FlowDateTypeEnum.DAY.value())) { + calendar.add(Calendar.DAY_OF_YEAR, -timeRange); + } else if (Objects.equals(formExcelParam.getTimeType(), FlowDateTypeEnum.WEEK.value())) { + //设置周一为每周的开始日期 + calendar.setFirstDayOfWeek(Calendar.MONDAY); + calendar.add(Calendar.WEEK_OF_YEAR, -timeRange); + //时间周期-周,开始时间为该周的周一 + calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + } else { + calendar.add(Calendar.MONTH, -timeRange); + //时间周期-月,开始时间为该月的1号 + calendar.set(Calendar.DAY_OF_MONTH, 1); + } + formExcelParam.setStartTime(calendar.getTime()); + //结束时间为当前时间 + formExcelParam.setEndTime(new Date()); + } + } + + @Override + public List listExcel(Form form, FormExcelParamVO formExcelParamVO) { + List mongoDataList = orderFeignClient.listFormExcelByParam(formExcelParamVO); + + mongoDataList.sort(Comparator.comparing(FormExcelDTO::getFormatTime)); + // 将数据转换为时间-数据格式 + Map formDateMap = mongoDataList.stream().collect(Collectors.toMap(FormExcelDTO::getFormatTime, formExcelDto -> formExcelDto)); + // 根据查询到的数据拼接为报表数据 + Date startTime = formExcelParamVO.getStartTime(); + List formExcelDtoList = new ArrayList<>(Constant.INITIAL_CAPACITY); + while (startTime.getTime() <= formExcelParamVO.getEndTime().getTime()) { + Map dateInfo = this.getDateInfoByTimeAndType(startTime, formExcelParamVO.getTimeType()); + FormExcelDTO formExcelDTO; + if (Objects.equals(formExcelParamVO.getTimeType(), FlowDateTypeEnum.DAY.value())) { + formExcelDTO = formDateMap.get((String) dateInfo.get("dateTime")); + } else { + formExcelDTO = formDateMap.get((String) dateInfo.get("weekOrMonth")); + } + if (Objects.isNull(formExcelDTO)) { + formExcelDTO = new FormExcelDTO(); + setDefaultInfo(formExcelDTO); + } + formExcelDTO.setFormatTime((String) dateInfo.get("dateTime")); + formExcelDtoList.add(formExcelDTO); + startTime = (Date) dateInfo.get("date"); + } + if (CollUtil.isEmpty(formExcelDtoList)) { + return new ArrayList<>(0); + } + List excelList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List formItemIdList = formExcelParamVO.getFormItemIdList(); + getExcelList(formExcelDtoList, excelList, formItemIdList); + return excelList; + } + + private void getExcelList(List formExcelDtoList, List excelList, List formItemIdList) { + for (FormExcelDTO formExcelDTO : formExcelDtoList) { + FormExcelVO formExcelVO = new FormExcelVO(); + formExcelVO.setDate(formExcelDTO.getFormatTime()); + long totalAmount = formExcelDTO.getPayAmount(); + if (Objects.nonNull(formExcelDTO.getPlatformAmount())) { + totalAmount += formExcelDTO.getPlatformAmount(); + } + if (formItemIdList.contains(FormItemEnum.TOTAL_TRANSACTION_AMOUNT.value())) { + formExcelVO.setTotalTransactionAmount(String.valueOf(Arith.div(totalAmount, 100))); + } + if (formItemIdList.contains(FormItemEnum.CUSTOMER_UNIT_PRICE.value())) { + //客单价 + double customerUnitPrice = Arith.div(Arith.div(totalAmount, formExcelDTO.getPayUserNums()), 100, 2); + formExcelVO.setCustomerUnitPrice(String.valueOf(customerUnitPrice)); + } + if (formItemIdList.contains(FormItemEnum.SELF_OPERATED_CUSTOMER_UNIT_PRICE.value())) { + //自营客单价 (自营金额/自营下单人数) + double selfCustomerUnitPrice = Arith.div(Arith.div(formExcelDTO.getSelfOperatedAmount(), formExcelDTO.getSelfOperatedUserNums()), 100, 2); + formExcelVO.setSelfCustomerUnitPrice(String.valueOf(selfCustomerUnitPrice)); + } + if (formItemIdList.contains(FormItemEnum.SELF_OPERATED_AMOUNT.value())) { + formExcelVO.setSelfAmount(String.valueOf(Arith.div(formExcelDTO.getSelfOperatedAmount(), 100))); + } + if (formItemIdList.contains(FormItemEnum.SELF_OPERATED_ORDER_NUMS.value())) { + formExcelVO.setSelfOrders(formExcelDTO.getSelfOperatedOrderNums()); + } + if (formItemIdList.contains(FormItemEnum.SELF_OPERATED_PRODUCT_NUMS.value())) { + formExcelVO.setSelfProducts(formExcelDTO.getSelfOperatedProductNums()); + } + if (formItemIdList.contains(FormItemEnum.SELF_OPERATED_NUMS.value())) { + formExcelVO.setSelfNums(formExcelDTO.getSelfOperatedUserNums()); + } + if (formItemIdList.contains(FormItemEnum.ORDER_AMOUNT.value())) { + formExcelVO.setOrderAmount(String.valueOf(Arith.div(formExcelDTO.getOrderAmount(), 100))); + } + if (formItemIdList.contains(FormItemEnum.USER_NUMS.value())) { + formExcelVO.setPeopleOrderNums(formExcelDTO.getUserNums()); + } + if (formItemIdList.contains(FormItemEnum.ORDER_NUMS.value())) { + formExcelVO.setOrderNums(formExcelDTO.getOrderNums()); + } + if (formItemIdList.contains(FormItemEnum.PRODUCT_NUMS.value())) { + formExcelVO.setOrderProducts(formExcelDTO.getProductNums()); + } + if (formItemIdList.contains(FormItemEnum.PAY_AMOUNT.value())) { + formExcelVO.setPaymentAmount(String.valueOf(Arith.div(formExcelDTO.getPayAmount(), 100))); + } + if (formItemIdList.contains(FormItemEnum.PAY_USER_NUMS.value())) { + formExcelVO.setPayPeopleNums(formExcelDTO.getPayUserNums()); + } + if (formItemIdList.contains(FormItemEnum.PAY_ORDER_NUMS.value())) { + formExcelVO.setPayOrderNums(formExcelDTO.getPayOrderNums()); + } + if (formItemIdList.contains(FormItemEnum.PAY_PRODUCT_NUMS.value())) { + formExcelVO.setPayProductNums(formExcelDTO.getPayProductNums()); + } + if (formItemIdList.contains(FormItemEnum.SUCCESS_REFUND_AMOUNT.value())) { + formExcelVO.setSuccessRefundAmount(String.valueOf(Arith.div(formExcelDTO.getRefundAmount(), 100))); + } + if (formItemIdList.contains(FormItemEnum.REFUND_ORDER_NUMS.value())) { + formExcelVO.setRefundOrderNums(formExcelDTO.getRefundOrderNums()); + } + if (formItemIdList.contains(FormItemEnum.ORDER_TO_PAY_RATE.value())) { + //下单-支付转化率 (支付订单数量/下单订单数量) + double orderPayRate; + orderPayRate = Arith.div(Arith.mul(Arith.div(formExcelDTO.getPayOrderNums(), formExcelDTO.getOrderNums()), 100), 100, 2); + formExcelVO.setOrderPaymentRate(String.valueOf(orderPayRate)); + } + if (formItemIdList.contains(FormItemEnum.REFUND_RATE.value())) { + //退款率 + double refundRate = Arith.div((long) Arith.mul(Arith.div(formExcelDTO.getRefundOrderNums(), formExcelDTO.getPayOrderNums()), 100), 100, 2); + formExcelVO.setRefundRate(String.valueOf(refundRate)); + } + excelList.add(formExcelVO); + } + } + + private Map getDateInfoByTimeAndType(Date time, Integer type) { + //date : 下次循环的开始时间 + //day/weekOrMonth :用于map对象获取数据时,所需的key的值 + //dateTime : 时间格式化后,在报表中显示的时间数据(报表第一列的时间字符串) + Map map = Maps.newHashMap(); + if (Objects.equals(type, FlowDateTypeEnum.DAY.value())) { + //时间周期:日 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + map.put("day", time); + map.put("date", DateUtil.offset(time, DateField.DAY_OF_MONTH, 1)); + map.put("dateTime", simpleDateFormat.format(time)); + } else if (Objects.equals(type, FlowDateTypeEnum.WEEK.value())) { + //时间周期:周 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Calendar calendar = Calendar.getInstance(); + //设置周的开始时间为周一 + calendar.setFirstDayOfWeek(Calendar.MONDAY); + calendar.setTime(time); + calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + calendar.set(Calendar.HOUR_OF_DAY, 0); + // 获取该周,周一零时的时间(周的开始时间) + Date mondayTime = calendar.getTime(); + //把开始时间由该周一切换成下周一,为下次循环的周一时间 + map.put("date", DateUtil.offset(mondayTime, DateField.DAY_OF_MONTH, 7)); + String dateTime; + if (time.getTime() > mondayTime.getTime()) { + dateTime = simpleDateFormat.format(time); + } else { + dateTime = simpleDateFormat.format(mondayTime); + } + //设置周的结束时间为周日 + calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); + //周的开始时间与结束时间拼接 + dateTime = dateTime + "~" + simpleDateFormat.format(calendar.getTime()); + map.put("weekOrMonth", calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.WEEK_OF_YEAR) <= 10 ? ("0" + (calendar.get(Calendar.WEEK_OF_YEAR) - 1)) : (calendar.get(Calendar.WEEK_OF_YEAR) - 1))); + map.put("dateTime", dateTime); + } else if (Objects.equals(type, FlowDateTypeEnum.MONTH.value())) { + //时间周期:月 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM"); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(time); + calendar.set(Calendar.DAY_OF_MONTH, 1); + String date = simpleDateFormat.format(calendar.getTime()); + calendar.add(Calendar.MONTH, 1); + map.put("date", calendar.getTime()); + map.put("weekOrMonth", date); + map.put("dateTime", date); + } + return map; + } + + private void setDefaultInfo(FormExcelDTO info) { + if (Objects.isNull(info.getOrderAmount())) { + info.setOrderAmount(0L); + } + if (Objects.isNull(info.getOrderNums())) { + info.setOrderNums(0); + } + if (Objects.isNull(info.getProductNums())) { + info.setProductNums(0); + } + if (Objects.isNull(info.getUserNums())) { + info.setUserNums(0); + } + if (Objects.isNull(info.getSelfOperatedAmount())) { + info.setSelfOperatedAmount(0L); + } + if (Objects.isNull(info.getSelfOperatedOrderNums())) { + info.setSelfOperatedOrderNums(0); + } + if (Objects.isNull(info.getSelfOperatedProductNums())) { + info.setSelfOperatedProductNums(0); + } + if (Objects.isNull(info.getSelfOperatedUserNums())) { + info.setSelfOperatedUserNums(0); + } + if (Objects.isNull(info.getPayAmount())) { + info.setPayAmount(0L); + } + if (Objects.isNull(info.getPayOrderNums())) { + info.setPayOrderNums(0); + } + if (Objects.isNull(info.getPayProductNums())) { + info.setPayProductNums(0); + } + if (Objects.isNull(info.getPayUserNums())) { + info.setPayUserNums(0); + } + if (Objects.isNull(info.getRefundAmount())) { + info.setRefundAmount(0L); + } + if (Objects.isNull(info.getRefundOrderNums())) { + info.setRefundOrderNums(0); + } + } + + @Override + @Cacheable(cacheNames = FlowCacheNames.FORM_RECOMMEND_LIST_KEY, key = "'recommendFormList'") + public List getRecommendFormList() { + FormDTO formDTO = new FormDTO(); + formDTO.setRecommendForm(Boolean.TRUE); + List list = formMapper.list(formDTO); + List formList = BeanUtil.mapAsList(list, FormVO.class); + FormServiceImpl formService = (FormServiceImpl) AopContext.currentProxy(); + List formItem = formService.getFormItem(2, I18nMessage.getLang()); + Map formItemMap = formItem.stream().collect(Collectors.toMap(FormItemVO::getId, formItemNew -> formItemNew)); + List formItemList; + for (FormVO form : formList) { + formItemList = Lists.newArrayList(); + for (String id : form.getFormItemIds().split(Constant.COMMA)) { + formItemList.add(formItemMap.get(Integer.valueOf(id))); + } + form.setFormItemList(formItemList); + } + return formList; + } + + @Override + public PageVO getRecommendFormPage(PageDTO page, FormDTO form) { + form.setRecommendForm(Boolean.TRUE); + return PageUtil.doPage(page, () -> formMapper.list(form)); + } + + @Override + @CacheEvict(cacheNames = FlowCacheNames.FORM_RECOMMEND_LIST_KEY, key = "'recommendFormList'") + public void removeCache() { + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/ProductAnalyseServiceImpl.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/ProductAnalyseServiceImpl.java new file mode 100644 index 0000000..5839328 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/ProductAnalyseServiceImpl.java @@ -0,0 +1,437 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.order.dto.FlowOrderItemDTO; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderRefundFeignClient; +import com.tmerclub.cloud.api.order.vo.FlowOrderItemVO; +import com.tmerclub.cloud.api.product.dto.ProdEffectDTO; +import com.tmerclub.cloud.api.product.feign.ProductFeignClient; +import com.tmerclub.cloud.api.product.vo.ProdEffectRespVO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.AnalysisUtil; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.DateUtils; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.common.vo.DateVO; +import com.tmerclub.cloud.flow.bo.FlowSpuBO; +import com.tmerclub.cloud.flow.bo.FlowSpuUserBO; +import com.tmerclub.cloud.flow.constant.FlowDateTypeEnum; +import com.tmerclub.cloud.flow.dto.SingleProdTrendDTO; +import com.tmerclub.cloud.flow.service.ProductAnalyseService; +import com.tmerclub.cloud.flow.service.SpuAnalyseMongoService; +import com.tmerclub.cloud.flow.util.FlowUtil; +import com.tmerclub.cloud.flow.vo.FlowProdEffectDataExcelVO; +import com.tmerclub.cloud.flow.vo.ProductFlowInfoVO; +import com.tmerclub.cloud.flow.vo.ShopFlowInfoVO; +import com.tmerclub.cloud.flow.vo.SingleProdTrendVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + + +/** + * 流量分析—商品分析 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +@Service +public class ProductAnalyseServiceImpl implements ProductAnalyseService { + private static final Logger LOG = LoggerFactory.getLogger(ProductAnalyseServiceImpl.class); + + @Autowired + private SpuAnalyseMongoService spuAnalyseMongoService; + @Autowired + private MongoTemplate mongoTemplate; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + @DubboReference + private ProductFeignClient productFeignClient; + @DubboReference + private OrderRefundFeignClient orderRefundFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private UserFeignClient userFeignClient; + + @Override + public PageVO getProductEffect(PageDTO pageDTO, ProdEffectDTO prodEffectDTO) { + FlowUtil.handleTime(prodEffectDTO); + // 今日实时- 两分钟统计一次,统计后再查询 + if (Objects.equals(prodEffectDTO.getDateType(), FlowDateTypeEnum.REAL_TIME.value())) { + LOG.info("商品洞察-今日实时-统计商品数据"); + spuAnalyseMongoService.statisticsRealSpuData(); + } + + // 查询商品列表 + PageVO spuPage = spuAnalyseMongoService.pageSpuEffect(pageDTO, prodEffectDTO); + + PageVO prodEffectRespPage = new PageVO<>(); + prodEffectRespPage.setTotal(spuPage.getTotal()); + prodEffectRespPage.setPages(spuPage.getPages()); + List prodEffectRespList = new ArrayList<>(spuPage.getList().size()); + prodEffectRespPage.setList(prodEffectRespList); + if (CollUtil.isEmpty(spuPage.getList())) { + LOG.info("商品洞察-商品数据为空"); + return prodEffectRespPage; + } + + // 查询商品信息 + LOG.info("商品洞察-查询商品信息"); + List spuIds = spuPage.getList().stream().map(FlowSpuBO::getSpuId).collect(Collectors.toList()); + ServerResponseEntity> spuResponseEntity = searchSpuFeignClient.listSpuBySpuIds(spuIds); + Map spuMap = spuResponseEntity.getData().stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, s -> s)); + + for (FlowSpuBO flowSpuBO : spuPage.getList()) { + ProdEffectRespVO prodEffectRespVO = this.getProdEffectRespVO(flowSpuBO); + // 商品信息 + if (spuMap.containsKey(flowSpuBO.getSpuId())) { + SpuSearchVO spuSearchVO = spuMap.get(flowSpuBO.getSpuId()); + prodEffectRespVO.setSpuName(spuSearchVO.getSpuName()); + prodEffectRespVO.setSpuUrl(spuSearchVO.getMainImgUrl()); + prodEffectRespVO.setPrice(spuSearchVO.getPriceFee()); + prodEffectRespVO.setShopName(spuSearchVO.getShopName()); + } + prodEffectRespList.add(prodEffectRespVO); + } + return prodEffectRespPage; + } + + @Override + public List listProdEffectExcel(PageDTO pageDTO, ProdEffectDTO prodEffectDTO) { + PageVO productEffect = getProductEffect(pageDTO, prodEffectDTO); + List excelList = BeanUtil.mapAsList(productEffect.getList(), FlowProdEffectDataExcelVO.class); + for (FlowProdEffectDataExcelVO prodEffectData : excelList) { + prodEffectData.setPrice(PriceUtil.toDecimalPrice(prodEffectData.getPrice()).longValue()); + prodEffectData.setPlaceOrderAmount(PriceUtil.toDecimalPrice(prodEffectData.getPlaceOrderAmount().longValue()).doubleValue()); + prodEffectData.setPayAmount(PriceUtil.toDecimalPrice(prodEffectData.getPayAmount().longValue()).doubleValue()); + prodEffectData.setRefundSuccessAmount(PriceUtil.toDecimalPrice(prodEffectData.getRefundSuccessAmount().longValue()).doubleValue()); + } + return excelList; + } + + @Override + public List listShopRankIngByFlow(DateTime endTime, Integer dayCount, Integer limit) { + Date startTime = DateUtils.getBeforeDay(endTime, -dayCount); + List shopFlowInfoVOList = spuAnalyseMongoService.listShopRankIngByFlow(startTime, endTime, limit); + if (CollUtil.isEmpty(shopFlowInfoVOList)) { + return shopFlowInfoVOList; + } + List shopIds = shopFlowInfoVOList.stream().map(ShopFlowInfoVO::getShopId).collect(Collectors.toList()); + ServerResponseEntity> listServerResponseEntity = shopDetailFeignClient.listByShopIds(shopIds); + if (!listServerResponseEntity.isSuccess()) { + throw new LuckException(listServerResponseEntity.getMsg()); + } + if (CollUtil.isEmpty(listServerResponseEntity.getData())) { + return new ArrayList<>(0); + } + // 赋值店铺名称 + Map shopDetailMap = listServerResponseEntity.getData().stream().collect(Collectors.toMap(ShopDetailVO::getShopId, p -> p)); + Iterator iterator = shopFlowInfoVOList.iterator(); + while (iterator.hasNext()) { + ShopFlowInfoVO shopFlowInfoVO = iterator.next(); + if (Objects.isNull(shopDetailMap.get(shopFlowInfoVO.getShopId()))) { + iterator.remove(); + continue; + } + shopFlowInfoVO.setShopName(shopDetailMap.get(shopFlowInfoVO.getShopId()).getShopName()); + } + return shopFlowInfoVOList; + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteSpuDataBySpuId(Long spuId) { + if (Objects.isNull(spuId)) { + return; + } + Query query = new Query(Criteria.where("spuId").is(spuId)); + mongoTemplate.remove(query, FlowSpuUserBO.class); + mongoTemplate.remove(query, FlowSpuBO.class); + } + + @Override + public ShopFlowInfoVO getSupplierFlowInfoAndProdRankIng(Integer dayCount, Integer limit) { + Long supplierId = AuthUserContext.get().getTenantId(); + DateTime endTime = DateUtil.offsetDay(DateUtil.beginOfDay(DateUtil.date()), 1); + + // 商品浏览量 + ShopFlowInfoVO shopFlowInfo = this.getSupplierFlowInfo(supplierId); + // 商品访客榜单 + shopFlowInfo.setProdRanking(this.listSupplierProdRankIngByFlow(supplierId, DateUtil.offsetDay(endTime, -dayCount), endTime, limit)); + return shopFlowInfo; + } + + @Override + public List getSingleProdTend(SingleProdTrendDTO singleProdTrendDTO) { + if (Objects.isNull(singleProdTrendDTO.getSpuId())) { + throw new LuckException("趋势图商品id不能为空"); + } + if (Objects.isNull(singleProdTrendDTO.getStartTime()) + || Objects.isNull(singleProdTrendDTO.getEndTime())) { + throw new LuckException("趋势图筛选时间不能为空"); + } + // 获取时间范围内对应spuId的流量数据 + Long startId = this.getFlowSpuId(singleProdTrendDTO.getStartTime(), false); + Long endId = this.getFlowSpuId(singleProdTrendDTO.getEndTime(), true); + Query spuFlowQuery = new Query(Criteria.where("spuId").is(singleProdTrendDTO.getSpuId()) + .and("dateType").is(FlowDateTypeEnum.DAY.value()) + .and("_id").gte(startId).lt(endId)); + spuFlowQuery = spuFlowQuery.with(Sort.by(Sort.Direction.ASC, "_id")); + LOG.info("listSpuFlow查询语句为: {}", spuFlowQuery); + List flowSpus = mongoTemplate.find(spuFlowQuery, FlowSpuBO.class); + // 获取时间范围内对应spuId的订单数据 + FlowOrderItemDTO flowOrderItemDTO = new FlowOrderItemDTO(); + BeanUtils.copyProperties(singleProdTrendDTO, flowOrderItemDTO); + List flowOrderItems = orderFeignClient.listFlowOrderItems(flowOrderItemDTO); + // 统计时间范围内每日数据 + List days = DateUtils.findEveryDays(singleProdTrendDTO.getStartTime(), singleProdTrendDTO.getEndTime()); + int flowSpuIdx = 0; + int flowOrderItemIdx = 0; + SingleProdTrendVO singleProdTrendVO; + List singleProdTrendVOList = new ArrayList<>(days.size()); + for (DateVO dateVO : days) { + singleProdTrendVO = new SingleProdTrendVO(); + singleProdTrendVO.setCurrentDay(DateUtils.dateToStrYmd(dateVO.getStartTime())); + // 统计访客量,浏览量 + flowSpuIdx = this.statisticsSingleProdFlowTrend(singleProdTrendVO, dateVO, flowSpus, flowSpuIdx); + // 统计支付人数,支付商品件数 + flowOrderItemIdx = this.statisticsSingleProdOrderTrend(singleProdTrendVO, dateVO, flowOrderItems, flowOrderItemIdx); + singleProdTrendVOList.add(singleProdTrendVO); + } + return singleProdTrendVOList; + } + + private ProdEffectRespVO getProdEffectRespVO(FlowSpuBO flowSpuBO) { + ProdEffectRespVO prodEffectRespVO = new ProdEffectRespVO(); + prodEffectRespVO.setSpuId(flowSpuBO.getSpuId()); + if (Objects.nonNull(flowSpuBO.getVisit())) { + prodEffectRespVO.setExpose(flowSpuBO.getVisit()); + } + if (Objects.nonNull(flowSpuBO.getVisitUser())) { + prodEffectRespVO.setExposePersonNum(flowSpuBO.getVisitUser()); + } + if (Objects.nonNull(flowSpuBO.getPlusShopCartUser())) { + prodEffectRespVO.setAddCartPerson(flowSpuBO.getPlusShopCartUser()); + } + if (Objects.nonNull(flowSpuBO.getPlusShopCart())) { + prodEffectRespVO.setAddCart(flowSpuBO.getPlusShopCart()); + } + if (Objects.nonNull(flowSpuBO.getPlaceOrderUser())) { + prodEffectRespVO.setPlaceOrderPerson(flowSpuBO.getPlaceOrderUser()); + } + if (Objects.nonNull(flowSpuBO.getPayUser())) { + prodEffectRespVO.setPayPerson(flowSpuBO.getPayUser()); + } + if (Objects.nonNull(flowSpuBO.getPlaceOrderNum())) { + prodEffectRespVO.setPlaceOrderNum(flowSpuBO.getPlaceOrderNum()); + } + if (Objects.nonNull(flowSpuBO.getPayNum())) { + prodEffectRespVO.setPayNum(flowSpuBO.getPayNum()); + } + if (Objects.nonNull(flowSpuBO.getPlaceOrderAmount())) { + prodEffectRespVO.setPlaceOrderAmount(PriceUtil.toDoublePrice(flowSpuBO.getPlaceOrderAmount())); + } + if (Objects.nonNull(flowSpuBO.getPayAmount())) { + prodEffectRespVO.setPayAmount(PriceUtil.toDoublePrice(flowSpuBO.getPayAmount())); + } + if (Objects.nonNull(flowSpuBO.getApplyRefundOrder())) { + prodEffectRespVO.setRefundNum(flowSpuBO.getApplyRefundOrder()); + } + if (Objects.nonNull(flowSpuBO.getApplyRefundUser())) { + prodEffectRespVO.setRefundPerson(flowSpuBO.getApplyRefundUser()); + } + if (Objects.nonNull(flowSpuBO.getSuccessRefundOrder())) { + prodEffectRespVO.setRefundSuccessNum(flowSpuBO.getSuccessRefundOrder()); + } + if (Objects.nonNull(flowSpuBO.getSuccessRefundUser())) { + prodEffectRespVO.setRefundSuccessPerson(flowSpuBO.getSuccessRefundUser()); + } + if (Objects.nonNull(flowSpuBO.getSuccessRefundAmount())) { + prodEffectRespVO.setRefundSuccessAmount(PriceUtil.toDoublePrice(flowSpuBO.getSuccessRefundAmount())); + } + if (Objects.nonNull(flowSpuBO.getRefundRate())) { + prodEffectRespVO.setRefundSuccessRate(flowSpuBO.getRefundRate()); + } + return prodEffectRespVO; + } + + /** + * 获取供应商商品访问流量排行榜 + * + * @param supplierId 供应商id + * @param startTime 代销商品列表 + * @param endTime 结束时间 + * @param limit 条数 + * @return + */ + public List listSupplierProdRankIngByFlow(Long supplierId, Date startTime, Date endTime, Integer limit) { + + List sortedProductFlowInfoVOList = spuAnalyseMongoService.listSupplierProdRankIngByFlow(startTime, endTime, supplierId); + + List spuIdList = sortedProductFlowInfoVOList.stream().map(ProductFlowInfoVO::getSpuId).collect(Collectors.toList()); + + // 获取商品的名称和图片信息 + ServerResponseEntity> spuResponseEntity = searchSpuFeignClient.listSpuBySpuIds(spuIdList); + if (!spuResponseEntity.isSuccess()) { + throw new LuckException(spuResponseEntity.getMsg()); + } + List spuSearchVOList = spuResponseEntity.getData(); + Map spuSearchMap = spuSearchVOList.stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, spuSearchVO -> spuSearchVO)); + + List resultProductFlowList = new ArrayList<>(limit); + for (ProductFlowInfoVO productFlowInfoVO : sortedProductFlowInfoVOList) { + if (Objects.nonNull(spuSearchMap.get(productFlowInfoVO.getSpuId()))) { + productFlowInfoVO.setSpuName(spuSearchMap.get(productFlowInfoVO.getSpuId()).getSpuName()); + productFlowInfoVO.setSpuImg(spuSearchMap.get(productFlowInfoVO.getSpuId()).getMainImgUrl()); + productFlowInfoVO.setPayRate(AnalysisUtil.divAverage(productFlowInfoVO.getPayUserCount().intValue(), productFlowInfoVO.getVisitUserCount().intValue(), 4)); + resultProductFlowList.add(productFlowInfoVO); + } + } + return resultProductFlowList; + } + + /** + * 获取供应商店铺今天商品浏览量和新老访客数量,代销商品的总流量等于供应商的流量 + * + * @param supplierId 供应商Id + * @return + */ + public ShopFlowInfoVO getSupplierFlowInfo(Long supplierId) { + Date startTime = DateUtil.beginOfDay(new Date()); + Long todayProductVisitCount = spuAnalyseMongoService.countProductVisitCount(startTime, DateUtil.offsetDay(startTime, 1), supplierId); + Long yesterdayProductVisitCount = spuAnalyseMongoService.countProductVisitCount(DateUtil.beginOfDay(DateUtil.yesterday()), startTime, supplierId); + + ShopFlowInfoVO shopFlowInfoVO = new ShopFlowInfoVO(); + shopFlowInfoVO.setVisitCount(Objects.isNull(todayProductVisitCount) ? 0 : todayProductVisitCount); + shopFlowInfoVO.setYesterdayVisitCount(Objects.isNull(yesterdayProductVisitCount) ? 0 : yesterdayProductVisitCount); + + startTime = DateUtil.offsetDay(DateUtil.beginOfDay(DateUtil.date()), -9); + DateTime endTime = DateUtil.endOfDay(DateUtil.date()); + + ShopFlowInfoVO shopUserIds = spuAnalyseMongoService.countVisitUserInPastTenDays(startTime, endTime, supplierId); + shopFlowInfoVO.setVisitUserCount(shopUserIds.getVisitUserCount()); + shopFlowInfoVO.setNewVisitUserCount(shopUserIds.getNewVisitUserCount()); + shopFlowInfoVO.setOldVisitUserCount(shopUserIds.getOldVisitUserCount()); + return shopFlowInfoVO; + } + + /** + * 获取flowSpu类Id + * @param date 日期 + * @param isEnd 是否为结束日期 + * @return flowSpuId + */ + private Long getFlowSpuId(Date date, boolean isEnd) { + // flowSpuId只包含年月日,不包含时分秒,如果是结束时间,需要额外加1天,id才正确 + if (isEnd) { + date = DateUtils.getBeforeDay(date, 1); + } + return FlowUtil.stringToId(FlowUtil.dateToString(date) + FlowDateTypeEnum.DAY.value(), FlowSpuBO.ID_LENGTH); + } + + /** + * 统计单商品流量趋势 + * @param singleProdTrendVO 单商品流量趋势 + * @param dateVO 时间间隔 + * @param flowSpus 商品流量集合(有序集合,按id升序) + * @param flowSpuIdx 商品流量下标 + * @return 商品流量下标 + */ + private int statisticsSingleProdFlowTrend(SingleProdTrendVO singleProdTrendVO, + DateVO dateVO, + List flowSpus, + int flowSpuIdx) { + int visitor = 0; + long browse = 0L; + if (CollectionUtils.isEmpty(flowSpus)) { + singleProdTrendVO.setVisitor(visitor); + singleProdTrendVO.setBrowse(browse); + return flowSpuIdx; + } + // 数据统计 + Long endId = this.getFlowSpuId(dateVO.getEndTime(), true); + FlowSpuBO flowSpuBO; + for ( ; flowSpuIdx endId) { + break; + } + visitor += Objects.isNull(flowSpuBO.getVisitUser()) ? 0 : flowSpuBO.getVisitUser(); + browse += Objects.isNull(flowSpuBO.getVisit()) ? 0L : flowSpuBO.getVisit(); + } + singleProdTrendVO.setVisitor(visitor); + singleProdTrendVO.setBrowse(browse); + return flowSpuIdx; + } + + /** + * 统计单商品订单趋势 + * @param singleProdTrendVO 单商品流量趋势 + * @param dateVO 时间间隔 + * @param flowOrderItems 订单商品集合(有序集合,按payTime升序) + * @param flowOrderItemIdx 订单商品下标 + * @return 订单商品下标 + */ + private int statisticsSingleProdOrderTrend(SingleProdTrendVO singleProdTrendVO, + DateVO dateVO, + List flowOrderItems, + int flowOrderItemIdx) { + int payPerson = 0; + int payNum = 0; + if (CollectionUtils.isEmpty(flowOrderItems)) { + singleProdTrendVO.setPayPerson(payPerson); + singleProdTrendVO.setPayNum(payNum); + return flowOrderItemIdx; + } + // 数据统计 + FlowOrderItemVO flowOrderItem; + for ( ; flowOrderItemIdx 0) { + break; + } + payPerson ++; + payNum += Objects.isNull(flowOrderItem.getCount()) ? 0 : flowOrderItem.getCount(); + } + singleProdTrendVO.setPayPerson(payPerson); + singleProdTrendVO.setPayNum(payNum); + return flowOrderItemIdx; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/SystemAnalyseMongoServiceImpl.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/SystemAnalyseMongoServiceImpl.java new file mode 100644 index 0000000..186094f --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/SystemAnalyseMongoServiceImpl.java @@ -0,0 +1,574 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.flow.bo.FlowSystemBO; +import com.tmerclub.cloud.flow.bo.FlowSystemUserBO; +import com.tmerclub.cloud.flow.constant.FlowDateTypeEnum; +import com.tmerclub.cloud.flow.constant.SystemTypeEnum; +import com.tmerclub.cloud.flow.service.SystemAnalyseMongoService; +import com.tmerclub.cloud.flow.util.FlowUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 流量分析—用户访问数据 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +@Service +public class SystemAnalyseMongoServiceImpl implements SystemAnalyseMongoService { + + private static final Logger LOG = LoggerFactory.getLogger(SystemAnalyseMongoServiceImpl.class); + + @Autowired + private MongoTemplate mongoTemplate; + + private final static String[] SYSTEM_TYPE = {"全部", "PC", "H5", "微信小程序", "安卓", "IOS"}; + + @Override + public void statisticsAndSaveSystemOfDay(Date beginDate, Date endDate) { + List systemAnalyseList = this.listRealTimeStatistics(beginDate, endDate, null); + + // 统计的数据批量保存到flow_system + this.batchInsertFlowSystemBO(FlowDateTypeEnum.DAY.value(), beginDate, endDate, systemAnalyseList); + } + @Override + public List listRealTimeStatistics(Date beginDate, Date endDate, Integer systemType) { + // 没有传时间,默认为当天的开始和结束时间 + if (Objects.isNull(beginDate) || Objects.isNull(endDate)) { + beginDate = DateUtil.beginOfDay(new Date()); + endDate = DateUtil.offsetDay(beginDate, 1); + } + List flowSystemList = new ArrayList<>(); + // 统计整个商城的数据 + if (Objects.isNull(systemType) || Objects.equals(SystemTypeEnum.ALL.value(), systemType)) { + // flow_user_log中统计各个端的数据(6条) + // 总数据使用flow_user_log和订单来统计 + FlowSystemBO flowSystemBO = this.getALLSystemAnalyseBO(beginDate, endDate); + this.handleSystemOrder(flowSystemBO, beginDate, endDate); + if (Objects.nonNull(flowSystemBO.getSystemType())) { + flowSystemList.add(flowSystemBO); + } + } + + // 统计各个端或者指定端的数据 + if (Objects.isNull(systemType) || !Objects.equals(SystemTypeEnum.ALL.value(), systemType)) { + // 指定端的数据则用flow_user_log统计 + List systemAnalyseList = this.listSystemAnalyse(beginDate, endDate, systemType); + systemAnalyseList = this.handleSystemOrderList(systemAnalyseList, beginDate, endDate, systemType); + + if (CollUtil.isNotEmpty(systemAnalyseList)) { + flowSystemList.addAll(systemAnalyseList); + } + } + + // 设置数据的时间 + for (FlowSystemBO flowSystemBO : flowSystemList) { + flowSystemBO.setCreateTime(beginDate); + } + + // 合并数据 + return flowSystemList; + } + + @Override + public void statisticsAndSaveSystemOfTime(int dateType, Date beginDate, Date endDate) { + // flow_user_log中统计各个端的数据(6条) + // 总数据使用flow_system和flow_system_user来统计 + + List flowSystemBOList = this.statisticsSystemTypeListOfTime(beginDate, endDate, null); + if (flowSystemBOList == null) { + return; + } + this.batchInsertFlowSystemBO(dateType, beginDate, endDate, flowSystemBOList); + } + + + @Override + public List statisticsSystemTypeListOfTime(Date beginDate, Date endDate, Integer systemType) { + // 系统类型、浏览量、下单金额、支付金额 + Long beginId = FlowUtil.timeToId(beginDate, FlowSystemBO.ID_LENGTH); + Long endId = FlowUtil.timeToId(endDate, FlowSystemBO.ID_LENGTH); + Criteria criteria = Criteria.where("_id").gte(beginId).lt(endId) + .and("dateType").is(FlowDateTypeEnum.DAY.value()); + + if (systemType != null) { + criteria.and("systemType").is(systemType); + } + + MatchOperation matchOperation = Aggregation.match(criteria); + + String[] fields; + if (Objects.isNull(systemType)) { + fields = new String[]{"systemType"}; + } else { + fields = new String[0]; + } + + GroupOperation groupOperation = Aggregation.group(fields) + .first("systemType").as("systemType") + .sum("visit").as("visit") + .sum("placeOrderAmount").as("placeOrderAmount") + .sum("payAmount").as("payAmount"); + + TypedAggregation typedAggregation = Aggregation.newAggregation ( + FlowSystemBO.class, + matchOperation, + groupOperation + ); + LOG.info("statisticsSystemTypeListOfTime:typedAggregation={}", typedAggregation); + + List flowSystemBOList = mongoTemplate + .aggregate(typedAggregation, FlowSystemBO.class) + .getMappedResults(); + + if (CollUtil.isEmpty(flowSystemBOList)) { + return new ArrayList<>(); + } else { + flowSystemBOList = new ArrayList<>(flowSystemBOList); + } + + for (FlowSystemBO flowSystemBO : flowSystemBOList) { + flowSystemBO.setCreateTime(beginDate); + } + + // 加购人数、访客数、新访客数、跳失人数、下单人数、支付人数 + return statisticsSystemUserListOfTime(beginDate, endDate, systemType, flowSystemBOList); + } + + @Override + public List listFlowSystemByDateTypeAndSystemType(Date startTime, Date endTiem, Integer dateType, Integer systemType) { + Long startId = FlowUtil.timeToId(startTime, FlowSystemBO.ID_LENGTH); + Long endId = FlowUtil.timeToId(endTiem, FlowSystemBO.ID_LENGTH); + Criteria criteria = Criteria.where("dateType").is(dateType) + .and("_id").gte(startId).lt(endId); + + if (Objects.nonNull(systemType)) { + criteria.and("systemType").is(systemType); + } + + Query query = new Query(criteria); + + LOG.info("构建listFlowSystemByDateTypeAndSystemType查询语句: {}", query); + List flowSystemList = mongoTemplate.find(query, FlowSystemBO.class); + + if (CollUtil.isEmpty(flowSystemList)) { + return new ArrayList<>(); + } + return flowSystemList; + } + + @Override + public List listFlowSystem(Date startTime, Date endTime, Integer dateType) { + Criteria criteria = Criteria.where("dateType").is(dateType) + .and("_id") + .gte(FlowUtil.timeToId(startTime, FlowSystemBO.ID_LENGTH)) + .lt(FlowUtil.timeToId(endTime, FlowSystemBO.ID_LENGTH)); + + Query query = new Query(criteria); + + LOG.info("listFlowSystem query:{}", query); + + List flowSystemList = mongoTemplate.find(query, FlowSystemBO.class); + return flowSystemList; + } + + private void batchInsertFlowSystemBO(Integer dateType, Date beginDate, Date endDate, List flowSystemBOList) { + if (CollUtil.isEmpty(flowSystemBOList)) { + return; + } + + String date = DateUtil.format(beginDate, "yyMMdd"); + Date currentDate = new Date(); + + + // 设置id为当前时间+时间类型+系统类型 + flowSystemBOList.forEach(systemAnalyse -> { + systemAnalyse.setCreateTime(beginDate); + systemAnalyse.setUpdateTime(currentDate); + systemAnalyse.setDateType(dateType); + systemAnalyse.setId(Integer.parseInt( date + dateType + systemAnalyse.getSystemType())); + }); + + // 先删除再更新 + mongoTemplate.remove(FlowUtil.getRemoveQuery(beginDate, endDate, FlowSystemBO.ID_LENGTH, dateType), FlowSystemBO.class); + + // 统计的数据批量保存到flow_system + mongoTemplate.insertAll(flowSystemBOList); + } + + + private List statisticsSystemUserListOfTime(Date beginDate, Date endDate, Integer systemType, List flowSystemBOList) { + // 加购人数、访客数、新访客数、跳失人数、下单人数、支付人数 + List systemUserAnalyseBOList = statisticsSystemUserAnalyseList(beginDate, endDate, systemType); + + flowSystemBOList = new ArrayList<>(flowSystemBOList); + + if (CollUtil.isEmpty(systemUserAnalyseBOList)) { + return flowSystemBOList; + } + + // systemTyep为空时,代表统计所有端的数据,因此需要补充一个总的数据 + if (Objects.isNull(systemType)) { + List allSystemUserAnalyseBO = statisticsSystemUserAnalyseList(beginDate, endDate, SystemTypeEnum.ALL.value()); + allSystemUserAnalyseBO.get(0).setSystemType(SystemTypeEnum.ALL.value()); + systemUserAnalyseBOList.add(allSystemUserAnalyseBO.get(0)); + } + Map map = flowSystemBOList.stream().collect(Collectors.toMap(FlowSystemBO::getSystemType, s -> s)); + for (FlowSystemBO flowSystemBO : systemUserAnalyseBOList) { + if (!map.containsKey(flowSystemBO.getSystemType())) { + flowSystemBOList.add(flowSystemBO); + continue; + } + FlowSystemBO systemAnalyse = map.get(flowSystemBO.getSystemType()); + systemAnalyse.setPlusShopCartUser(flowSystemBO.getPlusShopCartUser()); + systemAnalyse.setVisitUser(flowSystemBO.getVisitUser()); + systemAnalyse.setNewVisitUser(flowSystemBO.getNewVisitUser()); + systemAnalyse.setLossUser(flowSystemBO.getLossUser()); + systemAnalyse.setPlaceOrderUser(flowSystemBO.getPlaceOrderUser()); + systemAnalyse.setPayUser(flowSystemBO.getPayUser()); + } + return flowSystemBOList; + } + + /** + * flow_system_user中统计用户数量 + * @param beginDate + * @param endDate + * @return + */ + private List statisticsSystemUserAnalyseList( + Date beginDate, Date endDate, + Integer systemType) { + + Criteria criteria = Criteria.where("_id") + .gte(FlowUtil.timeToId(beginDate, FlowSystemUserBO.ID_LENGTH)) + .lt(FlowUtil.timeToId(endDate, FlowSystemUserBO.ID_LENGTH)) + .and("dateType").is(FlowDateTypeEnum.DAY.value()); + + if (systemType != null && systemType != 0) { + criteria.and("systemType").is(systemType); + } + List aggregationOperationList = new ArrayList<>(); + + aggregationOperationList.add(Aggregation.match(criteria)); + + String[] userArray; + if (Objects.isNull(systemType)) { + userArray = new String[]{"systemType", "userId"}; + } else { + userArray = new String[]{"userId"}; + } + + aggregationOperationList.add(Aggregation.group(userArray) + .first("systemType").as("systemType") + .max("plusShopCart").as("plusShopCart") + .max("newVisitUser").as("newVisitUser") + .max("loss").as("loss") + .max("placeOrder").as("placeOrder") + .max("pay").as("pay")); + + String[] systemTypeArray; + if (Objects.isNull(systemType)) { + systemTypeArray = new String[]{"systemType"}; + } else { + systemTypeArray = new String[0]; + } + + aggregationOperationList.add(Aggregation.group(systemTypeArray) + .first("systemType").as("systemType") + .sum("plusShopCart").as("plusShopCartUser") + .count().as("visitUser") + .sum("newVisitUser").as("newVisitUser") + .sum("loss").as("lossUser") + .sum("placeOrder").as("placeOrderUser") + .sum("pay").as("payUser")); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowSystemBO.class, + aggregationOperationList + ); + + List flowSystemBOList = mongoTemplate + .aggregate(typedAggregation, "flow_system_user", FlowSystemBO.class) + .getMappedResults(); + + if (Objects.equals(systemType, SystemTypeEnum.ALL.value()) && CollUtil.isNotEmpty(flowSystemBOList)) { + flowSystemBOList.get(0).setSystemType(systemType); + } + + return new ArrayList<>(flowSystemBOList); + } + + private List listSystemAnalyse(Date beginDate, Date endDate, Integer systemType) { + Criteria criteria = Criteria.where("dt").gte(beginDate).lt(endDate); + + if (systemType != null) { + criteria.and("st").is(systemType); + } + + + ProjectionOperation initProjectionOperation = Aggregation.project("oid", "uid", "s", "st") + // 加购数量 + .and(ConditionalOperators.when(Criteria.where("ve").is(2)).then(1).otherwise(0)).as("plusShopCartNum"); + + GroupOperation oidGroupOperation = Aggregation.group("oid", "st") + .first("oid").as("oid") + .first("st").as("st") + .last("uid").as("uid") + .max("s").as("step") + .sum("plusShopCartNum").as("plusShopCartNum") + .count().as("visit"); + + ProjectionOperation projectionOperation = Aggregation.project("visit", "st") + // 人数统计id处理 + .and(ConditionalOperators.when(Criteria.where("uid").gt(0)).then("$uid").otherwise("$oid" )).as("uid") + // 新访客 + .and(ConditionalOperators.when(Criteria.where("uid").gt(0)).then(0).otherwise(1)).as("newUser") + // 跳失人数 + .and(ConditionalOperators.when(Criteria.where("step").is(1)).then(1).otherwise(0)).as("lossUser") + // 加购人数 + .and(ConditionalOperators.when(Criteria.where("plusShopCartNum").gt(0)).then(1).otherwise(0)).as("plusShopCartUser"); + + // 跳失取最小的值:要全部的步数都是1步才能算跳失 + // 加购取最大值:只要用户在其中一个会话中加购了就算加购用户 + GroupOperation uidGroupOperation = Aggregation.group("uid", "st") + .first("st").as("st") + .sum("visit").as("visit") + .max("newUser").as("newUser") + .min("lossUser").as("lossUser") + .max("plusShopCartUser").as("plusShopCartUser"); + + GroupOperation groupOperation = Aggregation.group("st") + .first("st").as("systemType") + .sum("visit").as("visit") + .sum("lossUser").as("lossUser") + .sum("newUser").as("newVisitUser") + .sum("plusShopCartUser").as("plusShopCartUser") + .count().as("visitUser"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowSystemBO.class, + Aggregation.match(criteria), + initProjectionOperation, + oidGroupOperation, + projectionOperation, + uidGroupOperation, + groupOperation + ); + + List systemAnalyseList = mongoTemplate.aggregate(typedAggregation, "flow_user_log", FlowSystemBO.class).getMappedResults(); + if (CollUtil.isEmpty(systemAnalyseList)) { + systemAnalyseList = new ArrayList<>(); + } + return new ArrayList<>(systemAnalyseList); + } + + + private List handleSystemOrderList(List systemAnalyseList, Date beginDate, Date endDate, Integer systemType) { + // 过滤 + Criteria criteria = Criteria.where("dt").gte(beginDate).lt(endDate).and("ve").in(4, 5); + if (Objects.nonNull(systemType)) { + criteria.and("st").is(systemType); + } + MatchOperation matchOperation = Aggregation.match(criteria); + + GroupOperation initGroupOperation = Aggregation.group("bid", "ve", "st") + .first("bid").as("bid") + .first("ve").as("ve") + .last("uid").as("uid"); + + LookupOperation lookupOperation = Aggregation.lookup("order", "bid", "_id", "orders"); + + ProjectionOperation orderProjectionOperation = Aggregation.project("uid") + // 下单金额 + .and(ConditionalOperators.when(Criteria.where("ve").is(4)).then("$orders.actualTotal").otherwise(0)).as("placeOrderAmount") + // 下单金额 + .and(ConditionalOperators.when(Criteria.where("ve").is(5)).then("$orders.actualTotal").otherwise(0)).as("payAmount") + // 系统类型 + .and("_id.st").as("systemType"); + + GroupOperation userGroupOperation = Aggregation.group("uid", "systemType") + .sum("placeOrderAmount").as("placeOrderAmount") + .sum("payAmount").as("payAmount") + .first("systemType").as("systemType"); + + ProjectionOperation projectionOperation = Aggregation.project("placeOrderAmount", "payAmount", "systemType") + // 下单金额 + .and(ConditionalOperators.when(Criteria.where("placeOrderAmount").gt(0)).then(1).otherwise(0)).as("placeOrderUser") + // 下单金额 + .and(ConditionalOperators.when(Criteria.where("payAmount").gt(0)).then(1).otherwise(0)).as("payUser"); + + + + GroupOperation groupOperation = Aggregation.group("systemType") + .sum("placeOrderUser").as("placeOrderUser") + .sum("payUser").as("payUser") + .sum("placeOrderAmount").as("placeOrderAmount") + .sum("payAmount").as("payAmount") + .first("systemType").as("systemType"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowSystemBO.class, + matchOperation, + initGroupOperation, + lookupOperation, + Aggregation.unwind("orders"), + orderProjectionOperation, + userGroupOperation, + projectionOperation, + groupOperation + ); + + LOG.info("handleSystemOrderList:typedAggregation:{}", typedAggregation); + + List flowSystemBOList = mongoTemplate.aggregate(typedAggregation, "flow_user_log", FlowSystemBO.class).getMappedResults(); + if (CollUtil.isEmpty(flowSystemBOList)) { + return systemAnalyseList; + } + + Map map = systemAnalyseList.stream().collect(Collectors.toMap(FlowSystemBO::getSystemType, s -> s)); + for (FlowSystemBO flowSystemBO : flowSystemBOList) { + FlowSystemBO systemAnalyse = map.get(flowSystemBO.getSystemType()); + if (Objects.isNull(systemAnalyse)) { + systemAnalyse = new FlowSystemBO(); + map.put(flowSystemBO.getSystemType(), systemAnalyse); + } + systemAnalyse.setPlaceOrderUser(flowSystemBO.getPlaceOrderUser()); + systemAnalyse.setPayUser(flowSystemBO.getPayUser()); + systemAnalyse.setPlaceOrderAmount(flowSystemBO.getPlaceOrderAmount()); + systemAnalyse.setPayAmount(flowSystemBO.getPayAmount()); + } + return new ArrayList<>(map.values()); + } + + + private FlowSystemBO getALLSystemAnalyseBO(Date beginDate, Date endDate) { + ProjectionOperation projectionOperation = Aggregation.project("oid", "uid", "s") + // 加购数量 + .and(ConditionalOperators.when(Criteria.where("ve").is(2)).then(1).otherwise(0)).as("plusShopCartNum"); + + GroupOperation oidGroupOperation = Aggregation.group("oid") + .last("uid").as("uid") + .max("s").as("step") + .sum("plusShopCartNum").as("plusShopCartNum") + .count().as("visit"); + + ProjectionOperation projectionOperation2 = Aggregation.project("visit") + // 人数统计id处理 + .and(ConditionalOperators.when(Criteria.where("uid").gt(0)).then("$uid").otherwise("$_id" )).as("uid") + // 新访客 + .and(ConditionalOperators.when(Criteria.where("uid").gt(0)).then(0).otherwise(1)).as("newUser") + // 跳失人数 + .and(ConditionalOperators.when(Criteria.where("step").is(1)).then(1).otherwise(0)).as("lossUser") + // 加购人数 + .and(ConditionalOperators.when(Criteria.where("plusShopCartNum").gt(0)).then(1).otherwise(0)).as("plusShopCartUser"); + + // 跳失取最小的值:要全部的步数都是1步才能算跳失 + // 加购取最大值:只要用户在其中一个会话中加购了就算加购用户 + GroupOperation uidGroupOperation = Aggregation.group("uid") + .sum("visit").as("visit") + .max("newUser").as("newVisitUser") + .min("lossUser").as("lossUser") + .max("plusShopCartUser").as("plusShopCartUser"); + + GroupOperation groupOperation = Aggregation.group() + .sum("visit").as("visit") + .sum("lossUser").as("lossUser") + .sum("newVisitUser").as("newVisitUser") + .sum("plusShopCartUser").as("plusShopCartUser") + .count().as("visitUser"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowSystemBO.class, + Aggregation.match(Criteria.where("dt").gte(beginDate).lt(endDate)), + projectionOperation, + oidGroupOperation, + projectionOperation2, + uidGroupOperation, + groupOperation + ); + + List mappedResults = mongoTemplate.aggregate(typedAggregation, "flow_user_log", FlowSystemBO.class).getMappedResults(); + + FlowSystemBO flowSystemBO; + if (CollUtil.isEmpty(mappedResults)) { + flowSystemBO = new FlowSystemBO(); + } else { + flowSystemBO = mappedResults.get(0); + flowSystemBO.setSystemType(SystemTypeEnum.ALL.value()); + } + + return flowSystemBO; + } + + + + private void handleSystemOrder(FlowSystemBO flowSystemBO, Date beginDate, Date endDate) { + + MatchOperation matchOperation = Aggregation.match(Criteria.where("createTime").gte(beginDate).lt(endDate)); + + ProjectionOperation userProjectionOperation = Aggregation.project("_id", "userId") + .and("actualTotal").as("placeOrderAmount") + .and(ConditionalOperators.when(Criteria.where("isPayed").is(1)).then("$actualTotal").otherwise(0)).as("payAmount"); + + GroupOperation userGroupOperation = Aggregation.group("userId") + .sum("placeOrderAmount").as("placeOrderAmount") + .sum("payAmount").as("payAmount"); + + ProjectionOperation projectionOperation = Aggregation.project("placeOrderAmount", "payAmount") + .and(ConditionalOperators.when(Criteria.where("placeOrderAmount").gt(0)).then(1).otherwise(0)).as("placeOrderUser") + .and(ConditionalOperators.when(Criteria.where("payAmount").gt(0)).then(1).otherwise(0)).as("payUser"); + + + GroupOperation groupOperation = Aggregation.group() + .sum("placeOrderAmount").as("placeOrderAmount") + .sum("payAmount").as("payAmount") + .sum("placeOrderUser").as("placeOrderUser") + .sum("payUser").as("payUser"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowSystemBO.class, + matchOperation, + userProjectionOperation, + userGroupOperation, + projectionOperation, + groupOperation + ); + LOG.info("handleSystemOrder:typedAggregation:{}", typedAggregation); + + List flowSystemList = mongoTemplate + .aggregate(typedAggregation, "order", FlowSystemBO.class) + .getMappedResults(); + if (CollUtil.isEmpty(flowSystemList)) { + return; + } + FlowSystemBO systemAnalyse = flowSystemList.get(0); + flowSystemBO.setSystemType(0); + flowSystemBO.setPayAmount(systemAnalyse.getPayAmount()); + flowSystemBO.setPlaceOrderAmount(systemAnalyse.getPlaceOrderAmount()); + flowSystemBO.setPayUser(systemAnalyse.getPayUser()); + flowSystemBO.setPlaceOrderUser(systemAnalyse.getPlaceOrderUser()); + } + +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/SystemUserAnalyseMongoServiceImpl.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/SystemUserAnalyseMongoServiceImpl.java new file mode 100644 index 0000000..28210c9 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/SystemUserAnalyseMongoServiceImpl.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.flow.bo.FlowSystemUserBO; +import com.tmerclub.cloud.flow.service.SystemUserAnalyseMongoService; +import com.tmerclub.cloud.flow.util.FlowUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * 流量分析—用户访问数据 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +@Service +public class SystemUserAnalyseMongoServiceImpl implements SystemUserAnalyseMongoService { + + private static final Logger LOG = LoggerFactory.getLogger(SystemUserAnalyseMongoServiceImpl.class); + + @Autowired + private MongoTemplate mongoTemplate; + + private final static String[] SYSTEM_TYPE = {"全部", "PC", "H5", "微信小程序", "安卓", "IOS"}; + + @Override + public void statisticsAndSaveSystemUserOfDay(Integer dateType, Date beginDate, Date endDate) { + + // 获取每个端的访问用户数据列表 + List systemUserAnalyseList = this.insertSystemUserList(beginDate, endDate); + + String date = DateUtil.format(beginDate, "yyMMdd"); + int i = 1; + + for (FlowSystemUserBO flowSystemUserBO : systemUserAnalyseList) { + flowSystemUserBO.setDateType(dateType); + flowSystemUserBO.setCreateTime(beginDate); + flowSystemUserBO.setId(FlowUtil.getId(date + dateType + flowSystemUserBO.getSystemType(), i++)); + } + + // 批量保存各系统用户列表数据 + this.batchInsertFlowSystemUserBO(beginDate, endDate, systemUserAnalyseList); + } + + private void batchInsertFlowSystemUserBO(Date beginDate, Date endDate, List systemUserAnalyseList) { + Long beginId = FlowUtil.timeToId(beginDate); + Long endId = FlowUtil.timeToId(endDate); + + // 先删除再更新-mongo没有事务,如果之前保存后程序报错了,数据还是保存在数据库中 + mongoTemplate.remove(new Query(Criteria.where("_id").gte(beginId).lt(endId)), FlowSystemUserBO.class); + // 统计的数据批量保存到flow_system_user + mongoTemplate.insertAll(systemUserAnalyseList); + } + + private List insertSystemUserList(Date beginDate, Date endDate) { + MatchOperation matchOperation = Aggregation.match(Criteria.where("dt").gte(beginDate).lt(endDate)); + + GroupOperation userGroupOperation = Aggregation.group("oid", "st", "ve") + .first("ve").as("ve") + .last("uid").as("uid") + .max("s").as("step"); + + ProjectionOperation userProjectionOperation = Aggregation.project("st") + .and(ConditionalOperators.when(Criteria.where("step").gt(1)).then(1).otherwise(0)).as("loss") + .and(ConditionalOperators.when(Criteria.where("uid").gt(0)).then(1).otherwise(0)).as("newVisitUser") + .and(ConditionalOperators.when(Criteria.where("ve").is(2)).then(1).otherwise(0)).as("plusShopCart") + .and(ConditionalOperators.when(Criteria.where("ve").is(4)).then(1).otherwise(0)).as("placeOrder") + .and(ConditionalOperators.when(Criteria.where("ve").is(5)).then(1).otherwise(0)).as("pay") + .and(ConditionalOperators.when(Criteria.where("uid").gt(0)).then("$uid").otherwise("$_id.oid")).as("uid"); + + + GroupOperation systemGroupOperation = Aggregation.group("st", "uid") + .max("loss").as("loss") + .max("newVisitUser").as("newVisitUser") + .max("plusShopCart").as("plusShopCart") + .max("placeOrder").as("placeOrder") + .max("pay").as("pay") + .first("st").as("systemType") + .first("uid").as("userId"); + + + ProjectionOperation projectionOperation = Aggregation.project("plusShopCart", "placeOrder", "pay","systemType", "userId") + .andExclude("_id") + .and(ConditionalOperators.when(Criteria.where("loss").is(1)).then(0).otherwise(1)).as("loss") + .and(ConditionalOperators.when(Criteria.where("newVisitUser").is(1)).then(0).otherwise(1)).as("newVisitUser"); + + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowSystemUserBO.class, + matchOperation, + userGroupOperation, + userProjectionOperation, + systemGroupOperation, + Aggregation.unwind("_id"), + projectionOperation + ); + + LOG.info("insertSystemUserList.typedAggregation:{}", typedAggregation); + + List systemUserAnalyseList = mongoTemplate + .aggregate(typedAggregation, "flow_user_log", FlowSystemUserBO.class) + .getMappedResults(); + return systemUserAnalyseList; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/UserAnalyseMongoServiceImpl.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/UserAnalyseMongoServiceImpl.java new file mode 100644 index 0000000..e3e1ab4 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/UserAnalyseMongoServiceImpl.java @@ -0,0 +1,1076 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.coupon.dto.ReceiveCouponDTO; +import com.tmerclub.cloud.api.coupon.feign.CouponFeignClient; +import com.tmerclub.cloud.api.delivery.feign.AreaFeignClient; +import com.tmerclub.cloud.api.order.dto.CustomerRetainedDTO; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.order.vo.CustomerRetainVO; +import com.tmerclub.cloud.api.user.dto.CustomerReqDTO; +import com.tmerclub.cloud.api.user.dto.MemberReqDTO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.MemberContributeValueVO; +import com.tmerclub.cloud.api.user.vo.MemberCountVO; +import com.tmerclub.cloud.api.user.vo.MemberTrendRespVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.AreaVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.flow.bo.*; +import com.tmerclub.cloud.flow.constant.FlowDateTypeEnum; +import com.tmerclub.cloud.flow.service.UserAnalyseMongoService; +import com.tmerclub.cloud.flow.util.FlowUtil; +import com.tmerclub.cloud.flow.util.IpSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 流量分析—用户访问数据 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +@Service +public class UserAnalyseMongoServiceImpl implements UserAnalyseMongoService { + + private static final Logger LOG = LoggerFactory.getLogger(UserAnalyseMongoServiceImpl.class); + + @Autowired + private MongoTemplate mongoTemplate; + @DubboReference + private UserFeignClient userFeignClient; + @DubboReference + private CouponFeignClient couponFeignClient; + @DubboReference + private AreaFeignClient areaFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + + + @Override + public void statisticsAndSaveUserOfDay(Date beginDate, Date endDate) { + // 获取 步骤数、浏览量、IP、是否访客 + List userOperationList = this.listUserAnalyseLogBO(beginDate, endDate); + if (CollUtil.isEmpty(userOperationList)) { + return; + } + + List userIds = userOperationList.stream() + .filter(flowUserOperationBO -> Objects.equals(flowUserOperationBO.getMembership(), 1)) + .map(FlowUserOperationBO::getUserId) + .collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(userIds)) { + // 是否新老会员、是否付费会员、会员领券数量 + this.loadUserMemberInfo(userIds, userOperationList, beginDate, endDate); + + // 是否下单、是否支付、下单数量、支付数量、下单金额、支付金额 + this.statisticsUserOrderLog(userIds, userOperationList, beginDate, endDate); + } + + String date = DateUtil.format(beginDate, "yyMMdd"); + Date currentTime = new Date(); + + int index = 1; + + for (FlowUserOperationBO flowUserOperationBO : userOperationList) { + flowUserOperationBO.setCreateTime(beginDate); + flowUserOperationBO.setUpdateTime(currentTime); + if (Objects.isNull(flowUserOperationBO.getMembership())) { + flowUserOperationBO.setMembership(0); + } + flowUserOperationBO.setId(FlowUtil.getId(date + flowUserOperationBO.getMembership(), index++)); + } + + // 批量保存 + this.batchInsertUserOperationBO(beginDate, endDate, userOperationList); + } + + @Override + public void statisticsAndSaveUserFootprintOfDay(int dateType, Date beginDate, Date endDate) { + // flow_user_operation表中的数据 + List flowUserFootprintList = this.statisticsUserFootprintOfTime(dateType, beginDate, endDate, new ArrayList<>()); + + this.batchInsertFlowUserFootprintBO(dateType, beginDate, endDate, flowUserFootprintList); + } + + @Override + public void statisticsAndSaveUserFootprintOfTime(int dateType, Date beginDate, Date endDate) { + // flow_user_operation表中的数据 + List flowUserFootprintList = this.listUserFootprintOfTime(dateType, beginDate, endDate); + + this.batchInsertFlowUserFootprintBO(dateType, beginDate, endDate, flowUserFootprintList); + } + + @Override + public List listUserFootprintOfTime(int dateType, Date beginDate, Date endDate) { + List aggregationOperationList = new ArrayList<>(); + + aggregationOperationList.add(Aggregation.group("userId") + .sum("step").as("step") + .first("userId").as("userId")); + + List flowUserFootprintList = statisticsUserFootprintOfTime(dateType, beginDate, endDate, aggregationOperationList); + return flowUserFootprintList; + } + + @Override + public List statisticsUserFootprintOfTime(int dateType, Date beginDate, Date endDate, List aggregationOperationList) { + // flow_user_operation表中的数据 + + Long beginId = FlowUtil.timeToId(beginDate); + Long endId = FlowUtil.timeToId(endDate); + aggregationOperationList.add(0, Aggregation.match(Criteria.where("_id").gte(beginId).lt(endId))); + + aggregationOperationList.add(Aggregation.project() + .and(ConditionalOperators.when(Criteria.where("step").gt(20)) + .then(8).otherwise( + ConditionalOperators.when(Criteria.where("step").gt(10)).then(7).otherwise( + ConditionalOperators.when(Criteria.where("step").gt(5)).then(6).otherwise("$step") + ) + ) + ).as("step")); + aggregationOperationList.add(Aggregation.group("step") + .count().as("userNums") + .first("step").as("visitId")); + + + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowUserFootprintBO.class, + aggregationOperationList + ); + LOG.info("statisticsUserFootprintOfTime:aggregation:{}", typedAggregation); + + List userFootprintAnalyseList = mongoTemplate.aggregate(typedAggregation, "flow_user_operation", FlowUserFootprintBO.class).getMappedResults(); + if (CollUtil.isEmpty(userFootprintAnalyseList)) { + return new ArrayList<>(); + } + return userFootprintAnalyseList; + } + + @Override + public void statisticsAndSaveRegionalOfTime(int dateType, Date beginDate, Date endDate) { + List regionalStatisticsList = this.statisticsRegionalOfTime(beginDate, endDate); + + this.batchInsertFlowRegionalBO(dateType, beginDate, endDate, regionalStatisticsList); + } + + @Override + public List listFlowRegional(Date beginDate, Date endDate, int dateType) { + Criteria criteria = Criteria.where("dateType").is(dateType) + .and("_id") + .gte(FlowUtil.timeToId(beginDate, FlowRegionalBO.ID_LENGTH)) + .lt(FlowUtil.timeToId(endDate, FlowRegionalBO.ID_LENGTH)); + + Query query = new Query(criteria).with(Sort.by(Sort.Direction.ASC, "_id")); + + LOG.info("listFlowRegional query:{}", query); + + List flowRegionalList = mongoTemplate.find(query, FlowRegionalBO.class); + + return flowRegionalList; + } + + @Override + public List statisticsRegionalOfTime(Date beginDate, Date endDate) { + Long beginId = FlowUtil.timeToId(beginDate); + Long endId = FlowUtil.timeToId(endDate); + + // 浏览量、浏览人数、下单金额、支付金额 + List regionalStatisticsList = this.orderRegionalStatistics(beginId, endId); + + // 商品访客数、商品浏览量、加购数量、加购人数 + List userRegionalStatisticsList = this.userRegionalStatistics(beginId, endId); + + if (CollUtil.isNotEmpty(regionalStatisticsList) && CollUtil.isNotEmpty(userRegionalStatisticsList)) { + Map map = regionalStatisticsList.stream().collect(Collectors.toMap(FlowRegionalBO::getProvinceId, r -> r)); + + for (FlowRegionalBO flowRegionalBO : userRegionalStatisticsList) { + FlowRegionalBO regionalStatistics = map.get(flowRegionalBO.getProvinceId()); + if (Objects.isNull(regionalStatistics)) { + regionalStatisticsList.add(flowRegionalBO); + continue; + } + regionalStatistics.setSpuVisitNum(flowRegionalBO.getSpuVisitNum()); + regionalStatistics.setSpuVisitUserNum(flowRegionalBO.getSpuVisitUserNum()); + regionalStatistics.setPlusShopCartNum(flowRegionalBO.getPlusShopCartNum()); + regionalStatistics.setPlusShopCartUserNum(flowRegionalBO.getPlusShopCartUserNum()); + + } + } else if (CollUtil.isEmpty(regionalStatisticsList)) { + regionalStatisticsList = userRegionalStatisticsList; + } + return regionalStatisticsList; + } + + @Override + public List statisticsUserOfTime(int dateType, Date beginTime, Date endTime) { + Long beginId = FlowUtil.timeToId(beginTime); + Long endId = FlowUtil.timeToId(endTime); + + // 成交会员数、支付订单数、支付金额 + List flowUserList = this.statisticsUserOrderInfo(beginTime, endTime); + + // 统计 免费会员、付费会员的领券数量 + List couponFlowUserBOList = this.membershipUserStatisticsList(beginId, endId); + + for (FlowUserBO flowUserBO : flowUserList) { + // 只有两条数据,直接遍历 + for (FlowUserBO userBO : couponFlowUserBOList) { + if (Objects.equals(flowUserBO.getType(), userBO.getType())) { + flowUserBO.setReceiveCouponUser(userBO.getReceiveCouponUser()); + } + } + } + + FlowUserBO allFlowUserBO = new FlowUserBO(); + allFlowUserBO.setType(0); + + for (FlowUserBO flowUserBO : flowUserList) { + flowUserBO.setType(flowUserBO.getType() + 1); + allFlowUserBO.setPayUser(allFlowUserBO.getPayUser() + flowUserBO.getPayUser()); + allFlowUserBO.setPayOrder(allFlowUserBO.getPayOrder() + flowUserBO.getPayOrder()); + allFlowUserBO.setPayAmount(allFlowUserBO.getPayAmount() + flowUserBO.getPayAmount()); + allFlowUserBO.setReceiveCouponUser(allFlowUserBO.getReceiveCouponUser() + flowUserBO.getReceiveCouponUser()); + } + flowUserList.add(allFlowUserBO); + + // 用户map + Map flowUserMap = flowUserList.stream().collect(Collectors.toMap(FlowUserBO::getType, f -> f)); + + // 累计会员、新增会员 + MemberCountVO memberCountVO = userFeignClient.statisticsUserNum(new MemberReqDTO(beginTime, endTime)); + + // 全部会员 - 累积会员、新增会员 + this.insertUserInfoToFlowUser(flowUserList, flowUserMap, 0, + memberCountVO.getTotalMember(), + memberCountVO.getNewMember()); + // 普通会员 - 累积会员、新增会员 + this.insertUserInfoToFlowUser(flowUserList, flowUserMap, 1, + memberCountVO.getTotalMember() - memberCountVO.getPaidMember(), + memberCountVO.getNewMember()); + // 付费会员 - 累积会员、新增会员 + this.insertUserInfoToFlowUser(flowUserList, flowUserMap, 2, + memberCountVO.getPaidMember(), + memberCountVO.getNewPaidMember()); + return flowUserList; + } + + @Override + public void statisticsAndSaveUserOfTime(int dateType, Date beginTime, Date endTime) { + List flowUserList = this.statisticsUserOfTime(dateType, beginTime, endTime); + + // 批量保存 + this.batchInsertFlowUserBO(dateType, beginTime, endTime, flowUserList); + } + + @Override + public List listUserFootprint(Date startTime, Date endTime, Integer timeType) { + + Criteria criteria = Criteria.where("dateType").is(timeType) + .and("_id"). + gte(FlowUtil.timeToId(startTime, FlowUserFootprintBO.ID_LENGTH)) + .lt(FlowUtil.timeToId(endTime, FlowUserFootprintBO.ID_LENGTH)); + + Query query = new Query(criteria); + + LOG.info("listUserFootprint query:{}", query); + + return mongoTemplate.find(query, FlowUserFootprintBO.class); + } + + @Override + public List statisticsRealMemberTrend(Date startTime, Date endTime, Integer dateType) { + List memberTrendRespList = new ArrayList<>(); + // 获取当天注册会员数量 + DateTime currentTime = DateUtil.beginOfDay(new Date()); + CustomerReqDTO customerReqDTO = new CustomerReqDTO(); + customerReqDTO.setStartTime(currentTime); + + ServerResponseEntity memberResponseEntity = userFeignClient.countUserNumByType(customerReqDTO); + if (!memberResponseEntity.isSuccess()) { + throw new LuckException(memberResponseEntity.getMsg()); + } + MemberTrendRespVO memberTrendRespVO = memberResponseEntity.getData(); + memberTrendRespVO.setCurrentDay(String.valueOf(currentTime.getTime())); + memberTrendRespList.add(memberTrendRespVO); + + // 查询前29天的数据 + List flowUserBOList = this.listUserNumAndTypeByTime(startTime, currentTime); + memberTrendRespList.addAll(flowUserBOList); + return memberTrendRespList; + } + + @Override + public List listUserNumAndTypeByTime(Date startTime, Date endTime) { + + Integer[] types = new Integer[]{1, 2}; + Criteria criteria = new Criteria().and("dateType").is(FlowDateTypeEnum.DAY.value()) + .and("type").in(Arrays.asList(types)) + .and("_id") + .gte(FlowUtil.timeToId(startTime, FlowUserBO.ID_LENGTH)) + .lt(FlowUtil.timeToId(endTime, FlowUserBO.ID_LENGTH)); + Query query = new Query(criteria); + + List flowUserList = mongoTemplate.find(query, FlowUserBO.class); + List memberTrendRespList = new ArrayList<>(); + + if (CollUtil.isEmpty(flowUserList)) { + return memberTrendRespList; + } + + + Map> map = flowUserList.stream().collect(Collectors.groupingBy(FlowUserBO::getCreateTime)); + map.forEach((key, value) -> { + MemberTrendRespVO memberTrendRespVO = new MemberTrendRespVO(); + memberTrendRespVO.setCurrentDay(String.valueOf(key.getTime())); + for (FlowUserBO flowUserBO : value) { + if (flowUserBO.getType() == 1) { + memberTrendRespVO.setMemberNum(flowUserBO.getNewUserNum()); + } else if (flowUserBO.getType() == 2) { + memberTrendRespVO.setVipMemberNum(flowUserBO.getNewUserNum()); + } + } + memberTrendRespList.add(memberTrendRespVO); + }); + return memberTrendRespList; + } + + @Override + public FlowUserBO getFlowUserByTimeAndUserType(Date startTime, Date endTime, Integer dateType, Integer memberType) { + List flowUserList = this.listMongoFlowUserByTimeAndUserType(startTime, endTime, dateType, memberType); + if (CollUtil.isEmpty(flowUserList)) { + return new FlowUserBO(); + } + return flowUserList.get(0); + } + + @Override + public List listFlowUserByTimeAndUserType(Date startTime, Date endTime, Integer dateType, Integer memberType) { + if (!FlowDateTypeEnum.weekOrMonth(dateType)) { + dateType = FlowDateTypeEnum.DAY.value(); + } + return this.listMongoFlowUserByTimeAndUserType(startTime, endTime, dateType, memberType); + } + + private List listMongoFlowUserByTimeAndUserType(Date startTime, Date endTime, Integer dateType, Integer memberType) { + Criteria criteria = new Criteria().and("dateType").is(dateType) + .and("_id") + .gte(FlowUtil.timeToId(startTime, FlowUserBO.ID_LENGTH)) + .lt(FlowUtil.timeToId(endTime, FlowUserBO.ID_LENGTH)); + + if (Objects.nonNull(memberType)) { + criteria.and("type").is(memberType); + } + + Query query = new Query(criteria); + + LOG.info("listFlowUserByTimeAndUserType query:{}", query); + + return mongoTemplate.find(query, FlowUserBO.class); + } + + @Override + public List statisticsRealMemberContributeValue(Date startTime, Date endTime) { + // 成交会员数 支付订单数 支付金额 + Criteria criteria = Criteria.where("isPayed").is(1) + .and("createTime").gte(startTime).lt(endTime); + GroupOperation initGroupOperation = Aggregation.group("userId") + .last("userType").as("userType") + .sum("actualTotal").as("payAmount") + .count().as("payOrderNum"); + GroupOperation groupOperation = Aggregation.group("userType") + .first("userType").as("userType") + .sum("payAmount").as("payAmount") + .sum("payOrderNum").as("payOrderNum") + .count().as("payMemberNum"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + MemberContributeValueVO.class, + Aggregation.match(criteria), + initGroupOperation, + groupOperation + ); + + LOG.info("statisticsRealMemberContributeValue typedAggregation:{}", typedAggregation); + List memberContributeValueList = mongoTemplate + .aggregate(typedAggregation, "order", MemberContributeValueVO.class) + .getMappedResults(); + memberContributeValueList = memberContributeValueList.stream().filter(memberContributeValueVO -> Objects.nonNull(memberContributeValueVO.getUserType())).collect(Collectors.toList()); + for (MemberContributeValueVO memberContributeValueVO : memberContributeValueList) { + memberContributeValueVO.setUserType(memberContributeValueVO.getUserType() + 1); + } + return memberContributeValueList; + } + + @Override + public Date getLatestTime() { + Criteria criteria = Criteria.where("dateType").is(FlowDateTypeEnum.DAY.value()); + Query query = new Query(criteria).with(Sort.by(Sort.Direction.DESC, "_id")).limit(1); + List flowUserBOList = mongoTemplate.find(query, FlowUserBO.class); + if (CollUtil.isEmpty(flowUserBOList)) { + return null; + } + return flowUserBOList.get(0).getCreateTime(); + } + + @Override + public void statisticsAndSaveUserRetained() { + + // 统计结束的时间 -- 用于统计六月前的留存数据 + Date endTime = DateUtil.beginOfMonth(DateUtil.offsetMonth(new Date(), -6)); + // 统计开始时间 + Date startTime = this.getBeginTime(endTime); + // 留存数据列表 + List list = this.statisticsUserRetained(startTime, endTime); + + // 根据id查询结果删除数据 + Criteria criteria = Criteria.where("createTime").gte(startTime) + .lt(endTime); + Query query = new Query(criteria); + + mongoTemplate.remove(query, FlowUserRetainBO.class); + + if (CollUtil.isNotEmpty(list)) { + mongoTemplate.insertAll(list); + } + } + + /** + * 交易留存/成交留存 + * 成交时间,是每一个月的时间 (例如: 2021-05, 2021-06) + * 新成交客户数:以前从没有支付过,第一次下单支付了的用户。(余额充值,也是要生成订单信息的,所以都只需要统计订单表的信息就可以了) + * 因为要计算用户第一次的成交时间所以一定有全表扫描的 + * 第一月留存:新成交的客户,在第一次交易后的下一个月,是否有再次交易成功的人数 + * eg:假设2021年1月份,A B C D 四位客户首次成交;2月份 A B 成交;3月份 D成交,4月份B C D有成交。求 1月份客户在后续2,3,4月份的留存率分别是多少? + * 根据前面的算法公式,则: + * 2月份的留存数是 2,留存率 = 2 /4 =50% + * 3月份的留存数是 1,留存率 = 1/4 =25% + * 4月份的留存数是 3,留存率 = 3/4 =75% + * + * @param startTime + * @param endTime + * @return + */ + @Override + public List statisticsUserRetained(Date startTime, Date endTime) { + // ============================== 访问留存 ============================== + List retainedList = new ArrayList<>(); + Date beginTime = startTime; + while (beginTime.getTime() < endTime.getTime()) { + + Date intiEndTime = DateUtil.offsetDay(beginTime, 1); + Date statisticsBeginTime = intiEndTime; + // 结束时间--统计开始时间的后6个月,即统计6个月的数据 + Date statisticsEndTime = DateUtil.beginOfMonth(DateUtil.offsetMonth(statisticsBeginTime, 6)); + + FlowUserRetainBO flowUserRetainBO = this.statisticsUserVisitRetained(beginTime, intiEndTime, statisticsEndTime); + retainedList.add(flowUserRetainBO); + beginTime = DateUtil.beginOfDay(DateUtil.offsetMonth(beginTime, 1)); + } + + // ============================== 成交留存 ============================== + ServerResponseEntity> orderResponseEntity = orderFeignClient.getTradeRetained(new CustomerRetainedDTO(startTime, endTime)); + if (!orderResponseEntity.isSuccess()) { + throw new LuckException(orderResponseEntity.getMsg()); + } + Date currentTime = new Date(); + List tradeRetainedList = new ArrayList<>(); + List customerRetainList = orderResponseEntity.getData(); + for (CustomerRetainVO customerRetainVO : customerRetainList) { + FlowUserRetainBO flowUserRetainBO = new FlowUserRetainBO(); + flowUserRetainBO.setRetainType(2); + DateTime time = DateUtil.parse(customerRetainVO.getCurrentMonth(), "yyyyMM"); + flowUserRetainBO.setId(Integer.parseInt(customerRetainVO.getCurrentMonth() + flowUserRetainBO.getRetainType())); + flowUserRetainBO.setCreateTime(time); + flowUserRetainBO.setUpdateTime(currentTime); + flowUserRetainBO.setNewCustomers(customerRetainVO.getNewCustomers()); + flowUserRetainBO.setFirstMonthRemain(customerRetainVO.getFirstMonthRemain()); + flowUserRetainBO.setSecondMonthRemain(customerRetainVO.getSecondMonthRemain()); + flowUserRetainBO.setThirdMonthRemain(customerRetainVO.getThirdMonthRemain()); + flowUserRetainBO.setFourthMonthRemain(customerRetainVO.getFourthMonthRemain()); + flowUserRetainBO.setFifthMonthRemain(customerRetainVO.getFifthMonthRemain()); + flowUserRetainBO.setSixthMonthRemain(customerRetainVO.getSixthMonthRemain()); + retainedList.add(flowUserRetainBO); + } + return retainedList; + } + + @Override + public void statisticsAndSaveUserRetainedOfCurrent() { + // 新用户的时间、开始统计的时间、统计结束时间 + Date endTime = DateUtil.beginOfMonth(DateUtil.offsetMonth(new Date(), 1)); + Date startTime = DateUtil.beginOfMonth(DateUtil.offsetMonth(new Date(), -6)); + // 先查询列表再进行统计,一个月完全统计一次,每天统计近一个月的数据 + List list = this.statisticsUserRetained(startTime, endTime); + + if (CollUtil.isEmpty(list)) { + return; + } + // 先删除旧的数据 + Criteria criteria = Criteria.where("_id") + .gte(retainedDateToId(startTime)) + .lte(retainedDateToId(endTime)); + Query query = new Query(criteria); + mongoTemplate.remove(query, FlowUserRetainBO.class); + + // 批量保存统计数据 + mongoTemplate.insertAll(list); + } + + @Override + public List listFlowUserRetain(Date startTime, Date endTime, Integer retainType) { + Criteria criteria = Criteria.where("_id") + .gte(retainedDateToId(startTime)) + .lt(retainedDateToId(endTime)) + .and("retainType").is(retainType); + Query query = new Query(criteria); + + return mongoTemplate.find(query, FlowUserRetainBO.class); + } + + private void batchInsertUserOperationBO(Date beginDate, Date endDate, List flowUserOperationBOList) { + Long beginId = FlowUtil.timeToId(beginDate); + Long endId = FlowUtil.timeToId(endDate); + + // 先删除再更新-mongo没有事务,如果之前保存后程序报错了,数据还是保存在数据库中 + mongoTemplate.remove(new Query(Criteria.where("_id").gte(beginId).lt(endId)), FlowUserOperationBO.class); + + // 统计的数据批量保存到flow_system_user + mongoTemplate.insertAll(flowUserOperationBOList); + } + + /** + * 统计用户的成交数据 + * + * @param beginTime + * @param endTime + * @return + */ + private List statisticsUserOrderInfo(Date beginTime, Date endTime) { + + Criteria criteria = Criteria.where("isPayed").is(1) + .and("createTime").gte(beginTime).lt(endTime); + + GroupOperation initGroupOperation = Aggregation.group("userId") + .last("userType").as("userType") + .sum("actualTotal").as("payAmount") + .count().as("payOrder"); + + String[] fields = new String[]{"userType"}; + + GroupOperation groupOperation = Aggregation.group(fields) + .first("userType").as("type") + .sum("payAmount").as("payAmount") + .sum("payOrder").as("payOrder") + .count().as("payUser"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowUserBO.class, + Aggregation.match(criteria), + initGroupOperation, + groupOperation + ); + LOG.info("statisticsUserOrderInfo:typedAggregation:{}", typedAggregation); + List orderFlowUserList = mongoTemplate + .aggregate(typedAggregation, "order", FlowUserBO.class) + .getMappedResults(); + + return new ArrayList<>(orderFlowUserList); + } + + private void insertUserInfoToFlowUser(List flowUserBOList, Map flowUserMap, int type, Integer userNum, Integer newUserNum) { + FlowUserBO flowUserBO = flowUserMap.get(type); + if (Objects.isNull(flowUserBO)) { + flowUserBO = new FlowUserBO(); + flowUserBO.setType(type); + flowUserBOList.add(flowUserBO); + } + flowUserBO.setUserNum(userNum); + flowUserBO.setNewUserNum(newUserNum); + } + + + private String retainedDateToString(Date date) { + return DateUtil.format(date, "yyyyMM"); + } + + private Integer retainedDateToId(Date date) { + return Integer.parseInt(retainedDateToString(date) + Constant.ZERO_INTEGER); + } + + private FlowUserRetainBO statisticsUserVisitRetained(Date startTime, Date endTime, Date statisticsEndTime) { + // 1.先查出指定月份的用户数据 + Date current = new Date(); + FlowUserRetainBO flowUserRetainBO = new FlowUserRetainBO(); + flowUserRetainBO.setRetainType(1); + flowUserRetainBO.setId(Integer.parseInt(DateUtil.format(startTime, "yyyyMM") + flowUserRetainBO.getRetainType())); + flowUserRetainBO.setCreateTime(startTime); + flowUserRetainBO.setUpdateTime(current); + + List userIds = userFeignClient.listNewUserIdByTime(new CustomerReqDTO(startTime, endTime)); + flowUserRetainBO.setNewCustomers(userIds.size()); + if (CollUtil.isEmpty(userIds)) { + return flowUserRetainBO; + } + + // 2.统计用户后续时间的访问情况 + MatchOperation matchOperation = Aggregation.match(Criteria.where("userId").in(userIds).and("_id") + .gte(FlowUtil.timeToId(endTime)) + .lt(FlowUtil.timeToId(statisticsEndTime))); + + // 3.处理数据,得到年月 + ProjectionOperation projectionOperation = Aggregation.project("userId").and("createTime").dateAsFormattedString("%Y%m").as("currentMonth"); + + // 4.去重时间和用户id来 + GroupOperation userGroupOperation = Aggregation.group("currentMonth", "userId") + .first("userId").as("userId") + .first("currentMonth").as("currentMonth"); + + + // 5.统计各个月份的人数 + GroupOperation groupOperation = Aggregation.group("currentMonth") + .first("currentMonth").as("currentMonth") + .count().as("newCustomers"); + + // 查询数据 + TypedAggregation typedAggregation = Aggregation.newAggregation( + CustomerRetainVO.class, + matchOperation, + projectionOperation, + userGroupOperation, + groupOperation + ); + List customerRetainList = mongoTemplate + .aggregate(typedAggregation, "order", CustomerRetainVO.class) + .getMappedResults(); + + if (CollUtil.isEmpty(customerRetainList)) { + return flowUserRetainBO; + } + Map map = customerRetainList.stream() + .collect(Collectors.toMap(CustomerRetainVO::getCurrentMonth, CustomerRetainVO::getNewCustomers)); + + // 6.处理数据 + for (int i = 1; i <= Constant.SIX; i++) { + Date beginTime = DateUtil.beginOfMonth(DateUtil.offsetMonth(startTime, 1)); + String format = DateUtil.format(beginTime, "yyyyMM"); + if (!map.containsKey(format)) { + continue; + } + Integer newCustomers = map.get(format); + switch (i) { + case 1: + flowUserRetainBO.setFirstMonthRemain(newCustomers); + break; + case 2: + flowUserRetainBO.setSecondMonthRemain(newCustomers); + break; + case 3: + flowUserRetainBO.setThirdMonthRemain(newCustomers); + break; + case 4: + flowUserRetainBO.setFourthMonthRemain(newCustomers); + break; + case 5: + flowUserRetainBO.setFifthMonthRemain(newCustomers); + break; + case 6: + flowUserRetainBO.setSixthMonthRemain(newCustomers); + break; + default: + break; + } + } + return flowUserRetainBO; + } + + private Date getBeginTime(Date entTime) { + String format = DateUtil.format(entTime, "yyyyMM"); + + Query query = new Query(Criteria.where("_id").lt(Integer.parseInt(format + 0))) + .with(Sort.by(Sort.Direction.DESC, "_id")).limit(1); + List dataList = mongoTemplate.find(query, FlowUserRetainBO.class); + + if (CollUtil.isNotEmpty(dataList)) { + return dataList.get(0).getCreateTime(); + } + + // 如果未统计,则从flow_user_operation中获取最早的时间 + // 查询第一个订单的时间-统计成交记录 + List orderList = mongoTemplate.find( + new Query().with(Sort.by(Sort.Direction.ASC, "_id")).limit(1), + FlowUserOperationBO.class, "order" + ); + + Date orderTime = null; + if (CollUtil.isNotEmpty(orderList)) { + orderTime = orderList.get(0).getCreateTime(); + } + + // 查询第一个订单的时间-统计成交记录 + List flowUserOperationBOList = mongoTemplate.find( + new Query().with(Sort.by(Sort.Direction.ASC, "_id")).limit(1), + FlowUserOperationBO.class + ); + + Date operationTime = null; + if (CollUtil.isNotEmpty(flowUserOperationBOList)) { + operationTime = flowUserOperationBOList.get(0).getCreateTime(); + } + + // 全部都是空的,就从上一月开始计算 + if (orderTime == null && operationTime == null) { + return DateUtil.beginOfMonth(DateUtil.offsetMonth(new Date(), -1)); + } + // 都不为空,判断哪个时间更早 + else if (orderTime != null && operationTime != null) { + return orderTime.before(operationTime) ? orderTime : operationTime; + } else if (orderTime == null) { + return operationTime; + } + + return orderTime; + } + + + private void batchInsertFlowUserBO(Integer dateType, Date beginDate, Date endDate, List flowUserList) { + if (CollUtil.isEmpty(flowUserList)) { + return; + } + + Date currentTime = new Date(); + String date = DateUtil.format(beginDate, "yyMMdd"); + int index = 1; + + for (FlowUserBO flowUserBO : flowUserList) { + flowUserBO.setCreateTime(beginDate); + flowUserBO.setUpdateTime(currentTime); + flowUserBO.setDateType(dateType); + flowUserBO.setId(FlowUtil.getId(date + dateType, index++, FlowUserBO.ID_LENGTH)); + } + + // 先删除再更新 + mongoTemplate.remove(FlowUtil.getRemoveQuery(beginDate, endDate, FlowUserBO.ID_LENGTH, dateType), FlowUserBO.class); + + // 统计的数据批量保存到flow_system + mongoTemplate.insertAll(flowUserList); + } + + + private void batchInsertFlowRegionalBO(Integer dateType, Date beginDate, Date endDate, List flowRegionalList) { + if (CollUtil.isEmpty(flowRegionalList)) { + return; + } + + String currentTime = DateUtil.format(beginDate, "yyMMdd"); + Date currentDate = new Date(); + + for (FlowRegionalBO flowRegionalBO : flowRegionalList) { + flowRegionalBO.setCreateTime(beginDate); + flowRegionalBO.setUpdateTime(currentDate); + flowRegionalBO.setDateType(dateType); + if (flowRegionalBO.getProvinceId() == 0L) { + // 未知地区的数据 + flowRegionalBO.setId(Integer.parseInt(currentTime + dateType + "00")); + continue; + } + flowRegionalBO.setId(Integer.parseInt(currentTime + dateType + flowRegionalBO.getProvinceId())); + } + + // 先删除再更新 + mongoTemplate.remove(FlowUtil.getRemoveQuery(beginDate, endDate, FlowRegionalBO.ID_LENGTH, dateType), FlowRegionalBO.class); + + // 统计的数据批量保存到flow_system + mongoTemplate.insertAll(flowRegionalList); + } + + private void batchInsertFlowUserFootprintBO(Integer dateType, Date beginDate, Date endDate, List flowUserFootprintList) { + if (CollUtil.isEmpty(flowUserFootprintList)) { + return; + } + + String currentTime = DateUtil.format(beginDate, "yyMMdd"); + Date currentDate = new Date(); + + for (FlowUserFootprintBO flowUserFootprintBO : flowUserFootprintList) { + flowUserFootprintBO.setCreateTime(beginDate); + flowUserFootprintBO.setUpdateTime(currentDate); + flowUserFootprintBO.setDateType(dateType); + flowUserFootprintBO.setId(Integer.parseInt(currentTime + dateType + flowUserFootprintBO.getVisitId() + "0")); + } + + // 先删除再更新 + mongoTemplate.remove(FlowUtil.getRemoveQuery(beginDate, endDate, FlowUserFootprintBO.ID_LENGTH, dateType), FlowUserFootprintBO.class); + + // 统计的数据批量保存到flow_system + mongoTemplate.insertAll(flowUserFootprintList); + } + + + private List membershipUserStatisticsList(Long beginId, Long endId) { + + List aggregationOperationList = new ArrayList<>(); + + aggregationOperationList.add(Aggregation.match(Criteria.where("_id").gte(beginId).lt(endId).and("membership").is(1))); + + List flowUserBOList = this.aggragationUserReceiveCoupon(aggregationOperationList, new String[]{"vipUser"}); + flowUserBOList = flowUserBOList.stream().filter(flowUserBO -> Objects.nonNull(flowUserBO.getType())).collect(Collectors.toList()); + + flowUserBOList.sort(Comparator.comparing(FlowUserBO::getType)); + for (FlowUserBO flowUserBO : flowUserBOList) { + flowUserBO.setType(flowUserBO.getType() + 1); + } + + return flowUserBOList; + } + + private List aggragationUserReceiveCoupon(List aggregationOperationList, String[] fieIds) { + aggregationOperationList.add(Aggregation.group(fieIds) + .first("vipUser").as("type") + .sum("receiveCoupon").as("receiveCouponUser")); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowUserBO.class, + aggregationOperationList + ); + + LOG.info("aggragationUserReceiveCoupon:aggregation:{}", typedAggregation); + + List flowUserBOList = mongoTemplate + .aggregate(typedAggregation, "flow_user_operation", FlowUserBO.class + ).getMappedResults(); + + return new ArrayList<>(flowUserBOList); + } + + private List orderRegionalStatistics(Long beginId, Long endId) { + GroupOperation initGroupOperation = Aggregation.group("provinceId", "userId") + .first("provinceId").as("provinceId") + .sum("placeOrderAmount").as("placeOrderAmount") + .sum("payAmount").as("payAmount") + .max("placeOrder").as("placeOrder") + .max("pay").as("pay") + .sum("visitNum").as("visitNum"); + + + GroupOperation groupOperation = Aggregation.group("provinceId") + .first("provinceId").as("provinceId") + .sum("placeOrderAmount").as("placeOrderAmount") + .sum("payAmount").as("payAmount") + .sum("placeOrder").as("placeOrderUserNum") + .sum("pay").as("payUserNum") + .sum("visitNum").as("visitNum") + .count().as("visitUserNum"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowRegionalBO.class, + Aggregation.match(Criteria.where("_id").gte(beginId).lt(endId)), + initGroupOperation, + groupOperation + ); + LOG.info("orderRegionalStatistics:aggregation:{}", typedAggregation); + return new ArrayList<>(mongoTemplate.aggregate(typedAggregation, "flow_user_operation", FlowRegionalBO.class).getMappedResults()); + } + + private List userRegionalStatistics(Long beginId, Long endId) { + GroupOperation initGroupOperation = Aggregation.group("provinceId", "userId") + .first("provinceId").as("provinceId") + .sum("visit").as("spuVisitNum") + .sum("plusShopCartNum").as("plusShopCartNum") + .max("plusShopCart").as("plusShopCart"); + + + GroupOperation groupOperation = Aggregation.group("provinceId") + .first("provinceId").as("provinceId") + .sum("spuVisitNum").as("spuVisitNum") + .sum("plusShopCartNum").as("plusShopCartNum") + .sum("plusShopCart").as("plusShopCart") + .count().as("spuVisitUserNum"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowRegionalBO.class, + Aggregation.match(Criteria.where("_id").gte(beginId).lt(endId)), + initGroupOperation, + groupOperation + ); + LOG.info("userRegionalStatistics:aggregation:{}", typedAggregation); + return mongoTemplate.aggregate(typedAggregation, "flow_spu_user", FlowRegionalBO.class).getMappedResults(); + } + + private void statisticsUserOrderLog(List userIds, + List userAnalyseLogList, + Date beginDate, Date endDate) { + + MatchOperation matchOperation = Aggregation.match( + Criteria.where("createTime").gte(beginDate).lt(endDate).and("userId").in(userIds)); + + ProjectionOperation projectionOperation = Aggregation.project("userId", "isPayed") + .and("actualTotal").as("placeOrderAmount") + .and("allCount").as("placeOrderNum") + .and(ConditionalOperators.when(Criteria.where("isPayed").is(1)).then("$actualTotal").otherwise(0)).as("payAmount") + .and(ConditionalOperators.when(Criteria.where("isPayed").is(1)).then("$allCount").otherwise(0)).as("payNum"); + + + GroupOperation groupOperation = Aggregation.group("userId") + .first("userId").as("userId") + .first("placeOrderAmount").as("placeOrderAmount") + .first("placeOrderNum").as("placeOrderNum") + .first("payAmount").as("payAmount") + .first("payNum").as("payNum"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowUserOperationBO.class, + matchOperation, + projectionOperation, + groupOperation + ); + + List flowUserOperationBOList = mongoTemplate + .aggregate(typedAggregation, "order", FlowUserOperationBO.class) + .getMappedResults(); + if (CollUtil.isEmpty(flowUserOperationBOList)) { + return; + } + Map map = userAnalyseLogList.stream() + .collect(Collectors.toMap(FlowUserOperationBO::getUserId, u -> u)); + for (FlowUserOperationBO flowUserOperationBO : flowUserOperationBOList) { + if (!map.containsKey(flowUserOperationBO.getUserId())) { + continue; + } + FlowUserOperationBO userAnalyseLog = map.get(flowUserOperationBO.getUserId()); + userAnalyseLog.setPlaceOrderAmount(flowUserOperationBO.getPlaceOrderAmount()); + userAnalyseLog.setPayAmount(flowUserOperationBO.getPayAmount()); + if (Objects.nonNull(flowUserOperationBO.getPlaceOrderNum()) && flowUserOperationBO.getPlaceOrderNum() > 0) { + userAnalyseLog.setPlaceOrder(1); + } + if (Objects.nonNull(flowUserOperationBO.getPayNum()) && flowUserOperationBO.getPayNum() > 0) { + userAnalyseLog.setPay(1); + } + userAnalyseLog.setPlaceOrderNum(flowUserOperationBO.getPlaceOrderNum()); + userAnalyseLog.setPayNum(flowUserOperationBO.getPayNum()); + } + } + + private void loadUserMemberInfo(List userIds, + List userAnalyseLogList, + Date beginDate, Date endDate) { + + // 新老、付费免费会员 + List userList = userFeignClient.listUserByUserIds(userIds); + + // 用户领券数量 + ServerResponseEntity> receiveCouponResponseEntity = couponFeignClient.userReceiveCouponCount(new ReceiveCouponDTO(userIds, beginDate, endDate)); + if (!receiveCouponResponseEntity.isSuccess()) { + throw new LuckException(receiveCouponResponseEntity.getMsg()); + } + List couponUserList = receiveCouponResponseEntity.getData(); + Map userMap = userList.stream().collect(Collectors.toMap(UserApiVO::getUserId, u -> u)); + + long beginTime = beginDate.getTime(); + long endTime = endDate.getTime(); + for (FlowUserOperationBO flowUserOperationBO : userAnalyseLogList) { + if (!Objects.equals(flowUserOperationBO.getMembership(), 1) || !userMap.containsKey(flowUserOperationBO.getUserId())) { + continue; + } + // 新注册的会员 + UserApiVO user = userMap.get(flowUserOperationBO.getUserId()); + long createTime = user.getCreateTime().getTime(); + if (beginTime < createTime && createTime < endTime) { + flowUserOperationBO.setNewUser(1); + } else { + flowUserOperationBO.setNewUser(0); + } + // 当天购买vip用户 + if (Objects.nonNull(user.getVipStartTime())) { + long vipStartTime = user.getVipStartTime().getTime(); + if (beginTime < vipStartTime && vipStartTime < endTime) { + flowUserOperationBO.setNewVipUser(1); + } else { + flowUserOperationBO.setNewVipUser(0); + } + } + flowUserOperationBO.setVipUser(user.getLevelType()); + + //优惠券 + if (couponUserList.contains(flowUserOperationBO.getUserId())) { + flowUserOperationBO.setReceiveCoupon(1); + } + } + } + + private List listUserAnalyseLogBO(Date beginDate, Date endDate) { + GroupOperation initGroupOperation = Aggregation.group("oid") + .last("uid").as("uid") + .first("ip").as("provinceId") + .max("s").as("step") + .count().as("visit"); + + ProjectionOperation projectionOperation = Aggregation.project("visit", "step", "provinceId") + .and(ConditionalOperators.when(Criteria.where("uid").gt(0)).then("$uid").otherwise("$_id.oid")).as("uid") + .and(ConditionalOperators.when(Criteria.where("uid").gt(0)).then(1).otherwise(0)).as("membership"); + + GroupOperation groupOperation = Aggregation.group("uid") + .first("provinceId").as("provinceId") + .first("uid").as("userId") + .max("step").as("step") + .max("membership").as("membership") + .sum("visit").as("visitNum"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowUserOperationBO.class, + Aggregation.match(Criteria.where("dt").gte(beginDate).lt(endDate)), + initGroupOperation, + projectionOperation, + groupOperation + ); + + LOG.info("listUserAnalyseLogBO.typedAggregation:{}", typedAggregation); + + List userAnalyseLogList = mongoTemplate + .aggregate(typedAggregation, "flow_user_log", FlowUserOperationBO.class) + .getMappedResults(); + + if (CollUtil.isEmpty(userAnalyseLogList)) { + return userAnalyseLogList; + } + + // 获取省名称列表 + List areaList = areaFeignClient.listProvinceArea(); + Map areaMap = areaList.stream().collect(Collectors.toMap(AreaVO::getAreaName, AreaVO::getAreaId)); + + // 设置省id + for (FlowUserOperationBO flowUserOperationBO : userAnalyseLogList) { + if (Objects.isNull(flowUserOperationBO.getProvinceId())) { + continue; + } + flowUserOperationBO.setProvinceId(IpSearchUtil.getProvinceIdByUserIp(flowUserOperationBO.getProvinceId(), areaMap)); + } + return userAnalyseLogList; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/task/FlowTask.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/task/FlowTask.java new file mode 100644 index 0000000..1af0af6 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/task/FlowTask.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.task; + +import com.tmerclub.cloud.flow.service.FlowService; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 流量统计定时任务 + * + * @author YXF + * @date 2021-05-21 + */ +@SuppressWarnings("rawtypes") +@Component +public class FlowTask { + + @Autowired + private FlowService flowService; + + /** + * 统计商品信息 + */ + @XxlJob("statisticalFlowData") + public void statisticalFlowUserLog() { + //根据当日数据,整合统计成用户、商品、用户端的数据 (当天用户操作数据初步统计) + try { + flowService.statisticalFlowUserLog(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/util/FlowArithUtil.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/util/FlowArithUtil.java new file mode 100644 index 0000000..a1c5c10 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/util/FlowArithUtil.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.util; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.util.Arith; + +/** + * 流量统计计算工具类 + * + * @author YXF + */ +public class FlowArithUtil { + + private static final Double HUNDRED_DOUBLE = 100.0D; + private static final Double ZERO_DOUBLE = 0.0D; + private static final Integer HUNDRED = 100; + + /** + * 获取平均数 + * + * @param value + * @param oldValue + * @return 比例 + */ + public static Double getAverage(Integer value, Integer oldValue) { + return Arith.div(value, oldValue, 2); + } + + /** + * 计算比例 + * + * @param value + * @param oldValue + * @return 比例 + */ + public static Double getRatio(Integer value, Integer oldValue) { + return Arith.mul(Arith.div(value, oldValue, 2), 100); + } + + /** + * 计算比例 + * + * @param value + * @param oldValue + * @return 比例 + */ + public static Double getRatio(Integer value, Integer oldValue, Integer scale) { + return Arith.mul(Arith.div(value, oldValue, scale), 100); + } + + /** + * 计算比例 + * + * @param value + * @param oldValue + * @return 比例 + */ + public static Double getRatio(Long value, Integer oldValue) { + return Arith.mul(Arith.div(value, oldValue, 2), 100); + } + + /** + * 获取增长比例 + * + * @param value + * @param oldValue + * @return + */ + public static Double getIncreaseRatio(Long value, Long oldValue) { + return calculateIncreaseRatio(value.doubleValue(), oldValue.doubleValue()); + } + + + /** + * 获取增长比例 + * + * @param value + * @param oldValue + * @return + */ + public static Double getIncreaseRatio(Integer value, Integer oldValue) { + return calculateIncreaseRatio(value.doubleValue(), oldValue.doubleValue()); + } + + + /** + * 获取增长比例 + * + * @param value + * @param oldValue + * @return + */ + public static Double getIncreaseRatio(Double value, Double oldValue) { + return calculateIncreaseRatio(value, oldValue); + } + + /** + * 计算两个值增加的比例 + * + * @param value + * @param oldValue + * @return + */ + private static Double calculateIncreaseRatio(Double value, Double oldValue) { + if (value == 0 && oldValue == 0) { + return ZERO_DOUBLE; + } else if (value == 0 && oldValue > 0) { + return -HUNDRED_DOUBLE; + } else if (value > 0 && oldValue == 0) { + return ZERO_DOUBLE; + } + double sub = Arith.sub(value, oldValue); + return Arith.mul(Arith.div(sub, oldValue, 2), HUNDRED); + } + + public static Long getAnalysisAmount(Long value, Integer oldValue) { + if (value == 0 && oldValue == 0) { + return Constant.ZERO_LONG; + } + return (long) Arith.div(value.doubleValue(), oldValue.doubleValue(), 0); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/util/FlowUtil.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/util/FlowUtil.java new file mode 100644 index 0000000..b82135c --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/util/FlowUtil.java @@ -0,0 +1,268 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.util; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.product.dto.ProdEffectDTO; +import com.tmerclub.cloud.api.user.dto.MemberReqDTO; +import com.tmerclub.cloud.flow.constant.FlowDateTypeEnum; +import com.tmerclub.cloud.flow.dto.FlowAnalysisDTO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; + +import java.util.Date; +import java.util.Objects; + +/** + * 流量统计计算工具类 + * + * @author YXF + */ +public class FlowUtil { + + private static final Logger LOG = LoggerFactory.getLogger(FlowUtil.class); + + private static final int DEFAULT_ID_LENGTH = 18; + /** 长度为8 **/ + private static final int EIGHT_IN_LENGTH = 8; + + private static final String ONE_CHARACTERS = "0"; + + private static final String TWO_CHARACTERS = "00"; + + private static final String THREE_CHARACTERS = "000"; + + private static final String FOUR_CHARACTERS = "0000"; + + private static final String FIVE_CHARACTERS = "00000"; + + private static final String SIX_CHARACTERS = "000000"; + private static final String SEVEN_CHARACTERS = "0000000"; + private static final String EIGHT_CHARACTERS = "00000000"; + private static final String NINE_CHARACTERS = "000000000"; + private static final String TEN_CHARACTERS = "0000000000"; + private static final String ELEVEN_CHARACTERS = "00000000000"; + private static final String TWELVE_CHARACTERS = "000000000000"; + private static final String THIRTEEN_CHARACTERS = "0000000000000"; + + public static Long getId(String id, int index) { + return getId(id, index, DEFAULT_ID_LENGTH); + } + public static Long getId(String id, long index) { + return getId(id, index, DEFAULT_ID_LENGTH); + } + + public static Long getId(String id, int index, int idLength) { + String indexStr = String.valueOf(index); + int length = idLength - id.length() - indexStr.length(); + id = id + splicingId(length) + indexStr; + return Long.parseLong(id); + } + + public static Long getId(String id, long index, int idLength) { + String indexStr = String.valueOf(index); + int length = idLength - id.length() - indexStr.length(); + LOG.info("id:{}, index:{}, idLength:{}", id , index, idLength); + id = id + splicingId(length) + indexStr; + return Long.parseLong(id); + } + + private static String splicingId(int length) { + String idStr; + switch (length) { + case 1: + idStr = ONE_CHARACTERS; + break; + case 2: + idStr = TWO_CHARACTERS; + break; + case 3: + idStr = THREE_CHARACTERS; + break; + case 4: + idStr = FOUR_CHARACTERS; + break; + case 5: + idStr = FIVE_CHARACTERS; + break; + case 6: + idStr = SIX_CHARACTERS; + break; + case 7: + idStr = SEVEN_CHARACTERS; + break; + case 8: + idStr = EIGHT_CHARACTERS; + break; + case 9: + idStr = NINE_CHARACTERS; + break; + case 10: + idStr = TEN_CHARACTERS; + break; + case 11: + idStr = ELEVEN_CHARACTERS; + break; + case 12: + idStr = TWELVE_CHARACTERS; + break; + case 13: + idStr = THIRTEEN_CHARACTERS; + break; + default: + idStr = ""; + break; + } + return idStr; + } + + public static Long timeToId(Date date) { + String format = dateToString(date); + return Long.parseLong(format + TWELVE_CHARACTERS); + } + + public static Long timeToId(Date date, int idLength) { + String format = dateToString(date); + return Long.parseLong(format + splicingId(idLength - format.length())); + } + + public static Long timeToId(Date date, Object o, int idLength) { + String format = dateToString(date) + o.toString(); + return Long.parseLong(format + splicingId(idLength - format.length())); + } + + public static Long stringToId(String str, int idLength) { + return Long.parseLong(str + splicingId(idLength - str.length())); + } + + public static void handleTime(FlowAnalysisDTO flowAnalysisDTO) { + Date[] dateArray = getDateByDateType(flowAnalysisDTO.getStartTime(), flowAnalysisDTO.getDateType()); + flowAnalysisDTO.setStartTime(dateArray[0]); + flowAnalysisDTO.setEndTime(dateArray[1]); + } + + public static void handleTime(MemberReqDTO memberReqDTO) { + Date[] dateArray = getDateByDateType(memberReqDTO.getStartTime(), memberReqDTO.getDateType()); + memberReqDTO.setStartTime(dateArray[0]); + memberReqDTO.setEndTime(dateArray[1]); + } + + public static void handleTime(ProdEffectDTO prodEffectDTO) { + Date[] dateArray = getDateByDateType(prodEffectDTO.getStartTime(), prodEffectDTO.getDateType()); + prodEffectDTO.setStartTime(dateArray[0]); + prodEffectDTO.setEndTime(dateArray[1]); + } + + private static Date[] getDateByDateType(Date startTime, Integer dateType) { + FlowDateTypeEnum flowDateTypeEnum = FlowDateTypeEnum.instance(dateType); + Date endTime; + if (Objects.equals(flowDateTypeEnum, FlowDateTypeEnum.WEEK)) { + startTime = DateUtil.beginOfWeek(startTime); + endTime = DateUtil.beginOfWeek(DateUtil.offsetWeek(startTime, flowDateTypeEnum.getNum())); + } else if (Objects.equals(flowDateTypeEnum, FlowDateTypeEnum.MONTH)) { + startTime = DateUtil.beginOfMonth(startTime); + endTime = DateUtil.beginOfMonth(DateUtil.offsetMonth(startTime, flowDateTypeEnum.getNum())); + } else if (FlowDateTypeEnum.nearlyTime(dateType)) { + endTime = DateUtil.beginOfDay(new Date()); + startTime = DateUtil.offsetDay(endTime, -flowDateTypeEnum.getNum()); + } else if (Objects.equals(FlowDateTypeEnum.REAL_TIME.value(), dateType)) { + // 今日实时为当天的时间 + startTime = DateUtil.beginOfDay(new Date()); + endTime = DateUtil.offsetDay(startTime, 1); + } else { + startTime = DateUtil.beginOfDay(startTime); + endTime = DateUtil.offsetDay(startTime, flowDateTypeEnum.getNum()); + } + return new Date[]{startTime, endTime}; + } + + public static Integer getFlowSystemId(Date startTime, Integer dateTime, Integer systemType) { + String format = dateToString(startTime); + int id = Integer.parseInt(format + dateTime + systemType); + LOG.info("getFlowSystemId-id:{}", id); + return id; + } + + public static String dateToString(Date date) { + String format = DateUtil.format(date, "yyMMdd"); + return format; + } + + public static Date previousTime(Date startTime, Integer dateType) { + if (Objects.isNull(startTime) || Objects.isNull(dateType)) { + return null; + } + + FlowDateTypeEnum flowDateTypeEnum = FlowDateTypeEnum.instance(dateType); + + Date date; + if (Objects.equals(FlowDateTypeEnum.WEEK, flowDateTypeEnum)) { + date = DateUtil.beginOfWeek(DateUtil.offsetWeek(startTime, -flowDateTypeEnum.getNum())); + } else if (Objects.equals(FlowDateTypeEnum.MONTH.value(), flowDateTypeEnum)) { + date = DateUtil.beginOfMonth(DateUtil.offsetMonth(startTime, -flowDateTypeEnum.getNum())); + } else { + date = DateUtil.offsetDay(startTime, -flowDateTypeEnum.getNum()); + } + return date; + } + + public static Date previousTime(Date startTime, Integer dateType, Integer offset) { + if (Objects.isNull(startTime) || Objects.isNull(dateType)) { + return null; + } + + Date date; + if (Objects.equals(FlowDateTypeEnum.WEEK.value(), dateType)) { + date = DateUtil.beginOfWeek(DateUtil.offsetWeek(startTime, -offset)); + } else if (Objects.equals(FlowDateTypeEnum.MONTH.value(), dateType)) { + date = DateUtil.beginOfMonth(DateUtil.offsetMonth(startTime, -offset)); + } else { + date = DateUtil.offsetDay(startTime, -offset); + } + return date; + } + + public static String formatOnDateType(Date date, Integer dateType) { + String format; + if (Objects.equals(FlowDateTypeEnum.MONTH.value(), dateType)) { + format = DateUtil.format(date, "yyyy-MM") ; + } else if (Objects.equals(FlowDateTypeEnum.WEEK.value(), dateType)) { + int week = DateUtil.weekOfYear(date); + format = DateUtil.format(date, "yyyy") + "第" + week + "周"; + } else { + format = DateUtil.format(date, "yyyy-MM-dd"); + } + return format; + } + + public static Date increaseByDateType(Date currentTime, Integer dateType) { + + if (Objects.equals(FlowDateTypeEnum.MONTH, dateType)) { + return DateUtil.beginOfMonth(DateUtil.offsetMonth(currentTime, 1)); + } else if (Objects.equals(FlowDateTypeEnum.WEEK, dateType)) { + return DateUtil.beginOfWeek(DateUtil.offsetWeek(currentTime, 1)); + } + return DateUtil.offsetDay(currentTime, 1); + } + + public static Query getRemoveQuery(Date beginDate, Date endDate, int idLength, Integer dateType) { + // 近期数据的删除--由于只保存一份最新的统计数据,且每天都在更新日期不固定,所以通过时间类型来删除 + if (FlowDateTypeEnum.nearlyTime(dateType)) { + return new Query(Criteria.where("dateType").is(dateType)) ; + } + + Long beginId = FlowUtil.timeToId(beginDate, idLength); + Long endId = FlowUtil.timeToId(endDate, idLength); + // 先删除再更新-mongo没有事务,如果之前保存后程序报错了,数据还是保存在mongodb中 + return new Query(Criteria.where("_id").gte(beginId).lt(endId).and("dateType").is(dateType)); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowAnalysisDataExcelVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowAnalysisDataExcelVO.java new file mode 100644 index 0000000..45a2807 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowAnalysisDataExcelVO.java @@ -0,0 +1,117 @@ +package com.tmerclub.cloud.flow.vo; + +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class FlowAnalysisDataExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "流量分析信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty({"流量分析信息", "系统类型"}) + private String type; + + @ExcelProperty({"流量分析信息", "全部"}) + private String all; + + @ExcelProperty({"流量分析信息", "PC"}) + private String pc; + + @ExcelProperty({"流量分析信息", "H5"}) + private String h5; + + @ExcelProperty({"流量分析信息", "微信小程序"}) + private String wx; + + @ExcelProperty({"流量分析信息", "安卓"}) + private String android; + + @ExcelProperty({"流量分析信息", "ios"}) + private String ios; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getAll() { + return all; + } + + public void setAll(String all) { + this.all = all; + } + + public String getPc() { + return pc; + } + + public void setPc(String pc) { + this.pc = pc; + } + + public String getH5() { + return h5; + } + + public void setH5(String h5) { + this.h5 = h5; + } + + public String getWx() { + return wx; + } + + public void setWx(String wx) { + this.wx = wx; + } + + public String getAndroid() { + return android; + } + + public void setAndroid(String android) { + this.android = android; + } + + public String getIos() { + return ios; + } + + public void setIos(String ios) { + this.ios = ios; + } + + @Override + public String toString() { + return "FlowAnalysisDataExcelVO{" + + "type='" + type + '\'' + + ", all=" + all + + ", pc=" + pc + + ", h5=" + h5 + + ", wx=" + wx + + ", android=" + android + + ", ios=" + ios + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowProdEffectDataExcelVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowProdEffectDataExcelVO.java new file mode 100644 index 0000000..e5ee347 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowProdEffectDataExcelVO.java @@ -0,0 +1,261 @@ +package com.tmerclub.cloud.flow.vo; + +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class FlowProdEffectDataExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "商品洞察"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty({"商品洞察", "店铺名称"}) + private String shopName; + + @ExcelProperty({"商品洞察", "商品名称"}) + private String spuName; + + @ExcelProperty({"商品洞察", "商品价格"}) + private Long price; + + @ExcelProperty({"商品洞察", "曝光次数"}) + private Integer expose; + + @ExcelProperty({"商品洞察", "曝光人数"}) + private Integer exposePersonNum; + + @ExcelProperty({"商品洞察", "加购人数"}) + private Integer addCartPerson; + + @ExcelProperty({"商品洞察", "加购件数"}) + private Integer addCart; + + @ExcelProperty({"商品洞察", "下单人数"}) + private Integer placeOrderPerson; + + @ExcelProperty({"商品洞察", "支付人数"}) + private Integer payPerson; + + @ExcelProperty({"商品洞察", "下单商品件数"}) + private Integer placeOrderNum; + + @ExcelProperty({"商品洞察", "支付商品件数"}) + private Integer payNum; + + @ExcelProperty({"商品洞察", "商品下单金额"}) + private Double placeOrderAmount; + + @ExcelProperty({"商品洞察", "商品支付金额"}) + private Double payAmount; + + @ExcelProperty({"商品洞察", "申请退款订单数"}) + private Integer refundNum; + + @ExcelProperty({"商品洞察", "申请退款人数"}) + private Integer refundPerson; + + @ExcelProperty({"商品洞察", "成功退款订单数"}) + private Integer refundSuccessNum; + + @ExcelProperty({"商品洞察", "成功退款人数"}) + private Integer refundSuccessPerson; + + @ExcelProperty({"商品洞察", "成功退款金额"}) + private Double refundSuccessAmount; + + @ExcelProperty({"商品洞察", "退款率"}) + private Double refundSuccessRate; + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Integer getExpose() { + return expose; + } + + public void setExpose(Integer expose) { + this.expose = expose; + } + + public Integer getExposePersonNum() { + return exposePersonNum; + } + + public void setExposePersonNum(Integer exposePersonNum) { + this.exposePersonNum = exposePersonNum; + } + + public Integer getAddCartPerson() { + return addCartPerson; + } + + public void setAddCartPerson(Integer addCartPerson) { + this.addCartPerson = addCartPerson; + } + + public Integer getAddCart() { + return addCart; + } + + public void setAddCart(Integer addCart) { + this.addCart = addCart; + } + + public Integer getPlaceOrderPerson() { + return placeOrderPerson; + } + + public void setPlaceOrderPerson(Integer placeOrderPerson) { + this.placeOrderPerson = placeOrderPerson; + } + + public Integer getPayPerson() { + return payPerson; + } + + public void setPayPerson(Integer payPerson) { + this.payPerson = payPerson; + } + + public Integer getPlaceOrderNum() { + return placeOrderNum; + } + + public void setPlaceOrderNum(Integer placeOrderNum) { + this.placeOrderNum = placeOrderNum; + } + + public Integer getPayNum() { + return payNum; + } + + public void setPayNum(Integer payNum) { + this.payNum = payNum; + } + + public Double getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Double placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Double getPayAmount() { + return payAmount; + } + + public void setPayAmount(Double payAmount) { + this.payAmount = payAmount; + } + + public Integer getRefundNum() { + return refundNum; + } + + public void setRefundNum(Integer refundNum) { + this.refundNum = refundNum; + } + + public Integer getRefundPerson() { + return refundPerson; + } + + public void setRefundPerson(Integer refundPerson) { + this.refundPerson = refundPerson; + } + + public Integer getRefundSuccessNum() { + return refundSuccessNum; + } + + public void setRefundSuccessNum(Integer refundSuccessNum) { + this.refundSuccessNum = refundSuccessNum; + } + + public Integer getRefundSuccessPerson() { + return refundSuccessPerson; + } + + public void setRefundSuccessPerson(Integer refundSuccessPerson) { + this.refundSuccessPerson = refundSuccessPerson; + } + + public Double getRefundSuccessAmount() { + return refundSuccessAmount; + } + + public void setRefundSuccessAmount(Double refundSuccessAmount) { + this.refundSuccessAmount = refundSuccessAmount; + } + + public Double getRefundSuccessRate() { + return refundSuccessRate; + } + + public void setRefundSuccessRate(Double refundSuccessRate) { + this.refundSuccessRate = refundSuccessRate; + } + + @Override + public String toString() { + return "FlowProdEffectDataExcelVO{" + + "shopName='" + shopName + '\'' + + ", spuName='" + spuName + '\'' + + ", price=" + price + + ", expose=" + expose + + ", exposePersonNum=" + exposePersonNum + + ", addCartPerson=" + addCartPerson + + ", addCart=" + addCart + + ", placeOrderPerson=" + placeOrderPerson + + ", payPerson=" + payPerson + + ", placeOrderNum=" + placeOrderNum + + ", payNum=" + payNum + + ", placeOrderAmount=" + placeOrderAmount + + ", payAmount=" + payAmount + + ", refundNum=" + refundNum + + ", refundPerson=" + refundPerson + + ", refundSuccessNum=" + refundSuccessNum + + ", refundSuccessPerson=" + refundSuccessPerson + + ", refundSuccessAmount=" + refundSuccessAmount + + ", refundSuccessRate=" + refundSuccessRate + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowProdEffectRespVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowProdEffectRespVO.java new file mode 100644 index 0000000..9410fd3 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowProdEffectRespVO.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Pineapple + * @date 2021/5/25 11:04 + */ +public class FlowProdEffectRespVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品id + */ + @Schema(description = "商品id") + private Long spuId; + /** + * 曝光次数 + */ + @Schema(description = "曝光次数") + private Integer expose; + /** + * 曝光人数 + */ + @Schema(description = "曝光人数") + private Integer exposePersonNum; + /** + * 加购人数 + */ + @Schema(description = "加购人数") + private Integer addCartPerson; + /** + * 加购件数 + */ + @Schema(description = "加购件数") + private Integer addCart; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getExpose() { + return expose; + } + + public void setExpose(Integer expose) { + this.expose = expose; + } + + public Integer getExposePersonNum() { + return exposePersonNum; + } + + public void setExposePersonNum(Integer exposePersonNum) { + this.exposePersonNum = exposePersonNum; + } + + public Integer getAddCartPerson() { + return addCartPerson; + } + + public void setAddCartPerson(Integer addCartPerson) { + this.addCartPerson = addCartPerson; + } + + public Integer getAddCart() { + return addCart; + } + + public void setAddCart(Integer addCart) { + this.addCart = addCart; + } + + @Override + public String toString() { + return "FlowProdEffectRespVO{" + + "spuId=" + spuId + + ", expose=" + expose + + ", exposePersonNum=" + exposePersonNum + + ", addCartPerson=" + addCartPerson + + ", addCart=" + addCart + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowSourDataExcelVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowSourDataExcelVO.java new file mode 100644 index 0000000..5b3d584 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowSourDataExcelVO.java @@ -0,0 +1,105 @@ +package com.tmerclub.cloud.flow.vo; + +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class FlowSourDataExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "会员人数趋势信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty({"会员人数趋势信息", "类型"}) + private String type; + + @ExcelProperty({"会员人数趋势信息", "PC"}) + private String pc; + + @ExcelProperty({"会员人数趋势信息", "H5"}) + private String h5; + + @ExcelProperty({"会员人数趋势信息", "微信小程序"}) + private String wx; + + @ExcelProperty({"会员人数趋势信息", "安卓"}) + private String android; + + @ExcelProperty({"会员人数趋势信息", "ios"}) + private String ios; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getPc() { + return pc; + } + + public void setPc(String pc) { + this.pc = pc; + } + + public String getH5() { + return h5; + } + + public void setH5(String h5) { + this.h5 = h5; + } + + public String getWx() { + return wx; + } + + public void setWx(String wx) { + this.wx = wx; + } + + public String getAndroid() { + return android; + } + + public void setAndroid(String android) { + this.android = android; + } + + public String getIos() { + return ios; + } + + public void setIos(String ios) { + this.ios = ios; + } + + @Override + public String toString() { + return "FlowAnalysisDataExcelVO{" + + "type='" + type + '\'' + + ", pc=" + pc + + ", h5=" + h5 + + ", wx=" + wx + + ", android=" + android + + ", ios=" + ios + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowTrendExcelVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowTrendExcelVO.java new file mode 100644 index 0000000..0c3ab09 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowTrendExcelVO.java @@ -0,0 +1,141 @@ +package com.tmerclub.cloud.flow.vo; + +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class FlowTrendExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "流量趋势分析信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty({"流量趋势分析信息", "时间"}) + private String date; + + @ExcelProperty({"流量趋势分析信息", "访客数"}) + private Integer userNums; + + @ExcelProperty({"流量趋势分析信息", "新访客数"}) + private Integer newUserNums; + + @ExcelProperty({"流量趋势分析信息", "浏览量"}) + private Integer visitNums; + + @ExcelProperty({"流量趋势分析信息", "人均浏览量"}) + private Double averageVisitNums; + + @ExcelProperty({"流量趋势分析信息", "加购数量"}) + private Integer plusShopCart; + + @ExcelProperty({"流量趋势分析信息", "跳失率"}) + private Double lossUserRate; + + @ExcelProperty({"流量趋势分析信息", "下单人数"}) + private Integer placeOrderUser; + + @ExcelProperty({"流量趋势分析信息", "支付人数"}) + private Integer payUser; + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public Integer getUserNums() { + return userNums; + } + + public void setUserNums(Integer userNums) { + this.userNums = userNums; + } + + public Integer getNewUserNums() { + return newUserNums; + } + + public void setNewUserNums(Integer newUserNums) { + this.newUserNums = newUserNums; + } + + public Integer getVisitNums() { + return visitNums; + } + + public void setVisitNums(Integer visitNums) { + this.visitNums = visitNums; + } + + public Double getAverageVisitNums() { + return averageVisitNums; + } + + public void setAverageVisitNums(Double averageVisitNums) { + this.averageVisitNums = averageVisitNums; + } + + public Integer getPlusShopCart() { + return plusShopCart; + } + + public void setPlusShopCart(Integer plusShopCart) { + this.plusShopCart = plusShopCart; + } + + public Double getLossUserRate() { + return lossUserRate; + } + + public void setLossUserRate(Double lossUserRate) { + this.lossUserRate = lossUserRate; + } + + public Integer getPlaceOrderUser() { + return placeOrderUser; + } + + public void setPlaceOrderUser(Integer placeOrderUser) { + this.placeOrderUser = placeOrderUser; + } + + public Integer getPayUser() { + return payUser; + } + + public void setPayUser(Integer payUser) { + this.payUser = payUser; + } + + @Override + public String toString() { + return "FlowTrendExcelVO{" + + "date='" + date + '\'' + + ", userNums=" + userNums + + ", newUserNums=" + newUserNums + + ", visitNums=" + visitNums + + ", averageVisitNums=" + averageVisitNums + + ", plusShopCart=" + plusShopCart + + ", lossUserRate=" + lossUserRate + + ", placeOrderUser=" + placeOrderUser + + ", payUser=" + payUser + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FormItemVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FormItemVO.java new file mode 100644 index 0000000..30558a1 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FormItemVO.java @@ -0,0 +1,55 @@ +package com.tmerclub.cloud.flow.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class FormItemVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键") + private Integer id; + + @Schema(description = "报表内容") + private String value; + + @Schema(description = "是否选择") + private Boolean select; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public Boolean getSelect() { + return select; + } + + public void setSelect(Boolean select) { + this.select = select; + } + + @Override + public String toString() { + return "FormItemVO{" + + "id=" + id + + ", value='" + value + '\'' + + ", select=" + select + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ProductAnalyseVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ProductAnalyseVO.java new file mode 100644 index 0000000..6d8e1c2 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ProductAnalyseVO.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流量分析—商品分析VO + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public class ProductAnalyseVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long productAnalyseId; + + @Schema(description = "创建日期") + private Date createDate; + + @Schema(description = "页面编号") + private Long pageId; + + @Schema(description = "系统类型") + private Integer systemType; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "访问次数") + private Long visis; + + @Schema(description = "点击数") + private Long click; + + @Schema(description = "分享访问次数") + private Long shareVisit; + + @Schema(description = "下单金额") + private Double placeOrderAmount; + + @Schema(description = "支付金额") + private Double payAmount; + + @Schema(description = "加购数量") + private Integer plusShopCart; + + public Long getProductAnalyseId() { + return productAnalyseId; + } + + public void setProductAnalyseId(Long productAnalyseId) { + this.productAnalyseId = productAnalyseId; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public Long getPageId() { + return pageId; + } + + public void setPageId(Long pageId) { + this.pageId = pageId; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getVisis() { + return visis; + } + + public void setVisis(Long visis) { + this.visis = visis; + } + + public Long getClick() { + return click; + } + + public void setClick(Long click) { + this.click = click; + } + + public Long getShareVisit() { + return shareVisit; + } + + public void setShareVisit(Long shareVisit) { + this.shareVisit = shareVisit; + } + + public Double getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Double placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Double getPayAmount() { + return payAmount; + } + + public void setPayAmount(Double payAmount) { + this.payAmount = payAmount; + } + + public Integer getPlusShopCart() { + return plusShopCart; + } + + public void setPlusShopCart(Integer plusShopCart) { + this.plusShopCart = plusShopCart; + } + + @Override + public String toString() { + return "ProductAnalyseVO{" + + "productAnalyseId=" + productAnalyseId + + ",createDate=" + createDate + + ",pageId=" + pageId + + ",systemType=" + systemType + + ",spuId=" + spuId + + ",shopId=" + shopId + + ",visis=" + visis + + ",click=" + click + + ",shareVisit=" + shareVisit + + ",placeOrderAmount=" + placeOrderAmount + + ",payAmount=" + payAmount + + ",plusShopCart=" + plusShopCart + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ProductFlowInfoVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ProductFlowInfoVO.java new file mode 100644 index 0000000..a3f7238 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ProductFlowInfoVO.java @@ -0,0 +1,125 @@ +package com.tmerclub.cloud.flow.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author chiley + * @date 2022/6/24 13:47 + */ +public class ProductFlowInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品图片pic") + private String spuImg; + + private String userId; + + private Long payAmount; + @Schema(description = "浏览量") + private Long visitCount; + + @Schema(description = "访客数") + private Long visitUserCount; + + @Schema(description = "支付用户数") + private Long payUserCount; + + @Schema(description = "访问-支付转化率") + private Double payRate; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSpuImg() { + return spuImg; + } + + public void setSpuImg(String spuImg) { + this.spuImg = spuImg; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Long getVisitCount() { + return visitCount; + } + + public void setVisitCount(Long visitCount) { + this.visitCount = visitCount; + } + + public Long getVisitUserCount() { + return visitUserCount; + } + + public void setVisitUserCount(Long visitUserCount) { + this.visitUserCount = visitUserCount; + } + + public Long getPayUserCount() { + return payUserCount; + } + + public void setPayUserCount(Long payUserCount) { + this.payUserCount = payUserCount; + } + + public Double getPayRate() { + return payRate; + } + + public void setPayRate(Double payRate) { + this.payRate = payRate; + } + + @Override + public String toString() { + return "ProductFlowInfoVO{" + + "spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", spuImg='" + spuImg + '\'' + + ", userId='" + userId + '\'' + + ", payAmount=" + payAmount + + ", visitCount=" + visitCount + + ", visitUserCount=" + visitUserCount + + ", payUserCount=" + payUserCount + + ", payRate=" + payRate + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/UserAnalysisVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/UserAnalysisVO.java new file mode 100644 index 0000000..0007942 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/UserAnalysisVO.java @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 流量分析—用户数据VO + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public class UserAnalysisVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long userAnalysisId; + + @Schema(description = "创建时间") + private Date createDate; + + @Schema(description = "用户Id(用户未登陆时,为uuid)") + private String userId; + + @Schema(description = "省Id") + private Long provinceId; + + @Schema(description = "省名称") + private String provinceName; + + @Schema(description = "加购数量") + private Long plusShopCart; + + @Schema(description = "下单金额") + private Long placeOrderAmount; + + @Schema(description = "支付金额") + private Long payAmount; + + @Schema(description = "浏览量") + private Integer visitNums; + + @Schema(description = "访客数" ) + private Integer visitUserNum; + + @Schema(description = "点击量" ) + private Integer clickNums; + + @Schema(description = "0:旧用户, 1:新用户, 2.未登陆用户") + private Integer userType; + + @Schema(description = "会话数") + private Integer sessionNums; + + @Schema(description = "系统类型 (1:pc 2:h5 3:小程序 4:安卓 5:ios)") + private Integer systemType; + + @Schema(description = "商品访客数") + private Integer prodVisitUser; + + @Schema(description = "商品浏览量") + private Integer prodVisitNums; + + @Schema(description = "商品id列表") + private List spuIdList; + + public Long getUserAnalysisId() { + return userAnalysisId; + } + + public void setUserAnalysisId(Long userAnalysisId) { + this.userAnalysisId = userAnalysisId; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvinceName() { + return provinceName; + } + + public void setProvinceName(String provinceName) { + this.provinceName = provinceName; + } + + public Long getPlusShopCart() { + return plusShopCart; + } + + public void setPlusShopCart(Long plusShopCart) { + this.plusShopCart = plusShopCart; + } + + public Long getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Long placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getVisitNums() { + return visitNums; + } + + public void setVisitNums(Integer visitNums) { + this.visitNums = visitNums; + } + + public Integer getClickNums() { + return clickNums; + } + + public void setClickNums(Integer clickNums) { + this.clickNums = clickNums; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + public Integer getSessionNums() { + return sessionNums; + } + + public void setSessionNums(Integer sessionNums) { + this.sessionNums = sessionNums; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + public Integer getProdVisitUser() { + return prodVisitUser; + } + + public void setProdVisitUser(Integer prodVisitUser) { + this.prodVisitUser = prodVisitUser; + } + + public Integer getProdVisitNums() { + return prodVisitNums; + } + + public void setProdVisitNums(Integer prodVisitNums) { + this.prodVisitNums = prodVisitNums; + } + + public List getSpuIdList() { + return spuIdList; + } + + public void setSpuIdList(List spuIdList) { + this.spuIdList = spuIdList; + } + + public Integer getVisitUserNum() { + return visitUserNum; + } + + public void setVisitUserNum(Integer visitUserNum) { + this.visitUserNum = visitUserNum; + } + + @Override + public String toString() { + return "UserAnalysisVO{" + + "userAnalysisId=" + userAnalysisId + + ", createDate=" + createDate + + ", userId='" + userId + '\'' + + ", provinceId=" + provinceId + + ", provinceName='" + provinceName + '\'' + + ", plusShopCart=" + plusShopCart + + ", placeOrderAmount=" + placeOrderAmount + + ", payAmount=" + payAmount + + ", visitNums=" + visitNums + + ", visitUserNum=" + visitUserNum + + ", clickNums=" + clickNums + + ", userType=" + userType + + ", sessionNums=" + sessionNums + + ", systemType=" + systemType + + ", prodVisitUser=" + prodVisitUser + + ", prodVisitNums=" + prodVisitNums + + ", spuIdList=" + spuIdList + + '}'; + } +} diff --git a/tmerclub-flow/src/main/resources/bootstrap.yml b/tmerclub-flow/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..2ed0d85 --- /dev/null +++ b/tmerclub-flow/src/main/resources/bootstrap.yml @@ -0,0 +1,28 @@ +server: + port: ${MALL4CLOUD_PORT:9116} +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} +logging: + tracer: + pattern: '%5p [${spring.application.name:},%X{X-B3-Parent-SpanName},%X{X-B3-TraceId},%X{X-B3-SpanId}]' + +# dubbo端口:默认为服务端口+2000 +dubbo: + protocol: + port: ${MALL4CLOUD_DUBBO_PORT:9516} diff --git a/tmerclub-flow/src/main/resources/logback.xml b/tmerclub-flow/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-flow/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-flow/src/main/resources/mapper/FormMapper.xml b/tmerclub-flow/src/main/resources/mapper/FormMapper.xml new file mode 100644 index 0000000..56603ce --- /dev/null +++ b/tmerclub-flow/src/main/resources/mapper/FormMapper.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + `form_id`,`shop_id`,`form_name`,`content`,`from_type`,`time_type`,`time_format`,`form_item_ids`,`start_time`,`end_time`,`time_range`,`create_time`,`update_time`,`seq` + + + + + insert into form + (`shop_id`,`form_name`,`content`,`from_type`,`time_type`,`time_format`,`form_item_ids`,`start_time`,`end_time`,`time_range`,`seq`) + values + (#{form.shopId},#{form.formName},#{form.content},#{form.fromType},#{form.timeType},#{form.timeFormat},#{form.formItemIds},#{form.startTime},#{form.endTime},#{form.timeRange},#{form.seq}); + + + update form + + + `shop_id` = #{form.shopId}, + + + `form_name` = #{form.formName}, + + + `content` = #{form.content}, + + + `from_type` = #{form.fromType}, + + + `time_type` = #{form.timeType}, + + + `time_format` = #{form.timeFormat}, + + + `form_item_ids` = #{form.formItemIds}, + + + `start_time` = #{form.startTime}, + + + `end_time` = #{form.endTime}, + + + `time_range` = #{form.timeRange}, + + + `seq` = #{form.seq}, + + + where form_id = #{form.formId} + + + delete from form where form_id = #{formId} + + + diff --git a/tmerclub-gateway/src/main/java/com/tmerclub/cloud/gateway/dev/DevWebFluxContext.java b/tmerclub-gateway/src/main/java/com/tmerclub/cloud/gateway/dev/DevWebFluxContext.java new file mode 100644 index 0000000..989e08d --- /dev/null +++ b/tmerclub-gateway/src/main/java/com/tmerclub/cloud/gateway/dev/DevWebFluxContext.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.gateway.dev; + +import org.springframework.web.server.ServerWebExchange; + +/** + * @author FrozenWatermelon + * @date 2020/7/16 + */ +public class DevWebFluxContext { + + /** The request holder. */ + private static final ThreadLocal SERVER_WEB_EXCHANGE_HOLDER = new ThreadLocal<>(); + + public static ServerWebExchange get() { + return SERVER_WEB_EXCHANGE_HOLDER.get(); + } + + public static void set(ServerWebExchange serverWebExchange) { + SERVER_WEB_EXCHANGE_HOLDER.set(serverWebExchange); + } + + public static void clean() { + if (SERVER_WEB_EXCHANGE_HOLDER.get() != null) { + SERVER_WEB_EXCHANGE_HOLDER.remove(); + } + } + +} diff --git a/tmerclub-gateway/src/main/resources/bootstrap.yml b/tmerclub-gateway/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..077fb53 --- /dev/null +++ b/tmerclub-gateway/src/main/resources/bootstrap.yml @@ -0,0 +1,20 @@ +server: + port: 8000 +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} diff --git a/tmerclub-gateway/src/main/resources/logback.xml b/tmerclub-gateway/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-gateway/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-group/Dockerfile b/tmerclub-group/Dockerfile new file mode 100644 index 0000000..0b93728 --- /dev/null +++ b/tmerclub-group/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms512m", "-Xmx512m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/GroupApplication.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/GroupApplication.java new file mode 100644 index 0000000..20a71fb --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/GroupApplication.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group; + +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.security.servlet.UserDetailsServiceAutoConfiguration; + +/** + * @author YXF + * @date 2021/03/20 + */ +@SpringBootApplication(scanBasePackages = "com.moyuer.cloud", exclude = UserDetailsServiceAutoConfiguration.class) +@EnableDubbo(scanBasePackages = "com.moyuer.cloud.**.feign") +public class GroupApplication { + public static void main(String[] args) { + SpringApplication.run(GroupApplication.class, args); + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/GroupOpenNotifyBO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/GroupOpenNotifyBO.java new file mode 100644 index 0000000..82fc61f --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/GroupOpenNotifyBO.java @@ -0,0 +1,51 @@ +package com.tmerclub.cloud.group.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @author TRACK + */ +public class GroupOpenNotifyBO { + + @Schema(description = "拼团团队id") + private Long groupTeamId; + + @Schema(description = "身份标识(0:成员 1:团长)") + private Integer identityType; + + @Schema(description = "订单id") + private Long orderId; + + public Long getGroupTeamId() { + return groupTeamId; + } + + public void setGroupTeamId(Long groupTeamId) { + this.groupTeamId = groupTeamId; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + @Override + public String toString() { + return "GroupOpenNotifyBO{" + + "groupTeamId=" + groupTeamId + + ", identityType=" + identityType + + ", orderId=" + orderId + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/mongo/MongoGroupTeamBO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/mongo/MongoGroupTeamBO.java new file mode 100644 index 0000000..c3423aa --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/mongo/MongoGroupTeamBO.java @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.bo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * Mongodb拼团团队表 + * @author TRACK + */ +@CompoundIndexes({ + @CompoundIndex(name = "shop_idx", def = "{'shopId':1}"), + @CompoundIndex(name = "share_user_idx", def = "{'shareUserId':1}"), + @CompoundIndex(name = "group_spu_idx", def = "{'groupSpuId':1}"), + @CompoundIndex(name = "group_activity_idx", def = "{'groupActivityId':1}") +}) +@Document("group_team") +public class MongoGroupTeamBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "拼团团队id", requiredMode = Schema.RequiredMode.REQUIRED) + @Id + private Long groupTeamId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "拼团活动id") + private Long groupActivityId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "活动商品Id") + private Long groupSpuId; + + @Schema(description = "已参团人数") + private Integer joinNum; + + @Schema(description = "拼团状态(0:待成团,1:拼团中,2:拼团成功,3:拼团失败)") + private Integer status; + + @Schema(description = "团队订单总额") + private Long totalPrice; + + @Schema(description = "开始时间(团长支付成功时间)") + private Date startTime; + + @Schema(description = "剩余时间") + private Date endTime; + + @Schema(description = "团长user_Id") + private Long shareUserId; + + public Long getGroupTeamId() { + return groupTeamId; + } + + public void setGroupTeamId(Long groupTeamId) { + this.groupTeamId = groupTeamId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getGroupSpuId() { + return groupSpuId; + } + + public void setGroupSpuId(Long groupSpuId) { + this.groupSpuId = groupSpuId; + } + + public Integer getJoinNum() { + return joinNum; + } + + public void setJoinNum(Integer joinNum) { + this.joinNum = joinNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getTotalPrice() { + return totalPrice; + } + + public void setTotalPrice(Long totalPrice) { + this.totalPrice = totalPrice; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getShareUserId() { + return shareUserId; + } + + public void setShareUserId(Long shareUserId) { + this.shareUserId = shareUserId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "MongoGroupTeamBO{" + + ", groupTeamId=" + groupTeamId + + ", shopId=" + shopId + + ", groupActivityId=" + groupActivityId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", groupSpuId=" + groupSpuId + + ", joinNum=" + joinNum + + ", status=" + status + + ", totalPrice=" + totalPrice + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", shareUserId=" + shareUserId + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/config/RocketMqConfig.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/config/RocketMqConfig.java new file mode 100644 index 0000000..3337053 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/config/RocketMqConfig.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.config; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqAdapter; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * @author FrozenWatermelon + * @date 2021/3/30 + */ +@RefreshScope +@Configuration +public class RocketMqConfig { + + @Autowired + private RocketMqAdapter rocketMqAdapter; + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate groupOrderCreateTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.GROUP_ORDER_CREATE_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate groupOrderSuccessTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.GROUP_ORDER_SUCCESS_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate groupOrderUnSuccessTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.GROUP_ORDER_UN_SUCCESS_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate groupOrderUnSuccessRefundTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.GROUP_ORDER_UN_SUCCESS_REFUND_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendGroupNotifyToUserTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SEND_GROUP_NOTIFY_TO_USER_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendActivityOfflineNotifyToShopTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SEND_ACTIVITY_OFFLINE_NOTIFY_TO_SHOP_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendActivityAuditNotifyToShopTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SEND_ACTIVITY_AUDIT_NOTIFY_TO_SHOP_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendGroupOrderSaveTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.GROUP_ORDER_SAVE_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendGroupOrderOpenAndJoinGroupTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.GROUP_ORDER_OPEN_AND_JOIN_GROUP_TOPIC); + } + +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/config/XxlJobConfig.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/config/XxlJobConfig.java new file mode 100644 index 0000000..66f6eb9 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/config/XxlJobConfig.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.config; + +import com.tmerclub.cloud.common.constant.Constant; +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * + * @author FrozenWatermelon + * @date 2021/1/18 + */ +@Configuration +public class XxlJobConfig { + private static final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${mall4cloud.job.admin.addresses}") + private String adminAddresses; + + @Value("${mall4cloud.job.accessToken}") + private String accessToken; + + @Value("${mall4cloud.job.logPath}") + private String logPath; + + @Value("${spring.application.name}") + private String appname; + + @Value("${server.port}") + private int port; + + @Autowired + private InetUtils inetUtils; + + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appname + Constant.DASHED_ENV); + // 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP + xxlJobSpringExecutor.setIp(inetUtils.findFirstNonLoopbackAddress().getHostAddress()); + xxlJobSpringExecutor.setPort(port + 1000); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(3); + return xxlJobSpringExecutor; + } + +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/AppGroupActivityStatus.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/AppGroupActivityStatus.java new file mode 100644 index 0000000..86a96a1 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/AppGroupActivityStatus.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.constant; + +/** + * 团购活动状态 + * + * @author yxf + * @date 2020/11/20 + */ +public enum AppGroupActivityStatus { + + /** + * 未开始 + */ + NOT_STARTED(1), + + /** + * 进行中 + */ + UNDER_WAY(2), + + /** + * 已结束 + */ + FINISHED(3); + + private final Integer value; + + public Integer value() { + return value; + } + + AppGroupActivityStatus(Integer value) { + this.value = value; + } + + public static Boolean offlineStatus(Integer value) { + AppGroupActivityStatus[] enums = values(); + for (AppGroupActivityStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return Boolean.TRUE; + } + } + return Boolean.FALSE; + } + +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/GroupActivityStatusEnum.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/GroupActivityStatusEnum.java new file mode 100644 index 0000000..cdf20b5 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/GroupActivityStatusEnum.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.constant; + +/** + * 团购活动状态 + * + * @author yxf + * @date 2020/11/20 + */ +public enum GroupActivityStatusEnum { + + /** + * 删除 (逻辑删除) + */ + DELETE(-1), + + /** + * 禁用/过期/下架 + */ + DISABLE(0), + + /** + * 启用/未过期/上架 + */ + ENABLE(1), + + /** + * 违规下架 + */ + OFFLINE(2), + + /** + * 等待审核 + */ + WAIT_AUDIT(3), + + /** + * 失效 + */ + EXPIRED(4), + ; + + private final Integer value; + + public Integer value() { + return value; + } + + GroupActivityStatusEnum(Integer value) { + this.value = value; + } + + public static Boolean offlineStatus(Integer value) { + GroupActivityStatusEnum[] enums = values(); + for (GroupActivityStatusEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return Boolean.TRUE; + } + } + return Boolean.FALSE; + } + +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/TeamStatusEnum.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/TeamStatusEnum.java new file mode 100644 index 0000000..63c7bd4 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/TeamStatusEnum.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.constant; + +/** + * 拼团团队状态类型 + * + * @author yxf + * @date 2020/11/20 + */ +public enum TeamStatusEnum { + + /** + * 待成团(未支付) + */ + WAITING_GROUP(0, "待成团"), + + /** + * 拼团中(已支付) + */ + IN_GROUP(1, "拼团中"), + + /** + * 拼团成功 + */ + SUCCESS(2, "拼团成功"), + + /** + * 拼团失败 + */ + FAIL(3, "拼团失败"); + + private final Integer code; + + public Integer value() { + return code; + } + + TeamStatusEnum(Integer code, String title) { + this.code = code; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/controller/app/GroupTeamController.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/controller/app/GroupTeamController.java new file mode 100644 index 0000000..816b1b6 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/controller/app/GroupTeamController.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.controller.app; + +import com.tmerclub.cloud.api.group.vo.GroupOrderVO; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.group.service.GroupActivityService; +import com.tmerclub.cloud.group.service.GroupOrderService; +import com.tmerclub.cloud.group.service.GroupTeamService; +import com.tmerclub.cloud.group.vo.app.AppGroupActivityVO; +import com.tmerclub.cloud.group.vo.app.AppGroupTeamInfoVO; +import com.tmerclub.cloud.group.vo.app.AppGroupTeamVO; +import com.tmerclub.cloud.group.vo.mongo.MongoAppGroupUserVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Objects; + +/** + * 拼团团队表 + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +@RestController("appGroupTeamController") +@RequestMapping("/group_team") +@Tag(name = "app-拼团团队表") +public class GroupTeamController { + + @Autowired + private GroupTeamService groupTeamService; + + @Autowired + private GroupActivityService groupActivityService; + + @Autowired + private GroupOrderService groupOrderService; + + @DubboReference + private SpuFeignClient spuFeignClient; + + @SuppressWarnings("checkstyle:LineLength") + @GetMapping("/info") + @Operation(summary = "拼团详情", description = "拼团详情,至少携带一个参数,查看拼团单(团队)信息") + public ServerResponseEntity teamInfo( + @Parameter(description = "拼团团队ID") Long groupTeamId, + @Parameter(description = "订单id") Long orderId, @Parameter(description = "商品id") Long spuId) { + // 通过订单编号获取团ID + if (Objects.nonNull(orderId)) { + GroupOrderVO groupOrder = groupOrderService.getByOrderId(orderId); + if (Objects.nonNull(groupOrder) && Objects.nonNull(groupOrder.getGroupTeamId())) { + groupTeamId = groupOrder.getGroupTeamId(); + } + } + + AppGroupTeamVO groupTeam = groupTeamService.getAppGroupTeam(groupTeamId); + + // 获取参团的用户列表 + List groupUserList = groupOrderService.listApiGroupUserDto(groupTeamId); + // 获取活动信息 + AppGroupActivityVO appGroupActivityVoInfo = groupActivityService.getAppGroupActivityByGroupActivityId(groupTeam.getGroupActivityId()); + + GroupOrderVO groupOrder = groupOrderService.getUserGroupOrderByGroupTeamId(groupTeamId); + + ServerResponseEntity spuResponse = spuFeignClient.getById(spuId); + if (!spuResponse.isSuccess()) { + return ServerResponseEntity.transform(spuResponse); + } + SpuVO spuVO = spuResponse.getData(); + appGroupActivityVoInfo.setJoinGroupTeamId(groupTeamId); + + // 拼装拼团详情信息 + AppGroupTeamInfoVO infoVo = new AppGroupTeamInfoVO(); + infoVo.setGroupTeam(groupTeam); + infoVo.setGroupUserList(groupUserList); + infoVo.setGroupActivity(appGroupActivityVoInfo); + infoVo.setSpuName(spuVO.getName()); + infoVo.setPriceFee(spuVO.getPriceFee()); + infoVo.setMainImgUrl(spuVO.getMainImgUrl()); + infoVo.setSellingPoint(spuVO.getSellingPoint()); + infoVo.setSpuMold(spuVO.getSpuMold()); + infoVo.setIsRefund(spuVO.getIsRefund()); + if (groupOrder != null) { + infoVo.setOrderId(groupOrder.getOrderId()); + } + return ServerResponseEntity.success(infoVo); + } + + @GetMapping("/join_users") + @Operation(summary = "参团的用户列表", description = "参团的用户列表") + public ServerResponseEntity> joinGroupUsers( + @Parameter(description = "拼团团队ID", required = true) @RequestParam("groupTeamId") Long groupTeamId) { + // 获取参团的用户列表 + List groupUserList = groupOrderService.listApiGroupUserDto(groupTeamId); + return ServerResponseEntity.success(groupUserList); + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupActivityDTO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupActivityDTO.java new file mode 100644 index 0000000..9f29275 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupActivityDTO.java @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 拼团活动表DTO + * + * @author YXF + * @date 2021-03-20 10:39:31 + */ +public class GroupActivityDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "拼团活动id") + private Long groupActivityId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "活动名称") + private String activityName; + + @Schema(description = "活动开始时间(活动状态:未开始、经行中、已结束)") + private Date startTime; + + @Schema(description = "活动结束时间(活动状态:未开始、经行中、已结束)") + private Date endTime; + + @Schema(description = "成团人数") + private Integer groupNumber; + + @Schema(description = "商品是否限购(1:限购、0:不限购)") + private Integer hasMaxNum; + + @Schema(description = "限购数量") + private Integer maxNum; + + @Schema(description = "是否模拟成团(1:模拟参团、0:不模拟)") + private Integer hasRobot; + + @Schema(description = "活动是否预热") + private Integer isPreheat; + + @Schema(description = "是否开启凑团模式(1:凑团、0:不凑团)") + private Integer hasGroupTip; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "拼团状态(-1:删除、0:未启用、1:启用、2:违规下架、3:等待审核 4:已失效 5:已结束)") + private Integer status; + + @Schema(description = "商品价格(sku最低价)") + private Long price; + + @Schema(description = "团购sku") + private List groupSkuList; + + @Schema(description = "店铺id列表") + private List shopIds; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品id列表") + private List spuIds; + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getActivityName() { + return activityName; + } + + public void setActivityName(String activityName) { + this.activityName = activityName; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getGroupNumber() { + return groupNumber; + } + + public void setGroupNumber(Integer groupNumber) { + this.groupNumber = groupNumber; + } + + public Integer getHasMaxNum() { + return hasMaxNum; + } + + public void setHasMaxNum(Integer hasMaxNum) { + this.hasMaxNum = hasMaxNum; + } + + public Integer getMaxNum() { + return maxNum; + } + + public void setMaxNum(Integer maxNum) { + this.maxNum = maxNum; + } + + public Integer getHasRobot() { + return hasRobot; + } + + public void setHasRobot(Integer hasRobot) { + this.hasRobot = hasRobot; + } + + public Integer getIsPreheat() { + return isPreheat; + } + + public void setIsPreheat(Integer isPreheat) { + this.isPreheat = isPreheat; + } + + public Integer getHasGroupTip() { + return hasGroupTip; + } + + public void setHasGroupTip(Integer hasGroupTip) { + this.hasGroupTip = hasGroupTip; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public List getGroupSkuList() { + return groupSkuList; + } + + public void setGroupSkuList(List groupSkuList) { + this.groupSkuList = groupSkuList; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + @Override + public String toString() { + return "GroupActivityDTO{" + + "groupActivityId=" + groupActivityId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", activityName='" + activityName + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", groupNumber=" + groupNumber + + ", hasMaxNum=" + hasMaxNum + + ", maxNum=" + maxNum + + ", hasRobot=" + hasRobot + + ", isPreheat=" + isPreheat + + ", hasGroupTip=" + hasGroupTip + + ", spuId=" + spuId + + ", status=" + status + + ", price=" + price + + ", groupSkuList=" + groupSkuList + + ", shopIds=" + shopIds + + ", prodName='" + spuName + '\'' + + ", spuIds=" + spuIds + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupOrderDTO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupOrderDTO.java new file mode 100644 index 0000000..b3877f1 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupOrderDTO.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.dto; + +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 拼团订单 + * + * @author FrozenWatermelon + * @date 2021-04-07 10:39:32 + */ +public class GroupOrderDTO extends OrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull(message = "活动商品规格Id不能为空") + @Schema(description = "拼团商品规格Id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long groupSkuId; + + public Long getGroupSkuId() { + return groupSkuId; + } + + public void setGroupSkuId(Long groupSkuId) { + this.groupSkuId = groupSkuId; + } + + @Override + public String toString() { + return "GroupOrderDTO{" + + ", groupSkuId=" + groupSkuId + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupSpuDTO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupSpuDTO.java new file mode 100644 index 0000000..145af9c --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupSpuDTO.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 拼团活动商品表DTO + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public class GroupSpuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "活动商品id") + private Long groupSpuId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "活动id") + private Long groupActivityId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "已成团订单数(统计)") + private Long groupOrderCount; + + @Schema(description = "已成团人数(统计)") + private Long groupNumberCount; + + @Schema(description = "状态(1:正常 0:失效 -1:已删除)") + private Integer status; + + public Long getGroupSpuId() { + return groupSpuId; + } + + public void setGroupSpuId(Long groupSpuId) { + this.groupSpuId = groupSpuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getGroupOrderCount() { + return groupOrderCount; + } + + public void setGroupOrderCount(Long groupOrderCount) { + this.groupOrderCount = groupOrderCount; + } + + public Long getGroupNumberCount() { + return groupNumberCount; + } + + public void setGroupNumberCount(Long groupNumberCount) { + this.groupNumberCount = groupNumberCount; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "GroupSpuDTO{" + + "groupSpuId=" + groupSpuId + + ",shopId=" + shopId + + ",groupActivityId=" + groupActivityId + + ",spuId=" + spuId + + ",groupOrderCount=" + groupOrderCount + + ",groupNumberCount=" + groupNumberCount + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupTeamDTO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupTeamDTO.java new file mode 100644 index 0000000..6b78a05 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupTeamDTO.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 拼团团队表DTO + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public class GroupTeamDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "拼团团队id") + private Long groupTeamId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "拼团活动id") + private Long groupActivityId; + + @Schema(description = "活动商品Id") + private Long groupSpuId; + + @Schema(description = "已参团人数") + private Integer joinNum; + + @Schema(description = "拼团状态(0:待成团,1:拼团中,2:拼团成功,3:拼团失败)") + private Integer status; + + @Schema(description = "团队订单总额") + private Long totalPrice; + + @Schema(description = "开始时间(团长支付成功时间)") + private Date startTime; + + @Schema(description = "剩余时间") + private Date endTime; + + @Schema(description = "团长user_Id") + private Long shareUserId; + + public Long getGroupTeamId() { + return groupTeamId; + } + + public void setGroupTeamId(Long groupTeamId) { + this.groupTeamId = groupTeamId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getGroupSpuId() { + return groupSpuId; + } + + public void setGroupSpuId(Long groupSpuId) { + this.groupSpuId = groupSpuId; + } + + public Integer getJoinNum() { + return joinNum; + } + + public void setJoinNum(Integer joinNum) { + this.joinNum = joinNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getTotalPrice() { + return totalPrice; + } + + public void setTotalPrice(Long totalPrice) { + this.totalPrice = totalPrice; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getShareUserId() { + return shareUserId; + } + + public void setShareUserId(Long shareUserId) { + this.shareUserId = shareUserId; + } + + @Override + public String toString() { + return "GroupTeamDTO{" + + "groupTeamId=" + groupTeamId + + ",shopId=" + shopId + + ",groupActivityId=" + groupActivityId + + ",groupSpuId=" + groupSpuId + + ",joinNum=" + joinNum + + ",status=" + status + + ",totalPrice=" + totalPrice + + ",startTime=" + startTime + + ",endTime=" + endTime + + ",shareUserId=" + shareUserId + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/feign/GroupFeignController.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/feign/GroupFeignController.java new file mode 100644 index 0000000..e141587 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/feign/GroupFeignController.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.feign; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.group.feign.GroupFeignClient; +import com.tmerclub.cloud.common.product.vo.GroupActivitySpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.group.constant.GroupActivityStatusEnum; +import com.tmerclub.cloud.group.service.GroupActivityService; +import com.tmerclub.cloud.group.vo.GroupActivityVO; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/12/8 + */ +@DubboService +public class GroupFeignController implements GroupFeignClient { + + @Autowired + private GroupActivityService groupActivityService; + + + @Override + public ServerResponseEntity getActivityStartTime(Long activityId) { + GroupActivityVO groupActivity = groupActivityService.getByGroupActivityId(activityId); + if (!Objects.equals(groupActivity.getStatus(), GroupActivityStatusEnum.ENABLE.value())) { + return ServerResponseEntity.success(); + } + Date date = new Date(); + Date startTime = null; + // 活动结束时间小于等于当前时间, + if (groupActivity.getEndTime().getTime() <= System.currentTimeMillis()) { + return ServerResponseEntity.success(null); + } + // 预热活动的开始时间设为当前 + if (Objects.equals(groupActivity.getIsPreheat(), 1)) { + startTime = new Date(); + } + // 非预热活动的开始时间为活动开始时间 + else if (date.getTime() < groupActivity.getEndTime().getTime()) { + startTime = groupActivity.getStartTime(); + } + return ServerResponseEntity.success(startTime); + } + + @Override + public ServerResponseEntity getActivityInfo(Long activityId) { + GroupActivityVO groupActivity = groupActivityService.getByGroupActivityId(activityId); + com.tmerclub.cloud.api.group.vo.GroupActivityVO groupActivityVO = BeanUtil.map(groupActivity, com.tmerclub.cloud.api.group.vo.GroupActivityVO.class); + return ServerResponseEntity.success(groupActivityVO); + } + + @Override + public ServerResponseEntity> groupSpuListBySpuIds(List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return ServerResponseEntity.success(new ArrayList<>(0)); + } + List groupActivitySpuList = groupActivityService.groupSpuListBySpuIds(spuIds); + return ServerResponseEntity.success(groupActivitySpuList); + } + + @Override + public ServerResponseEntity offlineGroupBySpuIds(List spuIds) { + groupActivityService.offlineGroupBySpuIds(spuIds); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity updateGroupActivityPrice(List skuIds, Long spuId) { + groupActivityService.updateGroupActivityPrice(skuIds, spuId); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity updateGroupActivityStatus(Long spuId) { + groupActivityService.updateGroupActivityStatus(spuId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCreateConsumer.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCreateConsumer.java new file mode 100644 index 0000000..2b7ad1a --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCreateConsumer.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.group.bo.GroupOrderBO; +import com.tmerclub.cloud.group.service.GroupOrderService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.GROUP_ORDER_CREATE_TOPIC, consumerGroup = RocketMqConstant.GROUP_ORDER_CREATE_TOPIC) +public class GroupOrderCreateConsumer implements RocketMQListener { + + @Autowired + private GroupOrderService groupOrderService; + + /** + * 团购活动订单创建监听,先创建订单,然后创建团购活动订单 + */ + @Override + public void onMessage(GroupOrderBO groupOrderBO) { + groupOrderService.submit(groupOrderBO); + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCreateTransactionListener.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCreateTransactionListener.java new file mode 100644 index 0000000..e6d86c4 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCreateTransactionListener.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.listener; + +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.group.bo.GroupOrderBO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; + + +/** + * 确认收货事务监听 + * + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQTransactionListener(rocketMQTemplateBeanName = "groupOrderCreateTemplate", maximumPoolSize = 20) +public class GroupOrderCreateTransactionListener implements RocketMQLocalTransactionListener { + + @DubboReference + private OrderFeignClient orderFeignClient; + + @Override + public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object mergerOrder) { + orderFeignClient.submit((ShopCartOrderMergerVO) mergerOrder); + return RocketMQLocalTransactionState.COMMIT; + } + + @Override + public RocketMQLocalTransactionState checkLocalTransaction(Message msg) { + GroupOrderBO groupOrderBO = Json.parseObject((byte[]) msg.getPayload(), GroupOrderBO.class); + Long orderId = groupOrderBO.getOrderId(); + ServerResponseEntity> ordersStatusResponse = orderFeignClient.getOrdersStatus(Collections.singletonList(orderId)); + if (!ordersStatusResponse.isSuccess()) { + throw new LuckException(ordersStatusResponse.getMsg()); + } + if (!ordersStatusResponse.isSuccess()) { + return RocketMQLocalTransactionState.UNKNOWN; + } + List data = ordersStatusResponse.getData(); + // 如果订单状态没有,也就是没有创建成功订单,直接回滚 + if (data.get(0).getStatus() == null) { + return RocketMQLocalTransactionState.ROLLBACK; + } + return RocketMQLocalTransactionState.COMMIT; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSaveGroupConsumer.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSaveGroupConsumer.java new file mode 100644 index 0000000..1b9ad1c --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSaveGroupConsumer.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.group.bo.GroupOrderNotifyBO; +import com.tmerclub.cloud.api.group.vo.GroupOrderVO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.group.bo.mongo.MongoGroupOrderBO; +import com.tmerclub.cloud.group.service.GroupOrderService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; + +/** + * 拼团订单支付成功 更新订单保存到mongodb + * @author TRACK + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.GROUP_ORDER_SUCCESS_TOPIC, consumerGroup = RocketMqConstant.GROUP_ORDER_SAVE_GROUP) +public class GroupOrderSaveGroupConsumer implements RocketMQListener { + + @Autowired + private GroupOrderService groupOrderService; + + /** + * 团购活动订单保存mongodb + */ + @Override + public void onMessage(GroupOrderNotifyBO groupOrderNotifyBO) { + if (CollUtil.isNotEmpty(groupOrderNotifyBO.getGroupOrders())) { + if (Objects.equals(groupOrderNotifyBO.getIsJoin(), 0)) { + // 机器人参团 + List mongoGroupOrderBOList = BeanUtil.mapAsList(groupOrderNotifyBO.getGroupOrders(), MongoGroupOrderBO.class); + groupOrderService.saveBatchToMongodb(mongoGroupOrderBOList); + } else if (Objects.equals(groupOrderNotifyBO.getIsJoin(), 1)) { + GroupOrderVO groupOrderVO = groupOrderNotifyBO.getGroupOrders().get(0); + // 用户参团 + groupOrderService.updateToPaySuccess(groupOrderVO.getOrderId(), null, null); + } + } + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSaveTeamGroupConsumer.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSaveTeamGroupConsumer.java new file mode 100644 index 0000000..4a565be --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSaveTeamGroupConsumer.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.group.bo.GroupSaveNotifyBO; +import com.tmerclub.cloud.group.service.GroupTeamService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * 提交订单 保存团队信息到mongodb + * @author TRACK + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.GROUP_ORDER_SAVE_TOPIC, consumerGroup = RocketMqConstant.GROUP_ORDER_SAVE_TEAM_GROUP) +public class GroupOrderSaveTeamGroupConsumer implements RocketMQListener { + + @Autowired + private GroupTeamService groupTeamService; + + /** + * 团购活动订单保存mongodb + */ + @Override + public void onMessage(GroupSaveNotifyBO groupSaveNotifyBO) { + if (Objects.nonNull(groupSaveNotifyBO.getMongoGroupTeamBO())) { + groupTeamService.saveToMongodb(groupSaveNotifyBO.getMongoGroupTeamBO()); + } + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderUnSuccessRefundTransactionListener.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderUnSuccessRefundTransactionListener.java new file mode 100644 index 0000000..82e1330 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderUnSuccessRefundTransactionListener.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.listener; + +import com.tmerclub.cloud.group.service.GroupTeamService; +import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; + +/** + * 订单退款事务监听 + * + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQTransactionListener(rocketMQTemplateBeanName = "groupOrderUnSuccessRefundTemplate", maximumPoolSize = 20) +public class GroupOrderUnSuccessRefundTransactionListener implements RocketMQLocalTransactionListener { + + @Autowired + private GroupTeamService groupTeamService; + + @Override + public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object groupTeamId) { + groupTeamService.updateToUnSuccess((Long) groupTeamId); + return RocketMQLocalTransactionState.COMMIT; + } + + @Override + public RocketMQLocalTransactionState checkLocalTransaction(Message msg) { + // 直接回滚,防止异步出现aba的问题 + // 第二个原因是因为上面那个事务消息会重复发送多次,因为GROUP_ORDER_UN_SUCCESS_TOPIC 这个会回调多次 + return RocketMQLocalTransactionState.ROLLBACK; + } + +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/OrderNotifyGroupConsumer.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/OrderNotifyGroupConsumer.java new file mode 100644 index 0000000..d50317b --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/OrderNotifyGroupConsumer.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.listener; + +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.group.service.GroupOrderService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * 团购订单支付监听 + * + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_NOTIFY_SERVICE_TOPIC, consumerGroup = RocketMqConstant.ORDER_NOTIFY_GROUP_GROUP) +public class OrderNotifyGroupConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(OrderNotifyGroupConsumer.class); + + @Autowired + private GroupOrderService groupOrderService; + + /** + * 通知团购订单已经支付 + */ + @Override + public void onMessage(PayNotifyBO message) { + if (!Objects.equals(message.getOrderType(), OrderType.GROUP.value())) { + return; + } + LOG.info("通知团购订单已经支付... message: {}", Json.toJsonString(message)); + groupOrderService.payNotifyGroupOrder(message); + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupActivityMapper.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupActivityMapper.java new file mode 100644 index 0000000..fe782e9 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupActivityMapper.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.mapper; + +import com.tmerclub.cloud.common.product.vo.GroupActivitySpuVO; +import com.tmerclub.cloud.group.dto.GroupActivityDTO; +import com.tmerclub.cloud.group.model.GroupActivity; +import com.tmerclub.cloud.group.vo.GroupActivityVO; +import com.tmerclub.cloud.group.vo.app.AppGroupActivityVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 拼团活动表 + * + * @author YXF + * @date 2021-03-20 10:39:31 + */ +public interface GroupActivityMapper { + + /** + * 获取拼团活动表列表 + * + * @param groupActivityDTO + * @return 拼团活动表列表 + */ + List list(@Param("groupActivity") GroupActivityDTO groupActivityDTO); + + /** + * 根据拼团活动表id获取拼团活动表 + * + * @param groupActivityId 拼团活动表id + * @return 拼团活动表 + */ + GroupActivityVO getByGroupActivityId(@Param("groupActivityId") Long groupActivityId); + + /** + * 保存拼团活动表 + * + * @param groupActivity 拼团活动表 + */ + void save(@Param("groupActivity") GroupActivity groupActivity); + + /** + * 更新拼团活动表 + * + * @param groupActivity 拼团活动表 + */ + void update(@Param("groupActivity") GroupActivity groupActivity); + + + /** + * 根据商品id获取活动信息 + * + * @param spuId + * @return + */ + AppGroupActivityVO getBySpuId(@Param("spuId") Long spuId); + + /** + * 根据商品id获取团购商品信息 + * + * @param spuIds + * @return + */ + List groupSpuListBySpuIds(@Param("spuIds") List spuIds); + + /** + * 获取应该结束但是没有结束的拼团列表 + * + * @return 应该结束但是没有结束的拼团列表 + */ + List listUnEndButNeedEndActivity(); + + /** + * 失效活动状态 + * + * @param groupActivityList 活动列表 + */ + void expiredGroupActivityByGroupActivityIdList(@Param("groupActivityList") List groupActivityList); + + /** + * 拼团活动详情(可以获取已失效的) + * + * @param groupActivityId + * @return + */ + AppGroupActivityVO getAppGroupActivityByGroupActivityId(@Param("groupActivityId") Long groupActivityId); + + /** + * 根据商品ids下线所有的团购活动 + * + * @param spuIds 商品ids + * @return 返回结果 + */ + void expiredGroupActivityBySpuIds(@Param("spuIds") List spuIds); + + /** + * 更新团购活动的成团订单数和人数 + * + * @param groupActivityId + * @param orderCount 成团订单数 + * @param numberCount 成团人数 + */ + void updateGroupOrderInfo(@Param("groupActivityId") Long groupActivityId, @Param("orderCount") Integer orderCount, @Param("numberCount") Integer numberCount); + + /** + * 根据spuId获取团购信息 + * + * @param spuId + * @return + */ + GroupActivityVO getGroupActivityInfoBySpuId(@Param("spuId") Long spuId); + + /** + * 获取商品还未失效的团购活动 + * + * @param spuId + * @param groupActivityId + * @return + */ + List listNoFailureBySpuId(@Param("spuId") Long spuId, @Param("groupActivityId") Long groupActivityId); + +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupOrderMapper.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupOrderMapper.java new file mode 100644 index 0000000..df7939a --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupOrderMapper.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.mapper; + +import com.tmerclub.cloud.group.bo.mongo.MongoGroupOrderBO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 拼团订单表 + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public interface GroupOrderMapper { + + /** + * 获取更新到mongodb的数据 + * @param start + * @param size + * @return + */ + List listToMongodb(@Param("start") int start, @Param("size") int size); +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupSkuMapper.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupSkuMapper.java new file mode 100644 index 0000000..e5d15ef --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupSkuMapper.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.mapper; + +import com.tmerclub.cloud.group.model.GroupSku; +import com.tmerclub.cloud.group.vo.GroupSkuVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 拼团活动商品规格 + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public interface GroupSkuMapper { + + /** + * 获取拼团活动商品规格列表 + * + * @return 拼团活动商品规格列表 + */ + List list(); + + /** + * 根据拼团活动商品规格id获取拼团活动商品规格 + * + * @param groupSkuId 拼团活动商品规格id + * @return 拼团活动商品规格 + */ + GroupSku getByGroupSkuId(@Param("groupSkuId") Long groupSkuId); + + /** + * 保存拼团活动商品规格 + * + * @param groupSku 拼团活动商品规格 + */ + void save(@Param("groupSku") GroupSku groupSku); + + /** + * 更新拼团活动商品规格 + * + * @param groupSku 拼团活动商品规格 + */ + void update(@Param("groupSku") GroupSku groupSku); + + /** + * 根据拼团活动商品规格id删除拼团活动商品规格 + * + * @param groupSkuId + */ + void deleteById(@Param("groupSkuId") Long groupSkuId); + + /** + * 批量更新 + * + * @param groupSkuList + */ + void batchSave(@Param("groupSkuList") List groupSkuList); + + /** + * 根据活动id,删除团购sku信息 + * + * @param groupActivityId + */ + void removeGroupSkuByGroupActivityId(@Param("groupActivityId") Long groupActivityId); + + /** + * 批量更新 + * + * @param groupSkuList + */ + void batchUpdate(@Param("groupSkuList") List groupSkuList); + + /** + * 根据活动id,获取团购sku列表信息 + * + * @param groupActivityId + * @return + */ + List listByGroupActivityId(@Param("groupActivityId") Long groupActivityId); + + /** + * 根据拼团活动id和活动价格获取对应的skuId + * + * @param groupActivityId + * @param actPrice + * @return + */ + List getSkuIdByActivityIdAndActPrice(@Param("groupActivityId") Long groupActivityId, @Param("actPrice") Long actPrice); + +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupTeamMapper.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupTeamMapper.java new file mode 100644 index 0000000..dc3d5e9 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/mapper/GroupTeamMapper.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.mapper; + +import com.tmerclub.cloud.group.bo.mongo.MongoGroupTeamBO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 拼团团队表 + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public interface GroupTeamMapper { + + /** + * 获取更新到mongodb的数据 + * @param size + * @param start + * @return + */ + List listToMongodb(@Param("start") int start, @Param("size") int size); +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupActivity.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupActivity.java new file mode 100644 index 0000000..73d75a9 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupActivity.java @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 拼团活动表 + * + * @author YXF + * @date 2021-03-20 10:39:31 + */ +public class GroupActivity extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 拼团活动id + */ + private Long groupActivityId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 活动名称 + */ + private String activityName; + + /** + * 活动开始时间(活动状态:未开始、经行中、已结束) + */ + private Date startTime; + + /** + * 活动结束时间(活动状态:未开始、经行中、已结束) + */ + private Date endTime; + + /** + * 成团人数 + */ + private Integer groupNumber; + + /** + * 商品是否限购(1:限购、0:不限购) + */ + private Integer hasMaxNum; + + /** + * 限购数量 + */ + private Integer maxNum; + + /** + * 是否模拟成团(1:模拟参团、0:不模拟) + */ + private Integer hasRobot; + + + /** + * 活动是否预热 + */ + private Integer isPreheat; + + /** + * 是否开启凑团模式(1:凑团、0:不凑团) + */ + private Integer hasGroupTip; + + /** + * 商品id + */ + private Long spuId; + + /** + * 已成团订单数(统计) + */ + private Long groupOrderCount; + + /** + * 已成团人数(统计) + */ + private Long groupNumberCount; + + /** + * 商品价格(sku最低价) + */ + private Long price; + + /** + * 拼团状态(-1:删除、0:未启用、1:启用、2:违规下架、3:等待审核 4:已失效 5:已结束) + */ + private Integer status; + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getActivityName() { + return activityName; + } + + public void setActivityName(String activityName) { + this.activityName = activityName; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getGroupNumber() { + return groupNumber; + } + + public void setGroupNumber(Integer groupNumber) { + this.groupNumber = groupNumber; + } + + public Integer getHasMaxNum() { + return hasMaxNum; + } + + public void setHasMaxNum(Integer hasMaxNum) { + this.hasMaxNum = hasMaxNum; + } + + public Integer getMaxNum() { + return maxNum; + } + + public void setMaxNum(Integer maxNum) { + this.maxNum = maxNum; + } + + public Integer getHasRobot() { + return hasRobot; + } + + public void setHasRobot(Integer hasRobot) { + this.hasRobot = hasRobot; + } + + public Integer getIsPreheat() { + return isPreheat; + } + + public void setIsPreheat(Integer isPreheat) { + this.isPreheat = isPreheat; + } + + public Integer getHasGroupTip() { + return hasGroupTip; + } + + public void setHasGroupTip(Integer hasGroupTip) { + this.hasGroupTip = hasGroupTip; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getGroupOrderCount() { + return groupOrderCount; + } + + public void setGroupOrderCount(Long groupOrderCount) { + this.groupOrderCount = groupOrderCount; + } + + public Long getGroupNumberCount() { + return groupNumberCount; + } + + public void setGroupNumberCount(Long groupNumberCount) { + this.groupNumberCount = groupNumberCount; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + @Override + public String toString() { + return "GroupActivity{" + + "groupActivityId=" + groupActivityId + + ", shopId=" + shopId + + ", activityName='" + activityName + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", groupNumber=" + groupNumber + + ", hasMaxNum=" + hasMaxNum + + ", maxNum=" + maxNum + + ", hasRobot=" + hasRobot + + ", isPreheat=" + isPreheat + + ", hasGroupTip=" + hasGroupTip + + ", spuId=" + spuId + + ", groupOrderCount=" + groupOrderCount + + ", groupNumberCount=" + groupNumberCount + + ", price=" + price + + ", status=" + status + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupSku.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupSku.java new file mode 100644 index 0000000..375246a --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupSku.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 拼团活动商品规格 + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public class GroupSku extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 拼团活动商品规格id + */ + private Long groupSkuId; + + /** + * 拼团活动id + */ + private Long groupActivityId; + + /** + * 商品规格id + */ + private Long skuId; + + /** + * 活动价格 + */ + private Long actPrice; + + /** + * 已售数量 + */ + private Long sellNum; + + public Long getGroupSkuId() { + return groupSkuId; + } + + public void setGroupSkuId(Long groupSkuId) { + this.groupSkuId = groupSkuId; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getActPrice() { + return actPrice; + } + + public void setActPrice(Long actPrice) { + this.actPrice = actPrice; + } + + public Long getSellNum() { + return sellNum; + } + + public void setSellNum(Long sellNum) { + this.sellNum = sellNum; + } + + @Override + public String toString() { + return "GroupSku{" + + "groupSkuId=" + groupSkuId + + ",groupActivityId=" + groupActivityId + + ",skuId=" + skuId + + ",actPrice=" + actPrice + + ",sellNum=" + sellNum + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupTeam.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupTeam.java new file mode 100644 index 0000000..0dff403 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupTeam.java @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 拼团团队表 + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public class GroupTeam extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 拼团团队id + */ + private Long groupTeamId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 拼团活动id + */ + private Long groupActivityId; + + /** + * 活动商品Id + */ + private Long groupSpuId; + + /** + * 已参团人数 + */ + private Integer joinNum; + + /** + * 拼团状态(0:待成团,1:拼团中,2:拼团成功,3:拼团失败) + */ + private Integer status; + + /** + * 团队订单总额 + */ + private Long totalPrice; + + /** + * 开始时间(团长支付成功时间) + */ + private Date startTime; + + /** + * 剩余时间 + */ + private Date endTime; + + /** + * 团长user_Id + */ + private Long shareUserId; + + public Long getGroupTeamId() { + return groupTeamId; + } + + public void setGroupTeamId(Long groupTeamId) { + this.groupTeamId = groupTeamId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getGroupSpuId() { + return groupSpuId; + } + + public void setGroupSpuId(Long groupSpuId) { + this.groupSpuId = groupSpuId; + } + + public Integer getJoinNum() { + return joinNum; + } + + public void setJoinNum(Integer joinNum) { + this.joinNum = joinNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getTotalPrice() { + return totalPrice; + } + + public void setTotalPrice(Long totalPrice) { + this.totalPrice = totalPrice; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getShareUserId() { + return shareUserId; + } + + public void setShareUserId(Long shareUserId) { + this.shareUserId = shareUserId; + } + + @Override + public String toString() { + return "GroupTeam{" + + "groupTeamId=" + groupTeamId + + ",shopId=" + shopId + + ",groupActivityId=" + groupActivityId + + ",groupSpuId=" + groupSpuId + + ",joinNum=" + joinNum + + ",status=" + status + + ",totalPrice=" + totalPrice + + ",startTime=" + startTime + + ",endTime=" + endTime + + ",createTime=" + createTime + + ",shareUserId=" + shareUserId + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupSkuServiceImpl.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupSkuServiceImpl.java new file mode 100644 index 0000000..64536b0 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupSkuServiceImpl.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.group.mapper.GroupSkuMapper; +import com.tmerclub.cloud.group.model.GroupSku; +import com.tmerclub.cloud.group.service.GroupSkuService; +import com.tmerclub.cloud.group.vo.GroupSkuVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 拼团活动商品规格 + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +@Service +public class GroupSkuServiceImpl implements GroupSkuService { + + @Autowired + private GroupSkuMapper groupSkuMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> groupSkuMapper.list()); + } + + @Override + public GroupSku getByGroupSkuId(Long groupSkuId) { + return groupSkuMapper.getByGroupSkuId(groupSkuId); + } + + @Override + public void save(GroupSku groupSku) { + groupSkuMapper.save(groupSku); + } + + @Override + public void update(GroupSku groupSku) { + groupSkuMapper.update(groupSku); + } + + @Override + public void deleteById(Long groupSkuId) { + groupSkuMapper.deleteById(groupSkuId); + } + + @Override + public void batchSave(List groupSkuList, Long groupActivityId) { + if (CollUtil.isEmpty(groupSkuList)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + for (GroupSku groupSku : groupSkuList) { + groupSku.setGroupActivityId(groupActivityId); + } + groupSkuMapper.batchSave(groupSkuList); + } + + @Override + public void removeGroupSkuByGroupActivityId(Long groupActivityId) { + groupSkuMapper.removeGroupSkuByGroupActivityId(groupActivityId); + } + + @Override + public void batchUpdate(List groupSkuList, Long groupActivityId) { + if (CollUtil.isEmpty(groupSkuList)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + for (GroupSku groupSku : groupSkuList) { + groupSku.setGroupActivityId(groupActivityId); + } + groupSkuMapper.batchUpdate(groupSkuList); + } + + @Override + public List listByGroupActivityId(Long groupActivityId) { + return groupSkuMapper.listByGroupActivityId(groupActivityId); + } + + @Override + public List getSkuIdByActivityIdAndActPrice(Long groupActivityId, Long actPrice) { + return groupSkuMapper.getSkuIdByActivityIdAndActPrice(groupActivityId, actPrice); + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupTeamServiceImpl.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupTeamServiceImpl.java new file mode 100644 index 0000000..ff898ab --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupTeamServiceImpl.java @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.DateUtils; +import com.tmerclub.cloud.group.bo.mongo.MongoGroupTeamBO; +import com.tmerclub.cloud.group.constant.TeamStatusEnum; +import com.tmerclub.cloud.group.mapper.GroupActivityMapper; +import com.tmerclub.cloud.group.mapper.GroupTeamMapper; +import com.tmerclub.cloud.group.model.GroupTeam; +import com.tmerclub.cloud.group.service.GroupTeamService; +import com.tmerclub.cloud.group.vo.GroupActivityVO; +import com.tmerclub.cloud.group.vo.app.AppGroupTeamVO; +import com.mongodb.client.result.UpdateResult; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 拼团团队表 + * @author YXF + */ +@Service +public class GroupTeamServiceImpl implements GroupTeamService { + private static final Logger logger = LoggerFactory.getLogger(GroupTeamServiceImpl.class); + + @Autowired + private GroupTeamMapper groupTeamMapper; + + @Autowired + private GroupActivityMapper groupActivityMapper; + + @DubboReference + private UserFeignClient userFeignClient; + + @Autowired + private MongoTemplate mongoTemplate; + + @Override + public void saveToMongodb(MongoGroupTeamBO mongoGroupTeamBO) { + if (Objects.isNull(mongoGroupTeamBO) || Objects.isNull(mongoGroupTeamBO.getGroupTeamId())) { + throw new LuckException("拼团团队信息不全"); + } + mongoGroupTeamBO.setCreateTime(new Date()); + mongoGroupTeamBO.setUpdateTime(new Date()); + logger.info("保存拼团团队到mongodb{}", mongoGroupTeamBO); + mongoTemplate.save(mongoGroupTeamBO); + } + + @Override + public void saveBatchToMongodb(List list) { + logger.info("批量保存拼团团队到mongodb{}", list); + for (MongoGroupTeamBO mongoGroupTeamBO : list) { + if (Objects.isNull(mongoGroupTeamBO) || Objects.isNull(mongoGroupTeamBO.getGroupTeamId())) { + throw new LuckException("拼团团队信息不全"); + } + mongoGroupTeamBO.setCreateTime(new Date()); + mongoGroupTeamBO.setUpdateTime(new Date()); + } + mongoTemplate.insertAll(list); + } + + @Override + public void update(GroupTeam groupTeam) { + Update update = new Update(); + if (Objects.nonNull(groupTeam.getJoinNum())) { + update.set("joinNum", groupTeam.getJoinNum()); + } + if (Objects.nonNull(groupTeam.getTotalPrice())) { + update.set("totalPrice", groupTeam.getTotalPrice()); + } + if (Objects.nonNull(groupTeam.getStatus())) { + update.set("status", groupTeam.getStatus()); + } + if (Objects.nonNull(groupTeam.getStartTime())) { + update.set("startTime", groupTeam.getStartTime()); + } + if (Objects.nonNull(groupTeam.getEndTime())) { + update.set("endTime", groupTeam.getEndTime()); + } + Query query = new Query(Criteria.where("_id").is(groupTeam.getGroupTeamId())); + mongoTemplate.updateFirst(query, update, MongoGroupTeamBO.class); + } + + @Override + public MongoGroupTeamBO getByGroupTeamId(Long groupTeamId) { + return mongoTemplate.findById(groupTeamId, MongoGroupTeamBO.class); + } + + @Override + public List listJoinGroup(Long groupActivityId, Integer showSize) { + Date date = new Date(); + Criteria criteria = new Criteria(); + criteria.and("groupActivityId").is(groupActivityId).and("status").is(TeamStatusEnum.IN_GROUP.value()); + criteria.and("startTime").lte(Objects.requireNonNull(DateUtils.dateToIsoDate(date))); + criteria.and("endTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(date))); + Query query = new Query(criteria).with(Sort.by(Sort.Direction.DESC, "startTime")).limit(showSize); + List mongoGroupTeamBOList = mongoTemplate.find(query, MongoGroupTeamBO.class); + if (CollUtil.isEmpty(mongoGroupTeamBOList)) { + return new ArrayList<>(); + } + List appGroupTeamList = BeanUtil.mapAsList(mongoGroupTeamBOList, AppGroupTeamVO.class); + GroupActivityVO groupActivityVO = groupActivityMapper.getByGroupActivityId(groupActivityId); + Set userIds = appGroupTeamList.stream().map(AppGroupTeamVO::getShareUserId).collect(Collectors.toSet()); + ServerResponseEntity> userResponse = userFeignClient.getUserByUserIds(new ArrayList<>(userIds)); + Map userMap = userResponse.getData().stream().collect(Collectors.toMap(UserApiVO::getUserId, u -> u)); + for (AppGroupTeamVO appGroupTeamVO : appGroupTeamList) { + UserApiVO userApiVO = userMap.get(appGroupTeamVO.getShareUserId()); + appGroupTeamVO.setGroupNumber(groupActivityVO.getGroupNumber()); + appGroupTeamVO.setShareNickName(userApiVO.getNickName()); + appGroupTeamVO.setSharePic(userApiVO.getPic()); + } + return appGroupTeamList; + } + + @Override + public AppGroupTeamVO getAppGroupTeam(Long groupTeamId) { + MongoGroupTeamBO mongoGroupTeamBO = getByGroupTeamId(groupTeamId); + AppGroupTeamVO appGroupTeam = BeanUtil.map(mongoGroupTeamBO, AppGroupTeamVO.class); + GroupActivityVO groupActivityVO = groupActivityMapper.getByGroupActivityId(appGroupTeam.getGroupActivityId()); + appGroupTeam.setGroupNumber(groupActivityVO.getGroupNumber()); + return appGroupTeam; + } + + @Override + public void cancelGroupTeam(Long groupTeamId) { + Update update = new Update(); + update.set("status", TeamStatusEnum.FAIL.value()); + Query query = new Query(Criteria.where("_id").is(groupTeamId).and("status").is(TeamStatusEnum.WAITING_GROUP.value())); + UpdateResult updateResult = mongoTemplate.updateFirst(query, update, MongoGroupTeamBO.class); + if (updateResult.getModifiedCount() > 0) { + logger.info("拼团团队取消{}", groupTeamId); + } + } + + @Override + public void updateToSuccess(MongoGroupTeamBO groupTeam) { + logger.info("团队更新为成功{}", groupTeam); + Update update = new Update(); + update.set("status", TeamStatusEnum.SUCCESS.value()); + update.set("joinNum", groupTeam.getJoinNum()); + update.set("totalPrice", groupTeam.getTotalPrice()); + Query query = new Query(Criteria.where("_id").is(groupTeam.getGroupTeamId()) + .and("status").is(TeamStatusEnum.IN_GROUP.value())); + UpdateResult updateResult = mongoTemplate.updateFirst(query, update, MongoGroupTeamBO.class); + if (updateResult.getModifiedCount() < 1) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public void updateToUnSuccess(Long groupTeamId) { + logger.info("拼团失败" + groupTeamId); + Update update = new Update(); + update.set("status", TeamStatusEnum.FAIL.value()); + Query query = new Query(Criteria.where("_id").is(groupTeamId).and("status").is(TeamStatusEnum.IN_GROUP.value())); + UpdateResult updateResult = mongoTemplate.updateFirst(query, update, MongoGroupTeamBO.class); + if (updateResult.getModifiedCount() < 1) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public void initGroupTeamToMongo() { + int start = 0; + int size = 10000; + mongoTemplate.remove(MongoGroupTeamBO.class); + while (true) { + // 批量以10000条处理 + List mongoGroupTeamList = groupTeamMapper.listToMongodb(start, size); + if (CollUtil.isEmpty(mongoGroupTeamList)) { + break; + } + mongoTemplate.insertAll(mongoGroupTeamList); + if (mongoGroupTeamList.size() <= size) { + break; + } + start = start + size; + } + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupSkuVO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupSkuVO.java new file mode 100644 index 0000000..328d137 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupSkuVO.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 拼团活动商品规格VO + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public class GroupSkuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "拼团活动商品规格id") + private Long groupSkuId; + + @Schema(description = "拼团活动id") + private Long groupActivityId; + + @Schema(description = "商品规格id") + private Long skuId; + + @Schema(description = "活动价格") + private Long actPrice; + + @Schema(description = "商品sku价格") + private Long price; + + @Schema(description = "已售数量") + private Long sellNum; + + @Schema(description = "sku名称") + private String skuName; + + public Long getGroupSkuId() { + return groupSkuId; + } + + public void setGroupSkuId(Long groupSkuId) { + this.groupSkuId = groupSkuId; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getActPrice() { + return actPrice; + } + + public void setActPrice(Long actPrice) { + this.actPrice = actPrice; + } + + public Long getSellNum() { + return sellNum; + } + + public void setSellNum(Long sellNum) { + this.sellNum = sellNum; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + @Override + public String toString() { + return "GroupSkuVO{" + + "groupSkuId=" + groupSkuId + + ",groupActivityId=" + groupActivityId + + ",skuId=" + skuId + + ",actPrice=" + actPrice + + ",price=" + price + + ",sellNum=" + sellNum + + ",skuName=" + skuName + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupSpuVO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupSpuVO.java new file mode 100644 index 0000000..6f9400f --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupSpuVO.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 拼团活动商品表VO + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public class GroupSpuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "活动商品id") + private Long groupSpuId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "活动id") + private Long groupActivityId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "已成团订单数(统计)") + private Long groupOrderCount; + + @Schema(description = "已成团人数(统计)") + private Long groupNumberCount; + + @Schema(description = "状态(1:正常 0:失效 -1:已删除)") + private Integer status; + + public Long getGroupSpuId() { + return groupSpuId; + } + + public void setGroupSpuId(Long groupSpuId) { + this.groupSpuId = groupSpuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getGroupOrderCount() { + return groupOrderCount; + } + + public void setGroupOrderCount(Long groupOrderCount) { + this.groupOrderCount = groupOrderCount; + } + + public Long getGroupNumberCount() { + return groupNumberCount; + } + + public void setGroupNumberCount(Long groupNumberCount) { + this.groupNumberCount = groupNumberCount; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "GroupSpuVO{" + + "groupSpuId=" + groupSpuId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",shopId=" + shopId + + ",groupActivityId=" + groupActivityId + + ",spuId=" + spuId + + ",groupOrderCount=" + groupOrderCount + + ",groupNumberCount=" + groupNumberCount + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupActivityVO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupActivityVO.java new file mode 100644 index 0000000..da31356 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupActivityVO.java @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.vo.app; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author YXF + * @date 2021/3/26 + */ +public class AppGroupActivityVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "拼团活动id") + private Long groupActivityId; + + @Schema(description = "拼团状态(-1:删除、0:未启用、1:启用、2:违规下架、3:等待审核 4:已失效 5:已结束)") + private Integer status; + + @Schema(description = "活动开始时间") + private Date startTime; + + @Schema(description = "活动结束时间") + private Date endTime; + + @Schema(description = "成团人数") + private Integer groupNumber; + + @Schema(description = "商品是否限购(1:限购、0:不限购)") + private Integer hasMaxNum; + + @Schema(description = "限购数量") + private Integer maxNum; + + @Schema(description = "已购买数量") + private Integer prodCount; + + @Schema(description = "当前用户参团的团队ID(null表示还没有参加该活动)") + private Long joinGroupTeamId; + + @Schema(description = "开启模拟成团后,拼团有效期内人数未满的团,系统将会模拟“匿名买家”凑满人数,使该团成团。 你只需要对已付款参团的真实买家发货。建议合理开启,以提高成团率。") + private Integer hasGroupTip; + + @Schema(description = "开启后,商品详情页展示未开始的拼团活动,但活动开始前用户无法拼团购买") + private Integer isPreheat; + + @Schema(description = "活动状态(活动状态:1:未开始、2:进行中、3:已结束、4:已失效)") + private Integer activityStatus; + + @Schema(description = "商品活动价格(最低价)") + private Long price; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "在多少秒后过期") + private Long expiresIn; + + @Schema(description = "在多少秒后开始") + private Long startIn; + + @Schema(description = "sku列表") + private List groupSkuList; + + @Schema(description = "供应商商品类型 0.否 1.是 2.商家代销") + private Integer supplierSpuType; + + @Schema(description = "发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + + public Integer getGroupNumber() { + return groupNumber; + } + + public void setGroupNumber(Integer groupNumber) { + this.groupNumber = groupNumber; + } + + public Integer getHasMaxNum() { + return hasMaxNum; + } + + public void setHasMaxNum(Integer hasMaxNum) { + this.hasMaxNum = hasMaxNum; + } + + public Integer getMaxNum() { + return maxNum; + } + + public void setMaxNum(Integer maxNum) { + this.maxNum = maxNum; + } + + public Integer getProdCount() { + return prodCount; + } + + public void setProdCount(Integer prodCount) { + this.prodCount = prodCount; + } + + public Long getJoinGroupTeamId() { + return joinGroupTeamId; + } + + public void setJoinGroupTeamId(Long joinGroupTeamId) { + this.joinGroupTeamId = joinGroupTeamId; + } + + public Integer getHasGroupTip() { + return hasGroupTip; + } + + public void setHasGroupTip(Integer hasGroupTip) { + this.hasGroupTip = hasGroupTip; + } + + public Integer getIsPreheat() { + return isPreheat; + } + + public void setIsPreheat(Integer isPreheat) { + this.isPreheat = isPreheat; + } + + public void setActivityStatus(Integer activityStatus) { + this.activityStatus = activityStatus; + } + + public Integer getActivityStatus() { + return activityStatus; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public List getGroupSkuList() { + return groupSkuList; + } + + public void setGroupSkuList(List groupSkuList) { + this.groupSkuList = groupSkuList; + } + + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getExpiresIn() { + return expiresIn; + } + + public void setExpiresIn(Long expiresIn) { + this.expiresIn = expiresIn; + } + + public Long getStartIn() { + return startIn; + } + + public void setStartIn(Long startIn) { + this.startIn = startIn; + } + + @Override + public String toString() { + return "AppGroupActivityVO{" + + "groupActivityId=" + groupActivityId + + ", status=" + status + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", groupNumber=" + groupNumber + + ", hasMaxNum=" + hasMaxNum + + ", maxNum=" + maxNum + + ", prodCount=" + prodCount + + ", joinGroupTeamId=" + joinGroupTeamId + + ", hasGroupTip=" + hasGroupTip + + ", isPreheat=" + isPreheat + + ", activityStatus=" + activityStatus + + ", price=" + price + + ", spuId=" + spuId + + ", shopId=" + shopId + + ", expiresIn=" + expiresIn + + ", startIn=" + startIn + + ", groupSkuList=" + groupSkuList + + ", supplierSpuType=" + supplierSpuType + + ", supplierDeliveryType=" + supplierDeliveryType + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupSkuVO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupSkuVO.java new file mode 100644 index 0000000..628a92a --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupSkuVO.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.vo.app; + +import com.tmerclub.cloud.common.product.vo.SkuComboVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author YXF + * @date 2021/3/26 + */ +public class AppGroupSkuVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "SPU id") + private Long spuId; + + @Schema(description = "拼团活动商品规格id") + private Long groupSkuId; + + @Schema(description = "商品规格Id") + private Long skuId; + + @Schema(description = "售价,整数方式保存") + private Long priceFee; + + @Schema(description = "市场价,整数方式保存") + private Long marketPriceFee; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "sku图片") + private String imgUrl; + + @Schema(description = "销售属性组合字符串 格式是p1:v1;p2:v2") + private String properties; + + @Schema(description = "库存") + private Integer stock; + + @Schema(description = "供应商库存") + private Integer supplierStock; + + @Schema(description = "状态") + private Integer status; + + @Schema(description = "组合商品列表") + private List skuComboList; + + public List getSkuComboList() { + return skuComboList; + } + + public void setSkuComboList(List skuComboList) { + this.skuComboList = skuComboList; + } + + public Integer getSupplierStock() { + return supplierStock; + } + + public void setSupplierStock(Integer supplierStock) { + this.supplierStock = supplierStock; + } + + public Long getGroupSkuId() { + return groupSkuId; + } + + public void setGroupSkuId(Long groupSkuId) { + this.groupSkuId = groupSkuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + + public String getProperties() { + return properties; + } + + public void setProperties(String properties) { + this.properties = properties; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "AppGroupSkuVO{" + + "spuId=" + spuId + + ", groupSkuId=" + groupSkuId + + ", skuId=" + skuId + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", skuName='" + skuName + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", properties='" + properties + '\'' + + ", stock=" + stock + + ", supplierStock=" + supplierStock + + ", status=" + status + + ", skuComboList=" + skuComboList + + '}'; + } +} diff --git a/tmerclub-group/src/main/resources/mapper/GroupTeamMapper.xml b/tmerclub-group/src/main/resources/mapper/GroupTeamMapper.xml new file mode 100644 index 0000000..97b7e8f --- /dev/null +++ b/tmerclub-group/src/main/resources/mapper/GroupTeamMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + `group_team_id`,`shop_id`,`group_activity_id`,`group_spu_id`,`join_num`,`status`,`total_price`,`start_time`,`end_time`,`create_time`,`share_user_id`,`update_time` + + + + diff --git a/tmerclub-im/Dockerfile b/tmerclub-im/Dockerfile new file mode 100644 index 0000000..0b93728 --- /dev/null +++ b/tmerclub-im/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms512m", "-Xmx512m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/config/DubboBeanConfig.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/config/DubboBeanConfig.java new file mode 100644 index 0000000..af9555b --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/config/DubboBeanConfig.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.im.config; + +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopUserFeignClient; +import com.tmerclub.cloud.api.platform.feign.SysUserFeignClient; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.context.annotation.Configuration; + +/** + * 以下代码看起来无用,实际上根据dubbo3在spring 当中的bean加载变化,这个东西可以为spring的application提供上下文 + * 请勿随意删除!!!! + * 请勿随意删除!!!! + * 请勿随意删除!!!! + * 请勿随意删除!!!! + * @author LGH + */ +@Configuration +public class DubboBeanConfig { + + @DubboReference + private TokenFeignClient tokenFeignClient; + + @DubboReference + private UserFeignClient userFeignClient; + + @DubboReference + private SysUserFeignClient sysUserFeignClient; + + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + + @DubboReference + private AccountFeignClient accountFeignClient; + + @DubboReference + private ShopUserFeignClient shopUserFeignClient; + + @DubboReference + private SysUserFeignClient sysUserClient; + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/Admin.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/Admin.java new file mode 100644 index 0000000..e6fe1cf --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/Admin.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.constants; + +/** + * @author Lzk + */ +public class Admin { + + public static final long ID = 0; + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/MsgCode.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/MsgCode.java new file mode 100644 index 0000000..3467928 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/MsgCode.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.constants; + +/** + * @author Lzk + */ +public class MsgCode { + + /** + * 心跳 + */ + public static final int HEART_BEAT = 0; + + /** + * 历史聊天记录 + */ + public static final int HISTORY = 2; + + /** + * 当前在线客服列表 + */ + public static final int EMPLOYEE_ONLINE = 3; + + /** + * 转接客服成功 + */ + public static final int CHANGE_EMPLOYEE_SUCCESS = 4; + + /** + * 消息已读 + */ + public static final int READ = 5; + + /** + * 无法获取用户信息 + */ + public static final int CAN_NOT_FIND_USER_INFO = 10; + + /** + * 账户已在别处登录,请刷新 + */ + public static final int LOGIN_IN_OTHER_PLACE = 11; + + /** + * 内容格式有误 + */ + public static final int CONTENT_FORMAT_ERROR = 13; + + /** + * 参数有误 + */ + public static final int PARAM_ERROR = 14; + + /** + * 不是你负责的客户 + */ + public static final int NOT_YOUR_CLIENT = 15; + + /** + * 上下线提醒 + */ + public static final int ONLINE_OR_OFFLINE = 16; + + /** + * 未读消息 + */ + public static final int UNREAD_MESSAGE = 17; + + /** + * 用户账号已注销 + */ + public static final int USER_ACCOUNT_CANCELLATION = 18; + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/WhoSend.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/WhoSend.java new file mode 100644 index 0000000..a21cec8 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/WhoSend.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.constants; + +/** + * @author Lzk + */ +public class WhoSend { + + public static final int EMPLOYEE = 1; + + public static final int USER = 2; + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/multishop/ImMsgBizSkillsController.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/multishop/ImMsgBizSkillsController.java new file mode 100644 index 0000000..380a25c --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/multishop/ImMsgBizSkillsController.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.controller.multishop; + + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.im.dto.ImMsgBizSkillsDTO; +import com.tmerclub.cloud.im.service.ImMsgBizSkillsService; +import com.tmerclub.cloud.im.vo.ImMsgBizSkillsVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 客服自动回复表 + * + * @author FrozenWatermelon + * @date 2023-03-23 17:43:40 + */ +@RestController("multishopImMsgBizSkillsController") +@RequestMapping("/m/im_msg_biz_skills") +@Tag(name = "店铺自动回复接口") +public class ImMsgBizSkillsController { + + @Autowired + private ImMsgBizSkillsService imMsgBizSkillsService; + + + @GetMapping("/page") + @Operation(summary = "获取客服自动回复表列表", description = "分页获取客服自动回复表列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, ImMsgBizSkillsDTO imMsgBizSkillsDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + PageVO imMsgBizSkillsPage = imMsgBizSkillsService.page(pageDTO, imMsgBizSkillsDTO, shopId); + return ServerResponseEntity.success(imMsgBizSkillsPage); + } + + @GetMapping + @Operation(summary = "获取客服自动回复表", description = "根据id获取客服自动回复表") + public ServerResponseEntity getById(@RequestParam Long id) { + return ServerResponseEntity.success(imMsgBizSkillsService.getById(id)); + } + + @PostMapping + @Operation(summary = "保存客服自动回复表", description = "保存客服自动回复表") + public ServerResponseEntity save(@Valid @RequestBody ImMsgBizSkillsDTO imMsgBizSkillsDTO) { + ImMsgBizSkillsVO imMsgBizSkills = BeanUtil.map(imMsgBizSkillsDTO, ImMsgBizSkillsVO.class); + imMsgBizSkills.setShopId(AuthUserContext.get().getTenantId()); + imMsgBizSkillsService.save(imMsgBizSkills); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新客服自动回复表", description = "更新客服自动回复表") + public ServerResponseEntity update(@Valid @RequestBody ImMsgBizSkillsDTO imMsgBizSkillsDTO) { + ImMsgBizSkillsVO imMsgBizSkills = BeanUtil.map(imMsgBizSkillsDTO, ImMsgBizSkillsVO.class); + imMsgBizSkillsService.update(imMsgBizSkills); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除客服自动回复表", description = "根据客服自动回复表id删除客服自动回复表") + public ServerResponseEntity delete(@RequestParam Long id) { + imMsgBizSkillsService.deleteById(id); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/platform/ImMsgBizSkillsController.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/platform/ImMsgBizSkillsController.java new file mode 100644 index 0000000..28d9849 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/platform/ImMsgBizSkillsController.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.controller.platform; + + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.im.dto.ImMsgBizSkillsDTO; +import com.tmerclub.cloud.im.service.ImMsgBizSkillsService; +import com.tmerclub.cloud.im.vo.ImMsgBizSkillsVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 客服自动回复表 + * + * @author FrozenWatermelon + * @date 2023-03-23 17:43:40 + */ +@RestController("platformImMsgBizSkillsController") +@RequestMapping("/p/im_msg_biz_skills") +@Tag(name = "平台自动回复接口") +public class ImMsgBizSkillsController { + + @Autowired + private ImMsgBizSkillsService imMsgBizSkillsService; + + + @GetMapping("/page") + @Operation(summary = "获取客服自动回复表列表", description = "分页获取客服自动回复表列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, ImMsgBizSkillsDTO imMsgBizSkillsDTO) { + Long shopId = Constant.PLATFORM_SHOP_ID; + PageVO imMsgBizSkillsPage = imMsgBizSkillsService.page(pageDTO, imMsgBizSkillsDTO, shopId); + return ServerResponseEntity.success(imMsgBizSkillsPage); + } + + @GetMapping + @Operation(summary = "获取客服自动回复表", description = "根据id获取客服自动回复表") + public ServerResponseEntity getById(@RequestParam Long id) { + return ServerResponseEntity.success(imMsgBizSkillsService.getById(id)); + } + + @PostMapping + @Operation(summary = "保存客服自动回复表", description = "保存客服自动回复表") + public ServerResponseEntity save(@Valid @RequestBody ImMsgBizSkillsDTO imMsgBizSkillsDTO) { + ImMsgBizSkillsVO imMsgBizSkills = BeanUtil.map(imMsgBizSkillsDTO, ImMsgBizSkillsVO.class); + imMsgBizSkills.setShopId(Constant.PLATFORM_SHOP_ID); + imMsgBizSkillsService.save(imMsgBizSkills); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新客服自动回复表", description = "更新客服自动回复表") + public ServerResponseEntity update(@Valid @RequestBody ImMsgBizSkillsDTO imMsgBizSkillsDTO) { + ImMsgBizSkillsVO imMsgBizSkills = BeanUtil.map(imMsgBizSkillsDTO, ImMsgBizSkillsVO.class); + imMsgBizSkillsService.update(imMsgBizSkills); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除客服自动回复表", description = "根据客服自动回复表id删除客服自动回复表") + public ServerResponseEntity delete(@RequestParam Long id) { + imMsgBizSkillsService.deleteById(id); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/feign/ImMsgBizUserFeignController.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/feign/ImMsgBizUserFeignController.java new file mode 100644 index 0000000..621bb83 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/feign/ImMsgBizUserFeignController.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.feign; + +import com.tmerclub.cloud.api.im.feign.ImFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.im.service.ImMsgBizUserService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zp + * @Date 2023/7/12 10:28 + */ +@DubboService +public class ImMsgBizUserFeignController implements ImFeignClient { + + @Autowired + private ImMsgBizUserService imMsgBizUserService; + + @Override + public ServerResponseEntity getImUserUnreadNum(Long userId) { + return ServerResponseEntity.success(imMsgBizUserService.getImUserUnreadNum(userId)); + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/mapper/ImMsgBizUserMapper.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/mapper/ImMsgBizUserMapper.java new file mode 100644 index 0000000..b4a1787 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/mapper/ImMsgBizUserMapper.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.mapper; + +import com.tmerclub.cloud.im.model.ImMsgBizUser; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户最近聊天记录表 + * + * @author FrozenWatermelon + * @date 2021-08-25 13:58:56 + */ +public interface ImMsgBizUserMapper { + + /** + * 获取用户最近聊天记录表列表 + * @param userId 用户id + * @return 用户最近聊天记录表列表 + */ + List listByUserId(@Param("userId") Long userId); + + /** + * 根据用户最近聊天记录表id获取用户最近聊天记录表 + * + * @param id 用户最近聊天记录表id + * @return 用户最近聊天记录表 + */ + ImMsgBizUser getById(@Param("id") Long id); + + /** + * 获取用户最近聊天记录表 + * @param sendType 发送类型 + * @param bizId 商家或平台id + * @param userId 用户id + * @return 用户最近聊天记录表 + */ + ImMsgBizUser getBySendTypeAndBizIdAndUserId(@Param("sendType") Integer sendType, @Param("bizId") Long bizId, @Param("userId") Long userId); + + /** + * 保存用户最近聊天记录表 + * @param imMsgBizUser 用户最近聊天记录表 + */ + void save(@Param("imMsgBizUser") ImMsgBizUser imMsgBizUser); + + /** + * 更新用户最近聊天记录表 + * @param imMsgBizUser 用户最近聊天记录表 + */ + void update(@Param("imMsgBizUser") ImMsgBizUser imMsgBizUser); + + /** + * 根据用户最近聊天记录表id删除用户最近聊天记录表 + * @param id 消息id + */ + void deleteById(@Param("id") Long id); + + /** + * 获取用户未读消息数量 + * @param userId + * @return + */ + Integer getImUserUnreadNum(@Param("userId") Long userId); + + /** + * 更新用户未读消息数量 + * @param imMsgBizUserId + * @param userUnread + * @param whoSend + */ + void updateUserUnreadHistor(@Param("imMsgBizUserId") Long imMsgBizUserId, @Param("userUnread") Integer userUnread, @Param("whoSend") Integer whoSend); + + /** + * 更新店铺未读消息数量 + * + * @param id + * @param unread + * @param whoSend + */ + void updateShopUserUnreadMsgNum(@Param("id") Long id, @Param("unread") Integer unread, @Param("whoSend") Integer whoSend); +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/model/ImMsgBizSkills.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/model/ImMsgBizSkills.java new file mode 100644 index 0000000..02efb8b --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/model/ImMsgBizSkills.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 客服自动回复表 + * + * @author FrozenWatermelon + * @date 2023-03-23 17:43:40 + */ +public class ImMsgBizSkills extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 客服自动回复id + */ + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 关键字 + */ + private String keywords; + + /** + * 回复内容 + */ + private String content; + + /** + * 状态 + */ + private Integer status; + + /** + * 备注 + */ + private String remark; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getKeywords() { + return keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "ImMsgBizSkills{" + + "id=" + id + + ",shopId=" + shopId + + ",keywords=" + keywords + + ",content=" + content + + ",status=" + status + + ",remark=" + remark + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizEmployeeRecentService.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizEmployeeRecentService.java new file mode 100644 index 0000000..e0133b0 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizEmployeeRecentService.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.im.model.ImMsgBizEmployeeRecent; +import com.tmerclub.cloud.im.model.ImMsgBizUserHistory; + +/** + * 员工最近聊天记录表 + * + * @author FrozenWatermelon + * @date 2021-08-25 13:58:56 + */ +public interface ImMsgBizEmployeeRecentService { + + /** + * 分页获取员工最近聊天记录表列表 + * @param pageDTO 分页参数 + * @param sendType 发送类型 + * @param bizId 商家或平台id + * @param employeeId 员工id + * @return 员工最近聊天记录表列表分页数据 + */ + PageVO pageBySendTypeAndBizIdAndEmployeeId(PageDTO pageDTO, Integer sendType, Long bizId, Long employeeId); + + /** + * 根据员工最近聊天记录表id获取员工最近聊天记录表 + * + * @param id 员工最近聊天记录表id + * @return 员工最近聊天记录表 + */ + ImMsgBizEmployeeRecent getById(Long id); + + /** + * 分页获取员工最近聊天记录表列表 + * @param sendType 发送类型 + * @param bizId 商家或平台id + * @param employeeId 员工id + * @param userId 用户id + * @return 员工最近聊天记录表列表分页数据 + */ + ImMsgBizEmployeeRecent getBySendTypeBizIdEmployeeIdUserId(Integer sendType, Long bizId, Long employeeId, Long userId); + + /** + * 保存员工最近聊天记录表 + * @param imMsgBizEmployeeRecent 员工最近聊天记录表 + */ + void save(ImMsgBizEmployeeRecent imMsgBizEmployeeRecent); + + /** + * 更新员工最近聊天记录表 + * @param imMsgBizEmployeeRecent 员工最近聊天记录表 + */ + void update(ImMsgBizEmployeeRecent imMsgBizEmployeeRecent); + + /** + * 根据员工最近聊天记录表id删除员工最近聊天记录表 + * @param id 员工最近聊天记录表id + */ + void deleteById(Long id); + + /** + * 更新员工最后的消息 + * + * @param imMsgBizUserHistory 消息历史记录实体类 + */ + void updateEmployeeRecent(ImMsgBizUserHistory imMsgBizUserHistory); + + /** + * 更新客服未读条数 + * @param sendType + * @param id + * @param shopId + * @param employeeId + * @param userId + */ + void updateEmployeeUnreadMsgNum(Integer sendType, Long id, Long shopId, Long employeeId, Long userId); + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizSkillsService.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizSkillsService.java new file mode 100644 index 0000000..fd79bed --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizSkillsService.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.im.dto.ImMsgBizSkillsDTO; +import com.tmerclub.cloud.im.vo.ImMsgBizSkillsVO; + +import java.util.List; + +/** + * 客服自动回复表 + * + * @author FrozenWatermelon + * @date 2023-03-23 17:43:40 + */ +public interface ImMsgBizSkillsService { + + /** + * 分页获取客服自动回复表列表 + * @param pageDTO 分页参数 + * @param imMsgBizSkillsDTO + * @param shopId + * @return 客服自动回复表列表分页数据 + */ + PageVO page(PageDTO pageDTO, ImMsgBizSkillsDTO imMsgBizSkillsDTO, Long shopId); + + /** + * 根据客服自动回复表id获取客服自动回复表 + * + * @param id 客服自动回复表id + * @return 客服自动回复表 + */ + ImMsgBizSkillsVO getById(Long id); + + /** + * 保存客服自动回复表 + * @param imMsgBizSkills 客服自动回复表 + */ + void save(ImMsgBizSkillsVO imMsgBizSkills); + + /** + * 更新客服自动回复表 + * @param imMsgBizSkills 客服自动回复表 + */ + void update(ImMsgBizSkillsVO imMsgBizSkills); + + /** + * 根据客服自动回复表id删除客服自动回复表 + * @param id 客服自动回复表id + */ + void deleteById(Long id); + + /** + * 根据shopId获取 + * @param shopId + * @return + */ + List getByShopId(Long shopId); +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizUserHistoryService.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizUserHistoryService.java new file mode 100644 index 0000000..45d5b81 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizUserHistoryService.java @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.service; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.vo.ShopUserVO; +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.im.model.ImMsgBizUserHistory; +import com.tmerclub.cloud.im.vo.MessageInfoVO; +import com.tmerclub.cloud.im.vo.MsgItemVO; + +/** + * 店铺和用户历史聊天记录表 + * + * @author FrozenWatermelon + * @date 2021-08-25 13:58:56 + */ +public interface ImMsgBizUserHistoryService { + + /** + * 分页获取店铺和用户历史聊天记录表列表 + * + * @param pageDTO 分页参数 + * @param sendType 发送类型 + * @param bizId 商家或平台id + * @param employeeId 员工id + * @param userId 用户id + * @return 店铺和用户历史聊天记录表列表分页数据 + */ + PageVO pageBySendTypeBizIdUserId(PageDTO pageDTO, Integer sendType, Long bizId, Long employeeId, Long userId); + + /** + * 根据店铺和用户历史聊天记录表id获取店铺和用户历史聊天记录表 + * + * @param id 店铺和用户历史聊天记录表id + * @return 店铺和用户历史聊天记录表 + */ + ImMsgBizUserHistory getById(Long id); + + /** + * 根据店铺和用户历史聊天记录表参数获取店铺和用户历史聊天记录表 + * + * @param imMsgBizUserHistory 店铺和用户历史聊天记录参数 + * @return 店铺和用户历史聊天记录表 + */ + ImMsgBizUserHistory getByParam(ImMsgBizUserHistory imMsgBizUserHistory); + + /** + * 保存店铺和用户历史聊天记录表 + * + * @param imMsgBizUserHistory 店铺和用户历史聊天记录表 + */ + void save(ImMsgBizUserHistory imMsgBizUserHistory); + + /** + * 更新店铺和用户历史聊天记录表 + * + * @param imMsgBizUserHistory 店铺和用户历史聊天记录表 + */ + void update(ImMsgBizUserHistory imMsgBizUserHistory); + + /** + * 根据店铺和用户历史聊天记录表id删除店铺和用户历史聊天记录表 + * + * @param id 店铺和用户历史聊天记录表id + */ + void deleteById(Long id); + + /** + * 保存聊天记录 + * + * @param sendType 聊天类型 + * @param bizId 平台或店铺id + * @param userId 用户id + * @param employeeId 员工id + * @param type 消息类型 + * @param content 消息呢容 + * @param whoSend 发送人 + * @return 消息历史记录实体类 + */ + ImMsgBizUserHistory saveHistory(Integer sendType, Long bizId, Long userId, Long employeeId, Integer type, String content, Integer whoSend); + + /** + * 转换消息实体类 + * + * @param user 用户信息 + * @param imMsgBizUserHistory 消息历史记录 + * @return 消息转换输出类 + */ + MsgItemVO getUserPlatformMsgItem(UserApiVO user, ImMsgBizUserHistory imMsgBizUserHistory); + + /** + * 转换消息实体类 + * + * @param shopDetail 商家信息 + * @param user 用户信息 + * @param imMsgBizUserHistory 消息历史记录 + * @return 消息转换输出类 + */ + MsgItemVO getUserShopMsgItem(EsShopDetailBO shopDetail, UserApiVO user, ImMsgBizUserHistory imMsgBizUserHistory); + + /** + * 获取用户与平台的聊天记录 + * + * @param sysUser 平台信息 + * @param messageInfo 信息载体 + * @param bizId 平台或店铺id + * @param userId 用户id + * @param user 用户信息 + * @return 翻页聊天记录 + */ + PageVO getUserPlatformHistory(SysUserVO sysUser, MessageInfoVO messageInfo, Long bizId, Long userId, UserApiVO user); + + /** + * 获取用户与商家的聊天记录 + * + * @param shopDetail 商家信息 + * @param messageInfo 信息载体 + * @param bizId 平台或店铺id + * @param userId 用户id + * @param user 用户信息 + * @return 翻页聊天记录 + */ + PageVO getUserShopHistory(EsShopDetailBO shopDetail, MessageInfoVO messageInfo, Long bizId, Long userId, UserApiVO user); + + /** + * 获取商家与用户的聊天记录 + * + * @param uidInfoBO 商家信息 + * @param messageInfo 信息载体 + * @param user 用户信息 + * @param shopDetail 商家信息 + * @return 翻页聊天记录 + */ + PageVO getShopUserHistory(UidInfoBO uidInfoBO, MessageInfoVO messageInfo, UserApiVO user, EsShopDetailBO shopDetail); + + /** + * 获取平台与用户的聊天记录 + * + * @param uidInfoBO 平台信息 + * @param sysUser 平台信息 + * @param messageInfo 信息载体 + * @param user 用户信息 + * @return 翻页聊天记录 + */ + PageVO getPlatformUserHistory(UidInfoBO uidInfoBO, MessageInfoVO messageInfo, UserApiVO user, SysUserVO sysUser); + + /** + * 用户标记已读 + * + * @param userId 用户id + * @return 消息历史记录实体类列表 + */ + int markUserPlatformRead(Long userId); + + /** + * 用户标记已读 + * + * @param bizId 平台或店铺id + * @param userId 用户id + * @return 消息历史记录实体类列表 + */ + int markUserShopRead(Long bizId, Long userId); + + /** + * 标记用户发送消息已读(平台、商家端) + * + * @param sendType 发送类型 平台、商家 + * @param messageInfo 信息载体 + * @param uidInfoBO 平台信息 + * @param userId 用户id + * @return 消息历史记录实体类列表 + */ + Integer markUserReadBySendType(Integer sendType, MessageInfoVO messageInfo, UidInfoBO uidInfoBO, Long userId); + + /** + * 保存用户与平台的聊天记录 + * + * @param messageInfo 信息载体 + * @param bizId 平台或店铺id + * @param userId 用户id + * @param employeeId + * @return 消息历史记录实体类 + */ + ImMsgBizUserHistory saveUserPlatformHistory(MessageInfoVO messageInfo, Long bizId, Long userId, Long employeeId); + + /** + * 保存用户与商家的聊天记录 + * + * @param messageInfo 信息载体 + * @param bizId 平台或店铺id + * @param userId 用户id + * @param employeeId 员工id + * @return 消息历史记录实体类 + */ + ImMsgBizUserHistory saveUserShopHistory(MessageInfoVO messageInfo, Long bizId, Long userId, Long employeeId); + + /** + * 保存商家与用户的聊天记录 + * + * @param messageInfo 信息载体 + * @param uidInfoBO 商家信息 + * @return 消息历史记录实体类 + */ + ImMsgBizUserHistory saveShopUserHistory(MessageInfoVO messageInfo, UidInfoBO uidInfoBO); + + /** + * 保存平台与用户的聊天记录 + * + * @param messageInfo 信息载体 + * @param uidInfoBO 平台信息 + * @return 消息历史记录实体类 + */ + ImMsgBizUserHistory savePlatformUserHistory(MessageInfoVO messageInfo, UidInfoBO uidInfoBO); + + /** + * 商家切换客服系统提醒 + * + * @param uidInfoBO 商家信息 + * @param shopUserVO 商家信息 + * @param user 用户信息 + * @return 消息历史记录实体类 + */ + ImMsgBizUserHistory saveShopChangeEmployeeReply(UidInfoBO uidInfoBO, ShopUserVO shopUserVO, UserApiVO user); + + /** + * 平台切换客服系统提醒 + * @param uidInfoBO 转接前平台客服信息 + * @param sysUser3 转接后平台客服信息 + * @param user 用户信息 + * @return 消息历史记录实体类 + */ + ImMsgBizUserHistory savePlatformChangeEmployeeReply(UidInfoBO uidInfoBO, SysUserVO sysUser3, UserApiVO user); +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizSkillsServiceImpl.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizSkillsServiceImpl.java new file mode 100644 index 0000000..7d352c3 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizSkillsServiceImpl.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.im.dto.ImMsgBizSkillsDTO; +import com.tmerclub.cloud.im.mapper.ImMsgBizSkillsMapper; +import com.tmerclub.cloud.im.service.ImMsgBizSkillsService; +import com.tmerclub.cloud.im.vo.ImMsgBizSkillsVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 客服自动回复表 + * + * @author FrozenWatermelon + * @date 2023-03-23 17:43:40 + */ +@Service +public class ImMsgBizSkillsServiceImpl implements ImMsgBizSkillsService { + + @Autowired + private ImMsgBizSkillsMapper imMsgBizSkillsMapper; + + @Override + public PageVO page(PageDTO pageDTO, ImMsgBizSkillsDTO imMsgBizSkillsDTO, Long shopId) { + return PageUtil.doPage(pageDTO, () -> imMsgBizSkillsMapper.list(imMsgBizSkillsDTO, shopId)); + } + + @Override + public ImMsgBizSkillsVO getById(Long id) { + return imMsgBizSkillsMapper.getById(id); + } + + @Override + public void save(ImMsgBizSkillsVO imMsgBizSkills) { + checkSkills(imMsgBizSkills); + imMsgBizSkills.setStatus(1); + imMsgBizSkills.setCreateTime(new Date()); + imMsgBizSkills.setUpdateTime(new Date()); + imMsgBizSkillsMapper.save(imMsgBizSkills); + } + + @Override + public void update(ImMsgBizSkillsVO imMsgBizSkills) { + checkSkills(imMsgBizSkills); + imMsgBizSkills.setUpdateTime(new Date()); + imMsgBizSkillsMapper.update(imMsgBizSkills); + } + + @Override + public void deleteById(Long id) { + imMsgBizSkillsMapper.deleteById(id); + } + + @Override + public List getByShopId(Long shopId) { + return imMsgBizSkillsMapper.getByShopId(shopId); + } + + private void checkSkills(ImMsgBizSkillsVO imMsgBizSkills) { + ImMsgBizSkillsVO selectOne = imMsgBizSkillsMapper.selectByShopIdAndKey(imMsgBizSkills.getShopId(), imMsgBizSkills.getKeywords()); + if (Objects.nonNull(selectOne)) { + if (imMsgBizSkills.getId() != null && Objects.equals(imMsgBizSkills.getId(), selectOne.getId())) { + // 更新操作直接返回 + return; + } + throw new LuckException("关键字重复"); + } + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizUserHistoryServiceImpl.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizUserHistoryServiceImpl.java new file mode 100644 index 0000000..e7504a4 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizUserHistoryServiceImpl.java @@ -0,0 +1,397 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.feign.ShopUserFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopUserVO; +import com.tmerclub.cloud.api.platform.feign.SysUserFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.im.constants.*; +import com.tmerclub.cloud.im.mapper.ImMsgBizUserHistoryMapper; +import com.tmerclub.cloud.im.model.ImMsgBizUser; +import com.tmerclub.cloud.im.model.ImMsgBizUserHistory; +import com.tmerclub.cloud.im.service.ImMsgBizEmployeeRecentService; +import com.tmerclub.cloud.im.service.ImMsgBizUserHistoryService; +import com.tmerclub.cloud.im.service.ImMsgBizUserService; +import com.tmerclub.cloud.im.vo.MessageInfoVO; +import com.tmerclub.cloud.im.vo.MsgItemVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 店铺和用户历史聊天记录表 + * + * @author FrozenWatermelon + * @date 2021-08-25 13:58:56 + */ +@Service +public class ImMsgBizUserHistoryServiceImpl implements ImMsgBizUserHistoryService { + + @Autowired + private ImMsgBizUserHistoryMapper imMsgBizUserHistoryMapper; + + @Autowired + private ImMsgBizUserService imMsgBizUserService; + + @Autowired + private ImMsgBizEmployeeRecentService imMsgBizEmployeeRecentService; + + @DubboReference + private SysUserFeignClient sysUserFeignClient; + + @DubboReference + private ShopUserFeignClient shopUserFeignClient; + + @Override + public PageVO pageBySendTypeBizIdUserId(PageDTO pageDTO, Integer sendType, Long bizId, Long employeeId, Long userId) { + PageVO page = PageUtil.doPage(pageDTO, () -> imMsgBizUserHistoryMapper.listBySendTypeBizIdUserId(sendType, bizId, employeeId, userId)); + List employeeIds = page.getList().stream().map(ImMsgBizUserHistory::getEmployeeId).collect(Collectors.toList()); + Map nickNameMap; + // 查询平台的客服昵称 + if (Objects.equals(sendType, SendType.PLATFORM)) { + List sysUserList = sysUserFeignClient.getImSysUserList(employeeIds); + nickNameMap = sysUserList.stream().collect(Collectors.toMap(SysUserVO::getSysUserId, SysUserVO::getNickName)); + } else if (Objects.equals(sendType, SendType.SHOP)) { + List sysUserList = shopUserFeignClient.getImShopUserList(employeeIds); + nickNameMap = sysUserList.stream().collect(Collectors.toMap(ShopUserVO::getShopUserId, ShopUserVO::getNickName)); + } else { + nickNameMap = new HashMap<>(0); + } + for (ImMsgBizUserHistory imMsgBizUserHistory : page.getList()) { + if (!nickNameMap.containsKey(imMsgBizUserHistory.getEmployeeId())) { + continue; + } + imMsgBizUserHistory.setNickName(nickNameMap.get(imMsgBizUserHistory.getEmployeeId())); + } + return page; + } + + @Override + public ImMsgBizUserHistory getById(Long id) { + return imMsgBizUserHistoryMapper.getById(id); + } + + @Override + public ImMsgBizUserHistory getByParam(ImMsgBizUserHistory imMsgBizUserHistory) { + return imMsgBizUserHistoryMapper.getByParam(imMsgBizUserHistory); + } + + @Override + public void save(ImMsgBizUserHistory imMsgBizUserHistory) { + imMsgBizUserHistoryMapper.save(imMsgBizUserHistory); + } + + @Override + public void update(ImMsgBizUserHistory imMsgBizUserHistory) { + imMsgBizUserHistoryMapper.update(imMsgBizUserHistory); + } + + @Override + public void deleteById(Long id) { + imMsgBizUserHistoryMapper.deleteById(id); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public ImMsgBizUserHistory saveHistory(Integer sendType, Long bizId, Long userId, Long employeeId, Integer type, String content, Integer whoSend) { + ImMsgBizUser imMsgBizUser = imMsgBizUserService.getBySendTypeBizIdUserId(sendType, bizId, userId); + if (Objects.isNull(imMsgBizUser)) { + imMsgBizUser = new ImMsgBizUser(); + imMsgBizUser.setSendType(sendType); + imMsgBizUser.setBizId(bizId); + imMsgBizUser.setUserId(userId); + imMsgBizUser.setBizUnreadNum(0); + imMsgBizUser.setUserUnreadNum(0); + imMsgBizUser.setCreateTime(new Date()); + imMsgBizUser.setUpdateTime(new Date()); + imMsgBizUserService.save(imMsgBizUser); + } + ImMsgBizUserHistory imMsgBizUserHistory = new ImMsgBizUserHistory(); + imMsgBizUserHistory.setImMsgBizUserId(imMsgBizUser.getId()); + imMsgBizUserHistory.setSendType(sendType); + imMsgBizUserHistory.setBizId(bizId); + imMsgBizUserHistory.setUserId(userId); + imMsgBizUserHistory.setEmployeeId(employeeId); + imMsgBizUserHistory.setType(type); + imMsgBizUserHistory.setContent(content); + imMsgBizUserHistory.setWhoSend(whoSend); + if (Objects.equals(whoSend, WhoSend.EMPLOYEE)) { + imMsgBizUserHistory.setUserUnread(MsgRead.UNREAD); + imMsgBizUserHistory.setEmployeeUnread(MsgRead.READ); + } else if (Objects.equals(whoSend, WhoSend.USER)) { + imMsgBizUserHistory.setUserUnread(MsgRead.READ); + imMsgBizUserHistory.setEmployeeUnread(MsgRead.UNREAD); + } + imMsgBizUserHistory.setCreateTime(new Date()); + imMsgBizUserHistory.setUpdateTime(new Date()); + imMsgBizUserHistory.setReadRange(0); + this.save(imMsgBizUserHistory); + return imMsgBizUserHistory; + } + + @Override + public MsgItemVO getUserPlatformMsgItem(UserApiVO user, ImMsgBizUserHistory imMsgBizUserHistory) { + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setChatType(imMsgBizUserHistory.getSendType()); + msgItem.setUserId(user.getUserId()); + msgItem.setUserHeadUrl(user.getPic()); + msgItem.setUserName(user.getNickName()); + msgItem.setNickName(imMsgBizUserHistory.getNickName()); + msgItem.setShopId(imMsgBizUserHistory.getBizId()); + msgItem.setShopName(imMsgBizUserHistory.getNickName()); + msgItem.setItemId(imMsgBizUserHistory.getId()); + msgItem.setEmployeeId(imMsgBizUserHistory.getEmployeeId()); + // todo 东8区,不应该写死"+8"后续优化 + msgItem.setTimeStr(DateUtil.format(imMsgBizUserHistory.getCreateTime(), "yyyy/MM/dd HH:mm")); + msgItem.setTimestamp(imMsgBizUserHistory.getCreateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().toInstant(ZoneOffset.of("+8")).toEpochMilli()); + msgItem.setContent(imMsgBizUserHistory.getContent()); + msgItem.setSource(imMsgBizUserHistory.getWhoSend()); + msgItem.setType(imMsgBizUserHistory.getType()); + msgItem.setUserUnread(imMsgBizUserHistory.getUserUnread()); + msgItem.setEmployeeUnread(imMsgBizUserHistory.getEmployeeUnread()); + msgItem.setCreateTime(imMsgBizUserHistory.getCreateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + msgItem.setUpdateTime(imMsgBizUserHistory.getUpdateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + return msgItem; + } + + @Override + public MsgItemVO getUserShopMsgItem(EsShopDetailBO shopDetail, UserApiVO user, ImMsgBizUserHistory imMsgBizUserHistory) { + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setChatType(imMsgBizUserHistory.getSendType()); + msgItem.setUserId(user.getUserId()); + msgItem.setUserHeadUrl(user.getPic()); + msgItem.setUserName(user.getNickName()); + msgItem.setNickName(imMsgBizUserHistory.getNickName()); + msgItem.setShopLogo(shopDetail.getShopLogo()); + msgItem.setShopId(shopDetail.getShopId()); + msgItem.setShopName(shopDetail.getShopName()); + msgItem.setItemId(imMsgBizUserHistory.getId()); + msgItem.setEmployeeId(imMsgBizUserHistory.getEmployeeId()); + // todo 东8区,不应该写死"+8"后续优化 + msgItem.setTimestamp(imMsgBizUserHistory.getCreateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().toInstant(ZoneOffset.of("+8")).toEpochMilli()); + msgItem.setTimeStr(DateUtil.format(imMsgBizUserHistory.getCreateTime(), "yyyy/MM/dd HH:mm")); + msgItem.setType(imMsgBizUserHistory.getType()); + msgItem.setContent(imMsgBizUserHistory.getContent()); + msgItem.setSource(imMsgBizUserHistory.getWhoSend()); + msgItem.setUserUnread(imMsgBizUserHistory.getUserUnread()); + msgItem.setEmployeeUnread(imMsgBizUserHistory.getEmployeeUnread()); + msgItem.setCreateTime(imMsgBizUserHistory.getCreateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + msgItem.setUpdateTime(imMsgBizUserHistory.getUpdateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + + return msgItem; + } + + @Override + public PageVO getUserPlatformHistory(SysUserVO sysUser, MessageInfoVO messageInfo, Long bizId, Long userId, UserApiVO user) { + PageDTO pageDTO = new PageDTO(); + if (Objects.nonNull(messageInfo.getCurrent()) && Objects.nonNull(messageInfo.getSize())) { + pageDTO.setPageSize(messageInfo.getSize()); + pageDTO.setPageNum(messageInfo.getCurrent()); + } + PageVO history = this.pageBySendTypeBizIdUserId(pageDTO, messageInfo.getSendType(), bizId, null, userId); + List imMsgBizUserHistories = history.getList(); + + List msgItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ImMsgBizUserHistory imMsgBizUserHistory : imMsgBizUserHistories) { + MsgItemVO msgItem = this.getUserPlatformMsgItem(user, imMsgBizUserHistory); + msgItems.add(msgItem); + } + return getPageVO(history, msgItems); + } + + private static PageVO getPageVO(PageVO history, List msgItems) { + PageVO msgItemPage = new PageVO<>(); + BeanUtils.copyProperties(history, msgItemPage); + msgItemPage.setList(msgItems); + return msgItemPage; + } + + @Override + public PageVO getUserShopHistory(EsShopDetailBO shopDetail, MessageInfoVO messageInfo, Long bizId, Long userId, UserApiVO user) { + PageDTO pageDTO = new PageDTO(); + if (Objects.nonNull(messageInfo.getCurrent()) && Objects.nonNull(messageInfo.getSize())) { + pageDTO.setPageNum(messageInfo.getCurrent()); + pageDTO.setPageSize(messageInfo.getSize()); + } + PageVO history = this.pageBySendTypeBizIdUserId(pageDTO, messageInfo.getSendType(), bizId, null, userId); + List imMsgBizUserHistories = history.getList(); + List msgItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ImMsgBizUserHistory imMsgBizUserHistory : imMsgBizUserHistories) { + MsgItemVO msgItem = this.getUserShopMsgItem(shopDetail, user, imMsgBizUserHistory); + msgItems.add(msgItem); + } + return getPageVO(history, msgItems); + } + + @Override + public PageVO getShopUserHistory(UidInfoBO uidInfoBO, MessageInfoVO messageInfo, UserApiVO user, EsShopDetailBO shopDetail) { + PageDTO pageDTO = new PageDTO(); + if (Objects.nonNull(messageInfo.getCurrent()) && Objects.nonNull(messageInfo.getSize())) { + pageDTO.setPageNum(messageInfo.getCurrent()); + pageDTO.setPageSize(messageInfo.getSize()); + } + PageVO history = this.pageBySendTypeBizIdUserId(pageDTO, SendType.SHOP, uidInfoBO.getTenantId(), uidInfoBO.getUserId(), user.getUserId()); + List imMsgBizUserHistories = history.getList(); + // 获取转接前的聊天记录(当天转接的记录+当前用户是自己负责才进行查询) + imMsgBizUserHistories.sort(Comparator.comparing(ImMsgBizUserHistory::getId, Comparator.reverseOrder())); + List msgItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ImMsgBizUserHistory imMsgBizUserHistory : imMsgBizUserHistories) { + MsgItemVO msgItem = this.getUserShopMsgItem(shopDetail, user, imMsgBizUserHistory); + msgItems.add(msgItem); + } + return getPageVO(history, msgItems); + } + @Override + public PageVO getPlatformUserHistory(UidInfoBO uidInfoBO, MessageInfoVO messageInfo, UserApiVO user, SysUserVO sysUser) { + PageDTO pageDTO = new PageDTO(); + if (Objects.nonNull(messageInfo.getCurrent()) && Objects.nonNull(messageInfo.getSize())) { + pageDTO.setPageNum(messageInfo.getCurrent()); + pageDTO.setPageSize(messageInfo.getSize()); + } + PageVO history = this.pageBySendTypeBizIdUserId(pageDTO, SendType.PLATFORM, Admin.ID, uidInfoBO.getUserId(), user.getUserId()); + List imMsgBizUserHistories = history.getList(); + imMsgBizUserHistories.sort(Comparator.comparing(ImMsgBizUserHistory::getId, Comparator.reverseOrder())); + // 获取消息历史包含的用户昵称 + List msgItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ImMsgBizUserHistory imMsgBizUserHistory : imMsgBizUserHistories) { + MsgItemVO msgItem = this.getUserPlatformMsgItem(user, imMsgBizUserHistory); + msgItems.add(msgItem); + } + return getPageVO(history, msgItems); + + + } + + @Transactional(rollbackFor = Exception.class) + @Override + public int markUserPlatformRead(Long userId) { + ImMsgBizUser imMsgBizUser = imMsgBizUserService.getBySendTypeBizIdUserId(SendType.PLATFORM, Admin.ID, userId); + // 更新用户未读消息的数量,且用户未读消息更新为已读并返回更新数量 + return updateUserHistory(imMsgBizUser); + } + + private int updateUserHistory(ImMsgBizUser imMsgBizUser) { + // 更改用户所有未读消息为已读状态 + int updateNum = imMsgBizUserHistoryMapper.updateUnreadHistoryByUserId(imMsgBizUser.getId(), imMsgBizUser.getUserId()); + // 更新用户未读消息数量 + imMsgBizUserService.updateUserUnreadHistor(imMsgBizUser.getId(), MsgRead.UNREAD, WhoSend.EMPLOYEE); + return updateNum; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public int markUserShopRead(Long bizId, Long userId) { + ImMsgBizUser imMsgBizUser = imMsgBizUserService.getBySendTypeBizIdUserId(SendType.SHOP, bizId, userId); + // 更新用户未读消息的数量,且用户未读消息更新为已读并返回更新数量 + return updateUserHistory(imMsgBizUser); + } + + + @Transactional(rollbackFor = Exception.class) + @Override + public Integer markUserReadBySendType(Integer sendType, MessageInfoVO messageInfo, UidInfoBO uidInfoBO, Long userId) { + // 获取平台、店铺客服信息 + ImMsgBizUser imMsgBizUser = imMsgBizUserService.getBySendTypeBizIdUserId(sendType, uidInfoBO.getTenantId(), userId); + // 更改平台、店铺客服所有未读消息为已读状态 + int updateNum = imMsgBizUserHistoryMapper.updateUnreadHistoryByShopId(imMsgBizUser.getId(), imMsgBizUser.getUserId()); + if (updateNum > 0) { + // 更新平台、店铺未读消息数 + imMsgBizUserService.updateShopUserUnreadMsgNum(imMsgBizUser.getId(), MsgRead.UNREAD, WhoSend.USER); + } + // 更新客服未读条数 + imMsgBizEmployeeRecentService.updateEmployeeUnreadMsgNum(sendType, imMsgBizUser.getId(), uidInfoBO.getTenantId(), uidInfoBO.getUserId(), userId); + return updateNum; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public ImMsgBizUserHistory saveUserPlatformHistory(MessageInfoVO messageInfo, Long bizId, Long userId, Long employeeId) { + ImMsgBizUserHistory imMsgBizUserHistory = this.saveHistory(messageInfo.getSendType(), bizId, userId, employeeId, messageInfo.getMsgType(), messageInfo.getContent(), WhoSend.USER); + imMsgBizUserService.updateBizUserLastMsg(imMsgBizUserHistory); + imMsgBizEmployeeRecentService.updateEmployeeRecent(imMsgBizUserHistory); + return imMsgBizUserHistory; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public ImMsgBizUserHistory saveUserShopHistory(MessageInfoVO messageInfo, Long bizId, Long userId, Long employeeId) { + ImMsgBizUserHistory imMsgBizUserHistory = this.saveHistory(messageInfo.getSendType(), bizId, userId, employeeId, messageInfo.getMsgType(), messageInfo.getContent(), WhoSend.USER); + imMsgBizUserService.updateBizUserLastMsg(imMsgBizUserHistory); + imMsgBizEmployeeRecentService.updateEmployeeRecent(imMsgBizUserHistory); + return imMsgBizUserHistory; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public ImMsgBizUserHistory saveShopUserHistory(MessageInfoVO messageInfo, UidInfoBO uidInfoBO) { + ImMsgBizUserHistory imMsgBizUserHistory = this.saveHistory(SendType.SHOP, uidInfoBO.getTenantId(), messageInfo.getToId(), uidInfoBO.getUserId(), messageInfo.getMsgType(), messageInfo.getContent(), WhoSend.EMPLOYEE); + imMsgBizUserService.updateBizUserLastMsg(imMsgBizUserHistory); + imMsgBizEmployeeRecentService.updateEmployeeRecent(imMsgBizUserHistory); + return imMsgBizUserHistory; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public ImMsgBizUserHistory savePlatformUserHistory(MessageInfoVO messageInfo, UidInfoBO uidInfoBO) { + ImMsgBizUserHistory imMsgBizUserHistory = this.saveHistory(SendType.PLATFORM, Admin.ID, messageInfo.getToId(), uidInfoBO.getUserId(), messageInfo.getMsgType(), messageInfo.getContent(), WhoSend.EMPLOYEE); + imMsgBizUserService.updateBizUserLastMsg(imMsgBizUserHistory); + imMsgBizEmployeeRecentService.updateEmployeeRecent(imMsgBizUserHistory); + return imMsgBizUserHistory; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public ImMsgBizUserHistory saveShopChangeEmployeeReply(UidInfoBO uidInfoBO, ShopUserVO shopUserVO, UserApiVO user) { + String content = "系统:转接成功:" + shopUserVO.getNickName() + "客服为您服务"; + ImMsgBizUserHistory imMsgBizUserHistory = this.saveHistory(SendType.SHOP, uidInfoBO.getTenantId(), user.getUserId(), shopUserVO.getShopUserId(), MsgType.TEXT, content, WhoSend.EMPLOYEE); + // 多保存一份转接前客服的转接聊天记录 +// imMsgBizUserHistory.setEmployeeId(uidInfoBO.getUserId()); +// imMsgBizUserHistory.setReadRange(1); +// this.save(imMsgBizUserHistory); + imMsgBizUserHistory.setEmployeeId(shopUserVO.getShopUserId()); + + imMsgBizUserService.updateBizUserLastMsg(imMsgBizUserHistory); + imMsgBizEmployeeRecentService.updateEmployeeRecent(imMsgBizUserHistory); + return imMsgBizUserHistory; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public ImMsgBizUserHistory savePlatformChangeEmployeeReply(UidInfoBO uidInfoBO, SysUserVO sysUser3, UserApiVO user) { + String content = "系统:转接成功:" + sysUser3.getNickName() + "客服为您服务"; + ImMsgBizUserHistory imMsgBizUserHistory = this.saveHistory(SendType.PLATFORM, Admin.ID, user.getUserId(), sysUser3.getSysUserId(), MsgType.TEXT, content, WhoSend.EMPLOYEE); +// // 多保存一份转接前客服的转接聊天记录 +// imMsgBizUserHistory.setEmployeeId(uidInfoBO.getUserId()); +// imMsgBizUserHistory.setReadRange(1); +// this.save(imMsgBizUserHistory); + imMsgBizUserHistory.setEmployeeId(sysUser3.getSysUserId()); + + imMsgBizUserService.updateBizUserLastMsg(imMsgBizUserHistory); + imMsgBizEmployeeRecentService.updateEmployeeRecent(imMsgBizUserHistory); + return imMsgBizUserHistory; + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizUserServiceImpl.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizUserServiceImpl.java new file mode 100644 index 0000000..5cf6c17 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizUserServiceImpl.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.im.constants.WhoSend; +import com.tmerclub.cloud.im.mapper.ImMsgBizUserMapper; +import com.tmerclub.cloud.im.model.ImMsgBizUser; +import com.tmerclub.cloud.im.model.ImMsgBizUserHistory; +import com.tmerclub.cloud.im.service.ImMsgBizUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.ZoneId; +import java.util.Date; +import java.util.Objects; + +/** + * 用户最近聊天记录表 + * + * @author FrozenWatermelon + * @date 2021-08-25 13:58:56 + */ +@Service +public class ImMsgBizUserServiceImpl implements ImMsgBizUserService { + + @Autowired + private ImMsgBizUserMapper imMsgBizUserMapper; + + @Override + public PageVO pageByUserId(PageDTO pageDTO, Long userId) { + return PageUtil.doPage(pageDTO, () -> imMsgBizUserMapper.listByUserId(userId)); + } + + @Override + public ImMsgBizUser getById(Long id) { + return imMsgBizUserMapper.getById(id); + } + + @Override + public ImMsgBizUser getBySendTypeBizIdUserId(Integer sendType, Long bizId, Long userId) { + return imMsgBizUserMapper.getBySendTypeAndBizIdAndUserId(sendType, bizId, userId); + } + + @Override + public void save(ImMsgBizUser imMsgBizUser) { + imMsgBizUserMapper.save(imMsgBizUser); + } + + @Override + public void update(ImMsgBizUser imMsgBizUser) { + imMsgBizUserMapper.update(imMsgBizUser); + } + + @Override + public void deleteById(Long id) { + imMsgBizUserMapper.deleteById(id); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void updateBizUserLastMsg(ImMsgBizUserHistory imMsgBizUserHistory) { + ImMsgBizUser imMsgBizUser = this.getBySendTypeBizIdUserId(imMsgBizUserHistory.getSendType(), imMsgBizUserHistory.getBizId(), imMsgBizUserHistory.getUserId()); + if (Objects.nonNull(imMsgBizUser)) { + imMsgBizUser.setEmployeeId(imMsgBizUserHistory.getEmployeeId()); + if (Objects.equals(imMsgBizUserHistory.getWhoSend(), WhoSend.EMPLOYEE)) { + imMsgBizUser.setUserUnreadNum(imMsgBizUser.getUserUnreadNum() + 1); + } else if (Objects.equals(imMsgBizUserHistory.getWhoSend(), WhoSend.USER)) { + imMsgBizUser.setBizUnreadNum(imMsgBizUser.getBizUnreadNum() + 1); + } + imMsgBizUser.setLastMsgId(imMsgBizUserHistory.getId()); + imMsgBizUser.setLastMsgType(imMsgBizUserHistory.getType()); + imMsgBizUser.setLastMsgContent(imMsgBizUserHistory.getContent()); + imMsgBizUser.setLastMsgWhoSend(imMsgBizUserHistory.getWhoSend()); + imMsgBizUser.setLastMsgTime(imMsgBizUserHistory.getCreateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + imMsgBizUser.setUpdateTime(new Date()); + this.update(imMsgBizUser); + } + } + + @Override + public Integer getImUserUnreadNum(Long userId) { + Integer num = imMsgBizUserMapper.getImUserUnreadNum(userId); + return ((num == null) ? 0 : num); + } + + @Override + public void updateUserUnreadHistor(Long imMsgBizUserId, Integer userUnread, Integer whoSend) { + imMsgBizUserMapper.updateUserUnreadHistor(imMsgBizUserId, userUnread, whoSend); + } + + @Override + public void updateShopUserUnreadMsgNum(Long id, Integer unread, Integer whoSend) { + imMsgBizUserMapper.updateShopUserUnreadMsgNum(id, unread, whoSend); + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/platform/SysOnlineWebSocketServer.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/platform/SysOnlineWebSocketServer.java new file mode 100644 index 0000000..a45d62f --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/platform/SysOnlineWebSocketServer.java @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.socket.platform; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.MapUtil; +import com.tmerclub.cloud.im.constants.Constant; +import com.tmerclub.cloud.im.constants.MsgCode; +import com.tmerclub.cloud.im.constants.SendType; +import com.tmerclub.cloud.im.socket.app.UserWebSocketServer; +import com.tmerclub.cloud.im.vo.MessageInfoVO; +import com.tmerclub.cloud.im.vo.MsgItemVO; +import jakarta.websocket.*; +import jakarta.websocket.server.PathParam; +import jakarta.websocket.server.ServerEndpoint; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author Lzk + */ +@ServerEndpoint("/p/ua/im/websocket/online/{token}/{userId}") +@Component +public class SysOnlineWebSocketServer { + + /** + * userId为key + */ + public static final ConcurrentHashMap SYS_ONLINE_MAP = new ConcurrentHashMap<>(256); + + private static TokenFeignClient tokenFeignClient; + + public static void setApplicationContext(ApplicationContext applicationContext) { + tokenFeignClient = applicationContext.getBean(TokenFeignClient.class); + } + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session, @PathParam("token") String token) throws IOException { + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (uidInfoBO == null) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取用户信息"))); + } + return; + } + + // 如果原来就有token + Session oldSession = SYS_ONLINE_MAP.get(Constant.ONLINE_SYS_PREFIX + uidInfoBO.getUserId() + Constant.UNDERLINE + token); + if (oldSession != null) { + // 客户端收到11,关闭ws链接,弹出提示 + if (oldSession.isOpen()) { + oldSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.LOGIN_IN_OTHER_PLACE, "账户已在别处登录,请刷新"))); + oldSession.close(); + } + } + + Boolean isExist = MapUtil.isExistKeyPrefix(SYS_ONLINE_MAP, Constant.ONLINE_SYS_PREFIX); + if (!isExist) { + Set set2 = UserWebSocketServer.USER_MAP.keySet(); + if (CollUtil.isNotEmpty(set2)) { + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setChatType(SendType.PLATFORM); + msgItem.setShopId(uidInfoBO.getUserId()); + msgItem.setOnlineOrOffline(true); + for (String key : set2) { + Session userSession = UserWebSocketServer.USER_MAP.get(key); + if (Objects.nonNull(userSession)) { + if (userSession.isOpen()) { + userSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.ONLINE_OR_OFFLINE, msgItem))); + } + } + } + } + } + + SYS_ONLINE_MAP.put(Constant.ONLINE_SYS_PREFIX + uidInfoBO.getUserId() + Constant.UNDERLINE + token, session); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success())); + } + Integer unRead = RedisUtil.get(Constant.UNREAD_SYS_PREFIX + uidInfoBO.getUserId() + Constant.UNDERLINE); + if (Objects.nonNull(unRead) && 1 == unRead) { + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setNewMessage(true); + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(msgItem))); + RedisUtil.del(Constant.UNREAD_SYS_PREFIX + uidInfoBO.getUserId() + Constant.UNDERLINE); + } + } + + /** + * 连接关闭调用的方法 + */ + @OnClose + public void onClose(Session session, @PathParam("token") String token, @PathParam("userId") Long userId) throws IOException { + SYS_ONLINE_MAP.remove(Constant.ONLINE_SYS_PREFIX + userId + Constant.UNDERLINE + token); + + Boolean isExist = MapUtil.isExistKeyPrefix(SYS_ONLINE_MAP, Constant.ONLINE_SYS_PREFIX); + if (!isExist) { + Set set2 = UserWebSocketServer.USER_MAP.keySet(); + if (CollUtil.isNotEmpty(set2)) { + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setShopId(userId); + msgItem.setChatType(SendType.PLATFORM); + msgItem.setOnlineOrOffline(false); + sendOfflineMsg(set2, msgItem); + } + } + } + + private static void sendOfflineMsg(Set set2, MsgItemVO msgItem) throws IOException { + for (String key : set2) { + Session userSession = UserWebSocketServer.USER_MAP.get(key); + if (userSession != null) { + if (userSession.isOpen()) { + userSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.ONLINE_OR_OFFLINE, msgItem))); + } + } + } + } + + /** + * 连接错误调用的方法 + */ + @OnError + public void onError(Session session, @PathParam("token") String token, Throwable error, @PathParam("userId") Long userId) throws IOException { + SYS_ONLINE_MAP.remove(Constant.ONLINE_SYS_PREFIX + userId + Constant.UNDERLINE + token); + + Boolean isExist = MapUtil.isExistKeyPrefix(SYS_ONLINE_MAP, Constant.ONLINE_SYS_PREFIX); + if (!isExist) { + Set set2 = UserWebSocketServer.USER_MAP.keySet(); + if (CollUtil.isNotEmpty(set2)) { + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setShopId(userId); + msgItem.setOnlineOrOffline(false); + sendOfflineMsg(set2, msgItem); + } + } + } + + /** + * 收到客户端消息后调用的方法,该消息由用户发过来 + * + * @param sourceMessage 客户端发送过来的消息 + */ + @OnMessage + public void onMessage(String sourceMessage, @PathParam("token") String token, Session session) throws IOException { + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (Objects.isNull(uidInfoBO)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取平台用户信息"))); + } + return; + } + + if (StrUtil.isBlank(sourceMessage)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "平台消息内容格式有误"))); + } + return; + } + + MessageInfoVO messageInfo = Json.parseObject(sourceMessage, MessageInfoVO.class); + + if (Objects.isNull(messageInfo)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "平台消息内容格式有误"))); + } + return; + } + + // 保持心跳 + if (StrUtil.equals(messageInfo.getContent(), Constant.HEART_BEAT)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.HEART_BEAT, "保持心跳"))); + } + } + + } + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/platform/SysWebSocketServer.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/platform/SysWebSocketServer.java new file mode 100644 index 0000000..a8b8808 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/platform/SysWebSocketServer.java @@ -0,0 +1,371 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.socket.platform; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.api.platform.feign.SysUserFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.MapUtil; +import com.tmerclub.cloud.im.constants.Constant; +import com.tmerclub.cloud.im.constants.MsgCode; +import com.tmerclub.cloud.im.constants.SendType; +import com.tmerclub.cloud.im.model.ImMsgBizUserHistory; +import com.tmerclub.cloud.im.service.ImMsgBizUserHistoryService; +import com.tmerclub.cloud.im.socket.app.UserOnlineWebSocketServer; +import com.tmerclub.cloud.im.socket.app.UserWebSocketServer; +import com.tmerclub.cloud.im.vo.MessageInfoVO; +import com.tmerclub.cloud.im.vo.MsgItemVO; +import jakarta.websocket.*; +import jakarta.websocket.server.PathParam; +import jakarta.websocket.server.ServerEndpoint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 平台收到的消息 + * 10,"无法获取用户信息" + * 11,"账户已在别处登录,请刷新" + * 12,"对方不在线" + * 13, "内容格式有误" + * + * @author Lzk + */ +@ServerEndpoint("/p/ua/im/websocket/{token}/{userId}") +@Component +public class SysWebSocketServer { + private static final Logger LOG = LoggerFactory.getLogger(SysWebSocketServer.class); + + /** + * userId为key + */ + public static final ConcurrentHashMap SYS_MAP = new ConcurrentHashMap<>(256); + + private static TokenFeignClient tokenFeignClient; + + private static SysUserFeignClient sysUserFeignClient; + + private static UserFeignClient userFeignClient; + + private static SysUserFeignClient sysUserClient; + + private static ImMsgBizUserHistoryService imMsgBizUserHistoryService; + + public static void setApplicationContext(ApplicationContext applicationContext) { + tokenFeignClient = applicationContext.getBean(TokenFeignClient.class); + sysUserFeignClient = applicationContext.getBean(SysUserFeignClient.class); + userFeignClient = applicationContext.getBean(UserFeignClient.class); + imMsgBizUserHistoryService = applicationContext.getBean(ImMsgBizUserHistoryService.class); + sysUserClient = applicationContext.getBean(SysUserFeignClient.class); + } + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session, @PathParam("token") String token) throws IOException { + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (uidInfoBO == null) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取平台用户信息"))); + } + return; + } + + // 如果原来就有token + Session oldSession = SYS_MAP.get(Constant.SYS_PREFIX + uidInfoBO.getUserId()); + if (oldSession != null) { + // 客户端收到11,关闭ws链接,弹出提示 + if (oldSession.isOpen()) { + oldSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(11, "账户已在别处登录,请刷新"))); + oldSession.close(); + } + } + + SYS_MAP.put(Constant.SYS_PREFIX + uidInfoBO.getUserId(), session); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success("ok"))); + } + } + + /** + * 连接关闭调用的方法 + */ + @OnClose + public void onClose(Session session, @PathParam("token") String token, @PathParam("userId") Long userId) { + SYS_MAP.remove(Constant.SYS_PREFIX + userId); + } + + /** + * 连接错误调用的方法 + */ + @OnError + public void onError(Session session, @PathParam("token") String token, Throwable error, @PathParam("userId") Long userId) { + SYS_MAP.remove(Constant.SYS_PREFIX + userId); + LOG.error("平台客服执行异常:{}", error); + } + + /** + * 收到客户端消息后调用的方法,该消息由用户发过来 + * + * @param sourceMessage 客户端发送过来的消息 + */ + @OnMessage + public void onMessage(String sourceMessage, @PathParam("token") String token, Session session) throws IOException { + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (Objects.isNull(uidInfoBO)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取平台的用户信息"))); + } + return; + } + + if (StrUtil.isBlank(sourceMessage)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "平台的消息内容格式有误"))); + } + return; + } + + MessageInfoVO messageInfo = Json.parseObject(sourceMessage, MessageInfoVO.class); + + if (Objects.isNull(messageInfo)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "平台消息内容格式有误"))); + } + return; + } + + // 保持心跳 + if (StrUtil.equals(messageInfo.getContent(), Constant.HEART_BEAT)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.HEART_BEAT, "保持心跳"))); + } + return; + } + + Long userId = messageInfo.getToId(); + ServerResponseEntity userApiResponse = userFeignClient.getInsiderUserData(userId); + if (!userApiResponse.isSuccess()) { + throw new LuckException(userApiResponse.getMsg()); + } + UserApiVO user = userApiResponse.getData(); + if (Objects.isNull(user)) { + user = new UserApiVO(); + user.setUserName("*用户已注销*"); + user.setNickName("*用户已注销*"); + user.setUserId(userId); + } + + sendToUser(messageInfo, uidInfoBO, user, session); + } + + public void sendToUser(MessageInfoVO messageInfo, UidInfoBO uidInfoBO, UserApiVO user, Session session) throws IOException { + ServerResponseEntity sysUserResponse2 = sysUserFeignClient.getSysUserByUserId(uidInfoBO.getUserId()); + if (!sysUserResponse2.isSuccess()) { + throw new LuckException(sysUserResponse2.getMsg()); + } + SysUserVO sysUser2 = sysUserResponse2.getData(); + + // 获取消息历史 + if (Objects.nonNull(messageInfo.getHistory()) && Objects.equals(messageInfo.getHistory(), true)) { + PageVO msgItemPage = imMsgBizUserHistoryService.getPlatformUserHistory(uidInfoBO, messageInfo, user, sysUser2); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.HISTORY, msgItemPage))); + } + return; + } + + // 标记消息已读 + if (Objects.nonNull(messageInfo.getRead()) && Objects.equals(messageInfo.getRead(), true)) { + markIsRead(messageInfo, uidInfoBO, user, session); + return; + } + + if (Objects.nonNull(messageInfo.getOnlineOrOffline()) && Objects.equals(messageInfo.getOnlineOrOffline(), true)) { + sendOnlineMsg(user, session); + } + + String tempString = RedisUtil.get(Constant.IN_CHARGE_SYS + messageInfo.getToId()); + Long sysUserId = null; + if (Objects.nonNull(tempString)) { + sysUserId = Long.valueOf(tempString.substring(4)); + SysUserVO userVO = sysUserFeignClient.getSysUserByUserId(sysUserId).getData(); + if (userVO == null) { + // 负责客户的客服不存在,删除缓存 + RedisUtil.del(Constant.IN_CHARGE_SYS + messageInfo.getToId()); + } else if (!Objects.equals(sysUserId, uidInfoBO.getUserId())) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(15, "不是你负责的客户"))); + } + return; + } + } + + // 用户注销后不可以进行后面的操作 + if (Objects.isNull(user.getUserId())) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.USER_ACCOUNT_CANCELLATION, "无接收消息的联系人"))); + } + return; + } + if (Objects.isNull(user.getStatus())) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.USER_ACCOUNT_CANCELLATION, "用户账号已注销"))); + } + return; + } + // 获取可转接客服列表 + if (Objects.nonNull(messageInfo.getPlatformUserList()) && Objects.equals(messageInfo.getPlatformUserList(), true)) { + getCanTransferList(uidInfoBO, session); + return; + } + + // 转接客服 + if (Objects.nonNull(messageInfo.getChangeTo()) && Objects.equals(messageInfo.getChangeTo(), true)) { + transfer(messageInfo, uidInfoBO, user, session); + return; + } + + // 发送消息 + if (Objects.nonNull(messageInfo.getContent()) && !messageInfo.getContent().isEmpty()) { + sendMsgToUser(messageInfo, uidInfoBO, user, sysUser2, sysUserId); + } + } + + private static void sendMsgToUser(MessageInfoVO messageInfo, UidInfoBO uidInfoBO, UserApiVO user, SysUserVO sysUser2, Long sysUserId) throws IOException { + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.savePlatformUserHistory(messageInfo, uidInfoBO); + // 在线的话发送消息,不在线的话留言 + Session userSession = UserWebSocketServer.USER_MAP.get(Constant.USER_PREFIX + messageInfo.getToId()); + if (Objects.nonNull(userSession)) { + if (Objects.isNull(sysUserId)) { + RedisUtil.set(Constant.IN_CHARGE_SYS + messageInfo.getToId(), "test" + uidInfoBO.getUserId(), 0); + } + imMsgBizUserHistory.setNickName(sysUser2.getNickName()); + MsgItemVO msgItem = imMsgBizUserHistoryService.getUserPlatformMsgItem(user, imMsgBizUserHistory); + if (userSession.isOpen()) { + SysUserVO sysUserVO = sysUserFeignClient.getSimpleByUserId(sysUserId); + msgItem.setNickName(sysUserVO.getNickName()); + userSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(msgItem))); + } + List sessionList = MapUtil.getSessionByKeyPrefix(UserOnlineWebSocketServer.USER_ONLINE_MAP, Constant.ONLINE_USER_PREFIX + messageInfo.getToId() + Constant.UNDERLINE); + if (!sessionList.isEmpty()) { + MsgItemVO msgItem2 = new MsgItemVO(); + msgItem2.setNewMessage(true); + for (Session onlineSession : sessionList) { + if (Objects.nonNull(onlineSession) && onlineSession.isOpen()) { + String jsonString = Json.toJsonString(ServerResponseEntity.success(msgItem2)); + onlineSession.getBasicRemote().sendText(jsonString); + } + } + } + } + } + + private static void transfer(MessageInfoVO messageInfo, UidInfoBO uidInfoBO, UserApiVO user, Session session) throws IOException { + if (Objects.nonNull(messageInfo.getPlatformUserId())) { + Session userSession = UserWebSocketServer.USER_MAP.get(Constant.USER_PREFIX + messageInfo.getToId()); + Session sysSession = SYS_MAP.get(Constant.SYS_PREFIX + messageInfo.getPlatformUserId()); + if (Objects.nonNull(sysSession)) { + RedisUtil.set(Constant.IN_CHARGE_SYS + messageInfo.getToId(), "test" + messageInfo.getPlatformUserId(), 0); + ServerResponseEntity sysUserResponse3 = sysUserFeignClient.getSysUserByUserId(messageInfo.getPlatformUserId()); + if (!sysUserResponse3.isSuccess()) { + throw new LuckException(sysUserResponse3.getMsg()); + } + SysUserVO sysUser3 = sysUserResponse3.getData(); + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.savePlatformChangeEmployeeReply(uidInfoBO, sysUser3, user); + imMsgBizUserHistory.setNickName(sysUser3.getNickName()); + MsgItemVO msgItem = imMsgBizUserHistoryService.getUserPlatformMsgItem(user, imMsgBizUserHistory); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.CHANGE_EMPLOYEE_SUCCESS, msgItem))); + } + // 在线的话发送消息,不在线的话留言 + if (Objects.nonNull(userSession) && userSession.isOpen()) { + userSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.CHANGE_EMPLOYEE_SUCCESS, msgItem))); + } + if (sysSession.isOpen()) { + sysSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.CHANGE_EMPLOYEE_SUCCESS, msgItem))); + } + } + } + } + + private static void getCanTransferList(UidInfoBO uidInfoBO, Session session) throws IOException { + List keys = MapUtil.getKeysByPrefixAndExcludeKey(SYS_MAP, Constant.SYS_PREFIX, Constant.SYS_PREFIX + uidInfoBO.getUserId()); + List listSysUser = new ArrayList<>(com.tmerclub.cloud.common.constant.Constant.INITIAL_CAPACITY); + if (CollUtil.isEmpty(keys)) { + return; + } + long tempLength = (Constant.SYS_PREFIX).length(); + for (String key : keys) { + Long tempSysUserId = Long.valueOf(key.substring((int) tempLength)); + ServerResponseEntity dbSysUserResponse = sysUserClient.getSysUserByUserId(tempSysUserId); + if (!dbSysUserResponse.isSuccess()) { + throw new LuckException(dbSysUserResponse.getMsg()); + } + SysUserVO dbSysUser = dbSysUserResponse.getData(); + SysUserVO onlineSysUser = new SysUserVO(); + onlineSysUser.setSysUserId(dbSysUser.getSysUserId()); + onlineSysUser.setNickName(dbSysUser.getNickName()); + listSysUser.add(onlineSysUser); + } + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.EMPLOYEE_ONLINE, listSysUser))); + } + } + + private static void sendOnlineMsg(UserApiVO user, Session session) throws IOException { + Boolean isExist = MapUtil.isExistKeyPrefix(UserOnlineWebSocketServer.USER_ONLINE_MAP, Constant.ONLINE_USER_PREFIX + user.getUserId() + Constant.UNDERLINE + "*"); + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setChatType(SendType.PLATFORM); + msgItem.setUserId(user.getUserId()); + msgItem.setOnlineOrOffline(isExist); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.ONLINE_OR_OFFLINE, msgItem))); + } + } + + private static void markIsRead(MessageInfoVO messageInfo, UidInfoBO uidInfoBO, UserApiVO user, Session session) throws IOException { + Integer updateNum = imMsgBizUserHistoryService.markUserReadBySendType(SendType.PLATFORM, messageInfo, uidInfoBO, user.getUserId()); + if (updateNum > 0) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.READ, "ok"))); + } + Session userSession = UserWebSocketServer.USER_MAP.get(Constant.USER_PREFIX + messageInfo.getToId()); + if (Objects.nonNull(userSession)) { + if (userSession.isOpen()) { + userSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.READ, messageInfo.getMsgIds()))); + } + } + } + } + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/ImMsgBizSkillsVO.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/ImMsgBizSkillsVO.java new file mode 100644 index 0000000..83c6d34 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/ImMsgBizSkillsVO.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 客服自动回复表VO + * + * @author FrozenWatermelon + * @date 2023-03-23 17:43:40 + */ +public class ImMsgBizSkillsVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "客服自动回复id") + private Long id; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "关键字") + private String keywords; + + @Schema(description = "回复内容") + private String content; + + @Schema(description = "状态") + private Integer status; + + @Schema(description = "备注") + private String remark; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getKeywords() { + return keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "ImMsgBizSkillsVO{" + + "id=" + id + + ",shopId=" + shopId + + ",keywords=" + keywords + + ",content=" + content + + ",status=" + status + + ",remark=" + remark + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-im/src/main/resources/bootstrap.yml b/tmerclub-im/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..4e6b984 --- /dev/null +++ b/tmerclub-im/src/main/resources/bootstrap.yml @@ -0,0 +1,28 @@ +server: + port: ${MALL4CLOUD_PORT:9120} +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} +logging: + tracer: + pattern: '%5p [${spring.application.name:},%X{X-B3-Parent-SpanName},%X{X-B3-TraceId},%X{X-B3-SpanId}]' + +# dubbo端口:默认为服务端口+2000 +dubbo: + protocol: + port: ${MALL4CLOUD_DUBBO_PORT:9520} diff --git a/tmerclub-im/src/main/resources/logback.xml b/tmerclub-im/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-im/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-im/src/main/resources/mapper/ImMsgBizEmployeeRecentMapper.xml b/tmerclub-im/src/main/resources/mapper/ImMsgBizEmployeeRecentMapper.xml new file mode 100644 index 0000000..6a09653 --- /dev/null +++ b/tmerclub-im/src/main/resources/mapper/ImMsgBizEmployeeRecentMapper.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + `id`,`create_time`,`update_time`,`send_type`,`biz_id`,`user_id`,`employee_id`,`employee_unread_num` + + + + + + insert into im_msg_biz_employee_recent (`send_type`,`biz_id`,`user_id`,`employee_id`,`employee_unread_num`) + values (#{imMsgBizEmployeeRecent.sendType},#{imMsgBizEmployeeRecent.bizId},#{imMsgBizEmployeeRecent.userId},#{imMsgBizEmployeeRecent.employeeId},#{imMsgBizEmployeeRecent.employeeUnreadNum}); + + + update im_msg_biz_employee_recent + + + `send_type` = #{imMsgBizEmployeeRecent.sendType}, + + + `biz_id` = #{imMsgBizEmployeeRecent.bizId}, + + + `user_id` = #{imMsgBizEmployeeRecent.userId}, + + + `employee_id` = #{imMsgBizEmployeeRecent.employeeId}, + + + `employee_unread_num` = #{imMsgBizEmployeeRecent.employeeUnreadNum}, + + + where id = #{imMsgBizEmployeeRecent.id} + + + delete from im_msg_biz_employee_recent where id = #{id} + + + + UPDATE im_msg_biz_employee_recent SET employee_unread_num = ( + SELECT COUNT(*) FROM im_msg_biz_user_history + WHERE employee_id = #{employeeId} + AND employee_unread = 0 + AND who_send = 2 + AND im_msg_biz_user_id = #{id} + ) + WHERE send_type = #{sendType} and biz_id = #{shopId} and employee_id = #{employeeId} and user_id = #{userId} + + + diff --git a/tmerclub-im/src/main/resources/mapper/ImMsgBizSkillsMapper.xml b/tmerclub-im/src/main/resources/mapper/ImMsgBizSkillsMapper.xml new file mode 100644 index 0000000..086f83b --- /dev/null +++ b/tmerclub-im/src/main/resources/mapper/ImMsgBizSkillsMapper.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + `id`,`shop_id`,`keywords`,`content`,`status`,`remark`,`create_time`,`update_time` + + + + + insert into im_msg_biz_skills (`shop_id`,`keywords`,`content`,`status`,`remark`,`create_time`,`update_time`) + values (#{imMsgBizSkills.shopId},#{imMsgBizSkills.keywords},#{imMsgBizSkills.content},#{imMsgBizSkills.status},#{imMsgBizSkills.remark}, #{imMsgBizSkills.createTime},#{imMsgBizSkills.updateTime}); + + + update im_msg_biz_skills + + + `keywords` = #{imMsgBizSkills.keywords}, + + + `content` = #{imMsgBizSkills.content}, + + + `remark` = #{imMsgBizSkills.remark}, + + + `update_time` = #{imMsgBizSkills.updateTime}, + + + where id = #{imMsgBizSkills.id} + + + update im_msg_biz_skills set status = 0 where id = #{id} + + + + + + diff --git a/tmerclub-im/src/main/resources/mapper/ImMsgBizUserMapper.xml b/tmerclub-im/src/main/resources/mapper/ImMsgBizUserMapper.xml new file mode 100644 index 0000000..e40e8eb --- /dev/null +++ b/tmerclub-im/src/main/resources/mapper/ImMsgBizUserMapper.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + `id`,`create_time`,`update_time`,`send_type`,`biz_id`,`user_id`,`employee_id`,`biz_unread_num`,`user_unread_num`,`last_msg_id`,`last_msg_type`,`last_msg_content`,`last_msg_who_send`,`last_msg_time` + + + + + + insert into im_msg_biz_user (`send_type`,`biz_id`,`user_id`,`employee_id`,`biz_unread_num`,`user_unread_num`,`last_msg_id`,`last_msg_type`,`last_msg_content`,`last_msg_who_send`,`last_msg_time`) + values (#{imMsgBizUser.sendType},#{imMsgBizUser.bizId},#{imMsgBizUser.userId},#{imMsgBizUser.employeeId},#{imMsgBizUser.bizUnreadNum},#{imMsgBizUser.userUnreadNum},#{imMsgBizUser.lastMsgId},#{imMsgBizUser.lastMsgType},#{imMsgBizUser.lastMsgContent},#{imMsgBizUser.lastMsgWhoSend},#{imMsgBizUser.lastMsgTime}); + + + update im_msg_biz_user + + + `send_type` = #{imMsgBizUser.sendType}, + + + `biz_id` = #{imMsgBizUser.bizId}, + + + `user_id` = #{imMsgBizUser.userId}, + + + `employee_id` = #{imMsgBizUser.employeeId}, + + + `biz_unread_num` = #{imMsgBizUser.bizUnreadNum}, + + + `user_unread_num` = #{imMsgBizUser.userUnreadNum}, + + + `last_msg_id` = #{imMsgBizUser.lastMsgId}, + + + `last_msg_type` = #{imMsgBizUser.lastMsgType}, + + + `last_msg_content` = #{imMsgBizUser.lastMsgContent}, + + + `last_msg_who_send` = #{imMsgBizUser.lastMsgWhoSend}, + + + `last_msg_time` = #{imMsgBizUser.lastMsgTime}, + + + where id = #{imMsgBizUser.id} + + + delete from im_msg_biz_user where id = #{id} + + + + + + UPDATE im_msg_biz_user SET user_unread_num = + (select count(*) from im_msg_biz_user_history where im_msg_biz_user_id = #{imMsgBizUserId} and user_unread = #{userUnread} and who_send = #{whoSend}) + WHERE id = #{imMsgBizUserId} + + + + UPDATE im_msg_biz_user SET user_unread_num = + (SELECT COUNT(*) FROM im_msg_biz_user_history WHERE im_msg_biz_user_id = #{id} and employee_unread = #{unread} and who_send = #{whoSend}) + WHERE id = #{id} + + diff --git a/tmerclub-marketing/Dockerfile b/tmerclub-marketing/Dockerfile new file mode 100644 index 0000000..0b93728 --- /dev/null +++ b/tmerclub-marketing/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms512m", "-Xmx512m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/MarketingApplication.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/MarketingApplication.java new file mode 100644 index 0000000..6fc9fbb --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/MarketingApplication.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud; + +import com.tmerclub.cloud.live.socket.LiveAnchorWebSocketServer; +import com.tmerclub.cloud.live.socket.LiveUserWebSocketServer; +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.security.servlet.UserDetailsServiceAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.ConfigurableApplicationContext; + +/** + * @author FrozenWatermelon + * @date 2020/11/19 + */ +@SpringBootApplication(scanBasePackages = "com.moyuer.cloud", exclude = UserDetailsServiceAutoConfiguration.class) +@EnableDubbo(scanBasePackages = "com.moyuer.cloud.**.feign") +public class MarketingApplication extends SpringBootServletInitializer { + + public static void main(String[] args) { + ConfigurableApplicationContext applicationContext = SpringApplication.run(MarketingApplication.class, args); + LiveAnchorWebSocketServer.setApplicationContext(applicationContext); + LiveUserWebSocketServer.setApplicationContext(applicationContext); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(MarketingApplication.class); + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/bo/ComboSpuCountChangeNotifyBO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/bo/ComboSpuCountChangeNotifyBO.java new file mode 100644 index 0000000..e9c4fc2 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/bo/ComboSpuCountChangeNotifyBO.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author xxw + * @date 2022/11/30 17:27 + */ +public class ComboSpuCountChangeNotifyBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 套餐id + */ + private Long comboId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 套餐商品起搭数 + */ + private Integer count; + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "ComboSpuCountChangeNotifyBO{" + + "comboId=" + comboId + + ", spuId=" + spuId + + ", count=" + count + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/constant/ComboStatus.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/constant/ComboStatus.java new file mode 100644 index 0000000..825dd42 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/constant/ComboStatus.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.constant; + +/** + * 套餐状态 + * + * @author xxw + * @date 2022/9/29 11:17 + */ +public enum ComboStatus { + /** + * 删除 + */ + DELETE(-1), + + /** + * 关闭/失效 + */ + CLOSE(0), + + /** + * 进行中 + */ + NORMAL(1), + + /** + * 未开始 + */ + NOT_STARTED(2); + + private final Integer value; + + public Integer value() { + return this.value; + } + + ComboStatus(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/feign/ComboFeignController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/feign/ComboFeignController.java new file mode 100644 index 0000000..764ce50 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/feign/ComboFeignController.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.feign; + +import com.tmerclub.cloud.api.combo.feign.ComboFeignClient; +import com.tmerclub.cloud.combo.service.ComboService; +import com.tmerclub.cloud.common.product.vo.ComboVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author xxw + * @date 2022/8/16 15:00 + */ +@DubboService +public class ComboFeignController implements ComboFeignClient { + @Autowired + private ComboService comboService; + + @Override + public ServerResponseEntity> listComboInfoBySpuId(Long shopId, Long spuId) { + return ServerResponseEntity.success(comboService.listComboInfoBySpuId(shopId, spuId)); + } + + @Override + public ServerResponseEntity> comboVoListBySpuId(Long spuId) { + return ServerResponseEntity.success(comboService.comboVoListBySpuId(spuId)); + } + + @Override + public void offComboMainSpu(Long spuId) { + comboService.offComboMainSpu(spuId); + } + + @Override + public ServerResponseEntity checkComboSpu(Long spuId, Long shopId) { + return ServerResponseEntity.success(comboService.checkComboSpu(spuId, shopId)); + } + + @Override + public ServerResponseEntity checkComboIsUsable(List comboIdList) { + return ServerResponseEntity.success(comboService.checkComboIsUsable(comboIdList)); + } + + @Override + public void removeComboSpuCache(Long spuId) { + comboService.removeComboSpuCache(spuId); + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/feign/ComboSpuFeignController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/feign/ComboSpuFeignController.java new file mode 100644 index 0000000..2838a8d --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/feign/ComboSpuFeignController.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.feign; + +import com.tmerclub.cloud.api.combo.feign.ComboSpuFeignClient; +import com.tmerclub.cloud.combo.service.ComboSpuService; +import com.tmerclub.cloud.common.product.vo.ComboSpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author xxw + * @date 2022/9/28 9:49 + */ +@DubboService +public class ComboSpuFeignController implements ComboSpuFeignClient { + @Autowired + private ComboSpuService comboSpuService; + + @Override + public ServerResponseEntity> comboSpuByComboId(Long comboId) { + List matchSpuByComboId = comboSpuService.comboSpuByComboId(comboId); + return ServerResponseEntity.success(matchSpuByComboId); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboListener.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboListener.java new file mode 100644 index 0000000..92c2f22 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboListener.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.listener; + +import com.tmerclub.cloud.api.product.feign.ShopCartFeignClient; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 套餐 + * @author xxw + * @date 2022/9/8 15:48 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.COMBO_DELETE_OR_DISABLED, consumerGroup = RocketMqConstant.COMBO_DELETE_OR_DISABLED) +public class ComboListener implements RocketMQListener> { + + @DubboReference + private ShopCartFeignClient shopCartFeignClient; + + /** + * 失效或者删除套餐时移除购物车商品 + * @param comboIdList + */ + @Override + public void onMessage(List comboIdList) { + if (comboIdList.size() != 0) { + shopCartFeignClient.deleteCartByComboUpdate(comboIdList, -1L, -1L); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboOrderPaySucceedListener.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboOrderPaySucceedListener.java new file mode 100644 index 0000000..b8043cc --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboOrderPaySucceedListener.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.listener; + +import com.tmerclub.cloud.combo.service.ComboOrderService; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 订单支付成功,套餐订单状态变为已支付、套餐销量增加 + * @author xxw + * @date 2022/9/20 15:02 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.COMBO_ORDER_TOPIC, consumerGroup = RocketMqConstant.COMBO_ORDER_TOPIC) +public class ComboOrderPaySucceedListener implements RocketMQListener> { + @Autowired + private ComboOrderService comboOrderService; + + @Override + public void onMessage(List orderIdS) { + comboOrderService.comboOrderPaySucceed(orderIdS); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboSpuSkuListener.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboSpuSkuListener.java new file mode 100644 index 0000000..94c0ccc --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboSpuSkuListener.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.listener; + +import com.tmerclub.cloud.api.product.feign.ShopCartFeignClient; +import com.tmerclub.cloud.combo.bo.ComboSkuStatusChangeNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author xxw + * @date 2022/8/30 13:36 + * 套餐商品sku项状态变为删除或者失效时移除用户购物车商品 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.COMBO_SKU_STATUS_TOPIC, consumerGroup = RocketMqConstant.COMBO_SKU_STATUS_TOPIC) +public class ComboSpuSkuListener implements RocketMQListener { + @DubboReference + private ShopCartFeignClient shopCartFeignClient; + + @Override + public void onMessage(ComboSkuStatusChangeNotifyBO comboSkuStatusChangeNotifyBO) { + Long comboId = comboSkuStatusChangeNotifyBO.getComboId(); + List skuList = comboSkuStatusChangeNotifyBO.getSkuList(); + if (skuList.size() != 0) { + shopCartFeignClient.deleteCartByComboIdAndSkuIdS(comboId, skuList); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/mapper/ComboMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/mapper/ComboMapper.java new file mode 100644 index 0000000..c329f12 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/mapper/ComboMapper.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.mapper; + +import com.tmerclub.cloud.combo.model.Combo; +import com.tmerclub.cloud.common.product.dto.ComboDTO; +import com.tmerclub.cloud.common.product.vo.ComboVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 套餐 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public interface ComboMapper { + + /** + * 获取套餐列表 + * + * @param comboDTO + * @return 套餐列表 + */ + List list(@Param("comboDTO") ComboDTO comboDTO); + + /** + * 根据套餐id获取套餐 + * + * @param comboId 套餐id + * @return 套餐 + */ + ComboVO getByComboId(@Param("comboId") Long comboId); + + /** + * 保存套餐 + * + * @param combo 套餐 + */ + void save(@Param("combo") Combo combo); + + /** + * 更新套餐 + * + * @param combo 套餐 + */ + void update(@Param("combo") Combo combo); + + /** + * 修改商品套餐状态 + * + * @param comboId + * @param status + */ + void updateComboStatus(@Param("comboId") Long comboId, @Param("status") Integer status); + + /** + * 批量修改套餐状态 + * + * @param comboIdList + * @param status + */ + void batchUpdateComboStatus(@Param("comboIdList") List comboIdList, @Param("status") Integer status); + + /** + * 根据spuId获取相关的套餐信息 + * + * @param spuId + * @param shopId + * @return + */ + List listComboInfoBySpuId(@Param("shopId") Long shopId, @Param("spuId") Long spuId); + + /** + * 根据商品id获取套餐信息 + * + * @param spuId + * @return + */ + List comboVoListBySpuId(@Param("spuId") Long spuId); + + /** + * 获取应该结束但是没有结束的套餐列表 + * + * @return 应该结束但是没有结束的秒杀列表 + */ + List listUnEndButNeedEndActivity(); + + /** + * 批量 套餐销量增加 + * + * @param comboList + */ + void comboSoldNumAdd(@Param("comboList") List comboList); + + /** + * 根据主商品id获取指定状态的套餐 + * + * @param spuId + * @param status + * @return + */ + List comboIdByMainSpuId(@Param("spuId") Long spuId, @Param("status") Integer status); + + /** + * 查看商品是否参与了正在进行的套餐 + * + * @param spuId 商品id + * @param shopId 店铺id + * @return + */ + Integer checkComboSpu(@Param("spuId") Long spuId, @Param("shopId") Long shopId); + + /** + * 获取本该开始的而未开始的套餐id + * + * @return + */ + List notStartComboIdButStart(); + + + /** + * 根据套餐id集合检查套餐是否全部可用 + * + * @param comboIdList + * @return 返回不可用套餐数量 0代表全部可用,其它数据代表有不可用的套餐 + */ + Integer checkComboIsUsable(@Param("comboIdList") List comboIdList); + + /** + * 根据搭配商品id获取主商品id + * @param spuId + * @return + */ + List getComboMainSpuIdBySpuId(@Param("spuId") Long spuId); + + /** + * 根据套餐id集合获取套餐信息 + * @param comboIdList + * @return + */ + List getComboByComboIdList(@Param("comboIdList") List comboIdList); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/ComboOrder.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/ComboOrder.java new file mode 100644 index 0000000..8326c2b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/ComboOrder.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 套餐订单表 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboOrder extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 套餐订单id + */ + private Long comboOrderId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 套餐id + */ + private Long comboId; + + /** + * user_id + */ + private String userId; + + /** + * 套餐数量 + */ + private Integer comboNum; + + /** + * 支付金额 + */ + private Double payPrice; + + /** + * 订单编号 + */ + private String orderNumber; + + /** + * 状态(0:待支付、1:支付成功) + */ + private Integer status; + + public Long getComboOrderId() { + return comboOrderId; + } + + public void setComboOrderId(Long comboOrderId) { + this.comboOrderId = comboOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Integer getComboNum() { + return comboNum; + } + + public void setComboNum(Integer comboNum) { + this.comboNum = comboNum; + } + + public Double getPayPrice() { + return payPrice; + } + + public void setPayPrice(Double payPrice) { + this.payPrice = payPrice; + } + + public String getOrderNumber() { + return orderNumber; + } + + public void setOrderNumber(String orderNumber) { + this.orderNumber = orderNumber; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "ComboOrder{" + + "comboOrderId=" + comboOrderId + + ",shopId=" + shopId + + ",comboId=" + comboId + + ",userId=" + userId + + ",comboNum=" + comboNum + + ",payPrice=" + payPrice + + ",orderNumber=" + orderNumber + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/ComboSpu.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/ComboSpu.java new file mode 100644 index 0000000..a65e236 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/ComboSpu.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import com.tmerclub.cloud.common.product.vo.ComboSpuSkuVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 套装商品项 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboSpu extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 套餐商品项id + */ + private Long comboSpuId; + + /** + * 套餐id + */ + private Long comboId; + + /** + * 套餐价格 + */ + private Long comboPrice; + + /** + * 商品价格 + */ + private Long price; + + /** + * 类型:1:主商品 2:搭配商品 + */ + private Integer type; + + /** + * 是否必选:1:是 0:否 + */ + private Integer required; + + /** + * 起搭数量 + */ + private Integer leastNum; + + /** + * 状态, -1:已删除 1:正常 + */ + private Integer status; + + /** + * sku项列表 + */ + private List skuList; + + /** + * 商品id + */ + private Long spuId; + + public Long getComboSpuId() { + return comboSpuId; + } + + public void setComboSpuId(Long comboSpuId) { + this.comboSpuId = comboSpuId; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Long getComboPrice() { + return comboPrice; + } + + public void setComboPrice(Long comboPrice) { + this.comboPrice = comboPrice; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getRequired() { + return required; + } + + public void setRequired(Integer required) { + this.required = required; + } + + public Integer getLeastNum() { + return leastNum; + } + + public void setLeastNum(Integer leastNum) { + this.leastNum = leastNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public List getSkuList() { + return skuList; + } + + public void setSkuList(List skuList) { + this.skuList = skuList; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + @Override + public String toString() { + return "ComboSpu{" + + "comboSpuId=" + comboSpuId + + ", comboId=" + comboId + + ", comboPrice=" + comboPrice + + ", price=" + price + + ", type=" + type + + ", required=" + required + + ", leastNum=" + leastNum + + ", status=" + status + + ", skuList=" + skuList + + ", spuId=" + spuId + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/ComboSpuSku.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/ComboSpuSku.java new file mode 100644 index 0000000..a2ecdc2 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/ComboSpuSku.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 套餐商品sku项 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboSpuSku extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 套餐商品项id + */ + private Long comboSpuId; + + /** + * skuId + */ + private Long skuId; + + /** + * 搭配价格 + */ + private Long matchingPrice; + + public Long getComboSpuId() { + return comboSpuId; + } + + public void setComboSpuId(Long comboSpuId) { + this.comboSpuId = comboSpuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getMatchingPrice() { + return matchingPrice; + } + + public void setMatchingPrice(Long matchingPrice) { + this.matchingPrice = matchingPrice; + } + + @Override + public String toString() { + return "ComboSpuSku{" + + "comboSpuId=" + comboSpuId + + ",skuId=" + skuId + + ",matchingPrice=" + matchingPrice + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/ComboSpuSkuService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/ComboSpuSkuService.java new file mode 100644 index 0000000..3227d9a --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/ComboSpuSkuService.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.service; + +import com.tmerclub.cloud.api.combo.vo.ComboSkuVo; +import com.tmerclub.cloud.combo.dto.ComboSpuSkuDTO; +import com.tmerclub.cloud.combo.model.ComboSpuSku; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.ComboSpuSkuVO; + +import java.util.List; +import java.util.Set; + +/** + * 套装商品sku项 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public interface ComboSpuSkuService { + + /** + * 分页获取套装商品sku项列表 + * @param pageDTO 分页参数 + * @return 套装商品sku项列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 保存套装商品sku项 + * @param comboSpuSkuList 套装商品sku项 + * @param comboSpuId + */ + void save(List comboSpuSkuList, Long comboSpuId); + + /** + * 更新套装商品sku项 + * @param comboSpuSku 套装商品sku项 + */ + void update(ComboSpuSku comboSpuSku); + + /** + * 根据套装商品sku项id删除套装商品sku项 + * @param comboSpuId 套装商品sku项id + */ + void deleteById(Long comboSpuId); + + /** + * 保存商品sku项 + * @param skuList + * @param comboSpuId + */ + void insertBatch(List skuList, Long comboSpuId); + + /** + * 批量更新 + * @param comboSpuSkuList + */ + void batchUpdate(List comboSpuSkuList); + + /** + * 根据套餐id列表和sku列表获取套餐信息Sku信息 + * @param comboIdList + * @param skuIdList + * @return + */ + List comboVoListComboAndSkuList(Set comboIdList, List skuIdList); + + /** + * 根据套餐商品表id获取套餐商品sku信息 + * @param comboSpuId + * @return + */ + List comboVoListByComboSpuId(Long comboSpuId); + + /** + * 根据套餐商品sku项id列表批量删除套餐商品sku项 + * @param comboSpuIdList + */ + void deleteBatch(List comboSpuIdList); + + /** + * 根据套餐商品项id获取套餐商品sku项 + * + * @param comboSpuId 套餐商品项id + * @return 套餐商品sku项 + */ + List getByComboSpuId(Long comboSpuId); + + /** + * 根据套餐商品表id集合获取套餐商品sku信息 + * @param comboSpuIdList + * @return + */ + List comboSpuSkuList(List comboSpuIdList); + + /** + * 根据套餐id和商品id获取套餐商品sku信息 + * @param comboSpuSkuDTO + * @return + */ + List comboSpuSkuListByComboIdAndSpuId(ComboSpuSkuDTO comboSpuSkuDTO); + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboOrderServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboOrderServiceImpl.java new file mode 100644 index 0000000..6fcfe9a --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboOrderServiceImpl.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.combo.service.ComboOrderService; +import com.tmerclub.cloud.combo.service.ComboService; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.vo.OrderActivityVO; +import com.tmerclub.cloud.common.product.dto.ComboDTO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 套餐订单表 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +@Service +public class ComboOrderServiceImpl implements ComboOrderService { + + @Autowired + private ComboService comboService; + @DubboReference + private OrderFeignClient orderFeignClient; + + @Override + @Transactional(rollbackFor = Exception.class) + public void comboOrderPaySucceed(List orderIds) { + if (CollUtil.isEmpty(orderIds)) { + throw new LuckException("订单id不能为空"); + } + //套餐订单变为已支付 + List orderActivityVOList = orderFeignClient.getActivitySalesQuantity(orderIds, OrderActivityType.COMBO.value()); + if (CollUtil.isEmpty(orderActivityVOList)) { + return; + } + //套餐销量增加 + Map map = new HashMap<>(Constant.INITIAL_CAPACITY); + for (OrderActivityVO orderActivityVO : orderActivityVOList) { + ComboDTO combo = new ComboDTO(); + combo.setComboId(orderActivityVO.getActivityId()); + combo.setSoldNum(orderActivityVO.getCount()); + map.put(orderActivityVO.getActivityId(), combo); + } + + if (MapUtil.isNotEmpty(map)) { + comboService.comboSoldNumAdd(new ArrayList<>(map.values())); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboServiceImpl.java new file mode 100644 index 0000000..424c44f --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboServiceImpl.java @@ -0,0 +1,903 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.product.bo.SpuSimpleBO; +import com.tmerclub.cloud.api.product.feign.ShopCartFeignClient; +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.combo.bo.ComboSkuStatusChangeNotifyBO; +import com.tmerclub.cloud.combo.bo.ComboSpuCountChangeNotifyBO; +import com.tmerclub.cloud.combo.constant.ComboStatus; +import com.tmerclub.cloud.combo.mapper.ComboMapper; +import com.tmerclub.cloud.combo.mapper.ComboSpuMapper; +import com.tmerclub.cloud.combo.mapper.ComboSpuSkuMapper; +import com.tmerclub.cloud.combo.model.Combo; +import com.tmerclub.cloud.combo.model.ComboSpu; +import com.tmerclub.cloud.combo.service.ComboService; +import com.tmerclub.cloud.combo.service.ComboSpuService; +import com.tmerclub.cloud.combo.service.ComboSpuSkuService; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.product.dto.ComboDTO; +import com.tmerclub.cloud.common.product.vo.ComboSpuSkuVO; +import com.tmerclub.cloud.common.product.vo.ComboSpuVO; +import com.tmerclub.cloud.common.product.vo.ComboVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.app.SkuAppVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 套装 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +@Service +public class ComboServiceImpl implements ComboService { + + @Autowired + private ComboMapper comboMapper; + @Autowired + private ComboSpuService comboSpuService; + @Autowired + private ComboSpuSkuService comboSpuSkuService; + @Autowired + private ComboSpuMapper comboSpuMapper; + @DubboReference + private SpuFeignClient spuFeignClient; + @Autowired + private ComboSpuSkuMapper comboSpuSkuMapper; + @DubboReference + private SkuFeignClient skuFeignClient; + @DubboReference + private ShopCartFeignClient shopCartFeignClient; + @Autowired + private RocketMQTemplate comboSkuStatusTemplate; + @Autowired + private RocketMQTemplate comboDeleteOrDisabledTemplate; + @Autowired + private RocketMQTemplate comboSpuCountChangeTemplate; + + @Override + public PageVO page(PageDTO pageDTO, ComboDTO comboDTO) { + comboDTO.setShopId(AuthUserContext.get().getTenantId()); + if (Objects.nonNull(comboDTO.getMainSpuName()) && !Objects.equals(comboDTO.getMainSpuName(), "")) { + //根据主商品查找商品id + Set mainSpuIdList = getSpuIdByName(comboDTO.getMainSpuName()); + if (mainSpuIdList.size() == 0) { + mainSpuIdList.add(-1L); + } + comboDTO.setMainSpuIdList(mainSpuIdList); + } + if (Objects.nonNull(comboDTO.getMatchSpuName()) && !Objects.equals(comboDTO.getMatchSpuName(), "")) { + //根据搭配商品名称查找商品id + Set matchSpuIdList = getSpuIdByName(comboDTO.getMatchSpuName()); + if (matchSpuIdList.size() == 0) { + matchSpuIdList.add(-1L); + } + comboDTO.setMatchSpuIdList(matchSpuIdList); + } + PageVO page = PageUtil.doPage(pageDTO, () -> comboMapper.list(comboDTO)); + Set mainSpuIdSet = page.getList().stream().map(ComboVO::getMainSpuId).collect(Collectors.toSet()); + ServerResponseEntity> mainSpuResponseEntity = spuFeignClient.listSpuBySpuIds(new ArrayList<>(mainSpuIdSet)); + if (CollUtil.isEmpty(mainSpuResponseEntity.getData())) { + return page; + } + Map spuNameMap = mainSpuResponseEntity.getData().stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getName)); + Map imgUrlMap = mainSpuResponseEntity.getData().stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getMainImgUrl)); + for (ComboVO comboVo : page.getList()) { + comboVo.setMainSpuName(spuNameMap.get(comboVo.getMainSpuId())); + comboVo.setMainSpuImgUrl(imgUrlMap.get(comboVo.getMainSpuId())); + } + return page; + } + + /** + * 根据商品名称模糊查找获取商品id列表 + * + * @param name + * @return + */ + private Set getSpuIdByName(String name) { + SpuSimpleBO spuSimpleBO = new SpuSimpleBO(); + spuSimpleBO.setSpuName(name); + spuSimpleBO.setSeq(1); + spuSimpleBO.setLang(I18nMessage.getLang()); + ServerResponseEntity> spuRes = spuFeignClient.listSimple(spuSimpleBO); + if (!spuRes.isSuccess()) { + throw new LuckException(spuRes.getMsg()); + } + Set spuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isNotEmpty(spuRes.getData())) { + spuIds = spuRes.getData().stream().map(SpuSimpleBO::getSpuId).collect(Collectors.toSet()); + } + return spuIds; + } + + @Override + public ComboVO getByComboId(Long comboId, Integer sysType) { + //获取套餐信息 + ComboVO comboVO = comboMapper.getByComboId(comboId); + if (Objects.isNull(comboVO) || Objects.equals(comboVO.getStatus(), -1)) { + throw new LuckException("套餐信息已不存在"); + } + //获取主套餐商品信息 + mainSpuMsg(comboVO); + //获取搭配套餐商品信息 + matchSpuMsg(comboVO, sysType); + return comboVO; + } + + @Override + @Cacheable(cacheNames = CacheNames.SINGLE_COMBO_INFO, key = "#comboId") + public ComboVO getComboInfoByComboId(Long comboId) { + //获取套餐信息 + ComboVO comboVO = comboMapper.getByComboId(comboId); + // 活动必须是上架状态 + if (Objects.isNull(comboVO) || !Objects.equals(comboVO.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException("套餐信息已不存在"); + } + List comboSpuList = comboSpuMapper.getComboSpuByComboId(comboId); + comboSpuList.removeIf(comboSpuVO -> { + if (!Objects.equals(comboSpuVO.getStatus(), 1)) { + return true; + } + if (Objects.equals(comboSpuVO.getSpuId(), comboVO.getMainSpuId())) { + comboVO.setMainSpu(comboSpuVO); + return true; + } + return false; + }); + comboVO.setMatchingSpus(comboSpuList); + return comboVO; + } + + @Override + public ComboVO pcGetCombo(ComboDTO comboDTO, Integer sysType) { + //获取套餐信息 + ComboVO comboVO = comboMapper.getByComboId(comboDTO.getComboId()); + if (Objects.isNull(comboVO)) { + throw new LuckException("套餐信息已不存在"); + } + //获取主套餐商品信息 + mainSpuMsg(comboVO); + //获取搭配套餐商品信息 + matchSpuMsg(comboVO, sysType); + //过滤搭配商品 + Set matchSpuIdList = comboDTO.getMatchSpuIdList(); + List matchingSpus = comboVO.getMatchingSpus(); + Iterator iterator = matchingSpus.iterator(); + while (iterator.hasNext()) { + ComboSpuVO next = iterator.next(); + boolean contains = matchSpuIdList.contains(next.getSpuId()); + if (!contains) { + iterator.remove(); + } + } + return comboVO; + } + + /** + * 主商品信息 + * @param comboVO + */ + private void mainSpuMsg(ComboVO comboVO) { + //获取主套餐商品信息 + SpuVO mainSpuVo = spuFeignClient.getDetailById(comboVO.getMainSpuId()).getData(); + ComboSpuVO mainComboSpu = comboSpuMapper.getBySpuId(comboVO.getMainSpuId(), comboVO.getComboId()); + mainComboSpu.setPic(mainSpuVo.getMainImgUrl()); + mainComboSpu.setSpuName(mainSpuVo.getName()); + List comboSpuSkuList = comboSpuSkuMapper.getByComboSpuIdS(mainComboSpu.getComboSpuId()); + //sku套餐最低价 + long minPrice = comboSpuSkuList.stream().mapToLong(ComboSpuSkuVO::getMatchingPrice).min().getAsLong(); + mainComboSpu.setComboPrice(minPrice); + List skuList = skuFeignClient.listBySpuId(mainSpuVo.getSpuId()).getData(); + //供应商发货 + List supplierSkus = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.nonNull(mainSpuVo.getSupplierSpuType()) && Objects.equals(mainSpuVo.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + ServerResponseEntity> supplierSkuResponse = skuFeignClient.listBySpuId(mainSpuVo.getSupplierSpuId()); + supplierSkus = supplierSkuResponse.getData(); + + } + for (SkuAppVO skuAppVO : skuList) { + if (Objects.isNull(skuAppVO.getSkuName())) { + skuAppVO.setSkuName(""); + } + if (Objects.isNull(skuAppVO.getImgUrl())) { + skuAppVO.setMainImgUrl(""); + } + } + Map skuAppMap = skuList.stream().collect(Collectors.toMap(SkuAppVO::getSkuId, e -> e)); + Map supplierSkuMap = supplierSkus.stream().collect(Collectors.toMap(SkuAppVO::getSkuId, e -> e)); + for (ComboSpuSkuVO comboSpuSkuVO : comboSpuSkuList) { + SkuAppVO skuAppVO = skuAppMap.get(comboSpuSkuVO.getSkuId()); + if (Objects.isNull(skuAppVO)) { + continue; + } + comboSpuSkuVO.setSkuName(skuAppVO.getSkuName()); + comboSpuSkuVO.setPriceFee(skuAppVO.getPriceFee()); + comboSpuSkuVO.setProperties(skuAppVO.getProperties()); + //供应商发货的代销商品显示供应商的库存 + comboSpuSkuVO.setStocks(Objects.equals(mainSpuVo.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()) ? supplierSkuMap.get(skuAppVO.getSupplierSkuId()).getStock() : skuAppVO.getStock()); + comboSpuSkuVO.setPic(skuAppVO.getImgUrl()); + } + mainComboSpu.setSkuList(comboSpuSkuList); + comboVO.setMainSpu(mainComboSpu); + } + + /** + * 搭配商品信息 + * @param comboVO + */ + private void matchSpuMsg(ComboVO comboVO, Integer sysType) { + //获取搭配套餐商品信息 + List matchingSpuList; + //获取搭配套餐商品信息 + if (Objects.equals(sysType, SysTypeEnum.MULTISHOP.value())) { + matchingSpuList = comboSpuMapper.matchingSpuByComboId(comboVO.getComboId(), StatusEnum.DELETE.value()); + } else { + matchingSpuList = comboSpuMapper.matchingSpuByComboId(comboVO.getComboId(), StatusEnum.DISABLE.value()); + } + List matchingSpuIds = matchingSpuList.stream().map(ComboSpuVO::getSpuId).collect(Collectors.toList()); + //搭配套餐商品基本信息 + List spuList = spuFeignClient.listSpuBySpuIds(matchingSpuIds).getData(); + + if (Objects.isNull(spuList) || spuList.size() == 0) { + return; + } + // 用户端商品是下架状态不显示 + if (Objects.equals(sysType, SysTypeEnum.ORDINARY.value())) { + Map spuStatusMap = spuList.stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getStatus)); + matchingSpuList.removeIf(comboSpuVO -> spuStatusMap.get(comboSpuVO.getSpuId()) != 1); + } + List matchingComboSpuIds = matchingSpuList.stream().map(ComboSpuVO::getComboSpuId).collect(Collectors.toList()); + if (matchingComboSpuIds.size() == 0) { + return; + } + //商品名字 + Map spuName = spuList.stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getName)); + //商品图片 + Map spuImage = spuList.stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getMainImgUrl)); + List matchingComboSpuSkuVos = comboSpuSkuMapper.batchByComboSpuId(matchingComboSpuIds); + Map> matchingComboSpuSkuVoGroup = matchingComboSpuSkuVos.stream().collect(Collectors.groupingBy(ComboSpuSkuVO::getComboSpuId)); + for (ComboSpuVO comboSpuVO : matchingSpuList) { + comboSpuVO.setSpuName(spuName.get(comboSpuVO.getSpuId())); + comboSpuVO.setPic(spuImage.get(comboSpuVO.getSpuId())); + List comboSpuSkuVO = matchingComboSpuSkuVoGroup.get(comboSpuVO.getComboSpuId()); + long minPrice = comboSpuSkuVO.stream().mapToLong(ComboSpuSkuVO::getMatchingPrice).min().getAsLong(); + comboSpuVO.setComboPrice(minPrice); + List matchingSkuList = skuFeignClient.listBySpuId(comboSpuVO.getSpuId()).getData(); + for (SkuAppVO matchingSkuVO : matchingSkuList) { + if (Objects.isNull(matchingSkuVO.getSkuName())) { + matchingSkuVO.setSkuName(""); + } + if (Objects.isNull(matchingSkuVO.getMainImgUrl())) { + matchingSkuVO.setMainImgUrl(""); + } + } + Map skuAppMap = matchingSkuList.stream().collect(Collectors.toMap(SkuAppVO::getSkuId, e -> e)); + List comboSkus = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ComboSpuSkuVO spuSkuVO : comboSpuSkuVO) { + SkuAppVO skuAppVO = skuAppMap.get(spuSkuVO.getSkuId()); + if (Objects.isNull(skuAppVO)) { + continue; + } + spuSkuVO.setSkuName(skuAppVO.getSkuName()); + spuSkuVO.setPriceFee(skuAppVO.getPriceFee()); + spuSkuVO.setProperties(skuAppVO.getProperties()); + spuSkuVO.setStocks(skuAppVO.getStock()); + spuSkuVO.setPic(skuAppVO.getMainImgUrl()); + comboSkus.add(spuSkuVO); + } + comboSpuVO.setSkuList(comboSkus); + + } + comboVO.setMatchingSpus(matchingSpuList); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @Caching(evict = { + @CacheEvict(value = CacheNames.SPU_COMBO, key = "#comboDTO.getMainSpu().spuId"), + @CacheEvict(value = CacheNames.SINGLE_COMBO_INFO, key = "#comboDTO.getMainSpu().spuId") + }) + public void save(ComboDTO comboDTO) { + //保存套餐信息 + Combo combo = new Combo(); + combo.setStartTime(comboDTO.getStartTime()); + combo.setEndTime(comboDTO.getEndTime()); + combo.setName(comboDTO.getName()); + combo.setMainSpuId(comboDTO.getMainSpu().getSpuId()); + Long price = loadComboPrice(comboDTO); + combo.setPrice(price); + combo.setSoldNum(0); + combo.setShopId(comboDTO.getShopId()); + Date date = new Date(); + Date startTime = comboDTO.getStartTime(); + if (startTime.compareTo(date) > 0) { + combo.setStatus(ComboStatus.NOT_STARTED.value()); + } else { + combo.setStatus(ComboStatus.NORMAL.value()); + } + comboMapper.save(combo); + //保存套餐商品项信息 + ComboSpuVO mainSpuVo = comboDTO.getMainSpu(); + List skuList = mainSpuVo.getSkuList(); + long mainPrice = 0L; + for (ComboSpuSkuVO comboSpuSkuVO : skuList) { + mainPrice += comboSpuSkuVO.getMatchingPrice() * mainSpuVo.getLeastNum(); + } + mainSpuVo.setComboPrice(mainPrice); + mainSpuVo.setComboId(combo.getComboId()); + mainSpuVo.setType(1); + mainSpuVo.setStatus(combo.getStatus()); + ComboSpu mainSpu = BeanUtil.map(mainSpuVo, ComboSpu.class); + comboSpuService.save(mainSpu); + // 保存主商品关联的规格信息 + comboSpuSkuService.insertBatch(mainSpuVo.getSkuList(), mainSpu.getComboSpuId()); + // 保存搭配商品和搭配商品关联的规格信息 + for (ComboSpuVO matchingSpu : comboDTO.getMatchingSpus()) { + matchingSpu.setComboId(combo.getComboId()); + matchingSpu.setStatus(combo.getStatus()); + } + comboSpuService.insertBatch(comboDTO.getMatchingSpus(), combo.getComboId()); + + + } + + private Long loadComboPrice(ComboDTO comboDTO) { + long price; + ComboSpuVO mainSpu = comboDTO.getMainSpu(); + List skuList = mainSpu.getSkuList(); + //主商品sku最低价 + Long mainPrice = skuList.stream().mapToLong(ComboSpuSkuVO::getMatchingPrice).min().getAsLong(); + + price = mainPrice * mainSpu.getLeastNum(); + List matchingSpus = comboDTO.getMatchingSpus(); + for (ComboSpuVO comboSpuVO : matchingSpus) { + List skuListS = comboSpuVO.getSkuList(); + Long matchPrice = skuListS.stream().mapToLong(ComboSpuSkuVO::getMatchingPrice).min().getAsLong(); + price = price + (matchPrice * comboSpuVO.getLeastNum()); + } + return price; + + } + + private void loadMatchingPrice(ComboSpuVO comboSpuVO) { + comboSpuVO.setComboPrice(comboSpuVO.getSkuList().get(0).getMatchingPrice()); + for (ComboSpuSkuVO comboSpuSkuVO : comboSpuVO.getSkuList()) { + if (comboSpuSkuVO.getMatchingPrice() < comboSpuVO.getComboPrice()) { + comboSpuVO.setComboPrice(comboSpuSkuVO.getMatchingPrice()); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void update(ComboDTO comboDTO) { + comboDTO.setMainSpuId(comboDTO.getMainSpu().getSpuId()); + //重新计算套餐价格 + comboDTO.setPrice(loadComboPrice(comboDTO)); + //更新套餐表数据 + Combo combo = BeanUtil.map(comboDTO, Combo.class); + comboStatus(combo); + comboMapper.update(combo); + comboDTO.setStatus(combo.getStatus()); + //=========== 更新主商品信息 ============== + updateMainSpu(comboDTO); + + //=========== 更新搭配商品信息 ============ + updateMatchSpu(comboDTO); + // 更新redis中套餐的过期时间 + RedisUtil.set(CacheNames.ORDER_COMBO_EXPIRATION_TIME + comboDTO.getComboId(), comboDTO.getEndTime().getTime(), 3600); + } + + + private void comboStatus(Combo combo) { + Date now = new Date(); + Date startTime = combo.getStartTime(); + if (startTime.compareTo(now) > 0) { + //活动开始时间在当前时间后面 + combo.setStatus(ComboStatus.NOT_STARTED.value()); + } else { + combo.setStatus(ComboStatus.NORMAL.value()); + } + //如果套餐状态变为未开始状态则需要移除用户购物车 + if (Objects.equals(combo.getStatus(), ComboStatus.NOT_STARTED.value())) { + List comboIdList = Collections.singletonList(combo.getComboId()); + comboDeleteOrDisabledTemplate.syncSend(RocketMqConstant.COMBO_DELETE_OR_DISABLED, new GenericMessage<>(comboIdList)); + } + } + + + /** + * 主商品更新 + * + * @param comboDTO + */ + private void updateMainSpu(ComboDTO comboDTO) { + // 套餐主商品spuId集合 + List spuIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 把原有的主商品状态改为删除 + ComboSpuVO beforeComboSpuVo = comboSpuMapper.getMainSpuByComboId(comboDTO.getComboId()); + spuIdList.add(beforeComboSpuVo.getSpuId()); + // 获取删除前的主商品sku信息 + List beforeSpuSkuList = comboSpuSkuService.comboVoListByComboSpuId(beforeComboSpuVo.getComboSpuId()); + ComboSpu comboSpu = new ComboSpu(); + comboSpu.setSpuId(beforeComboSpuVo.getSpuId()); + comboSpu.setStatus(ComboStatus.DELETE.value()); + comboSpu.setComboId(comboDTO.getComboId()); + comboSpuMapper.updateStatus(comboSpu); + // 插入新的spu信息 + ComboSpuVO mainSpuVo = comboDTO.getMainSpu(); + spuIdList.add(mainSpuVo.getSpuId()); + List skuList = mainSpuVo.getSkuList(); + long mainPrice = 0L; + for (ComboSpuSkuVO comboSpuSkuVO : skuList) { + mainPrice += comboSpuSkuVO.getMatchingPrice() * mainSpuVo.getLeastNum(); + } + mainSpuVo.setComboId(comboDTO.getComboId()); + mainSpuVo.setComboPrice(mainPrice); + mainSpuVo.setType(1); + mainSpuVo.setStatus(StatusEnum.ENABLE.value()); + ComboSpu mainSpu = BeanUtil.map(mainSpuVo, ComboSpu.class); + mainSpu.setStatus(comboDTO.getStatus()); + comboSpuService.save(mainSpu); + + // 删除旧的sku信息 + ComboSpuVO nowComboSpuVo = comboSpuMapper.getMainSpuByComboId(comboDTO.getComboId()); + comboSpuSkuService.deleteById(beforeComboSpuVo.getComboSpuId()); + // 插入新的sku信息 + List spuSkuList = comboDTO.getMainSpu().getSkuList(); + // 同步状态 + for (ComboSpuSkuVO comboSpuSkuVO : spuSkuList) { + comboSpuSkuVO.setSkuStatus(comboDTO.getStatus()); + } + comboSpuSkuService.save(spuSkuList, nowComboSpuVo.getComboSpuId()); + + // 套餐移除的sku时,同步移除用户购物车中的套餐sku商品 + List beforeSkuIdList = beforeSpuSkuList.stream().map(ComboSpuSkuVO::getSkuId).collect(Collectors.toList()); + List nowSpuSkuList = mainSpuVo.getSkuList(); + List nowSkuIdList = nowSpuSkuList.stream().map(ComboSpuSkuVO::getSkuId).collect(Collectors.toList()); + // 移除的sku集合 + removeShopCartComboSpuSku(beforeSkuIdList, nowSkuIdList, comboDTO, true); + + // 更新用户购物车套餐商品数量 + ComboSpuCountChangeNotifyBO changeNotifyBO = new ComboSpuCountChangeNotifyBO(); + changeNotifyBO.setComboId(comboDTO.getComboId()); + changeNotifyBO.setSpuId(mainSpu.getSpuId()); + changeNotifyBO.setCount(mainSpu.getLeastNum()); + SendStatus sendStatus = comboSpuCountChangeTemplate + .syncSend(RocketMqConstant.COMBO_SPU_COUNT_CHANGE, new GenericMessage<>(Collections.singletonList(changeNotifyBO))).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常 + throw new LuckException(ResponseEnum.EXCEPTION); + } + + removeSpuCache(spuIdList); + } + + /** + * 移除商品套餐信息缓存 + * @param spuIdList + */ + private void removeSpuCache(List spuIdList) { + // 移除商品套餐信息缓存 + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long spuId : spuIdList) { + keys.add(CacheNames.SPU_COMBO + CacheNames.UNION + spuId); + keys.add(CacheNames.SINGLE_COMBO_INFO + CacheNames.UNION + spuId); + } + RedisUtil.del(keys); + } + + /** + * 搭配商品更新 + * @param comboDTO + */ + private void updateMatchSpu(ComboDTO comboDTO) { + // 套餐商品id集合 + // 更新前的搭配商品信息 + List beforeMatchSpu = comboSpuMapper.getMatchSpuByComboId(comboDTO.getComboId()); + List spuIdList = beforeMatchSpu.stream().map(ComboSpuVO::getSpuId).collect(Collectors.toList()); + List beforeMatchComboSpuIdS = beforeMatchSpu.stream().map(ComboSpuVO::getComboSpuId).collect(Collectors.toList()); + // 前端传来的更新搭配商品信息 + List nowMatchSpu = comboDTO.getMatchingSpus(); + List nowSpuIdS = nowMatchSpu.stream().map(ComboSpuVO::getSpuId).collect(Collectors.toList()); + spuIdList.addAll(nowSpuIdS); + for (ComboSpuVO comboSpuVO : nowMatchSpu) { + comboSpuVO.setStatus(comboDTO.getStatus()); + } + // comboSpu数据删除旧的,插入新的 + if (beforeMatchComboSpuIdS.size() != 0) { + beforeMatchComboSpuIdS.stream().forEach((comboSpuId) -> comboSpuService.deleteById(comboSpuId)); + } + comboSpuService.insertBatch(nowMatchSpu, comboDTO.getComboId()); + // 获取插入后的数据 + // 移除购物车 + List beforeSkuIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List nowSkuIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ComboSpuVO spuVO : beforeMatchSpu) { + List byComboSpuId = comboSpuSkuMapper.getByComboSpuId(spuVO.getComboSpuId()); + if (byComboSpuId.size() == 0) { + continue; + } + List skuIdList = byComboSpuId.stream().map(ComboSpuSkuVO::getSkuId).collect(Collectors.toList()); + beforeSkuIdList.addAll(skuIdList); + } + for (ComboSpuVO spuVO : nowMatchSpu) { + List skuIdList = spuVO.getSkuList().stream().map(ComboSpuSkuVO::getSkuId).collect(Collectors.toList()); + nowSkuIdList.addAll(skuIdList); + } + //comboSpuSku数据删除旧的,插入新的 + if (beforeMatchComboSpuIdS.size() != 0) { + comboSpuSkuService.deleteBatch(beforeMatchComboSpuIdS); + } + removeShopCartComboSpuSku(beforeSkuIdList, nowSkuIdList, comboDTO, false); + + // 修改套餐商品起搭数时更新用户购物车套餐商品数量 + ComboSpuCountChangeNotifyBO changeNotifyBO; + List comboSpuCountChangeNotifyBOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ComboSpuVO comboSpuVO : nowMatchSpu) { + changeNotifyBO = new ComboSpuCountChangeNotifyBO(); + changeNotifyBO.setComboId(comboDTO.getComboId()); + changeNotifyBO.setSpuId(comboSpuVO.getSpuId()); + changeNotifyBO.setCount(comboSpuVO.getLeastNum()); + comboSpuCountChangeNotifyBOList.add(changeNotifyBO); + } + SendStatus sendStatus = comboSpuCountChangeTemplate + .syncSend(RocketMqConstant.COMBO_SPU_COUNT_CHANGE, new GenericMessage<>(comboSpuCountChangeNotifyBOList)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常 + throw new LuckException(ResponseEnum.EXCEPTION); + } + // 移除商品套餐信息缓存 + removeSpuCache(spuIdList); + } + + + /** + * 计算出移除的skuId,同时移除用户购物车 + * @param beforeSkuIdList + * @param nowSkuIdList + * @param comboDTO + */ + private void removeShopCartComboSpuSku(List beforeSkuIdList, List nowSkuIdList, ComboDTO comboDTO, Boolean isMainSpu) { + //移除的sku集合 + List removeSkuIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long skuId : beforeSkuIdList) { + if (!nowSkuIdList.contains(skuId)) { + removeSkuIdList.add(skuId); + } + } + //主商品sku移除时,对应的搭配商品也要移除 + if (isMainSpu) { + if (removeSkuIdList.size() != 0) { + //需要移除的搭配商品skuId + List matchSkuIdList = shopCartFeignClient.skuIdListByComboMainSkuId(removeSkuIdList).getData(); + removeSkuIdList.addAll(matchSkuIdList); + } + } + ComboSkuStatusChangeNotifyBO changeNotifyBO = new ComboSkuStatusChangeNotifyBO(); + changeNotifyBO.setComboId(comboDTO.getComboId()); + changeNotifyBO.setSkuList(removeSkuIdList); + //发送消息移除用户购物车 + comboSkuStatusTemplate.syncSend(RocketMqConstant.COMBO_SKU_STATUS_TOPIC, new GenericMessage<>(changeNotifyBO)); + } + + /** + * 计算套餐单个商品总价 + * @param comboSpu + * @return + */ + private Long calculatePrice(ComboSpu comboSpu) { + long price = 0L; + List skuList = comboSpu.getSkuList(); + for (ComboSpuSkuVO comboSpuSkuVO : skuList) { + price += price + comboSpuSkuVO.getMatchingPrice() * comboSpu.getLeastNum(); + } + return price; + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void updateComboStatus(Long comboId, Integer status) { + // 主商品 + ComboSpuVO mainSpu = comboSpuMapper.getMainComboSpuId(comboId); + // 修改套餐状态 + comboMapper.updateComboStatus(comboId, status); + // 修改套餐商品项状态 + ComboSpu comboSpu = new ComboSpu(); + comboSpu.setStatus(status); + comboSpu.setComboId(comboId); + comboSpuMapper.updateStatus(comboSpu); + // 套餐商品id集合 + // 搭配商品 + List matchSpuByComboId = comboSpuMapper.getMatchSpuByComboId(comboId); + List spuIdList = matchSpuByComboId.stream().map(ComboSpuVO::getSpuId).collect(Collectors.toList()); + List comboSpuIdList = matchSpuByComboId.stream().map(ComboSpuVO::getComboSpuId).collect(Collectors.toList()); + comboSpuIdList.add(mainSpu.getComboSpuId()); + spuIdList.add(mainSpu.getSpuId()); + comboSpuSkuMapper.batchUpdateByComboSpuIdList(comboSpuIdList, status); + // 失效或者删除套餐时移除购物车商品 + List comboIdList = Collections.singletonList(comboId); + shopCartFeignClient.deleteCartByComboUpdate(comboIdList, -1L, -1L); + + // 移除商品套餐信息缓存 + removeSpuCache(spuIdList); + RedisUtil.set(CacheNames.ORDER_COMBO_STATUS + comboId, status, 3600); + + + } + + @Override + @Cacheable(cacheNames = CacheNames.SPU_COMBO, key = "#spuId") + public List comboVoListBySpuId(Long spuId) { + List comboList = comboMapper.comboVoListBySpuId(spuId); + if (comboList.size() == 0) { + return null; + } + List idList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ComboVO comboVO : comboList) { + List ids = comboVO.getMatchingSpus().stream().map(ComboSpuVO::getSpuId).collect(Collectors.toList()); + idList.addAll(ids); + } + List spuList = spuFeignClient.listSpuBySpuIds(idList).getData(); + Map spuStatusMap = spuList.stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getStatus)); + Iterator iterator = comboList.iterator(); + while (iterator.hasNext()) { + ComboVO comboVO = iterator.next(); + long minPrice = 0L; + Iterator spuIterator = comboVO.getMatchingSpus().iterator(); + while (spuIterator.hasNext()) { + ComboSpuVO comboProdVO = spuIterator.next(); + comboProdVO.setSpuStatus(spuStatusMap.get(comboProdVO.getSpuId())); + if (!Objects.equals(comboProdVO.getSpuStatus(), 1)) { + spuIterator.remove(); + continue; + } + if (comboProdVO.getRequired() == 1 || comboProdVO.getType() == 1) { + minPrice = minPrice + comboProdVO.getComboPrice() * comboProdVO.getLeastNum(); + } + } + comboVO.setMatchingPrice(minPrice); + if (CollUtil.isEmpty(comboVO.getMatchingSpus())) { + iterator.remove(); + } + } + //根据套餐id分组 + Map> comboVoByComboId = comboList.stream().collect(Collectors.groupingBy(ComboVO::getComboId)); + for (List value : comboVoByComboId.values()) { + ComboVO comboVO = value.get(0); + //处理商品信息 + disposeMatchSpu(comboVO); + //套餐价格 + comboPrice(comboVO); + } + return comboList; + } + + /** + * 计算套餐价格 + * @param comboVO + */ + private void comboPrice(ComboVO comboVO) { + //获取主商品最低sku套餐价格 + ComboSpuVO mainSpu = comboVO.getMainSpu(); + List mainSpuSkuList = comboSpuSkuService.getByComboSpuId(mainSpu.getComboSpuId()); + long mainPrice = mainSpuSkuList.stream().mapToLong(ComboSpuSkuVO::getMatchingPrice).min().getAsLong() * mainSpu.getLeastNum(); + mainSpu.setComboPrice(mainPrice); + //获取搭配商品最低sku套餐价格 + List matchingSpus = comboVO.getMatchingSpus(); + if (Objects.nonNull(matchingSpus) && matchingSpus.size() != 0) { + List skuIsList = matchingSpus.stream().map(ComboSpuVO::getComboSpuId).collect(Collectors.toList()); + List comboSpuSkuVOList = comboSpuSkuService.comboSpuSkuList(skuIsList); + Map> longListMap = comboSpuSkuVOList.stream().collect(Collectors.groupingBy(ComboSpuSkuVO::getComboSpuId)); + for (ComboSpuVO comboSpuVO : matchingSpus) { + comboSpuVO.setSkuList(longListMap.get(comboSpuVO.getComboSpuId())); + long price = comboSpuVO.getSkuList().stream().mapToLong(ComboSpuSkuVO::getMatchingPrice).min().getAsLong() * comboSpuVO.getLeastNum(); + comboSpuVO.setComboPrice(price); + if (Objects.equals(comboSpuVO.getRequired(), 1)) { + mainPrice += price; + } + } + } + comboVO.setMatchingPrice(mainPrice); + comboVO.setPrice(mainPrice); + } + + /** + * 处理套餐主商品 + * @param comboVO + */ + private void disposeMainSpu(ComboVO comboVO) { + //套餐主商品 + ComboSpuVO mainSpu = comboVO.getMainSpu(); + SpuVO spuVO = spuFeignClient.getById(mainSpu.getSpuId()).getData(); + mainSpu.setSpuName(spuVO.getName()); + mainSpu.setPic(spuVO.getMainImgUrl()); + mainSpu.setSpuStatus(spuVO.getStatus()); + } + + /** + * 处理套餐搭配商品 + * @param comboVO + */ + private void disposeMatchSpu(ComboVO comboVO) { + List matchingSpuS = comboVO.getMatchingSpus(); + List spuIdList = matchingSpuS.stream().map(ComboSpuVO::getSpuId).collect(Collectors.toList()); + //获取商品基本信息 + List spuVOList = spuFeignClient.listSpuBySpuIdsNo(spuIdList).getData(); + Map spuVoStatusMap = spuVOList.stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getStatus)); + //根据商品id分组 + Map> spuVoBySpuId = spuVOList.stream().collect(Collectors.groupingBy(SpuVO::getSpuId)); + Iterator iterator = matchingSpuS.iterator(); + while (iterator.hasNext()) { + ComboSpuVO comboSpuVO = iterator.next(); + //套餐商品只展示上架状态的 + if (spuVoStatusMap.get(comboSpuVO.getSpuId()) != 1) { + iterator.remove(); + continue; + } + SpuVO vo = spuVoBySpuId.get(comboSpuVO.getSpuId()).get(0); + comboSpuVO.setSpuName(vo.getName()); + comboSpuVO.setPic(vo.getMainImgUrl()); + comboSpuVO.setSpuStatus(vo.getStatus()); + //如果是主商品就移除到主商品集合中 + if (Objects.equals(comboSpuVO.getType(), 1)) { + comboVO.setMainSpu(comboSpuVO); + iterator.remove(); + } + + } + //套餐商品数量 = 搭配商品数量 + 主商品数量(主商品只有一个) + Integer comboSpuCount = comboVO.getMatchingSpus().size() + 1; + comboVO.setSpuCount(comboSpuCount); + } + + @Override + public List listComboInfoBySpuId(Long shopId, Long spuId) { + return comboMapper.listComboInfoBySpuId(shopId, spuId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void comboEndOperation() { + List comboList = comboMapper.listUnEndButNeedEndActivity(); + if (comboList.size() == 0) { + return; + } + //套餐id集合 + List comboIdList = comboList.stream().map(ComboVO::getComboId).collect(Collectors.toList()); + //修改套餐状态 + comboMapper.batchUpdateComboStatus(comboIdList, StatusEnum.DISABLE.value()); + //修改套餐商品sku项状态 + List comboSpuIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ComboVO comboVO : comboList) { + //搭配商品 + List matchSpuByComboId = comboSpuMapper.getMatchSpuByComboId(comboVO.getComboId()); + List matchComboSpuIdList = matchSpuByComboId.stream().map(ComboSpuVO::getComboSpuId).collect(Collectors.toList()); + comboSpuIdList.addAll(matchComboSpuIdList); + //主商品 + ComboSpuVO mainSpuByComboId = comboSpuMapper.getMainSpuByComboId(comboVO.getComboId()); + comboSpuIdList.add(mainSpuByComboId.getComboSpuId()); + } + comboSpuSkuMapper.batchUpdateByComboSpuIdList(comboSpuIdList, StatusEnum.DISABLE.value()); + //移除购物车商品 + //失效或者删除套餐时移除购物车商品 + comboDeleteOrDisabledTemplate.syncSend(RocketMqConstant.COMBO_DELETE_OR_DISABLED, new GenericMessage<>(comboIdList)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void enableCombo() { + //查询符合条件的套餐id + List comboList = comboMapper.notStartComboIdButStart(); + if (CollUtil.isNotEmpty(comboList)) { + List comboIdList = comboList.stream().map(ComboVO::getComboId).collect(Collectors.toList()); + List comboMainSpuIdList = comboList.stream().map(ComboVO::getMainSpuId).collect(Collectors.toList()); + // 移除主商品套餐信息缓存 + removeSpuCache(comboMainSpuIdList); + comboMapper.batchUpdateComboStatus(comboIdList, ComboStatus.NORMAL.value()); + // 根据套餐id改变套餐商品项状态 + comboSpuMapper.batchUpdateByComboIdList(comboIdList, ComboStatus.NORMAL.value()); + + // 修改套餐商品sku项状态 + List comboSpuList = comboSpuMapper.comboSpuByComboIds(comboIdList); + List comboSpuId = comboSpuList.stream().map(ComboSpuVO::getComboSpuId).collect(Collectors.toList()); + comboSpuSkuMapper.batchUpdateByComboSpuIdList(comboSpuId, ComboStatus.NORMAL.value()); + } + } + + @Override + public void comboSoldNumAdd(List comboList) { + comboMapper.comboSoldNumAdd(comboList); + } + + @Override + @Caching(evict = { + @CacheEvict(value = CacheNames.SPU_COMBO, key = "#spuId"), + @CacheEvict(value = CacheNames.SINGLE_COMBO_INFO, key = "#spuId") + }) + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void offComboMainSpu(Long spuId) { + //根据商品id获取正在进行中的套餐 + List comboList = comboMapper.comboIdByMainSpuId(spuId, StatusEnum.ENABLE.value()); + // 获取未开始的套餐 + comboList.addAll(comboMapper.comboIdByMainSpuId(spuId, StatusEnum.OFFLINE.value())); + if (comboList.size() == 0) { + return; + } + //批量失效套餐活动 + List comboIdList = comboList.stream().map(ComboVO::getComboId).collect(Collectors.toList()); + comboMapper.batchUpdateComboStatus(comboIdList, StatusEnum.DISABLE.value()); + shopCartFeignClient.deleteCartByComboUpdate(comboIdList, -1L, -1L); + } + + @Override + public Boolean checkComboSpu(Long spuId, Long shopId) { + //根据商品id获取正在进行中的套餐 + Integer checkComboSpu = comboMapper.checkComboSpu(spuId, shopId); + return checkComboSpu > 0; + } + + @Override + public Integer checkComboIsUsable(List comboIdList) { + if (comboIdList.size() == 0) { + return 0; + } + return comboMapper.checkComboIsUsable(comboIdList); + } + + @Override + public void removeComboSpuCache(Long spuId) { + List mainSpuIdList = comboMapper.getComboMainSpuIdBySpuId(spuId); + if (mainSpuIdList.size() != 0) { + removeSpuCache(mainSpuIdList); + } + } + + @Override + public List getComboByComboIdList(List comboIdList) { + return comboMapper.getComboByComboIdList(comboIdList); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboSpuSkuServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboSpuSkuServiceImpl.java new file mode 100644 index 0000000..b0f77b2 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboSpuSkuServiceImpl.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.combo.vo.ComboSkuVo; +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.combo.dto.ComboSpuSkuDTO; +import com.tmerclub.cloud.combo.mapper.ComboSpuSkuMapper; +import com.tmerclub.cloud.combo.model.ComboSpuSku; +import com.tmerclub.cloud.combo.service.ComboSpuSkuService; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.ComboSpuSkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.app.SkuAppVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 套装商品sku项 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +@Service +public class ComboSpuSkuServiceImpl implements ComboSpuSkuService { + + @Autowired + private ComboSpuSkuMapper comboSpuSkuMapper; + @DubboReference + private SkuFeignClient skuFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> comboSpuSkuMapper.list()); + } + + @Override + public void save(List comboSpuSkuList, Long comboSpuId) { + List comboSpuSkus = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ComboSpuSkuVO comboSpuSkuVO : comboSpuSkuList) { + ComboSpuSku spuSku = BeanUtil.map(comboSpuSkuVO, ComboSpuSku.class); + comboSpuSkus.add(spuSku); + } + comboSpuSkuMapper.save(comboSpuSkus, comboSpuId); + } + + @Override + public void update(ComboSpuSku comboSpuSku) { + comboSpuSkuMapper.update(comboSpuSku); + } + + @Override + public void deleteById(Long comboSpuId) { + comboSpuSkuMapper.deleteById(comboSpuId); + } + + @Override + public void insertBatch(List skuList, Long comboSpuId) { + if (CollUtil.isEmpty(skuList) || Objects.isNull(comboSpuId)) { + return; + } + List comboSpuSkuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ComboSpuSkuVO comboSpuSkuVO : skuList) { + ComboSpuSku comboSpuSku = BeanUtil.map(comboSpuSkuVO, ComboSpuSku.class); + comboSpuSkuList.add(comboSpuSku); + } + comboSpuSkuMapper.insertBatch(comboSpuSkuList, comboSpuId); + } + + @Override + public void batchUpdate(List comboSpuSkuList) { + List comboSpuSkus = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ComboSpuSkuVO comboSpuSkuVO : comboSpuSkuList) { + ComboSpuSku comboSpuSku = BeanUtil.map(comboSpuSkuVO, ComboSpuSku.class); + comboSpuSkus.add(comboSpuSku); + } + comboSpuSkuMapper.batchUpdate(comboSpuSkus); + } + + @Override + public List comboVoListComboAndSkuList(Set comboIdList, List skuIdList) { + return comboSpuSkuMapper.comboVoListComboAndSkuList(comboIdList, skuIdList); + } + + @Override + public List comboVoListByComboSpuId(Long comboSpuId) { + return comboSpuSkuMapper.comboVoListByComboSpuId(comboSpuId); + } + + @Override + public void deleteBatch(List comboSpuIdList) { + comboSpuSkuMapper.deleteBatch(comboSpuIdList); + } + + @Override + public List getByComboSpuId(Long comboSpuId) { + return comboSpuSkuMapper.getByComboSpuId(comboSpuId); + } + + @Override + public List comboSpuSkuList(List comboSpuIdList) { + return comboSpuSkuMapper.comboSpuSkuList(comboSpuIdList); + } + + @Override + public List comboSpuSkuListByComboIdAndSpuId(ComboSpuSkuDTO comboSpuSkuDTO) { + List comboSpuSkuList = comboSpuSkuMapper.comboSpuSkuListByComboIdAndSpuId(comboSpuSkuDTO.getComboId(), comboSpuSkuDTO.getSpuId()); + List skuAppVOList = skuFeignClient.listBySpuId(comboSpuSkuDTO.getSpuId()).getData(); + Map skuAppMap = skuAppVOList.stream().collect(Collectors.toMap(SkuAppVO::getSkuId, e -> e)); + SpuVO spuVO = spuFeignClient.getById(comboSpuSkuDTO.getSpuId()).getData(); + for (ComboSpuSkuVO comboSpuSkuVO : comboSpuSkuList) { + SkuAppVO skuAppVO = skuAppMap.get(comboSpuSkuVO.getSkuId()); + if (Objects.isNull(skuAppVO)) { + continue; + } + if (Objects.isNull(skuAppVO.getMainImgUrl())) { + skuAppVO.setMainImgUrl(spuVO.getMainImgUrl()); + } + comboSpuSkuVO.setPic(skuAppVO.getMainImgUrl()); + if (Objects.isNull(skuAppVO.getSkuName())) { + skuAppVO.setSkuName(""); + } + comboSpuSkuVO.setSkuName(skuAppVO.getSkuName()); + comboSpuSkuVO.setPriceFee(skuAppVO.getPriceFee()); + comboSpuSkuVO.setProperties(skuAppVO.getProperties()); + comboSpuSkuVO.setStocks(skuAppVO.getStock()); + } + return comboSpuSkuList; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/task/ComboTask.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/task/ComboTask.java new file mode 100644 index 0000000..1c4851b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/task/ComboTask.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.task; + +import com.tmerclub.cloud.combo.service.ComboService; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author xxw + * @date 2022/9/2 17:35 + * 套餐定时任务 + */ +@Component +public class ComboTask { + + @Autowired + private ComboService comboService; + + /** + * 套餐活动结束,修改套餐状态、套餐商品项状态、套餐商品sku项状态 + */ + @XxlJob("activityFinishAndProdChange") + public void activityFinishAndProdChange() { + XxlJobHelper.log("套餐结束,修改套餐状态。。。"); + // 获取活动结束,需要改变套餐状态 + comboService.comboEndOperation(); + } + + @XxlJob("enableCombo") + public void enableCombo() { + XxlJobHelper.log("开启到了活动时间未开启的套餐活动。。。"); + comboService.enableCombo(); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/vo/ComboSpuVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/vo/ComboSpuVO.java new file mode 100644 index 0000000..aa2eb91 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/vo/ComboSpuVO.java @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 套装商品项VO + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboSpuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐商品项id") + private Long comboSpuId; + + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "商品id") + @NotNull(message = "商品id不能为空") + private Long spuId; + + @Schema(description = "套餐价格") + private Long comboPrice; + + @Schema(description = "商品价格") + private Long price; + + @Schema(description = "类型:1:主商品 2:搭配商品") + private Integer type; + + @Schema(description = "是否必选:1:是 0:否") + @NotNull(message = "是否必选不能为空") + private Integer required; + + @Schema(description = "起搭数量") + @NotNull(message = "起搭数量不能为空") + private Integer leastNum; + + @Schema(description = "状态, -1:已删除 1:正常") + private Integer status; + + @Schema(description = "商品图片") + private String pic; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品状态") + private Integer spuStatus; + + @Schema(description = "sku项列表") + private List skuList; + + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getSpuStatus() { + return spuStatus; + } + + public void setSpuStatus(Integer spuStatus) { + this.spuStatus = spuStatus; + } + + public List getSkuList() { + return skuList; + } + + public void setSkuList(List skuList) { + this.skuList = skuList; + } + + public Long getComboSpuId() { + return comboSpuId; + } + + public void setComboSpuId(Long comboSpuId) { + this.comboSpuId = comboSpuId; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getComboPrice() { + return comboPrice; + } + + public void setComboPrice(Long comboPrice) { + this.comboPrice = comboPrice; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getRequired() { + return required; + } + + public void setRequired(Integer required) { + this.required = required; + } + + public Integer getLeastNum() { + return leastNum; + } + + public void setLeastNum(Integer leastNum) { + this.leastNum = leastNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "ComboSpuVO{" + + "comboSpuId=" + comboSpuId + + ", comboId=" + comboId + + ", spuId=" + spuId + + ", comboPrice=" + comboPrice + + ", price=" + price + + ", type=" + type + + ", required=" + required + + ", leastNum=" + leastNum + + ", status=" + status + + ", pic='" + pic + '\'' + + ", spuName='" + spuName + '\'' + + ", spuStatus=" + spuStatus + + ", skuList=" + skuList + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/XxlJobConfig.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/XxlJobConfig.java new file mode 100644 index 0000000..6c34318 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/XxlJobConfig.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.config; + +import com.tmerclub.cloud.common.constant.Constant; +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * + * @author FrozenWatermelon + * @date 2021/1/18 + */ +@Configuration +public class XxlJobConfig { + private static final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${mall4cloud.job.admin.addresses}") + private String adminAddresses; + + @Value("${mall4cloud.job.accessToken}") + private String accessToken; + + @Value("${mall4cloud.job.logPath}") + private String logPath; + + @Value("${spring.application.name}") + private String appname; + + @Value("${server.port}") + private int port; + + @Autowired + private InetUtils inetUtils; + + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appname + Constant.DASHED_ENV); + // 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP + xxlJobSpringExecutor.setIp(inetUtils.findFirstNonLoopbackAddress().getHostAddress()); + xxlJobSpringExecutor.setPort(port + 1000); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(3); + return xxlJobSpringExecutor; + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/CouponConstant.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/CouponConstant.java new file mode 100644 index 0000000..dc276f0 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/CouponConstant.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.constant; + +/** + * 优惠券常量 + * @author FrozenWatermelon + */ +public class CouponConstant { + /** + * 优惠券最小折扣额度 + */ + public static final Double MIN_COUPON_DISCOUNT = 3.0D; + + /** + * 优惠券最大折扣额度 + */ + public static final Double MAX_COUPON_DISCOUNT = 10.0D; + + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/CouponStatus.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/CouponStatus.java new file mode 100644 index 0000000..0fcb1b8 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/CouponStatus.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.constant; + +/** + * 优惠券过期状态 + * + * @author yxf + * @date 2020/11/20 + */ +public enum CouponStatus { + /** + * 删除 + */ + DELETE(-1), + + /** + * 过期 + */ + OVERDUE(0), + + /** + * 未过期 + */ + NO_OVERDUE(1); + + private final Integer value; + + public Integer value() { + return value; + } + + CouponStatus(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/GetWay.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/GetWay.java new file mode 100644 index 0000000..44fb24a --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/GetWay.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.constant; + +/** + * 优惠券领取类型 + * + * @author yxf + * @date 2020/11/20 + */ +public enum GetWay { + /** + * 用户领取 + */ + USER(0), + + /** + * 平台发放 + */ + PLATFORM(1); + + private final Integer value; + + public Integer value() { + return value; + } + + GetWay(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/SuitableProdType.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/SuitableProdType.java new file mode 100644 index 0000000..22654bf --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/SuitableProdType.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.constant; + +/** + * 等级 + * + * @author yxf + * @date 2020/11/20 + */ +public enum SuitableProdType { + + /** + * 全部商品参与 + */ + ALL_SPU(0), + + /** + * 指定商品参与 + */ + ASSIGN_SPU(1); + + private final Integer value; + + public Integer value() { + return value; + } + + SuitableProdType(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/admin/CouponController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/admin/CouponController.java new file mode 100644 index 0000000..89d3309 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/admin/CouponController.java @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.controller.admin; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.coupon.constant.PutOnStatus; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.coupon.constant.CouponStatus; +import com.tmerclub.cloud.coupon.constant.GetWay; +import com.tmerclub.cloud.coupon.dto.CouponDTO; +import com.tmerclub.cloud.coupon.dto.CouponUserDTO; +import com.tmerclub.cloud.coupon.dto.UserCouponsDTO; +import com.tmerclub.cloud.coupon.manager.CouponStockManager; +import com.tmerclub.cloud.coupon.model.Coupon; +import com.tmerclub.cloud.coupon.service.CouponService; +import com.tmerclub.cloud.coupon.service.CouponUserService; +import com.tmerclub.cloud.coupon.vo.CouponVO; +import com.tmerclub.cloud.coupon.vo.mongo.MongoCouponUserVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * 优惠券 + * @author YXF + */ +@RestController("adminCouponController") +@RequestMapping("/mp/coupon") +@Tag(name = "admin-优惠券") +public class CouponController { + + @Autowired + private CouponService couponService; + @Autowired + private CouponUserService couponUserService; + @Autowired + private CouponStockManager couponStockManager; + + @GetMapping("/admin_page") + @Operation(summary = "店铺优惠券管理列表", description = "店铺优惠券管理列表") + public ServerResponseEntity> platformPage(@Valid PageDTO pageDTO, CouponDTO couponDTO) { + PageVO couponPage = couponService.adminPage(pageDTO, couponDTO); + return ServerResponseEntity.success(couponPage); + } + + @GetMapping("/page") + @Operation(summary = "获取优惠券列表", description = "分页获取优惠券列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, CouponDTO couponDTO) { + couponDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO couponPage = couponService.page(pageDTO, couponDTO); + return ServerResponseEntity.success(couponPage); + } + + + @GetMapping("/page_shop_coupon_user") + @Operation(summary = "获取某个用户的优惠券明细", description = "获取某个用户的优惠券明细") + public ServerResponseEntity> shopCouponUserPage(@Valid PageDTO pageDTO, CouponUserDTO couponUserDTO) { + couponUserDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO couponPage = couponUserService.getPageByUserId(pageDTO, couponUserDTO); + return ServerResponseEntity.success(couponPage); + } + + @GetMapping + @Operation(summary = "获取优惠券", description = "根据couponId获取优惠券") + public ServerResponseEntity getByCouponId(@RequestParam Long couponId) { + CouponVO coupon = couponService.getCouponAndCouponProdsByCouponId(couponId); + if (Objects.equals(coupon.getStatus(), CouponStatus.NO_OVERDUE.value()) && Objects.equals(coupon.getPutonStatus(), PutOnStatus.PUT_ON.value())) { + // 正在投放的优惠券的库存 + Integer stock = couponStockManager.getStockByCouponId(coupon.getCouponId()); + coupon.setStocks(stock); + } + return ServerResponseEntity.success(coupon); + } + + @PostMapping + @Operation(summary = "保存优惠券", description = "保存优惠券") + public ServerResponseEntity save(@Valid @RequestBody CouponDTO couponDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + couponDTO.setShopId(shopId); + couponService.save(couponDTO); + couponService.removeCacheByShopId(AuthUserContext.get().getTenantId(), null); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新优惠券", description = "更新优惠券") + public ServerResponseEntity update(@Valid @RequestBody CouponDTO couponDTO) { + couponService.update(couponDTO); + couponService.removeCacheByShopId(AuthUserContext.get().getTenantId(), couponDTO.getCouponId()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除优惠券", description = "根据优惠券id删除优惠券") + public ServerResponseEntity delete(@RequestParam Long couponId) { + // 删除前先校验优惠券是否被用户领取但未使用 + long couponCount = couponUserService.countUnUseCoupon(couponId); + if (couponCount != 0L) { + throw new LuckException("该优惠券存在暂未使用的用户,禁止删除"); + } + couponService.deleteById(couponId); + couponService.removeCacheByShopId(AuthUserContext.get().getTenantId(), couponId); + return ServerResponseEntity.success(); + } + + + @GetMapping("/page_platform_coupons") + @Operation(summary = "分页获取平台优惠券列表", description = "分页获取平台优惠券列表") + public ServerResponseEntity> pagePlatformCoupons(@Valid PageDTO pageDTO, CouponDTO couponDTO) { + couponDTO.setShopId(Constant.PLATFORM_SHOP_ID); + couponDTO.setStatus(StatusEnum.ENABLE.value()); + couponDTO.setPutonStatus(StatusEnum.ENABLE.value()); + couponDTO.setGetWay(GetWay.PLATFORM.value()); + PageVO couponPage = couponService.page(pageDTO, couponDTO); + return ServerResponseEntity.success(couponPage); + } + + @PutMapping("/send_user_coupon") + @Operation(summary = "批量发放优惠券", description = "平台批量发放优惠券给用户") + public ServerResponseEntity sendUserCoupon(@RequestBody UserCouponsDTO userCouponsDTO) { + List userIds = userCouponsDTO.getUserIds(); + if (CollUtil.isEmpty(userIds)) { + return ServerResponseEntity.success(); + } + List coupons = userCouponsDTO.getSendCoupons(); + if (CollUtil.isEmpty(coupons)) { + return ServerResponseEntity.success(); + } + for (Long userId : userIds) { + for (UserCouponsDTO.SendCoupon coupon : coupons) { + Long couponId = coupon.getCouponId(); + Integer nums = coupon.getNums(); + if (Objects.equals(0, nums)) { + continue; + } + for (int i = 0; i < nums; i++) { + couponService.batchBindCouponByCouponIds(Collections.singletonList(couponId), userId); + } + } + } + return ServerResponseEntity.success(); + } + + + @PostMapping("/offline") + @Operation(summary = "下线优惠券", description = "下线优惠券") + public ServerResponseEntity offline(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + Coupon coupon = couponService.getByCouponId(offlineHandleEventDto.getHandleId()); + if (Objects.isNull(coupon)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + offlineHandleEventDto.setShopId(coupon.getShopId()); + couponService.offline(offlineHandleEventDto); + // 清除缓存 + couponService.removeCacheByShopId(coupon.getShopId(), coupon.getCouponId()); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_offline_handle_event/{couponId}") + @Operation(summary = "获取最新下线的事件", description = "获取最新下线的事件") + public ServerResponseEntity getOfflineHandleEvent(@PathVariable Long couponId) { + return ServerResponseEntity.success(couponService.getOfflineHandleEvent(couponId)); + } + + @PostMapping("/audit") + @Operation(summary = "审核活动", description = "审核活动") + public ServerResponseEntity audit(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + Coupon coupon = couponService.getByCouponId(offlineHandleEventDto.getHandleId()); + couponService.audit(offlineHandleEventDto, coupon); + // 清除缓存 + couponService.removeCacheByShopId(coupon.getShopId(), coupon.getCouponId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/audit_apply") + @Operation(summary = "违规活动提交审核", description = "违规活动提交审核") + public ServerResponseEntity auditApply(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + couponService.auditApply(offlineHandleEventDto); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/app/CouponController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/app/CouponController.java new file mode 100644 index 0000000..6b2fd33 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/app/CouponController.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.controller.app; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.coupon.constant.PutOnStatus; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.coupon.constant.CouponStatus; +import com.tmerclub.cloud.coupon.constant.SuitableProdType; +import com.tmerclub.cloud.coupon.manager.CouponStockManager; +import com.tmerclub.cloud.coupon.service.CouponService; +import com.tmerclub.cloud.coupon.service.CouponUserService; +import com.tmerclub.cloud.coupon.vo.CouponAppVO; +import com.tmerclub.cloud.coupon.vo.CouponVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * 优惠券 + * + * @author YXF + * @date 2020-12-08 17:22:56 + */ +@RestController("appCouponController") +@RequestMapping("/ma/coupon") +@Tag(name = "app-优惠券") +public class CouponController { + + @Autowired + private CouponService couponService; + @Autowired + private CouponUserService couponUserService; + @Autowired + private CouponStockManager couponStockManager; + + + @GetMapping("/general_coupon_list") + @Operation(summary = "平台优惠券列表(领券中心, 访客接口)", description = "平台优惠券列表") + public ServerResponseEntity> generalCouponList() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + Long userId = null; + if (Objects.nonNull(uidInfoBO)) { + userId = uidInfoBO.getUserId(); + } + return ServerResponseEntity.success(couponService.generalCouponList(userId)); + } + + @GetMapping("/get_coupon_page") + @Operation(summary = "店铺商品券列表(领券中心, 访客接口)", description = "获取店铺商品券列表") + public ServerResponseEntity> getCouponPage(@Valid PageDTO page) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + Long userId = null; + if (Objects.nonNull(uidInfoBO)) { + userId = uidInfoBO.getUserId(); + } + PageVO couponDto = couponService.getProdCouponPage(page, userId); + return ServerResponseEntity.success(couponDto); + } + + @GetMapping("/get_shop_or_spu_coupon_list") + @Operation(summary = "获取指定店铺或指定商品的所有优惠券 ", description = "通过shopId或shopId和spuId获取指定店铺或指定商品的所有优惠券") + public ServerResponseEntity> getShopOrSpuCouponList(Long shopId, Long spuId) { + // 获取已投放优惠券 + List coupons = couponService.getShopCouponList(shopId); + if (Objects.isNull(spuId)) { + setStock(coupons); + return ServerResponseEntity.success(coupons); + } + // 过滤指定商品参与 + coupons.addAll(couponService.getShopCouponList(Constant.PLATFORM_SHOP_ID)); + Iterator iterator = coupons.iterator(); + List couponIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + while (iterator.hasNext()) { + CouponAppVO coupon = iterator.next(); + if (Objects.equals(coupon.getSuitableProdType(), SuitableProdType.ALL_SPU.value()) || (coupon.getSpuIds().contains(spuId))) { + couponIds.add(coupon.getCouponId()); + continue; + } + iterator.remove(); + } + couponUserService.listByAndShopIdOrSpuId(coupons, couponIds); + setStock(coupons); + return ServerResponseEntity.success(coupons); + } + + private void setStock(List coupons) { + Iterator iterator = coupons.iterator(); + while (iterator.hasNext()) { + CouponAppVO coupon = iterator.next(); + if (Objects.equals(coupon.getStatus(), CouponStatus.NO_OVERDUE.value()) && Objects.equals(coupon.getPutonStatus(), PutOnStatus.PUT_ON.value())) { + // 正在投放的优惠券的库存 + Integer stock = couponStockManager.getStockByCouponId(coupon.getCouponId()); + if (stock < 1) { + iterator.remove(); + continue; + } + coupon.setStocks(stock); + } + } + } + + + @GetMapping("/get_spus_by_coupon_id") + @Operation(summary = "根据优惠券,获取可用的商品列表", description = "根据优惠券,获取可用的商品列表") + @Parameter(name = "couponId", description = "优惠券id") + public ServerResponseEntity> getSpusByCouponId(PageDTO pageDTO, ProductSearchDTO productSearch, + @RequestParam("couponId") Long couponId) { + return ServerResponseEntity.success(couponService.spuListByCouponId(pageDTO, productSearch, couponId)); + } + + @GetMapping("/get_by_coupon_id") + @Operation(summary = "获取优惠券信息", description = "根据id获取") + public ServerResponseEntity generalCouponList(@RequestParam("couponId") Long couponId) { + CouponVO coupon = couponService.getCouponAndProdData(couponId); + CouponAppVO appVO = BeanUtil.map(coupon, CouponAppVO.class); + return ServerResponseEntity.success(appVO); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/app/MyCouponController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/app/MyCouponController.java new file mode 100644 index 0000000..92c1ed3 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/app/MyCouponController.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.controller.app; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.coupon.service.CouponService; +import com.tmerclub.cloud.coupon.service.CouponUserService; +import com.tmerclub.cloud.coupon.vo.CouponAppVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.Objects; + +/** + * 优惠券 + * + * @author YXF + * @date 2020-12-08 17:22:56 + */ +@RestController("appMyCouponController") +@RequestMapping("/my_coupon") +@Tag(name = "app-我的优惠券") +public class MyCouponController { + + @Autowired + private CouponService couponService; + @Autowired + private CouponUserService couponUserService; + + @GetMapping("/get_page") + @Operation(summary = "查看用户的优惠券(所有/指定状态)分页列表", description = "查看用户的优惠券(所有/指定状态)分页列表") + @Parameters({ + @Parameter(name = "status", description = "优惠券状态 0:已过期 1:未使用 2:已使用"), + @Parameter(name = "type", description = "0:所有 1:平台优惠券 2:店铺优惠券") + }) + public ServerResponseEntity> getUserCouponPage(PageDTO page, @RequestParam("type") Long type, @RequestParam("status") Integer status) { + return ServerResponseEntity.success(couponService.getUserCouponPage(page, type, status)); + } + + @GetMapping("/get_my_coupons_status_or_type_count") + @Operation(summary = "获取用户优惠券的数量", description = "获取各个状态下的优惠券个数") + public ServerResponseEntity> getCouponCountByStatus() { + Map couponCount = couponUserService.getCouponCountByStatus(AuthUserContext.get().getUserId()); + return ServerResponseEntity.success(couponCount); + } + + @PostMapping("/receive") + @Operation(summary = "领取优惠券接口", description = "领取优惠券接口") + public ServerResponseEntity receive(@RequestBody Long couponId) { + if (Objects.isNull(couponId)) { + throw new LuckException("优惠券Id不能为空"); + } + couponService.receive(couponId); + return ServerResponseEntity.success("领取优惠券成功"); + } + + @DeleteMapping("/delete_coupon/{couponUserId}") + @Operation(summary = "删除用户优惠券", description = "通过优惠券id删除用户优惠券") + @Parameter(name = "couponUserId", description = "用户优惠券Id") + public ServerResponseEntity deleteCoupon(@PathVariable("couponUserId") Long couponUserId) { + couponUserService.deleteUserCouponByCouponId(couponUserId); + return ServerResponseEntity.success("删除成功"); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/platform/CouponController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/platform/CouponController.java new file mode 100644 index 0000000..e92b8b1 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/controller/platform/CouponController.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.controller.platform; + + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.coupon.dto.CouponUserDTO; +import com.tmerclub.cloud.coupon.service.CouponUserService; +import com.tmerclub.cloud.coupon.vo.CouponUserVO; +import com.tmerclub.cloud.coupon.vo.mongo.MongoCouponUserVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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; + +/** + * 优惠券 + * @author cl + */ +@RestController("platformCouponController") +@RequestMapping("/p/coupon") +@Tag(name = "platform-优惠券") +public class CouponController { + + @Autowired + private CouponUserService couponUserService; + + @GetMapping("/page_coupon_user") + @Operation(summary = "获取某个用户的优惠券明细", description = "获取某个用户的优惠券明细") + public ServerResponseEntity> platformCouponUserPage(@Valid PageDTO pageDTO, CouponUserDTO couponUserDTO) { + PageVO couponPage = couponUserService.getPageByUserId(pageDTO, couponUserDTO); + return ServerResponseEntity.success(couponPage); + } + + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/dto/CouponDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/dto/CouponDTO.java new file mode 100644 index 0000000..2a7a771 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/dto/CouponDTO.java @@ -0,0 +1,342 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 优惠券DTO + * + * @author YXF + * @date 2020-12-08 17:22:56 + */ +public class CouponDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "优惠券ID") + private Long couponId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @NotNull(message = "优惠券名称不能为空") + @Schema(description = "优惠券名称") + private String couponName; + + @Schema(description = "副标题") + private String subTitle; + + @NotNull(message = "优惠类型不能为空") + @Schema(description = "优惠类型 1:代金券 2:折扣券 3:兑换券") + private Integer couponType; + + @NotNull(message = "适用商品类型不能为空") + @Schema(description = "适用商品类型 0全部商品参与 1指定商品参与") + private Integer suitableProdType; + + @NotNull(message = "获取方式不能为空") + @Schema(description = "获取方式 0=用户领取 1=店铺发放") + private Integer getWay; + + @NotNull(message = "生效类型不能为空") + @Schema(description = "生效类型 1:固定时间 2:领取后生效") + private Integer validTimeType; + + @Schema(description = "使用条件") + private Long cashCondition; + + @Schema(description = "减免金额") + private Long reduceAmount; + + @Schema(description = "折扣额度") + private Double couponDiscount; + + @Schema(description = "投放时间") + private Date launchTime; + + @Schema(description = "开始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; + + @Schema(description = "领券后X天起生效") + private Integer afterReceiveDays; + + @Schema(description = "有效天数") + private Integer validDays; + + @Schema(description = "总库存") + private Integer totalStock; + + @Schema(description = "库存") + private Integer stocks; + + @Schema(description = "每个用户领券上限,如不填则默认为1") + private Integer limitNum; + + @Schema(description = "优惠券状态 0:过期 1:未过期") + private Integer status; + + @NotNull(message = "优惠券投放状态不能为空") + @Schema(description = "优惠券投放状态(-1:取消投放 0:自动投放 1:投放 2:违规下架 3:等待审核 4:暂不投放)") + private Integer putonStatus; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "商品id列表") + private List spuIds; + + /** + * 商店id列表 + */ + private List shopIds; + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getCouponName() { + return couponName; + } + + public void setCouponName(String couponName) { + this.couponName = couponName; + } + + public String getSubTitle() { + return subTitle; + } + + public void setSubTitle(String subTitle) { + this.subTitle = subTitle; + } + + public Integer getCouponType() { + return couponType; + } + + public void setCouponType(Integer couponType) { + this.couponType = couponType; + } + + public Integer getSuitableProdType() { + return suitableProdType; + } + + public void setSuitableProdType(Integer suitableProdType) { + this.suitableProdType = suitableProdType; + } + + public Integer getGetWay() { + return getWay; + } + + public void setGetWay(Integer getWay) { + this.getWay = getWay; + } + + public Integer getValidTimeType() { + return validTimeType; + } + + public void setValidTimeType(Integer validTimeType) { + this.validTimeType = validTimeType; + } + + public Long getCashCondition() { + return cashCondition; + } + + public void setCashCondition(Long cashCondition) { + this.cashCondition = cashCondition; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Double getCouponDiscount() { + return couponDiscount; + } + + public void setCouponDiscount(Double couponDiscount) { + this.couponDiscount = couponDiscount; + } + + public Date getLaunchTime() { + return launchTime; + } + + public void setLaunchTime(Date launchTime) { + this.launchTime = launchTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getAfterReceiveDays() { + return afterReceiveDays; + } + + public void setAfterReceiveDays(Integer afterReceiveDays) { + this.afterReceiveDays = afterReceiveDays; + } + + public Integer getValidDays() { + return validDays; + } + + public void setValidDays(Integer validDays) { + this.validDays = validDays; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getStocks() { + return stocks; + } + + public void setStocks(Integer stocks) { + this.stocks = stocks; + } + + public Integer getLimitNum() { + return limitNum; + } + + public void setLimitNum(Integer limitNum) { + this.limitNum = limitNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPutonStatus() { + return putonStatus; + } + + public void setPutonStatus(Integer putonStatus) { + this.putonStatus = putonStatus; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + @Override + public String toString() { + return "CouponDTO{" + + "couponId=" + couponId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", couponName='" + couponName + '\'' + + ", subTitle='" + subTitle + '\'' + + ", couponType=" + couponType + + ", suitableProdType=" + suitableProdType + + ", getWay=" + getWay + + ", validTimeType=" + validTimeType + + ", cashCondition=" + cashCondition + + ", reduceAmount=" + reduceAmount + + ", couponDiscount=" + couponDiscount + + ", launchTime=" + launchTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", afterReceiveDays=" + afterReceiveDays + + ", validDays=" + validDays + + ", totalStock=" + totalStock + + ", stocks=" + stocks + + ", limitNum=" + limitNum + + ", status=" + status + + ", putonStatus=" + putonStatus + + ", version=" + version + + ", spuIds=" + spuIds + + ", shopIds=" + shopIds + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/dto/CouponUserDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/dto/CouponUserDTO.java new file mode 100644 index 0000000..e567006 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/dto/CouponUserDTO.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 优惠券用户关联信息DTO + * + * @author YXF + * @date 2020-12-08 17:22:57 + */ +public class CouponUserDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "优惠券用户ID") + private Long couponUserId; + + @Schema(description = "优惠券ID") + private Long couponId; + + @Schema(description = "用户ID") + private Long userId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "领券时间") + private Date receiveTime; + + @Schema(description = "开始时间") + private Date userStartTime; + + @Schema(description = "结束时间") + private Date userEndTime; + + @Schema(description = "优惠券状态 0:失效 1:有效 2:使用过") + private Integer status; + + @Schema(description = "优惠券是否被删除 0:未删除 1:已删除") + private Integer isDelete; + + public Long getCouponUserId() { + return couponUserId; + } + + public void setCouponUserId(Long couponUserId) { + this.couponUserId = couponUserId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public Date getUserStartTime() { + return userStartTime; + } + + public void setUserStartTime(Date userStartTime) { + this.userStartTime = userStartTime; + } + + public Date getUserEndTime() { + return userEndTime; + } + + public void setUserEndTime(Date userEndTime) { + this.userEndTime = userEndTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsDelete() { + return isDelete; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "CouponUserDTO{" + + "couponUserId=" + couponUserId + + ", couponId=" + couponId + + ", userId=" + userId + + ", shopId=" + shopId + + ", receiveTime=" + receiveTime + + ", userStartTime=" + userStartTime + + ", userEndTime=" + userEndTime + + ", status=" + status + + ", isDelete=" + isDelete + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/feign/CouponOrderFeignController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/feign/CouponOrderFeignController.java new file mode 100644 index 0000000..e8c3b83 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/feign/CouponOrderFeignController.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.feign; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.coupon.dto.LockCouponDTO; +import com.tmerclub.cloud.api.coupon.dto.PlatformChooseCouponDTO; +import com.tmerclub.cloud.api.coupon.feign.CouponOrderFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.coupon.service.CouponLockService; +import com.tmerclub.cloud.coupon.service.CouponService; +import com.tmerclub.cloud.coupon.util.ChooseCouponHelper; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/12/17 + */ +@DubboService +public class CouponOrderFeignController implements CouponOrderFeignClient { + + + private final Logger LOGGER = LoggerFactory.getLogger(CouponOrderFeignController.class); + @Autowired + private CouponService couponService; + @Autowired + private CouponLockService couponLockService; + + @Override + public ServerResponseEntity choosePlatformCoupon(PlatformChooseCouponDTO param) { + Long userId = AuthUserContext.get().getUserId(); + ShopCartOrderMergerVO shopCartOrderMergerVO = param.getShopCartOrderMergerVO(); + + // 获取用户可用平台优惠券 + List couponList = couponService.getCouponListByUserIdAndShopId(userId, 0L); + if (CollectionUtil.isEmpty(couponList)) { + return ServerResponseEntity.success(shopCartOrderMergerVO); + } + + // 完整的订单信息 + // 订单项目 + List shopAllShopCartItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + List shopCartOrders = shopCartOrderMergerVO.getShopCartOrders(); + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + List shopCartItemDiscounts = shopCartOrder.getShopCartItemDiscounts(); + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + shopAllShopCartItems.addAll(shopCartItemDiscount.getShopCartItems()); + } + } + // 因为经过满减,实际金额的顺序已经变了 + shopAllShopCartItems = shopAllShopCartItems.stream().sorted(Comparator.comparingDouble(ShopCartItemVO::getActualTotal)).collect(Collectors.toList()); + + ChooseCouponHelper chooseCouponHelper = new ChooseCouponHelper(shopAllShopCartItems, couponList, param.getCouponIds(), param.getUserChangeCoupon()).invoke(); + + + if (chooseCouponHelper.getChooseCoupon() != null) { + Long couponReduce = chooseCouponHelper.getCouponReduce(); + Map shopReduceMap = chooseCouponHelper.getShopReduceMap(); + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + Long couponAmount = shopReduceMap.get(shopCartOrder.getShopId()); + shopCartOrder.setPlatformCouponReduce(couponAmount); + couponAmount = Objects.isNull(shopCartOrder.getPlatformAmount()) ? couponAmount : shopCartOrder.getPlatformAmount() + couponAmount; + shopCartOrder.setPlatformAmount(couponAmount); + shopCartOrder.setActualTotal(shopCartOrder.getActualTotal() - shopCartOrder.getPlatformCouponReduce()); + shopCartOrder.setShopReduce(shopCartOrder.getShopReduce() + shopCartOrder.getPlatformCouponReduce()); + } + shopCartOrderMergerVO.setOrderReduce(shopCartOrderMergerVO.getOrderReduce() + couponReduce); + shopCartOrderMergerVO.setActualTotal(shopCartOrderMergerVO.getActualTotal() - couponReduce); + } + shopCartOrderMergerVO.setCoupons(couponList); + return ServerResponseEntity.success(shopCartOrderMergerVO); + } + + @Override + public ServerResponseEntity lockCoupon(List lockCouponParams) { + if (CollectionUtil.isEmpty(lockCouponParams)) { + return ServerResponseEntity.success(); + } + return couponLockService.lockCoupon(lockCouponParams); + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/CouponUnlockConsumer.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/CouponUnlockConsumer.java new file mode 100644 index 0000000..2f2f1e5 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/CouponUnlockConsumer.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.coupon.service.CouponLockService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.COUPON_UNLOCK_TOPIC, consumerGroup = RocketMqConstant.COUPON_UNLOCK_TOPIC) +public class CouponUnlockConsumer implements RocketMQListener> { + + @Autowired + private CouponLockService couponLockService; + + /** + * 1、优惠券锁定一定时间后,如果订单支付未支付,则解锁优惠券(有可能优惠券锁定成功,订单因为异常回滚导致订单未创建) + * 2、取消订单,直接解锁优惠券 + */ + @Override + public void onMessage(List orderIds) { + couponLockService.unlockCoupon(orderIds); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/manager/CouponStockManager.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/manager/CouponStockManager.java new file mode 100644 index 0000000..a464d92 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/manager/CouponStockManager.java @@ -0,0 +1,235 @@ +package com.tmerclub.cloud.coupon.manager; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.cache.bo.MultiDecrementBO; +import com.tmerclub.cloud.common.cache.config.MultiRedisConfig; +import com.tmerclub.cloud.common.cache.constant.LockCacheNames; +import com.tmerclub.cloud.common.cache.enums.MultiStockEnum; +import com.tmerclub.cloud.common.cache.manager.MultiRedisStockManager; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.coupon.bo.mongo.MongoCouponUserBO; +import com.tmerclub.cloud.coupon.mapper.CouponMapper; +import com.tmerclub.cloud.coupon.model.Coupon; +import com.tmerclub.cloud.coupon.service.CouponUserService; +import com.tmerclub.cloud.coupon.vo.CouponUserVO; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author TRACK + */ +@Service +public class CouponStockManager { + private static final Logger LOGGER = LoggerFactory.getLogger(CouponStockManager.class); + + @Autowired + private RedissonClient redissonClient; + @Autowired + private CouponMapper couponMapper; + @Autowired + private MultiRedisStockManager multiRedisStockManager; + @Autowired + @Lazy + private CouponUserService couponUserService; + @Autowired + private MultiRedisConfig multiRedisConfig; + + public Boolean decrStocks(MultiDecrementBO multiDecrementBO) { + try { + multiRedisStockManager.decrStocks(multiDecrementBO); + } catch (Exception e) { + LOGGER.error("优惠券:{}领券出现异常:{}", multiDecrementBO.getActivityId(), e.getMessage()); + return false; + } + return true; + } + + public void saveLogAndDeleteLock(List couponUsers) { + // 这里可能发生记录存储异常,可以通过扣减库存在redis存入的锁定记录来进行解锁,具体看定时任务unLockCouponStock + couponUserService.saveBatchToMongodb(couponUsers); + // 领券成功后删除锁定记录,删除不成功也没关系,有定时任务unLockCouponStock进行库存的解锁 + for (MongoCouponUserBO couponUser : couponUsers) { + multiRedisStockManager.handleReceiveSuccessCouponStock(couponUser.getCouponUserId(), couponUser.getUserId(), couponUser.getCouponId()); + } + } + + /** + * 获取正在投放的优惠券的真实库存 + */ + public Integer getStockByCouponId(Long couponId) { + int totalStock = 0; + RLock lock = redissonClient.getLock(LockCacheNames.LOCK_COUPON_ZONE_PERFIX + couponId); + lock.lock(); + try { + Integer redisStock = multiRedisStockManager.getCouponStock( + new MultiDecrementBO(MultiStockEnum.COUPON, null, null, + couponId, couponId, null, null, null)); + if (Objects.isNull(redisStock)) { + Coupon coupon = couponMapper.getByCouponId(couponId); + // 总库存量,需要查一下领取数量,才知道到底还有多少库存 + int receiveCouponNum = couponUserService.countReceiveCoupon(couponId); + // 剩余库存 + int stockByReceive = coupon.getTotalStock() - receiveCouponNum; + // 看下通过领取数出来的库存,和原始库存那个比较少,那个少哪个就最接近“真实库存”。 + // 所谓的接近真实都是建立在缓存被删了,然后没办法恢复的状态,只能通过领取数量和历史库存进行查询的结果。 + // 正常情况下,缓存的库存就是真实库存。 + totalStock = Math.min(coupon.getStocks(), stockByReceive); + // 把库存存入redis + MultiDecrementBO multiDecrementBO = new MultiDecrementBO(MultiStockEnum.COUPON, null, null, + couponId, couponId, null, null, null); + multiRedisStockManager.doCouponZone(multiDecrementBO,totalStock); + return totalStock; + } + totalStock = redisStock; + } finally { + lock.unlock(); + } + return totalStock; + } + + public void couponStockPlacement(List couponIds, Boolean isCancelPut) { + for (Long couponId : couponIds) { + RLock lock = redissonClient.getLock(LockCacheNames.LOCK_COUPON_ZONE_PERFIX + couponId); + lock.lock(); + try { + if (isCancelPut) { + // 如果是取消投放 要把可能存在的领券异常处理先 + List couponUsers = scanLockStockCouponLog(couponId); + if (CollUtil.isNotEmpty(couponUsers)) { + unlockStockByException(couponUsers); + } + } + // 库存落库 + flushStockToDb(couponId, null); + } finally { + lock.unlock(); + } + } + if (isCancelPut) { + // 取消投放删除用户领券缓存key、库存分片key + multiRedisStockManager.removeCancelPutCouponKey(couponIds); + } + } + + public void flushStockToDb(Long couponId, Integer hasStock) { + // 可用库存 + if (Objects.isNull(hasStock)) { + hasStock = getStockByCouponId(couponId); + } + Coupon dbCoupon = couponMapper.getByCouponId(couponId); + // 数据库的可用库存 + Integer dbStocks = dbCoupon.getStocks(); + // 改变的库存 + int changeStock = dbStocks - hasStock; + if (changeStock == 0) { + LOGGER.info("优惠券{}库存未改变,无需更新", couponId); + return; + } + // 更新剩余库存 + couponMapper.updateStockById(couponId, changeStock); + } + + public List scanLockStockCouponLog(Long couponId) { + List couponUsers = new ArrayList<>(Constant.INITIAL_CAPACITY); + int redisCount = multiRedisConfig.getRedisCount(); + String couponLockKey = MultiStockEnum.COUPON.value() + "lock:"; + if (Objects.nonNull(couponId)) { + // 单独搜索该优惠券 + couponLockKey = MultiStockEnum.COUPON.value() + "lock:" + couponId + Constant.UNDERLINE; + } + for (int i = 0; i < redisCount; i++) { + StringRedisTemplate stringRedisTemplate = multiRedisConfig.getRedisByIndex(i); + List list = RedisUtil.hScan(stringRedisTemplate, couponLockKey); + for (String key : list) { + String couponInfo = key.replace(couponLockKey, ""); + String[] split = couponInfo.split(Constant.UNDERLINE); + CouponUserVO couponUserVO = new CouponUserVO(); + couponUserVO.setCouponId(Long.parseLong(split[0])); + couponUserVO.setUserId(Long.parseLong(split[1])); + couponUserVO.setCouponUserId(Long.parseLong(split[2])); + couponUsers.add(couponUserVO); + } + } + return couponUsers; + } + + /** + * 因为添加领券记录异常,所以要删除锁定记录 + * 因为异常解锁,所以要删除领券记录 + *

+ * 优惠券库存扣减流程分析: + * 1.用户领券/系统发放优惠券,扣除库存失败 - 无需处理 + * 2.用户领券/系统发放优惠券,成功扣除库存,领券记录添加失败 - 还原库存和删除redis中的优惠券库存锁定明细记录 + * 3.用户领券/系统发放优惠券,成功扣除库存,成功添加领券记录,解锁异常 - 删除redis中的优惠券库存锁定明细记录 + *

+ * 数据对应关系: + * 1.redis中查询锁定记录, 如果没有锁定记录就代表是上面的步骤1,无需处理 + * 2.mongodb中查询领券记录,如果没有领券记录,就是上面的步骤2,还原库存和删除redis中的优惠券库存锁定明细记录 + * 3.mongodb中查询领券记录,有领券记录但库存锁定记录还在,就是上面的步骤3,删除redis中的优惠券库存锁定明细记录 + */ + public void unlockStockByException(List couponUsers) { + List couponUserIds = couponUsers.stream().map(CouponUserVO::getCouponUserId).collect(Collectors.toList()); + // 查询领券记录 + List successCouponUser = couponUserService.listCouponUserIdsByIds(couponUserIds); + Set successCouponUserIds = successCouponUser.stream().map(MongoCouponUserBO::getCouponUserId).collect(Collectors.toSet()); + // 领券记录创建失败的数据列表 + List receiveFailList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 锁定记录删除失败的数据列表 + List deleteFailList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isEmpty(successCouponUserIds)) { + // 全部是领券记录存储失败的 + receiveFailList.addAll(couponUsers); + } else { + for (CouponUserVO couponUser : couponUsers) { + if (successCouponUserIds.contains(couponUser.getCouponUserId())) { + // 锁定记录删除失败 + deleteFailList.add(couponUser); + continue; + } + // 领券记录存储失败 + receiveFailList.add(couponUser); + } + } + // 处理领券记录失败的--还原库存和删除redis中的优惠券库存锁定明细记录 + if (CollUtil.isNotEmpty(receiveFailList)) { + for (CouponUserVO couponUserVO : receiveFailList) { + MultiDecrementBO multiDecrementBO = new MultiDecrementBO(MultiStockEnum.COUPON, couponUserVO.getUserId(), couponUserVO.getCouponUserId(), + couponUserVO.getCouponId(), couponUserVO.getCouponId(), 1, null, null); + RLock lock = redissonClient.getLock(LockCacheNames.LOCK_COUPON_ZONE_PERFIX + couponUserVO.getCouponId()); + lock.lock(); + try { + multiRedisStockManager.rollbackCouponStock(multiDecrementBO); + } catch (Exception e) { + LOGGER.error("优惠券记录{}回退失败{}", couponUserVO.getCouponUserId(), e.getMessage()); + } finally { + lock.unlock(); + } + } + } + // 处理锁定记录删除失败的--删除redis中的优惠券库存锁定明细记录 + if (CollUtil.isNotEmpty(deleteFailList)) { + for (CouponUserVO couponUserVO : deleteFailList) { + RLock lock = redissonClient.getLock(LockCacheNames.LOCK_COUPON_ZONE_PERFIX + couponUserVO.getCouponId()); + lock.lock(); + try { + multiRedisStockManager.handleReceiveSuccessCouponStock(couponUserVO.getCouponUserId(), couponUserVO.getUserId(), couponUserVO.getCouponId()); + } finally { + lock.unlock(); + } + } + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponGiveLogMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponGiveLogMapper.java new file mode 100644 index 0000000..9d0147e --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponGiveLogMapper.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.mapper; + +import com.tmerclub.cloud.coupon.model.CouponGiveLog; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 优惠券赠送记录 + * + * @author FrozenWatermelon + * @date 2021-04-28 16:25:05 + */ +public interface CouponGiveLogMapper { + + /** + * 获取优惠券赠送记录列表 + * + * @return 优惠券赠送记录列表 + */ + List list(); + + /** + * 根据优惠券赠送记录id获取优惠券赠送记录 + * + * @param bizType 优惠券赠送记录id + * @return 优惠券赠送记录 + */ + CouponGiveLog getByBizType(@Param("bizType") Long bizType); + + /** + * 保存优惠券赠送记录 + * + * @param couponGiveLog 优惠券赠送记录 + */ + void save(@Param("couponGiveLog") CouponGiveLog couponGiveLog); + + /** + * 更新优惠券赠送记录 + * + * @param couponGiveLog 优惠券赠送记录 + */ + void update(@Param("couponGiveLog") CouponGiveLog couponGiveLog); + + /** + * 根据优惠券赠送记录id删除优惠券赠送记录 + * + * @param bizType + */ + void deleteById(@Param("bizType") Long bizType); + + /** + * 计算有没有已经保存的记录 + * @param bizType 业务类型 + * @param bizId 业务id + * @return 有没有已经保存的记录 + */ + Integer count(@Param("bizType") Integer bizType, @Param("bizId") Long bizId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/Coupon.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/Coupon.java new file mode 100644 index 0000000..c569f52 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/Coupon.java @@ -0,0 +1,340 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 优惠券 + * + * @author YXF + * @date 2020-12-08 17:22:56 + */ +public class Coupon extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 优惠券ID + */ + private Long couponId; + + /** + * 店铺ID + */ + private Long shopId; + + /** + * 优惠券名称 + */ + private String couponName; + + /** + * 副标题 + */ + private String subTitle; + + /** + * 优惠类型 1:代金券 2:折扣券 3:兑换券 + */ + private Integer couponType; + + /** + * 适用商品类型 0全部商品参与 1指定商品参与 + */ + private Integer suitableProdType; + + /** + * 获取方式 0=用户领取 1=店铺发放 + */ + private Integer getWay; + + /** + * 生效类型 1:固定时间 2:领取后生效 + */ + private Integer validTimeType; + + /** + * 使用条件 + */ + private Long cashCondition; + + /** + * 减免金额 + */ + private Long reduceAmount; + + /** + * 折扣额度 + */ + private Double couponDiscount; + + /** + * 投放时间 + */ + private Date launchTime; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; + + /** + * 领券后X天起生效 + */ + private Integer afterReceiveDays; + + /** + * 有效天数 + */ + private Integer validDays; + + /** + * 总库存 + */ + private Integer totalStock; + + /** + * 库存 + */ + private Integer stocks; + + /** + * 每个用户领券上限,如不填则默认为1 + */ + private Integer limitNum; + + /** + * 优惠券状态 0:过期 1:未过期 -1:删除 + */ + private Integer status; + + /** + * 优惠券投放状态(-1:取消投放 0:自动投放 1:投放 2:违规下架 3:等待审核 4:暂不投放) + */ + private Integer putonStatus; + + /** + * 版本号 + */ + private Integer version; + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getCouponName() { + return couponName; + } + + public void setCouponName(String couponName) { + this.couponName = couponName; + } + + public String getSubTitle() { + return subTitle; + } + + public void setSubTitle(String subTitle) { + this.subTitle = subTitle; + } + + public Integer getCouponType() { + return couponType; + } + + public void setCouponType(Integer couponType) { + this.couponType = couponType; + } + + public Integer getSuitableProdType() { + return suitableProdType; + } + + public void setSuitableProdType(Integer suitableProdType) { + this.suitableProdType = suitableProdType; + } + + public Integer getGetWay() { + return getWay; + } + + public void setGetWay(Integer getWay) { + this.getWay = getWay; + } + + public Integer getValidTimeType() { + return validTimeType; + } + + public void setValidTimeType(Integer validTimeType) { + this.validTimeType = validTimeType; + } + + public Long getCashCondition() { + return cashCondition; + } + + public void setCashCondition(Long cashCondition) { + this.cashCondition = cashCondition; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Double getCouponDiscount() { + return couponDiscount; + } + + public void setCouponDiscount(Double couponDiscount) { + this.couponDiscount = couponDiscount; + } + + public Date getLaunchTime() { + return launchTime; + } + + public void setLaunchTime(Date launchTime) { + this.launchTime = launchTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getAfterReceiveDays() { + return afterReceiveDays; + } + + public void setAfterReceiveDays(Integer afterReceiveDays) { + this.afterReceiveDays = afterReceiveDays; + } + + public Integer getValidDays() { + return validDays; + } + + public void setValidDays(Integer validDays) { + this.validDays = validDays; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getStocks() { + return stocks; + } + + public void setStocks(Integer stocks) { + this.stocks = stocks; + } + + public Integer getLimitNum() { + return limitNum; + } + + public void setLimitNum(Integer limitNum) { + this.limitNum = limitNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPutonStatus() { + return putonStatus; + } + + public void setPutonStatus(Integer putonStatus) { + this.putonStatus = putonStatus; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + @Override + public String toString() { + return "Coupon{" + + "couponId=" + couponId + + ", shopId=" + shopId + + ", couponName='" + couponName + '\'' + + ", subTitle='" + subTitle + '\'' + + ", couponType=" + couponType + + ", suitableProdType=" + suitableProdType + + ", getWay=" + getWay + + ", validTimeType=" + validTimeType + + ", cashCondition=" + cashCondition + + ", reduceAmount=" + reduceAmount + + ", couponDiscount=" + couponDiscount + + ", launchTime=" + launchTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", afterReceiveDays=" + afterReceiveDays + + ", validDays=" + validDays + + ", totalStock=" + totalStock + + ", stocks=" + stocks + + ", limitNum=" + limitNum + + ", status=" + status + + ", putonStatus=" + putonStatus + + ", version=" + version + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/CouponSpu.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/CouponSpu.java new file mode 100644 index 0000000..b98093b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/CouponSpu.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 优惠券商品关联信息 + * + * @author YXF + * @date 2020-12-08 17:22:57 + */ +public class CouponSpu extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 优惠券商品ID + */ + private Long couponSpuId; + + /** + * 优惠券ID + */ + private Long couponId; + + /** + * 商品ID + */ + private Long spuId; + + public Long getCouponSpuId() { + return couponSpuId; + } + + public void setCouponSpuId(Long couponSpuId) { + this.couponSpuId = couponSpuId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + @Override + public String toString() { + return "CouponProd{" + + "couponSpuId=" + couponSpuId + + ",couponId=" + couponId + + ",spuId=" + spuId + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponService.java new file mode 100644 index 0000000..95de7e0 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponService.java @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.service; + +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.CouponOrderVO; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.coupon.dto.CouponDTO; +import com.tmerclub.cloud.coupon.model.Coupon; +import com.tmerclub.cloud.coupon.vo.CouponAppVO; +import com.tmerclub.cloud.coupon.vo.CouponVO; + +import java.util.List; + +/** + * 优惠券 + * + * @author YXF + * @date 2020-12-08 17:22:56 + */ +public interface CouponService { + + /** + * 分页获取优惠券列表 + * + * @param pageDTO 分页参数 + * @param couponDTO + * @return 优惠券列表分页数据 + */ + PageVO page(PageDTO pageDTO, CouponDTO couponDTO); + + /** + * 根据店铺id,获取优惠券列表 + * + * @param shopId + * @return 优惠券列表 + */ + List getShopCouponList(Long shopId); + + /** + * 根据优惠券id,获取优惠券及关联商品信息 + * + * @param couponId + * @return 优惠券列表 + */ + CouponVO getCouponAndProdData(Long couponId); + + /** + * 根据优惠券id获取优惠券 + * + * @param couponId 优惠券id + * @return 优惠券 + */ + Coupon getByCouponId(Long couponId); + + /** + * 保存优惠券 + * + * @param couponDTO + */ + void save(CouponDTO couponDTO); + + /** + * 更新优惠券 + * + * @param couponDTO 优惠券 + */ + void update(CouponDTO couponDTO); + + /** + * 根据优惠券id删除优惠券(逻辑删除) + * + * @param couponId + */ + void deleteById(Long couponId); + + /** + * 根据优惠券id,获取优惠券及关联的商品列表信息 + * + * @param couponId + * @return + */ + CouponVO getCouponAndCouponProdsByCouponId(Long couponId); + + /** + * 发放优惠券给用户 + * + * @param couponIds + * @param userId + */ + void batchBindCouponByCouponIds(List couponIds, Long userId); + + /** + * 根据优惠券id,获取商品列表 + * + * @param pageDTO + * @param productSearch + * @param couponId + * @return + */ + EsPageVO spuListByCouponId(PageDTO pageDTO, ProductSearchDTO productSearch, Long couponId); + + /** + * 用户领取优惠券 + * + * @param couponId + */ + void receive(Long couponId); + + /** + * 获取用户所有的或者指定状态下的优惠券分页列表 + * + * @param page + * @param type 类型 0:所有 1:平台优惠券 2:店铺优惠券 + * @param status 优惠券状态 0:已过期 2:已使用 + * @return + */ + PageVO getUserCouponPage(PageDTO page, Long type, Integer status); + + /** + * 店铺优惠券列表 + * + * @param userId + * @return + */ + List generalCouponList(Long userId); + + /** + * 商品优惠券列表 + * + * @param page + * @param userId + * @return + */ + PageVO getProdCouponPage(PageDTO page, Long userId); + + /** + * 根据优惠券id列表,获取优惠券列表 + * + * @param couponIds + * @return + */ + List getCouponListByCouponIds(List couponIds); + + /** + * 根据店铺和用户id,获取优惠券列表 + * + * @param userId + * @param shopId + * @return + */ + List getCouponListByUserIdAndShopId(Long userId, Long shopId); + + /** + * 清除优惠券缓存 + * + * @param shopId + * @param couponId + */ + void removeCacheByShopId(Long shopId, Long couponId); + + /** + * 平台端优惠券管理分页 + * + * @param pageDTO + * @param couponDTO + * @return + */ + PageVO adminPage(PageDTO pageDTO, CouponDTO couponDTO); + + /** + * 更新活动投放状态、过期状态 + * + * @param couponId + * @param putOnStatus 投放状态 + * @param status 过期状态 + */ + void changeCouponStatusAndPutOnStatus(Long couponId, Integer putOnStatus, Integer status); + + /** + * 平台下架优惠券 + * + * @param offlineHandleEventDto + */ + void offline(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 获取下线的事件记录 + * + * @param couponId + * @return + */ + OfflineHandleEventVO getOfflineHandleEvent(Long couponId); + + /** + * 平台审核商家提交的申请 + * + * @param offlineHandleEventDto + * @param coupon + */ + void audit(OfflineHandleEventDTO offlineHandleEventDto, Coupon coupon); + + /** + * 违规活动提交审核 + * + * @param offlineHandleEventDto + */ + void auditApply(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 根据优惠券id列表,投放状态,获取优惠券列表 + * + * @param couponIds + * @param putOnStatus + * @return + */ + List getCouponListByCouponIdsAndPutOnStatus(List couponIds, Integer putOnStatus); + + /** + * 取消投放已过期的优惠券 + */ + void cancelPut(); + + /** + * 投放优惠券 + */ + void putonCoupon(); + + /** + * 处理商品下线 + * + * @param spuIds + * @param shopIds + */ + void handleSpuOffline(List spuIds, List shopIds); + + /** + * 下线店铺同时下架优惠券活动 + * + * @param shopIds + */ + void handleShopOffline(List shopIds); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponUserService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponUserService.java new file mode 100644 index 0000000..dfc48bd --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponUserService.java @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.service; + +import com.tmerclub.cloud.api.coupon.bo.CouponGiveBO; +import com.tmerclub.cloud.api.coupon.dto.BindCouponDTO; +import com.tmerclub.cloud.api.coupon.dto.ReceiveCouponDTO; +import com.tmerclub.cloud.api.coupon.vo.CouponUserCountDataVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.CouponOrderVO; +import com.tmerclub.cloud.coupon.bo.mongo.MongoCouponUserBO; +import com.tmerclub.cloud.coupon.dto.CouponUserDTO; +import com.tmerclub.cloud.coupon.vo.CouponAppVO; +import com.tmerclub.cloud.coupon.vo.mongo.MongoCouponUserCountVO; +import com.tmerclub.cloud.coupon.vo.mongo.MongoCouponUserVO; +import org.apache.ibatis.annotations.Param; + +import java.util.*; + +/** + * 优惠券用户关联信息 + * + * @author YXF + * @date 2020-12-08 17:22:57 + */ +public interface CouponUserService { + + /** + * 保存领券记录至mongodb + * @param mongoCouponUserBO + */ + void saveToMongodb(MongoCouponUserBO mongoCouponUserBO); + + /** + * 批量保存领券记录至mongodb + * @param list + */ + void saveBatchToMongodb(List list); + + /** + * 根据优惠券id和用户id,获取用户拥有该优惠券的数量 + * + * @param couponId + * @param usetId + * @return 用户拥有该优惠券的数量 + */ + long getUserHasCouponCount(Long couponId, Long usetId); + + /** + * 批量获取用户该优惠券(couponId)的数量 + * + * @param couponIds 优惠券ids + * @param userIds 用户ids + * @return 集合 + */ + List getCouponsCountForUsers(List couponIds, List userIds); + + /** + * 删除用户优惠券(逻辑删除) + * + * @param couponUserId + */ + void deleteUserCouponByCouponId(Long couponUserId); + + /** + * 获取用户优惠券的数量 + * + * @param userId + * @return key-- expiredCount:失效 allCount:全部 useCount:已使用 platformCount:平台券 multishopCount:店铺券 + */ + Map getCouponCountByStatus(Long userId); + + /** + * 获取用户优惠券id列表 + * + * @param coupons + * @param couponIds + * @return + */ + void listByAndShopIdOrSpuId(List coupons, List couponIds); + + /** + * 获取可使用的优惠券数量 + * + * @param userId + * @return 可使用的优惠券数量 + */ + Long countCanUseCoupon(Long userId); + + /** + * 统计用户优惠券相关数据 + * + * @param userId + * @param shopId + * @return + */ + CouponUserCountDataVO countCouponUserByUserId(Long userId, Long shopId); + + /** + * 赠送优惠券 + * + * @param couponGiveBO + */ + void giveCoupon(CouponGiveBO couponGiveBO); + + + /** + * 删除用户失效180天以上的优惠券 + * + * @param date 180天前 + */ + void deleteUnValidTimeCoupons(Date date); + + /** + * 设置用户的过期优惠券为失效状态 + */ + void updateStatusByTime(); + + /** + * 获取某个用户的优惠券明细 + * + * @param pageDTO 分页参数 + * @param couponUserDTO 条件查询参数 + * @return 用户的优惠券明细 + */ + PageVO getPageByUserId(PageDTO pageDTO, CouponUserDTO couponUserDTO); + + /** + * 批量发送优惠券给客户 + * + * @param bindCouponDTOList 多个用户发优惠券 + * @return 是否成功 + */ + Collection batchBindCoupon(List bindCouponDTOList); + + /** + * 增加优惠券库存 + * @param couponId + * @param stock + * @param userIdSet + */ + void addCouponStock(Long couponId, Integer stock, List userIdSet); + + /** + * 批量删除用户优惠券 + * + * @param bindCouponDTOList 多个用户失效多张优惠券 + * @return 是否成功 + */ + Collection batchDeleteUserCoupon(List bindCouponDTOList); + + /** + * 统计领取但未使用的优惠券数量 + * + * @param couponId 优惠券id + * @return + */ + long countUnUseCoupon(Long couponId); + + /** + * 统计用户领取优惠券数量 + * @param receiveCouponDTO + * @return + */ + List userReceiveCouponCount(ReceiveCouponDTO receiveCouponDTO); + + /** + * 批量更新优惠券状态 + * @param status + * @param userCouponIds + */ + void batchUpdateUserCouponStatus(Integer status, List userCouponIds); + + /** + * 还原订单使用的商家优惠券 + * @param couponUserId + */ + void reductionCoupon(List couponUserIds); + + /** + * 获取领券会员数 + * @param shopId 店铺id + * @param startTime 起始时间 + * @param endTime 结束时间 + * @return 领券会员数 + */ + List countMemberCouponByParam(Long shopId, Date startTime, Date endTime); + + /** + * 获取用户所有的或者指定状态下的优惠券列表 + * @param page + * @param userId 用户id + * @param type 类型 0:所有 1:平台优惠券 2:店铺优惠券 + * @param status 优惠券状态 0:已过期 2:已使用 + * @return + */ + PageVO pageUserCoupon(PageDTO page, Long userId, Long type, Integer status); + + /** + * 补充领券记录信息 + * @param couponList + * @param userId + * @return + */ + List setCouponUserInfo(List couponList, Long userId); + + /** + * 根据店铺和用户id,获取优惠券列表 + * @param userId + * @param shopId + * @return + */ + List getCouponListByUserIdAndShopId(Long userId, Long shopId); + + /** + * 初始化领券记录到mongodb + */ + void initCouponUserToMongodb(); + + /** + * 获取领券数量 + * @param couponId + * @return + */ + int countReceiveCoupon(Long couponId); + + /** + * 获取是否有领券记录 + * @param couponUserIds + * @return + */ + List listCouponUserIdsByIds(List couponUserIds); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponLockServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponLockServiceImpl.java new file mode 100644 index 0000000..a18cd26 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponLockServiceImpl.java @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.google.common.collect.Lists; +import com.tmerclub.cloud.api.coupon.constant.UserCouponStatus; +import com.tmerclub.cloud.api.coupon.dto.LockCouponDTO; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.coupon.mapper.CouponLockMapper; +import com.tmerclub.cloud.coupon.mapper.CouponUserMapper; +import com.tmerclub.cloud.coupon.model.CouponLock; +import com.tmerclub.cloud.coupon.service.CouponLockService; +import com.tmerclub.cloud.coupon.service.CouponUserService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 优惠券使用记录 + * + * @author FrozenWatermelon + * @date 2020-12-28 10:04:50 + */ +@Service +public class CouponLockServiceImpl implements CouponLockService { + + @Autowired + private CouponLockMapper couponLockMapper; + @Autowired + private CouponUserService couponUserService; + @DubboReference + private OrderFeignClient orderFeignClient; + @Autowired + private RocketMQTemplate couponMqTemplate; + + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity lockCoupon(List lockCouponParams) { + List couponLocks = Lists.newArrayList(); + Long userId = AuthUserContext.get().getUserId(); + List userCouponIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + Set orderIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (LockCouponDTO lockCouponParam : lockCouponParams) { + CouponLock couponLock = new CouponLock(); + couponLock.setAmount(lockCouponParam.getReduceAmount()); + // 获取用户优惠券id + couponLock.setCouponUserId(lockCouponParam.getCouponUserId()); + userCouponIds.add(lockCouponParam.getCouponUserId()); + couponLock.setUserId(userId); + couponLock.setOrderIds(lockCouponParam.getOrderIds()); + if (couponLock.getOrderIds().contains(StrUtil.COMMA)) { + for (String orderId : couponLock.getOrderIds().split(StrUtil.COMMA)) { + orderIds.add(Long.valueOf(orderId)); + } + } else { + orderIds.add(Long.valueOf(couponLock.getOrderIds())); + } + //优惠券记录为冻结状态 + couponLock.setStatus(0); + + couponLocks.add(couponLock); + } + // 批量保存使用记录 + couponLockMapper.saveBatch(couponLocks); + // 批量将用户的优惠券变成已使用状态 + couponUserService.batchUpdateUserCouponStatus(UserCouponStatus.USED.getValue(), userCouponIds); + + // 发送消息一个小时后解锁优惠券(包括哪些订单) + SendStatus sendStatus = couponMqTemplate.syncSend(RocketMqConstant.COUPON_UNLOCK_TOPIC, new GenericMessage<>(orderIds), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL + 1).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION, new Object()); + } + + return ServerResponseEntity.success(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void unlockCoupon(List orderIds) { + ServerResponseEntity> ordersStatusResponse = orderFeignClient.getOrdersStatus(orderIds); + if (!ordersStatusResponse.isSuccess()) { + throw new LuckException(ordersStatusResponse.getMsg()); + } + List orderStatusList = ordersStatusResponse.getData(); + List needCouponUserIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderStatusBO orderStatusBO : orderStatusList) { + // 该订单没有下单成功,或订单已取消,赶紧解锁库存 + if (orderStatusBO.getStatus() == null || Objects.equals(orderStatusBO.getStatus(), OrderStatus.CLOSE.value())) { + List couponUserIds = couponLockMapper.listCouponUserIdsByOrderId(orderStatusBO.getOrderId()); + needCouponUserIds.addAll(couponUserIds); + } + } + + if (CollectionUtil.isEmpty(needCouponUserIds)) { + return; + } + + // 将锁定状态标记为已解锁 + int updateStatus = couponLockMapper.unLockByIds(needCouponUserIds); + if (updateStatus == 0) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + // 批量将用户的优惠券变成未使用状态 + couponUserService.batchUpdateUserCouponStatus(UserCouponStatus.EFFECTIVE.getValue(), needCouponUserIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void markerCouponUse(List orderIds) { + couponLockMapper.markerCouponUse(orderIds); + } + + @Override + public void reductionCoupon(Long orderId) { + List couponLocks = couponLockMapper.getUserCouponIdByOrderId(String.valueOf(orderId)); + Iterator iterator = couponLocks.iterator(); + while (iterator.hasNext()) { + CouponLock couponLock = iterator.next(); + if (!couponLock.getOrderIds().contains(StrUtil.COMMA)) { + continue; + } + // 多个订单,需要校验是否全部退款成功 + List orderIds = Arrays.stream(couponLock.getOrderIds().split(StrUtil.COMMA)).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList()); + orderIds.remove(orderId); + ServerResponseEntity> ordersStatusResponse = orderFeignClient.getOrdersStatus(orderIds); + if (!ordersStatusResponse.isSuccess()) { + throw new LuckException(ordersStatusResponse.getMsg()); + } + List orderStatusList = ordersStatusResponse.getData(); + List closeList = orderStatusList.stream().filter(status -> Objects.equals(status.getStatus(), OrderStatus.CLOSE.value())).toList(); + if (!Objects.equals(closeList.size(), orderStatusList.size())) { + // 没有全部退款成功 + iterator.remove(); + } + } + if (CollUtil.isNotEmpty(couponLocks)) { + List couponUserIds = couponLocks.stream().map(CouponLock::getCouponUserId).collect(Collectors.toList()); + couponUserService.reductionCoupon(couponUserIds); + } + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponServiceImpl.java new file mode 100644 index 0000000..9e20d26 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponServiceImpl.java @@ -0,0 +1,892 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.coupon.constant.CouponType; +import com.tmerclub.cloud.api.coupon.constant.PutOnStatus; +import com.tmerclub.cloud.api.coupon.vo.CouponDataVO; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.user.feign.PopupFeignClient; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.cache.bo.MultiDecrementBO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.enums.MultiStockEnum; +import com.tmerclub.cloud.common.cache.manager.MultiRedisStockManager; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.JumpType; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.vo.CouponOrderVO; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.dto.ProductSearchLimitDTO; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.coupon.bo.mongo.MongoCouponUserBO; +import com.tmerclub.cloud.coupon.constant.CouponConstant; +import com.tmerclub.cloud.coupon.constant.CouponStatus; +import com.tmerclub.cloud.coupon.constant.SuitableProdType; +import com.tmerclub.cloud.coupon.constant.ValidTimeType; +import com.tmerclub.cloud.coupon.dto.CouponDTO; +import com.tmerclub.cloud.coupon.manager.CouponStockManager; +import com.tmerclub.cloud.coupon.mapper.CouponMapper; +import com.tmerclub.cloud.coupon.model.Coupon; +import com.tmerclub.cloud.coupon.service.CouponService; +import com.tmerclub.cloud.coupon.service.CouponSpuService; +import com.tmerclub.cloud.coupon.service.CouponUserService; +import com.tmerclub.cloud.coupon.vo.CouponAppVO; +import com.tmerclub.cloud.coupon.vo.CouponVO; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 优惠券 + * + * @author YXF + */ +@Service +public class CouponServiceImpl implements CouponService { + + private static final Logger logger = LoggerFactory.getLogger(CouponServiceImpl.class); + + @Autowired + private CouponMapper couponMapper; + @Autowired + private CouponSpuService couponSpuService; + @Autowired + private CouponUserService couponUserService; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private OfflineHandleEventFeignClient offlineHandleEventFeignClient; + @DubboReference + private UserFeignClient userFeignClient; + @Autowired + private RedissonClient redissonClient; + @Autowired + private CouponStockManager couponStockManager; + @Autowired + private SegmentManager segmentManager; + @Autowired + private MultiRedisStockManager multiRedisStockManager; + @DubboReference + private PopupFeignClient popupFeignClient; + + @Override + public PageVO page(PageDTO pageDTO, CouponDTO couponDTO) { + PageVO page = PageUtil.doPage(pageDTO, () -> couponMapper.list(couponDTO)); + for (CouponVO couponVO : page.getList()) { + if (Objects.equals(couponVO.getStatus(), CouponStatus.NO_OVERDUE.value()) && Objects.equals(couponVO.getPutonStatus(), PutOnStatus.PUT_ON.value())) { + // 正在投放的优惠券的库存 + Integer stock = couponStockManager.getStockByCouponId(couponVO.getCouponId()); + couponVO.setStocks(stock); + } + } + return page; + } + + @Override + @Cacheable(cacheNames = CacheNames.COUPON_LIST_BY_SHOP_KEY, key = "#shopId") + public List getShopCouponList(Long shopId) { + List coupons = couponMapper.getAvailableShopCouponList(shopId); + if (CollectionUtil.isEmpty(coupons)) { + return coupons; + } + Set spuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + CouponAppVO couponAppVO = coupons.get(0); + String shopName = ""; + if (!Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + ServerResponseEntity shopResponse = shopDetailFeignClient.getShopByShopId(couponAppVO.getShopId()); + if (!Objects.equals(shopResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(shopResponse.getMsg()); + } + shopName = shopResponse.getData().getShopName(); + } + for (CouponAppVO coupon : coupons) { + coupon.setShopName(shopName); + spuIds.addAll(coupon.getSpuIds()); + coupon.setHasReceive(CouponAppVO.NOT_RECEIVE); + } + if (CollUtil.isEmpty(spuIds)) { + return coupons; + } + if (CollectionUtil.isNotEmpty(spuIds)) { + ServerResponseEntity> spuListResponse = searchSpuFeignClient.listSpuBySpuIds(new ArrayList<>(spuIds)); + for (CouponAppVO coupon : coupons) { + List spuList = spuListResponse.getData() + .stream() + .filter(spuSearch -> CollUtil.isNotEmpty(coupon.getSpuIds()) && coupon.getSpuIds().contains(spuSearch.getSpuId())) + .collect(Collectors.toList()); + coupon.setSpus(spuList); + } + } + coupons.sort(Comparator.comparingLong(CouponAppVO::getCashCondition)); + return coupons; + } + + @Override + @Cacheable(cacheNames = CacheNames.COUPON_AND_SPU_DATA, key = "#couponId") + public CouponVO getCouponAndProdData(Long couponId) { + CouponVO coupon = couponMapper.getCouponAndCouponProdsByCouponId(couponId); + if (Objects.isNull(coupon) || CollUtil.isEmpty(coupon.getSpuIds())) { + return coupon; + } + ServerResponseEntity> spusRespon = searchSpuFeignClient.listSpuBySpuIds(coupon.getSpuIds()); + coupon.setSpus(spusRespon.getData()); + return coupon; + } + + @Override + public Coupon getByCouponId(Long couponId) { + return couponMapper.getByCouponId(couponId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(CouponDTO couponDTO) { + checkCoupon(couponDTO); + Coupon coupon = BeanUtil.map(couponDTO, Coupon.class); + coupon.setTotalStock(coupon.getStocks()); + //判断为领取后生效类型时,开始时间和结束时间为空 + if (Objects.equals(coupon.getValidTimeType(), ValidTimeType.RECEIVE.value())) { + coupon.setEndTime(null); + coupon.setStartTime(null); + } + // 结束时间小于等于当前时间 + Date nowTime = new Date(); + if (coupon.getValidTimeType() == 1 && coupon.getEndTime().getTime() < nowTime.getTime()) { + coupon.setStatus(CouponStatus.OVERDUE.value()); + coupon.setPutonStatus(PutOnStatus.CANCEL.value()); + } + if (Objects.equals(coupon.getPutonStatus(), PutOnStatus.PUT_ON.value())) { + coupon.setLaunchTime(new Date()); + } + couponMapper.save(coupon); + if (Objects.isNull(coupon.getCouponId())) { + throw new LuckException("优惠券数据保存异常,请刷新后重试"); + } + if (Objects.equals(coupon.getSuitableProdType(), SuitableProdType.ASSIGN_SPU.value())) { + // 保存优惠券商品关联信息 + couponSpuService.save(coupon.getCouponId(), couponDTO.getSpuIds()); + } + // 把库存存入redis + MultiDecrementBO multiDecrementBO = new MultiDecrementBO(MultiStockEnum.COUPON, null, null, + coupon.getCouponId(), coupon.getCouponId(), null, null, null); + multiRedisStockManager.doCouponZone(multiDecrementBO, coupon.getTotalStock()); + // 删除商品缓存 + removeSpuCache(coupon.getShopId(), couponDTO.getSpuIds()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void update(CouponDTO couponDTO) { + checkCoupon(couponDTO); + CouponVO dbCoupon = couponMapper.getCouponAndCouponProdsByCouponId(couponDTO.getCouponId()); + if (!PutOnStatus.offline(couponDTO.getPutonStatus()) && PutOnStatus.offline(dbCoupon.getPutonStatus())) { + throw new LuckException("优惠券已下线,不能修改状态"); + } else if (!Objects.equals(dbCoupon.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + couponDTO.setStatus(null); + // 结束时间小于等于当前时间 + if (Objects.equals(couponDTO.getValidTimeType(), ValidTimeType.FIXED.value()) + && !Objects.equals(dbCoupon.getStatus(), StatusEnum.DELETE.value())) { + Date nowTime = new Date(); + if (couponDTO.getEndTime().getTime() < nowTime.getTime()) { + couponDTO.setStatus(CouponStatus.OVERDUE.value()); + couponDTO.setPutonStatus(PutOnStatus.CANCEL.value()); + } else { + couponDTO.setStatus(CouponStatus.NO_OVERDUE.value()); + } + } + boolean isPutOn = Objects.equals(dbCoupon.getPutonStatus(), PutOnStatus.WAIT_PUT_ON.value()) && Objects.equals(couponDTO.getPutonStatus(), PutOnStatus.PUT_ON.value()); + if (isPutOn) { + couponDTO.setLaunchTime(new Date()); + } + couponMapper.updateCoupon(couponDTO); + // 更新优惠券商品关联信息 + couponSpuService.update(couponDTO, dbCoupon); + // 投放状态及商品列表没有改变, 不需要更新缓存 + boolean notRemoveCahce = Objects.equals(couponDTO.getPutonStatus(), dbCoupon.getPutonStatus()) && + new HashSet<>(couponDTO.getSpuIds()).containsAll(dbCoupon.getSpuIds()) && + Objects.equals(couponDTO.getSuitableProdType(), dbCoupon.getSuitableProdType()); + if (notRemoveCahce) { + return; + } + boolean cancelBinding = Objects.equals(dbCoupon.getShopId(), Constant.PLATFORM_SHOP_ID) && + !Objects.equals(couponDTO.getPutonStatus(), dbCoupon.getPutonStatus()) && + Objects.equals(dbCoupon.getPutonStatus(), PutOnStatus.PUT_ON.value()); + if (cancelBinding) { + ServerResponseEntity responseEntity = userFeignClient.cancelBindingCoupons(Collections.singletonList(couponDTO.getCouponId())); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + } + if (!Objects.equals(couponDTO.getPutonStatus(), PutOnStatus.PUT_ON.value())) { + // 删除关联弹窗 + ServerResponseEntity response = popupFeignClient.deleteLink(dbCoupon.getCouponId(), dbCoupon.getShopId(), JumpType.COUPON.value(), null); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + // 清除关联商品缓存 + List spuIds = couponDTO.getSpuIds(); + if (!Objects.equals(couponDTO.getSuitableProdType(), dbCoupon.getSuitableProdType())) { + spuIds.clear(); + } else if (Objects.equals(couponDTO.getSuitableProdType(), SuitableProdType.ASSIGN_SPU.value())) { + spuIds = CollUtil.addAllIfNotContains(dbCoupon.getSpuIds(), couponDTO.getSpuIds()); + } + removeSpuCache(couponDTO.getShopId(), spuIds); + // 优惠券缓存落库 + couponStockManager.couponStockPlacement(Collections.singletonList(couponDTO.getCouponId()), false); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void deleteById(Long couponId) { + CouponVO dbCoupon = getCouponAndCouponProdsByCouponId(couponId); + if (!Objects.equals(dbCoupon.getShopId(), AuthUserContext.get().getTenantId()) && !Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + Coupon coupon = new Coupon(); + coupon.setCouponId(couponId); + coupon.setStatus(StatusEnum.DELETE.value()); + couponMapper.update(coupon); + removeSpuCache(dbCoupon.getShopId(), dbCoupon.getSpuIds()); + if (Objects.equals(dbCoupon.getShopId(), Constant.PLATFORM_SHOP_ID)) { + ServerResponseEntity responseEntity = userFeignClient.cancelBindingCoupons(Collections.singletonList(dbCoupon.getCouponId())); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + } + // 删除关联弹窗 + ServerResponseEntity response = popupFeignClient.deleteLink(couponId, dbCoupon.getShopId(), JumpType.COUPON.value(), null); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + // 优惠券缓存落库 + couponStockManager.couponStockPlacement(Collections.singletonList(couponId), true); + } + + @Override + public CouponVO getCouponAndCouponProdsByCouponId(Long couponId) { + CouponVO coupon = couponMapper.getCouponAndCouponProdsByCouponId(couponId); + if (Objects.isNull(coupon) || Objects.equals(coupon.getSuitableProdType(), SuitableProdType.ALL_SPU.value())) { + return coupon; + } + ServerResponseEntity> spuResponse = searchSpuFeignClient.listSpuBySpuIds(coupon.getSpuIds()); + coupon.setSpus(spuResponse.getData()); + return coupon; + } + + @Override + public void batchBindCouponByCouponIds(List couponIds, Long userId) { + List couponUsers = new ArrayList<>(Constant.INITIAL_CAPACITY); + List coupons = couponMapper.getListByCouponIds(couponIds); + if (CollUtil.isEmpty(coupons)) { + return; + } + for (Coupon coupon : coupons) { + Long couponId = coupon.getCouponId(); + Date nowTime = new Date(); + // 当优惠券状态不为投放时 + if (Objects.equals(coupon.getStatus(), StatusEnum.DISABLE.value()) + || !Objects.equals(coupon.getPutonStatus(), PutOnStatus.PUT_ON.value()) + || coupon.getStocks() < 1) { + logger.warn("优惠券:{}无法被领取或者该券领完了!", couponId); + continue; + } + long count = couponUserService.getUserHasCouponCount(couponId, userId); + if (count >= coupon.getLimitNum()) { + logger.warn("用户:{},的优惠券:{}已达个人领取上限,无法继续领取", userId, couponId); + continue; + } + if (Objects.equals(coupon.getStatus(), CouponStatus.NO_OVERDUE.value()) + && Objects.equals(coupon.getPutonStatus(), PutOnStatus.PUT_ON.value())) { + // 正在投放的优惠券的库存 + Integer stock = couponStockManager.getStockByCouponId(couponId); + coupon.setStocks(stock); + } + Long couponUserId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_COUPON_USER); + MongoCouponUserBO couponUser = getCouponUser(userId, coupon, nowTime, couponUserId); + // 减少优惠券的库存 + MultiDecrementBO multiDecrementBO = new MultiDecrementBO(MultiStockEnum.COUPON, userId, couponUserId, couponId, + couponId, 1, coupon.getLimitNum(), null); + if (couponStockManager.decrStocks(multiDecrementBO)) { + // 扣减成功 + couponUsers.add(couponUser); + } + // 清除缓存 + removeCacheByShopId(coupon.getShopId(), couponId); + } + if (CollUtil.isEmpty(couponUsers)) { + return; + } + // 存储领券记录和删除锁定记录 + couponStockManager.saveLogAndDeleteLock(couponUsers); + } + + private MongoCouponUserBO getCouponUser(Long userId, Coupon coupon, Date nowTime, Long couponUserId) { + MongoCouponUserBO couponUser = new MongoCouponUserBO(); + couponUser.setCouponUserId(couponUserId); + couponUser.setUserId(userId); + couponUser.setShopId(coupon.getShopId()); + couponUser.setStatus(StatusEnum.ENABLE.value()); + couponUser.setCouponId(coupon.getCouponId()); + couponUser.setReceiveTime(nowTime); + // 生效时间类型为固定时间 + if (Objects.equals(coupon.getValidTimeType(), ValidTimeType.FIXED.value())) { + couponUser.setUserStartTime(coupon.getStartTime()); + couponUser.setUserEndTime(coupon.getEndTime()); + } + // 生效时间类型为领取后生效 + if (Objects.equals(coupon.getValidTimeType(), ValidTimeType.RECEIVE.value())) { + if (coupon.getAfterReceiveDays() == null) { + coupon.setAfterReceiveDays(0); + } + if (coupon.getValidDays() == null) { + coupon.setValidDays(0); + } + couponUser.setUserStartTime(DateUtils.addDays(DateUtil.beginOfDay(nowTime), coupon.getAfterReceiveDays())); + couponUser.setUserEndTime(DateUtils.addDays(couponUser.getUserStartTime(), coupon.getValidDays())); + } + couponUser.setIsDelete(0); + return couponUser; + } + + @Override + public EsPageVO spuListByCouponId(PageDTO pageDTO, ProductSearchDTO productSearch, Long couponId) { + CouponServiceImpl couponService = (CouponServiceImpl) AopContext.currentProxy(); + CouponVO coupon = couponService.getCouponAndProdData(couponId); + if (Objects.isNull(coupon)) { + throw new LuckException("该优惠券不存在"); + } + if (Objects.equals(coupon.getStatus(), CouponStatus.NO_OVERDUE.value()) && Objects.equals(coupon.getPutonStatus(), PutOnStatus.PUT_ON.value())) { + // 正在投放的优惠券的库存 + Integer stock = couponStockManager.getStockByCouponId(coupon.getCouponId()); + coupon.setStocks(stock); + } + // 全部商品 + if (Objects.equals(coupon.getSuitableProdType(), SuitableProdType.ALL_SPU.value()) && !Objects.equals(coupon.getShopId(), Constant.PLATFORM_SHOP_ID)) { + productSearch.setShopId(coupon.getShopId()); + List notProdTypes = new ArrayList<>(); + notProdTypes.add(SpuType.GROUP.value()); + notProdTypes.add(SpuType.SECKILL.value()); + productSearch.setMustNotProdTypes(notProdTypes); + } + // 指定商品 + else { + productSearch.setSpuIds(coupon.getSpuIds()); + } + productSearch.setPageSize(pageDTO.getPageSize()); + productSearch.setPageNum(pageDTO.getPageNum()); + ServerResponseEntity> spuPageResponse = searchSpuFeignClient.search(productSearch); + return spuPageResponse.getData(); + } + + @Override + public void receive(Long couponId) { + Coupon coupon = couponMapper.getByCouponId(couponId); + long currentTime = System.currentTimeMillis(); + // 优惠券已过期、未投放或者超出结束时间,都不能再领取 + boolean cannotReceive = !Objects.equals(coupon.getStatus(), CouponStatus.NO_OVERDUE.value()) || + !Objects.equals(coupon.getPutonStatus(), PutOnStatus.PUT_ON.value()) || + (Objects.nonNull(coupon.getEndTime()) && currentTime >= coupon.getEndTime().getTime()); + if (cannotReceive) { + throw new LuckException("优惠券已结束领取"); + } + Long userId = AuthUserContext.get().getUserId(); + long count = couponUserService.getUserHasCouponCount(coupon.getCouponId(), userId); + if (count >= coupon.getLimitNum()) { + throw new LuckException("该优惠券已达个人领取上限,无法继续领取"); + } + + Long couponUserId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_COUPON_USER); + // 减少优惠券的库存 + MultiDecrementBO multiDecrementBO = new MultiDecrementBO(MultiStockEnum.COUPON, userId, couponUserId, couponId, + couponId, 1, coupon.getLimitNum(), null); + multiRedisStockManager.decrStocks(multiDecrementBO); + + // 存储领券记录和删除锁定记录 + MongoCouponUserBO couponUser = getCouponUser(userId, coupon, new Date(), couponUserId); + couponStockManager.saveLogAndDeleteLock(Collections.singletonList(couponUser)); + } + + @Override + public PageVO getUserCouponPage(PageDTO page, Long type, Integer status) { + PageVO couponPage = couponUserService.pageUserCoupon(page, AuthUserContext.get().getUserId(), type, status); + List couponDtoList = couponPage.getList(); + Set shopSet = couponDtoList.stream().map(CouponAppVO::getShopId).collect(Collectors.toSet()); + ServerResponseEntity> shopResponse = shopDetailFeignClient.listByShopIds(new ArrayList<>(shopSet)); + Map shopMap = shopResponse.getData().stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName)); + for (CouponAppVO coupon : couponDtoList) { + if (Objects.equals(coupon.getValidTimeType(), ValidTimeType.RECEIVE.value())) { + Integer afterReceiveDays = coupon.getAfterReceiveDays(); + if (Objects.isNull(coupon.getAfterReceiveDays())) { + afterReceiveDays = 0; + } + Integer validDays = coupon.getValidDays(); + if (validDays == null) { + validDays = 0; + } + coupon.setStartTime(DateUtil.offsetDay(coupon.getReceiveTime(), afterReceiveDays)); + coupon.setEndTime(DateUtil.offsetDay(coupon.getStartTime(), validDays)); + } + coupon.setShopName(shopMap.get(coupon.getShopId())); + } + return couponPage; + } + + @Override + public List generalCouponList(Long userId) { + List couponList = couponMapper.generalCouponList(userId); + if (Objects.nonNull(userId) && CollUtil.isNotEmpty(couponList)) { + // 补充领券记录 + couponList = couponUserService.setCouponUserInfo(couponList, userId); + } + for (CouponAppVO coupon : couponList) { + if (Objects.equals(coupon.getStatus(), CouponStatus.NO_OVERDUE.value()) && Objects.equals(coupon.getPutonStatus(), PutOnStatus.PUT_ON.value())) { + // 正在投放的优惠券的库存 + Integer stock = couponStockManager.getStockByCouponId(coupon.getCouponId()); + coupon.setStocks(stock); + } + } + return couponList; + } + + @Override + public PageVO getProdCouponPage(PageDTO pageDTO, Long userId) { + PageVO couponPage = new PageVO<>(); + List coupons = couponMapper.getProdCouponList(new PageAdapter(pageDTO), userId); + if (Objects.nonNull(userId)) { + coupons = couponUserService.setCouponUserInfo(coupons, userId); + } + couponPage.setTotal(couponMapper.getProdCouponListCount()); + couponPage.setPages(PageUtil.getPages(couponPage.getTotal(), pageDTO.getPageSize())); + couponPage.setList(coupons); + Set spuUnionShopIds = new HashSet<>(Constant.INITIAL_CAPACITY); + Set shopIds = new HashSet<>(Constant.INITIAL_CAPACITY); + Set spuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (CouponAppVO couponVO : coupons) { + // 正在投放的优惠券的库存 + Integer stock = couponStockManager.getStockByCouponId(couponVO.getCouponId()); + couponVO.setStocks(stock); + shopIds.add(couponVO.getShopId()); + if (Objects.equals(couponVO.getSuitableProdType(), SuitableProdType.ALL_SPU.value())) { + spuUnionShopIds.add(couponVO.getShopId()); + continue; + } + int start = 1; + for (Long spuId : couponVO.getSpuIds()) { + if (start > Constant.SIZE_OF_THREE) { + break; + } + start++; + spuIds.add(spuId); + } + } + loadSpuData(new ArrayList<>(spuUnionShopIds), new ArrayList<>(spuIds), new ArrayList<>(shopIds), coupons); + return couponPage; + } + + @Override + public List getCouponListByCouponIds(List couponIds) { + if (CollUtil.isEmpty(couponIds)) { + return Collections.emptyList(); + } + return couponMapper.getCouponListByCouponIds(couponIds, null); + } + + @Override + public List getCouponListByUserIdAndShopId(Long userId, Long shopId) { + List list = couponUserService.getCouponListByUserIdAndShopId(userId, shopId); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(); + } + Set couponIds = list.stream().map(CouponOrderVO::getCouponId).collect(Collectors.toSet()); + Map> couponMap = list.stream().collect(Collectors.groupingBy(CouponOrderVO::getCouponId)); + List resList = couponMapper.getCouponListByUserIdAndShopId(new ArrayList<>(couponIds)); + for (CouponOrderVO couponOrderVO : resList) { + List couponOrderList = couponMap.get(couponOrderVO.getCouponId()); + for (CouponOrderVO couponUserInfo : couponOrderList) { + couponOrderVO.setStartTime(couponUserInfo.getStartTime()); + couponOrderVO.setEndTime(couponUserInfo.getEndTime()); + couponOrderVO.setCouponUserId(couponUserInfo.getCouponUserId()); + } + } + return resList; + } + + @Override + public void removeCacheByShopId(Long shopId, Long couponId) { + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.nonNull(shopId)) { + keys.add(CacheNames.COUPON_LIST_BY_SHOP_KEY + CacheNames.UNION + shopId); + } + if (Objects.nonNull(couponId)) { + keys.add(CacheNames.COUPON_AND_SPU_DATA + CacheNames.UNION + couponId); + } + RedisUtil.deleteBatch(keys); + } + + @Override + public PageVO adminPage(PageDTO pageDTO, CouponDTO couponDTO) { + if (StringUtils.isNotBlank(couponDTO.getShopName())) { + // 获取店铺id + List data = shopDetailFeignClient.getShopIdsByLikeShopName(couponDTO.getShopName()).getData(); + couponDTO.setShopIds(data); + } + PageVO page = PageUtil.doPage(pageDTO, () -> couponMapper.adminList(couponDTO)); + Set shopSet = page.getList().stream().map(CouponVO::getShopId).collect(Collectors.toSet()); + ServerResponseEntity> shopResponse = shopDetailFeignClient.listByShopIds(new ArrayList<>(shopSet)); + Map shopMap = shopResponse.getData().stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName)); + for (CouponVO coupon : page.getList()) { + if (Objects.equals(coupon.getStatus(), CouponStatus.NO_OVERDUE.value()) && Objects.equals(coupon.getPutonStatus(), PutOnStatus.PUT_ON.value())) { + // 正在投放的优惠券的库存 + Integer stock = couponStockManager.getStockByCouponId(coupon.getCouponId()); + coupon.setStocks(stock); + } + coupon.setShopName(shopMap.get(coupon.getShopId())); + } + return page; + } + + @Override + public void changeCouponStatusAndPutOnStatus(Long couponId, Integer putOnStatus, Integer status) { + couponMapper.changeCouponStatusAndPutOnStatus(couponId, putOnStatus, status); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void offline(OfflineHandleEventDTO offlineHandleEventDto) { + OfflineHandleEventDTO offlineHandleEvent = new OfflineHandleEventDTO(); + offlineHandleEvent.setHandleId(offlineHandleEventDto.getHandleId()); + offlineHandleEvent.setHandleType(OfflineHandleEventType.COUPON.getValue()); + offlineHandleEvent.setOfflineReason(offlineHandleEventDto.getOfflineReason()); + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.save(offlineHandleEvent); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 更新活动状态为下线状态 + changeCouponStatusAndPutOnStatus(offlineHandleEvent.getHandleId(), PutOnStatus.OFFLINE.value(), null); + // 删除关联弹窗 + ServerResponseEntity response = popupFeignClient.deleteLink(offlineHandleEvent.getHandleId(), offlineHandleEventDto.getShopId(), JumpType.COUPON.value(), null); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + + @Override + public OfflineHandleEventVO getOfflineHandleEvent(Long couponId) { + ServerResponseEntity offlineHandleEventResponse = + offlineHandleEventFeignClient.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.COUPON.getValue(), couponId, null); + return offlineHandleEventResponse.getData(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void audit(OfflineHandleEventDTO offlineHandleEventDto, Coupon coupon) { + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.auditOfflineEvent(offlineHandleEventDto); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 审核通过 + if (Objects.equals(offlineHandleEventDto.getStatus(), OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue())) { + changeCouponStatusAndPutOnStatus(offlineHandleEventDto.getHandleId(), PutOnStatus.WAIT_PUT_ON.value(), null); + } + // 审核不通过 + else if (Objects.equals(offlineHandleEventDto.getStatus(), OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue())) { + changeCouponStatusAndPutOnStatus(offlineHandleEventDto.getHandleId(), PutOnStatus.OFFLINE.value(), null); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void auditApply(OfflineHandleEventDTO offlineHandleEventDto) { + // 更新事件状态 + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.updateToApply(offlineHandleEventDto); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 更新优惠券为待审核状态 + changeCouponStatusAndPutOnStatus(offlineHandleEventDto.getHandleId(), PutOnStatus.WAIT_AUDIT.value(), null); + } + + @Override + public List getCouponListByCouponIdsAndPutOnStatus(List couponIds, Integer putOnStatus) { + return couponMapper.getCouponListByCouponIds(couponIds, putOnStatus); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void cancelPut() { + List coupons = couponMapper.cancelPutCouponIds(); + List couponIds = coupons.stream().map(Coupon::getCouponId).collect(Collectors.toList()); + List platformCouponIds = coupons.stream().filter(coupon -> Objects.equals(coupon.getShopId(), Constant.PLATFORM_SHOP_ID)).map(Coupon::getCouponId).collect(Collectors.toList()); + ServerResponseEntity responseEntity = userFeignClient.cancelBindingCoupons(platformCouponIds); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + couponMapper.cancelPut(); + // 删除关联弹窗 + List couponDataVOList = BeanUtil.mapAsList(coupons, CouponDataVO.class); + ServerResponseEntity response = popupFeignClient.deleteLinkBatch(couponDataVOList); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + // 优惠券缓存落库 + couponStockManager.couponStockPlacement(couponIds, true); + } + + @Override + public void putonCoupon() { + couponMapper.putonCoupon(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void handleSpuOffline(List spuIds, List shopIds) { + List couponList = couponMapper.listCouponBySpuIds(spuIds, shopIds); + if (CollUtil.isEmpty(couponList)) { + return; + } + List couponIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + Set shopSet = new HashSet<>(Constant.INITIAL_CAPACITY); + List offlineList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List offlineCouponList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (CouponVO couponVO : couponList) { + couponIds.add(couponVO.getCouponId()); + shopSet.add(couponVO.getShopId()); + // 活动不是启动状态,或 适用商品类型为:全部商品,则不进行后面的处理 + if (!Objects.equals(couponVO.getPutonStatus(), PutOnStatus.PUT_ON.value()) + || Objects.equals(SuitableProdType.ALL_SPU.value(), couponVO.getSuitableProdType())) { + continue; + } + couponVO.getSpuIds().removeAll(spuIds); + // 商品列表为空,则把活动添加到下线列表中 + if (CollUtil.isEmpty(couponVO.getSpuIds())) { + offlineCouponList.add(couponVO); + offlineList.add(couponVO.getCouponId()); + } + } + // 删除商品关联信息 + couponSpuService.deleteBySpuIds(spuIds); + // 商品列表为空的活动修改为暂不投放 + if (CollUtil.isNotEmpty(offlineList)) { + couponMapper.batchOfflineByDiscountIdsAndStatus(offlineList); + // 删除关联弹窗 + List couponDataVOList = BeanUtil.mapAsList(offlineCouponList, CouponDataVO.class); + ServerResponseEntity response = popupFeignClient.deleteLinkBatch(couponDataVOList); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + // 清除缓存 + batchRemoveCacheByShopId(couponIds, shopSet); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void handleShopOffline(List shopIds) { + if (CollUtil.isEmpty(shopIds)) { + return; + } + List couponIds = couponMapper.listIdByShopIds(shopIds); + if (CollUtil.isEmpty(couponIds)) { + return; + } + // 删除商品关联信息 + couponSpuService.deleteBatchByCouponIds(couponIds); + // 活动下线(设为过期,取消投放状态) + couponMapper.batchOfflineByCouponIds(couponIds); + // 库存落库 + couponStockManager.couponStockPlacement(couponIds, true); + // 清除缓存 + batchRemoveCacheByShopId(couponIds, new HashSet<>(shopIds)); + } + + private static void batchRemoveCacheByShopId(List couponIds, Set shopIds) { + if (CollUtil.isEmpty(couponIds) || CollUtil.isEmpty(shopIds)) { + return; + } + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long couponId : couponIds) { + keys.add(CacheNames.COUPON_AND_SPU_DATA + CacheNames.UNION + couponId); + + } + for (Long shopId : shopIds) { + keys.add(CacheNames.COUPON_LIST_BY_SHOP_KEY + CacheNames.UNION + shopId); + } + RedisUtil.deleteBatch(keys); + } + + /** + * 根据店铺、spuId,获取优惠券中的spu列表 + * + * @param spuUnionShopIds + * @param spuIds + * @param shopIds + * @param coupons + */ + private void loadSpuData(List spuUnionShopIds, List spuIds, List shopIds, List coupons) { + Map> spuUnionShopMap = null; + Map spuMap = new HashMap<>(spuIds.size()); + if (CollUtil.isNotEmpty(spuUnionShopIds)) { + ProductSearchLimitDTO productSearchLimitDTO = new ProductSearchLimitDTO(Constant.SIZE_OF_THREE); + productSearchLimitDTO.setShopIds(spuUnionShopIds); + ServerResponseEntity> spuResponse = searchSpuFeignClient.limitSpuList(productSearchLimitDTO); + spuUnionShopMap = spuResponse.getData().stream().collect(Collectors.groupingBy(SpuSearchVO::getShopId)); + } + if (CollUtil.isNotEmpty(spuIds)) { + ServerResponseEntity> spuResponse = searchSpuFeignClient.listSpuBySpuIds(spuIds); + spuMap.putAll(spuResponse.getData().stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, spu -> spu))); + } + ServerResponseEntity> shopResponse = shopDetailFeignClient.listByShopIds(shopIds); + Map shopMap = shopResponse.getData().stream().collect(Collectors.toMap(ShopDetailVO::getShopId, shop -> shop)); + + for (CouponAppVO coupon : coupons) { + if (Objects.equals(coupon.getSuitableProdType(), SuitableProdType.ALL_SPU.value())) { + if (spuUnionShopMap != null) { + coupon.setSpus(spuUnionShopMap.get(coupon.getShopId())); + } + } else { + coupon.setSpus(new ArrayList<>(Constant.SIZE_OF_THREE)); + int index = 1; + for (Long spuId : coupon.getSpuIds()) { + if (index > Constant.SIZE_OF_THREE) { + break; + } + index++; + SpuSearchVO spuSearchVO = spuMap.get(spuId); + if (Objects.nonNull(spuSearchVO)) { + coupon.getSpus().add(spuSearchVO); + } + } + } + ShopDetailVO shopDetailVO = shopMap.get(coupon.getShopId()); + if (Objects.nonNull(shopDetailVO)) { + coupon.setShopName(shopDetailVO.getShopName()); + coupon.setShopLogo(shopDetailVO.getShopLogo()); + } + } + } + + /** + * 校验优惠券的数据 + */ + private static void checkCoupon(CouponDTO couponDTO) { + if (Objects.equals(SuitableProdType.ASSIGN_SPU.value(), couponDTO.getSuitableProdType()) && CollUtil.isEmpty(couponDTO.getSpuIds())) { + throw new LuckException("请选择商品"); + } + if (couponDTO.getLimitNum() <= 0) { + throw new LuckException("优惠券限领数量需大于0"); + } + + if (Objects.isNull(couponDTO.getCashCondition()) || couponDTO.getCashCondition() <= 0L) { + throw new LuckException("使用条件不能为空,且大于0的整数"); + } + if (Objects.equals(couponDTO.getCouponType(), CouponType.C2M.value())) { + if (Objects.isNull(couponDTO.getReduceAmount()) || couponDTO.getReduceAmount() <= 0L) { + throw new LuckException("减免金额不能为空,且大于0的整数"); + } + if (couponDTO.getCashCondition() <= couponDTO.getReduceAmount()) { + throw new LuckException("减免金额必须小于使用条件"); + } + } else if (Objects.equals(couponDTO.getCouponType(), CouponType.C2D.value())) { + if (Objects.isNull(couponDTO.getCouponDiscount()) || couponDTO.getCouponDiscount() < CouponConstant.MIN_COUPON_DISCOUNT + || couponDTO.getCouponDiscount() > CouponConstant.MAX_COUPON_DISCOUNT) { + throw new LuckException("折扣额度不能为空,且大于等于" + CouponConstant.MIN_COUPON_DISCOUNT + "小于等于" + CouponConstant.MAX_COUPON_DISCOUNT); + } + } + + if (Objects.equals(couponDTO.getPutonStatus(), PutOnStatus.AUTO_LAUNCH.value()) && Objects.isNull(couponDTO.getLaunchTime())) { + throw new LuckException("优惠券投放时间不能为空"); + } + // 校验投放时间 + Date nowTime = new Date(); + List unCheckPutOnStatus = Arrays.asList( + PutOnStatus.PUT_ON.value(), + PutOnStatus.WAIT_PUT_ON.value(), + PutOnStatus.OFFLINE.value() + ); + if (Objects.nonNull(couponDTO.getLaunchTime()) + && couponDTO.getLaunchTime().getTime() < nowTime.getTime() + && !unCheckPutOnStatus.contains(couponDTO.getPutonStatus())) { + throw new LuckException("投放时间需大于当前时间"); + } + + boolean dateIsNull = Objects.isNull(couponDTO.getAfterReceiveDays()) || Objects.isNull(couponDTO.getValidDays()); + if (Objects.equals(couponDTO.getValidTimeType(), ValidTimeType.RECEIVE.value()) && dateIsNull) { + throw new LuckException("请输入时间范围"); + } else if (Objects.equals(couponDTO.getValidTimeType(), ValidTimeType.FIXED.value())) { + if (Objects.isNull(couponDTO.getStartTime()) || Objects.isNull(couponDTO.getEndTime())) { + throw new LuckException("请输入时间范围"); + } + if (couponDTO.getStartTime().getTime() > couponDTO.getEndTime().getTime()) { + throw new LuckException("开始时间需大于结束时间"); + } + } + } + + /** + * 清除优惠券关联的商品缓存 + */ + private void removeSpuCache(Long shopId, List spuIds) { + spuFeignClient.removeSpuActivityCache(shopId, spuIds); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponSpuServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponSpuServiceImpl.java new file mode 100644 index 0000000..d35e61d --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponSpuServiceImpl.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.coupon.constant.SuitableProdType; +import com.tmerclub.cloud.coupon.dto.CouponDTO; +import com.tmerclub.cloud.coupon.mapper.CouponSpuMapper; +import com.tmerclub.cloud.coupon.model.CouponSpu; +import com.tmerclub.cloud.coupon.service.CouponSpuService; +import com.tmerclub.cloud.coupon.vo.CouponVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 优惠券商品关联信息 + * + * @author YXF + * @date 2020-12-08 17:22:57 + */ +@Service +public class CouponSpuServiceImpl implements CouponSpuService { + + @Autowired + private CouponSpuMapper couponSpuMapper; + + @Override + public void save(Long couponId, List spuIds) { + List couponSpus = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long spuId : spuIds) { + CouponSpu couponSpu = new CouponSpu(); + couponSpu.setCouponId(couponId); + couponSpu.setSpuId(spuId); + couponSpus.add(couponSpu); + } + couponSpuMapper.saveBatch(couponSpus); + } + + @Override + public void update(CouponDTO couponDTO, CouponVO couponDb) { + List spuIds = new ArrayList<>(couponDTO.getSpuIds()); + // 适用商品类型发生改变 + if (!Objects.equals(couponDTO.getSuitableProdType(), couponDb.getSuitableProdType())) { + // 指定商品更新为所有商品--删除优惠券商品关联信息 + if (Objects.equals(couponDTO.getSuitableProdType(), SuitableProdType.ALL_SPU.value())) { + couponSpuMapper.deleteByCouponIdAndSpuIds(couponDTO.getCouponId(), null); + } + // 所有商品更新为指定商品--插入优惠券商品关联信息 + else { + save(couponDTO.getCouponId(), spuIds); + } + return; + } + // 适用商品类型没有改变, 且类型为所有商品 + if (Objects.equals(couponDTO.getSuitableProdType(), SuitableProdType.ALL_SPU.value())) { + return; + } + // 适用商品类型没有改变, 且类型为指定商品 + + spuIds.removeAll(couponDb.getSpuIds()); + if (CollUtil.isNotEmpty(spuIds)) { + save(couponDTO.getCouponId(), spuIds); + } + List deleteList = new ArrayList<>(couponDb.getSpuIds()); + deleteList.removeAll(couponDTO.getSpuIds()); + if (CollUtil.isNotEmpty(deleteList)) { + couponSpuMapper.deleteByCouponIdAndSpuIds(couponDb.getCouponId(), deleteList); + } + } + + @Override + public void deleteBySpuIds(List spuIds) { + couponSpuMapper.deleteBySpuIds(spuIds); + } + + @Override + public void deleteBatchByCouponIds(List couponIds) { + couponSpuMapper.deleteBatchByCouponIds(couponIds); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponUserServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponUserServiceImpl.java new file mode 100644 index 0000000..406f41d --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponUserServiceImpl.java @@ -0,0 +1,887 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.coupon.bo.CouponGiveBO; +import com.tmerclub.cloud.api.coupon.bo.CouponIdAndCountBO; +import com.tmerclub.cloud.api.coupon.constant.PutOnStatus; +import com.tmerclub.cloud.api.coupon.constant.UserCouponStatus; +import com.tmerclub.cloud.api.coupon.dto.BindCouponDTO; +import com.tmerclub.cloud.api.coupon.dto.ReceiveCouponDTO; +import com.tmerclub.cloud.api.coupon.vo.CouponUserCountDataVO; +import com.tmerclub.cloud.common.cache.bo.MultiDecrementBO; +import com.tmerclub.cloud.common.cache.enums.MultiStockEnum; +import com.tmerclub.cloud.common.cache.manager.MultiRedisStockManager; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.mongodb.util.MongoPageUtil; +import com.tmerclub.cloud.common.order.vo.CouponOrderVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.coupon.bo.AddCouponStockMsgBO; +import com.tmerclub.cloud.coupon.bo.mongo.MongoCouponUserBO; +import com.tmerclub.cloud.coupon.constant.CouponStatus; +import com.tmerclub.cloud.coupon.constant.ValidTimeType; +import com.tmerclub.cloud.coupon.dto.CouponUserDTO; +import com.tmerclub.cloud.coupon.manager.CouponStockManager; +import com.tmerclub.cloud.coupon.mapper.CouponGiveLogMapper; +import com.tmerclub.cloud.coupon.mapper.CouponLockMapper; +import com.tmerclub.cloud.coupon.mapper.CouponMapper; +import com.tmerclub.cloud.coupon.mapper.CouponUserMapper; +import com.tmerclub.cloud.coupon.model.Coupon; +import com.tmerclub.cloud.coupon.model.CouponGiveLog; +import com.tmerclub.cloud.coupon.model.CouponLock; +import com.tmerclub.cloud.coupon.model.CouponUser; +import com.tmerclub.cloud.coupon.service.CouponUserService; +import com.tmerclub.cloud.coupon.vo.CouponAppVO; +import com.tmerclub.cloud.coupon.vo.CouponVO; +import com.tmerclub.cloud.coupon.vo.mongo.MongoCouponOrderVO; +import com.tmerclub.cloud.coupon.vo.mongo.MongoCouponUserCountVO; +import com.tmerclub.cloud.coupon.vo.mongo.MongoCouponUserVO; +import org.apache.commons.lang3.time.DateUtils; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 优惠券用户关联信息 + * @author YXF + */ +@Service +public class CouponUserServiceImpl implements CouponUserService { + private static final Logger logger = LoggerFactory.getLogger(CouponUserServiceImpl.class); + + @Autowired + private CouponUserMapper couponUserMapper; + @Autowired + private CouponGiveLogMapper couponGiveLogMapper; + @Autowired + private CouponMapper couponMapper; + @Autowired + private CouponLockMapper couponLockMapper; + @Autowired + private CouponStockManager couponStockManager; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private SegmentManager segmentManager; + @Autowired + private MongoPageUtil mongoPageUtil; + @Autowired + private MultiRedisStockManager multiRedisStockManager; + @Autowired + private RocketMQTemplate sendAddCouponStockTemplate; + + @Override + public void saveToMongodb(MongoCouponUserBO mongoCouponUserBO) { + if (Objects.isNull(mongoCouponUserBO) || Objects.isNull(mongoCouponUserBO.getCouponUserId())) { + throw new LuckException("领券记录信息不全"); + } + mongoCouponUserBO.setCreateTime(new Date()); + mongoCouponUserBO.setUpdateTime(new Date()); + logger.info("领券记录保存至mongodb{}", mongoCouponUserBO); + mongoTemplate.save(mongoCouponUserBO); + } + + @Override + public void saveBatchToMongodb(List list) { + logger.info("批量保存领券记录到mongodb{}", list); + for (MongoCouponUserBO mongoCouponUserBO : list) { + if (Objects.isNull(mongoCouponUserBO) || Objects.isNull(mongoCouponUserBO.getCouponUserId())) { + throw new LuckException("领券记录信息不全"); + } + mongoCouponUserBO.setCreateTime(new Date()); + mongoCouponUserBO.setUpdateTime(new Date()); + } + mongoTemplate.insertAll(list); + } + + @Override + public long getUserHasCouponCount(Long couponId, Long userId) { + Integer receiveCount = multiRedisStockManager.getCouponReceiveCount(userId, couponId); + if (Objects.isNull(receiveCount)) { + // 兼容旧数据 + Criteria criteria = Criteria.where("couponId").is(couponId).and("userId").is(userId).and("isDelete").is(0); + long count = mongoTemplate.count(new Query(criteria), MongoCouponUserBO.class); + // 存入redis + multiRedisStockManager.setCouponReceiveCount(userId, couponId, count); + return count; + } + return receiveCount; + } + + @Override + public List getCouponsCountForUsers(List couponIds, List userIds) { + Criteria criteria = Criteria.where("userId").in(userIds).and("couponId").in(couponIds).and("isDelete").is(0); + GroupOperation groupOperation = Aggregation.group("userId", "couponId") + .first("userId").as("userId") + .first("couponId").as("couponId") + .count().as("count"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoCouponUserCountVO.class, + Aggregation.match(criteria), + groupOperation + ); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoCouponUserCountVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isNotEmpty(list)) { + for (MongoCouponUserCountVO mongoCouponUserCountVO : list) { + Long userId = mongoCouponUserCountVO.getUserId(); + Long couponId = mongoCouponUserCountVO.getCouponId(); + Integer receiveCount = multiRedisStockManager.getCouponReceiveCount(userId, couponId); + if (Objects.isNull(receiveCount)) { + // 初始化数据 + multiRedisStockManager.setCouponReceiveCount(userId, couponId, mongoCouponUserCountVO.getCount().longValue()); + } + } + } + return list; + } + + @Override + public void deleteUserCouponByCouponId(Long couponUserId) { + Long userId = AuthUserContext.get().getUserId(); + Query query = new Query(Criteria.where("userId").is(userId).and("couponUserId").is(couponUserId)); + Update update = new Update(); + update.set("isDelete", 1); + mongoTemplate.updateFirst(query, update, MongoCouponUserBO.class); + } + + @Override + public Map getCouponCountByStatus(Long userId) { + Criteria criteria = Criteria.where("userId").is(userId).and("isDelete").is(0).and("status").is(UserCouponStatus.EFFECTIVE.getValue()); + ProjectionOperation projectionOperation = Aggregation.project() + .and(ConditionalOperators.when(Criteria.where("shopId").is(Constant.PLATFORM_SHOP_ID)).then(1) + .otherwise(0)).as("platformCount") + .and(ConditionalOperators.when(Criteria.where("shopId").ne(Constant.PLATFORM_SHOP_ID)).then(1) + .otherwise(0)).as("multishopCount"); + GroupOperation groupOperation = Aggregation.group() + .sum("platformCount").as("platformCount") + .sum("multishopCount").as("multishopCount") + .count().as("allCount"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoCouponUserCountVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation + ); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoCouponUserCountVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + Map res = new HashMap<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isEmpty(list)) { + res.put("allCount", 0L); + res.put("platformCount", 0L); + res.put("multishopCount", 0L); + return res; + } + MongoCouponUserCountVO mongoCouponUserCountVO = list.get(0); + res.put("allCount", mongoCouponUserCountVO.getAllCount()); + res.put("platformCount", mongoCouponUserCountVO.getPlatformCount()); + res.put("multishopCount", mongoCouponUserCountVO.getMultishopCount()); + return res; + } + + @Override + public void listByAndShopIdOrSpuId(List coupons, List couponIds) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + if (CollectionUtil.isEmpty(coupons) || Objects.isNull(uidInfoBO)) { + return; + } + Criteria criteria = Criteria.where("userId").is(uidInfoBO.getUserId()).and("couponId").in(couponIds); + ProjectionOperation projectionOperation = Aggregation.project("couponId") + .and(ConditionalOperators.when(Criteria.where("status").is(UserCouponStatus.EFFECTIVE.getValue()) + .and("isDelete").is(0)).then(1).otherwise(0)).as("count"); + GroupOperation groupOperation = Aggregation.group("couponId") + .first("couponId").as("couponId") + .sum("count").as("count"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoCouponUserCountVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation + ); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoCouponUserCountVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + Map couponUserMap = list.stream().collect(Collectors.toMap(MongoCouponUserCountVO::getCouponId, c -> c)); + for (CouponAppVO coupon : coupons) { + coupon.setSpus(null); + if (!couponUserMap.containsKey(coupon.getCouponId())) { + continue; + } + MongoCouponUserCountVO couponUserCount = couponUserMap.get(coupon.getCouponId()); + if (Objects.nonNull(couponUserCount.getCount()) && couponUserCount.getCount() > 0) { + coupon.setHasReceive(couponUserCount.getCount()); + } + } + coupons.sort(Comparator.comparing(CouponAppVO::getHasReceive)); + } + + @Override + public Long countCanUseCoupon(Long userId) { + Criteria criteria = Criteria.where("isDelete").is(0).and("userId").is(userId).and("status").is(UserCouponStatus.EFFECTIVE.getValue()); + return mongoTemplate.count(new Query(criteria), MongoCouponUserBO.class); + } + + @Override + public CouponUserCountDataVO countCouponUserByUserId(Long userId, Long shopId) { + Criteria criteria = Criteria.where("userId").is(userId).and("isDelete").is(0); + if (!Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + criteria.and("shopId").is(shopId); + } + ProjectionOperation projectionOperation = Aggregation.project() + .and(ConditionalOperators.when(Criteria.where("status").is(UserCouponStatus.INVALID.getValue())).then(1) + .otherwise(0)).as("couponExpiredNums") + .and(ConditionalOperators.when(Criteria.where("status").is(UserCouponStatus.EFFECTIVE.getValue())).then(1) + .otherwise(0)).as("couponUsableNums") + .and(ConditionalOperators.when(Criteria.where("status").is(UserCouponStatus.USED.getValue())).then(1) + .otherwise(0)).as("couponUsedNums"); + GroupOperation groupOperation = Aggregation.group() + .sum("couponExpiredNums").as("couponExpiredNums") + .sum("couponUsableNums").as("couponUsableNums") + .sum("couponUsedNums").as("couponUsedNums"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoCouponUserCountVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation + ); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoCouponUserCountVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + CouponUserCountDataVO couponUserCountDataVO = new CouponUserCountDataVO(); + if (CollUtil.isNotEmpty(list)) { + MongoCouponUserCountVO mongoCouponUserCountVO = list.get(0); + couponUserCountDataVO.setCouponExpiredNums(mongoCouponUserCountVO.getCouponExpiredNums()); + couponUserCountDataVO.setCouponUsableNums(mongoCouponUserCountVO.getCouponUsableNums()); + couponUserCountDataVO.setCouponUsedNums(mongoCouponUserCountVO.getCouponUsedNums()); + } + return couponUserCountDataVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void giveCoupon(CouponGiveBO couponGiveBO) { + Integer bizType = couponGiveBO.getBizType(); + Long bizId = couponGiveBO.getBizId(); + Integer count = couponGiveLogMapper.count(bizType, bizId); + if (count > 0) { + return; + } + Long userId = couponGiveBO.getUserId(); + List couponInfos = couponGiveBO.getCouponInfos(); + // 优惠券id + List couponIds = couponInfos.stream().map(CouponIdAndCountBO::getCouponId).collect(Collectors.toList()); + Map couponIdWithCountMap = couponInfos.stream().collect(Collectors.toMap(CouponIdAndCountBO::getCouponId, CouponIdAndCountBO::getCount)); + // 优惠券 + List coupons = couponMapper.getListByCouponIds(couponIds); + Map limitNumMap = coupons.stream().collect(Collectors.toMap(Coupon::getCouponId, Coupon::getLimitNum)); + List couponUsers = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Coupon coupon : coupons) { + if (!Objects.equals(coupon.getStatus(), CouponStatus.NO_OVERDUE.value()) || !Objects.equals(coupon.getPutonStatus(), PutOnStatus.PUT_ON.value())) { + return; + } + // 超出领券数量限制,就不要继续发给用户 + long couponCount = getUserHasCouponCount(coupon.getCouponId(), userId); + if (couponCount >= coupon.getLimitNum()) { + logger.warn("用户:{},的优惠券:{}已达个人领取上限,无法继续领取", userId, coupon.getCouponId()); + continue; + } + // 还剩下可以领取的数量 + int subStock = coupon.getLimitNum() - (int) couponCount; + // 判断优惠券当前数量,给用户发放优惠券 + Integer couponNum = couponIdWithCountMap.get(coupon.getCouponId()); + Integer couponStock = couponStockManager.getStockByCouponId(coupon.getCouponId()); + // 优惠券数量有限,送完即止 + if (couponStock < couponNum) { + couponNum = couponStock; + } + // 只能领取这么多 + couponNum = Math.min(subStock, couponNum); + // 根据赠送的数量给用户发优惠券 + for (int i = 0; i < couponNum; i++) { + MongoCouponUserBO couponUser = getCouponUser(new Date(), userId, coupon); + couponUsers.add(couponUser); + } + } + + // 这里有唯一索引,所以不用怕重复 + CouponGiveLog couponGiveLog = new CouponGiveLog(); + couponGiveLog.setBizId(bizId); + couponGiveLog.setBizType(bizType); + couponGiveLogMapper.save(couponGiveLog); + if (CollUtil.isNotEmpty(couponUsers)) { + Iterator iterator = couponUsers.iterator(); + while (iterator.hasNext()) { + MongoCouponUserBO couponUser = iterator.next(); + Integer limitNum = limitNumMap.get(couponUser.getCouponId()); + MultiDecrementBO multiDecrementBO = new MultiDecrementBO(MultiStockEnum.COUPON, userId, couponUser.getCouponUserId(), couponUser.getCouponId(), + couponUser.getCouponId(), 1, limitNum, null, null); + if (couponStockManager.decrStocks(multiDecrementBO)) { + // 库存扣减成功 + continue; + } + iterator.remove(); + } + } + if (CollUtil.isEmpty(couponUsers)) { + return; + } + // 存储领券记录和删除锁定记录 + couponStockManager.saveLogAndDeleteLock(couponUsers); + } + + @Override + public void deleteUnValidTimeCoupons(Date date) { + Query query = new Query(Criteria.where("status").is(UserCouponStatus.INVALID.getValue()).and("userEndTime").lt(date)); + mongoTemplate.remove(query, MongoCouponUserBO.class); + } + + @Override + public void updateStatusByTime() { + // 失效未使用的优惠券,已使用的不需要失效 + Date now = new Date(); + Query query = new Query(Criteria.where("status").is(UserCouponStatus.EFFECTIVE.getValue()).and("userEndTime").lt(now)); + Update update = new Update(); + update.set("status", UserCouponStatus.INVALID.getValue()); + mongoTemplate.updateMulti(query, update, MongoCouponUserBO.class); + } + + @Override + public PageVO getPageByUserId(PageDTO pageDTO, CouponUserDTO couponUserDTO) { + Criteria criteria = Criteria.where("userId").is(couponUserDTO.getUserId()).and("isDelete").is(0); + if (Objects.nonNull(couponUserDTO.getStatus())) { + criteria.and("status").is(couponUserDTO.getStatus()); + } + if (Objects.nonNull(couponUserDTO.getShopId())) { + criteria.and("shopId").is(couponUserDTO.getShopId()); + } + Query query = new Query(criteria).with(Sort.by(Sort.Direction.DESC, "receiveTime")); + PageVO page = mongoPageUtil.doPage(MongoCouponUserVO.class, pageDTO, query); + if (CollUtil.isNotEmpty(page.getList())) { + List couponIds = page.getList().stream().map(MongoCouponUserVO::getCouponId).collect(Collectors.toList()); + List couponList = couponMapper.getListByCouponIds(couponIds); + Map couponMap = couponList.stream().collect(Collectors.toMap(Coupon::getCouponId, c -> c)); + for (MongoCouponUserVO mongoCouponUserVO : page.getList()) { + Coupon coupon = couponMap.get(mongoCouponUserVO.getCouponId()); + if (Objects.isNull(coupon)) { + continue; + } + CouponVO couponVO = BeanUtil.map(coupon, CouponVO.class); + mongoCouponUserVO.setCouponVO(couponVO); + } + } + return page; + } + + @Override + public Collection batchBindCoupon(List bindCouponDTOList) { + if (CollUtil.isEmpty(bindCouponDTOList)) { + return null; + } + Set couponIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (BindCouponDTO bindCouponDTO : bindCouponDTOList) { + couponIds.addAll(bindCouponDTO.getCouponIds()); + } + // 优惠券 + List coupons = couponMapper.getListByCouponIds(new ArrayList<>(couponIds)); + Map couponMap = coupons.stream().collect(Collectors.toMap(Coupon::getCouponId, (k) -> k)); + + // 统计用户已经领取了多少个优惠券(领券有限制) + List userIds = bindCouponDTOList.stream().map(BindCouponDTO::getUserId).collect(Collectors.toList()); + List couponsCountForUsers = getCouponsCountForUsers(new ArrayList<>(couponIds), userIds); + Map> couponUserIdMap = new HashMap<>(Constant.INITIAL_CAPACITY); + // 优惠券发了多少个 + Map couponSendMap = new HashMap<>(Constant.INITIAL_CAPACITY); + for (BindCouponDTO bindCouponDTO : bindCouponDTOList) { + Long userId = bindCouponDTO.getUserId(); + List userCouponIds = bindCouponDTO.getCouponIds(); + for (Long couponId : userCouponIds) { + Coupon coupon = couponMap.get(couponId); + // 超出领券数量限制,就不要继续发给用户 + boolean overLimit = judgeOverLimit(couponsCountForUsers, couponSendMap, coupon, userId, couponId); + if (overLimit) { + continue; + } + if (couponSendMap.containsKey(couponId)) { + couponSendMap.put(couponId, couponSendMap.get(couponId) + 1); + } else { + couponSendMap.put(couponId, 1); + } + // 添加优惠券与用户关联 + if (couponUserIdMap.containsKey(couponId)) { + List mapUserIds = couponUserIdMap.get(couponId); + mapUserIds.add(userId); + couponUserIdMap.put(couponId, mapUserIds); + } else { + couponUserIdMap.put(couponId, Collections.singletonList(userId)); + } + } + } + + handleUpdateCouponStock(couponSendMap, couponUserIdMap, bindCouponDTOList, couponMap); + // 返回需要清除缓存的优惠券id + return couponSendMap.keySet(); + } + + private MongoCouponUserBO getCouponUser(Date now, Long userId, Coupon coupon) { + MongoCouponUserBO couponUser = new MongoCouponUserBO(); + couponUser.setCouponUserId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_COUPON_USER)); + couponUser.setCouponId(coupon.getCouponId()); + couponUser.setUserId(userId); + couponUser.setShopId(coupon.getShopId()); + couponUser.setReceiveTime(now); + couponUser.setStatus(UserCouponStatus.EFFECTIVE.getValue()); + couponUser.setIsDelete(0); + if (Objects.equals(ValidTimeType.FIXED.value(), coupon.getValidTimeType())) { + // 优惠券已过期 + if (coupon.getEndTime().getTime() < System.currentTimeMillis()) { + couponUser.setStatus(UserCouponStatus.INVALID.getValue()); + } + couponUser.setUserStartTime(coupon.getStartTime()); + couponUser.setUserEndTime(coupon.getEndTime()); + + } + // 生效时间类型为领取后生效 + if (Objects.equals(ValidTimeType.RECEIVE.value(), coupon.getValidTimeType())) { + if (Objects.isNull(coupon.getAfterReceiveDays())) { + coupon.setAfterReceiveDays(0); + } + if (Objects.isNull(coupon.getValidDays())) { + coupon.setValidDays(0); + } + couponUser.setUserStartTime(DateUtils.addDays(DateUtil.beginOfDay(now), coupon.getAfterReceiveDays())); + couponUser.setUserEndTime(DateUtils.addDays(couponUser.getUserStartTime(), coupon.getValidDays())); + } + return couponUser; + } + + private boolean judgeOverLimit(List couponsCountForUsers, Map couponSendMap, Coupon coupon, Long userId, Long couponId) { + if (Objects.isNull(coupon)) { + return true; + } + if (!(Objects.equals(coupon.getStatus(), CouponStatus.NO_OVERDUE.value()) && Objects.equals(coupon.getPutonStatus(), PutOnStatus.PUT_ON.value()))) { + return true; + } + coupon.setStocks(couponStockManager.getStockByCouponId(couponId)); + if (couponSendMap.containsKey(couponId) && couponSendMap.get(couponId) >= coupon.getStocks()) { + return true; + } + // 超出领券数量限制 + int num = 0; + if (CollUtil.isNotEmpty(couponsCountForUsers)) { + MongoCouponUserCountVO couponUserCountDTO = couponsCountForUsers.stream() + .filter(item -> Objects.equals(userId, item.getUserId()) && Objects.equals(couponId, item.getCouponId())).findAny().orElse(null); + if (Objects.nonNull(couponUserCountDTO)) { + num = couponUserCountDTO.getCount(); + } + } + if (num >= coupon.getLimitNum()) { + return true; + } + return couponSendMap.containsKey(couponId) && (couponSendMap.get(couponId) + num) >= coupon.getLimitNum(); + } + + /** + * 将减少优惠券的map转为数组集合 + * @param couponSendMap 发送优惠券的数量 + */ + private void handleUpdateCouponStock(Map couponSendMap, Map> couponUserIdMap, + List bindCouponDTOList, Map couponMap) { + Date now = new Date(); + List couponUsers = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long couponId : couponSendMap.keySet()) { + Integer count = Math.abs(couponSendMap.get(couponId)); + logger.info("用户绑定优惠券{},扣减库存{}", couponId, count); + List userIds = couponUserIdMap.get(couponId); + Integer subStock = 0; + for (Long userId : userIds) { + Coupon coupon = couponMap.get(couponId); + MongoCouponUserBO couponUser = getCouponUser(now, userId, coupon); + MultiDecrementBO multiDecrementBO = new MultiDecrementBO(MultiStockEnum.COUPON, userId, couponUser.getCouponUserId(), couponId, + couponId, 1, coupon.getLimitNum(), null); + if (couponStockManager.decrStocks(multiDecrementBO)) { + // 库存扣减成功 + couponUsers.add(couponUser); + ++subStock; + } + } + logger.info("用户绑定优惠券{},实际扣减库存{}", couponId, subStock); + } + + if (CollUtil.isEmpty(couponUsers)) { + return; + } + // 存储领券记录和删除锁定记录 + couponStockManager.saveLogAndDeleteLock(couponUsers); + } + + @Override + public void addCouponStock(Long couponId, Integer stock, List userIdList) { + for (MongoCouponUserBO couponUserBO : userIdList) { + MultiDecrementBO multiDecrementBO = new MultiDecrementBO(MultiStockEnum.COUPON, couponUserBO.getUserId(), couponUserBO.getCouponUserId(), couponId, + couponId, 1, null, null); + multiRedisStockManager.addCouponStock(multiDecrementBO); + } + } + + @Override + public Collection batchDeleteUserCoupon(List bindCouponDTOList) { + // 删除用户优惠券 + // 可能有很多的优惠券,把用户有效的未使用的优惠券删除了 + if (CollUtil.isEmpty(bindCouponDTOList)) { + return null; + } + Set couponIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (BindCouponDTO bindCouponDTO : bindCouponDTOList) { + couponIds.addAll(bindCouponDTO.getCouponIds()); + } + List userIds = bindCouponDTOList.stream().map(BindCouponDTO::getUserId).distinct().collect(Collectors.toList()); + // 将用户有效的优惠券筛选出来 + List list = getByCouponIdsAndUserIds(userIds, new ArrayList<>(couponIds)); + if (CollUtil.isEmpty(list)) { + return null; + } + Map> couponUserMap = list.stream().collect(Collectors.groupingBy(MongoCouponUserBO::getUserId)); + // 筛选出待确认,已锁定的优惠券是哪些 + List couponUserIdList = list.stream().map(MongoCouponUserBO::getCouponUserId).collect(Collectors.toList()); + List couponLocks = couponLockMapper.getUnConfirmAndLockCoupon(couponUserIdList); + List unCouponUserIds = couponLocks.stream().map(CouponLock::getCouponUserId).distinct().collect(Collectors.toList()); + // 筛选出可以被删除的优惠券 + List couponUserIds = couponUserIdList.stream().filter(item -> !unCouponUserIds.contains(item)).collect(Collectors.toList()); + if (CollUtil.isEmpty(couponUserIds)) { + return null; + } + // 优惠券退还数量 + Map couponReturnStockMap = new HashMap<>(Constant.INITIAL_CAPACITY); + // 优惠券与用户id + Map> couponUserIdMap = new HashMap<>(Constant.INITIAL_CAPACITY); + // 处理需要删除用户的优惠券是那些 + Set couponUserIdDeleteList = new HashSet<>(Constant.INITIAL_CAPACITY); + for (BindCouponDTO bindCouponDTO : bindCouponDTOList) { + Long userId = bindCouponDTO.getUserId(); + List couponIdList = bindCouponDTO.getCouponIds(); + List couponUsers = couponUserMap.get(userId); + if (CollUtil.isEmpty(couponUsers)) { + continue; + } + for (MongoCouponUserBO couponUser : couponUsers) { + Long couponId = couponUser.getCouponId(); + Long couponUserId = couponUser.getCouponUserId(); + // 优惠券不在已解锁状态,就不能删除,直接跳过 + if (!couponUserIds.contains(couponUserId)) { + continue; + } + if (couponIdList.contains(couponId)) { + couponUserIdDeleteList.add(couponUserId); + // 移除要被删除的优惠券的id列表中的其中一个 + couponIdList.remove(couponId); + if (couponReturnStockMap.containsKey(couponId)) { + couponReturnStockMap.put(couponId, couponReturnStockMap.get(couponId) + 1); + } else { + couponReturnStockMap.put(couponId, 1); + } + // 添加优惠券与用户关联 + if (couponUserIdMap.containsKey(couponId)) { + List mapUserIds = couponUserIdMap.get(couponId); + mapUserIds.add(couponUser); + couponUserIdMap.put(couponId, mapUserIds); + } else { + couponUserIdMap.put(couponId, Collections.singletonList(couponUser)); + } + } + } + List collect = couponUsers.stream().filter(item -> !couponUserIdDeleteList.contains(item.getCouponUserId())).collect(Collectors.toList()); + couponUserMap.put(userId, collect); + } + if (CollUtil.isEmpty(couponUserIdDeleteList)) { + return null; + } + DateTime now = DateUtil.date(); + // 批量删除用户优惠券 + batchDeleteUserCoupon(new ArrayList<>(couponUserIdDeleteList), now); + + // mq保证事务 redis还原库存 + AddCouponStockMsgBO addCouponStockMsgBO = new AddCouponStockMsgBO(); + addCouponStockMsgBO.setCouponReturnStockMap(couponReturnStockMap); + addCouponStockMsgBO.setCouponUserIdMap(couponUserIdMap); + SendStatus sendStatus = sendAddCouponStockTemplate.syncSend(RocketMqConstant.ADD_COUPON_STOCK_TOPIC, new GenericMessage<>(addCouponStockMsgBO)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + // 返回需要清除缓存的优惠券id列表 + return couponReturnStockMap.keySet(); + } + + private void batchDeleteUserCoupon(List couponUserIds, Date now) { + Query query = new Query(Criteria.where("_id").in(couponUserIds)); + Update update = new Update(); + update.set("isDelete", 1); + update.set("updateTime", now); + mongoTemplate.updateMulti(query, update, MongoCouponUserBO.class); + } + + private List getByCouponIdsAndUserIds(List userIds, List couponIds) { + Criteria criteria = Criteria.where("isDelete").is(0).and("status").is(UserCouponStatus.EFFECTIVE.getValue()) + .and("userId").in(userIds).and("couponId").in(couponIds); + return mongoTemplate.find(new Query(criteria), MongoCouponUserBO.class); + } + + @Override + public long countUnUseCoupon(Long couponId) { + Criteria criteria = Criteria.where("couponId").is(couponId).and("isDelete").is(0) + .and("status").is(UserCouponStatus.EFFECTIVE.getValue()); + return mongoTemplate.count(new Query(criteria), MongoCouponUserBO.class); + } + + @Override + public List userReceiveCouponCount(ReceiveCouponDTO receiveCouponDTO) { + Criteria criteria = Criteria.where("receiveTime").gte(receiveCouponDTO.getStartTime()).lte(receiveCouponDTO.getEndTime()) + .and("userId").in(receiveCouponDTO.getUserIds()); + GroupOperation groupOperation = Aggregation.group("userId").first("userId").as("userId"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoCouponUserCountVO.class, + Aggregation.match(criteria), + groupOperation + ); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoCouponUserCountVO.class); + List mappedResults = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(mappedResults)) { + return new ArrayList<>(); + } + return mappedResults.stream().map(MongoCouponUserCountVO::getUserId).collect(Collectors.toList()); + } + + @Override + public void batchUpdateUserCouponStatus(Integer status, List userCouponIds) { + Criteria criteria = Criteria.where("_id").in(userCouponIds); + Update update = new Update(); + update.set("status", status); + mongoTemplate.updateMulti(new Query(criteria), update, MongoCouponUserBO.class); + } + + @Override + public void reductionCoupon(List couponUserIds) { + Query query = new Query(Criteria.where("_id").in(couponUserIds).and("shopId").ne(Constant.PLATFORM_SHOP_ID)); + Update update = new Update(); + update.set("status", 1); + mongoTemplate.updateFirst(query, update, MongoCouponUserBO.class); + } + + @Override + public List countMemberCouponByParam(Long shopId, Date startTime, Date endTime) { + Criteria criteria = new Criteria(); + if (Objects.nonNull(shopId) && !Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + criteria.and("shopId").is(shopId); + } + if (Objects.nonNull(startTime) && Objects.nonNull(endTime)) { + criteria.and("receiveTime").gte(startTime).lte(endTime); + } + List userIds = mongoTemplate.findDistinct(new Query(criteria), "userId", MongoCouponUserBO.class, Long.class); + if (Objects.isNull(userIds)) { + userIds = new ArrayList<>(); + } + return userIds; + } + + @Override + public PageVO pageUserCoupon(PageDTO page, Long userId, Long type, Integer status) { + PageVO res = new PageVO<>(); + res.setList(new ArrayList<>()); + Long shopCoupon = 2L; + Criteria criteria = Criteria.where("userId").is(userId).and("isDelete").is(0).and("status").is(status); + ; + if (Objects.equals(type, 1L)) { + criteria.and("shopId").is(Constant.PLATFORM_SHOP_ID); + } else if (Objects.equals(type, shopCoupon)) { + criteria.and("shopId").ne(Constant.PLATFORM_SHOP_ID); + } + Query query = new Query(criteria); + if (Objects.equals(status, UserCouponStatus.EFFECTIVE.getValue())) { + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + } else { + query.with(Sort.by(Sort.Direction.DESC, "updateTime")); + } + PageVO pageVO = mongoPageUtil.doPage(MongoCouponUserBO.class, page, query); + if (CollUtil.isNotEmpty(pageVO.getList())) { + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + List couponAppList = BeanUtil.mapAsList(pageVO.getList(), CouponAppVO.class); + List couponIds = couponAppList.stream().map(CouponAppVO::getCouponId).collect(Collectors.toList()); + List couponList = couponMapper.getListByCouponIds(couponIds); + Map couponMap = couponList.stream().collect(Collectors.toMap(Coupon::getCouponId, (k) -> k)); + Iterator iterator = couponAppList.iterator(); + while (iterator.hasNext()) { + CouponAppVO couponAppVO = iterator.next(); + Coupon coupon = couponMap.get(couponAppVO.getCouponId()); + if (Objects.isNull(coupon)) { + iterator.remove(); + } + CouponAppVO couponData = BeanUtil.map(coupon, CouponAppVO.class); + couponData.setCouponUserId(couponAppVO.getCouponUserId()); + couponData.setStatus(couponAppVO.getStatus()); + couponData.setReceiveTime(couponAppVO.getReceiveTime()); + list.add(couponData); + } + res.setList(list); + } + res.setTotal(pageVO.getTotal()); + res.setPages(pageVO.getPages()); + return res; + } + + @Override + public List setCouponUserInfo(List couponList, Long userId) { + List couponIds = couponList.stream().map(CouponAppVO::getCouponId).collect(Collectors.toList()); + Criteria criteria = Criteria.where("userId").is(userId); + ProjectionOperation projectionOperation = Aggregation.project("couponId") + .and(ConditionalOperators.when(Criteria.where("status").is(UserCouponStatus.EFFECTIVE.getValue()).and("isDelete").is(0)) + .then(1).otherwise(0)).as("hasReceive"); + GroupOperation groupOperation = Aggregation.group("couponId") + .first("couponId").as("couponId") + .sum("hasReceive").as("hasReceive"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoCouponUserCountVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation + ); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoCouponUserCountVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + Map infoMap = list.stream().collect(Collectors.toMap(MongoCouponUserCountVO::getCouponId, c -> c)); + for (CouponAppVO couponAppVO : couponList) { + MongoCouponUserCountVO mongoCouponUserCountVO = infoMap.get(couponAppVO.getCouponId()); + if (Objects.isNull(mongoCouponUserCountVO)) { + couponAppVO.setHasReceive(0); + } else { + couponAppVO.setHasReceive(Objects.isNull(mongoCouponUserCountVO.getHasReceive()) ? 0 : mongoCouponUserCountVO.getHasReceive()); + } + } + return couponList; + } + + @Override + public List getCouponListByUserIdAndShopId(Long userId, Long shopId) { + Criteria criteria = Criteria.where("userId").is(userId).and("shopId").is(shopId) + .and("status").is(UserCouponStatus.EFFECTIVE.getValue()).and("isDelete").is(0); + ProjectionOperation projectionOperation = Aggregation.project("couponId", "shopId") + .and("_id").as("couponUserId") + .and("userStartTime").as("startTime") + .and("userEndTime").as("endTime"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoCouponOrderVO.class, + Aggregation.match(criteria), + projectionOperation + ); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoCouponOrderVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + return BeanUtil.mapAsList(list, CouponOrderVO.class); + } + + @Override + public void initCouponUserToMongodb() { + int start = 0; + int size = 10000; + mongoTemplate.remove(MongoCouponUserBO.class); + while (true) { + // 批量以10000条处理 + List couponUsers = couponUserMapper.listToMongodb(start, size); + if (CollUtil.isEmpty(couponUsers)) { + break; + } + List mongoUserScoreLogs = BeanUtil.mapAsList(couponUsers, MongoCouponUserBO.class); + mongoTemplate.insertAll(mongoUserScoreLogs); + if (couponUsers.size() <= size) { + break; + } + start = start + size; + } + } + + @Override + public int countReceiveCoupon(Long couponId) { + Criteria criteria = Criteria.where("couponId").is(couponId).and("isDelete").is(0); + long count = mongoTemplate.count(new Query(criteria), MongoCouponUserBO.class); + return (int) count; + } + + @Override + public List listCouponUserIdsByIds(List couponUserIds) { + Criteria criteria = Criteria.where("_id").in(couponUserIds); + List couponUserList = mongoTemplate.find(new Query(criteria), MongoCouponUserBO.class); + if (CollUtil.isEmpty(couponUserList)) { + return new ArrayList<>(); + } + return couponUserList; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/task/CouponTask.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/task/CouponTask.java new file mode 100644 index 0000000..a9d1710 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/task/CouponTask.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.task; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.LockCacheNames; +import com.tmerclub.cloud.common.cache.manager.MultiRedisStockManager; +import com.tmerclub.cloud.common.cache.util.CacheManagerUtil; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.coupon.manager.CouponStockManager; +import com.tmerclub.cloud.coupon.mapper.CouponMapper; +import com.tmerclub.cloud.coupon.service.CouponService; +import com.tmerclub.cloud.coupon.service.CouponUserService; +import com.tmerclub.cloud.coupon.vo.CouponUserVO; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.apache.commons.collections.CollectionUtils; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author FrozenWatermelon + */ +@Component +public class CouponTask { + + public static final Logger log = LoggerFactory.getLogger(CouponTask.class); + + @Autowired + private CouponUserService couponUserService; + @Autowired + private CouponService couponService; + @Autowired + private CouponMapper couponMapper; + @Autowired + private RedissonClient redissonClient; + @Autowired + private CouponStockManager couponStockManager; + + /** + * 删除用户失效180天以上的优惠券 + */ + @XxlJob("deleteCouponUser") + public void deleteCouponUser() { + log.info("删除用户失效180天以上的优惠券"); + // 删除用户失效半年以上的优惠券 参考京东 + couponUserService.deleteUnValidTimeCoupons(DateUtil.offsetDay(new Date(), -180)); + } + + /** + * 改变用户优惠券的状态(设为失效状态) + */ + @XxlJob("changeCouponUser") + public void changeCouponUser() { + log.info("设置用户的过期优惠券为失效状态"); + // 设置用户的过期优惠券为失效状态 + couponUserService.updateStatusByTime(); + } + + /** + * 改变店铺优惠券的状态(设为过期状态) + */ + @XxlJob("changeCoupon") + public void changeCoupon() { + log.info("设置店铺的过期优惠券为过期状态"); + // 查询需要更新的店铺id列表 + List shopIds = couponMapper.listOverdueStatusShopIds(); + // 取消投放 + couponService.cancelPut(); + //清除缓存 + if (CollectionUtils.isNotEmpty(shopIds)) { + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long shopId : shopIds) { + keys.add(CacheNames.COUPON_LIST_BY_SHOP_KEY + CacheNames.UNION + shopId); + } + RedisUtil.deleteBatch(keys); + } + } + + /** + * 投放优惠券 + */ + @XxlJob("putOnCoupon") + public void putOnCoupon() { + log.info("投放优惠券"); + // 投放优惠券 + couponService.putonCoupon(); + } + + /** + * 初始化原有数据库记录至mongodb + * 该定时任务成功执行一次即可!!!!!,成功执行完后将任务置为STOP状态或删除 + */ + @XxlJob("initCouponUserToMongodb") + public void initCouponUserToMongodb() { + log.info("初始化领券记录"); + couponUserService.initCouponUserToMongodb(); + } + + /** + * 解锁优惠券 + */ + @XxlJob("unLockCouponStock") + public void unLockCouponStock() { + log.info("解锁优惠券记录"); + List couponUserIds = couponStockManager.scanLockStockCouponLog(null); + if (CollUtil.isEmpty(couponUserIds)) { + return; + } + // 批量处理订单解锁库存 + try { + couponStockManager.unlockStockByException(couponUserIds); + } catch (Exception e) { + log.error("优惠券解锁库存失败", e); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/util/ChooseCouponHelper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/util/ChooseCouponHelper.java new file mode 100644 index 0000000..832d329 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/util/ChooseCouponHelper.java @@ -0,0 +1,345 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.util; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.coupon.constant.CouponProdType; +import com.tmerclub.cloud.api.coupon.constant.CouponType; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.vo.CouponOrderVO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.util.PriceUtil; + +import java.util.*; + +/** + * 协助优惠券进行选择 + * @author FrozenWatermelon + */ +public class ChooseCouponHelper { + /** + * 购物项 + */ + private final List shopCartItems; + /** + * 含有的优惠券列表 + */ + private final List shopCoupons; + /** + * 选中的优惠券id + */ + private final List couponIds; + + /** + * 用户是否选中优惠券 + */ + private final Integer userChangeCoupon; + /** + * 选中的优惠券 + */ + private CouponOrderVO chooseCoupon; + + /** + * 可用优惠券的商品实际金额(商品实际金额 - 商品分摊金额) + */ + private Long prodCanUseCouponActualTotal; + + /** + * 优惠金额 + */ + private Long couponReduce; + + /** + * 优惠券在订单中的优惠金额 + */ + private Long couponInOrderAmount; + + + /** + * 优惠金额关联店铺map + */ + private final Map shopReduceMap = new HashMap<>(12); + + public ChooseCouponHelper(List shopCartItems, List shopCoupons, List couponIds, Integer userChangeCoupon) { + this.shopCartItems = shopCartItems; + this.shopCoupons = shopCoupons; + this.couponIds = couponIds; + this.userChangeCoupon = userChangeCoupon; + } + + public CouponOrderVO getChooseCoupon() { + return chooseCoupon; + } + + + public Long getCouponReduce() { + return this.couponReduce; + } + + public Map getShopReduceMap() { + return shopReduceMap; + } + + public ChooseCouponHelper invoke() { + // 没有商品直接返回 + if (CollectionUtil.isEmpty(shopCartItems)) { + return this; + } + + + // 用户选中的关于该店铺的优惠券,一家店只能选择一张优惠券 + chooseCoupon = null; + + // 可用优惠券的商品实际金额(商品实际金额 - 商品分摊金额) + prodCanUseCouponActualTotal = 0L; + Date now = new Date(); + for (CouponOrderVO shopCoupon : shopCoupons) { + if (shopCoupon.getStartTime().getTime() > now.getTime() || shopCoupon.getEndTime().getTime() < now.getTime()) { + continue; + } + // 该优惠券关联的商品id + List prodIds = shopCoupon.getSpuIds(); + // 可用优惠券的商品实际金额(商品实际金额 - 商品分摊金额) + prodCanUseCouponActualTotal = 0L; + for (ShopCartItemVO shopCartItem : shopCartItems) { + // 套餐不参与优惠券活动 + if (Objects.nonNull(shopCartItem.getComboId()) && shopCartItem.getComboId() != 0) { + continue; + } + shopCartItem.setIsShareReduce(0); + long spuId = Objects.nonNull(shopCartItem.getMainComboSpuId()) ? shopCartItem.getMainComboSpuId() : shopCartItem.getSpuId(); + // 该商品是否在该优惠券可用 + boolean isCouponsProd = isCouponsProd(spuId, prodIds, shopCoupon.getSuitableProdType()); + if (isCouponsProd) { + shopCartItem.setIsShareReduce(1); + prodCanUseCouponActualTotal = prodCanUseCouponActualTotal + shopCartItem.getActualTotal(); + } + } + Date date = new Date(); + // 如果该商品实际总金额大于等于优惠券最低使用金额,并且开始时间大于优惠券的使用时间,则优惠券可用 + if (prodCanUseCouponActualTotal >= shopCoupon.getCashCondition() && shopCoupon.getStartTime().getTime() < date.getTime()) { + // 将优惠券标记为可用状态 + shopCoupon.setCanUse(true); + shopCoupon.setProdCanUseCouponActualTotal(prodCanUseCouponActualTotal); + calculateCouponReduce(shopCoupon); + // 聚合 用户选中的关于该店铺的优惠券 + if (CollectionUtil.isNotEmpty(couponIds)) { + for (Long couponId : couponIds) { + if (Objects.equals(couponId, shopCoupon.getCouponId())) { + chooseCoupon = shopCoupon; + break; + } + } + } + if (chooseCoupon != null && !Objects.equals(userChangeCoupon, 1)) { + // 选择优惠最大 + chooseCoupon = shopCoupon.getCouponReduce() > chooseCoupon.getCouponReduce() ? shopCoupon : chooseCoupon; + } + // 如果用户没有选择优惠券,系统默认选择一张可用优惠券 + if (chooseCoupon == null && !Objects.equals(userChangeCoupon, 1)) { + chooseCoupon = shopCoupon; + } + } + } + for (CouponOrderVO shopCoupon : shopCoupons) { + // 该优惠券关联的商品id + List prodIds = shopCoupon.getSpuIds(); + if (Objects.nonNull(chooseCoupon) && !Objects.equals(shopCoupon.getCouponUserId(), chooseCoupon.getCouponUserId())) { + continue; + } + for (ShopCartItemVO shopCartItem : shopCartItems) { + shopCartItem.setIsShareReduce(0); + long spuId = Objects.nonNull(shopCartItem.getMainComboSpuId()) ? shopCartItem.getMainComboSpuId() : shopCartItem.getSpuId(); + // 该商品是否在该优惠券可用 + boolean isCouponsProd = isCouponsProd(spuId, prodIds, shopCoupon.getSuitableProdType()); + if (isCouponsProd) { + shopCartItem.setIsShareReduce(1); + } + } + } + if (chooseCoupon != null) { + // 计算优惠券优惠金额 + calculateCouponReduce(chooseCoupon); + // 设置分摊优惠金额 + setShareReduce(); + if (couponReduce > 0) { + // 优惠券金额可用时才能勾选 + chooseCoupon.setChoose(true); + } + } + return this; + } + + /** + * 判断某个商品是否在此优惠券中 + * + * @param prodId 在该店铺中的商品商品id + * @param couponProdIds 优惠券关联的商品id + * @param couponProdType 优惠券适用商品类型 + * @return 商品是否在此优惠券中 + */ + private boolean isCouponsProd(Long prodId, List couponProdIds, Integer couponProdType) { + + if (CouponProdType.ALL.value().equals(couponProdType)) { + return true; + } + if (CouponProdType.PROD_IN.value().equals(couponProdType)) { + if (CollectionUtil.isEmpty(couponProdIds)) { + return false; + } + for (Long couponProdId : couponProdIds) { + if (Objects.equals(couponProdId, prodId)) { + return true; + } + } + return false; + } + return false; + } + + + /** + * 计算优惠金额 + */ + private void calculateCouponReduce(CouponOrderVO chooseCoupon) { + couponReduce = 0L; + couponInOrderAmount = 0L; + // 代金券 + if (CouponType.C2M.value().equals(chooseCoupon.getCouponType())) { + couponInOrderAmount = chooseCoupon.getReduceAmount(); + } + // 折扣券 + if (CouponType.C2D.value().equals(chooseCoupon.getCouponType())) { + couponInOrderAmount = chooseCoupon.getProdCanUseCouponActualTotal() - + PriceUtil.divideByBankerRounding((long) (chooseCoupon.getProdCanUseCouponActualTotal() * chooseCoupon.getCouponDiscount()), 10); + chooseCoupon.setReduceAmount(couponInOrderAmount); + } + couponReduce = couponReduce + couponInOrderAmount; + chooseCoupon.setCouponReduce(couponReduce); + } + + /** + * 设置分摊优惠金额 + */ + private void setShareReduce() { + long sumReduce = 0L; + shopCartItems.sort(Comparator.comparing(ShopCartItemVO::getActualTotal)); + for (int i = 0; i < shopCartItems.size(); i++) { + ShopCartItemVO shopCartItem = shopCartItems.get(i); + // 套餐商品不参与优惠券,或者优惠金额不分摊 + boolean notShareReduce = (Objects.nonNull(shopCartItem.getComboId()) && shopCartItem.getComboId() != 0) || shopCartItem.getIsShareReduce() != 1; + if (notShareReduce) { + continue; + } + // 分摊金额计算 + // 步骤一: 计算优惠分摊的比例 = 优惠券的总优惠金额) / 可用优惠券的商品实际金额(商品实际金额 - 商品分摊金额) + // 步骤二: 计算商品的优惠券分摊金额 = 分摊比例 * 商品实际金额 + // 实际计算: 优惠券分摊金额 = (商品实际金额 * 优惠券的总优惠金额) / 可用优惠券的商品实际金额(商品实际金额 - 商品分摊金额) + // couponInOrderAmount这个不做整除100的操作是因为会丢失精度,在这里把最后乘100的操作去除就好了 + long shareReduce = PriceUtil.divideByBankerRounding(couponInOrderAmount * shopCartItem.getActualTotal(), prodCanUseCouponActualTotal); + + // 如果是最后一项,直接将剩余的优惠金额赋值给他 + if (i + 1 == shopCartItems.size()) { + shareReduce = Math.min(couponReduce - sumReduce, shopCartItem.getTotalAmount()); + } + + // 实际金额只有0.01就不要参与优惠金额分摊了 + if (shopCartItem.getActualTotal() == 1) { + shareReduce = 0L; + } + // 商品实际金额等于优惠券分摊金额,商品实际金额最低为0.01,所以优惠券优惠金额要减去0.01 + if (shareReduce == shopCartItem.getActualTotal()) { + shareReduce = shareReduce - Constant.MIN_SPU_AMOUNT; + } + // 分摊的优惠金额不能大于商品实际金额, 取最小值 + else if (shareReduce > shopCartItem.getActualTotal()) { + // 分摊的优惠金额 不能大于商品金额 + shareReduce = shopCartItem.getActualTotal() - Constant.MIN_SPU_AMOUNT; + } + + // 写入优惠金额 + if (Objects.equals(chooseCoupon.getShopId(), 0L)) { + // 平台分摊的每一个购物项优惠金额 + shopCartItem.setPlatformShareReduce(shopCartItem.getPlatformShareReduce() + shareReduce); + shopCartItem.setPlatformCouponAmount(shareReduce); + } else { + // 商家分摊的每一个购物项优惠金额 + shopCartItem.setShareReduce(shopCartItem.getShareReduce() + shareReduce); + shopCartItem.setShopCouponAmount(shareReduce); + } + shopCartItem.setActualTotal(shopCartItem.getActualTotal() - shareReduce); + sumReduce = shareReduce + sumReduce; + } + + shopCartItems.sort(Comparator.comparing(ShopCartItemVO::getActualTotal).reversed()); + // 如果优惠金额分摊后还有剩余,就再分摊一次 + for (ShopCartItemVO shopCartItem : shopCartItems) { + // 套餐商品不参与优惠券, 或者优惠券不分滩 + boolean notShareReduce = (Objects.nonNull(shopCartItem.getComboId()) && shopCartItem.getComboId() != 0) || shopCartItem.getIsShareReduce() != 1; + // 可分摊优惠金额,且优惠金额还有剩余 + if (!notShareReduce && sumReduce < chooseCoupon.getReduceAmount()) { + sumReduce = this.reassembleAmount(sumReduce, shopCartItem); + } + + Long actualShareReduce = Objects.equals(chooseCoupon.getShopId(), 0L) ? shopCartItem.getPlatformCouponAmount() : shopCartItem.getShopCouponAmount(); + if (Objects.isNull(actualShareReduce)) { + actualShareReduce = Constant.ZERO_LONG; + } + // 将对应店铺优惠券优惠的金额放入map中 + if (shopReduceMap.containsKey(shopCartItem.getShopId())) { + Long shopReduce = shopReduceMap.get(shopCartItem.getShopId()); + shopReduceMap.put(shopCartItem.getShopId(), shopReduce + actualShareReduce); + } else { + shopReduceMap.put(shopCartItem.getShopId(), actualShareReduce); + } + } + couponReduce = sumReduce; + // 最终如果使用的优惠金额为0,则表示没有使用任何优惠券 + if(sumReduce == 0L && chooseCoupon.getReduceAmount() > 0L){ + couponReduce = 0L; + for (CouponOrderVO shopCoupon : shopCoupons) { + if(Objects.equals(chooseCoupon.getCouponId(),shopCoupon.getCouponId())){ + shopCoupon.setChoose(false); + shopCoupon.setCanUse(false); + chooseCoupon = null; + break; + } + } + } + } + + private long reassembleAmount(long sumReduce, ShopCartItemVO shopCartItem) { + // 当前分摊的优惠金额小于优惠券优惠金额, 再给各个商品分摊下, 按实际金额从大到小 + long shareReduce = Constant.ZERO_LONG; + // 如果实际金额 大于 0.01, 就再加一点优惠金额 + if (shopCartItem.getActualTotal() > Constant.MIN_SPU_AMOUNT) { + long actualShareReduce = chooseCoupon.getReduceAmount() - sumReduce; + // 计算还可以分摊的金额 - 商品剩余可用于分摊的金额 和 优惠券剩余的可分摊金额 取最小值 + shareReduce = Math.min(shopCartItem.getActualTotal() - Constant.MIN_SPU_AMOUNT, actualShareReduce); + } + if (shareReduce <= 0) { + return sumReduce; + } + + // 写入优惠金额 + if (Objects.equals(chooseCoupon.getShopId(), 0L)) { + // 平台分摊的每一个购物项优惠金额 + shopCartItem.setPlatformShareReduce(shopCartItem.getPlatformShareReduce() + shareReduce); + shopCartItem.setPlatformCouponAmount(shopCartItem.getPlatformCouponAmount() + shareReduce); + } else { + // 商家分摊的每一个购物项优惠金额 + shopCartItem.setShareReduce(shopCartItem.getShareReduce() + shareReduce); + shopCartItem.setShopCouponAmount(shopCartItem.getShopCouponAmount() + shareReduce); + } + sumReduce = sumReduce + shareReduce; + shopCartItem.setActualTotal(shopCartItem.getActualTotal() + shareReduce); + return sumReduce; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/CouponUserVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/CouponUserVO.java new file mode 100644 index 0000000..1ab6809 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/CouponUserVO.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 优惠券用户关联信息VO + * + * @author YXF + * @date 2020-12-08 17:22:57 + */ +public class CouponUserVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "优惠券用户ID") + private Long couponUserId; + + @Schema(description = "优惠券ID") + private Long couponId; + + @Schema(description = "用户ID") + private Long userId; + + @Schema(description = "领券时间") + private Date receiveTime; + + @Schema(description = "开始时间") + private Date userStartTime; + + @Schema(description = "结束时间") + private Date userEndTime; + + @Schema(description = "优惠券状态 0:失效 1:有效 2:使用过") + private Integer status; + + @Schema(description = "优惠券是否被删除 0:未删除 1:已删除") + private Integer isDelete; + + @Schema(description = "优惠券信息") + private CouponVO couponVO; + + public Long getCouponUserId() { + return couponUserId; + } + + public void setCouponUserId(Long couponUserId) { + this.couponUserId = couponUserId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public Date getUserStartTime() { + return userStartTime; + } + + public void setUserStartTime(Date userStartTime) { + this.userStartTime = userStartTime; + } + + public Date getUserEndTime() { + return userEndTime; + } + + public void setUserEndTime(Date userEndTime) { + this.userEndTime = userEndTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsDelete() { + return isDelete; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + public CouponVO getCouponVO() { + return couponVO; + } + + public void setCouponVO(CouponVO couponVO) { + this.couponVO = couponVO; + } + + @Override + public String toString() { + return "CouponUserVO{" + + "couponUserId=" + couponUserId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",couponId=" + couponId + + ",userId=" + userId + + ",receiveTime=" + receiveTime + + ",userStartTime=" + userStartTime + + ",userEndTime=" + userEndTime + + ",status=" + status + + ",isDelete=" + isDelete + + ",couponVO=" + couponVO + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/mongo/MongoCouponUserCountVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/mongo/MongoCouponUserCountVO.java new file mode 100644 index 0000000..080b5c9 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/mongo/MongoCouponUserCountVO.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +@Document("coupon_user") +public class MongoCouponUserCountVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "优惠券id") + private Long couponId; + + @Schema(description = "返回数量") + private Integer count; + + @Schema(description = "全部数量") + private Long allCount; + + @Schema(description = "平台券数量") + private Long platformCount; + + @Schema(description = "店铺券数量") + private Long multishopCount; + + @Schema(description = "未使用 优惠券的数量") + private Integer couponUsableNums; + + @Schema(description = "已使用 优惠券的数量") + private Integer couponUsedNums; + + @Schema(description = "已过期 优惠券的数量") + private Integer couponExpiredNums; + + @Schema(description = "已领取优惠券的数量(null/0:没有领取)") + private Integer hasReceive; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getAllCount() { + return allCount; + } + + public void setAllCount(Long allCount) { + this.allCount = allCount; + } + + public Long getPlatformCount() { + return platformCount; + } + + public void setPlatformCount(Long platformCount) { + this.platformCount = platformCount; + } + + public Long getMultishopCount() { + return multishopCount; + } + + public void setMultishopCount(Long multishopCount) { + this.multishopCount = multishopCount; + } + + public Integer getCouponUsableNums() { + return couponUsableNums; + } + + public void setCouponUsableNums(Integer couponUsableNums) { + this.couponUsableNums = couponUsableNums; + } + + public Integer getCouponUsedNums() { + return couponUsedNums; + } + + public void setCouponUsedNums(Integer couponUsedNums) { + this.couponUsedNums = couponUsedNums; + } + + public Integer getCouponExpiredNums() { + return couponExpiredNums; + } + + public void setCouponExpiredNums(Integer couponExpiredNums) { + this.couponExpiredNums = couponExpiredNums; + } + + public Integer getHasReceive() { + return hasReceive; + } + + public void setHasReceive(Integer hasReceive) { + this.hasReceive = hasReceive; + } + + @Override + public String toString() { + return "MongoCouponUserCountVO{" + + "userId=" + userId + + ", couponId=" + couponId + + ", count=" + count + + ", allCount=" + allCount + + ", platformCount=" + platformCount + + ", multishopCount=" + multishopCount + + ", couponUsableNums=" + couponUsableNums + + ", couponUsedNums=" + couponUsedNums + + ", couponExpiredNums=" + couponExpiredNums + + ", hasReceive=" + hasReceive + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/controller/app/SpuDiscountController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/controller/app/SpuDiscountController.java new file mode 100644 index 0000000..5abd4a4 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/controller/app/SpuDiscountController.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.controller.app; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.vo.DiscountOrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.discount.constant.SuitableProdTypeEnum; +import com.tmerclub.cloud.discount.service.DiscountService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * 满减满折优惠 + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:38 + */ +@RestController("appSpuDiscountController") +@RequestMapping("/ua/discount") +@Tag(name = "商品的满减满折优惠") +public class SpuDiscountController { + + @Autowired + private DiscountService discountService; + + @GetMapping("/get_discount_list") + @Operation(summary = "获取店铺、商品对应的促销活动", description = "通过商品id获取商品所有促销活动") + public ServerResponseEntity> getDiscountBySpuId(Long spuId, Long shopId) { + List discountList = discountService.listDiscountsAndItemsByShopId(shopId); + discountList.addAll(discountService.listDiscountsAndItemsByShopId(Constant.PLATFORM_SHOP_ID)); + Iterator iterator = discountList.iterator(); + while (iterator.hasNext()) { + DiscountOrderVO discount = iterator.next(); + if (Objects.equals(discount.getSuitableSpuType(), SuitableProdTypeEnum.ALL_SPU.value()) || discount.getSpuIds().contains(spuId)) { + continue; + } + iterator.remove(); + } + return ServerResponseEntity.success(discountList); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/dto/DiscountDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/dto/DiscountDTO.java new file mode 100644 index 0000000..8ec5981 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/dto/DiscountDTO.java @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 满减满折优惠DTO + * + * @author lhd + * @date 2020-12-10 13:43:38 + */ +public class DiscountDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "满减满折优惠id") + private Long discountId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "活动名称") + @NotNull(message = "活动名称不能为空") + private String discountName; + + @Schema(description = "枚举DiscountRule(0 满钱减钱 3满件打折)") + private Integer discountRule; + + @Schema(description = "减免类型 0按满足最高层级减一次 1每满一次减一次") + private Integer discountType; + + @Schema(description = "适用商品类型 0全部商品参与 1指定商品参与") + @Max(value = 1, message = "适用商品类型错误") + @Min(value = 0, message = "适用商品类型错误") + private Integer suitableSpuType; + + @Max(999999999) + @Schema(description = "最多减多少") + private Long maxReduceAmount; + + @Schema(description = "开始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; + + @Schema(description = "活动状态:(0:关闭、1:开启、2:违规下线、3:平台审核)") + @Min(value = 0, message = "活动添加或改变后的状态异常") + @Max(value = 3, message = "活动添加或改变后的状态异常") + private Integer status; + + @Schema(description = "手机端活动图片") + private String mobilePic; + + @Schema(description = "pc端活动列表图片") + private String pcPic; + + @Schema(description = "pc端活动背景图片") + private String pcBackgroundPic; + + @Schema(description = "商品Id列表") + private List spuIds; + + @Schema(description = "活动项") + private List discountItemList; + + private List shopIds; + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public List getDiscountItemList() { + return discountItemList; + } + + public void setDiscountItemList(List discountItemList) { + this.discountItemList = discountItemList; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getDiscountName() { + return discountName; + } + + public void setDiscountName(String discountName) { + this.discountName = discountName; + } + + public Integer getDiscountRule() { + return discountRule; + } + + public void setDiscountRule(Integer discountRule) { + this.discountRule = discountRule; + } + + public Integer getDiscountType() { + return discountType; + } + + public void setDiscountType(Integer discountType) { + this.discountType = discountType; + } + + public Integer getSuitableSpuType() { + return suitableSpuType; + } + + public void setSuitableSpuType(Integer suitableSpuType) { + this.suitableSpuType = suitableSpuType; + } + + public Long getMaxReduceAmount() { + return maxReduceAmount; + } + + public void setMaxReduceAmount(Long maxReduceAmount) { + this.maxReduceAmount = maxReduceAmount; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getMobilePic() { + return mobilePic; + } + + public void setMobilePic(String mobilePic) { + this.mobilePic = mobilePic; + } + + public String getPcPic() { + return pcPic; + } + + public void setPcPic(String pcPic) { + this.pcPic = pcPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + @Override + public String toString() { + return "DiscountDTO{" + + "discountId=" + discountId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", discountName='" + discountName + '\'' + + ", discountRule=" + discountRule + + ", discountType=" + discountType + + ", suitableSpuType=" + suitableSpuType + + ", maxReduceAmount=" + maxReduceAmount + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", status=" + status + + ", mobilePic='" + mobilePic + '\'' + + ", pcPic='" + pcPic + '\'' + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", spuIds=" + spuIds + + ", discountItemList=" + discountItemList + + ", shopIds=" + shopIds + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/dto/DiscountItemDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/dto/DiscountItemDTO.java new file mode 100644 index 0000000..e5f1f60 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/dto/DiscountItemDTO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 满减满折优惠项DTO + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:39 + */ +public class DiscountItemDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "满减满折优惠项id") + private Long discountItemId; + + @Schema(description = "满减满折优惠id") + private Long discountId; + + @Schema(description = "所需需要金额") + private Long needAmount; + + @Schema(description = "优惠(元/折)") + private Long discount; + + public Long getDiscountItemId() { + return discountItemId; + } + + public void setDiscountItemId(Long discountItemId) { + this.discountItemId = discountItemId; + } + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + public Long getNeedAmount() { + return needAmount; + } + + public void setNeedAmount(Long needAmount) { + this.needAmount = needAmount; + } + + public Long getDiscount() { + return discount; + } + + public void setDiscount(Long discount) { + this.discount = discount; + } + + @Override + public String toString() { + return "DiscountItemDTO{" + + "discountItemId=" + discountItemId + + ",discountId=" + discountId + + ",needAmount=" + needAmount + + ",discount=" + discount + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/feign/DiscountFeignController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/feign/DiscountFeignController.java new file mode 100644 index 0000000..22e2d88 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/feign/DiscountFeignController.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.feign; + +import com.tmerclub.cloud.api.discount.constant.DiscountRule; +import com.tmerclub.cloud.api.discount.feign.DiscountFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.product.vo.SpuDiscountAppVO; +import com.tmerclub.cloud.common.product.vo.search.SpuDiscountItemAppVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.BooleanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.discount.manager.DiscountConfirmOrderManager; +import com.tmerclub.cloud.discount.service.DiscountService; +import com.tmerclub.cloud.discount.vo.DiscountVO; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +@DubboService +public class DiscountFeignController implements DiscountFeignClient { + + @Autowired + private DiscountService discountService; + @Autowired + private DiscountConfirmOrderManager discountConfirmOrderManager; + + public static final Logger log = LoggerFactory.getLogger(DiscountFeignController.class); + + + @Override + public ServerResponseEntity calculateDiscountAndMakeUpShopCartAndAmount(ShopCartWithAmountVO shopCartWithAmountVO) { + List shopCarts = shopCartWithAmountVO.getShopCarts(); + + shopCarts = discountConfirmOrderManager.calculateDiscountAndMakeUpShopCartAndAmount(shopCarts); + + + long total = 0L; + int count = 0; + long reduce = 0L; + long totalTransfee = 0L; + long totalFreeTransfee = 0L; + ShopCartWithAmountVO shopCartWithAmount = new ShopCartWithAmountVO(); + for (ShopCartVO shopCart : shopCarts) { + List shopCartItemDiscounts = shopCart.getShopCartItemDiscounts(); + + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + List shopCartItems = shopCartItemDiscount.getShopCartItems(); + ChooseDiscountItemVO chooseDiscountItemVO = shopCartItemDiscount.getChooseDiscountItem(); + if (Objects.nonNull(chooseDiscountItemVO)) { + Long needPiece = getNeedPiece(chooseDiscountItemVO); + + reduce = getReduce(reduce, chooseDiscountItemVO, needPiece); + } + + for (ShopCartItemVO shopCartItem : shopCartItems) { + if (!BooleanUtil.isTrue(shopCartItem.getIsChecked())) { + continue; + } + count += shopCartItem.getCount(); + total += shopCartItem.getTotalAmount(); + if (Objects.nonNull(shopCartItem.getComboAmount())) { + //如果是套餐商品需要减去套餐优惠金额 + reduce += shopCartItem.getComboAmount(); + } + // 前端页面套餐商品小计显示(套餐商品计算套餐价) + if (Objects.nonNull(shopCartItem.getComboId()) && shopCartItem.getComboId() > 0) { + log.info("套餐商品重新计算总金额"); + double totalAmount = Arith.mul(shopCartItem.getSkuPriceFee(), shopCartItem.getCount()); + shopCartItem.setTotalAmount((long) totalAmount); + } + } + } + + recalculate(shopCartWithAmountVO, shopCart); + totalFreeTransfee += shopCart.getFreeTransfee(); + totalTransfee += shopCart.getTransfee(); + } + + shopCartWithAmount.setCount(count); + shopCartWithAmount.setTotalMoney(total); + shopCartWithAmount.setSubtractMoney(reduce); + shopCartWithAmount.setFinalMoney(total + totalTransfee - reduce); + shopCartWithAmount.setFreeTransfee(totalFreeTransfee); + shopCartWithAmount.setFreightAmount(totalTransfee); + shopCartWithAmount.setShopCarts(shopCarts); + + + return ServerResponseEntity.success(shopCartWithAmount); + } + + @Override + public ServerResponseEntity> spuDiscountList(Long shopId, Long spuId) { + List discountList = discountService.spuDiscountList(shopId, spuId); + List spuDiscountList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (DiscountVO discountVO : discountList) { + SpuDiscountAppVO spuDiscount = new SpuDiscountAppVO(); + spuDiscount.setDiscountId(discountVO.getDiscountId()); + spuDiscount.setDiscountName(discountVO.getDiscountName()); + spuDiscount.setDiscountRule(discountVO.getDiscountRule()); + spuDiscount.setDiscountType(discountVO.getDiscountType()); + spuDiscount.setMaxReduceAmount(discountVO.getMaxReduceAmount()); + spuDiscount.setDiscountItemList(BeanUtil.mapAsList(discountVO.getDiscountItemList(), SpuDiscountItemAppVO.class)); + spuDiscountList.add(spuDiscount); + } + return ServerResponseEntity.success(spuDiscountList); + } + + @Override + public ServerResponseEntity handleSpuOffline(List spuIds, List shopIds) { + discountService.handleSpuOffline(spuIds, shopIds); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity handleShopOffline(List shopIds) { + discountService.handleShopOffline(shopIds); + return ServerResponseEntity.success(); + } + + private static void recalculate(ShopCartWithAmountVO shopCartWithAmountVO, ShopCartVO shopCart) { + Map shopIdWithShopTransFee = null; + if (Objects.nonNull(shopCartWithAmountVO.getUserDeliveryInfo())) { + shopIdWithShopTransFee = shopCartWithAmountVO.getUserDeliveryInfo().getShopIdWithShopTransFee(); + } + // 要计算运费 + if (shopIdWithShopTransFee != null && shopIdWithShopTransFee.containsKey(shopCart.getShopId())) { + ShopTransFeeVO shopTransFeeVO = shopIdWithShopTransFee.get(shopCart.getShopId()); + + // 店铺的实付 = 购物车实付 + 运费 + shopCart.setActualTotal(shopCart.getActualTotal() + shopTransFeeVO.getTransfee()); + // 店铺免运费金额 + shopCart.setFreeTransfee(shopTransFeeVO.getFreeTransfee()); + //店铺优惠金额 = 优惠金额 + 减免运费 + shopCart.setShopReduce(shopCart.getShopReduce() + shopTransFeeVO.getFreeTransfee()); + + // 运费 + shopCart.setTransfee(shopTransFeeVO.getTransfee()); + } else { + shopCart.setFreeTransfee(0L); + shopCart.setTransfee(0L); + } + } + + private static long getReduce(long reduce, ChooseDiscountItemVO chooseDiscountItemVO, Long needPiece) { + // 如果满足优惠活动 + if (Objects.equals(DiscountRule.M2M.value(), chooseDiscountItemVO.getDiscountRule()) && chooseDiscountItemVO.getNeedAmount() <= chooseDiscountItemVO.getProdsPrice()) { + //满钱减钱 + reduce += chooseDiscountItemVO.getReduceAmount(); + } else if (Objects.equals(DiscountRule.P2D.value(), chooseDiscountItemVO.getDiscountRule()) && needPiece <= chooseDiscountItemVO.getCount()) { + //满件打折 + reduce += chooseDiscountItemVO.getReduceAmount(); + } + return reduce; + } + + private static Long getNeedPiece(ChooseDiscountItemVO chooseDiscountItemVO) { + Long needPiece = chooseDiscountItemVO.getNeedAmount(); + // 当规则为满件打折时 9.5折就是95、9.5元就是950,此时数据库存的是件数*100,还需除以100进行判断 + if (Objects.equals(DiscountRule.P2D.value(), chooseDiscountItemVO.getDiscountRule())) { + needPiece = PriceUtil.toDecimalPrice(needPiece).longValue(); + } + return needPiece; + } + + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/manager/DiscountConfirmOrderManager.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/manager/DiscountConfirmOrderManager.java new file mode 100644 index 0000000..017f578 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/manager/DiscountConfirmOrderManager.java @@ -0,0 +1,459 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.manager; + +import cn.hutool.core.collection.CollUtil; +import com.google.common.collect.Lists; +import com.tmerclub.cloud.api.discount.vo.DiscountSumVO; +import com.tmerclub.cloud.combo.service.ComboService; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.ShopCartItemDiscountType; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.product.constant.ShopCartSpuActivityType; +import com.tmerclub.cloud.common.product.vo.ComboSpuSkuVO; +import com.tmerclub.cloud.common.product.vo.ComboSpuVO; +import com.tmerclub.cloud.common.product.vo.ComboVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BooleanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 满减活动金额计算 + * + * @author FrozenWatermelon + */ +@Service +public class DiscountConfirmOrderManager { + + private final Logger LOGGER = LoggerFactory.getLogger(DiscountConfirmOrderManager.class); + + @Autowired + private DiscountManager discountManager; + @Autowired + private ComboService comboService; + + /** + * 计算优惠券和套餐活动 + * @param shopCarts 购物车信息 + * @return + */ + public List calculateDiscountAndMakeUpShopCartAndAmount(List shopCarts) { + List newShopCart = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ShopCartVO shopCart : shopCarts) { + newShopCart.add(reBuildShopCart(shopCart, shopCart.getShopCartItemDiscounts().get(0).getShopCartItems())); + } + return newShopCart; + } + + + /** + * 校验套餐活动的状态 + * @param shopCartItemDiscountVOList + * @return + */ + public ServerResponseEntity checkComboActivity(List shopCartItemDiscountVOList) { + Set comboIdSet = shopCartItemDiscountVOList.stream().map(shopCartItemDiscountVO -> shopCartItemDiscountVO.getChooseComboItemVo().getComboId()).collect(Collectors.toSet()); + Map comboMap = mapComboByComboIds(comboIdSet); + + for (Long comboId : comboIdSet) { + ComboVO comboVO = comboMap.get(comboId); + if (Objects.isNull(comboVO) || !Objects.equals(comboVO.getStatus(), 1)) { + LOGGER.info("套餐状态不可用,comboId:{}", comboId); + return ServerResponseEntity.showFailMsg("当前选择的套餐活动已经过期,请返回重新提交订单"); + } + + if (comboVO.getEndTime().getTime() < System.currentTimeMillis()) { + LOGGER.info("套餐已过期,comboId:{}", comboId); + return ServerResponseEntity.showFailMsg("当前选择的套餐活动已经过期,请返回重新提交订单"); + } + } + return ServerResponseEntity.success(); + } + + private ShopCartVO reBuildShopCart(ShopCartVO shopCart, List shopCartItems) { + // 购物车项顺序 + List cartOrderArr = shopCartItems.stream().map(ShopCartItemVO::getCartItemId).toList(); + // 订单项金额从小到大排序 + shopCartItems = shopCartItems.stream().sorted(Comparator.comparingDouble(ShopCartItemVO::getActualTotal)).collect(Collectors.toList()); + shopCart.setShopReduce(0L); + shopCart.setDiscountReduce(0L); + // 初步计算店铺中每个满减的优惠金额,并选择优惠最大的满减活动(自动选择触发条件:立即提交订单或者购物车不指定满减活动) + // 1.获取总的优惠金额 + // 2.将商品活动进行保存 + DiscountSumVO discountSum = discountManager.calculateDiscount(shopCart.getShopId(), shopCartItems); + List shopCartItemDiscountVOList = Lists.newArrayList(); + // 对数据经行组装 + // 通过活动项id划分,获取有活动的商品项 + //如果是套餐商品不划分 + for (ShopCartItemVO shopCartItem : shopCartItems) { + if (Objects.nonNull(shopCartItem.getComboId()) && shopCartItem.getComboId() > 0) { + shopCartItem.setDiscountId(0L); + } + } + Map> hasDiscountShopCartItemMap = shopCartItems.stream().collect(Collectors.groupingBy(ShopCartItemVO::getDiscountId)); + long reduce = 0L; + long total = 0L; + long actualTotal = 0L; + int totalCount = 0; + for (Long discountId : hasDiscountShopCartItemMap.keySet()) { + // 获取该列表 + List shopCartItemvos = hasDiscountShopCartItemMap.get(discountId); + ChooseDiscountItemVO chooseDiscountItemVO = discountManager.getChooseDiscountItemVO(discountSum, discountId); + long discountAmount = 0L; + // 计算分摊优惠金额 + for (int index = 0; index < shopCartItemvos.size(); index++) { + ShopCartItemVO shopCartItem = shopCartItemvos.get(index); + total += shopCartItem.getTotalAmount(); + actualTotal += shopCartItem.getActualTotal(); + totalCount += shopCartItem.getCount(); + if (!BooleanUtil.isTrue(shopCartItem.getIsChecked())) { + continue; + } + + long shareReduce = 0L; + // 满减活动过期、删除等原因没有查询到时, 不需要计算满减的金额,直接下一个循环即可 + if (Objects.isNull(chooseDiscountItemVO)) { + shopCartItem.setShareReduce(shopCartItem.getShareReduce() + shareReduce); + shopCartItem.setActualTotal(shopCartItem.getActualTotal() - shareReduce); + continue; + } + + shareReduce = getShareReduce(shopCartItems, chooseDiscountItemVO, discountAmount, index, shopCartItem); + discountAmount += shareReduce; + } + discountAmount = this.recalculateDiscountAmount(shopCartItems, chooseDiscountItemVO, discountAmount); + + // 满减活动项信息中的优惠金额,更改为计算后实际的优惠金额, 一般情况下都是等于原本优惠金额 + // 极端情况为多个0.01的商品达到了满减的条件,但由于商品金额已经为最小值,无法再扣除优惠,而出现的实际满减金额小于活动设置的满减金额 + if (Objects.nonNull(chooseDiscountItemVO)) { + chooseDiscountItemVO.setReduceAmount(discountAmount); + } + // 计算总的优惠金额,一定要等满减金额计算完成不再变动后再进行总优惠金额的计算 + if (discountAmount > 0) { + reduce += discountAmount; + } + ShopCartItemDiscountVO shopCartItemDiscountVO = new ShopCartItemDiscountVO(); + // 把购物车项的商品顺序还原 + shopCartItemvos.sort(Comparator.comparingInt(prev -> cartOrderArr.indexOf(prev.getCartItemId()))); + Set comboSkuIds = shopCartItemvos.stream().map(ShopCartItemVO::getMainComboSkuId).filter(mainComboSkuId -> Objects.nonNull(mainComboSkuId)).collect(Collectors.toSet()); + shopCartItemDiscountVO.setComboMainSkuIds(comboSkuIds); + shopCartItemDiscountVO.setShopCartItems(shopCartItemvos); + shopCartItemDiscountVO.setChooseDiscountItem(chooseDiscountItemVO); + shopCartItemDiscountVOList.add(shopCartItemDiscountVO); + } + // 倒序排序,将拥有优惠活动的商品放到最上面 + Collections.reverse(shopCartItemDiscountVOList); + shopCart.setShopCartItemDiscounts(shopCartItemDiscountVOList); + //获取套餐商品 + buildComboShopCartBefore(shopCart); + //获取套餐优惠价格 + Long discounts = combDiscounts(shopCart); + shopCart = getShopCartVO(shopCart, reduce, total, actualTotal, totalCount, discounts); + return shopCart; + } + + private static long getShareReduce(List shopCartItems, ChooseDiscountItemVO chooseDiscountItemVO, long discountAmount, int index, ShopCartItemVO shopCartItem) { + long shareReduce = 0L; + if (index + 1 == shopCartItems.size()) { + shareReduce = chooseDiscountItemVO.getReduceAmount() - discountAmount; + // 不是列表中最后一项商品的优惠金额计算 - 按公式计算满减金额即可,偏差值留给最后一步再去计算 + } else { + // 分摊金额 = 该优惠活动优惠金额 * (商品金额 / 参与该活动的商品总金额) + shareReduce = PriceUtil.divideByBankerRounding(chooseDiscountItemVO.getReduceAmount() * shopCartItem.getActualTotal(), chooseDiscountItemVO.getProdsPrice()); + } + // 判断下满减优惠金额是否大于等于商品实际金额,由于商品的最小金额为0.01,所以满减优惠金额必须要小于商品实际金额 + if (shareReduce >= shopCartItem.getActualTotal()) { + shareReduce = shopCartItem.getActualTotal() - Constant.MIN_SPU_AMOUNT; + } + // 第一个优惠就是满减 + shopCartItem.setShareReduce(shopCartItem.getShareReduce() + shareReduce); + shopCartItem.setDiscountAmount(shareReduce); + shopCartItem.setActualTotal(shopCartItem.getActualTotal() - shareReduce); + return shareReduce; + } + + private long recalculateDiscountAmount(List shopCartItemList, ChooseDiscountItemVO chooseDiscountItemDto, long discountAmount) { + // 没有满减活动的信息, 或者优惠金额已分摊完成 + if (Objects.isNull(chooseDiscountItemDto) || discountAmount >= chooseDiscountItemDto.getReduceAmount()) { + return discountAmount; + } + // 如果实际计算的满减金额都是小于满减活动原本的优惠金额,再重新分摊下剩余的满减金额 + // 按商品实际金额倒序,从金额最大的开始分摊 + shopCartItemList.sort(Comparator.comparing(ShopCartItemVO::getActualTotal).reversed()); + for (ShopCartItemVO shopCartItem : shopCartItemList) { + // 未勾选不参与满减, 或者满减金额已分摊完毕 + if (!BooleanUtil.isTrue(shopCartItem.getIsChecked()) || discountAmount >= chooseDiscountItemDto.getReduceAmount()) { + continue; + } + // 商品剩余可分摊金额 = 商品实际金额 - 商品满减优惠金额(上面循环中计算的满减金额) - 商品最小金额(最小金额为0.01) + long canShareReduce = (shopCartItem.getActualTotal() - shopCartItem.getDiscountAmount()) - Constant.MIN_SPU_AMOUNT; + if (canShareReduce <= 0) { + continue; + } + // 满减剩余可分摊金额 + long shareReduce = chooseDiscountItemDto.getReduceAmount() - discountAmount; + // 商品剩余可分摊金额 和 满减剩余可分摊金额 取最小值 + shareReduce = Math.min(canShareReduce, shareReduce); + // 累加优惠金额 + shopCartItem.setShareReduce(shopCartItem.getShareReduce() + shareReduce); + shopCartItem.setDiscountAmount(shopCartItem.getShareReduce()); + shopCartItem.setActualTotal(shopCartItem.getActualTotal() - shareReduce); + discountAmount = discountAmount + shareReduce; + } + return discountAmount; + } + + /** + * 取出购物车中套餐商品 + * + * @param shopCart + */ + private void buildComboShopCartBefore(ShopCartVO shopCart) { + // 获取订单中所有套餐id + List shopCartComboItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 通过购物车生成的订单 + Set comboIdSet = new HashSet<>(shopCart.getShopCartItemDiscounts().size()); + + boolean shopCartOrder = loadComboShopCartItems(shopCartComboItems, comboIdSet, shopCart); + // 没有套餐活动需要处理 + if (CollUtil.isEmpty(shopCartComboItems)) { + return; + } + // 获取套餐信息 + Map comboMap = this.mapComboByComboIds(comboIdSet); + // 立即提交生成的订单,只包含一个套餐,组装套餐数据后直接返回 + if (!shopCartOrder) { + ComboVO comboVO = comboMap.get(shopCartComboItems.get(0).getComboId()); + ShopCartItemDiscountVO comboShopCartItemDiscountVOList = this.buildComboShopCart(shopCartComboItems, comboVO); + shopCart.getShopCartItemDiscounts().add(comboShopCartItemDiscountVOList); + return; + } + + // 购物车生成的订单,可以根据购物车id来区分不同套餐 + Map> comboShopCartItemMap = new HashMap<>(shopCartComboItems.size()); + for (ShopCartItemVO shopCartItemVO : shopCartComboItems) { + Long cartItemId; + if (Objects.isNull(shopCartItemVO.getParentCartItemId())) { + cartItemId = shopCartItemVO.getCartItemId(); + } else { + cartItemId = shopCartItemVO.getParentCartItemId(); + } + List shopCartItemList = comboShopCartItemMap.get(cartItemId); + if (Objects.isNull(shopCartItemList)) { + shopCartItemList = new ArrayList<>(Constant.INITIAL_CAPACITY); + comboShopCartItemMap.put(cartItemId, shopCartItemList); + } + shopCartItemList.add(shopCartItemVO); + } + List shopCartItemDiscountList = new ArrayList<>(comboShopCartItemMap.size()); + for (Map.Entry> entry : comboShopCartItemMap.entrySet()) { + List shopCartItemList = entry.getValue(); + ComboVO comboVO = comboMap.get(shopCartItemList.get(0).getComboId()); + ShopCartItemDiscountVO comboShopCartItemDiscountVOList = this.buildComboShopCart(shopCartItemList, comboVO); + shopCartItemDiscountList.add(comboShopCartItemDiscountVOList); + } + // 根据套餐加入时间排序(先加入的放后面,后加入的放前面) + shopCartItemDiscountList.sort(Comparator.comparing(ShopCartItemDiscountVO::getComboJoinTime).reversed()); + // 套餐活动放在前面, 将其他活动加到套餐的后面 + shopCartItemDiscountList.addAll(shopCart.getShopCartItemDiscounts()); + shopCart.setShopCartItemDiscounts(shopCartItemDiscountList); + } + + private static boolean loadComboShopCartItems(List shopCartComboItems, Set comboIdSet, ShopCartVO shopCart) { + ListIterator discountIterator = shopCart.getShopCartItemDiscounts().listIterator(); + boolean shopCartOrder = false; + while (discountIterator.hasNext()) { + List shopCartItems = discountIterator.next().getShopCartItems(); + Iterator shopCartItemsIterator = shopCartItems.iterator(); + while (shopCartItemsIterator.hasNext()) { + ShopCartItemVO cartItemVO = shopCartItemsIterator.next(); + if (Objects.nonNull(cartItemVO.getComboId()) && cartItemVO.getComboId() > 0) { + shopCartComboItems.add(cartItemVO); + shopCartItemsIterator.remove(); + } + } + if (shopCartComboItems.size() == 0) { + continue; + } + // 加入套餐id + for (ShopCartItemVO shopCartItem : shopCartComboItems) { + comboIdSet.add(shopCartItem.getComboId()); + // 订单项中包含主商品的购物车id,证明是由购物车生成的订单 + if (!shopCartOrder && Objects.nonNull(shopCartItem.getParentCartItemId())) { + shopCartOrder = true; + } + } + // 活动中的订单项为空,则删除此活动对象;套餐商品会生成新的 + if (CollUtil.isEmpty(shopCart.getShopCartItemDiscounts())) { + discountIterator.remove(); + } + } + return shopCartOrder; + } + + /** + * 组装套餐信息 + * + * @param shopCartComboItems 套餐订单项列表 + * @param comboVO 套餐数据 + * @return + */ + private ShopCartItemDiscountVO buildComboShopCart(List shopCartComboItems, ComboVO comboVO) { + // 没有发现套餐主商品,说明套餐订单数据错误,抛出异常 + if (Objects.isNull(comboVO) && Objects.equals(comboVO.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException("套餐数据发生变更,请重新下单"); + } + List shopCartItemList = new ArrayList<>(shopCartComboItems.size()); + ShopCartItemDiscountVO shopCartItemDiscountVO = new ShopCartItemDiscountVO(); + shopCartItemDiscountVO.setType(ShopCartItemDiscountType.COMBO.value()); + shopCartItemDiscountVO.setShopCartItems(shopCartItemList); + + ChooseComboItemVo chooseComboItemVo = new ChooseComboItemVo(); + chooseComboItemVo.setComboId(comboVO.getComboId()); + chooseComboItemVo.setName(comboVO.getName()); + shopCartItemDiscountVO.setChooseComboItemVo(chooseComboItemVo); + + + // 套餐结束时间小于当前时间,套餐活动已结束 + long currentTime = System.currentTimeMillis(); + if (comboVO.getEndTime().getTime() <= currentTime) { + throw new LuckException("套餐活动已结束"); + } + + Map shopCartItemMap = shopCartComboItems.stream().collect(Collectors.toMap(ShopCartItemVO::getSpuId, Function.identity())); + + // 先放入套餐主商品 + ComboSpuVO mainSpu = comboVO.getMainSpu(); + // 没有发现套餐主商品,说明套餐订单数据错误,抛出异常 + if (!shopCartItemMap.containsKey(mainSpu.getSpuId())) { + throw new LuckException("套餐数据发生变更,请重新下单"); + } + ShopCartItemVO mainShopCartItem = shopCartItemMap.get(mainSpu.getSpuId()); + handleComboSpu(mainShopCartItem, mainSpu); + // 订单套餐活动信息-设置套餐数量 + chooseComboItemVo.setComboCount(mainShopCartItem.getComboCount()); + // 先加入主商品到订单项列表 + shopCartItemList.add(mainShopCartItem); + + // 插入搭配商品,并校验是否必选 + for (ComboSpuVO matchingSpu : comboVO.getMatchingSpus()) { + if (!shopCartItemMap.containsKey(matchingSpu.getSpuId())) { + // 搭配商品为必选,但订单项中没有包含 + if (Objects.equals(matchingSpu.getRequired(), 1)) { + throw new LuckException("套餐必选商品没有在订单中,请重新下单"); + } + continue; + } + ShopCartItemVO shopCartItemVO = shopCartItemMap.get(matchingSpu.getSpuId()); + handleComboSpu(shopCartItemVO, matchingSpu); + shopCartItemList.add(shopCartItemVO); + } + + //重新计算套餐价格 + long comboTotalAmount = 0L; + //套餐金额(套餐单价) + long comboAmount = 0L; + //套餐优惠价格 + long preferentialAmount = 0L; + for (ShopCartItemVO shopCartItemVO : shopCartItemList) { + comboTotalAmount += shopCartItemVO.getMatchingPrice() * shopCartItemVO.getCount(); + comboAmount += shopCartItemVO.getMatchingPrice() * shopCartItemVO.getCount(); + //商品sku套餐价格 + //sku原价 + Long skuPriceFee = shopCartItemVO.getSkuPriceFee() * shopCartItemVO.getCount(); + //sku套餐价格 + Long comboSkuPrice = shopCartItemVO.getMatchingPrice() * shopCartItemVO.getCount(); + //单个sku优惠金额 + long onePreferentialAmount = skuPriceFee - comboSkuPrice; + preferentialAmount = preferentialAmount + onePreferentialAmount; + shopCartItemVO.setComboAmount(onePreferentialAmount); + shopCartItemVO.setActualTotal(comboSkuPrice); + shopCartItemVO.setShareReduce(shopCartItemVO.getShareReduce() + shopCartItemVO.getComboAmount()); + } + chooseComboItemVo.setComboTotalAmount(comboTotalAmount); + chooseComboItemVo.setComboAmount(comboAmount); + chooseComboItemVo.setPreferentialAmount(preferentialAmount); + shopCartItemDiscountVO.setComboJoinTime(shopCartItemList.get(0).getCreateTime()); + + return shopCartItemDiscountVO; + } + + private static void handleComboSpu(ShopCartItemVO shopCartItem, ComboSpuVO mainSpu) { + for (ComboSpuSkuVO comboSpuSkuVO : mainSpu.getSkuList()) { + if (!Objects.equals(comboSpuSkuVO.getSkuId(), shopCartItem.getSkuId())) { + continue; + } + //设置商品套餐价格 + shopCartItem.setMatchingPrice(comboSpuSkuVO.getMatchingPrice()); + // 商品数量 = 套餐数量 * 起搭数量 + shopCartItem.setCount(shopCartItem.getComboCount() * mainSpu.getLeastNum()); + } + } + private Map mapComboByComboIds(Set comboIdSet) { + List comboIds = new ArrayList<>(comboIdSet); + if (comboIdSet.size() == 1) { + ComboVO comboVO = comboService.getComboInfoByComboId(comboIds.remove(0)); + return Collections.singletonMap(comboVO.getComboId(), comboVO); + } + + Map comboMap = RedisUtil.mapByIds(CacheNames.SINGLE_COMBO_INFO, comboIds, ComboVO.class); + if (comboMap.size() == comboIds.size()) { + return comboMap; + } + comboIds.forEach(comboId -> { + if (!comboMap.containsKey(comboId)) { + comboMap.put(comboId, comboService.getComboInfoByComboId(comboIds.remove(0))); + } + }); + return comboMap; + } + + /** + * 获取套餐优惠金额 + * + * @param shopCart + * @return + */ + private Long combDiscounts(ShopCartVO shopCart) { + Long discountsSum = 0L; + List shopCartItemDiscounts = shopCart.getShopCartItemDiscounts(); + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + if (Objects.equals(shopCartItemDiscount.getType(), ShopCartSpuActivityType.COMBO.value())) { + discountsSum += shopCartItemDiscount.getChooseComboItemVo().getPreferentialAmount(); + } + } + return discountsSum; + } + + + private ShopCartVO getShopCartVO(ShopCartVO shopCart, long reduce, long total, long actualTotal, int totalCount, Long discounts) { + shopCart.setTotal(total); + shopCart.setTotalCount(totalCount); + shopCart.setActualTotal(actualTotal - reduce - discounts); + shopCart.setDiscountReduce(reduce); + // 最开始的店铺满减 + shopCart.setShopReduce(reduce); + shopCart.setShopReduce(reduce + discounts); + shopCart.setShopComboAmount(discounts); + return shopCart; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/manager/DiscountManager.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/manager/DiscountManager.java new file mode 100644 index 0000000..20429d7 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/manager/DiscountManager.java @@ -0,0 +1,320 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.discount.constant.DiscountRule; +import com.tmerclub.cloud.api.discount.vo.DiscountSumItemVO; +import com.tmerclub.cloud.api.discount.vo.DiscountSumVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.vo.ChooseDiscountItemVO; +import com.tmerclub.cloud.common.order.vo.DiscountItemOrderVO; +import com.tmerclub.cloud.common.order.vo.DiscountOrderVO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.BooleanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.discount.constant.SuitableProdTypeEnum; +import com.tmerclub.cloud.discount.model.Discount; +import com.tmerclub.cloud.discount.service.DiscountService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 满减活动金额计算 + * + * @author FrozenWatermelon + */ +@Service +public class DiscountManager { + + private final Logger LOGGER = LoggerFactory.getLogger(DiscountManager.class); + + @Autowired + private DiscountService discountService; + + + /** + * 方法的作用 + * 1.计算优惠金额 + * 2. 并往productItems 设置满减优惠信息 + * + * @param shopId + * @param productItems + * @return + */ + public DiscountSumVO calculateDiscount(Long shopId, List productItems) { + DiscountSumVO discountSum = new DiscountSumVO(); + discountSum.setTotalReduceAmount(0L); + List discounts = discountService.listDiscountsAndItemsByShopId(shopId); + // 旧的商品数据,也就是第一次传入的商品数据 + List oldProdItems = new ArrayList<>(productItems); + // 以优惠活动id为key, 每个满减活动的活动信息 为value的map + // {优惠活动id:每个满减活动的活动信息} + Map discountIdDiscountSumItemMap = new HashMap<>(productItems.size()); + //保存满减的金额 + Long amount = 0L; + if (productItems.size() == 1 && productItems.get(0).getDiscountId() == 0) { + // 立即提交订单, 选择满减最高的活动 + ShopCartItemVO productItemDto = productItems.get(0); + for (DiscountOrderVO discount : discounts) { + long spuId = Objects.nonNull(productItemDto.getMainComboSpuId()) ? productItemDto.getMainComboSpuId() : productItemDto.getSpuId(); + //判断商品是否参与该活动 + boolean hasDiscount = isHasDiscount(discount, spuId); + if (!hasDiscount) { + continue; + } + //添加到活动列表 + DiscountOrderVO discountDto = new DiscountOrderVO(); + discountDto.setDiscountName(discount.getDiscountName()); + discountDto.setDiscountId(discount.getDiscountId()); + if (CollUtil.isEmpty(productItemDto.getDiscounts())) { + productItemDto.setDiscounts(new ArrayList<>(0)); + } + productItemDto.getDiscounts().add(discountDto); + //获取最高满减的活动 + DiscountSumItemVO discountSumItemDto = new DiscountSumItemVO(); + discountSumItemDto.setCount(productItemDto.getCount()); + if (productItemDto.getIsChecked() == 0) { + discountSumItemDto.setProdsPrice(0L); + } else { + discountSumItemDto.setProdsPrice(productItemDto.getActualTotal()); + } + findDiscountItemAndGetReduceAmount(discount, discountSumItemDto); + discountIdDiscountSumItemMap.put(discount.getDiscountId(), discountSumItemDto); + //该活动的满减金额大于前一个,则把满减活动替换成当前的活动 + if (productItemDto.getDiscountId() == 0 || amount < discountSumItemDto.getReduceAmount()) { + productItemDto.setDiscountId(discount.getDiscountId()); + discountSum.setTotalReduceAmount(discountSumItemDto.getReduceAmount()); + amount = discountSumItemDto.getReduceAmount(); + } + } + LOGGER.info("立即提交订单,选择满减最高的活动,满减活动id:{}", productItemDto.getDiscountId()); + } else { + // 购物车 + for (DiscountOrderVO discount : discounts) { + // 获取当前优惠的商品 + List hasCurrentDiscountProds = mergeDiscountProd(oldProdItems, discount); + DiscountSumItemVO discountSumItem = getDiscountSumItemVO(); + // 计算参与该活动的所有商品的商品金额,商品数量 + for (ShopCartItemVO hasDiscountProd : hasCurrentDiscountProds) { + if (BooleanUtil.isTrue(hasDiscountProd.getIsChecked())) { + // 套餐商品不计算进去 + if (Objects.nonNull(hasDiscountProd.getComboId()) && hasDiscountProd.getComboId() > 0) { + continue; + } + discountSumItem.setCount(discountSumItem.getCount() + hasDiscountProd.getCount()); + discountSumItem.setProdsPrice(discountSumItem.getProdsPrice() + hasDiscountProd.getTotalAmount()); + } + } + findDiscountItemAndGetReduceAmount(discount, discountSumItem); + discountIdDiscountSumItemMap.put(discount.getDiscountId(), discountSumItem); + discountSum.setTotalReduceAmount(discountSum.getTotalReduceAmount() + discountSumItem.getReduceAmount()); + } + LOGGER.info("购物车,计算满减活动,满减活动id:{}", discountIdDiscountSumItemMap.keySet()); + } + discountSum.setDiscountIdDiscountSumItemMap(discountIdDiscountSumItemMap); + return discountSum; + } + + private static DiscountSumItemVO getDiscountSumItemVO() { + DiscountSumItemVO discountSumItem = new DiscountSumItemVO(); + discountSumItem.setDiscount(0L); + discountSumItem.setDiscountItemId(-1L); + discountSumItem.setCount(0); + discountSumItem.setProdsPrice(0L); + discountSumItem.setNeedAmount(0L); + discountSumItem.setReduceAmount(0L); + return discountSumItem; + } + + public ChooseDiscountItemVO getChooseDiscountItemVO(DiscountSumVO discountSum, Long discountId) { + + ChooseDiscountItemVO chooseDiscountItemVO = null; + // 参与活动 + if (discountId != -1 && discountId != 0) { + Map discountIdDiscountSumItemMap = discountSum.getDiscountIdDiscountSumItemMap(); + DiscountSumItemVO discountSumItemVO = discountIdDiscountSumItemMap.get(discountId); + if (discountSumItemVO == null) { + return null; + } + + Discount discount = discountService.getDiscountByDiscountId(discountId); + if (Objects.nonNull(discount)) { + chooseDiscountItemVO = BeanUtil.map(discount, ChooseDiscountItemVO.class); + + chooseDiscountItemVO.setProdsPrice(discountSumItemVO.getProdsPrice()); + chooseDiscountItemVO.setCount(discountSumItemVO.getCount()); + chooseDiscountItemVO.setNeedAmount(discountSumItemVO.getNeedAmount()); + chooseDiscountItemVO.setDiscountItemId(discountSumItemVO.getDiscountItemId()); + chooseDiscountItemVO.setDiscount(discountSumItemVO.getDiscount()); + chooseDiscountItemVO.setReduceAmount(discountSumItemVO.getReduceAmount()); + } + } + return chooseDiscountItemVO; + } + + /** + * 1. 找出当前优惠活动属于那个优惠项 + * 2. 计算满减 + * + * @param discount 优惠活动 + */ + private void findDiscountItemAndGetReduceAmount(DiscountOrderVO discount, DiscountSumItemVO discountSumItemVO) { + // 枚举DiscountRule(0 满钱减钱 1满件减钱 2 满钱打折 3满件打折) + Integer discountRule = discount.getDiscountRule(); + // 减免类型 0按满足最高层级减一次 1每满一次减一次 + Integer discountType = discount.getDiscountType(); + + List discountItems = discount.getDiscountItems(); + + double prodCount = discountSumItemVO.getCount(); + Long prodsPrice = discountSumItemVO.getProdsPrice(); + + Long totalReduceAmount = 0L; + Long discountItemId = -1L; + for (DiscountItemOrderVO discountItem : discountItems) { + // 优惠(元/折) + Long reduceAmount = discountItem.getDiscount(); + + discountItemId = discountItem.getDiscountItemId(); + Long needAmount = discountItem.getNeedAmount(); + discountSumItemVO.setNeedAmount(needAmount); + discountSumItemVO.setDiscount(reduceAmount); + // 当规则为满钱减钱时 + if (Objects.equals(discountRule, DiscountRule.M2M.value()) && prodsPrice >= needAmount) { + totalReduceAmount = getTotalReduceAmountBySubMoney(discountType, prodsPrice, reduceAmount, needAmount); + break; + } + // 当规则为满件打折时 9.5折就是95、9.5元就是950,此时数据库存的是件数*100,还需除以100进行判断 + needAmount = PriceUtil.toDecimalPrice(needAmount).longValue(); + if (Objects.equals(discountRule, DiscountRule.P2D.value()) && prodCount >= needAmount) { + // (商品金额 * (1000 - 折扣比例)) / 1000 ,原本是正常除以10,因为比例乘以了100所以此处也是除以1000 + totalReduceAmount = PriceUtil.divideByBankerRounding(prodsPrice * (1000 - reduceAmount), 1000); + break; + } + } + // 如果是每满一次减一次,则需要判断上限 不为满钱减钱或者满足最高层级减一次情况下,需要判断上限 + if (discountType != 0 || !Objects.equals(discount.getDiscountRule(), 0)) { + totalReduceAmount = Math.min(discount.getMaxReduceAmount(), totalReduceAmount); + } + discountSumItemVO.setReduceAmount(totalReduceAmount); + discountSumItemVO.setDiscountItemId(discountItemId); + } + + private Long getTotalReduceAmountBySubMoney(Integer discountType, Long prodsPriceOrCount, Long reduceAmount, Long needAmount) { + Long totalReduceAmount; + if (discountType == 0) { + // 当商品价格大于最高层级时 + totalReduceAmount = reduceAmount; + } else { + // 查看满足多少次条件(向下取整) + long multi = prodsPriceOrCount / needAmount; + totalReduceAmount = reduceAmount * multi; + } + return totalReduceAmount; + } + + /** + * 合并当前优惠的商品 + * 注:如果oldProdItems商品有该优惠,则将其抽取出来,并且在oldProdItems中移除该商品 + * + * @param oldProdItems 商品项 + * @param discount 活动 + * @return + */ + private List mergeDiscountProd(List oldProdItems, DiscountOrderVO discount) { + + // 拥有当前优惠活动的商品 + List hasCurrentDiscountProds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ShopCartItemVO productItem : oldProdItems) { + long spuId = Objects.nonNull(productItem.getMainComboSpuId()) ? productItem.getMainComboSpuId() : productItem.getSpuId(); + // 查看商品是否包含优惠活动 + boolean hasDiscount = isHasDiscount(discount, spuId); +// if(productItem.getIsChecked() == 0){ +// hasDiscount = false; +// } + // 购物车商品数据中插入满减活动列表 + DiscountOrderVO discountOrderVO = new DiscountOrderVO(); + discountOrderVO.setDiscountId(discount.getDiscountId()); + discountOrderVO.setDiscountName(discount.getDiscountName()); + if (CollectionUtil.isEmpty(productItem.getDiscounts())) { + productItem.setDiscounts(new ArrayList<>(0)); + } + if (Objects.equals(discount.getSuitableSpuType(), SuitableProdTypeEnum.ALL_SPU.value()) || discount.getSpuIds().contains(spuId)) { + productItem.getDiscounts().add(discountOrderVO); + } + + // 商品选择了这个活动 + boolean prodChooseDiscount = Objects.equals(productItem.getDiscountId(), discount.getDiscountId()); + + // 如果商品不包含该优惠活动 + // 或用户选择不参与该活动,将活动清除 + if (!hasDiscount && prodChooseDiscount) { + // 将往productItems 设置满减优惠信息为【-1】 + productItem.setDiscountId(-1L); + } + // 如果 商品参与了该活动,将会分为几个步骤 + // 判断商品是否在这个活动中(如果用户没有为商品主动选择优惠活动,或选择的优惠活动与该满减的优惠活动一样 则视为商品在活动中) + else if (hasDiscount && prodChooseDiscount) { + + // 2. 将往productItems 设置满减优惠信息为【当前活动】 + productItem.setDiscountId(discount.getDiscountId()); + + // 3. 将该活动的商品统一起来 + hasCurrentDiscountProds.add(productItem); + } + // 如果商品参与该活动 + // 且用户没有主动放弃该活动 + else if (hasDiscount && productItem.getDiscountId() == 0) { + + // 2. 将往productItems 设置满减优惠信息为【当前活动】 + productItem.setDiscountId(discount.getDiscountId()); + + // 3. 将该活动的商品统一起来 + hasCurrentDiscountProds.add(productItem); + } + } + + return hasCurrentDiscountProds; + } + + /** + * 查看商品是否包含优惠活动 + * + * @param discount 当前优惠活动信息 + * @param spuId 当前商品id + * @return + */ + private boolean isHasDiscount(DiscountOrderVO discount, Long spuId) { + boolean hasDiscount = false; + List spuIds = discount.getSpuIds(); + // 所有商品都含有该优惠 + if (Objects.equals(discount.getSuitableSpuType(), 0)) { + hasDiscount = true; + } else if (Objects.equals(discount.getSuitableSpuType(), 1)) { + // 指定商品含有该优惠 + for (Long spuIdVO : spuIds) { + if (Objects.equals(spuIdVO, spuId)) { + hasDiscount = true; + break; + } + } + } + return hasDiscount; + } + + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/mapper/DiscountItemMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/mapper/DiscountItemMapper.java new file mode 100644 index 0000000..2b85c1b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/mapper/DiscountItemMapper.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.mapper; + +import com.tmerclub.cloud.discount.dto.DiscountItemDTO; +import com.tmerclub.cloud.discount.model.DiscountSpu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 满减满折优惠项 + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:39 + */ +public interface DiscountItemMapper { + + /** + * 根据满减满折id删除满减满折优惠项 + * @param discountId + */ + void deleteByDiscountId(@Param("discountId") Long discountId); + + /** + * 批量插入满减项 + * @param discountItems 满减项列表 + */ + void insertDiscountItems(@Param("discountItems") List discountItems); + + /** + * 查询出所有为可用商品类型的满减活动的,包含需要处理商品id,进行删除 + * @param spuIds 商品ids + * @return 在活动中的商品 + */ + List listDiscountBySpuIds(@Param("spuIds") List spuIds); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/mapper/DiscountSpuMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/mapper/DiscountSpuMapper.java new file mode 100644 index 0000000..fa497cc --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/mapper/DiscountSpuMapper.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.mapper; + +import com.tmerclub.cloud.discount.model.DiscountSpu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 满减满折商品关联表 + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:38 + */ +public interface DiscountSpuMapper { + /** + * 根据满减满折id删除满减满折商品关联表 + * + * @param discountId + */ + void deleteByDiscountId(@Param("discountId") Long discountId); + + /** + * 批量插入活动和商品关联信息 + * + * @param discountSpus 活动和商品关联信息列表 + */ + void insertDiscountSpuList(@Param("discountSpuList") List discountSpus); + + /** + * 获取活动商品信息 + * + * @param discountId 活动id + * @return 活动商品信息 + */ + List getDiscountSpuByDiscountId(@Param("discountId") Long discountId); + + /** + * 批量删除商品和活动的关联信息 + * + * @param spuIds 商品ids + */ + void deleteBySpuIds(@Param("spuIds") List spuIds); + + /** + * 获取关联的商品列表 + * + * @param discountId + * @return + */ + List listSpuIdByDiscountId(@Param("discountId") Long discountId); + + /** + * 根据满减满折id列表删除满减满折商品关联表 + * + * @param discountIds + */ + void deleteBatchByDiscountIds(@Param("discountIds") List discountIds); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/model/Discount.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/model/Discount.java new file mode 100644 index 0000000..a5458f1 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/model/Discount.java @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 满减满折优惠 + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:38 + */ +public class Discount extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 满减满折优惠id + */ + private Long discountId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 活动名称 + */ + private String discountName; + + /** + * 枚举DiscountRule(0 满钱减钱 3满件打折) + */ + private Integer discountRule; + + /** + * 减免类型 0按满足最高层级减一次 1每满一次减一次 + */ + private Integer discountType; + + /** + * 适用商品类型 0全部商品参与 1指定商品参与 + */ + private Integer suitableSpuType; + + /** + * 最多减多少 + */ + private Long maxReduceAmount; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; + + /** + * 活动状态:(0:关闭、1:开启、2:违规下线、3:平台审核) + */ + private Integer status; + + /** + * 手机端活动图片 + */ + private String mobilePic; + + /** + * pc端活动列表图片 + */ + private String pcPic; + + /** + * pc端活动背景图片 + */ + private String pcBackgroundPic; + + /** + * 满减满折优惠项 + */ + private List discountItems; + + /** + * 满减满折商品 + */ + private List discountSpus; + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getDiscountName() { + return discountName; + } + + public void setDiscountName(String discountName) { + this.discountName = discountName; + } + + public Integer getDiscountRule() { + return discountRule; + } + + public void setDiscountRule(Integer discountRule) { + this.discountRule = discountRule; + } + + public Integer getDiscountType() { + return discountType; + } + + public void setDiscountType(Integer discountType) { + this.discountType = discountType; + } + + public Integer getSuitableSpuType() { + return suitableSpuType; + } + + public void setSuitableSpuType(Integer suitableSpuType) { + this.suitableSpuType = suitableSpuType; + } + + public Long getMaxReduceAmount() { + return maxReduceAmount; + } + + public void setMaxReduceAmount(Long maxReduceAmount) { + this.maxReduceAmount = maxReduceAmount; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getMobilePic() { + return mobilePic; + } + + public void setMobilePic(String mobilePic) { + this.mobilePic = mobilePic; + } + + public String getPcPic() { + return pcPic; + } + + public void setPcPic(String pcPic) { + this.pcPic = pcPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + public List getDiscountItems() { + return discountItems; + } + + public void setDiscountItems(List discountItems) { + this.discountItems = discountItems; + } + + public List getDiscountSpus() { + return discountSpus; + } + + public void setDiscountSpus(List discountSpus) { + this.discountSpus = discountSpus; + } + + @Override + public String toString() { + return "Discount{" + + "discountId=" + discountId + + ", shopId=" + shopId + + ", discountName='" + discountName + '\'' + + ", discountRule=" + discountRule + + ", discountType=" + discountType + + ", suitableSpuType=" + suitableSpuType + + ", maxReduceAmount=" + maxReduceAmount + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", status=" + status + + ", mobilePic='" + mobilePic + '\'' + + ", pcPic='" + pcPic + '\'' + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", discountItems=" + discountItems + + ", discountSpus=" + discountSpus + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/model/DiscountItem.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/model/DiscountItem.java new file mode 100644 index 0000000..2bf0303 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/model/DiscountItem.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 满减满折优惠项 + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:39 + */ +public class DiscountItem extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 满减满折优惠项id + */ + private Long discountItemId; + + /** + * 满减满折优惠id + */ + private Long discountId; + + /** + * 所需需要金额 + */ + private Long needAmount; + + /** + * 优惠(元/折) + */ + private Long discount; + + public Long getDiscountItemId() { + return discountItemId; + } + + public void setDiscountItemId(Long discountItemId) { + this.discountItemId = discountItemId; + } + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + public Long getNeedAmount() { + return needAmount; + } + + public void setNeedAmount(Long needAmount) { + this.needAmount = needAmount; + } + + public Long getDiscount() { + return discount; + } + + public void setDiscount(Long discount) { + this.discount = discount; + } + + @Override + public String toString() { + return "DiscountItem{" + + "discountItemId=" + discountItemId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",discountId=" + discountId + + ",needAmount=" + needAmount + + ",discount=" + discount + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/service/DiscountSpuService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/service/DiscountSpuService.java new file mode 100644 index 0000000..367e92a --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/service/DiscountSpuService.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.service; + +import java.util.List; + +/** + * 满减满折商品关联表 + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:38 + */ +public interface DiscountSpuService { + + /** + * 获取关联的商品列表 + * @param discountId + * @return + */ + List listSpuIdByDiscountId(Long discountId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/BindInvalidReasonEnum.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/BindInvalidReasonEnum.java new file mode 100644 index 0000000..6630ad5 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/BindInvalidReasonEnum.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * 失效原因 + * + * @author cl + * @date 2021-08-14 13:27:17 + */ +public enum BindInvalidReasonEnum { + + /** + * 管理员更改 + */ + ADMIN(1, "管理员更改"), + + /** + * 封禁 + */ + CLEAR(2, "封禁"); + + private final int value; + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + BindInvalidReasonEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static BindInvalidReasonEnum instance(Integer value) { + BindInvalidReasonEnum[] enums = values(); + for (BindInvalidReasonEnum reasonEnum : enums) { + if (reasonEnum.value().equals(value)) { + return reasonEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DUserType.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DUserType.java new file mode 100644 index 0000000..786c0f2 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DUserType.java @@ -0,0 +1,45 @@ +package com.tmerclub.cloud.distribution.constant; + +/** + * @author + */ + +public enum DUserType { + + /** + * 用户 + */ + MY_USER(1, "我的用户"), + /** + * 好友 + */ + MY_FRIEND(2, "我的好友"); + + private final Integer value; + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + DUserType(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static DUserType instance(Integer value) { + DUserType[] enums = values(); + for (DUserType dUserType : enums) { + if (dUserType.value().equals(value)) { + return dUserType; + } + } + return null; + } + + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionAuditStateEnum.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionAuditStateEnum.java new file mode 100644 index 0000000..1195257 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionAuditStateEnum.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * 审核状态:0 未审核 1已通过 -1未通过 + * + * @author cl + * @date 2021-08-16 14:06:36 + */ +public enum DistributionAuditStateEnum { + /** + * 未通过 + */ + NO_PASSED(-1, "未通过"), + /** + * 未审核 + */ + UNAUDITED(0, "未审核"), + /** + * 已通过 + */ + PASSED(1, "已通过"); + + private final int value; + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + DistributionAuditStateEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static DistributionAuditStateEnum instance(Integer value) { + DistributionAuditStateEnum[] enums = values(); + for (DistributionAuditStateEnum stateEnum : enums) { + if (stateEnum.value().equals(value)) { + return stateEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionAuditingState.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionAuditingState.java new file mode 100644 index 0000000..c44ab33 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionAuditingState.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * 分销员审核状态:0 未审核 1已通过 -1未通过 + * + * @author cl + * @date 2021-08-14 10:40:55 + */ +public enum DistributionAuditingState { + /** + * 未审核 + */ + UN_AUDIT(0, "未审核"), + /** + * 已通过 + */ + PASS(1, "已通过"), + /** + * 未通过 + */ + UN_PASS(-1, "未通过"); + + private final int value; + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + DistributionAuditingState(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static DistributionAuditingState instance(Integer value) { + DistributionAuditingState[] enums = values(); + for (DistributionAuditingState stateEnum : enums) { + if (stateEnum.value().equals(value)) { + return stateEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionUserIncomeStateEnum.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionUserIncomeStateEnum.java new file mode 100644 index 0000000..81dfd9e --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionUserIncomeStateEnum.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * 佣金状态(0:待支付、1:待结算、2:已结算、-1:订单失效) + * + * @author cl + * @date 2021-08-18 17:01:56 + */ +public enum DistributionUserIncomeStateEnum { + + /** + * 待支付 + */ + UN_PAY(0, "待支付"), + /** + * 待结算 + */ + UN_COMMISSION(1, "待结算"), + + /** + * 已结算 + */ + COMMISSION(2, "已结算"), + + /** + * 已失效 + */ + INVALID(-1, "已失效"), + ; + + private final int value; + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + DistributionUserIncomeStateEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static DistributionUserIncomeStateEnum instance(Integer value) { + DistributionUserIncomeStateEnum[] enums = values(); + for (DistributionUserIncomeStateEnum stateEnum : enums) { + if (stateEnum.value().equals(value)) { + return stateEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionWalletBillTypeEnum.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionWalletBillTypeEnum.java new file mode 100644 index 0000000..cb6bf4f --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionWalletBillTypeEnum.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * @author cl + * @date 2021-08-11 09:44:30 + */ +public enum DistributionWalletBillTypeEnum { + + /** + * 系统修改 + */ + SYSTEM(0), + + /** + * 人工修改 + */ + USER(1); + + private final Integer value; + + public Integer value() { + return value; + } + + DistributionWalletBillTypeEnum(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionWithdrawCashStateEnum.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionWithdrawCashStateEnum.java new file mode 100644 index 0000000..78c4a98 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionWithdrawCashStateEnum.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * @author cl + * @date 2021-08-17 10:05:59 + */ +public enum DistributionWithdrawCashStateEnum { + /** + * 申请中 + */ + APPLY(0, "申请中"), + /** + * 提现成功 + */ + CASH_SUCCESS(1, "提现成功"), + /** + * 拒绝提现 + */ + CASH_REJECT(2, "拒绝提现"), + /** + * 提现失败 + */ + CASH_FAIL(-1, "提现失败"); + + private final int value; + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + DistributionWithdrawCashStateEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static DistributionWithdrawCashStateEnum instance(Integer value) { + DistributionWithdrawCashStateEnum[] enums = values(); + for (DistributionWithdrawCashStateEnum stateEnum : enums) { + if (stateEnum.value().equals(value)) { + return stateEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/EnterprisePayStatus.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/EnterprisePayStatus.java new file mode 100644 index 0000000..c9f925f --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/EnterprisePayStatus.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * 商家转账状态 + * @author Yami + */ +public enum EnterprisePayStatus { + + /** + * 申请中 + */ + APPLY(1, "申请中"), + /** + * 成功 + */ + SUCCESS(2, "已完成"), + /** + * 满减 + */ + FAIL(-1, "失败"), + + ; + + private final Integer value; + private final String desc; + + public Integer getValue() { + return value; + } + + public String getDesc() { + return desc; + } + + EnterprisePayStatus(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + +} + + + diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/IncomeStateEnum.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/IncomeStateEnum.java new file mode 100644 index 0000000..3ca61cb --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/IncomeStateEnum.java @@ -0,0 +1,49 @@ +package com.tmerclub.cloud.distribution.constant; + +/** + * @author gaozijie + * @date 2023-06-02 + */ +public enum IncomeStateEnum { + /** + * 已失效 + */ + INVALID(-1, "已失效"), + /** + * 未支付 + */ + UN_PAY(0, "未支付"), + /** + * 未结算 + */ + UN_SETTLED(1, "未结算"), + /** + * 已结算 + */ + SETTLED(2, "已结算"); + + + private final int value; + private final String desc; + + public Integer value() { + return value; + } + public String desc() { + return desc; + } + + IncomeStateEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + public static IncomeStateEnum instance(Integer value) { + IncomeStateEnum[] enums = values(); + for (IncomeStateEnum typeEnum : enums) { + if (typeEnum.value().equals(value)) { + return typeEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/ParentAwardSet.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/ParentAwardSet.java new file mode 100644 index 0000000..b570490 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/ParentAwardSet.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * @Author lth + * @Date 2021/8/10 10:34 + * ("上级奖励设置(0 关闭 1开启)") + */ +public enum ParentAwardSet { + /** + * 关闭 + */ + CLOSE(0), + /** + * 开启 + */ + OPEN(1); + + private final Integer num; + + public Integer value() { + return num; + } + + ParentAwardSet(Integer num) { + this.num = num; + } + + public static ParentAwardSet instance(Integer value) { + ParentAwardSet[] enums = values(); + for (ParentAwardSet statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionSpuController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionSpuController.java new file mode 100644 index 0000000..798f894 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionSpuController.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.app; + +import com.tmerclub.cloud.api.distribution.vo.DistributionSpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.distribution.service.DistributionSpuService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 分销商品关联信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +@RestController("appDistributionSpuController") +@RequestMapping("/ua/distribution_spu") +@Tag(name = "app-分销商品关联信息") +public class DistributionSpuController { + + @Autowired + private DistributionSpuService distributionSpuService; + + @GetMapping + @Operation(summary = "获取分销商品关联信息", description = "根据distributionSpuId获取分销商品关联信息") + public ServerResponseEntity getByDistributionSpuId(@RequestParam Long distributionSpuId) { + return ServerResponseEntity.success(distributionSpuService.getByDistributionSpuId(distributionSpuId)); + } + + @GetMapping("/is_state") + @Operation(summary = "根据商品id与状态查看该分销商品是处于该状态", description = "根据商品id与状态查看该分销商品是处于该状态") + public ServerResponseEntity isStateBySpuIdAndState(@RequestParam("spuId") Long spuId, @RequestParam("state") Integer state) { + return ServerResponseEntity.success(distributionSpuService.isStateBySpuIdAndState(spuId, state)); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserBindController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserBindController.java new file mode 100644 index 0000000..e27d9ad --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserBindController.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.app; + +import com.tmerclub.cloud.api.platform.vo.DistributionRecruitConfigApiVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.distribution.constant.DistributionUserStateEnum; +import com.tmerclub.cloud.distribution.model.DistributionUser; +import com.tmerclub.cloud.distribution.service.DistributionConfigService; +import com.tmerclub.cloud.distribution.service.DistributionUserBindService; +import com.tmerclub.cloud.distribution.service.DistributionUserService; +import com.tmerclub.cloud.distribution.vo.DistributionUserInfoVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 分销员绑定关系 + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +@RestController("appDistributionUserBindController") +@RequestMapping("/distribution_user_bind") +@Tag(name = "分销员绑定关系") +public class DistributionUserBindController { + + private static final Logger logger = LoggerFactory.getLogger(DistributionUserBindController.class); + + @Autowired + private DistributionUserBindService distributionUserBindService; + @Autowired + private DistributionConfigService distributionConfigService; + @Autowired + private DistributionUserService distributionUserService; + + @PostMapping("/bind_user") + @Operation(summary = "绑定用户", description = "根据分销员卡号绑定用户") + @Parameters(@Parameter(name = "distributionUserId", description = "卡号", required = true)) + public ServerResponseEntity bindUser(@RequestParam Long distributionUserId) { + + Long userId = AuthUserContext.get().getUserId(); + logger.info("绑定用户distributionUserId:{}", distributionUserId); + + if (Objects.isNull(distributionUserId)) { + logger.error("获取推广员信息失败"); + return ServerResponseEntity.success(); + } + + DistributionUser shareUser = distributionUserService.getByDistributionUserId(distributionUserId); + + if (shareUser == null) { + logger.error("获取推广员信息失败"); + return ServerResponseEntity.success(); + } + if (!Objects.equals(DistributionUserStateEnum.NORMAL.value(), shareUser.getState())) { + logger.error("推广员状态异常"); + return ServerResponseEntity.success(); + } + DistributionRecruitConfigApiVO recruitConfigApiVO = distributionConfigService.getDistributionRecruitConfig(); + if (recruitConfigApiVO.getState() == 0) { + logger.error("推广计划已关闭"); + return ServerResponseEntity.success(); + } + // 绑定分销员 + int type = 0; + ServerResponseEntity serverResponse = distributionUserBindService.bindDistribution(shareUser, userId, type); + if (!serverResponse.isSuccess()) { + logger.error(serverResponse.getMsg()); + } + return ServerResponseEntity.success(); + } + + @GetMapping("/bind_user_list") + @Operation(summary = "绑定用户列表", description = "获取分销员所绑定的用户列表") + @Parameters(@Parameter(name = "userType", description = "类型 1 我的用户, 2 我的好友")) + public ServerResponseEntity> bindUserList(@RequestParam("userType") Integer userType) { + Long userId = AuthUserContext.get().getUserId(); + DistributionUserVO user = distributionUserService.getByUserId(userId); + List resultList = distributionUserService.getDistributionMyFriend(user, userType); + //distributionUserBindService.bindUserList(pageDTO, userId) + return ServerResponseEntity.success(resultList); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserController.java new file mode 100644 index 0000000..0090e68 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserController.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.app; + +import com.tmerclub.cloud.api.platform.vo.DistributionRecruitConfigApiVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.distribution.service.DistributionConfigService; +import com.tmerclub.cloud.distribution.service.DistributionUserIncomeService; +import com.tmerclub.cloud.distribution.service.DistributionUserService; +import com.tmerclub.cloud.distribution.vo.*; +import com.tmerclub.cloud.distribution.vo.*; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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.util.Objects; + +/** + * 分销员信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +@RestController("appDistributionUserController") +@RequestMapping("/distribution_user") +@Tag(name = "app-分销员信息") +public class DistributionUserController { + + @Autowired + private DistributionUserService distributionUserService; + @Autowired + private DistributionConfigService distributionConfigService; + @Autowired + private DistributionUserIncomeService distributionUserIncomeService; + + + + @GetMapping("/info") + @Operation(summary = "查看分销中心信息", description = "查看分销中心信息") + public ServerResponseEntity getByDistributionUserId() { + Long userId = AuthUserContext.get().getUserId(); + DistributionUserVO distributionUser = distributionUserService.getByUserId(userId); + if (Objects.isNull(distributionUser)) { + // 您还不是销售员 + throw new LuckException("您还不是销售员"); + } + AchievementDataVO achievementDataVO = distributionUserService.getAchievementDataById(distributionUser.getDistributionUserId()); + return ServerResponseEntity.success(achievementDataVO); + } + + @GetMapping("/distribution_user_info") + @Operation(summary = "分销员信息", description = "分销员信息") + public ServerResponseEntity getDistributionUserInfo() { + Long userId = AuthUserContext.get().getUserId(); + // 推广开关 + DistributionRecruitConfigApiVO recruitConfig = distributionConfigService.getDistributionRecruitConfig(); + DistributionUserVO distributionUser = distributionUserService.getByUserId(userId); + DistributionUserInfoVO distributionUserInfoVO = BeanUtil.map(distributionUser, DistributionUserInfoVO.class); + if (distributionUserInfoVO == null) { + distributionUserInfoVO = new DistributionUserInfoVO(); + } + distributionUserInfoVO.setRecruitState(recruitConfig.getState()); + return ServerResponseEntity.success(distributionUserInfoVO); + } + + + @GetMapping("/subordinate") + @Operation(summary = "查看下级", description = "查看下级") + public ServerResponseEntity> subordinatePage(@Valid PageDTO pageDTO) { + Long userId = AuthUserContext.get().getUserId(); + DistributionUserVO distributionUser = distributionUserService.getByUserId(userId); + PageVO pageVO = distributionUserService.getPageDistributionUserSimpleInfoByParentUserId(pageDTO, distributionUser.getDistributionUserId()); + return ServerResponseEntity.success(pageVO); + } + + @GetMapping("/distribution_orders") + @Operation(summary = "分页查看分销员佣金明细", description = "分页查看分销员佣金明细") + public ServerResponseEntity> getDistributionOrder(@Valid PageDTO pageDTO) { + Long userId = AuthUserContext.get().getUserId(); + DistributionUserVO distributionUser = distributionUserService.getByUserId(userId); + PageVO pageVO = distributionUserIncomeService.getDistributionOrderByDistributionUserId(pageDTO, distributionUser.getDistributionUserId()); + return ServerResponseEntity.success(pageVO); + } + + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserIncomeController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserIncomeController.java new file mode 100644 index 0000000..594a375 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserIncomeController.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.app; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.distribution.constant.DistributionUserStateEnum; +import com.tmerclub.cloud.distribution.service.DistributionUserIncomeService; +import com.tmerclub.cloud.distribution.service.DistributionUserService; +import com.tmerclub.cloud.distribution.vo.DistributionUserIncomeOrderVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserIncomeVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import com.tmerclub.cloud.distribution.vo.StatisticsDisUserIncomeVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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.util.Objects; + +/** + * 分销收入记录信息 + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +@RestController("appDistributionUserIncomeController") +@RequestMapping("/distribution_user_income") +@Tag(name = "app-分销收入记录信息") +public class DistributionUserIncomeController { + + @Autowired + private DistributionUserIncomeService distributionUserIncomeService; + + @Autowired + private DistributionUserService distributionUserService; + + @GetMapping("/page") + @Operation(summary = "获取分销收入记录信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + DistributionUserVO distributionUser = distributionUserService.getByUserId(AuthUserContext.get().getUserId()); + if (Objects.isNull(distributionUser)) { + throw new LuckException("您还不是分销员"); + } + PageVO incomePageVO = distributionUserIncomeService.getDistributionUserIncomePage(pageDTO, distributionUser.getDistributionUserId()); + return ServerResponseEntity.success(incomePageVO); + } + + @GetMapping("/statistics") + @Operation(summary = "统计分销员今日、本月的收益") + public ServerResponseEntity statisticsDistributionUserIncome() { + DistributionUserVO distributionUser = distributionUserService.getByUserId(AuthUserContext.get().getUserId()); + if (Objects.isNull(distributionUser)) { + throw new LuckException("您还不是分销员"); + } + return ServerResponseEntity.success(distributionUserIncomeService.statisticsDistributionUserIncome(distributionUser.getDistributionUserId())); + } + + @GetMapping("/my_promotion_order") + @Operation(summary = "我的推广订单", description = "通过状态获取我的推广订单(0:待支付 1:待结算 2:已结算 -1:订单失效)") + public ServerResponseEntity> getMyPromotionOrderByState(@Valid PageDTO pageDTO, Integer state) { + DistributionUserVO distributionUser = distributionUserService.getByUserId(AuthUserContext.get().getUserId()); + if (Objects.isNull(distributionUser)) { + throw new LuckException("您还不是分销员"); + } + if (!Objects.equals(distributionUser.getState(), DistributionUserStateEnum.NORMAL.value())) { + throw new LuckException("您的分销身份异常,请联系管理员"); + } + return ServerResponseEntity.success(distributionUserIncomeService.getMyPromotionOrderByState(pageDTO, distributionUser.getDistributionUserId(), state)); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserWalletController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserWalletController.java new file mode 100644 index 0000000..d638460 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionUserWalletController.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.app; + +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.dto.AllinpayBalanceDTO; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.distribution.model.DistributionUserWallet; +import com.tmerclub.cloud.distribution.service.DistributionUserService; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletBillService; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletService; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserWalletInfoVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +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.util.Objects; + +/** + * 分销员钱包信息 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +@RestController("appDistributionUserWalletController") +@RequestMapping("/distribution_user_wallet") +@Tag(name = "app-分销员钱包信息") +public class DistributionUserWalletController { + + @Autowired + private DistributionUserWalletService distributionUserWalletService; + + @Autowired + private DistributionUserService distributionUserService; + + + @Autowired + private DistributionUserWalletBillService distributionUserWalletBillService; + + @DubboReference + private ConfigFeignClient configFeignClient; + + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + + @GetMapping + @Operation(summary = "获取分销员钱包信息") + public ServerResponseEntity getByWalletId() { + Long userId = AuthUserContext.get().getUserId(); + //查看当前用户是否为分销员 + DistributionUserVO distributionUser = distributionUserService.getByUserId(userId); + if (Objects.isNull(distributionUser)) { + throw new LuckException("您还不是分销员"); + } + DistributionUserWallet distributionUserWallet = distributionUserWalletService.getByDistributionUserId(distributionUser.getDistributionUserId()); + //计算积累收益 + Long haveWithdrawalSum = distributionUserWalletBillService.getHaveWithdrawalSum(distributionUserWallet.getWalletId()); + distributionUserWallet.setAccumulateAmount(haveWithdrawalSum + distributionUserWallet.getSettledAmount()); + DistributionUserWalletInfoVO userWalletInfoVO = BeanUtil.map(distributionUserWallet, DistributionUserWalletInfoVO.class); + Integer paySysType = configFeignClient.getPaySysType().getData(); + // 如果是通联支付,分销钱包和用户余额打通,可提现金额为用户的余额 + if (Objects.equals(paySysType, PaySysType.ALLINPAY.value())) { + AllinpayBalanceDTO allinpayBalanceDTO = allinpayFeignClient.getAllinpayBalance(userId, PaySysType.ALLINPAY.value()).getData(); + userWalletInfoVO.setSettledAmount(Objects.isNull(allinpayBalanceDTO) ? 0L : allinpayBalanceDTO.getAllAmount() - allinpayBalanceDTO.getFreezenAmount()); + } + return ServerResponseEntity.success(userWalletInfoVO); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/multishop/DistributionSpuController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/multishop/DistributionSpuController.java new file mode 100644 index 0000000..13194a2 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/multishop/DistributionSpuController.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.multishop; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.distribution.vo.DistributionSpuVO; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.distribution.constant.DistributionSpuStatus; +import com.tmerclub.cloud.distribution.dto.DistributionSpuDTO; +import com.tmerclub.cloud.distribution.service.DistributionSpuService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 分销商品关联信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +@RestController("multishopDistributionSpuController") +@RequestMapping("/m/distribution_spu") +@Tag(name = "multishop-分销商品关联信息") +public class DistributionSpuController { + + @Autowired + private DistributionSpuService distributionSpuService; + + @GetMapping + @Operation(summary = "获取分销商品关联信息", description = "根据distributionSpuId获取分销商品关联信息") + public ServerResponseEntity getByDistributionSpuId(@RequestParam Long distributionSpuId) { + return ServerResponseEntity.success(distributionSpuService.getByDistributionSpuId(distributionSpuId)); + } + + @PostMapping + @Operation(summary = "保存分销商品关联信息", description = "保存分销商品关联信息") + public ServerResponseEntity save(@Valid @RequestBody DistributionSpuDTO distributionSpuDTO) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + distributionSpuDTO.setShopId(uidInfoBO.getTenantId()); + distributionSpuDTO.setModifier(uidInfoBO.getUserId()); + distributionSpuService.save(distributionSpuDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新分销商品关联信息", description = "更新分销商品关联信息") + public ServerResponseEntity update(@Valid @RequestBody DistributionSpuDTO distributionSpuDTO) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + distributionSpuDTO.setShopId(uidInfoBO.getTenantId()); + distributionSpuDTO.setModifier(uidInfoBO.getUserId()); + distributionSpuDTO.setState(null); + distributionSpuService.update(distributionSpuDTO); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除分销商品关联信息", description = "根据分销商品关联信息id删除分销商品关联信息") + public ServerResponseEntity delete(@RequestParam Long distributionSpuId) { + Long shopId = AuthUserContext.get().getTenantId(); + distributionSpuService.deleteByIdAndShopId(distributionSpuId, shopId); + return ServerResponseEntity.success(); + } + + + @GetMapping("/get_offline_handle_event") + @Operation(summary = "获取分销商品下线信息", description = "获取分销商品下线信息") + public ServerResponseEntity getOfflineHandleEvent(@RequestParam("distributionSpuId") Long distributionSpuId) { + return ServerResponseEntity.success(distributionSpuService.getOfflineHandleEvent(distributionSpuId)); + } + + @PostMapping("/audit_apply") + @Operation(summary = "违规分销商品提交重新上线申请", description = "违规分销商品提交重新上线申请") + public ServerResponseEntity auditApply(@RequestBody OfflineHandleEventDTO offlineHandleEventDTO) { + distributionSpuService.auditApply(offlineHandleEventDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_state") + @Operation(summary = "上架或下架分销商品", description = "上架或下架分销商品") + public ServerResponseEntity updateState(@RequestParam("distributionSpuId") Long distributionSpuId, @RequestParam("state") Integer state) { + if (!Objects.equals(DistributionSpuStatus.OFF_SHELF.value(), state) && !Objects.equals(DistributionSpuStatus.PUT_SHELF.value(), state)) { + throw new LuckException("状态错误"); + } + distributionSpuService.updateState(distributionSpuId, state); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionAuditingController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionAuditingController.java new file mode 100644 index 0000000..08f5a20 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionAuditingController.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.platform; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.distribution.dto.DistributionAuditingDTO; +import com.tmerclub.cloud.distribution.model.DistributionAuditing; +import com.tmerclub.cloud.distribution.model.DistributionUser; +import com.tmerclub.cloud.distribution.service.DistributionAuditingService; +import com.tmerclub.cloud.distribution.service.DistributionUserService; +import com.tmerclub.cloud.distribution.vo.DistributionAuditingVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; + +/** + * 分销员申请信息 + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +@RestController("platformDistributionAuditingController") +@RequestMapping("/p/distribution_auditing") +@Tag(name = "platform-分销员申请信息") +public class DistributionAuditingController { + + @Autowired + private DistributionAuditingService distributionAuditingService; + + @Autowired + private DistributionUserService distributionUserService; + + @GetMapping("/page") + @Operation(summary = "获取分销员申请信息列表", description = "分页获取分销员申请信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, DistributionAuditingDTO distributionAuditingDTO) { + PageVO distributionAuditingPage = distributionAuditingService.pageDistributionAuditing(pageDTO, distributionAuditingDTO); + setPhoneHide(distributionAuditingPage); + return ServerResponseEntity.success(distributionAuditingPage); + } + + @GetMapping + @Operation(summary = "获取分销员申请信息", description = "根据auditingId获取分销员申请信息") + public ServerResponseEntity getByAuditingId(@RequestParam Long auditingId) { + return ServerResponseEntity.success(distributionAuditingService.getByAuditingId(auditingId)); + } + + @PutMapping + @Operation(summary = "审核分销员") + public ServerResponseEntity update(@Valid @RequestBody DistributionAuditingDTO distributionAuditingDTO) { + DistributionAuditing distributionAuditing = BeanUtil.map(distributionAuditingDTO, DistributionAuditing.class); + distributionAuditing.setUpdateTime(new Date()); + distributionAuditing.setModifier(AuthUserContext.get().getUserId()); + distributionAuditingService.examine(distributionAuditing); + // 清除缓存 + DistributionUser dbDistributionUser = distributionUserService.getByDistributionUserId(distributionAuditing.getDistributionUserId()); + distributionUserService.removeCacheByUserId(dbDistributionUser.getUserId()); + return ServerResponseEntity.success(); + } + + private void setPhoneHide(PageVO distributionAuditingPage) { + for (DistributionAuditingVO distributionAuditingVO : distributionAuditingPage.getList()) { + if (StrUtil.isNotBlank(distributionAuditingVO.getInviteeMobile())) { + distributionAuditingVO.setInviteeMobile(PhoneUtil.hideBetween(distributionAuditingVO.getInviteeMobile()).toString()); + } + if (StrUtil.isNotBlank(distributionAuditingVO.getInvitee()) && PrincipalUtil.isMobile(distributionAuditingVO.getInvitee())) { + distributionAuditingVO.setInvitee(PhoneUtil.hideBetween(distributionAuditingVO.getInvitee()).toString()); + } + if (StrUtil.isNotBlank(distributionAuditingVO.getUserMobile())) { + distributionAuditingVO.setUserMobile(PhoneUtil.hideBetween(distributionAuditingVO.getUserMobile()).toString()); + } + if (StrUtil.isNotBlank(distributionAuditingVO.getNickName()) && PrincipalUtil.isMobile(distributionAuditingVO.getNickName())) { + distributionAuditingVO.setNickName(PhoneUtil.hideBetween(distributionAuditingVO.getNickName()).toString()); + } + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserWalletController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserWalletController.java new file mode 100644 index 0000000..da0d3a6 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserWalletController.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.platform; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.distribution.dto.DistributionUserWalletDTO; +import com.tmerclub.cloud.distribution.model.DistributionUserWallet; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletService; +import com.tmerclub.cloud.distribution.vo.DistributionUserWalletVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 分销员钱包信息 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +@RestController("platformDistributionUserWalletController") +@RequestMapping("/p/distribution_user_wallet") +@Tag(name = "分销员钱包信息") +public class DistributionUserWalletController { + + @Autowired + private DistributionUserWalletService distributionUserWalletService; + + + @GetMapping("/page") + @Operation(summary = "获取分销员钱包信息列表", description = "分页获取分销员钱包信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO distributionUserWalletPage = distributionUserWalletService.page(pageDTO); + return ServerResponseEntity.success(distributionUserWalletPage); + } + + @GetMapping("/wallet_page") + @Operation(summary = "获取分销员钱包信息列表", description = "分页获取分销员钱包信息列表") + public ServerResponseEntity> walletPage(@Valid PageDTO pageDTO, String userMobile) { + PageVO distributionUserWalletPage = distributionUserWalletService.walletPage(pageDTO, userMobile); + return ServerResponseEntity.success(distributionUserWalletPage); + } + + @GetMapping + @Operation(summary = "获取分销员钱包信息", description = "根据walletId获取分销员钱包信息") + public ServerResponseEntity getByWalletId(@RequestParam Long walletId) { + return ServerResponseEntity.success(distributionUserWalletService.getByWalletId(walletId)); + } + + @PutMapping + @Operation(summary = "更新分销员钱包信息", description = "更新分销员钱包信息") + public ServerResponseEntity update(@Valid @RequestBody DistributionUserWalletDTO distributionUserWalletDTO) { + Long userId = AuthUserContext.get().getUserId(); + distributionUserWalletService.updateWallet(distributionUserWalletDTO, userId); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/AppDistributionWithdrawCashDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/AppDistributionWithdrawCashDTO.java new file mode 100644 index 0000000..ca76ce0 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/AppDistributionWithdrawCashDTO.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import com.tmerclub.cloud.common.util.PriceUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author cl + * @date 2021-08-17 09:30:56 + */ +public class AppDistributionWithdrawCashDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "提现金额(元)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "提现金额不能为空") + @Max(value = PriceUtil.MAX_AMOUNT, message = "最大值不可以超过" + PriceUtil.MAX_AMOUNT) + @Min(value = 1, message = "最小提现金额为1元") + private BigDecimal amount; + + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + @Override + public String toString() { + return "AppDistributionWithdrawCashDTO{" + + "amount=" + amount + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionSpuDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionSpuDTO.java new file mode 100644 index 0000000..c982917 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionSpuDTO.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销商品关联信息DTO + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public class DistributionSpuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分销商品表") + private Long distributionSpuId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "奖励id") + private Long awardId; + + @Schema(description = "状态(0:商家下架 1:商家上架 2:违规下架 3:平台审核)") + private Integer state; + + @Schema(description = "奖励方式(0 按比例 1 按固定数值)") + private Integer awardMode; + + @Schema(description = "上级奖励设置(0 关闭 1开启)") + private Integer parentAwardSet; + + @Schema(description = "奖励数额(奖励方式为0时,表示百分比,为1时代表实际奖励金额)") + private Long awardNumbers; + + @Schema(description = "上级奖励数额(奖励方式为0时,表示百分比,为1时代表实际奖励金额)") + private Long parentAwardNumbers; + + @Schema(description = "操作人id") + private Long modifier; + + public Long getAwardNumbers() { + return awardNumbers; + } + + public void setAwardNumbers(Long awardNumbers) { + this.awardNumbers = awardNumbers; + } + + public Long getParentAwardNumbers() { + return parentAwardNumbers; + } + + public void setParentAwardNumbers(Long parentAwardNumbers) { + this.parentAwardNumbers = parentAwardNumbers; + } + + public Long getDistributionSpuId() { + return distributionSpuId; + } + + public void setDistributionSpuId(Long distributionSpuId) { + this.distributionSpuId = distributionSpuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getAwardId() { + return awardId; + } + + public void setAwardId(Long awardId) { + this.awardId = awardId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getAwardMode() { + return awardMode; + } + + public void setAwardMode(Integer awardMode) { + this.awardMode = awardMode; + } + + public Integer getParentAwardSet() { + return parentAwardSet; + } + + public void setParentAwardSet(Integer parentAwardSet) { + this.parentAwardSet = parentAwardSet; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + @Override + public String toString() { + return "DistributionSpuDTO{" + + "distributionSpuId=" + distributionSpuId + + ", shopId=" + shopId + + ", spuId=" + spuId + + ", awardId=" + awardId + + ", state=" + state + + ", awardMode=" + awardMode + + ", parentAwardSet=" + parentAwardSet + + ", awardNumbers=" + awardNumbers + + ", parentAwardNumbers=" + parentAwardNumbers + + ", modifier=" + modifier + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionSpuLogDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionSpuLogDTO.java new file mode 100644 index 0000000..0882a9b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionSpuLogDTO.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销商品浏览记录信息DTO + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public class DistributionSpuLogDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long distributionSpuLogId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "扫码手机号") + private String mobile; + + public Long getDistributionSpuLogId() { + return distributionSpuLogId; + } + + public void setDistributionSpuLogId(Long distributionSpuLogId) { + this.distributionSpuLogId = distributionSpuLogId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @Override + public String toString() { + return "DistributionSpuLogDTO{" + + "distributionSpuLogId=" + distributionSpuLogId + + ", shopId=" + shopId + + ", spuId=" + spuId + + ", userId=" + userId + + ", mobile='" + mobile + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserDTO.java new file mode 100644 index 0000000..307b691 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserDTO.java @@ -0,0 +1,280 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销员信息DTO + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public class DistributionUserDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "促销员表") + private Long distributionUserId; + + @Schema(description = "卡号") + private String cardNo; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "上级id") + private Long parentId; + + @Schema(description = "上级促销员ids (如:1,2,3)") + private String parentIds; + + @Schema(description = "目前促销员所处层级(0顶级)") + private Integer grade; + + @Schema(description = "绑定时间") + private Date bindTime; + + @Schema(description = "状态(-1永久封禁 0待审核状态 1正常 2暂时封禁 3 审核未通过)") + private Integer state; + + @Schema(description = "昵称") + private String nickName; + + @Schema(description = "头像路径") + private String pic; + + @Schema(description = "手机号") + private String userMobile; + + @Schema(description = "真实姓名") + private String realName; + + @Schema(description = "身份证号码") + private String identityCardNumber; + + @Schema(description = "身份证正面") + private String identityCardPicFront; + + @Schema(description = "身份证背面") + private String identityCardPicBack; + + @Schema(description = "手持身份证") + private String identityCardPicHold; + + @Schema(description = "改变成封禁时的状态记录") + private Integer stateRecord; + + @Schema(description = "邀请人手机号") + private String inviteeMobile; + + @Schema(description = "排序字段" + + "分销管理-分销员-分销员管理: 0无 1加入时间 2累计客户 3累计邀请 4累计收益" + + "分销管理-业绩统计: 0无 1一代佣金 2二代佣金 3邀请奖励 4待结算金额 5可提现金额 6已失效金额") + private Integer sortParam; + + @Schema(description = "排序类型 0无 1 正序 2倒序") + private Integer sortType; + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getParentIds() { + return parentIds; + } + + public void setParentIds(String parentIds) { + this.parentIds = parentIds; + } + + public Integer getGrade() { + return grade; + } + + public void setGrade(Integer grade) { + this.grade = grade; + } + + public Date getBindTime() { + return bindTime; + } + + public void setBindTime(Date bindTime) { + this.bindTime = bindTime; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + + public String getIdentityCardNumber() { + return identityCardNumber; + } + + public void setIdentityCardNumber(String identityCardNumber) { + this.identityCardNumber = identityCardNumber; + } + + public String getIdentityCardPicFront() { + return identityCardPicFront; + } + + public void setIdentityCardPicFront(String identityCardPicFront) { + this.identityCardPicFront = identityCardPicFront; + } + + public String getIdentityCardPicBack() { + return identityCardPicBack; + } + + public void setIdentityCardPicBack(String identityCardPicBack) { + this.identityCardPicBack = identityCardPicBack; + } + + public String getIdentityCardPicHold() { + return identityCardPicHold; + } + + public void setIdentityCardPicHold(String identityCardPicHold) { + this.identityCardPicHold = identityCardPicHold; + } + + public Integer getStateRecord() { + return stateRecord; + } + + public void setStateRecord(Integer stateRecord) { + this.stateRecord = stateRecord; + } + + public String getInviteeMobile() { + return inviteeMobile; + } + + public void setInviteeMobile(String inviteeMobile) { + this.inviteeMobile = inviteeMobile; + } + + public Integer getSortParam() { + if (sortParam == null) { + return 0; + } + return sortParam; + } + + public void setSortParam(Integer sortParam) { + this.sortParam = sortParam; + } + + public Integer getSortType() { + if (sortType == null) { + return 0; + } + return sortType; + } + + public void setSortType(Integer sortType) { + this.sortType = sortType; + } + + @Override + public String toString() { + return "DistributionUserDTO{" + + "distributionUserId=" + distributionUserId + + ", cardNo='" + cardNo + '\'' + + ", userId=" + userId + + ", parentId=" + parentId + + ", parentIds='" + parentIds + '\'' + + ", grade=" + grade + + ", bindTime=" + bindTime + + ", state=" + state + + ", nickName='" + nickName + '\'' + + ", pic='" + pic + '\'' + + ", userMobile='" + userMobile + '\'' + + ", realName='" + realName + '\'' + + ", identityCardNumber='" + identityCardNumber + '\'' + + ", identityCardPicFront='" + identityCardPicFront + '\'' + + ", identityCardPicBack='" + identityCardPicBack + '\'' + + ", identityCardPicHold='" + identityCardPicHold + '\'' + + ", stateRecord=" + stateRecord + + ", InviteeMobile='" + inviteeMobile + '\'' + + ", sortParam=" + sortParam + + ", sortType=" + sortType + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserWalletBillDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserWalletBillDTO.java new file mode 100644 index 0000000..e93cc1d --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserWalletBillDTO.java @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销员钱包流水记录DTO + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public class DistributionUserWalletBillDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "钱包流水记录") + private Long id; + + @Schema(description = "钱包id") + private Long walletId; + + @Schema(description = "待结算金额变更数额") + private Long unsettledAmount; + + @Schema(description = "可提现金额变更数额") + private Long settledAmount; + + @Schema(description = "失效金额变更数额") + private Long invalidAmount; + + @Schema(description = "积累收益变更数额") + private Long accumulateAmount; + + @Schema(description = "英文备注") + private String remarksEn; + + @Schema(description = "备注") + private String remarks; + + @Schema(description = "变更后待结算金额") + private Long unsettledAmountAfter; + + @Schema(description = "变更后可提现金额") + private Long settledAmountAfter; + + @Schema(description = "变更后失效金额") + private Long invalidAmountAfter; + + @Schema(description = "变更后积累收益") + private Long accumulateAmountAfter; + + @Schema(description = "类型(0 系统修改 1人工修改)") + private Integer type; + + @Schema(description = "操作人id") + private Long modifier; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getInvalidAmount() { + return invalidAmount; + } + + public void setInvalidAmount(Long invalidAmount) { + this.invalidAmount = invalidAmount; + } + + public Long getAccumulateAmount() { + return accumulateAmount; + } + + public void setAccumulateAmount(Long accumulateAmount) { + this.accumulateAmount = accumulateAmount; + } + + public String getRemarksEn() { + return remarksEn; + } + + public void setRemarksEn(String remarksEn) { + this.remarksEn = remarksEn; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Long getUnsettledAmountAfter() { + return unsettledAmountAfter; + } + + public void setUnsettledAmountAfter(Long unsettledAmountAfter) { + this.unsettledAmountAfter = unsettledAmountAfter; + } + + public Long getSettledAmountAfter() { + return settledAmountAfter; + } + + public void setSettledAmountAfter(Long settledAmountAfter) { + this.settledAmountAfter = settledAmountAfter; + } + + public Long getInvalidAmountAfter() { + return invalidAmountAfter; + } + + public void setInvalidAmountAfter(Long invalidAmountAfter) { + this.invalidAmountAfter = invalidAmountAfter; + } + + public Long getAccumulateAmountAfter() { + return accumulateAmountAfter; + } + + public void setAccumulateAmountAfter(Long accumulateAmountAfter) { + this.accumulateAmountAfter = accumulateAmountAfter; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + @Override + public String toString() { + return "DistributionUserWalletBillDTO{" + + "id=" + id + + ", walletId=" + walletId + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", invalidAmount=" + invalidAmount + + ", accumulateAmount=" + accumulateAmount + + ", remarksEn='" + remarksEn + '\'' + + ", remarks='" + remarks + '\'' + + ", unsettledAmountAfter=" + unsettledAmountAfter + + ", settledAmountAfter=" + settledAmountAfter + + ", invalidAmountAfter=" + invalidAmountAfter + + ", accumulateAmountAfter=" + accumulateAmountAfter + + ", type=" + type + + ", modifier=" + modifier + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/EnterprisePayDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/EnterprisePayDTO.java new file mode 100644 index 0000000..5b55176 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/EnterprisePayDTO.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家转账DTO + * + * @author FrozenWatermelon + * @date 2023-02-22 15:58:50 + */ +public class EnterprisePayDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商家转账ID") + private Long entPayId; + + @Schema(description = "状态(1:申请中 2:已完成 -1:失败)") + private Integer status; + + @Schema(description = "用户id") + private String userId; + + @Schema(description = "用户openid") + private String openId; + + @Schema(description = "商家转账订单号") + private Long entPayOrderNo; + + @Schema(description = "金额") + private Double amount; + + @Schema(description = "支付类型(1:商户提现)") + private Integer type; + + @Schema(description = "业务id,如商户提现即商户提现记录ID") + private Long bizId; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "转账批次单号") + private String outBatchNo; + + public Long getEntPayId() { + return entPayId; + } + + public void setEntPayId(Long entPayId) { + this.entPayId = entPayId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public Long getEntPayOrderNo() { + return entPayOrderNo; + } + + public void setEntPayOrderNo(Long entPayOrderNo) { + this.entPayOrderNo = entPayOrderNo; + } + + public Double getAmount() { + return amount; + } + + public void setAmount(Double amount) { + this.amount = amount; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public String getOutBatchNo() { + return outBatchNo; + } + + public void setOutBatchNo(String outBatchNo) { + this.outBatchNo = outBatchNo; + } + + @Override + public String toString() { + return "EnterprisePayDTO{" + + "entPayId=" + entPayId + + ",status=" + status + + ",userId=" + userId + + ",openId=" + openId + + ",entPayOrderNo=" + entPayOrderNo + + ",amount=" + amount + + ",type=" + type + + ",bizId=" + bizId + + ",version=" + version + + ",outBatchNo=" + outBatchNo + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/feign/DistributionUserIncomeFeignController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/feign/DistributionUserIncomeFeignController.java new file mode 100644 index 0000000..9fcbfba --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/feign/DistributionUserIncomeFeignController.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.feign; + +import com.tmerclub.cloud.api.distribution.feign.DistributionUserIncomeFeignClient; +import com.tmerclub.cloud.api.distribution.vo.DistributionUserIncomeApiVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.distribution.service.DistributionUserIncomeService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author cl + * @date 2021-08-05 15:38:50 + */ +@DubboService +public class DistributionUserIncomeFeignController implements DistributionUserIncomeFeignClient { + + @Autowired + private DistributionUserIncomeService distributionUserIncomeService; + + + @Override + public ServerResponseEntity> listDistributionUserIncomeByOrderId(Long orderId) { + return ServerResponseEntity.success(distributionUserIncomeService.listDistributionUserIncomeByOrderId(orderId)); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/listener/OrderNotifyDistributionConsumer.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/listener/OrderNotifyDistributionConsumer.java new file mode 100644 index 0000000..70956f9 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/listener/OrderNotifyDistributionConsumer.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.listener; + +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.distribution.service.DistributionOrderService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 订单支付成功,分销通知 + * + * @author cl + * @date 2021-08-17 17:42:17 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SHOP_WALLET_NOTIFY_SERVICE_TOPIC, consumerGroup = RocketMqConstant.ORDER_NOTIFY_DISTRIBUTION_GROUP) +public class OrderNotifyDistributionConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(OrderNotifyDistributionConsumer.class); + + @Autowired + private DistributionOrderService distributionOrderService; + + /** + * 订单支付成功, 分销通知 + */ + @Override + public void onMessage(PayNotifyBO payNotifyBO) { + LOG.info("订单支付成功,分销分账... message: {}", Json.toJsonString(payNotifyBO)); + distributionOrderService.payNotifyDistributionOrder(payNotifyBO); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionSpuBindMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionSpuBindMapper.java new file mode 100644 index 0000000..3ca7416 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionSpuBindMapper.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.mapper; + +import com.tmerclub.cloud.distribution.model.DistributionSpuBind; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户商品绑定信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public interface DistributionSpuBindMapper { + + /** + * 获取用户商品绑定信息列表 + * + * @return 用户商品绑定信息列表 + */ + List list(); + + /** + * 根据用户商品绑定信息id获取用户商品绑定信息 + * + * @param id 用户商品绑定信息id + * @return 用户商品绑定信息 + */ + DistributionSpuBind getById(@Param("id") Long id); + + /** + * 保存用户商品绑定信息 + * + * @param distributionSpuBind 用户商品绑定信息 + */ + void save(@Param("distributionSpuBind") DistributionSpuBind distributionSpuBind); + + /** + * 更新用户商品绑定信息 + * + * @param distributionSpuBind 用户商品绑定信息 + */ + void update(@Param("distributionSpuBind") DistributionSpuBind distributionSpuBind); + + /** + * 根据用户商品绑定信息id删除用户商品绑定信息 + * + * @param id + */ + void deleteById(@Param("id") Long id); + + /** + * 根据分销员id修改状态(将商品分享记录设为失效) + * + * @param distributionUserId 分销员id + * @param state 状态 + */ + void updateStateByDistributionUserId(@Param("distributionUserId") Long distributionUserId, @Param("state") Integer state); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserBanMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserBanMapper.java new file mode 100644 index 0000000..ec8ce9e --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserBanMapper.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.mapper; + +import com.tmerclub.cloud.distribution.dto.DistributionUserBanDTO; +import com.tmerclub.cloud.distribution.model.DistributionUserBan; +import com.tmerclub.cloud.distribution.vo.DistributionUserBanVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 分销封禁记录 + * + * @author cl + * @date 2021-08-09 14:14:08 + */ +public interface DistributionUserBanMapper { + + /** + * 获取分销封禁记录列表 + * @param distributionUserBanDTO + * @return 分销封禁记录列表 + */ + List list(@Param("distributionUserBanDTO") DistributionUserBanDTO distributionUserBanDTO); + + /** + * 根据分销封禁记录id获取分销封禁记录 + * + * @param banId 分销封禁记录id + * @return 分销封禁记录 + */ + DistributionUserBan getByBanId(@Param("banId") Long banId); + + /** + * 保存分销封禁记录 + * @param distributionUserBan 分销封禁记录 + */ + void save(@Param("distributionUserBan") DistributionUserBan distributionUserBan); + + /** + * 更新分销封禁记录 + * @param distributionUserBan 分销封禁记录 + */ + void update(@Param("distributionUserBan") DistributionUserBan distributionUserBan); + + /** + * 根据分销封禁记录id删除分销封禁记录 + * @param banId + */ + void deleteById(@Param("banId") Long banId); + + /** + * 根据分销员id获取最新的封禁信息 + * @param distributionUserId + * @return + */ + DistributionUserBanVO getLatestBanInfoByDistributionUserId(@Param("distributionUserId") Long distributionUserId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserBindMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserBindMapper.java new file mode 100644 index 0000000..d4013d5 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserBindMapper.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.mapper; + +import com.tmerclub.cloud.distribution.dto.DistributionUserBindDTO; +import com.tmerclub.cloud.distribution.model.DistributionUserBind; +import com.tmerclub.cloud.distribution.vo.DistributionUserBindInfoVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserBindVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 分销员绑定关系 + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +public interface DistributionUserBindMapper { + + /** + * 获取分销员绑定关系列表 + * + * @param distributionUserBindDTO + * @return 分销员绑定关系列表 + */ + List list(@Param("distributionUserBindDTO") DistributionUserBindDTO distributionUserBindDTO); + + /** + * 根据分销员绑定关系id获取分销员绑定关系 + * + * @param bindId 分销员绑定关系id + * @return 分销员绑定关系 + */ + DistributionUserBind getByBindId(@Param("bindId") Long bindId); + + /** + * 保存分销员绑定关系 + * + * @param distributionUserBind 分销员绑定关系 + */ + void save(@Param("distributionUserBind") DistributionUserBind distributionUserBind); + + /** + * 更新分销员绑定关系 + * + * @param distributionUserBind 分销员绑定关系 + */ + void update(@Param("distributionUserBind") DistributionUserBind distributionUserBind); + + /** + * 根据分销员绑定关系id删除分销员绑定关系 + * + * @param bindId + */ + void deleteById(@Param("bindId") Long bindId); + + /** + * 获取分销员绑定关系 + * + * @param userId 用户id + * @param state 当前绑定关系状态 + * @return + */ + DistributionUserBind getUserBindByUserIdAndState(@Param("userId") Long userId, @Param("state") Integer state); + + /** + * 通过绑定的分销员id 更新 分销员绑定状态 + * + * @param distributionUserId 绑定的分销员id + * @param state 分销员绑定状态 + */ + void updateStateAndReasonByDistributionUserId(@Param("distributionUserId") Long distributionUserId, @Param("state") Integer state); + + /** + * 获取绑定用户的列表 + * + * @param userId 用户id + * @return 绑定用户的列表 + */ + List bindUserList(@Param("userId") Long userId); + + /** + * 更新暂时封禁时的绑定用户,失效->生效 + * + * @param distributionUserId 被解除封禁的分销员id + * @return + */ + List updateBindUserByDistributionUserId(@Param("distributionUserId") Long distributionUserId); + + /** + * 获取绑定关系的用户 + * + * @param distributionUserId 分销员id + * @return + */ + List getListByDistributionUserId(@Param("distributionUserId") Long distributionUserId); + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserIncomeMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserIncomeMapper.java new file mode 100644 index 0000000..ebbe4c8 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserIncomeMapper.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.mapper; + +import com.tmerclub.cloud.distribution.dto.DistributionUserIncomeDTO; +import com.tmerclub.cloud.distribution.model.DistributionUserIncome; +import com.tmerclub.cloud.distribution.vo.*; +import com.tmerclub.cloud.distribution.vo.*; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 分销收入记录信息 + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +public interface DistributionUserIncomeMapper { + + /** + * 获取分销收入记录信息列表 + * @return 分销收入记录信息列表 + */ + List list(); + + /** + * 获取分销员收入记录列表 + * @param distributionUserId + * @param paySysType + * @return + */ + List getDistributionUserIncomeList(@Param("distributionUserId") Long distributionUserId, + @Param("paySysType") Integer paySysType); + + /** + * 根据分销收入记录信息id获取分销收入记录信息 + * + * @param incomeId 分销收入记录信息id + * @return 分销收入记录信息 + */ + DistributionUserIncome getByIncomeId(@Param("incomeId") Long incomeId); + + /** + * 保存分销收入记录信息 + * @param distributionUserIncome 分销收入记录信息 + */ + void save(@Param("distributionUserIncome") DistributionUserIncome distributionUserIncome); + + /** + * 更新分销收入记录信息 + * @param distributionUserIncome 分销收入记录信息 + */ + void update(@Param("distributionUserIncome") DistributionUserIncome distributionUserIncome); + + /** + * 根据分销收入记录信息id删除分销收入记录信息 + * @param incomeId + */ + void deleteById(@Param("incomeId") Long incomeId); + + /** + * 分页获取分销推广效果列表 + * @param distributionUserIncomeDTO 查询参数 + * @param userMobile 分销员手机号 + * @param shopId 店铺id + * @return + */ + List effectPage(@Param("distributionUserIncomeDTO") DistributionUserIncomeDTO distributionUserIncomeDTO, @Param("userMobile") String userMobile, @Param("shopId") Long shopId); + + /** + * 获取销售记录 + * @param distributionUserIncomeDTO + * @return + */ + List listSalesRecord(@Param("distributionUserIncomeDTO") DistributionUserIncomeDTO distributionUserIncomeDTO); + + /** + * 根据分销员id更新收入状态 + * @param distributionUserId 分销员id + * @param state 收入状态 + */ + void updateStateByDistributionUserId(@Param("distributionUserId") Long distributionUserId, @Param("state") Integer state); + + /** + * 分销员推广订单信息 + * @param distributionUserId 分销员id + * @return 分销员推广订单信息 + */ + List getDistributionOrderByDistributionUserId(@Param("distributionUserId") Long distributionUserId); + + /** + * 统计分销员某时间段收入 + * @param distributionUserId 分销员id + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 收入金额 + */ + Double statisticsDisUserIncome(@Param("distributionUserId") Long distributionUserId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + + /** + * 通过状态获取我的推广订单(0:待支付 1:待结算 2:已结算 -1:订单失效) + * @param distributionUserId + * @param state 收入状态 0:待支付 1:待结算 2:已结算 -1:订单失效 + * @param paySysType + * @return + */ + List getMyPromotionOrderByState(@Param("distributionUserId") Long distributionUserId, + @Param("state") Integer state, + @Param("paySysType") Integer paySysType); + + /** + * 统计分销流水记录 + * @param orderId 订单号 + * @param orderItemId 订单项id + * @param state 状态 + * @return 数量 + */ + int countByOrderIdAndOrderItemId(@Param("orderId") Long orderId, @Param("orderItemId") Long orderItemId, @Param("state") Integer state); + + /** + * 分销流水列表 + * @param orderId 订单号 + * @return 分销流水列表 + */ + List getByOrderId(@Param("orderId") Long orderId); + + /** + * 批量修改分销流水状态 + * @param incomeIds 分销流水id + * @param state 状态 + * @param reson 收入提示 + * @return 受影响行数 + */ + int updateStateByIncomeIds(@Param("incomeIds") List incomeIds, @Param("state") Integer state, @Param("reson") Integer reson); + + /** + * 查询待结算的分销流水记录列表 + * @param paySysType + * @return 待结算的分销流水记录 + */ + List listWaitCommissionSettlement(@Param("paySysType") Integer paySysType); + + /** + * 根据orderId获取分销收入信息 + * @param orderId 订单id + * @return + */ + List listDistributionUserIncomeByOrderId(@Param("orderId") Long orderId); + + + /** + * 获取我的好友信息 + * @param distributionUser 当前用户 + * @param friends 该用户的好友(下级) + * @param type 收益类型 + * @param paySysType + * @return + */ + List getFriendInfo(@Param("distributionUser") DistributionUserVO distributionUser, + @Param("friends") List friends, + @Param("type") Integer type, + @Param("paySysType") Integer paySysType); + + + /** + * 根据分销员id和订单流水号统计佣金和订单数量 + * @param type 收益类型 收入类型(1一代奖励、2二代奖励 3邀请奖励 等 ) + * @param distributionUser + * @param paySysType + * @param state + * @return + */ + List selectIncomeInfo(@Param("type") Integer type, + @Param("distributionUser") DistributionUserVO distributionUser, + @Param("paySysType") Integer paySysType, + @Param("state") Integer state); + + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/EnterprisePayMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/EnterprisePayMapper.java new file mode 100644 index 0000000..c9330ec --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/EnterprisePayMapper.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.mapper; + +import com.tmerclub.cloud.distribution.model.EnterprisePay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商家转账 + * + * @author FrozenWatermelon + * @date 2023-02-22 15:58:50 + */ +public interface EnterprisePayMapper { + + /** + * 获取商家转账列表 + * + * @return 商家转账列表 + */ + List list(); + + /** + * 根据商家转账id获取商家转账 + * + * @param entPayId 商家转账id + * @return 商家转账 + */ + EnterprisePay getByEntPayId(@Param("entPayId") Long entPayId); + + /** + * 保存商家转账 + * + * @param enterprisePay 商家转账 + */ + void save(@Param("enterprisePay") EnterprisePay enterprisePay); + + /** + * 更新商家转账 + * + * @param enterprisePay 商家转账 + */ + void update(@Param("enterprisePay") EnterprisePay enterprisePay); + + /** + * 根据商家转账id删除商家转账 + * + * @param entPayId + */ + void deleteById(@Param("entPayId") Long entPayId); + + /** + * 批量获取商家转账信息列表,最多一千条 + * + * @return 商家转账信息列表 + */ + List listApplyEnterprisePay(); + + /** + * 批量获取商家转账信息列表 + * + * @return 商家转账信息列表 + */ + List listEnterprisePay(); + + /** + * 支付成功后根据商家转账订单号更新商家转账信息的状态为已完成 + * + * @param entPayOrderNo 商家转账订单号 + * @param version 版本号 + * @return 成功更新条数 + */ + int paySuccess(@Param("entPayOrderNo") Long entPayOrderNo, @Param("version") Integer version); + + /** + * 支付失败后根据商家转账订单号更新商家转账信息的状态为已失败 + * + * @param entPayOrderNo 商家转账订单号 + * @param version 版本号 + * @return 成功更新条数 + */ + int payFailed(@Param("entPayOrderNo") Long entPayOrderNo, @Param("version") Integer version); + + /** + * 发起转账后保存批次记录 + * + * @param enterprisePayList + */ + void updateBatch(@Param("enterprisePayList") List enterprisePayList); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionSpuLog.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionSpuLog.java new file mode 100644 index 0000000..98d3948 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionSpuLog.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 分销商品浏览记录信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public class DistributionSpuLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long distributionSpuLogId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 用户id + */ + private Long userId; + + /** + * 扫码手机号 + */ + private String mobile; + + public Long getDistributionSpuLogId() { + return distributionSpuLogId; + } + + public void setDistributionSpuLogId(Long distributionSpuLogId) { + this.distributionSpuLogId = distributionSpuLogId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @Override + public String toString() { + return "DistributionSpuLog{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", distributionSpuLogId=" + distributionSpuLogId + + ", shopId=" + shopId + + ", spuId=" + spuId + + ", userId=" + userId + + ", mobile='" + mobile + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserBan.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserBan.java new file mode 100644 index 0000000..7a614b1 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserBan.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 分销封禁记录 + * + * @author cl + * @date 2021-08-09 14:14:08 + */ +public class DistributionUserBan extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long banId; + + /** + * 分销员id + */ + private Long distributionUserId; + + /** + * 原因(0 失去联系 1恶意刷单 2其他) + */ + private Integer banReason; + + /** + * 备注 + */ + private String remarks; + + /** + * 状态(1 正常 2暂时封禁 -1永久封禁) + */ + private Integer state; + + /** + * 修改人 + */ + private Long modifier; + + public Long getBanId() { + return banId; + } + + public void setBanId(Long banId) { + this.banId = banId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Integer getBanReason() { + return banReason; + } + + public void setBanReason(Integer banReason) { + this.banReason = banReason; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + @Override + public String toString() { + return "DistributionUserBan{" + + "banId=" + banId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",distributionUserId=" + distributionUserId + + ",banReason=" + banReason + + ",remarks=" + remarks + + ",state=" + state + + ",modifier=" + modifier + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserWallet.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserWallet.java new file mode 100644 index 0000000..e376774 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserWallet.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 分销员钱包信息 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public class DistributionUserWallet extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分销员钱包id + */ + private Long walletId; + + /** + * 分销员id + */ + private Long distributionUserId; + + /** + * 待结算金额 + */ + private Long unsettledAmount; + + /** + * 可提现金额 + */ + private Long settledAmount; + + /** + * 已失效金额 + */ + private Long invalidAmount; + + /** + * 积累收益 + */ + private Long accumulateAmount; + + /** + * 乐观锁 + */ + private Integer version; + + /** + * 钱包状态(-1 已冻结 0未生效(分销审核未通过) 1正常) + */ + private Integer state; + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getInvalidAmount() { + return invalidAmount; + } + + public void setInvalidAmount(Long invalidAmount) { + this.invalidAmount = invalidAmount; + } + + public Long getAccumulateAmount() { + return accumulateAmount; + } + + public void setAccumulateAmount(Long accumulateAmount) { + this.accumulateAmount = accumulateAmount; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + @Override + public String toString() { + return "DistributionUserWallet{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", walletId=" + walletId + + ", distributionUserId=" + distributionUserId + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", invalidAmount=" + invalidAmount + + ", accumulateAmount=" + accumulateAmount + + ", version=" + version + + ", state=" + state + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/EnterprisePay.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/EnterprisePay.java new file mode 100644 index 0000000..23eb304 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/EnterprisePay.java @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商家转账 + * + * @author FrozenWatermelon + * @date 2023-02-22 15:58:50 + */ +public class EnterprisePay extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商家转账ID + */ + private Long entPayId; + + /** + * 状态(1:申请中 2:已完成 -1:失败) + */ + private Integer status; + + /** + * 用户id + */ + private Long userId; + + /** + * 用户openid + */ + private String openId; + + /** + * 商家转账订单号 + */ + private Long entPayOrderNo; + + /** + * 金额 + */ + private Long amount; + + /** + * 支付类型(1:商户提现) + */ + private Integer type; + + /** + * 业务id,如商户提现即商户提现记录ID + */ + private Long bizId; + + /** + * 版本号 + */ + private Integer version; + + /** + * 转账批次单号 + */ + private String outBatchNo; + + public Long getEntPayId() { + return entPayId; + } + + public void setEntPayId(Long entPayId) { + this.entPayId = entPayId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public Long getEntPayOrderNo() { + return entPayOrderNo; + } + + public void setEntPayOrderNo(Long entPayOrderNo) { + this.entPayOrderNo = entPayOrderNo; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public String getOutBatchNo() { + return outBatchNo; + } + + public void setOutBatchNo(String outBatchNo) { + this.outBatchNo = outBatchNo; + } + + @Override + public String toString() { + return "EnterprisePay{" + + "entPayId=" + entPayId + + ",status=" + status + + ",userId=" + userId + + ",openId=" + openId + + ",entPayOrderNo=" + entPayOrderNo + + ",amount=" + amount + + ",type=" + type + + ",bizId=" + bizId + + ",version=" + version + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",outBatchNo=" + outBatchNo + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionMsgService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionMsgService.java new file mode 100644 index 0000000..a43ec55 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionMsgService.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.model.DistributionMsg; + +import java.util.List; + +/** + * 分销公告信息 + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +public interface DistributionMsgService { + + /** + * 分页获取分销公告信息列表 + * + * @param pageDTO 分页参数 + * @param msgTitle 公告标题 + * @return 分销公告信息列表分页数据 + */ + PageVO page(PageDTO pageDTO, String msgTitle); + + /** + * 分页获取app端的公告信息列表 + * + * @param pageDTO 分页参数 + * @param isTop + * @return 分销公告信息列表分页数据 + */ + PageVO pageApp(PageDTO pageDTO, Integer isTop); + + /** + * 根据分销公告信息id获取分销公告信息 + * + * @param msgId 分销公告信息id + * @return 分销公告信息 + */ + DistributionMsg getByMsgId(Long msgId); + + /** + * 保存分销公告信息 + * + * @param distributionMsg 分销公告信息 + */ + void save(DistributionMsg distributionMsg); + + /** + * 更新分销公告信息 + * + * @param distributionMsg 分销公告信息 + */ + void update(DistributionMsg distributionMsg); + + /** + * 根据分销公告信息id删除分销公告信息 + * + * @param msgId 分销公告信息id + */ + void deleteById(Long msgId); + + /** + * 批量删除公告 + * + * @param msgIds + */ + void deleteBatch(List msgIds); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionRefundService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionRefundService.java new file mode 100644 index 0000000..f9aaed7 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionRefundService.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; + +/** + * 退款,分销部分 + * @author cl + * @date 2021-08-20 15:46:55 + */ +public interface DistributionRefundService { + + /** + * 退款,回退分销佣金 + * @param message 退款信息 + */ + void refundDistributionAmount(OrderChangeShopWalletAmountBO message); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionSpuBindService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionSpuBindService.java new file mode 100644 index 0000000..5828107 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionSpuBindService.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.model.DistributionSpuBind; + +/** + * 用户商品绑定信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public interface DistributionSpuBindService { + + /** + * 分页获取用户商品绑定信息列表 + * @param pageDTO 分页参数 + * @return 用户商品绑定信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据用户商品绑定信息id获取用户商品绑定信息 + * + * @param id 用户商品绑定信息id + * @return 用户商品绑定信息 + */ + DistributionSpuBind getById(Long id); + + /** + * 保存用户商品绑定信息 + * @param distributionSpuBind 用户商品绑定信息 + */ + void save(DistributionSpuBind distributionSpuBind); + + /** + * 更新用户商品绑定信息 + * @param distributionSpuBind 用户商品绑定信息 + */ + void update(DistributionSpuBind distributionSpuBind); + + /** + * 根据用户商品绑定信息id删除用户商品绑定信息 + * @param id 用户商品绑定信息id + */ + void deleteById(Long id); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionSpuLogService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionSpuLogService.java new file mode 100644 index 0000000..2d9a0a3 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionSpuLogService.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.model.DistributionSpuLog; + +/** + * 分销商品浏览记录信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public interface DistributionSpuLogService { + + /** + * 分页获取分销商品浏览记录信息列表 + * @param pageDTO 分页参数 + * @return 分销商品浏览记录信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据分销商品浏览记录信息id获取分销商品浏览记录信息 + * + * @param distributionSpuLogId 分销商品浏览记录信息id + * @return 分销商品浏览记录信息 + */ + DistributionSpuLog getByDistributionSpuLogId(Long distributionSpuLogId); + + /** + * 保存分销商品浏览记录信息 + * @param distributionSpuLog 分销商品浏览记录信息 + */ + void save(DistributionSpuLog distributionSpuLog); + + /** + * 更新分销商品浏览记录信息 + * @param distributionSpuLog 分销商品浏览记录信息 + */ + void update(DistributionSpuLog distributionSpuLog); + + /** + * 根据分销商品浏览记录信息id删除分销商品浏览记录信息 + * @param distributionSpuLogId 分销商品浏览记录信息id + */ + void deleteById(Long distributionSpuLogId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserBanService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserBanService.java new file mode 100644 index 0000000..01794e9 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserBanService.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.dto.DistributionUserBanDTO; +import com.tmerclub.cloud.distribution.model.DistributionUserBan; +import com.tmerclub.cloud.distribution.vo.DistributionUserBanVO; + +/** + * 分销封禁记录 + * + * @author cl + * @date 2021-08-09 14:14:08 + */ +public interface DistributionUserBanService { + + /** + * 分页获取分销封禁记录列表 + * @param pageDTO 分页参数 + * @param distributionUserBanDTO + * @return 分销封禁记录列表分页数据 + */ + PageVO page(PageDTO pageDTO, DistributionUserBanDTO distributionUserBanDTO); + + /** + * 根据分销封禁记录id获取分销封禁记录 + * + * @param banId 分销封禁记录id + * @return 分销封禁记录 + */ + DistributionUserBan getByBanId(Long banId); + + /** + * 保存分销封禁记录 + * @param distributionUserBan 分销封禁记录 + */ + void save(DistributionUserBan distributionUserBan); + + /** + * 更新分销封禁记录 + * @param distributionUserBan 分销封禁记录 + */ + void update(DistributionUserBan distributionUserBan); + + /** + * 根据分销封禁记录id删除分销封禁记录 + * @param banId 分销封禁记录id + */ + void deleteById(Long banId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserBindService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserBindService.java new file mode 100644 index 0000000..88d669e --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserBindService.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.distribution.dto.DistributionUserBindDTO; +import com.tmerclub.cloud.distribution.model.DistributionUser; +import com.tmerclub.cloud.distribution.model.DistributionUserBind; +import com.tmerclub.cloud.distribution.vo.DistributionUserBindInfoVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserBindVO; + +/** + * 分销员绑定关系 + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +public interface DistributionUserBindService { + + /** + * 分页获取分销员绑定关系列表 + * @param pageDTO 分页参数 + * @param distributionUserBindDTO + * @return 分销员绑定关系列表分页数据 + */ + PageVO page(PageDTO pageDTO, DistributionUserBindDTO distributionUserBindDTO); + + /** + * 根据分销员绑定关系id获取分销员绑定关系 + * + * @param bindId 分销员绑定关系id + * @return 分销员绑定关系 + */ + DistributionUserBind getByBindId(Long bindId); + + /** + * 保存分销员绑定关系 + * @param distributionUserBind 分销员绑定关系 + */ + void save(DistributionUserBind distributionUserBind); + + /** + * 更新分销员绑定关系 + * @param distributionUserBind 分销员绑定关系 + */ + void update(DistributionUserBind distributionUserBind); + + /** + * 根据分销员绑定关系id删除分销员绑定关系 + * @param bindId 分销员绑定关系id + */ + void deleteById(Long bindId); + + /** + * 根据分享人的卡号,判断该用户是否能与该分享人进行绑定 + * @param shareUser 分享人 + * @param userId + * @param type 0 扫码 1 下单 + * @return + */ + ServerResponseEntity bindDistribution(DistributionUser shareUser, Long userId, int type); + + /** + * 获取绑定用户的列表 + * @param pageDTO 分页信息 + * @param userId 用户id + * @return 绑定用户的列表 + */ + PageVO bindUserList(PageDTO pageDTO, Long userId); + + /** + * 获取分销员绑定关系 + * @param userId 用户id + * @param state 当前绑定关系状态 + * @return + */ + DistributionUserBind getUserBindByUserIdAndState(Long userId, Integer state); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserIncomeService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserIncomeService.java new file mode 100644 index 0000000..7fa4573 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserIncomeService.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.api.distribution.vo.DistributionUserIncomeApiVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.dto.DistributionUserIncomeDTO; +import com.tmerclub.cloud.distribution.model.DistributionUserIncome; +import com.tmerclub.cloud.distribution.vo.DistributionOrderVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserIncomeOrderVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserIncomeVO; +import com.tmerclub.cloud.distribution.vo.StatisticsDisUserIncomeVO; + +import java.util.Date; +import java.util.List; + +/** + * 分销收入记录信息 + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +public interface DistributionUserIncomeService { + + /** + * 分页获取分销收入记录信息列表 + * + * @param pageDTO 分页参数 + * @return 分销收入记录信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 查询分销员收入记录 + * + * @param pageDTO 分页参数 + * @param distributionUserId 分销员id + * @return 收入记录 + */ + PageVO getDistributionUserIncomePage(PageDTO pageDTO, Long distributionUserId); + + /** + * 根据分销收入记录信息id获取分销收入记录信息 + * + * @param incomeId 分销收入记录信息id + * @return 分销收入记录信息 + */ + DistributionUserIncome getByIncomeId(Long incomeId); + + /** + * 保存分销收入记录信息 + * + * @param distributionUserIncome 分销收入记录信息 + */ + void save(DistributionUserIncome distributionUserIncome); + + /** + * 更新分销收入记录信息 + * + * @param distributionUserIncome 分销收入记录信息 + */ + void update(DistributionUserIncome distributionUserIncome); + + /** + * 根据分销收入记录信息id删除分销收入记录信息 + * + * @param incomeId 分销收入记录信息id + */ + void deleteById(Long incomeId); + + /** + * 分页获取分销推广效果列表 + * + * @param pageDTO 分页参数 + * @param distributionUserIncomeDTO 收入 + * @param userMobile 分销员手机号 + * @param shopId 店铺id + * @return + */ + PageVO effectPage(PageDTO pageDTO, DistributionUserIncomeDTO distributionUserIncomeDTO, String userMobile, Long shopId); + + /** + * 分页获取销售记录 + * + * @param pageDTO + * @param distributionUserIncomeDTO + * @return + */ + PageVO pageSalesRecord(PageDTO pageDTO, DistributionUserIncomeDTO distributionUserIncomeDTO); + + /** + * 分销员推广订单信息 + * + * @param pageDTO 分页参数 + * @param distributionUserId 分销员id + * @return 分销员推广订单信息 + */ + PageVO getDistributionOrderByDistributionUserId(PageDTO pageDTO, Long distributionUserId); + + /** + * 统计分销员当日收入 + * + * @param distributionUserId 分销员id + * @return 收入金额 + */ + StatisticsDisUserIncomeVO statisticsDistributionUserIncome(Long distributionUserId); + + /** + * 通过状态获取我的推广订单(0:待支付 1:待结算 2:已结算 -1:订单失效) + * + * @param pageDTO + * @param distributionUserId + * @param state 收入状态 0:待支付 1:待结算 2:已结算 -1:订单失效 + * @return + */ + PageVO getMyPromotionOrderByState(PageDTO pageDTO, Long distributionUserId, Integer state); + + /** + * 统计分销流水记录 + * + * @param orderId 订单号 + * @param orderItemId 订单项id + * @param state 状态 + * @return 数量 + */ + int countByOrderIdAndOrderItemId(Long orderId, Long orderItemId, Integer state); + + /** + * 分销流水列表 + * @param orderId 订单号 + * @return 分销流水列表 + */ + List getByOrderId(Long orderId); + + /** + * 批量修改分销流水状态 + * + * @param incomeIds 分销流水id + * @param state 状态 + * @param reson 收入提示 + */ + void updateStateByIncomeIds(List incomeIds, Integer state, Integer reson); + + /** + * 分销员佣金结算处理 + * @param date 最后结算时间 + */ + void commissionSettlementHandle(Date date); + + /** + * 订单分销员佣金结算处理 + * @param orderId 订单id + */ + void commissionSettlementHandleByOrderId(Long orderId); + + /** + * 根据orderId获取分销收入信息 + * @param orderId 订单id + * @return + */ + List listDistributionUserIncomeByOrderId(Long orderId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserService.java new file mode 100644 index 0000000..dcccf31 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserService.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.dto.DistributionUserDTO; +import com.tmerclub.cloud.distribution.model.DistributionUser; +import com.tmerclub.cloud.distribution.model.DistributionUserBan; +import com.tmerclub.cloud.distribution.vo.*; + +import java.util.List; + +/** + * 分销员信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public interface DistributionUserService { + + /** + * 分页获取分销员管理列表 + * + * @param pageDTO 分页参数 + * @param distributionUserDTO + * @return 分销员信息管理分页数据 + */ + PageVO distributionUserPage(PageDTO pageDTO, DistributionUserDTO distributionUserDTO); + + /** + * 根据分销员信息id获取分销员信息 + * + * @param distributionUserId 分销员信息id + * @return 分销员信息 + */ + DistributionUser getByDistributionUserId(Long distributionUserId); + + /** + * 保存分销员信息 + * + * @param distributionUser 分销员信息 + */ + void save(DistributionUser distributionUser); + + /** + * 更新分销员信息 + * + * @param distributionUser 分销员信息 + */ + void update(DistributionUser distributionUser); + + /** + * 根据分销员信息id删除分销员信息 + * + * @param distributionUserId 分销员信息id + */ + void deleteById(Long distributionUserId); + + /** + * 分页获取分销业绩统计信息 + * + * @param pageDTO 分页参数 + * @param distributionUserDTO 分销员信息 + * @param userMobile 分销员手机号 + * @return + */ + PageVO achievementPage(PageDTO pageDTO, DistributionUserDTO distributionUserDTO, String userMobile); + + /** + * 获取分销员用户信息 + * + * @param userId 用户id + * @return 分销员用户信息 + */ + DistributionUserVO getByUserId(Long userId); + + /** + * 移除根据分销员userId获取分销员信息的缓存 + * + * @param userId 用户id + */ + void removeCacheByUserId(Long userId); + + + /** + * 更新分销员状态以及封禁记录 + * + * @param distributionUserBan 插入参数 + */ + void updateDistributionStateAndBan(DistributionUserBan distributionUserBan); + + /** + * 获取分销员列表 + * + * @param identityCardNumber 分销员身份证信息 + * @param userMobile 手机号 + * @return 分销员列表 + */ + List getDistributionUserByIdCardNumberAndUserMobile(String identityCardNumber, String userMobile); + + /** + * 申请注册成为分销员 + * + * @param distributionUser 分销员信息 + */ + void registerDistributionUser(DistributionUser distributionUser); + + /** + * 分销员业绩数据 + * + * @param distributionUserId 分销员id + * @return 分销员业绩数据 + */ + AchievementDataVO getAchievementDataById(Long distributionUserId); + + /** + * 分页获取精简版分销员数据 + * + * @param pageDTO 分页参数 + * @param parentDistributionUserId 上级分销员id + * @return 精简版分销员分页数据 + */ + PageVO getPageDistributionUserSimpleInfoByParentUserId(PageDTO pageDTO, Long parentDistributionUserId); + + /** + * 根据分销员id获取最新的封禁信息 + * + * @param distributionUserId + * @return + */ + DistributionUserBanVO getLatestBanInfoByDistributionUserId(Long distributionUserId); + + + /** + * 获取好友/用户列表 + * + * @param user 分销员信息 + * @param userType + * @return + */ + List getDistributionMyFriend(DistributionUserVO user, Integer userType); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/EnterprisePayService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/EnterprisePayService.java new file mode 100644 index 0000000..4e8b797 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/EnterprisePayService.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.model.EnterprisePay; + +import java.util.List; + +/** + * 商家转账 + * + * @author FrozenWatermelon + * @date 2023-02-22 15:58:50 + */ +public interface EnterprisePayService { + + /** + * 分页获取商家转账列表 + * @param pageDTO 分页参数 + * @return 商家转账列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据商家转账id获取商家转账 + * + * @param entPayId 商家转账id + * @return 商家转账 + */ + EnterprisePay getByEntPayId(Long entPayId); + + /** + * 保存商家转账 + * @param enterprisePay 商家转账 + */ + void save(EnterprisePay enterprisePay); + + /** + * 更新商家转账 + * @param enterprisePay 商家转账 + */ + void update(EnterprisePay enterprisePay); + + /** + * 根据商家转账id删除商家转账 + * @param entPayId 商家转账id + */ + void deleteById(Long entPayId); + + /** + * 获取正在申请中的商家转账记录,最多一千条数据 + * @return 商家转账信息列表 + */ + List listApplyEnterprisePay(); + + /** + * 商家批量转账 + * @param enterprisePayList 商家转账信息列表 + */ + void sendEnterprisePay(List enterprisePayList); + + /** + * 转账成功处理 + * @param enterprisePay 商家转账信息 + */ + void paySuccess(EnterprisePay enterprisePay); + + /** + * 转账失败处理 + * @param enterprisePay 商家转账信息 + */ + void payFailed(EnterprisePay enterprisePay); + + /** + * 发起转账后保存批次记录 + * @param enterprisePayList + */ + void updateBatch(List enterprisePayList); + + /** + * 获取正在申请中的商家转账记 + * @return 商家转账信息列表 + */ + List listEnterprisePay(); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionAuditingServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionAuditingServiceImpl.java new file mode 100644 index 0000000..f29d433 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionAuditingServiceImpl.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.order.vo.SumAmountVO; +import com.tmerclub.cloud.api.platform.feign.SysUserFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.distribution.constant.DistributionAuditingState; +import com.tmerclub.cloud.distribution.constant.DistributionUserStateEnum; +import com.tmerclub.cloud.distribution.dto.DistributionAuditingDTO; +import com.tmerclub.cloud.distribution.mapper.DistributionAuditingMapper; +import com.tmerclub.cloud.distribution.mapper.DistributionUserBindMapper; +import com.tmerclub.cloud.distribution.mapper.DistributionUserMapper; +import com.tmerclub.cloud.distribution.model.DistributionAuditing; +import com.tmerclub.cloud.distribution.model.DistributionUser; +import com.tmerclub.cloud.distribution.service.DistributionAuditingService; +import com.tmerclub.cloud.distribution.vo.DistributionAuditingVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 分销员申请信息 + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +@Service +public class DistributionAuditingServiceImpl implements DistributionAuditingService { + + @Autowired + private DistributionAuditingMapper distributionAuditingMapper; + @DubboReference + private SysUserFeignClient sysUserFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + @Autowired + private DistributionUserMapper distributionUserMapper; + @Autowired + private DistributionUserBindMapper distributionUserBindMapper; + @Autowired + private RocketMQTemplate sendNotifyToUserTemplate; + + @Override + public PageVO pageDistributionAuditing(PageDTO pageDTO, DistributionAuditingDTO distributionAuditingDTO) { + PageVO distributionAuditingPage = PageUtil.doPage(pageDTO, () -> distributionAuditingMapper.listDistributionAuditing(distributionAuditingDTO)); + List auditingPageList = distributionAuditingPage.getList(); + if (CollUtil.isEmpty(auditingPageList)) { + return distributionAuditingPage; + } + List modifierIds = auditingPageList.stream().map(DistributionAuditingVO::getModifier).filter(Objects::nonNull).distinct().collect(Collectors.toList()); + List userIds = auditingPageList.stream().map(DistributionAuditingVO::getUserId).collect(Collectors.toList()); + if (CollUtil.isEmpty(modifierIds) || CollUtil.isEmpty(userIds)) { + return distributionAuditingPage; + } + //根据修改人的用户id查询姓名以及订单信息[积累消费金额,积累消费笔数] + ServerResponseEntity> sysUserData = sysUserFeignClient.getSysUserList(modifierIds); + if (!sysUserData.isSuccess()) { + throw new LuckException(sysUserData.getMsg()); + } + ServerResponseEntity> sumAmountData = orderFeignClient.listSumDataByUserIds(userIds); + if (!sumAmountData.isSuccess()) { + throw new LuckException(sumAmountData.getMsg()); + } + List sumDataList = sumAmountData.getData(); + List sysUserList = sysUserData.getData(); + Map userMap = sysUserList.stream().collect(Collectors.toMap(SysUserVO::getSysUserId, s -> s)); + Map sumDataMap = sumDataList.stream().collect(Collectors.toMap(SumAmountVO::getUserId, s -> s)); + for (DistributionAuditingVO distributionAuditingVO : auditingPageList) { + if (Objects.nonNull(distributionAuditingVO.getModifier())) { + SysUserVO sysUserVO = userMap.get(distributionAuditingVO.getModifier()); + if (Objects.isNull(sysUserVO)) { + distributionAuditingVO.setModifierName("admin"); + } else { + distributionAuditingVO.setModifierName(sysUserVO.getNickName()); + } + } + if (Objects.nonNull(distributionAuditingVO.getUserId())) { + SumAmountVO sumAmountVO = sumDataMap.get(distributionAuditingVO.getUserId()); + if (Objects.isNull(sumAmountVO)) { + //积累消费金额 + distributionAuditingVO.setSumOfConsumption(0.00); + //积累消费笔数 + distributionAuditingVO.setExpenseNumber(0); + } else { + //积累消费金额 + distributionAuditingVO.setSumOfConsumption(sumAmountVO.getSumOfConsumption()); + //积累消费笔数 + distributionAuditingVO.setExpenseNumber(Objects.isNull(sumAmountVO.getExpenseNumber()) ? 0 : sumAmountVO.getExpenseNumber()); + } + } + } + return distributionAuditingPage; + } + + @Override + public DistributionAuditing getByAuditingId(Long auditingId) { + return distributionAuditingMapper.getByAuditingId(auditingId); + } + + @Override + public void save(DistributionAuditing distributionAuditing) { + distributionAuditingMapper.save(distributionAuditing); + } + + @Override + public void update(DistributionAuditing distributionAuditing) { + distributionAuditingMapper.update(distributionAuditing); + } + + @Override + public void deleteById(Long auditingId) { + distributionAuditingMapper.deleteById(auditingId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void examine(DistributionAuditing distributionAuditing) { + DistributionUser distributionUser = new DistributionUser(); + distributionUser.setDistributionUserId(distributionAuditing.getDistributionUserId()); + distributionUser.setBindTime(new Date()); + distributionUser.setStateRecord(null); + //判断是否通过 + if (Objects.equals(DistributionAuditingState.PASS.value(), distributionAuditing.getState())) { + DistributionUser beforeDistributionUser = distributionUserMapper.getByDistributionUserId(distributionAuditing.getDistributionUserId()); + if (Objects.nonNull(beforeDistributionUser) && Objects.nonNull(beforeDistributionUser.getStateRecord()) + && Objects.equals(beforeDistributionUser.getStateRecord(), DistributionUserStateEnum.BAN.value())) { + //如果之前是暂时封禁状态,现在改成正常状态,恢复以前的绑定用户。将失效的绑定用户设为正常。 + distributionUserBindMapper.updateBindUserByDistributionUserId(distributionAuditing.getDistributionUserId()); + } + //通过审核,设为正常状态 + distributionUser.setState(DistributionUserStateEnum.NORMAL.value()); + // 发送通知 + // 发送消息,分销员申请成功通知给用户 + List notifyList = new ArrayList<>(Constant.INITIAL_CAPACITY); + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setSendType(SendTypeEnum.DISTRIBUTION_APPLY_SUCCESS.getValue()); + sendNotifyBO.setUserId(beforeDistributionUser.getUserId()); + sendNotifyBO.setShopId(Constant.PLATFORM_SHOP_ID); + notifyList.add(sendNotifyBO); + // 分销员申请成功推送消息给用户 + SendStatus sendStockStatus = sendNotifyToUserTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC, new GenericMessage<>(notifyList)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } else if (Objects.equals(DistributionAuditingState.UN_PASS.value(), distributionAuditing.getState())) { + //未通过审核 + distributionUser.setState(DistributionUserStateEnum.FAIL_AUDIT.value()); + } + //更新分销员状态 + distributionUserMapper.updateStatus(distributionUser); + distributionAuditingMapper.update(distributionAuditing); + } + + @Override + public void autoRejectBySwitchAllinpay() { + // 查询所有待审核的分销员 + DistributionAuditingDTO distributionAuditingDTO = new DistributionAuditingDTO(); + distributionAuditingDTO.setState(DistributionAuditingState.UN_AUDIT.value()); + List distributionAuditingVOList = distributionAuditingMapper.listDistributionAuditing(distributionAuditingDTO); + // 拒绝分销员申请 + DistributionAuditingService distributionAuditingService = (DistributionAuditingService) AopContext.currentProxy(); + DistributionAuditing distributionAuditing; + for (DistributionAuditingVO distributionAuditingVO : distributionAuditingVOList) { + distributionAuditing = new DistributionAuditing(); + distributionAuditing.setAuditingId(distributionAuditingVO.getAuditingId()); + distributionAuditing.setDistributionUserId(distributionAuditingVO.getDistributionUserId()); + distributionAuditing.setRemarks("平台支付系统切换,请重新申请"); + distributionAuditing.setReason(-1); + distributionAuditing.setState(DistributionAuditingState.UN_PASS.value()); + distributionAuditingService.examine(distributionAuditing); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionOrderServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionOrderServiceImpl.java new file mode 100644 index 0000000..5119836 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionOrderServiceImpl.java @@ -0,0 +1,581 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.distribution.bo.DistributionNotifyOrderAndShopBO; +import com.tmerclub.cloud.api.distribution.bo.DistributionSpuBO; +import com.tmerclub.cloud.api.distribution.vo.DistributionSpuVO; +import com.tmerclub.cloud.api.multishop.bo.ShopWalletBO; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.vo.DistributionConfigApiVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.DistributionAudit; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.distribution.constant.*; +import com.tmerclub.cloud.distribution.model.*; +import com.tmerclub.cloud.distribution.service.*; +import com.tmerclub.cloud.distribution.constant.*; +import com.tmerclub.cloud.distribution.model.*; +import com.tmerclub.cloud.distribution.service.*; +import com.tmerclub.cloud.distribution.vo.DistributionAwardDataVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author cl + * @date 2021-08-18 08:40:26 + */ +@Service +public class DistributionOrderServiceImpl implements DistributionOrderService { + + private static final Logger logger = LoggerFactory.getLogger(DistributionOrderServiceImpl.class); + + @Autowired + private DistributionUserService distributionUserService; + @Autowired + private DistributionUserBindService distributionUserBindService; + @Autowired + private DistributionConfigService distributionConfigService; + @Autowired + private DistributionUserWalletService distributionUserWalletService; + @Autowired + private DistributionUserWalletBillService distributionUserWalletBillService; + @Autowired + private DistributionUserIncomeService distributionUserIncomeService; + @Autowired + private DistributionSpuService distributionSpuService; + @DubboReference + private OrderFeignClient orderFeignClient; + @Autowired + private RocketMQTemplate distributionNotifyOrderShopTemplate; + @DubboReference + private ConfigFeignClient configFeignClient; + + + @Override + @Transactional(rollbackFor = Exception.class) + public void payNotifyDistributionOrder(PayNotifyBO payNotifyBO) { + // OrderNotifyConsumer 通知来源类 + // 获取分销设置 + DistributionConfigApiVO distributionConfig = distributionConfigService.getDistributionConfig(); + if (Objects.isNull(distributionConfig) || !Objects.equals(1, distributionConfig.getDistributionSwitch())) { + logger.info("分销未开启,结束分销"); + return; + } + // 获取订单数据 + List orderIds = payNotifyBO.getOrderIds(); + ServerResponseEntity> orderResponseEntity = orderFeignClient.listOrderAndOrderItemByOrderIds(orderIds); + if (!orderResponseEntity.isSuccess()) { + logger.error(orderResponseEntity.getMsg()); + throw new LuckException(orderResponseEntity.getMsg()); + } + List esOrderList = orderResponseEntity.getData(); + if (CollUtil.isEmpty(esOrderList)) { + logger.info("未查询到对应的订单,结束分销 orderIds: {}", orderIds.toString()); + return; + } + // 过滤掉shopId = 0的订单,以及积分订单(分销订单不包含积分订单) + List orders = esOrderList.stream() + .filter(item -> !Objects.equals(item.getShopId(), Constant.PLATFORM_SHOP_ID) + && !Objects.equals(item.getOrderType(), OrderType.SCORE.value())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(orders)) { + logger.info("没有可以进行分销的订单,结束分销 orderIds: {}", orderIds.toString()); + return; + } + // 获取订所有的订单项 + List orderItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + orders.forEach(item -> orderItems.addAll(item.getOrderItems())); + // 订单所有的商品 + if (CollUtil.isEmpty(orderItems)) { + logger.info("未获取到订单项,停止分销"); + return; + } + List spuIds = orderItems.stream().map(OrderItemVO::getSpuId).collect(Collectors.toList()); + // 查询出上架的所有分销商品信息(如何有商品没有在分销活动中上架,那么此商品就不进行分销) + List distributionSpuList = distributionSpuService.getByStateAndSpuIds(DistributionSpuStatus.PUT_SHELF.value(), spuIds); + if (CollUtil.isEmpty(distributionSpuList)) { + logger.info("未获取到订单商品,停止分销"); + return; + } + // 开始进行处理订单分销 + handleDistributionOrder(distributionConfig, orders, distributionSpuList); + } + + private void handleDistributionOrder(DistributionConfigApiVO distributionConfig, List orders, List distributionSpuList) { + // 设置为分销的订单项 + List allDistributionOrderItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + List spuIds = distributionSpuList.stream().map(DistributionSpu::getSpuId).collect(Collectors.toList()); + List shopWalletBOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderVO order : orders) { + // 所有的订单项 + List orderItems = order.getOrderItems(); + boolean isFirstGetBindUser = true; + DistributionUser oldDistributionUser = null; + long distributionAumont = 0L; + List orderItemList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List distributionOrderItemList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderItemVO orderItem : orderItems) { + // 如果没有状态正常的分销商品则不能进行分销 + if (!spuIds.contains(orderItem.getSpuId())) { + continue; + } + // 用分销流水来保存幂等 + int row = distributionUserIncomeService.countByOrderIdAndOrderItemId(order.getOrderId(), orderItem.getOrderItemId(), null); + if (row > 0) { + continue; + } + // 如果该订单项有分销信息,则将该订单项放入distributionOrderItems中 + if (Objects.nonNull(orderItem.getDistributionUserId()) && !Objects.equals(orderItem.getDistributionUserId(), 0L)) { + doDistribution(oldDistributionUser, order, orderItem, distributionConfig); + allDistributionOrderItems.add(orderItem); + distributionOrderItemList.add(orderItem); + continue; + } + // 初始化用户的旧绑定分销员 + if (isFirstGetBindUser) { + isFirstGetBindUser = false; + // 查询该用户以前绑定的分享人 + DistributionUserBind distributionUserBind = distributionUserBindService.getUserBindByUserIdAndState(order.getUserId(), BindStateEnum.VALID.value()); + // 并且该用户以前也没有绑定分享人 + if (distributionUserBind != null) { + // 查询以前的绑定的用户信息 + oldDistributionUser = distributionUserService.getByDistributionUserId(distributionUserBind.getDistributionUserId()); + } + } + if (Objects.isNull(oldDistributionUser)) { + continue; + } + if (!Objects.equals(oldDistributionUser.getState(), DistributionUserStateEnum.NORMAL.value())) { + continue; + } + // 将订单项设为分销项 + orderItem.setDistributionUserId(oldDistributionUser.getDistributionUserId()); + doDistribution(oldDistributionUser, order, orderItem, distributionConfig); + orderItemList.add(orderItem); + distributionAumont = distributionAumont + orderItem.getDistributionAmount(); + } + // 该订单中没有分销订单项,不需要进行后面的步骤 + if (CollUtil.isEmpty(orderItemList) && CollUtil.isEmpty(distributionOrderItemList)) { + continue; + } + allDistributionOrderItems.addAll(orderItemList); + order.setDistributionAmount(distributionAumont); + // 分销订单需要在商家的未结算金额扣除用户分销金额 + // 我们需要发一个top来同时更新商家店铺钱包和订单项分销金额, 那么这里需要批量更新了 + ShopWalletBO shopWalletBO = new ShopWalletBO(); + shopWalletBO.setShopId(order.getShopId()); + shopWalletBO.setOrderId(order.getOrderId()); + // 订单分销金额 + List filterOrderItems = allDistributionOrderItems.stream().filter(item -> Objects.equals(item.getOrderId(), order.getOrderId())).toList(); + ServerResponseEntity orderResponse = orderFeignClient.sumTotalDistributionAmountByOrderItem(filterOrderItems); + if (!orderResponse.isSuccess()) { + logger.error(orderResponse.getMsg()); + throw new LuckException(orderResponse.getMsg()); + } + long totalDistributionAmount = orderResponse.getData(); + // 商家待结算改变金额 = - 订单分销佣金 (商家待结算金额 = 商家待结算金额 - 订单分销佣金) + shopWalletBO.setUnsettledAmount(-totalDistributionAmount); + shopWalletBOList.add(shopWalletBO); + } + sendMsgSubUnSettleAmount(allDistributionOrderItems, shopWalletBOList); + } + + private void sendMsgSubUnSettleAmount(List allDistributionOrderItems, List shopWalletBOList) { + // 发送消息, 去修改订单分销金额和店铺钱包待结算金额 + DistributionNotifyOrderAndShopBO message = new DistributionNotifyOrderAndShopBO(); + message.setDistributionOrderItems(allDistributionOrderItems); + message.setShopWalletBOList(shopWalletBOList); + SendStatus sendStatus = distributionNotifyOrderShopTemplate.syncSend(RocketMqConstant.DISTRIBUTION_NOTIFY_ORDER_SHOP_TOPIC, new GenericMessage<>(message)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + + /** + * 进行分销操作 + * + * @param oldShareUser 用户已绑定的分销员 + * @param order + * @param orderItem 订单项 + * @param distributionConfig 分销设置 + */ + private void doDistribution(DistributionUser oldShareUser, OrderVO order, OrderItemVO orderItem, DistributionConfigApiVO distributionConfig) { + DistributionUser shareUser; + DistributionUser bindUser; + + if (oldShareUser != null && Objects.equals(orderItem.getDistributionUserId(), oldShareUser.getDistributionUserId())) { + shareUser = oldShareUser; + bindUser = oldShareUser; + } else { + shareUser = distributionUserService.getByDistributionUserId(orderItem.getDistributionUserId()); + // 判断是否可以进行分销操作 + if (checkAmountOver(orderItem)) { + return; + } + // 自推不进行绑定 + if (Objects.equals(orderItem.getUserId(), shareUser.getUserId())) { + return; + } + // 绑定绑定销售员信息 + ServerResponseEntity serverResponse = distributionUserBindService.bindDistribution(shareUser, orderItem.getUserId(), 1); + if (!serverResponse.isSuccess()) { + logger.info("绑定销售员信息失败,跳过分销流程,订单号:{}, 订单项Id:{}", order.getOrderId(), orderItem.getOrderItemId()); + } + // 绑定的用户 + bindUser = serverResponse.getData(); + } + //推广人若为永久封禁 + if (Objects.equals(shareUser.getState(), DistributionUserStateEnum.PER_BAN.value()) || Objects.equals(shareUser.getState(), DistributionUserStateEnum.BAN.value())) { + logger.info("推广员已被暂时封禁或永久封禁"); + return; + } + // 添加收入流水记录并将收入添加到待结算金额到钱包中 + createIncomeByOrderItem(distributionConfig, order, shareUser, bindUser, orderItem); + } + + /** + * 创建订单项收入记录添加待结算金额到钱包中 + * + * @param distributionConfig 分销配置 + * @param order 订单 + * @param shareUser 分销员 + * @param bindUser 绑定的分销员 + * @param orderItem 订单项 + */ + private void createIncomeByOrderItem(DistributionConfigApiVO distributionConfig, OrderVO order, DistributionUser shareUser, DistributionUser bindUser, OrderItemVO orderItem) { + //判断是否会产生分销业绩 + if (Objects.isNull(bindUser) && Objects.isNull(shareUser)) { + logger.error("没有分享人,没有关系人,不产生业绩"); + return; + } + // 获取该分销商品的设置数据 + DistributionSpuVO distributionSpuVo = distributionSpuService.getBySpuId(orderItem.getSpuId()); + DistributionSpuBO distributionSpuBO = BeanUtil.map(distributionSpuVo, DistributionSpuBO.class); + + // 这件商品原本是分销商品被加入了购物车,后来又不是了 + if (distributionSpuBO == null) { + return; + } else { + distributionSpuBO.setShopId(orderItem.getShopId()); + // 计算佣金,用实付金额计算 + distributionSpuBO.setPrice(orderItem.getActualTotal()); + } + //定义一个最终的业绩归属人变量 + DistributionUser finalDistributionUser; + + //判断是分享人优先还是关系链优先 0 允许绑定,关系优先,1,不绑定 分享人优先 + if (distributionConfig.getAttribution() == 0) { + //关系链优先 + logger.info("关系链优先,关系人获得业绩"); + finalDistributionUser = bindUser; + } else { + //分享人优先 + logger.info("分享人优先,分享人获得业绩"); + finalDistributionUser = shareUser; + } + if (finalDistributionUser == null) { + logger.info("没有找到业绩归属者"); + return; + } + // 判断是否可以进行分销操作 + if (checkAmountOver(orderItem)) { + return; + } + Integer paySysType = configFeignClient.getPaySysType().getData(); + if (Objects.isNull(paySysType)) { + paySysType = PaySysType.DEFAULT.value(); + } + DistributionUserIncome distributionUserIncome = new DistributionUserIncome(); + distributionUserIncome.setPaySysType(paySysType); + distributionUserIncome.setOrderId(order.getOrderId()); + distributionUserIncome.setOrderItemId(orderItem.getOrderItemId()); + // 如果系统设置为交易完毕后结算,则记录为结算状态,否则为未结算状态 + distributionUserIncome.setState(DistributionUserIncomeStateEnum.UN_COMMISSION.value()); + distributionUserIncome.setShopId(orderItem.getShopId()); + distributionUserIncome.setSpuId(orderItem.getSpuId()); + //计算佣金金额 + DistributionAwardDataVO distributionAwardDataVO = getAwardDataVO(distributionSpuBO, orderItem); + //创建插入业绩记录对象 +// if (!Objects.equals(distributionAwardDataVO.getAwardNumber(), Constant.ZERO_LONG)) { + // 直推奖励 + insertAwardNumber(orderItem, finalDistributionUser, distributionAwardDataVO, distributionUserIncome); +// } else { +// logger.info("默认奖励为0,不结算"); +// } + //是否开启了上级奖励(0 关闭 1开启) + if (!Objects.equals(distributionSpuBO.getParentAwardSet(), 1)) { + logger.info("没有开启上级奖励"); + return; + } + //获取上级id + if (Objects.isNull(finalDistributionUser.getParentId()) && Objects.equals(distributionConfig.getAttribution(), 0)) { + logger.info("无法获取推广员的上级id"); + return; + } + if (Arith.isEquals(distributionAwardDataVO.getParentAwardNumber(), 0.0)) { + logger.info("商品上级奖励为0,不结算"); + return; + } + logger.info("进入上级奖励流程"); + // 间推奖励 + insertParentAwardNumber(orderItem, finalDistributionUser, bindUser, distributionAwardDataVO, distributionUserIncome); + + } + + private void insertParentAwardNumber(OrderItemVO orderItem, DistributionUser finalDistributionUser, DistributionUser bindUser, + DistributionAwardDataVO distributionAwardDataVO, DistributionUserIncome distributionUserIncome) { + if (Objects.isNull(finalDistributionUser.getParentId())) { + logger.info("分销员id-{}:没有上级,不进行间推分销处理", finalDistributionUser.getDistributionUserId()); + return; + } + // 添加二级佣金给上级邀请人 + DistributionUserWallet parentDistributionUserWallet = distributionUserWalletService.getByDistributionUserId(finalDistributionUser.getParentId()); + if (Objects.isNull(parentDistributionUserWallet)) { + logger.info("分销员id-{}:没有钱包信息", finalDistributionUser.getParentId()); + return; + } + // 如果上级不为空,则创建上级奖励业绩记录 + distributionUserIncome.setIncomeId(null); + //类型为二级奖励 + distributionUserIncome.setIncomeType(DistributionUserIncomeTypeEnum.AWARD_TWO.value()); + distributionUserIncome.setDistributionUserId(parentDistributionUserWallet.getDistributionUserId()); + distributionUserIncome.setIncomeAmount(distributionAwardDataVO.getParentAwardNumber()); + distributionUserIncome.setWalletId(parentDistributionUserWallet.getWalletId()); + distributionUserIncome.setUserId(orderItem.getUserId()); + // 若佣金大于实付金额改收入改为失效订单 + setDistributionIncome(orderItem, distributionAwardDataVO, distributionUserIncome, 2); + + distributionUserIncomeService.save(distributionUserIncome); + + if (distributionUserIncome.getState().equals(DistributionUserIncomeStateEnum.UN_COMMISSION.value())) { + //给邀请人钱包增加待结算金额 + parentDistributionUserWallet.setUnsettledAmount(parentDistributionUserWallet.getUnsettledAmount() + distributionAwardDataVO.getParentAwardNumber()); + //增加钱包流水记录 + if (distributionAwardDataVO.getParentAwardNumber() != 0) { + distributionUserWalletBillService.save(new DistributionUserWalletBill(parentDistributionUserWallet, "间推奖励", "Second-generation rewards", distributionAwardDataVO.getParentAwardNumber(), 0L, 0L, 0L, 0)); + } + // 订单项添加上级奖励 + orderItem.setDistributionParentAmount(distributionUserIncome.getIncomeAmount()); + } else { + logger.info("增加失效佣金"); + //给邀请人钱包增加失效金额 + parentDistributionUserWallet.setInvalidAmount(parentDistributionUserWallet.getInvalidAmount() + distributionUserIncome.getIncomeAmount()); + //增加钱包流水记录 + if (distributionAwardDataVO.getParentAwardNumber() != 0) { + distributionUserWalletBillService.save(new DistributionUserWalletBill(parentDistributionUserWallet, "间推奖励失效", "Intermittent bonuses are void", 0L, 0L, distributionUserIncome.getIncomeAmount(), 0L, 0)); + } + //佣金失效后,订单中分销金额要清除(如果不清除,失效的分销金额会插入到订单项中,就参与了订单金额的计算) + orderItem.setDistributionParentAmount(0L); + } + // 更新邀请人钱包 给钱包增加待结算金额 + if (distributionUserWalletService.updateWalletAmount(parentDistributionUserWallet) < 1) { + // 更新推广员钱包信息失败 + throw new LuckException("更新推广员钱包信息失败"); + } + } + + /** + * 直推奖励 + * + * @param orderItem 订单项 + * @param finalDistributionUser 分销员 + * @param distributionAwardDataVO 奖励参数 + * @param distributionUserIncome 收入参数 + */ + private void insertAwardNumber(OrderItemVO orderItem, DistributionUser finalDistributionUser, DistributionAwardDataVO distributionAwardDataVO, DistributionUserIncome distributionUserIncome) { + // 查询该推广员钱包信息 + DistributionUserWallet distributionUserWallet = distributionUserWalletService.getByDistributionUserId(finalDistributionUser.getDistributionUserId()); + distributionUserIncome.setDistributionUserId(finalDistributionUser.getDistributionUserId()); + distributionUserIncome.setWalletId(distributionUserWallet.getWalletId()); + distributionUserIncome.setIncomeAmount(distributionAwardDataVO.getAwardNumber()); + distributionUserIncome.setUserId(orderItem.getUserId()); + // 若佣金大于实付金额改收入改为失效订单 + setDistributionIncome(orderItem, distributionAwardDataVO, distributionUserIncome, 1); + + // 收入类型为一级奖励 + distributionUserIncome.setIncomeType(DistributionUserIncomeTypeEnum.AWARD_ONE.value()); + distributionUserIncomeService.save(distributionUserIncome); + + // 订单项添加分佣奖励 + orderItem.setDistributionAmount(distributionUserIncome.getIncomeAmount()); + + if (distributionUserIncome.getState().equals(DistributionUserIncomeStateEnum.UN_COMMISSION.value())) { + // 给钱包增加待结算金额 + distributionUserWallet.setUnsettledAmount(distributionUserWallet.getUnsettledAmount() + distributionAwardDataVO.getAwardNumber()); + distributionUserWalletBillService.save(new DistributionUserWalletBill(distributionUserWallet, "客户支付获取待结算金额", "Customer payment to obtain the amount to be settled", distributionAwardDataVO.getAwardNumber(), 0L, 0L, 0L, 0)); + } else { + logger.info("增加失效佣金"); + // 给钱包增加待失效金额 + distributionUserWallet.setInvalidAmount(distributionUserWallet.getInvalidAmount() + distributionUserIncome.getIncomeAmount()); + if (distributionUserIncome.getIncomeAmount() != 0) { + distributionUserWalletBillService.save(new DistributionUserWalletBill(distributionUserWallet, "客户支付小于佣金失效增加金额", "The client pays less than the increase in commission lapse", 0L, 0L, distributionUserIncome.getIncomeAmount(), 0L, 0)); + } + // 佣金失效后,订单中分销金额要清除(如果不清除,失效的分销金额会插入到订单项中,就参与了订单金额的计算) + orderItem.setDistributionAmount(0L); + } + // 给钱包增加待结算金额 + if (distributionUserWalletService.updateWalletAmount(distributionUserWallet) < 1) { + // 更新推广员钱包信息失败 + throw new LuckException("更新推广员钱包信息失败"); + } + } + + /** + * 检查分销金额是否超出订单项金额 + * + * @param orderItem + * @return + */ + private boolean checkAmountOver(OrderItemVO orderItem) { + // 获取该分销商品的设置数据 + DistributionSpuVO distributionSpuVo = distributionSpuService.getBySpuId(orderItem.getSpuId()); + DistributionSpuBO distributionSpuBO = BeanUtil.map(distributionSpuVo, DistributionSpuBO.class); + // 这件商品原本是分销商品被加入了购物车,后来又不是了 + if (distributionSpuBO == null) { + return true; + } else { + distributionSpuBO.setShopId(orderItem.getShopId()); + // 计算佣金,用实付金额计算 + distributionSpuBO.setPrice(orderItem.getActualTotal()); + } + return false; + } + + /** + * 根据分销商品设置、分享人id,计算奖励数据 + * + * @param distributionSpuBO 分销商品 + * @param orderItem 订单项 + * @return + */ + private DistributionAwardDataVO getAwardDataVO(DistributionSpuBO distributionSpuBO, OrderItemVO orderItem) { + DistributionAwardDataVO distributionAwardDataVO = new DistributionAwardDataVO(); + distributionAwardDataVO.setAwardNumber(Constant.ZERO_LONG); + distributionAwardDataVO.setParentAwardNumber(Constant.ZERO_LONG); + // distributionConfig + // 奖励比例或数额 + distributionAwardDataVO.setAwardMode(distributionSpuBO.getAwardMode()); + if (Objects.isNull(distributionSpuBO.getAwardMode())) { + return distributionAwardDataVO; + } + // 上级奖励设置(0 关闭 1开启) + Integer parentAwardSet = distributionSpuBO.getParentAwardSet(); + Long price = distributionSpuBO.getPrice(); + BigDecimal awardNumbers = new BigDecimal(distributionSpuBO.getAwardNumbers().toString()); + BigDecimal parentAwardNumbers = new BigDecimal(distributionSpuBO.getParentAwardNumbers().toString()); + // 如果计算为按比例计算,则转化为具体金额 + if (Objects.equals(distributionAwardDataVO.getAwardMode(), 0)) { + // 根据商品价格,计算得到的佣金 订单实际金额 * (奖励金额 / 100) 奖励比例 + // DistributionSpu.awardNumbers 查看解释,这个比例还需要除以100(awardNumbers = 1 则实际的奖励比例为 0.01%) + awardNumbers = awardNumbers + .divide(new BigDecimal(PriceUtil.ONE_HUNDRED), 2, RoundingMode.HALF_UP) + .divide(new BigDecimal(PriceUtil.ONE_HUNDRED), 4, RoundingMode.HALF_UP); + // 订单实际金额 * 奖励比例 + long awardAmount = new BigDecimal(price.toString()) + .multiply(awardNumbers) + .longValue(); + distributionAwardDataVO.setAwardNumber(awardAmount); + // 查看是否开启邀请人奖励 订单实际金额 * (奖励金额 / 100) 奖励比例 + if (Objects.equals(1, parentAwardSet)) { + // 邀请人奖励 + // DistributionSpu.parentAwardNumbers 查看解释,这个比例还需要除以100(parentAwardNumbers = 1 则实际的奖励比例为 0.01%) + parentAwardNumbers = parentAwardNumbers + .divide(new BigDecimal(PriceUtil.ONE_HUNDRED), 2, RoundingMode.HALF_UP) + .divide(new BigDecimal(PriceUtil.ONE_HUNDRED), 4, RoundingMode.HALF_UP); + // 订单实际金额 * 奖励比例 + long parentAwardNumber = new BigDecimal(price.toString()) + .multiply(parentAwardNumbers) + .longValue(); + distributionAwardDataVO.setParentAwardNumber(parentAwardNumber); + } + } else { + // 按照固定值奖励 + distributionAwardDataVO.setAwardNumber(awardNumbers.multiply(new BigDecimal(orderItem.getCount())).longValue()); + if (Objects.equals(1, parentAwardSet)) { + distributionAwardDataVO.setParentAwardNumber(parentAwardNumbers.multiply(new BigDecimal(orderItem.getCount())).longValue()); + } + } + return distributionAwardDataVO; + } + + + /** + * 实付金额小于佣金,修改收入订单为失效 + * + * @param orderItem + * @param distributionAwardDataVO + * @param distributionUserIncome + * @param type 1直推 2间推 + */ + private void setDistributionIncome(OrderItemVO orderItem, DistributionAwardDataVO distributionAwardDataVO, DistributionUserIncome distributionUserIncome, int type) { + // 计算出商家这个订单项收入的金额,因为商家的营销活动不可能会负收入,所以在小于分销的金额时,改为失效订单 + long changeAmount = orderItem.getActualTotal() + orderItem.getPlatformShareReduce() - orderItem.getPlatformCommission() - orderItem.getItemPurchaseAmount(); + if (type == DistributionAmountEnum.DIRECT_PUSH.value()) { + if (distributionAwardDataVO.getAwardNumber() >= changeAmount) { + logger.info("直推 分销金额比实付金额要大,分销佣金收入记录改为失效订单"); + distributionUserIncome.setState(DistributionUserIncomeStateEnum.INVALID.value()); + distributionUserIncome.setReson(DistributionAudit.INCOME_ONE.value()); + return; + } + } else if (type == DistributionAmountEnum.INTERPENETRATION.value()) { + if ((distributionAwardDataVO.getAwardNumber() + distributionAwardDataVO.getParentAwardNumber()) >= changeAmount) { + logger.info("间推 分销金额比实付金额要大,分销佣金收入记录改为失效订单"); + distributionUserIncome.setState(DistributionUserIncomeStateEnum.INVALID.value()); + distributionUserIncome.setReson(DistributionAudit.INCOME_ONE.value()); + return; + } + } + + double incomeAmount = Arith.round(distributionUserIncome.getIncomeAmount(), 2); + // 分销佣金小于0.01 + if (incomeAmount < Constant.MIN_SPU_AMOUNT) { + if (Objects.nonNull(distributionUserIncome.getReson())) { + return; + } + distributionUserIncome.setIncomeAmount(Constant.ZERO_LONG); + distributionUserIncome.setReson(DistributionAudit.INCOME_THREE.value()); + distributionUserIncome.setState(DistributionUserIncomeStateEnum.INVALID.value()); + return; + } + // 如果系统设置为交易完毕后结算,则记录为结算状态,否则为未结算状态 + distributionUserIncome.setState(1); + distributionUserIncome.setReson(0); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionRefundServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionRefundServiceImpl.java new file mode 100644 index 0000000..9921dbb --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionRefundServiceImpl.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.DistributionAudit; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.distribution.constant.DistributionUserIncomeStateEnum; +import com.tmerclub.cloud.distribution.model.DistributionUserIncome; +import com.tmerclub.cloud.distribution.model.DistributionUserWallet; +import com.tmerclub.cloud.distribution.model.DistributionUserWalletBill; +import com.tmerclub.cloud.distribution.service.DistributionRefundService; +import com.tmerclub.cloud.distribution.service.DistributionUserIncomeService; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletBillService; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletService; +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 java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author cl + * @date 2021-08-20 15:47:30 + */ +@Service +public class DistributionRefundServiceImpl implements DistributionRefundService { + + private static final Logger logger = LoggerFactory.getLogger(DistributionRefundServiceImpl.class); + @Autowired + private DistributionUserWalletService distributionUserWalletService; + @Autowired + private DistributionUserWalletBillService distributionUserWalletBillService; + @Autowired + private DistributionUserIncomeService distributionUserIncomeService; + + + @Override + @Transactional(rollbackFor = Exception.class) + public void refundDistributionAmount(OrderChangeShopWalletAmountBO message) { + if (Objects.isNull(message)) { + return; + } + // 回退的分销佣金 + Long orderId = message.getOrderId(); + Long orderItemId = message.getOrderItemId(); + Long distributionAmount = message.getDistributionAmount(); + + // 所有的订单分销流水记录查询出来 + List distributionUserIncomes = distributionUserIncomeService.getByOrderId(orderId); + if (CollUtil.isEmpty(distributionUserIncomes)) { + logger.info("订单无分销信息,不用回退分销佣金"); + return; + } + List returnAmountList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 整单退款 + if (Objects.isNull(orderItemId) || Objects.equals(Constant.ZERO_LONG, orderItemId)) { + returnAmountList.addAll(distributionUserIncomes); + } else { + // 单个订单项退款 + List distributionUserIncomeList = distributionUserIncomes.stream().filter(item -> Objects.equals(orderItemId, item.getOrderItemId())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(distributionUserIncomeList)) { + returnAmountList.addAll(distributionUserIncomeList); + } + } + if (CollUtil.isEmpty(returnAmountList)) { + return; + } + // 处理分销订单 + List updateIncomeIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + + DistributionUserWalletBill saveDistributionWalletBill = null; + DistributionUserWallet updateWallet = null; + for (DistributionUserIncome distributionUserIncome : returnAmountList) { + Integer reson = distributionUserIncome.getReson(); + // 幂等, 已经回退的分销佣金,失效状态,就不用再次回退佣金了 + if (Objects.equals(DistributionAudit.INCOME_ONE.value(), reson) || Objects.equals(DistributionAudit.INCOME_THREE.value(), reson)) { + continue; + } + if (Objects.isNull(updateWallet)) { + DistributionUserWallet distributionUserWallet = distributionUserWalletService.getByDistributionUserId(distributionUserIncome.getDistributionUserId()); + if (distributionUserWallet == null) { + // 未找到分销员信息 + throw new LuckException("未找到分销员信息"); + } + // 添加钱包变动日志 + distributionUserWallet.setUnsettledAmount(distributionUserWallet.getUnsettledAmount() - distributionAmount); + distributionUserWallet.setInvalidAmount(distributionUserWallet.getInvalidAmount() + distributionAmount); + saveDistributionWalletBill = new DistributionUserWalletBill(distributionUserWallet, "分销订单退款失效奖励", "Distribution order refund lapse bonus", -distributionAmount, Constant.ZERO_LONG, distributionAmount, Constant.ZERO_LONG, 0); + updateWallet = distributionUserWallet; + } + // 更新收入状态 + updateIncomeIds.add(distributionUserIncome.getIncomeId()); + } + // 修改分销员分销钱包 + if (Objects.nonNull(updateWallet)) { + distributionUserWalletService.updateWalletAmount(updateWallet); + // 添加一条分销钱包流水 + distributionUserWalletBillService.save(saveDistributionWalletBill); + } + // 失效分销流水记录 + if (CollUtil.isNotEmpty(updateIncomeIds)) { + distributionUserIncomeService.updateStateByIncomeIds(updateIncomeIds, DistributionUserIncomeStateEnum.INVALID.value(), DistributionAudit.INCOME_TWO.value()); + } + + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionSpuBindServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionSpuBindServiceImpl.java new file mode 100644 index 0000000..930940e --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionSpuBindServiceImpl.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.mapper.DistributionSpuBindMapper; +import com.tmerclub.cloud.distribution.model.DistributionSpuBind; +import com.tmerclub.cloud.distribution.service.DistributionSpuBindService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 用户商品绑定信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +@Service +public class DistributionSpuBindServiceImpl implements DistributionSpuBindService { + + @Autowired + private DistributionSpuBindMapper distributionSpuBindMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> distributionSpuBindMapper.list()); + } + + @Override + public DistributionSpuBind getById(Long id) { + return distributionSpuBindMapper.getById(id); + } + + @Override + public void save(DistributionSpuBind distributionSpuBind) { + distributionSpuBindMapper.save(distributionSpuBind); + } + + @Override + public void update(DistributionSpuBind distributionSpuBind) { + distributionSpuBindMapper.update(distributionSpuBind); + } + + @Override + public void deleteById(Long id) { + distributionSpuBindMapper.deleteById(id); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionSpuLogServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionSpuLogServiceImpl.java new file mode 100644 index 0000000..41d0f18 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionSpuLogServiceImpl.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.mapper.DistributionSpuLogMapper; +import com.tmerclub.cloud.distribution.model.DistributionSpuLog; +import com.tmerclub.cloud.distribution.service.DistributionSpuLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 分销商品浏览记录信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +@Service +public class DistributionSpuLogServiceImpl implements DistributionSpuLogService { + + @Autowired + private DistributionSpuLogMapper distributionSpuLogMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> distributionSpuLogMapper.list()); + } + + @Override + public DistributionSpuLog getByDistributionSpuLogId(Long distributionSpuLogId) { + return distributionSpuLogMapper.getByDistributionSpuLogId(distributionSpuLogId); + } + + @Override + public void save(DistributionSpuLog distributionSpuLog) { + distributionSpuLogMapper.save(distributionSpuLog); + } + + @Override + public void update(DistributionSpuLog distributionSpuLog) { + distributionSpuLogMapper.update(distributionSpuLog); + } + + @Override + public void deleteById(Long distributionSpuLogId) { + distributionSpuLogMapper.deleteById(distributionSpuLogId); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserIncomeServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserIncomeServiceImpl.java new file mode 100644 index 0000000..99d332f --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserIncomeServiceImpl.java @@ -0,0 +1,510 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.distribution.vo.DistributionUserIncomeApiVO; +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.api.multishop.bo.ShopSimpleBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.product.bo.SpuSimpleBO; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.DistributionAudit; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderVO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.order.vo.OrderSimpleAmountInfoBO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.distribution.constant.DistributionUserIncomeStateEnum; +import com.tmerclub.cloud.distribution.constant.DistributionUserIncomeTypeEnum; +import com.tmerclub.cloud.distribution.dto.DistributionUserIncomeDTO; +import com.tmerclub.cloud.distribution.mapper.DistributionUserIncomeMapper; +import com.tmerclub.cloud.distribution.model.DistributionUserIncome; +import com.tmerclub.cloud.distribution.model.DistributionUserWallet; +import com.tmerclub.cloud.distribution.model.DistributionUserWalletBill; +import com.tmerclub.cloud.distribution.service.DistributionUserIncomeService; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletBillService; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletService; +import com.tmerclub.cloud.distribution.vo.DistributionOrderVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserIncomeOrderVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserIncomeVO; +import com.tmerclub.cloud.distribution.vo.StatisticsDisUserIncomeVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 分销收入记录信息 + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +@Service +public class DistributionUserIncomeServiceImpl implements DistributionUserIncomeService { + + @Autowired + private DistributionUserIncomeMapper distributionUserIncomeMapper; + @Autowired + private DistributionUserWalletService distributionUserWalletService; + @Autowired + private DistributionUserWalletBillService distributionUserWalletBillService; + @DubboReference + private SearchOrderFeignClient searchOrderFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + @DubboReference + private ConfigFeignClient configFeignClient; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> distributionUserIncomeMapper.list()); + } + + @Override + public PageVO getDistributionUserIncomePage(PageDTO pageDTO, Long distributionUserId) { + Integer paySysType = configFeignClient.getPaySysType().getData(); + if (Objects.isNull(paySysType)) { + paySysType = PaySysType.DEFAULT.value(); + } + Integer finalPaySysType = paySysType; + return PageUtil.doPage(pageDTO, () -> distributionUserIncomeMapper.getDistributionUserIncomeList(distributionUserId, finalPaySysType)); + } + + @Override + public DistributionUserIncome getByIncomeId(Long incomeId) { + return distributionUserIncomeMapper.getByIncomeId(incomeId); + } + + @Override + public void save(DistributionUserIncome distributionUserIncome) { + distributionUserIncomeMapper.save(distributionUserIncome); + } + + @Override + public void update(DistributionUserIncome distributionUserIncome) { + distributionUserIncomeMapper.update(distributionUserIncome); + } + + @Override + public void deleteById(Long incomeId) { + distributionUserIncomeMapper.deleteById(incomeId); + } + + @Override + public PageVO effectPage(PageDTO pageDTO, DistributionUserIncomeDTO distributionUserIncomeDTO, String userMobile, Long shopId) { + // 补充支付系统类型 + Integer paySysType = configFeignClient.getPaySysType().getData(); + distributionUserIncomeDTO.setPaySysType(Objects.isNull(paySysType) ? PaySysType.DEFAULT.value() : paySysType); + // 分页查询数据 + PageVO pageVO = PageUtil.doPage(pageDTO, () -> distributionUserIncomeMapper.effectPage(distributionUserIncomeDTO, userMobile, shopId)); + List list = pageVO.getList(); + if (CollUtil.isEmpty(list)) { + return pageVO; + } + // 查询order的状态 + List orderIds = list.stream().map(DistributionUserIncomeVO::getOrderId).collect(Collectors.toList()); + ServerResponseEntity> orderResponseEntity = searchOrderFeignClient.listOrderById(orderIds); + if (!orderResponseEntity.isSuccess()) { + throw new LuckException(orderResponseEntity.getMsg()); + } + Map orderMap = orderResponseEntity.getData().stream().collect(Collectors.toMap(EsOrderVO::getOrderId, (k) -> k)); + for (DistributionUserIncomeVO incomeVO : list) { + Long orderId = incomeVO.getOrderId(); + EsOrderVO orderBO = orderMap.get(orderId); + if (Objects.isNull(orderBO)) { + continue; + } + incomeVO.setOrderStatus(orderBO.getStatus()); + } + pageVO.setList(list); + return pageVO; + } + + @Override + public PageVO pageSalesRecord(PageDTO pageDTO, DistributionUserIncomeDTO distributionUserIncomeDTO) { + // 补充paySysType + Integer paySysType = configFeignClient.getPaySysType().getData(); + distributionUserIncomeDTO.setPaySysType(Objects.isNull(paySysType) ? PaySysType.DEFAULT.value() : paySysType); + PageVO res = new PageVO<>(); + List shopSimpleList = null; + List spuSimpleList = null; + ShopSimpleBO shopSimpleBO = new ShopSimpleBO(); + // shopId正序 + shopSimpleBO.setSeq(1); + SpuSimpleBO spuSimpleBO = new SpuSimpleBO(); + // spuId正序 + spuSimpleBO.setSeq(1); + spuSimpleBO.setLang(I18nMessage.getLang()); + Long shopId = AuthUserContext.get().getTenantId(); + distributionUserIncomeDTO.setShopId(shopId); + if (Objects.equals(distributionUserIncomeDTO.getShopId(), Constant.PLATFORM_SHOP_ID)) { + // 平台端搜索,条件才有店铺名称 + if (StrUtil.isNotBlank(distributionUserIncomeDTO.getShopName())) { + shopSimpleBO.setShopName(distributionUserIncomeDTO.getShopName()); + ServerResponseEntity> shopRes = shopDetailFeignClient.listSimple(shopSimpleBO); + shopSimpleList = shopRes.getData(); + if (CollUtil.isEmpty(shopSimpleList)) { + return res; + } + } + } + if (StrUtil.isNotBlank(distributionUserIncomeDTO.getSpuName())) { + // 搜索条件存在商品名称 + spuSimpleBO.setSpuName(distributionUserIncomeDTO.getSpuName()); + setShopName(shopSimpleList, spuSimpleBO, shopId); + ServerResponseEntity> spuRes = spuFeignClient.listSimples(spuSimpleBO); + spuSimpleList = spuRes.getData(); + if (CollUtil.isEmpty(spuSimpleList)) { + return res; + } + } + if (!CollUtil.isEmpty(shopSimpleList)) { + distributionUserIncomeDTO.setShopIds(shopSimpleList.stream().map(ShopSimpleBO::getShopId).collect(Collectors.toList())); + } + if (!CollUtil.isEmpty(spuSimpleList)) { + distributionUserIncomeDTO.setSpuIds(spuSimpleList.stream().map(SpuSimpleBO::getSpuId).collect(Collectors.toList())); + } + // 查询结果 + res = PageUtil.doPage(pageDTO, () -> distributionUserIncomeMapper.listSalesRecord(distributionUserIncomeDTO)); + List list = res.getList(); + if (CollUtil.isEmpty(list)) { + return res; + } + if (CollUtil.isEmpty(shopSimpleList)) { + // 店铺列表信息为空,则去查询获取店铺信息,不为空则使用已获取的 + shopSimpleBO.setShopIds(list.stream().map(DistributionUserIncomeVO::getShopId).collect(Collectors.toList())); + ServerResponseEntity> shopRes = shopDetailFeignClient.listSimple(shopSimpleBO); + shopSimpleList = shopRes.getData(); + } + if (CollUtil.isEmpty(spuSimpleList)) { + // 商品列表信息为空,则去查询获取商品信息,不为空则使用已获取的 + spuSimpleBO.setSpuIds(list.stream().map(DistributionUserIncomeVO::getSpuId).collect(Collectors.toList())); + ServerResponseEntity> spuRes = spuFeignClient.listSimples(spuSimpleBO); + spuSimpleList = spuRes.getData(); + } + // 赋值店铺名称与商品名称 + for (DistributionUserIncomeVO distributionUserIncomeVO : list) { + SpuSimpleBO spuInfo = this.getSpuInfo(distributionUserIncomeVO.getSpuId(), spuSimpleList); + if (Objects.nonNull(spuInfo)) { + distributionUserIncomeVO.setSpuName(spuInfo.getSpuName()); + distributionUserIncomeVO.setMainImgUrl(spuInfo.getMainImgUrl()); + } + ShopSimpleBO shopInfo = this.getShopInfo(distributionUserIncomeVO.getShopId(), shopSimpleList); + if (Objects.nonNull(shopInfo)) { + distributionUserIncomeVO.setShopName(shopInfo.getShopName()); + } + } + res.setList(list); + return res; + } + + private static void setShopName(List shopSimpleList, SpuSimpleBO spuSimpleBO, Long shopId) { + if (!CollUtil.isEmpty(shopSimpleList)) { + // 如果搜索条件存在店铺名称,则把shopIds也设置为查询参数 + spuSimpleBO.setShopIds(shopSimpleList.stream().map(ShopSimpleBO::getShopId).collect(Collectors.toList())); + } else { + if (!Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + // 如果是商家端查询,设置店铺id + spuSimpleBO.setShopId(shopId); + } + } + } + + @Override + public PageVO getDistributionOrderByDistributionUserId(PageDTO pageDTO, Long distributionUserId) { + PageVO pageVO = PageUtil.doPage(pageDTO, () -> distributionUserIncomeMapper.getDistributionOrderByDistributionUserId(distributionUserId)); + List list = pageVO.getList(); + if (CollUtil.isEmpty(list)) { + return pageVO; + } + List orderItemIds = list.stream().map(DistributionOrderVO::getOrderItemId).collect(Collectors.toList()); + ServerResponseEntity> orderItemsResponse = searchOrderFeignClient.getOrderItems(orderItemIds); + if (!orderItemsResponse.isSuccess()) { + throw new LuckException(orderItemsResponse.getMsg()); + } + List orderItems = orderItemsResponse.getData(); + if (CollUtil.isEmpty(orderItems)) { + return pageVO; + } + Map orderVoMap = orderItems.stream().collect(Collectors.toMap(OrderItemVO::getOrderItemId, (k) -> k)); + for (DistributionOrderVO distributionOrderVO : list) { + Long orderItemId = distributionOrderVO.getOrderItemId(); + OrderItemVO orderItemVO = orderVoMap.get(orderItemId); + if (Objects.isNull(orderItemVO)) { + continue; + } + distributionOrderVO.setPic(orderItemVO.getPic()); + distributionOrderVO.setSpuId(orderItemVO.getSpuId()); + distributionOrderVO.setSpuName(orderItemVO.getSpuName()); + } + pageVO.setList(list); + return pageVO; + } + + @Override + public StatisticsDisUserIncomeVO statisticsDistributionUserIncome(Long distributionUserId) { + StatisticsDisUserIncomeVO statisticsDisUserIncomeVO = new StatisticsDisUserIncomeVO(); + Date now = new Date(); + Double todayAmount = distributionUserIncomeMapper.statisticsDisUserIncome(distributionUserId, DateUtil.beginOfDay(now), DateUtil.endOfDay(now)); + Double monthAmount = distributionUserIncomeMapper.statisticsDisUserIncome(distributionUserId, DateUtil.beginOfMonth(now), DateUtil.endOfMonth(now)); + statisticsDisUserIncomeVO.setTodayAmount(todayAmount); + statisticsDisUserIncomeVO.setMonthAmount(monthAmount); + return statisticsDisUserIncomeVO; + } + + @Override + public PageVO getMyPromotionOrderByState(PageDTO pageDTO, Long distributionUserId, Integer state) { + Integer paySysType = configFeignClient.getPaySysType().getData(); + if (Objects.isNull(paySysType)) { + paySysType = PaySysType.DEFAULT.value(); + } + Integer finalPaySysType = paySysType; + PageVO promotionOrderPage = PageUtil.doPage(pageDTO, () -> distributionUserIncomeMapper.getMyPromotionOrderByState(distributionUserId, state, finalPaySysType)); + List promotionOrderList = promotionOrderPage.getList(); + if (CollUtil.isEmpty(promotionOrderList)) { + return promotionOrderPage; + } + List orderItemIds = promotionOrderList.stream().map(DistributionUserIncomeOrderVO::getOrderItemId).collect(Collectors.toList()); + List orderIds = promotionOrderList.stream().map(DistributionUserIncomeOrderVO::getOrderId).collect(Collectors.toList()); + ServerResponseEntity> orderItemsResponse = searchOrderFeignClient.getOrderItems(orderItemIds); + ServerResponseEntity> orderResponse = orderFeignClient.getOrdersSimpleAmountInfo(orderIds); + if (!orderItemsResponse.isSuccess()) { + throw new LuckException(orderItemsResponse.getMsg()); + } + if (!orderResponse.isSuccess()) { + throw new LuckException(orderResponse.getMsg()); + } + List orderItems = orderItemsResponse.getData(); + List orderList = orderResponse.getData(); + if (CollUtil.isEmpty(orderItems) && CollUtil.isEmpty(orderList)) { + return promotionOrderPage; + } + Map orderItemVoMap = orderItems.stream().collect(Collectors.toMap(OrderItemVO::getOrderItemId, (k) -> k)); + for (DistributionUserIncomeOrderVO incomeOrderVO : promotionOrderList) { + Long orderItemId = incomeOrderVO.getOrderItemId(); + OrderItemVO orderItemVO = orderItemVoMap.get(orderItemId); + if (Objects.isNull(orderItemVO)) { + continue; + } + incomeOrderVO.setPic(orderItemVO.getPic()); + incomeOrderVO.setPrice(orderItemVO.getPrice()); + incomeOrderVO.setSpuCount(orderItemVO.getCount()); + incomeOrderVO.setSpuName(orderItemVO.getSpuName()); + incomeOrderVO.setSkuName(orderItemVO.getSkuName()); + Long actualTotal = orderItemVO.getActualTotal(); + if (Objects.isNull(actualTotal)) { + continue; + } + incomeOrderVO.setActualTotal(actualTotal); + } + return promotionOrderPage; + } + + @Override + public int countByOrderIdAndOrderItemId(Long orderId, Long orderItemId, Integer state) { + return distributionUserIncomeMapper.countByOrderIdAndOrderItemId(orderId, orderItemId, state); + } + + @Override + public List getByOrderId(Long orderId) { + return distributionUserIncomeMapper.getByOrderId(orderId); + } + + @Override + public void updateStateByIncomeIds(List incomeIds, Integer state, Integer reson) { + distributionUserIncomeMapper.updateStateByIncomeIds(incomeIds, state, reson); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void commissionSettlementHandle(Date date) { + // 查询需要处理的支付收入记录,15天前确认收货的订单 + // 本质上,我们是需要从订单中筛选出15天前已完结的订单,并且订单是分销相关的订单 + // 订单数据量很大,尽管可以从es中查询,我们也会查出,一些无用数据(比如:这些订单分销已经佣金结算处理过了,但是还是会查询出来, 并且这个数据会随着分销订单的增量越来越大) + // 所以我们从分销流水记录的角度来处理。 + + // 查询出未结算的分销流水 + Integer paySysType = configFeignClient.getPaySysType().getData(); + if (Objects.isNull(paySysType)) { + paySysType = PaySysType.DEFAULT.value(); + } + List distributionUserIncomeList = distributionUserIncomeMapper.listWaitCommissionSettlement(paySysType); + if (CollUtil.isEmpty(distributionUserIncomeList)) { + return; + } + handleCommissionSettle(distributionUserIncomeList); + } + + private void handleCommissionSettle(List distributionUserIncomeList) { + List orderIds = distributionUserIncomeList.stream().map(DistributionUserIncome::getOrderId).collect(Collectors.toList()); + OrderSearchDTO searchDTO = new OrderSearchDTO(); + searchDTO.setOrderIds(orderIds); + searchDTO.setIsSettled(1); + searchDTO.setPageNum(1); + searchDTO.setPageSize(orderIds.size()); + searchDTO.setFetchSource(new String[]{"orderId"}); + ServerResponseEntity> orderResponse = searchOrderFeignClient.listOrder(searchDTO); + if (!orderResponse.isSuccess()) { + throw new LuckException(orderResponse.getMsg()); + } + List data = orderResponse.getData(); + if (CollUtil.isEmpty(data)) { + return; + } + List orderIdList = data.stream().map(EsOrderVO::getOrderId).collect(Collectors.toList()); + distributionUserIncomeList = distributionUserIncomeList.stream().filter(item -> orderIdList.contains(item.getOrderId())).collect(Collectors.toList()); + + // 修改分销记录 + List updateIncomeIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 分销员钱包流水 + List saveBatchDistributionWalletBillList = new ArrayList<>(Constant.INITIAL_CAPACITY); + + for (DistributionUserIncome distributionUserIncome : distributionUserIncomeList) { + // 减少用户的待结算佣金,添加已结算金额 + DistributionUserWallet distributionUserWallet = distributionUserWalletService.getByWalletId(distributionUserIncome.getWalletId()); + if (distributionUserWallet == null) { + // 未找到分销员信息 + throw new LuckException("未找到分销员信息"); + } + + // 添加分销钱包日志 + Long incomeAmount = distributionUserIncome.getIncomeAmount(); + distributionUserWallet.setSettledAmount(distributionUserWallet.getSettledAmount() + incomeAmount); + // 待结算需要减去分销金额 + distributionUserWallet.setUnsettledAmount(distributionUserWallet.getUnsettledAmount() - incomeAmount); + distributionUserWallet.setAccumulateAmount(distributionUserWallet.getAccumulateAmount() + incomeAmount); + distributionUserWalletService.updateWalletAmount(distributionUserWallet); + + // 更新收入状态 + updateIncomeIds.add(distributionUserIncome.getIncomeId()); + + // 添加钱包变动日志 + if (Objects.equals(DistributionUserIncomeTypeEnum.AWARD_ONE.value(), distributionUserIncome.getIncomeType())) { + saveBatchDistributionWalletBillList.add(new DistributionUserWalletBill(distributionUserWallet, "直推奖励", "Direct push reward", -incomeAmount, incomeAmount, Constant.DEFAULT_AMOUNT, incomeAmount, 0)); + } else if (Objects.equals(DistributionUserIncomeTypeEnum.AWARD_TWO.value(), distributionUserIncome.getIncomeType())) { + saveBatchDistributionWalletBillList.add(new DistributionUserWalletBill(distributionUserWallet, "间推奖励", "Indirect reward", -incomeAmount, incomeAmount, Constant.DEFAULT_AMOUNT, incomeAmount, 0)); + } else { + saveBatchDistributionWalletBillList.add(new DistributionUserWalletBill(distributionUserWallet, "邀请奖励", "Invitation reward", -incomeAmount, incomeAmount, Constant.DEFAULT_AMOUNT, incomeAmount, 0)); + } + } + // 批量更新分销收入状态 + if (CollUtil.isNotEmpty(updateIncomeIds)) { + if (distributionUserIncomeMapper.updateStateByIncomeIds(updateIncomeIds, DistributionUserIncomeStateEnum.COMMISSION.value(), DistributionAudit.INCOME_ZERO.value()) <= 0) { + // 批量更新分销收入状态失败 + throw new LuckException("批量更新分销收入状态失败"); + } + } + + // 批量添加钱包变动日志 + if (CollUtil.isNotEmpty(saveBatchDistributionWalletBillList)) { + distributionUserWalletBillService.saveBatch(saveBatchDistributionWalletBillList); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void commissionSettlementHandleByOrderId(Long orderId) { + // 查询需要处理的支付收入记录,15天前确认收货的订单 + // 本质上,我们是需要从订单中筛选出15天前已完结的订单,并且订单是分销相关的订单 + // 订单数据量很大,尽管可以从es中查询,我们也会查出,一些无用数据(比如:这些订单分销已经佣金结算处理过了,但是还是会查询出来, 并且这个数据会随着分销订单的增量越来越大) + // 所以我们从分销流水记录的角度来处理。 + + // 查询出未结算的分销流水 + List distributionUserIncomeList = distributionUserIncomeMapper.listDistributionUserIncomeByOrderId(orderId); + if (CollUtil.isEmpty(distributionUserIncomeList)) { + return; + } + handleCommissionSettle(distributionUserIncomeList); + } + + @Override + public List listDistributionUserIncomeByOrderId(Long orderId) { + return BeanUtil.mapAsList(distributionUserIncomeMapper.listDistributionUserIncomeByOrderId(orderId), DistributionUserIncomeApiVO.class); + } + + /** + * 获取店铺信息 + * + * @param shopId 店铺id + * @param shopSimpleList shopId正序店铺列表 + * @return + */ + private ShopSimpleBO getShopInfo(Long shopId, List shopSimpleList) { + if (CollUtil.isEmpty(shopSimpleList) || Objects.isNull(shopId)) { + return null; + } + int leftIndex = 0; + int rightIndex = shopSimpleList.size() - 1; + int midIndex; + while (leftIndex <= rightIndex) { + midIndex = leftIndex + ((rightIndex - leftIndex) >>> 1); + ShopSimpleBO shopSimpleBO = shopSimpleList.get(midIndex); + if (Objects.equals(shopSimpleBO.getShopId(), shopId)) { + return shopSimpleBO; + } + if (shopSimpleBO.getShopId() > shopId) { + rightIndex = midIndex - 1; + } else { + leftIndex = midIndex + 1; + } + } + return null; + } + + /** + * 获取商品信息 + * + * @param spuId 商品id + * @param spuSimpleList spuId正序商品列表 + * @return + */ + private SpuSimpleBO getSpuInfo(Long spuId, List spuSimpleList) { + if (CollUtil.isEmpty(spuSimpleList) || Objects.isNull(spuId)) { + return null; + } + int leftIndex = 0; + int rightIndex = spuSimpleList.size() - 1; + int midIndex; + while (leftIndex <= rightIndex) { + midIndex = leftIndex + ((rightIndex - leftIndex) >>> 1); + SpuSimpleBO spuSimpleBO = spuSimpleList.get(midIndex); + if (Objects.equals(spuSimpleBO.getSpuId(), spuId)) { + return spuSimpleBO; + } + if (spuSimpleBO.getSpuId() > spuId) { + rightIndex = midIndex - 1; + } else { + leftIndex = midIndex + 1; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserWalletBillServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserWalletBillServiceImpl.java new file mode 100644 index 0000000..e9598b3 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserWalletBillServiceImpl.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.distribution.mapper.DistributionUserWalletBillMapper; +import com.tmerclub.cloud.distribution.model.DistributionUserWalletBill; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletBillService; +import com.tmerclub.cloud.distribution.vo.DistributionUserWalletBillVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +/** + * 分销员钱包流水记录 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +@Service +public class DistributionUserWalletBillServiceImpl implements DistributionUserWalletBillService { + + @Autowired + private DistributionUserWalletBillMapper distributionUserWalletBillMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> distributionUserWalletBillMapper.list()); + } + + @Override + public DistributionUserWalletBill getById(Long id) { + return distributionUserWalletBillMapper.getById(id); + } + + @Override + public void save(DistributionUserWalletBill distributionUserWalletBill) { + distributionUserWalletBillMapper.save(distributionUserWalletBill); + } + + @Override + public void update(DistributionUserWalletBill distributionUserWalletBill) { + distributionUserWalletBillMapper.update(distributionUserWalletBill); + } + + @Override + public void deleteById(Long id) { + distributionUserWalletBillMapper.deleteById(id); + } + + @Override + public PageVO walletBillPage(PageDTO pageDTO, String userMobile, String nickName) { + PageVO pageVO = PageUtil.doPage(pageDTO, () -> distributionUserWalletBillMapper.walletBillPage(userMobile, nickName)); + List list = pageVO.getList(); + if (Objects.equals(I18nMessage.getLang(), LanguageEnum.LANGUAGE_EN.getLang())) { + for (DistributionUserWalletBillVO walletBillVO : list) { + if (walletBillVO.getRemarksEn() != null) { + walletBillVO.setRemarks(walletBillVO.getRemarksEn()); + } + } + pageVO.setList(list); + } + return pageVO; + } + + @Override + public void saveBatch(List distributionUserWalletBills) { + if (CollUtil.isEmpty(distributionUserWalletBills)) { + return; + } + distributionUserWalletBillMapper.saveBatch(distributionUserWalletBills); + } + + @Override + public Long getHaveWithdrawalSum(Long walletId) { + return distributionUserWalletBillMapper.getHaveWithdrawalSum(walletId); + } + + @Override + public void initDistributionWalletBill() { + distributionUserWalletBillMapper.initDistributionWalletBill(); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserWalletServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserWalletServiceImpl.java new file mode 100644 index 0000000..2fe4519 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserWalletServiceImpl.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.distribution.constant.DistributionUserIncomeTypeEnum; +import com.tmerclub.cloud.distribution.constant.DistributionWalletBillTypeEnum; +import com.tmerclub.cloud.distribution.dto.DistributionUserWalletDTO; +import com.tmerclub.cloud.distribution.mapper.DistributionUserIncomeMapper; +import com.tmerclub.cloud.distribution.mapper.DistributionUserWalletMapper; +import com.tmerclub.cloud.distribution.model.DistributionUserIncome; +import com.tmerclub.cloud.distribution.model.DistributionUserWallet; +import com.tmerclub.cloud.distribution.model.DistributionUserWalletBill; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletBillService; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletService; +import com.tmerclub.cloud.distribution.vo.DistributionUserWalletVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 分销员钱包信息 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +@Service +public class DistributionUserWalletServiceImpl implements DistributionUserWalletService { + + @Autowired + private DistributionUserWalletMapper distributionUserWalletMapper; + @Autowired + private DistributionUserWalletBillService distributionUserWalletBillService; + + @Autowired + private DistributionUserIncomeMapper distributionUserIncomeMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> distributionUserWalletMapper.list()); + } + + @Override + public DistributionUserWallet getByWalletId(Long walletId) { + return distributionUserWalletMapper.getByWalletId(walletId); + } + + @Override + public void save(DistributionUserWallet distributionUserWallet) { + distributionUserWalletMapper.save(distributionUserWallet); + } + + @Override + public void update(DistributionUserWallet distributionUserWallet) { + distributionUserWalletMapper.update(distributionUserWallet); + } + + @Override + public void deleteById(Long walletId) { + distributionUserWalletMapper.deleteById(walletId); + } + + @Override + public PageVO walletPage(PageDTO pageDTO, String userMobile) { + return PageUtil.doPage(pageDTO, () -> distributionUserWalletMapper.walletPage(userMobile)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateWallet(DistributionUserWalletDTO distributionUserWalletDTO, Long userId) { + //获取到变动前的钱包 + Long walletId = distributionUserWalletDTO.getWalletId(); + DistributionUserWallet oldDistributionUserWallet = distributionUserWalletMapper.getByWalletId(walletId); + + DistributionUserWallet distributionUserWallet = new DistributionUserWallet(); + // 待结算金额和失效金额不能更改-如果平台减少用户待结算金额,且订单待结算的金额大于用户的结算金额, 在系统结算订单后用户待结算金额会小于0 (结算时: 订单待结算金额 - 用户待结算金额 = 用户剩余待结算金额) + distributionUserWallet.setWalletId(walletId); + // 修改后的金额 + Long settledAmount = distributionUserWalletDTO.getChangeAmount(); + // 可提现金额没有变动,不需要继续执行 + if (settledAmount == 0) { + return; + } + // 可提现金额不能小于0 + if (Arith.add(oldDistributionUserWallet.getSettledAmount(), settledAmount) < 0) { + throw new LuckException("数据已过期,请刷新页面"); + } + // 设置修改后的可提现金额 + distributionUserWallet.setSettledAmount(settledAmount + oldDistributionUserWallet.getSettledAmount()); + distributionUserWallet.setAccumulateAmount(oldDistributionUserWallet.getAccumulateAmount()); + Long addupAmount; + // 提现金额增加时,积累收益也要对应增加 + if (settledAmount > 0) { + addupAmount = settledAmount; + distributionUserWallet.setAccumulateAmount(addupAmount + oldDistributionUserWallet.getAccumulateAmount()); + } + // 根据变化的金额,重新计算要钱包的变动金额 + //修改钱包-只变动提现金额和积累收益 + distributionUserWalletMapper.update(distributionUserWallet); + + // 增加钱包流水记录 + DistributionUserWalletBill distributionUserWalletBill = new DistributionUserWalletBill(); + distributionUserWalletBill.setWalletId(walletId); + // 改变的金额 + distributionUserWalletBill.setUnsettledAmount(0L); + distributionUserWalletBill.setSettledAmount(longSub(distributionUserWallet.getSettledAmount(), oldDistributionUserWallet.getSettledAmount())); + distributionUserWalletBill.setInvalidAmount(0L); + distributionUserWalletBill.setAccumulateAmount(longSub(distributionUserWallet.getAccumulateAmount(), oldDistributionUserWallet.getAccumulateAmount())); + distributionUserWalletBill.setRemarksEn("Manual modification"); + distributionUserWalletBill.setRemarks("人工修改"); + // 变更后的金额 + distributionUserWalletBill.setUnsettledAmountAfter(oldDistributionUserWallet.getUnsettledAmount()); + distributionUserWalletBill.setSettledAmountAfter(distributionUserWallet.getSettledAmount()); + distributionUserWalletBill.setInvalidAmountAfter(oldDistributionUserWallet.getInvalidAmount()); + distributionUserWalletBill.setAccumulateAmountAfter(distributionUserWallet.getAccumulateAmount()); + distributionUserWalletBill.setType(DistributionWalletBillTypeEnum.USER.value()); + distributionUserWalletBill.setModifier(userId); + + distributionUserWalletBillService.save(distributionUserWalletBill); + + // 可提现金额发生变动时,增加或减少用户收益明细 + saveDistributionUserIncome(oldDistributionUserWallet, settledAmount); + } + + @Override + public DistributionUserWallet getByDistributionUserId(Long distributionUserId) { + return distributionUserWalletMapper.getByDistributionUserId(distributionUserId); + } + + @Override + public int updateWalletAmount(DistributionUserWallet updateWallet) { + return distributionUserWalletMapper.updateWalletAmount(updateWallet); + } + + @Override + public void initDistributionWallet() { + distributionUserWalletMapper.initDistributionWallet(); + } + + private long longSub(long v1, long v2) { + BigDecimal decimal = new BigDecimal(Long.valueOf(v1).toString()).subtract(new BigDecimal(Long.valueOf(v2).toString())); + return decimal.longValue(); + } + + + public void saveDistributionUserIncome(DistributionUserWallet oldDistributionUserWallet, Long addupAmount) { + DistributionUserIncome distributionUserIncome = new DistributionUserIncome(); + distributionUserIncome.setWalletId(oldDistributionUserWallet.getWalletId()); + distributionUserIncome.setIncomeType(DistributionUserIncomeTypeEnum.PLATFORM.value()); + distributionUserIncome.setIncomeAmount(addupAmount); + distributionUserIncome.setDistributionUserId(oldDistributionUserWallet.getDistributionUserId()); + distributionUserIncome.setCreateTime(new Date()); + distributionUserIncome.setUpdateTime(new Date()); + distributionUserIncome.setPaySysType(PaySysType.DEFAULT.value()); + distributionUserIncomeMapper.save(distributionUserIncome); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/task/DistributionCommissionSettlementTask.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/task/DistributionCommissionSettlementTask.java new file mode 100644 index 0000000..718a3d4 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/task/DistributionCommissionSettlementTask.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.task; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.distribution.service.DistributionUserIncomeService; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * 分销佣金结算 + * @author cl + * @date 2021-08-23 09:26:53 + */ +@Component +public class DistributionCommissionSettlementTask { + + private static final Logger log = LoggerFactory.getLogger(DistributionCommissionSettlementTask.class); + + @Autowired + private DistributionUserIncomeService distributionUserIncomeService; + + /** + * 确认收货15天后分销订单结算 + */ + @XxlJob("distributionCommissionSettlement") + public void distributionCommissionSettlement() { + log.info("开始执行分销订单结算任务》》》》》》》》》》》》》》》》》》》》》"); + + distributionUserIncomeService.commissionSettlementHandle(DateUtil.offsetDay(new Date(), -Constant.DISTRIBUTION_SETTLEMENT_TIME)); + + log.info("结束执行分销订单结算任务》》》》》》》》》》》》》》》》》》》》》"); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/task/EnterprisePayTask.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/task/EnterprisePayTask.java new file mode 100644 index 0000000..9894d8b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/task/EnterprisePayTask.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.task; + +import cn.hutool.core.util.StrUtil; +import com.github.binarywang.wxpay.bean.merchanttransfer.DetailsQueryResult; +import com.github.binarywang.wxpay.bean.merchanttransfer.MerchantDetailsQueryRequest; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.config.WxConfig; +import com.tmerclub.cloud.distribution.model.EnterprisePay; +import com.tmerclub.cloud.distribution.service.EnterprisePayService; +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; + + +/** + * 商家转账定时任务 + *使用商家转账的需要将下面的注释打开,注意!使用商家转账功能要经过测试之后才能上线,否则自行承担对应的后果!!! + * @author yami + */ +@Component("enterprisePay") +public class EnterprisePayTask { + + private static final Logger log = LoggerFactory.getLogger(EnterprisePayTask.class); + + @Autowired + private EnterprisePayService enterprisePayService; + + @Autowired + private FeignShopConfig feignShopConfig; + + @Autowired + private WxConfig wxConfig; + + /** + * 商家转账 + * 注意!使用这段代码要经过测试之后才能上线,否则自行承担对应的后果!!! + * //@XxlJob("sendEnterprisePay") + */ + public void sendEnterprisePay() { + log.info("开始执行发送商家转账任务》》》》》》》》》》》》》》》》》》》》》"); + + List enterprisePayList = enterprisePayService.listApplyEnterprisePay(); + enterprisePayService.sendEnterprisePay(enterprisePayList); + + log.info("结束执行发送商家转账任务》》》》》》》》》》》》》》》》》》》》》"); + } + + /** + * 查询支付情况 + * 注意!使用这段代码要经过测试之后才能上线,否则自行承担对应的后果!!! + * //@XxlJob("queryAndUpdateEntPay") + */ + public void queryAndUpdateEntPay() { + log.info("开始查询商家转账任务》》》》》》》》》》》》》》》》》》》》》》》"); + + List enterprisePayList = enterprisePayService.listEnterprisePay(); + if (CollectionUtils.isNotEmpty(enterprisePayList)) { + for (EnterprisePay enterprisePay : enterprisePayList) { + try { + MerchantDetailsQueryRequest request = new MerchantDetailsQueryRequest(); + request.setOutBatchNo(enterprisePay.getOutBatchNo()); + request.setOutDetailNo(String.valueOf(enterprisePay.getEntPayOrderNo())); + DetailsQueryResult detailsQueryResult = wxConfig.getMerchantTransferService().queryMerchantDetails(request); + // SYSTEM_ERROR:系统错误,不要更换商家批次单号,使用原商家批次单号重试 + if (StrUtil.equalsIgnoreCase(detailsQueryResult.getDetailStatus(), "SYSTEM_ERROR")) { + enterprisePayService.sendEnterprisePay(Collections.singletonList(enterprisePay)); + } + // SUCCESS: 转账成功 + if (StrUtil.equalsIgnoreCase(detailsQueryResult.getDetailStatus(), "SUCCESS")) { + enterprisePayService.paySuccess(enterprisePay); + } + // FAIL: 转账失败 + if (StrUtil.equalsIgnoreCase(detailsQueryResult.getDetailStatus(), "FAIL")) { + enterprisePayService.payFailed(enterprisePay); + log.error(detailsQueryResult.getFailReason()); + } + } catch (WxPayException e) { + log.error("WxPayException:", e); + } + } + } + log.info("结束查询商家转账任务》》》》》》》》》》》》》》》》》》》》》》》"); + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/AppDistributionWithdrawCashLogVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/AppDistributionWithdrawCashLogVO.java new file mode 100644 index 0000000..8807ba7 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/AppDistributionWithdrawCashLogVO.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 分月份分销提现记录信息 + * @author cl + * @date 2021-08-27 16:20:02 + */ +public class AppDistributionWithdrawCashLogVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 年月的时间 + */ + private Date date; + + /** + * 分销收入记录信息VO + */ + private List distributionWithdrawCashList; + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public List getDistributionWithdrawCashList() { + return distributionWithdrawCashList; + } + + public void setDistributionWithdrawCashList(List distributionWithdrawCashList) { + this.distributionWithdrawCashList = distributionWithdrawCashList; + } + + @Override + public String toString() { + return "AppDistributionWithdrawCashLogVO{" + + "date=" + date + + ", distributionWithdrawCashList=" + distributionWithdrawCashList + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/AppDistributionWithdrawCashVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/AppDistributionWithdrawCashVO.java new file mode 100644 index 0000000..d2b89dc --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/AppDistributionWithdrawCashVO.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 提现数据 + * + * @author cl + * @date 2021-08-17 09:01:23 + */ +public class AppDistributionWithdrawCashVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "提现记录id") + private Long withdrawCashId; + + @Schema(description = "提现金额") + private BigDecimal amount; + + @Schema(description = "手续费") + private BigDecimal fee; + + @Schema(description = "类型(0 手动提现 1自动提现)") + private Integer type; + + @Schema(description = "0 微信红包 1企业付款到微信零钱") + private Integer moneyFlow; + + @Schema(description = "流水号") + private String merchantOrderId; + + @Schema(description = "提现状态(0:申请中 1:提现成功 2:拒绝提现 -1:提现失败)") + private Integer state; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "更新时间-字符串") + private String monthTimeStr; + + public Long getWithdrawCashId() { + return withdrawCashId; + } + + public void setWithdrawCashId(Long withdrawCashId) { + this.withdrawCashId = withdrawCashId; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public BigDecimal getFee() { + return fee; + } + + public void setFee(BigDecimal fee) { + this.fee = fee; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getMoneyFlow() { + return moneyFlow; + } + + public void setMoneyFlow(Integer moneyFlow) { + this.moneyFlow = moneyFlow; + } + + public String getMerchantOrderId() { + return merchantOrderId; + } + + public void setMerchantOrderId(String merchantOrderId) { + this.merchantOrderId = merchantOrderId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getMonthTimeStr() { + return monthTimeStr; + } + + public void setMonthTimeStr(String monthTimeStr) { + this.monthTimeStr = monthTimeStr; + } + + @Override + public String toString() { + return "AppDistributionWithdrawCashVO{" + + "withdrawCashId=" + withdrawCashId + + ", amount=" + amount + + ", fee=" + fee + + ", type=" + type + + ", moneyFlow=" + moneyFlow + + ", merchantOrderId='" + merchantOrderId + '\'' + + ", state=" + state + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", monthTimeStr='" + monthTimeStr + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionAwardDataVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionAwardDataVO.java new file mode 100644 index 0000000..9789967 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionAwardDataVO.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author cl + * @date 2021-08-18 15:21:12 + */ +public class DistributionAwardDataVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 奖励数额(分) + */ + private Long awardNumber; + + /** + * 上级奖励数额(分) + */ + private Long parentAwardNumber; + + /** + * 奖励比例(0 按比例 1 按固定数值) + */ + private Integer awardMode; + + public Long getAwardNumber() { + return awardNumber; + } + + public void setAwardNumber(Long awardNumber) { + this.awardNumber = awardNumber; + } + + public Long getParentAwardNumber() { + return parentAwardNumber; + } + + public void setParentAwardNumber(Long parentAwardNumber) { + this.parentAwardNumber = parentAwardNumber; + } + + public Integer getAwardMode() { + return awardMode; + } + + public void setAwardMode(Integer awardMode) { + this.awardMode = awardMode; + } + + @Override + public String toString() { + return "DistributionAwardDataVO{" + + "awardNumber=" + awardNumber + + ", parentAwardNumber=" + parentAwardNumber + + ", awardMode=" + awardMode + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionSpuLogVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionSpuLogVO.java new file mode 100644 index 0000000..fd9d636 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionSpuLogVO.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销商品浏览记录信息VO + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public class DistributionSpuLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long distributionSpuLogId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "扫码手机号") + private String mobile; + + public Long getDistributionSpuLogId() { + return distributionSpuLogId; + } + + public void setDistributionSpuLogId(Long distributionSpuLogId) { + this.distributionSpuLogId = distributionSpuLogId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @Override + public String toString() { + return "DistributionSpuLogVO{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", distributionSpuLogId=" + distributionSpuLogId + + ", shopId=" + shopId + + ", spuId=" + spuId + + ", userId=" + userId + + ", mobile='" + mobile + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserAchievementDataVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserAchievementDataVO.java new file mode 100644 index 0000000..51b7b88 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserAchievementDataVO.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author cl + * @date 2021-08-10 14:04:24 + */ +public class DistributionUserAchievementDataVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "积累绑定客户数") + private Integer boundCustomers; + + @Schema(description = "积累邀请分销员数") + private Integer invitedVeeker; + + @Schema(description = "积累支付单数") + private Integer payNumber; + + @Schema(description = "积累成功成交单数") + private Integer successOrderNumber; + + @Schema(description = "积累成功成交金额") + private Integer successTradingVolume; + + @Schema(description = "积累推广订单数") + private Integer orderNumber; + + @Schema(description = "用户消费笔数") + private Double expenseNumber; + + @Schema(description = "用户消费金额") + private Double sumOfConsumption; + + @Schema(description = "分销员收益明细") + private DistributionUserIncomeVO distributionUserIncomeVO; + + @Schema(description = "分销员钱包") + private DistributionUserWalletVO distributionUserWalletVO; + + public Integer getBoundCustomers() { + return boundCustomers; + } + + public void setBoundCustomers(Integer boundCustomers) { + this.boundCustomers = boundCustomers; + } + + public Integer getInvitedVeeker() { + return invitedVeeker; + } + + public void setInvitedVeeker(Integer invitedVeeker) { + this.invitedVeeker = invitedVeeker; + } + + public Integer getPayNumber() { + return payNumber; + } + + public void setPayNumber(Integer payNumber) { + this.payNumber = payNumber; + } + + public Integer getSuccessOrderNumber() { + return successOrderNumber; + } + + public void setSuccessOrderNumber(Integer successOrderNumber) { + this.successOrderNumber = successOrderNumber; + } + + public Integer getSuccessTradingVolume() { + return successTradingVolume; + } + + public void setSuccessTradingVolume(Integer successTradingVolume) { + this.successTradingVolume = successTradingVolume; + } + + public Integer getOrderNumber() { + return orderNumber; + } + + public void setOrderNumber(Integer orderNumber) { + this.orderNumber = orderNumber; + } + + public Double getExpenseNumber() { + return expenseNumber; + } + + public void setExpenseNumber(Double expenseNumber) { + this.expenseNumber = expenseNumber; + } + + public Double getSumOfConsumption() { + return sumOfConsumption; + } + + public void setSumOfConsumption(Double sumOfConsumption) { + this.sumOfConsumption = sumOfConsumption; + } + + public DistributionUserIncomeVO getDistributionUserIncomeVO() { + return distributionUserIncomeVO; + } + + public void setDistributionUserIncomeVO(DistributionUserIncomeVO distributionUserIncomeVO) { + this.distributionUserIncomeVO = distributionUserIncomeVO; + } + + public DistributionUserWalletVO getDistributionUserWalletVO() { + return distributionUserWalletVO; + } + + public void setDistributionUserWalletVO(DistributionUserWalletVO distributionUserWalletVO) { + this.distributionUserWalletVO = distributionUserWalletVO; + } + + @Override + public String toString() { + return "DistributionUserAchievementDataVO{" + + "boundCustomers=" + boundCustomers + + ", invitedVeeker=" + invitedVeeker + + ", payNumber=" + payNumber + + ", successOrderNumber=" + successOrderNumber + + ", successTradingVolume=" + successTradingVolume + + ", orderNumber=" + orderNumber + + ", expenseNumber=" + expenseNumber + + ", sumOfConsumption=" + sumOfConsumption + + ", distributionUserIncomeVO=" + distributionUserIncomeVO + + ", distributionUserWalletVO=" + distributionUserWalletVO + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserAchievementVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserAchievementVO.java new file mode 100644 index 0000000..6ef3437 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserAchievementVO.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author cl + * @date 2021-08-10 14:16:25 + */ +public class DistributionUserAchievementVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "分销员分销钱包id") + private Long walletId; + + @Schema(description = "昵称") + private String nickName; + + @Schema(description = "手机号") + private String userMobile; + + @Schema(description = "直推奖励") + private Double aGenerationCommission; + + @Schema(description = "间推奖励") + private Double secondGenerationCommission; + + @Schema(description = "邀请奖励") + private Double invitationRewards; + + @Schema(description = "待结算金额") + private Long unsettledAmount; + + @Schema(description = "可提现金额") + private Long settledAmount; + + @Schema(description = "已失效金额") + private Long invalidAmount; + + @Schema(description = "积累收益") + private Long accumulateAmount; + + @Schema(description = "状态(-1永久封禁 0 待审核 1 正常 2 暂时封禁 3 审核未通过,需要重新申请)") + private Integer state; + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public Double getaGenerationCommission() { + return aGenerationCommission; + } + + public void setaGenerationCommission(Double aGenerationCommission) { + this.aGenerationCommission = aGenerationCommission; + } + + public Double getSecondGenerationCommission() { + return secondGenerationCommission; + } + + public void setSecondGenerationCommission(Double secondGenerationCommission) { + this.secondGenerationCommission = secondGenerationCommission; + } + + public Double getInvitationRewards() { + return invitationRewards; + } + + public void setInvitationRewards(Double invitationRewards) { + this.invitationRewards = invitationRewards; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getInvalidAmount() { + return invalidAmount; + } + + public void setInvalidAmount(Long invalidAmount) { + this.invalidAmount = invalidAmount; + } + + public Long getAccumulateAmount() { + return accumulateAmount; + } + + public void setAccumulateAmount(Long accumulateAmount) { + this.accumulateAmount = accumulateAmount; + } + + @Override + public String toString() { + return "DistributionUserAchievementVO{" + + "distributionUserId=" + distributionUserId + + ", walletId=" + walletId + + ", nickName='" + nickName + '\'' + + ", userMobile='" + userMobile + '\'' + + ", aGenerationCommission=" + aGenerationCommission + + ", secondGenerationCommission=" + secondGenerationCommission + + ", invitationRewards=" + invitationRewards + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", invalidAmount=" + invalidAmount + + ", accumulateAmount=" + accumulateAmount + + ", state=" + state + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserBanVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserBanVO.java new file mode 100644 index 0000000..b38de09 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserBanVO.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销封禁记录VO + * + * @author cl + * @date 2021-08-09 14:14:08 + */ +public class DistributionUserBanVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long banId; + + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "原因(0 失去联系 1恶意刷单 2其他)") + private Integer banReason; + + @Schema(description = "备注") + private String remarks; + + @Schema(description = "状态(1 正常 2暂时封禁 -1永久封禁)") + private Integer state; + + @Schema(description = "修改人") + private Long modifier; + + @Schema(description = "分销员昵称") + private String nickName; + + @Schema(description = "分销员手机号") + private String userMobile; + + @Schema(description = "操作人名称") + private String modifierName; + + public Long getBanId() { + return banId; + } + + public void setBanId(Long banId) { + this.banId = banId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Integer getBanReason() { + return banReason; + } + + public void setBanReason(Integer banReason) { + this.banReason = banReason; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public String getModifierName() { + return modifierName; + } + + public void setModifierName(String modifierName) { + this.modifierName = modifierName; + } + + @Override + public String toString() { + return "DistributionUserBanVO{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", banId=" + banId + + ", distributionUserId=" + distributionUserId + + ", banReason=" + banReason + + ", remarks='" + remarks + '\'' + + ", state=" + state + + ", modifier=" + modifier + + ", nickName='" + nickName + '\'' + + ", userMobile='" + userMobile + '\'' + + ", modifierName='" + modifierName + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserBindVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserBindVO.java new file mode 100644 index 0000000..bec5870 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserBindVO.java @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销员绑定关系VO + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +public class DistributionUserBindVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户关系表") + private Long bindId; + + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "当前绑定关系(-1失效 0 预绑定 1生效)") + private Integer state; + + @Schema(description = "失效原因(0 超过有效期 1抢客 2 管理员更改 3.暂时封禁)") + private Integer invalidReason; + + @Schema(description = "绑定时间") + private Date bindTime; + + @Schema(description = "失效时间") + private Date invalidTime; + + @Schema(description = "分销员昵称") + private String nickName; + + @Schema(description = "客户昵称") + private String userNickName; + + @Schema(description = "客户号码") + private String cuserMobile; + + @Schema(description = "分销员号码") + private String userMobile; + + public String getCuserMobile() { + return cuserMobile; + } + + public void setCuserMobile(String cuserMobile) { + this.cuserMobile = cuserMobile; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public Long getBindId() { + return bindId; + } + + public void setBindId(Long bindId) { + this.bindId = bindId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getInvalidReason() { + return invalidReason; + } + + public void setInvalidReason(Integer invalidReason) { + this.invalidReason = invalidReason; + } + + public Date getBindTime() { + return bindTime; + } + + public void setBindTime(Date bindTime) { + this.bindTime = bindTime; + } + + public Date getInvalidTime() { + return invalidTime; + } + + public void setInvalidTime(Date invalidTime) { + this.invalidTime = invalidTime; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUserNickName() { + return userNickName; + } + + public void setUserNickName(String userNickName) { + this.userNickName = userNickName; + } + + @Override + public String toString() { + return "DistributionUserBindVO{" + + "bindId=" + bindId + + ", distributionUserId=" + distributionUserId + + ", userId=" + userId + + ", state=" + state + + ", invalidReason=" + invalidReason + + ", bindTime=" + bindTime + + ", invalidTime=" + invalidTime + + ", nickName='" + nickName + '\'' + + ", userNickName='" + userNickName + '\'' + + ", cuserMobile='" + cuserMobile + '\'' + + ", userMobile='" + userMobile + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserIncomeVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserIncomeVO.java new file mode 100644 index 0000000..6fa3f91 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserIncomeVO.java @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销收入记录信息VO + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +public class DistributionUserIncomeVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "收入记录id") + private Long incomeId; + + @Schema(description = "钱包id") + private Long walletId; + + @Schema(description = "收入类型(1一代奖励、2二代奖励 3邀请奖励 等 )") + private Integer incomeType; + + @Schema(description = "佣金状态(0:待支付、1:待结算、2:已结算、-1:订单失效)") + private Integer state; + + @Schema(description = "佣金数额") + private Long incomeAmount; + + @Schema(description = "关联订购流水号") + private Long orderId; + + @Schema(description = "关联订单项order_item_id") + private Long orderItemId; + + @Schema(description = "商户订单号") + private String merchantOrderId; + + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "操作人id") + private Long modifier; + + @Schema(description = "分销员") + private DistributionUserVO distributionUser; + + @Schema(description = "订单状态") + private Integer orderStatus; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "商品图片") + private String mainImgUrl; + + @Schema(description = "用户id") + private Long userId; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Long getIncomeId() { + return incomeId; + } + + public void setIncomeId(Long incomeId) { + this.incomeId = incomeId; + } + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public Integer getIncomeType() { + return incomeType; + } + + public void setIncomeType(Integer incomeType) { + this.incomeType = incomeType; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getIncomeAmount() { + return incomeAmount; + } + + public void setIncomeAmount(Long incomeAmount) { + this.incomeAmount = incomeAmount; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public String getMerchantOrderId() { + return merchantOrderId; + } + + public void setMerchantOrderId(String merchantOrderId) { + this.merchantOrderId = merchantOrderId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + public DistributionUserVO getDistributionUser() { + return distributionUser; + } + + public void setDistributionUser(DistributionUserVO distributionUser) { + this.distributionUser = distributionUser; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + @Override + public String toString() { + return "DistributionUserIncomeVO{" + + "incomeId=" + incomeId + + ", walletId=" + walletId + + ", incomeType=" + incomeType + + ", state=" + state + + ", incomeAmount=" + incomeAmount + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", merchantOrderId='" + merchantOrderId + '\'' + + ", distributionUserId=" + distributionUserId + + ", modifier=" + modifier + + ", distributionUser=" + distributionUser + + ", orderStatus=" + orderStatus + + ", spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", userId=" + userId + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserSimpleInfoVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserSimpleInfoVO.java new file mode 100644 index 0000000..567aa73 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserSimpleInfoVO.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 精简版分销员数据 + * + * @author cl + * @date 2021-08-16 15:42:26 + */ +public class DistributionUserSimpleInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "分销员昵称") + private String nickName; + + @Schema(description = "真实姓名") + private String realName; + + @Schema(description = "头像") + private String pic; + + @Schema(description = "绑定时间") + @JsonFormat(pattern = "yyyy/MM/dd") + private Date bindTime; + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Date getBindTime() { + return bindTime; + } + + public void setBindTime(Date bindTime) { + this.bindTime = bindTime; + } + + @Override + public String toString() { + return "DistributionUserSimpleInfoVO{" + + "distributionUserId=" + distributionUserId + + ", nickName='" + nickName + '\'' + + ", realName='" + realName + '\'' + + ", pic='" + pic + '\'' + + ", bindTime=" + bindTime + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserWalletInfoVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserWalletInfoVO.java new file mode 100644 index 0000000..144b681 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserWalletInfoVO.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author Citrus + * @date 2021/8/19 14:59 + */ +public class DistributionUserWalletInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 待结算金额 + */ + private Long unsettledAmount; + + /** + * 可提现金额 + */ + private Long settledAmount; + + /** + * 已失效金额 + */ + private Long invalidAmount; + + /** + * 积累收益 + */ + private Long accumulateAmount; + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getInvalidAmount() { + return invalidAmount; + } + + public void setInvalidAmount(Long invalidAmount) { + this.invalidAmount = invalidAmount; + } + + public Long getAccumulateAmount() { + return accumulateAmount; + } + + public void setAccumulateAmount(Long accumulateAmount) { + this.accumulateAmount = accumulateAmount; + } + + @Override + public String toString() { + return "DistributionUserWalletInfoVO{" + + "unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", invalidAmount=" + invalidAmount + + ", accumulateAmount=" + accumulateAmount + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionWithdrawCashVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionWithdrawCashVO.java new file mode 100644 index 0000000..a4ace41 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionWithdrawCashVO.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销员提现记录VO + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public class DistributionWithdrawCashVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "提现记录id") + private Long withdrawCashId; + + @Schema(description = "钱包id") + private Long walletId; + + @Schema(description = "金额") + private Long amount; + + @Schema(description = "手续费") + private Long fee; + + @Schema(description = "类型(0 手动提现 1自动提现)") + private Integer type; + + @Schema(description = "资金流向(0微信红包、1企业付款到微信零钱)") + private Integer moneyFlow; + + @Schema(description = "商户订单号") + private String merchantOrderId; + + @Schema(description = "乐观锁") + private Integer version; + + @Schema(description = "提现状态(0:申请中 1:提现成功 -1:提现失败)") + private Integer state; + + @Schema(description = "分销员信息") + private DistributionUserVO distributionUserVO; + + public Long getWithdrawCashId() { + return withdrawCashId; + } + + public void setWithdrawCashId(Long withdrawCashId) { + this.withdrawCashId = withdrawCashId; + } + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Long getFee() { + return fee; + } + + public void setFee(Long fee) { + this.fee = fee; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getMoneyFlow() { + return moneyFlow; + } + + public void setMoneyFlow(Integer moneyFlow) { + this.moneyFlow = moneyFlow; + } + + public String getMerchantOrderId() { + return merchantOrderId; + } + + public void setMerchantOrderId(String merchantOrderId) { + this.merchantOrderId = merchantOrderId; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public DistributionUserVO getDistributionUserVO() { + return distributionUserVO; + } + + public void setDistributionUserVO(DistributionUserVO distributionUserVO) { + this.distributionUserVO = distributionUserVO; + } + + @Override + public String toString() { + return "DistributionWithdrawCashVO{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", withdrawCashId=" + withdrawCashId + + ", walletId=" + walletId + + ", amount=" + amount + + ", fee=" + fee + + ", type=" + type + + ", moneyFlow=" + moneyFlow + + ", merchantOrderId='" + merchantOrderId + '\'' + + ", version=" + version + + ", state=" + state + + ", distributionUserVO=" + distributionUserVO + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/LiveConstant.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/LiveConstant.java new file mode 100644 index 0000000..8e30e30 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/LiveConstant.java @@ -0,0 +1,34 @@ +package com.tmerclub.cloud.live.constant; + + +/** + * 常量 + * @author yami + */ +public class LiveConstant { + + /** + * 主播连接记录key前缀 + */ + public static final String LIVE_ANCHOR_PREFIX = "LIVE_ANCHOR_"; + + /** + * 用户连接记录key前缀 + */ + public static final String LIVE_USER_PREFIX = "LIVE_USER_"; + + /** + * 心跳 + */ + public static final String HEART_BEAT = "HEART_BEAT"; + + /** + * 弹幕最大字符数 + */ + public static final int BULLET_SCREEN_MAX_LENGTH = 255; + + /** + * 直播间默认的会话map容量 + */ + public static final int DEFAULT_MAP_SIZE = 256; +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/PlayBackType.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/PlayBackType.java new file mode 100644 index 0000000..5a45fb8 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/PlayBackType.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.constant; + +/** + * 播放类型 1.rtmp 2.flv 3.m3u8 + * @author Yami + */ +public enum PlayBackType { + + /** RTMP */ + RTMP(1), + + /** FLV */ + FLV(2), + + /** M3U8 */ + M3U8(3); + + private final Integer code; + + public Integer value() { + return code; + } + + PlayBackType(Integer code) { + this.code = code; + } + + public static PlayBackType instance(Integer value) { + PlayBackType[] enums = values(); + for (PlayBackType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/dto/LiveMessageDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/dto/LiveMessageDTO.java new file mode 100644 index 0000000..f8591b0 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/dto/LiveMessageDTO.java @@ -0,0 +1,89 @@ +package com.tmerclub.cloud.live.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 直播消息组成 + * 1. 弹幕消息 2.商品讲解状态变更(主播) + * @author TRACK + */ +public class LiveMessageDTO { + + @Schema(description = "消息类型 0.心跳 1.弹幕消息 2.商品讲解状态变更") + private Integer msgType; + + @Schema(description = "消息内容") + private String content; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "讲解状态 0未讲解 1讲解中") + private Integer explainStatus; + + @Schema(description = "活动价(秒杀、团购活动的商品价格)") + private Double activityPrice; + + @Schema(description = "用户昵称") + private String nickName; + + public Integer getMsgType() { + return msgType; + } + + public void setMsgType(Integer msgType) { + this.msgType = msgType; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getExplainStatus() { + return explainStatus; + } + + public void setExplainStatus(Integer explainStatus) { + this.explainStatus = explainStatus; + } + + public Double getActivityPrice() { + return activityPrice; + } + + public void setActivityPrice(Double activityPrice) { + this.activityPrice = activityPrice; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + @Override + public String toString() { + return "LiveMessageDTO{" + + "msgType=" + msgType + + ", content='" + content + '\'' + + ", spuId=" + spuId + + ", explainStatus=" + explainStatus + + ", activityPrice=" + activityPrice + + ", nickName='" + nickName + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/mapper/LiveRoomProdMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/mapper/LiveRoomProdMapper.java new file mode 100644 index 0000000..c027bf8 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/mapper/LiveRoomProdMapper.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.mapper; + +import com.tmerclub.cloud.live.model.LiveRoomProd; +import com.tmerclub.cloud.live.vo.LiveRoomProdVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 直播商品 + * @author TRACK + */ +public interface LiveRoomProdMapper { + + /** + * 保存直播商品 + * @param liveRoomProdList 直播商品 + */ + void saveBatch(@Param("liveRoomProdList") List liveRoomProdList); + + /** + * 根据直播id删除直播商品 + * @param roomId + */ + void deleteByRoomId(@Param("roomId") Long roomId); + + /** + * 根据商品id删除 + * @param spuId + * @param roomIds + */ + void deleteBySpuId(@Param("spuId") Long spuId, @Param("roomIds") List roomIds); + + /** + * 根据直播id获取直播商品列表 + * @param roomId + * @return + */ + List getByRoomId(@Param("roomId") Long roomId); + + /** + * 更新讲解状态 + * @param roomId + * @param spuId + * @param explainStatus + * @return + */ + int updateExplainStatus(@Param("roomId") Long roomId, @Param("spuId") Long spuId, @Param("explainStatus") Integer explainStatus); + + /** + * 根据商品id获取正常状态下的直播间id列表 + * @param spuId + * @return + */ + List listRoomIdBySpuId(@Param("spuId") Long spuId); + + /** + * 根据商品id获取正在直播的直播间信息 + * @param spuId + * @return + */ + LiveRoomProdVO getLivingRoomBySpuId(@Param("spuId") Long spuId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/model/LiveRoomProd.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/model/LiveRoomProd.java new file mode 100644 index 0000000..719021f --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/model/LiveRoomProd.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serializable; + + +/** + * 直播商品 + * @author TRACK + */ +public class LiveRoomProd extends BaseModel implements Serializable{ + private static final long serialVersionUID = 1L; + + /** + * 直播间商品信息 + */ + private Long roomProdId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 房间id + */ + private Long roomId; + + /** + * 讲解状态 0未讲解 1讲解中 + */ + private Integer explainStatus; + + public Long getRoomProdId() { + return roomProdId; + } + + public void setRoomProdId(Long roomProdId) { + this.roomProdId = roomProdId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getRoomId() { + return roomId; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public Integer getExplainStatus() { + return explainStatus; + } + + public void setExplainStatus(Integer explainStatus) { + this.explainStatus = explainStatus; + } + + @Override + public String toString() { + return "LiveRoomProd{" + + "roomProdId=" + roomProdId + + ",prodId=" + spuId + + ",roomId=" + roomId + + ",explainStatus=" + explainStatus + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/service/impl/LiveRoomProdServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/service/impl/LiveRoomProdServiceImpl.java new file mode 100644 index 0000000..387f14c --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/service/impl/LiveRoomProdServiceImpl.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.cache.constant.LiveCacheNames; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.SpuStatus; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.live.mapper.LiveRoomProdMapper; +import com.tmerclub.cloud.live.model.LiveRoomProd; +import com.tmerclub.cloud.live.service.LiveRoomProdService; +import com.tmerclub.cloud.live.vo.LiveMsgItemVO; +import com.tmerclub.cloud.live.vo.LiveRoomProdVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 直播商品 + * @author TRACK + */ +@Service +public class LiveRoomProdServiceImpl implements LiveRoomProdService { + + @Autowired + private LiveRoomProdMapper liveRoomProdMapper; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + + @Override + public void save(Long roomId, List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return; + } + // 过滤掉状态不正常的商品 + List spuList = getSpuList(spuIds); + if (CollUtil.isEmpty(spuList)) { + return; + } + List saveList = new ArrayList<>(); + for (SpuSearchVO spuSearchVO : spuList) { + LiveRoomProd liveRoomProd = new LiveRoomProd(); + liveRoomProd.setSpuId(spuSearchVO.getSpuId()); + liveRoomProd.setRoomId(roomId); + liveRoomProd.setExplainStatus(0); + saveList.add(liveRoomProd); + } + // 批量保存 + liveRoomProdMapper.saveBatch(saveList); + } + + private List getSpuList(List spuIds) { + ProductSearchDTO productSearchDTO = new ProductSearchDTO(); + productSearchDTO.setSpuIds(spuIds); + productSearchDTO.setSpuStatus(SpuStatus.PUT_SHELF.value()); + ServerResponseEntity> spuResponse = searchSpuFeignClient.simpleList(productSearchDTO); + if (!spuResponse.isSuccess()) { + throw new LuckException(spuResponse.getMsg()); + } + List spuList = spuResponse.getData(); + return spuList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = LiveCacheNames.LIVE_ROOM_PROD, key = "#roomId") + public void update(Long roomId, List spuIds) { + liveRoomProdMapper.deleteByRoomId(roomId); + save(roomId, spuIds); + } + + @Override + @CacheEvict(cacheNames = LiveCacheNames.LIVE_ROOM_PROD, key = "#roomId") + public void delete(Long roomId) { + liveRoomProdMapper.deleteByRoomId(roomId); + } + + @Override + public List listLiveRoomProdInfo(Long roomId) { + List liveRoomProds = liveRoomProdMapper.getByRoomId(roomId); + if (CollUtil.isEmpty(liveRoomProds)) { + return new ArrayList<>(); + } + List spuIds = liveRoomProds.stream().map(LiveRoomProdVO::getSpuId).toList(); + List spuList = getSpuList(spuIds); + if (CollUtil.isEmpty(spuList)) { + return new ArrayList<>(); + } + Map spuMap = spuList.stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, s -> s)); + Iterator iterator = liveRoomProds.iterator(); + while (iterator.hasNext()) { + LiveRoomProdVO liveRoomProdVO = iterator.next(); + SpuSearchVO spuSearchVO = spuMap.get(liveRoomProdVO.getSpuId()); + if (Objects.isNull(spuSearchVO)) { + iterator.remove(); + continue; + } + liveRoomProdVO.setSpuSearchVO(spuSearchVO); + } + return liveRoomProds; + } + + @Override + @Cacheable(cacheNames = LiveCacheNames.LIVE_ROOM_PROD, key = "#roomId") + public List listLiveRoomProd(Long roomId) { + return liveRoomProdMapper.getByRoomId(roomId); + } + + @Override + @CacheEvict(cacheNames = LiveCacheNames.LIVE_ROOM_PROD, key = "#roomId") + public int updateExplainStatus(Long roomId, Long spuId, Integer explainStatus) { + return liveRoomProdMapper.updateExplainStatus(roomId, spuId, explainStatus); + } + + @Override + public LiveMsgItemVO handleLiveProd(LiveMsgItemVO liveMsgItem) { + ProductSearchDTO productSearchDTO = new ProductSearchDTO(); + productSearchDTO.setPageNum(1); + productSearchDTO.setPageSize(1); + productSearchDTO.setSpuId(liveMsgItem.getSpuId()); + productSearchDTO.setSpuStatus(SpuStatus.PUT_SHELF.value()); + ServerResponseEntity> spuResponse = searchSpuFeignClient.search(productSearchDTO); + if (!spuResponse.isSuccess()) { + throw new LuckException(spuResponse.getMsg()); + } + EsPageVO spuData = spuResponse.getData(); + List productSearchList = spuData.getList(); + if (CollUtil.isEmpty(productSearchList) || CollUtil.isEmpty(productSearchList.get(0).getSpus())) { + return null; + } + + List spuList = productSearchList.get(0).getSpus(); + SpuSearchVO spuSearchVO = spuList.get(0); + liveMsgItem.setSpuName(spuSearchVO.getSpuName()); + liveMsgItem.setPic(spuSearchVO.getMainImgUrl()); + liveMsgItem.setPrice(spuSearchVO.getPriceFee()); + liveMsgItem.setActivityPrice(spuSearchVO.getActivityPrice()); + return liveMsgItem; + } + + @Override + public LiveRoomProdVO getLivingRoomBySpuId(Long spuId) { + return liveRoomProdMapper.getLivingRoomBySpuId(spuId); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/socket/LiveUserWebSocketServer.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/socket/LiveUserWebSocketServer.java new file mode 100644 index 0000000..2dac549 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/socket/LiveUserWebSocketServer.java @@ -0,0 +1,280 @@ +package com.tmerclub.cloud.live.socket; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.MapUtil; +import com.tmerclub.cloud.live.constant.LiveConstant; +import com.tmerclub.cloud.live.constant.MsgCode; +import com.tmerclub.cloud.live.constant.MsgType; +import com.tmerclub.cloud.live.dto.LiveMessageDTO; +import com.tmerclub.cloud.live.service.LiveRoomProdService; +import com.tmerclub.cloud.live.service.LiveRoomService; +import com.tmerclub.cloud.live.vo.LiveMsgItemVO; +import com.tmerclub.cloud.live.vo.LiveRoomProdVO; +import com.tmerclub.cloud.live.vo.LiveRoomVO; +import jakarta.websocket.*; +import jakarta.websocket.server.PathParam; +import jakarta.websocket.server.ServerEndpoint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 用户ws + * userType 0游客 1用户 + * @author TRACK + */ +@ServerEndpoint("/ua/im/websocket/live/user/{userType}/{token}/{userId}/{roomId}") +@Component +public class LiveUserWebSocketServer { + + public static final Logger logger = LoggerFactory.getLogger(LiveAnchorWebSocketServer.class); + + public static final ConcurrentHashMap LIVE_USER_MAP = new ConcurrentHashMap<>(LiveConstant.DEFAULT_MAP_SIZE); + + private static LiveRoomService liveRoomService; + + private static LiveRoomProdService liveRoomProdService; + + private static TokenFeignClient tokenFeignClient; + + public static void setApplicationContext(ApplicationContext applicationContext) { + liveRoomService = applicationContext.getBean(LiveRoomService.class); + tokenFeignClient = applicationContext.getBean(TokenFeignClient.class); + liveRoomProdService = applicationContext.getBean(LiveRoomProdService.class); + } + + @OnOpen + public void onOpen(Session session, @PathParam("token") String token, @PathParam("roomId") Long roomId, + @PathParam("userType") Integer userType, @PathParam("userId") Long uid) throws IOException { + logger.info("创建用户直播连接"); + UidInfoBO uidInfoBO = new UidInfoBO(); + if (Objects.equals(userType, 1)) { + token = Base64.decodeStr(token); + uidInfoBO = tokenFeignClient.checkToken(token); + if (Objects.isNull(uidInfoBO)) { + logger.error("无法获取直播用户信息"); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取直播用户信息"))); + } + return; + } + } + + // 检查直播间 + LiveRoomVO livingRoom = liveRoomService.getLivingRoomInfo(null, roomId); + if (Objects.isNull(livingRoom)) { + logger.error("直播间不存在"); + if (session.isOpen()) { + // 当前未有直播权限 + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_ROOM_INFO, "直播间不存在"))); + } + return; + } + Long userId = uidInfoBO.getUserId(); + if (Objects.equals(userType, 0)) { + userId = uid; + } else { + // 已经有连接 + Session oldSession = LIVE_USER_MAP.get(LiveConstant.LIVE_USER_PREFIX + livingRoom.getRoomId() + Constant.UNDERLINE + userId); + if (Objects.nonNull(oldSession)) { + if (oldSession.isOpen()) { + oldSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.LOGIN_IN_OTHER_PLACE, "账户已在别处登录,请刷新"))); + oldSession.close(); + } + return; + } + } + // 存储会话到map + LIVE_USER_MAP.put(LiveConstant.LIVE_USER_PREFIX + livingRoom.getRoomId() + Constant.UNDERLINE + userId, session); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success())); + } + // 给所有用户更新直播观看人数 + sendChangeLiveUserCountMsg(roomId, LIVE_USER_MAP.size(), userId, session); + // 如果有商品是讲解状态,发送一条讲解消息给用户 + sendProdExplainingMsg(session, livingRoom); + } + + private static void sendProdExplainingMsg(Session session, LiveRoomVO livingRoom) throws IOException { + List prodList = liveRoomProdService.listLiveRoomProd(livingRoom.getRoomId()); + List livingProds = prodList.stream().filter(p -> Objects.equals(p.getExplainStatus(), 1)).toList(); + if (CollUtil.isNotEmpty(livingProds)) { + LiveRoomProdVO liveRoomProdVO = livingProds.get(0); + LiveMsgItemVO liveMsgItemParam = new LiveMsgItemVO(); + liveMsgItemParam.setMsgType(MsgType.EXPLAIN_STATUS); + liveMsgItemParam.setSpuId(liveRoomProdVO.getSpuId()); + liveMsgItemParam.setExplainStatus(1); + LiveMsgItemVO liveMsgItem = liveRoomProdService.handleLiveProd(liveMsgItemParam); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(liveMsgItem))); + } + } + } + + private static void sendChangeLiveUserCountMsg(Long roomId, Integer liveUserCount, Long userId, Session session) throws IOException { + // 发送消息通知用户直播状态变更 + List onlineUserList = LiveUserWebSocketServer.getOnlineUserList(roomId); + // 添加当前用户 + onlineUserList.add(session); + LiveMsgItemVO liveMsgItem = new LiveMsgItemVO(); + liveMsgItem.setMsgType(MsgType.LIVE_USER_COUNT); + liveMsgItem.setLiveUserCount(liveUserCount); + if (CollUtil.isNotEmpty(onlineUserList)) { + for (Session onlineUser : onlineUserList) { + if (Objects.nonNull(onlineUser) && onlineUser.isOpen()) { + onlineUser.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(liveMsgItem))); + } + } + } + } + + @OnClose + public void onClose(Session session, @PathParam("token") String token, + @PathParam(value = "userId") Long userId, @PathParam(value = "roomId") Long roomId) throws IOException { + logger.info("关闭用户直播连接"); + LIVE_USER_MAP.remove(LiveConstant.LIVE_USER_PREFIX + roomId + Constant.UNDERLINE + userId); + // 给所有用户更新直播观看人数 + sendChangeLiveUserCountMsg(roomId, LIVE_USER_MAP.size(), userId, session); + } + + @OnError + public void onError(Session session, @PathParam("token") String token, Throwable error, + @PathParam(value = "userId") Long userId, @PathParam("roomId") Long roomId) throws IOException { + logger.error("用户直播连接发生错误{}", error.toString()); + LIVE_USER_MAP.remove(LiveConstant.LIVE_USER_PREFIX + roomId + Constant.UNDERLINE + userId); + // 给所有用户更新直播观看人数 + sendChangeLiveUserCountMsg(roomId, LIVE_USER_MAP.size(), userId, session); + } + + @OnMessage + public void onMessage(String sourceMessage, @PathParam("token") String token, Session session, + @PathParam("roomId") Long roomId, @PathParam("userType") Integer userType, @PathParam("userId") Long uid) throws IOException { + UidInfoBO uidInfoBO = new UidInfoBO(); + if (Objects.equals(userType, 1)) { + token = Base64.decodeStr(token); + uidInfoBO = tokenFeignClient.checkToken(token); + if (Objects.isNull(uidInfoBO)) { + logger.error("无法获取直播用户信息"); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取直播用户信息"))); + } + return; + } + } + if (StrUtil.isBlank(sourceMessage)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "直播用户消息内容格式有误"))); + } + return; + } + logger.info("直播用户sourceMessage:" + sourceMessage); + LiveMessageDTO liveMessageInfo = Json.parseObject(sourceMessage, LiveMessageDTO.class); + if (Objects.isNull(liveMessageInfo)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "直播用户消息内容格式有误"))); + } + return; + } + if (checkLiveRoom(session, roomId, null)) { + return; + } + // 保持心跳 + if (Objects.equals(liveMessageInfo.getMsgType(), MsgType.HEART_BEAT)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.HEART_BEAT, "保持心跳"))); + } + return; + } + if (Objects.equals(userType, 0) && Objects.equals(liveMessageInfo.getMsgType(), MsgType.BULLET_SCREEN)) { + // 游客 不能发送弹幕 + return; + } + // 用户发送弹幕 + if (Objects.equals(liveMessageInfo.getMsgType(), MsgType.BULLET_SCREEN)) { + if (StrUtil.isBlank(liveMessageInfo.getContent())) { + return; + } + // 弹幕内容不超过50个字符 + if (liveMessageInfo.getContent().length() > LiveConstant.BULLET_SCREEN_MAX_LENGTH) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "用户弹幕内容过长"))); + } + return; + } + // 发送弹幕给在线用户 + sendMsgToUser(roomId, liveMessageInfo.getNickName(), liveMessageInfo.getContent(), 0); + } + } + + private static boolean checkLiveRoom(Session session, Long roomId, Long userId) throws IOException { + // 检查直播间 + LiveRoomVO livingRoom = liveRoomService.getLivingRoomInfo(userId, roomId); + if (Objects.isNull(livingRoom)) { + logger.error("直播间不存在"); + if (session.isOpen()) { + // 直播间不存在 + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_ROOM_INFO, "直播间不存在"))); + } + return true; + } + return false; + } + + public static void sendMsgToUser(Long roomId, String nickName, String content, Integer userType) throws IOException { + // 给在线用户发送弹幕消息 + List onlineUserList = getOnlineUserList(roomId); + if (CollUtil.isNotEmpty(onlineUserList)) { + LiveMsgItemVO liveMsgItem = new LiveMsgItemVO(); + liveMsgItem.setMsgType(MsgType.BULLET_SCREEN); + liveMsgItem.setNickName(nickName); + liveMsgItem.setContent(content); + liveMsgItem.setUserType(userType); + for (Session onlineUser : onlineUserList) { + if (Objects.nonNull(onlineUser) && onlineUser.isOpen()) { + onlineUser.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(liveMsgItem))); + } + } + } + } + + public static List getOnlineUserList(Long roomId) { + // 查找当前直播间在线用户 + List onlineUserList = new ArrayList<>(LiveConstant.DEFAULT_MAP_SIZE); + for (String liveUserKey : LiveUserWebSocketServer.LIVE_USER_MAP.keySet()) { + // 给在线用户发送消息 + if (liveUserKey.startsWith(LiveConstant.LIVE_USER_PREFIX + roomId + Constant.UNDERLINE)) { + onlineUserList.add(LiveUserWebSocketServer.LIVE_USER_MAP.get(liveUserKey)); + } + } + // 给主播发送消息 + LiveRoomVO livingRoomInfo = liveRoomService.getLivingRoomInfo(null, roomId); + if (Objects.isNull(livingRoomInfo)) { + List sessions = MapUtil.getSessionByKeyPrefix(LiveAnchorWebSocketServer.LIVE_ANCHOR_MAP, LiveConstant.LIVE_ANCHOR_PREFIX + roomId + Constant.UNDERLINE); + if (CollUtil.isNotEmpty(sessions)) { + onlineUserList.addAll(sessions); + } + } else { + Session anchorSession = LiveAnchorWebSocketServer.LIVE_ANCHOR_MAP.get(LiveConstant.LIVE_ANCHOR_PREFIX + roomId + Constant.UNDERLINE + livingRoomInfo.getUserId()); + if (Objects.nonNull(anchorSession)) { + onlineUserList.add(anchorSession); + } + } + return onlineUserList; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/util/AliLiveUtil.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/util/AliLiveUtil.java new file mode 100644 index 0000000..0ebeb30 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/util/AliLiveUtil.java @@ -0,0 +1,99 @@ +package com.tmerclub.cloud.live.util; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestUtil; +import com.tmerclub.cloud.common.bean.AliLive; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.live.constant.PlayBackType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; +import java.util.Objects; + +/** + * 阿里云直播工具 + * @author TRACK + */ +public class AliLiveUtil { + private static final Logger logger = LoggerFactory.getLogger(AliLiveUtil.class); + + /** + * 根据流名称创建推流url + * @param streamName 视频直播根据流名称(StreamName)而不是根据应用名称(AppName)来判断直播流是否唯一 + * @param endTime 直播间结束时间 + * @param aliLive 阿里云直播配置 + * @return 推流域名+AppName(应用)+StreamName(直播流)+鉴权串 + */ + public static String getPushUrl(String streamName, Date endTime, AliLive aliLive) { + if (Objects.isNull(streamName) || StrUtil.isBlank(streamName)) { + throw new LuckException("Stream name cannot be null"); + } + // 推流域名 + String pushDomain = aliLive.getPushDomain(); + // 应用名称 + String appName = aliLive.getAppName(); + // 推流鉴权key + String pushAuthKey = aliLive.getPushAuthKey(); + // 过期时间 + String exp = String.valueOf(endTime.getTime() / 1000); + // 推流前缀:rtmp://{pushDomain}/{appName}/{streamName} + String pushPrefixUrl = StrUtil.format("rtmp://{}/{}/{}", pushDomain, appName, streamName); + + // 组合md5加密串 /{appName}/{streamName}-{exp}-0-0-{pushAuthKey} + String md5Url = StrUtil.format("/{}/{}-{}-0-0-{}", appName, streamName, exp, pushAuthKey); + // md5加密 + String md5Hex = DigestUtil.md5Hex(md5Url); + // 推流路径 {pushPrefixUrl}?auth_key={exp}-0-0-{md5Hex} + String pushUrl = StrUtil.format("{}?auth_key={}-0-0-{}", pushPrefixUrl, exp, md5Hex); + logger.info("推流路径为:" + pushUrl); + return pushUrl; + } + + /** + * 根据流名称创建播流url + * @param streamName 视频直播根据流名称(StreamName)而不是根据应用名称(AppName)来判断直播流是否唯一 + * @param playBackType 播放类型 1.rtmp 2.flv 3.m3u8 + * @param endTime 直播间结束时间 + * @param aliLive 阿里云直播配置 + * @return 推流域名+AppName(应用)+StreamName(直播流)+鉴权串 + */ + public static String getPullUrl(String streamName, Integer playBackType, Date endTime, AliLive aliLive) { + if (Objects.isNull(streamName) || StrUtil.isBlank(streamName)) { + throw new LuckException("Stream name cannot be null"); + } + // 播流域名 + String pullDomain = aliLive.getPullDomain(); + // 应用名称 + String appName = aliLive.getAppName(); + // 播流鉴权key + String pullAuthKey = aliLive.getPullAuthKey(); + // 过期时间 + String exp = String.valueOf(endTime.getTime() / 1000); + // 通用播流域名 {pullDomain}/{appName}/{streamName} + String pullPrefix = StrUtil.format("{}/{}/{}", pullDomain, appName, streamName); + // 组合md5加密串 /{appName}/{streamName}-{exp}-0-0-{pullAuthKey} + String md5Url = ""; + if (Objects.equals(playBackType, PlayBackType.RTMP.value())) { + md5Url = StrUtil.format("/{}/{}-{}-0-0-{}", appName, streamName, exp, pullAuthKey); + } else if (Objects.equals(playBackType, PlayBackType.FLV.value())) { + md5Url = StrUtil.format("/{}/{}.flv-{}-0-0-{}", appName, streamName, exp, pullAuthKey); + } else if (Objects.equals(playBackType, PlayBackType.M3U8.value())) { + md5Url = StrUtil.format("/{}/{}.m3u8-{}-0-0-{}", appName, streamName, exp, pullAuthKey); + } + // md5加密 + String md5Hex = DigestUtil.md5Hex(md5Url); + // 播流路径 + String pullUrl = ""; + boolean isHttps = Objects.nonNull(aliLive.getIsHttps()) && Objects.equals(aliLive.getIsHttps(), 1); + if (Objects.equals(playBackType, PlayBackType.RTMP.value())) { + pullUrl = StrUtil.format("rtmp://{}?auth_key={}-0-0-{}", pullPrefix, exp, md5Hex); + } else if (Objects.equals(playBackType, PlayBackType.FLV.value())) { + pullUrl = StrUtil.format(isHttps ? "https://{}.flv?auth_key={}-0-0-{}" : "http://{}.flv?auth_key={}-0-0-{}", pullPrefix, exp, md5Hex); + } else if (Objects.equals(playBackType, PlayBackType.M3U8.value())) { + pullUrl = StrUtil.format(isHttps ? "https://{}.m3u8?auth_key={}-0-0-{}" : "http://{}.m3u8?auth_key={}-0-0-{}", pullPrefix, exp, md5Hex); + } + logger.info("播流路径为:" + pullUrl); + return pullUrl; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/vo/LiveMsgItemVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/vo/LiveMsgItemVO.java new file mode 100644 index 0000000..c56d942 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/vo/LiveMsgItemVO.java @@ -0,0 +1,161 @@ +package com.tmerclub.cloud.live.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 直播返回消息组成 + * + * @author TRACK + */ +public class LiveMsgItemVO { + + @Schema(description = "消息类型 0.心跳 1.弹幕消息 2.商品讲解状态变更 3.直播间状态变更 4.直播观看人数变更") + private Integer msgType; + + @Schema(description = "弹幕消息") + private String content; + + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "讲解状态 0未讲解 1讲解中") + private Integer explainStatus; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品售价") + private Long price; + + @Schema(description = "活动价(秒杀、团购活动的商品价格)") + private Long activityPrice; + + @Schema(description = "商品介绍主图") + private String pic; + + @Schema(description = "直播间状态 0.未开始 1.直播中 2.已结束 3.暂停中 -1.违规下架") + private Integer liveStatus; + + @Schema(description = "直播观看人数") + private Integer liveUserCount; + + @Schema(description = "用户类型 0.用户 1.主播") + private Integer userType; + + public Integer getMsgType() { + return msgType; + } + + public void setMsgType(Integer msgType) { + this.msgType = msgType; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getExplainStatus() { + return explainStatus; + } + + public void setExplainStatus(Integer explainStatus) { + this.explainStatus = explainStatus; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getActivityPrice() { + return activityPrice; + } + + public void setActivityPrice(Long activityPrice) { + this.activityPrice = activityPrice; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getLiveStatus() { + return liveStatus; + } + + public void setLiveStatus(Integer liveStatus) { + this.liveStatus = liveStatus; + } + + public Integer getLiveUserCount() { + return liveUserCount; + } + + public void setLiveUserCount(Integer liveUserCount) { + this.liveUserCount = liveUserCount; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + @Override + public String toString() { + return "LiveMsgItemVO{" + + "msgType=" + msgType + + ", content='" + content + '\'' + + ", nickName='" + nickName + '\'' + + ", spuId=" + spuId + + ", explainStatus=" + explainStatus + + ", spuName='" + spuName + '\'' + + ", price=" + price + + ", activityPrice=" + activityPrice + + ", pic='" + pic + '\'' + + ", liveStatus=" + liveStatus + + ", liveUserCount=" + liveUserCount + + ", userType=" + userType + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/resources/logback.xml b/tmerclub-marketing/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/CouponMapper.xml b/tmerclub-marketing/src/main/resources/mapper/CouponMapper.xml new file mode 100644 index 0000000..0b657cc --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/CouponMapper.xml @@ -0,0 +1,468 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `coupon_id`,`create_time`,`update_time`,`shop_id`,`coupon_name`,`sub_title`,`coupon_type`,`suitable_prod_type`,`get_way`,`valid_time_type`,`cash_condition`,`reduce_amount`,`coupon_discount`,`launch_time`,`start_time`,`end_time`,`after_receive_days`,`valid_days`,`total_stock`,`stocks`,`limit_num`,`status`,`puton_status`,`version` + + + + + + + + + insert into coupon (`shop_id`,`coupon_name`,`sub_title`,`coupon_type`,`suitable_prod_type`,`get_way`,`valid_time_type`,`cash_condition`,`reduce_amount`,`coupon_discount`,`launch_time`,`start_time`,`end_time`,`after_receive_days`,`valid_days`,`total_stock`,`stocks`,`limit_num`,`puton_status`) + values (#{coupon.shopId},#{coupon.couponName},#{coupon.subTitle},#{coupon.couponType},#{coupon.suitableProdType},#{coupon.getWay},#{coupon.validTimeType},#{coupon.cashCondition},#{coupon.reduceAmount},#{coupon.couponDiscount},#{coupon.launchTime},#{coupon.startTime},#{coupon.endTime},#{coupon.afterReceiveDays},#{coupon.validDays},#{coupon.totalStock},#{coupon.stocks},#{coupon.limitNum},#{coupon.putonStatus}); + + + update coupon + + + `coupon_name` = #{coupon.couponName}, + + + `sub_title` = #{coupon.subTitle}, + + + `coupon_type` = #{coupon.couponType}, + + + `suitable_prod_type` = #{coupon.suitableProdType}, + + + `get_way` = #{coupon.getWay}, + + + `valid_time_type` = #{coupon.validTimeType}, + + + `cash_condition` = #{coupon.cashCondition}, + + + `reduce_amount` = #{coupon.reduceAmount}, + + + `coupon_discount` = #{coupon.couponDiscount}, + + `launch_time` = #{coupon.launchTime}, + + `start_time` = #{coupon.startTime}, + + + `end_time` = #{coupon.endTime}, + + + `after_receive_days` = #{coupon.afterReceiveDays}, + + + `valid_days` = #{coupon.validDays}, + + + `limit_num` = #{coupon.limitNum}, + + + `status` = #{coupon.status}, + + + `puton_status` = #{coupon.putonStatus}, + + + `version` = #{coupon.version} + 1, + + + where coupon_id = #{coupon.couponId} + + and `version` = #{coupon.version} + + + + update coupon + + + `coupon_name` = #{coupon.couponName}, + + + `sub_title` = #{coupon.subTitle}, + + + `coupon_type` = #{coupon.couponType}, + + + `suitable_prod_type` = #{coupon.suitableProdType}, + + + `get_way` = #{coupon.getWay}, + + + `valid_time_type` = #{coupon.validTimeType}, + + + `cash_condition` = #{coupon.cashCondition}, + + + `reduce_amount` = #{coupon.reduceAmount}, + + + `coupon_discount` = #{coupon.couponDiscount}, + + + `launch_time` = #{coupon.launchTime}, + + + `start_time` = #{coupon.startTime}, + + + `end_time` = #{coupon.endTime}, + + + `after_receive_days` = #{coupon.afterReceiveDays}, + + + `valid_days` = #{coupon.validDays}, + + + `limit_num` = #{coupon.limitNum}, + + + `status` = #{coupon.status}, + + + `puton_status` = #{coupon.putonStatus}, + + + `version` = #{coupon.version} + 1, + + + where coupon_id = #{coupon.couponId} + + + + + + + + + + + + + + + + UPDATE coupon SET puton_status = #{putOnStatus} + + ,`status` = #{status} + + WHERE coupon_id = #{couponId} + + + + + + update coupon set status = 0, puton_status = -1 where `status` != -1 and end_time <= now() and valid_time_type = 1 + + + + update coupon set puton_status = 1 where launch_time <= now() and status = 1 and stocks > 0 and puton_status = 0 + + + + + + update coupon set puton_status = 4 where coupon_id in + + #{couponId} + + + + + + + + UPDATE coupon SET `status` = 0, puton_status = -1 + WHERE coupon_id IN + + #{couponId} + + + + UPDATE coupon + SET stocks = stocks - #{changeStock} + WHERE coupon_id = #{couponId} + AND stocks >= #{changeStock} + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DiscountProdMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DiscountProdMapper.xml new file mode 100644 index 0000000..55f1cbe --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DiscountProdMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + delete + from discount_spu + where discount_id = #{discountId} + + + + insert into discount_spu (discount_id, spu_id) values + + (#{discountSpu.discountId}, #{discountSpu.spuId}) + + + + + + + delete + from discount_spu + where spu_id in + + #{spuId} + + + + + + delete from discount_spu + where discount_id in + + #{discountId} + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DistributionAuditingMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DistributionAuditingMapper.xml new file mode 100644 index 0000000..9564bc4 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DistributionAuditingMapper.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `auditing_id`,`create_time`,`update_time`,`parent_distribution_user_id`,`distribution_user_id`,`auditing_time`,`remarks`,`reason`,`state`,`modifier` + + + + + insert into distribution_auditing (`parent_distribution_user_id`, `distribution_user_id`, `auditing_time`, + `remarks`, `reason`, `state`, `modifier`) + values (#{distributionAuditing.parentDistributionUserId}, #{distributionAuditing.distributionUserId}, + #{distributionAuditing.auditingTime}, #{distributionAuditing.remarks}, #{distributionAuditing.reason}, + #{distributionAuditing.state}, #{distributionAuditing.modifier}); + + + update distribution_auditing + + + `parent_distribution_user_id` = #{distributionAuditing.parentDistributionUserId}, + + + `distribution_user_id` = #{distributionAuditing.distributionUserId}, + + + `auditing_time` = #{distributionAuditing.auditingTime}, + + + `remarks` = #{distributionAuditing.remarks}, + + + `reason` = #{distributionAuditing.reason}, + + + `state` = #{distributionAuditing.state}, + + + `modifier` = #{distributionAuditing.modifier}, + + + where auditing_id = #{distributionAuditing.auditingId} + + + delete + from distribution_auditing + where auditing_id = #{auditingId} + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DistributionSpuBindMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DistributionSpuBindMapper.xml new file mode 100644 index 0000000..0d1be5d --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DistributionSpuBindMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + `id`,`create_time`,`update_time`,`distribution_user_id`,`user_id`,`bind_time`,`spu_id`,`state` + + + + + insert into distribution_spu_bind (`distribution_user_id`,`user_id`,`bind_time`,`spu_id`,`state`) + values + (#{distributionSpuBind.distributionUserId},#{distributionSpuBind.userId},#{distributionSpuBind.bindTime},#{distributionSpuBind.spuId},#{distributionSpuBind.state}); + + + update distribution_spu_bind + + + `distribution_user_id` = #{distributionSpuBind.distributionUserId}, + + + `user_id` = #{distributionSpuBind.userId}, + + + `bind_time` = #{distributionSpuBind.bindTime}, + + + `spu_id` = #{distributionSpuBind.spuId}, + + + `state` = #{distributionSpuBind.state}, + + + where id = #{distributionSpuBind.id} + + + delete from distribution_spu_bind where id = #{id} + + + update distribution_spu_bind + set `state` = #{state} + where distribution_user_id = #{distributionUserId} + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DistributionSpuLogMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DistributionSpuLogMapper.xml new file mode 100644 index 0000000..ee02433 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DistributionSpuLogMapper.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + `distribution_spu_log_id`,`create_time`,`update_time`,`shop_id`,`spu_id`,`user_id`,`mobile` + + + + + insert into distribution_spu_log (`shop_id`,`spu_id`,`user_id`,`mobile`) + values + (#{distributionSpuLog.shopId},#{distributionSpuLog.spuId},#{distributionSpuLog.userId},#{distributionSpuLog.mobile}); + + + update distribution_spu_log + + + `shop_id` = #{distributionSpuLog.shopId}, + + + `spu_id` = #{distributionSpuLog.spuId}, + + + `user_id` = #{distributionSpuLog.userId}, + + + `mobile` = #{distributionSpuLog.mobile}, + + + where distribution_spu_log_id = #{distributionSpuLog.distributionSpuLogId} + + + delete from distribution_spu_log where distribution_spu_log_id = #{distributionSpuLogId} + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DistributionSpuMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DistributionSpuMapper.xml new file mode 100644 index 0000000..e99f759 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DistributionSpuMapper.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + `distribution_spu_id`,`create_time`,`update_time`,`shop_id`,`spu_id`,`state`,`award_mode`,`parent_award_set`,`award_numbers`,`parent_award_numbers`,`modifier` + + + + + + insert into distribution_spu (`distribution_spu_id`,`shop_id`,`spu_id`,`state`,`award_mode`,`parent_award_set`,`award_numbers`,`parent_award_numbers`,`modifier`) + values (#{distributionSpu.distributionSpuId},#{distributionSpu.shopId},#{distributionSpu.spuId},#{distributionSpu.state},#{distributionSpu.awardMode},#{distributionSpu.parentAwardSet},#{distributionSpu.awardNumbers},#{distributionSpu.parentAwardNumbers},#{distributionSpu.modifier}); + + + update distribution_spu + + + `shop_id` = #{distributionSpu.shopId}, + + + `spu_id` = #{distributionSpu.spuId}, + + + `state` = #{distributionSpu.state}, + + + `award_Mode` = #{distributionSpu.awardMode}, + + + `parent_award_set` = #{distributionSpu.parentAwardSet}, + + + `award_numbers` = #{distributionSpu.awardNumbers}, + + + `parent_award_numbers` = #{distributionSpu.parentAwardNumbers}, + + + `modifier` = #{distributionSpu.modifier}, + + + where distribution_spu_id = #{distributionSpu.distributionSpuId} + + + update distribution_spu set `state` = #{newState} where distribution_spu_id = #{distributionSpuId} + + and `state` = #{oldState} + + + + delete from distribution_spu where distribution_spu_id = #{distributionSpuId} + + + delete from distribution_spu + + and distribution_spu_id = #{distributionSpuId} + + and shop_id = #{shopId} + + + + + + + + update distribution_spu set `state` = #{state} + where spu_id in + + #{spuId} + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DistributionUserBanMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DistributionUserBanMapper.xml new file mode 100644 index 0000000..f5d72e8 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DistributionUserBanMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + `ban_id`,`create_time`,`update_time`,`distribution_user_id`,`ban_reason`,`remarks`,`state`,`modifier` + + + + + + insert into distribution_user_ban (`distribution_user_id`,`ban_reason`,`remarks`,`state`,`modifier`) + values (#{distributionUserBan.distributionUserId},#{distributionUserBan.banReason},#{distributionUserBan.remarks},#{distributionUserBan.state},#{distributionUserBan.modifier}); + + + update distribution_user_ban + + + `distribution_user_id` = #{distributionUserBan.distributionUserId}, + + + `ban_reason` = #{distributionUserBan.banReason}, + + + `remarks` = #{distributionUserBan.remarks}, + + + `state` = #{distributionUserBan.state}, + + + `modifier` = #{distributionUserBan.modifier}, + + + where ban_id = #{distributionUserBan.banId} + + + delete from distribution_user_ban where ban_id = #{banId} + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DistributionUserBindMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DistributionUserBindMapper.xml new file mode 100644 index 0000000..71f4183 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DistributionUserBindMapper.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + `bind_id`,`create_time`,`update_time`,`distribution_user_id`,`user_id`,`state`,`invalid_reason`,`bind_time`,`invalid_time` + + + + + insert into distribution_user_bind (`distribution_user_id`,`user_id`,`state`,`invalid_reason`,`bind_time`,`invalid_time`) + values (#{distributionUserBind.distributionUserId},#{distributionUserBind.userId},#{distributionUserBind.state},#{distributionUserBind.invalidReason},#{distributionUserBind.bindTime},#{distributionUserBind.invalidTime}); + + + update distribution_user_bind + + + `distribution_user_id` = #{distributionUserBind.distributionUserId}, + + + `user_id` = #{distributionUserBind.userId}, + + + `state` = #{distributionUserBind.state}, + + + `invalid_reason` = #{distributionUserBind.invalidReason}, + + + `bind_time` = #{distributionUserBind.bindTime}, + + + `invalid_time` = #{distributionUserBind.invalidTime}, + + + where bind_id = #{distributionUserBind.bindId} + + + delete from distribution_user_bind where bind_id = #{bindId} + + + + + + + update distribution_user_bind + set `state` = #{state}, invalid_reason = 2,invalid_time = NOW() + where distribution_user_id = #{distributionUserId} and `state` = 1 + + + UPDATE `distribution_user_bind` + SET `state` = 1,invalid_time = NULL + WHERE distribution_user_id = 2 AND `state` = -1 AND invalid_reason = 2 + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DistributionUserIncomeMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DistributionUserIncomeMapper.xml new file mode 100644 index 0000000..04ebce4 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DistributionUserIncomeMapper.xml @@ -0,0 +1,374 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `income_id`,`create_time`,`update_time`,`wallet_id`,`income_type`,`state`,`income_amount`,`order_id`,`order_item_id`,`merchant_order_id`,`distribution_user_id`,`modifier`,`shop_id`,`spu_id`,`reson` + + + + + + + + + insert into distribution_user_income (`wallet_id`,`income_type`,`state`,`income_amount`,`order_id`,`order_item_id`,`merchant_order_id`,`distribution_user_id`,`modifier`,`shop_id`,`spu_id`, `reson`, `user_id`, `pay_sys_type`) + values (#{distributionUserIncome.walletId},#{distributionUserIncome.incomeType},#{distributionUserIncome.state},#{distributionUserIncome.incomeAmount} + ,#{distributionUserIncome.orderId},#{distributionUserIncome.orderItemId},#{distributionUserIncome.merchantOrderId},#{distributionUserIncome.distributionUserId} + ,#{distributionUserIncome.modifier},#{distributionUserIncome.shopId},#{distributionUserIncome.spuId},#{distributionUserIncome.reson}, #{distributionUserIncome.userId}, #{distributionUserIncome.paySysType}) + + + + update distribution_user_income + + + `wallet_id` = #{distributionUserIncome.walletId}, + + + `income_type` = #{distributionUserIncome.incomeType}, + + + `state` = #{distributionUserIncome.state}, + + + `income_amount` = #{distributionUserIncome.incomeAmount}, + + + `order_id` = #{distributionUserIncome.orderId}, + + + `order_item_id` = #{distributionUserIncome.orderItemId}, + + + `merchant_order_id` = #{distributionUserIncome.merchantOrderId}, + + + `distribution_user_id` = #{distributionUserIncome.distributionUserId}, + + + `modifier` = #{distributionUserIncome.modifier}, + + + `shop_id` = #{distributionUserIncome.shopId}, + + + `spu_id` = #{distributionUserIncome.spuId}, + + + `pay_sys_type` = #{distributionUserIncome.paySysType} + + + where income_id = #{distributionUserIncome.incomeId} + + + delete from distribution_user_income where income_id = #{incomeId} + + + + + + + update distribution_user_income + set state = #{state} + where + distribution_user_id = #{distributionUserId} + + + update distribution_user_income + set state = #{state}, reson = #{reson} + where income_id IN + + #{incomeId} + + + + + + + + + + + + + + + + + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DistributionUserMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DistributionUserMapper.xml new file mode 100644 index 0000000..58eea34 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DistributionUserMapper.xml @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `distribution_user_id`,`create_time`,`update_time`,`user_id`,`parent_id`,`parent_ids`,`grade`,`bind_time`,`state`,`nick_name`,`pic`,`user_mobile`,`real_name`,`identity_card_number`,`identity_card_pic_front`,`identity_card_pic_back`,`identity_card_pic_hold`,`state_record` + + + + + insert into distribution_user (`distribution_user_id`, `user_id`, `parent_id`, + `parent_ids`, `grade`, `bind_time`, `state`, `nick_name`, `pic`, `user_mobile`, + `real_name`, `identity_card_number`, `identity_card_pic_front`, + `identity_card_pic_back`, `identity_card_pic_hold`, `state_record`) + values (#{distributionUser.distributionUserId}, + #{distributionUser.userId}, #{distributionUser.parentId}, #{distributionUser.parentIds}, + #{distributionUser.grade}, #{distributionUser.bindTime}, #{distributionUser.state}, + #{distributionUser.nickName}, #{distributionUser.pic}, #{distributionUser.userMobile}, + #{distributionUser.realName}, #{distributionUser.identityCardNumber}, + #{distributionUser.identityCardPicFront}, #{distributionUser.identityCardPicBack}, + #{distributionUser.identityCardPicHold}, #{distributionUser.stateRecord}); + + + update distribution_user + + + `user_id` = #{distributionUser.userId}, + + + `parent_id` = #{distributionUser.parentId}, + + + `parent_ids` = #{distributionUser.parentIds}, + + + `grade` = #{distributionUser.grade}, + + + `bind_time` = #{distributionUser.bindTime}, + + + `state` = #{distributionUser.state}, + + + `nick_name` = #{distributionUser.nickName}, + + + `pic` = #{distributionUser.pic}, + + + `user_mobile` = #{distributionUser.userMobile}, + + + `real_name` = #{distributionUser.realName}, + + + `identity_card_number` = #{distributionUser.identityCardNumber}, + + + `identity_card_pic_front` = #{distributionUser.identityCardPicFront}, + + + `identity_card_pic_back` = #{distributionUser.identityCardPicBack}, + + + `identity_card_pic_hold` = #{distributionUser.identityCardPicHold}, + + + `state_record` = #{distributionUser.stateRecord}, + + + where distribution_user_id = #{distributionUser.distributionUserId} + + + delete + from distribution_user + where distribution_user_id = #{distributionUserId} + + + + + + update + distribution_user + set + parent_id = "", + parent_ids = replace(parent_ids,concat(',',#{distributionUserId}),"") + where parent_id = #{distributionUserId} + and parent_ids like concat(',',#{distributionUserId}) + + + update + distribution_user + set + `state` = #{distributionUser.state}, bind_time = #{distributionUser.bindTime}, state_record = #{distributionUser.stateRecord} + where distribution_user_id = #{distributionUser.distributionUserId} + + + + + + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DistributionUserWalletBillMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DistributionUserWalletBillMapper.xml new file mode 100644 index 0000000..04247f0 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DistributionUserWalletBillMapper.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `id`,`create_time`,`update_time`,`wallet_id`,`unsettled_amount`,`settled_amount`,`invalid_amount`,`accumulate_amount`,`remarks_en`,`remarks`,`unsettled_amount_after`,`settled_amount_after`,`invalid_amount_after`,`accumulate_amount_after`,`type`,`modifier` + + + + + + insert into distribution_user_wallet_bill + (`wallet_id`,`unsettled_amount`,`settled_amount`,`invalid_amount`,`accumulate_amount`,`remarks_en`,`remarks`,`unsettled_amount_after`,`settled_amount_after`,`invalid_amount_after`,`accumulate_amount_after`,`type`,`modifier`) + values + (#{distributionUserWalletBill.walletId},#{distributionUserWalletBill.unsettledAmount},#{distributionUserWalletBill.settledAmount},#{distributionUserWalletBill.invalidAmount},#{distributionUserWalletBill.accumulateAmount},#{distributionUserWalletBill.remarksEn},#{distributionUserWalletBill.remarks},#{distributionUserWalletBill.unsettledAmountAfter},#{distributionUserWalletBill.settledAmountAfter},#{distributionUserWalletBill.invalidAmountAfter},#{distributionUserWalletBill.accumulateAmountAfter},#{distributionUserWalletBill.type},#{distributionUserWalletBill.modifier}); + + + insert into distribution_user_wallet_bill + (`wallet_id`,`unsettled_amount`,`settled_amount`,`invalid_amount`,`accumulate_amount`,`remarks_en`,`remarks`,`unsettled_amount_after`,`settled_amount_after`,`invalid_amount_after`,`accumulate_amount_after`,`type`,`modifier`) + values + + (#{distributionUserWalletBill.walletId},#{distributionUserWalletBill.unsettledAmount}, + #{distributionUserWalletBill.settledAmount},#{distributionUserWalletBill.invalidAmount}, + #{distributionUserWalletBill.accumulateAmount},#{distributionUserWalletBill.remarksEn}, + #{distributionUserWalletBill.remarks},#{distributionUserWalletBill.unsettledAmountAfter}, + #{distributionUserWalletBill.settledAmountAfter},#{distributionUserWalletBill.invalidAmountAfter}, + #{distributionUserWalletBill.accumulateAmountAfter}, #{distributionUserWalletBill.type},#{distributionUserWalletBill.modifier}) + + + + update distribution_user_wallet_bill + + + `wallet_id` = #{distributionUserWalletBill.walletId}, + + + `unsettled_amount` = #{distributionUserWalletBill.unsettledAmount}, + + + `settled_amount` = #{distributionUserWalletBill.settledAmount}, + + + `invalid_amount` = #{distributionUserWalletBill.invalidAmount}, + + + `accumulate_amount` = #{distributionUserWalletBill.accumulateAmount}, + + + `remarks_en` = #{distributionUserWalletBill.remarksEn}, + + + `remarks` = #{distributionUserWalletBill.remarks}, + + + `unsettled_amount_after` = #{distributionUserWalletBill.unsettledAmountAfter}, + + + `settled_amount_after` = #{distributionUserWalletBill.settledAmountAfter}, + + + `invalid_amount_after` = #{distributionUserWalletBill.invalidAmountAfter}, + + + `accumulate_amount_after` = #{distributionUserWalletBill.accumulateAmountAfter}, + + + `type` = #{distributionUserWalletBill.type}, + + + `modifier` = #{distributionUserWalletBill.modifier}, + + + where id = #{distributionUserWalletBill.id} + + + + TRUNCATE TABLE distribution_user_wallet_bill + + + + delete from distribution_user_wallet_bill where id = #{id} + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DistributionUserWalletMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DistributionUserWalletMapper.xml new file mode 100644 index 0000000..09f1889 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DistributionUserWalletMapper.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `wallet_id`,`create_time`,`update_time`,`distribution_user_id`,`unsettled_amount`,`settled_amount`,`invalid_amount`,`accumulate_amount`,`version`,`state` + + + + + insert into distribution_user_wallet + (`distribution_user_id`,`unsettled_amount`,`settled_amount`,`invalid_amount`,`accumulate_amount`,`version`,`state`) + values + (#{distributionUserWallet.distributionUserId},#{distributionUserWallet.unsettledAmount},#{distributionUserWallet.settledAmount},#{distributionUserWallet.invalidAmount},#{distributionUserWallet.accumulateAmount},#{distributionUserWallet.version},#{distributionUserWallet.state}); + + + update distribution_user_wallet + + `version` = `version` + 1, + + `distribution_user_id` = #{distributionUserWallet.distributionUserId}, + + + `unsettled_amount` = #{distributionUserWallet.unsettledAmount}, + + + `settled_amount` = #{distributionUserWallet.settledAmount}, + + + `invalid_amount` = #{distributionUserWallet.invalidAmount}, + + + `accumulate_amount` = #{distributionUserWallet.accumulateAmount}, + + + `state` = #{distributionUserWallet.state}, + + + where wallet_id = #{distributionUserWallet.walletId} + + + delete from distribution_user_wallet where wallet_id = #{walletId} + + + + + update distribution_user_wallet + set unsettled_amount = 0,settled_amount = 0,invalid_amount = 0,accumulate_amount = 0 + where + distribution_user_id = #{distributionUserId} + + + + + + update distribution_user_wallet + + `version` = `version` + 1, + + `unsettled_amount` = #{updateWallet.unsettledAmount}, + + + `settled_amount` = #{updateWallet.settledAmount}, + + + `invalid_amount` = #{updateWallet.invalidAmount}, + + + `accumulate_amount` = #{updateWallet.accumulateAmount}, + + + where wallet_id = #{updateWallet.walletId} + + + + UPDATE + distribution_user_wallet + SET + unsettled_amount = 0, + settled_amount = 0, + invalid_amount = 0, + accumulate_amount = 0 + + diff --git a/tmerclub-marketing/src/main/resources/mapper/EnterprisePayMapper.xml b/tmerclub-marketing/src/main/resources/mapper/EnterprisePayMapper.xml new file mode 100644 index 0000000..428ec68 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/EnterprisePayMapper.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + `ent_pay_id`,`status`,`user_id`,`open_id`,`ent_pay_order_no`,`amount`,`type`,`biz_id`,`version`,`create_time`,`update_time`,`out_batch_no` + + + + + insert into enterprise_pay (`status`,`user_id`,`open_id`,`ent_pay_order_no`,`amount`,`type`,`biz_id`,`version`,`out_batch_no`) + values (#{enterprisePay.status},#{enterprisePay.userId},#{enterprisePay.openId},#{enterprisePay.entPayOrderNo},#{enterprisePay.amount},#{enterprisePay.type},#{enterprisePay.bizId},#{enterprisePay.version},#{enterprisePay.outBatchNo}); + + + update enterprise_pay + + + `status` = #{enterprisePay.status}, + + + `user_id` = #{enterprisePay.userId}, + + + `open_id` = #{enterprisePay.openId}, + + + `ent_pay_order_no` = #{enterprisePay.entPayOrderNo}, + + + `amount` = #{enterprisePay.amount}, + + + `type` = #{enterprisePay.type}, + + + `biz_id` = #{enterprisePay.bizId}, + + + `version` = #{enterprisePay.version}, + + + `out_batch_no` = #{enterprisePay.outBatchNo}, + + + where ent_pay_id = #{enterprisePay.entPayId} + + + delete from enterprise_pay where ent_pay_id = #{entPayId} + + + + + + + + UPDATE enterprise_pay ep SET ep.status = 2,ep.update_time = now(),ep.version = ep.version + 1 WHERE ep.ent_pay_order_no =#{entPayOrderNo} AND ep.version=#{version} + + + + UPDATE enterprise_pay ep SET ep.status = -1,ep.update_time = now(),ep.version = ep.version + 1 WHERE ep.ent_pay_order_no =#{entPayOrderNo} AND ep.version=#{version} + + + + + UPDATE enterprise_pay SET `out_batch_no` = #{enterprisePay.outBatchNo} WHERE ent_pay_id = #{enterprisePay.entPayId} + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/LiveRoomMapper.xml b/tmerclub-marketing/src/main/resources/mapper/LiveRoomMapper.xml new file mode 100644 index 0000000..3c04202 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/LiveRoomMapper.xml @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + `room_id`,`shop_id`,`name`,`user_id`,`live_status`,`cover_img`,`share_img`,`feeds_img`,`room_top`,`start_time`,`end_time`,`create_time`,`update_time`,`remark` + + + + + insert into live_room (`shop_id`,`name`,`user_id`,`live_status`,`cover_img`,`share_img`,`feeds_img`,`room_top`,`start_time`,`end_time`,`remark`) + values (#{liveRoom.shopId},#{liveRoom.name},#{liveRoom.userId},#{liveRoom.liveStatus},#{liveRoom.coverImg},#{liveRoom.shareImg},#{liveRoom.feedsImg},#{liveRoom.roomTop},#{liveRoom.startTime},#{liveRoom.endTime},#{liveRoom.remark}); + + + update live_room + + + `shop_id` = #{liveRoom.shopId}, + + + `name` = #{liveRoom.name}, + + + `user_id` = #{liveRoom.userId}, + + + `live_status` = #{liveRoom.liveStatus}, + + + `cover_img` = #{liveRoom.coverImg}, + + + `share_img` = #{liveRoom.shareImg}, + + + `feeds_img` = #{liveRoom.feedsImg}, + + + `room_top` = #{liveRoom.roomTop}, + + + `start_time` = #{liveRoom.startTime}, + + + `end_time` = #{liveRoom.endTime}, + + + `remark` = #{liveRoom.remark}, + + + where room_id = #{liveRoom.roomId} + + + delete from live_room where room_id = #{roomId} + + + + + + + update live_room set live_status = #{liveStatus} + where room_id in + + #{roomId} + + + + + + diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/config/XxlJobConfig.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/config/XxlJobConfig.java new file mode 100644 index 0000000..6c34318 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/config/XxlJobConfig.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.config; + +import com.tmerclub.cloud.common.constant.Constant; +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * + * @author FrozenWatermelon + * @date 2021/1/18 + */ +@Configuration +public class XxlJobConfig { + private static final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${mall4cloud.job.admin.addresses}") + private String adminAddresses; + + @Value("${mall4cloud.job.accessToken}") + private String accessToken; + + @Value("${mall4cloud.job.logPath}") + private String logPath; + + @Value("${spring.application.name}") + private String appname; + + @Value("${server.port}") + private int port; + + @Autowired + private InetUtils inetUtils; + + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appname + Constant.DASHED_ENV); + // 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP + xxlJobSpringExecutor.setIp(inetUtils.findFirstNonLoopbackAddress().getHostAddress()); + xxlJobSpringExecutor.setPort(port + 1000); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(3); + return xxlJobSpringExecutor; + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java new file mode 100644 index 0000000..9e3c45c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.constant; + +import com.tmerclub.cloud.common.leaf.constant.GlobalDistributedIdKey; + +/** + * 分布式id key + * + * @author FrozenWatermelon + * @date 2021/4/9 + */ +public interface DistributedIdKey { + /** + * 入库单号 + */ + String MALL4CLOUD_PRODUCT_STOCK_IN = GlobalDistributedIdKey.MALL4CLOUD_PRODUCT_STOCK_IN.value(); + /** + * 出入库日志id + */ + String MALL4CLOUD_STOCK_BILL_LOG = GlobalDistributedIdKey.MALL4CLOUD_STOCK_BILL_LOG.value(); + + /** + * 订单号 + */ + String MALL4CLOUD_ORDER = GlobalDistributedIdKey.MALL4CLOUD_ORDER.value(); + + /** + * 订单项号 + */ + String MALL4CLOUD_ORDER_ITEM = "mall4cloud-order-item"; + + /** + * 订单地址id + */ + String MALL4CLOUD_ORDER_ADDR = "mall4cloud-order-addr"; + + /** + * 采购订单号 + */ + String MALL4CLOUD_PURCHASE_ORDER = "mall4cloud-purchase-order"; + + /** + * 采购订单项号 + */ + String MALL4CLOUD_PURCHASE_ORDER_ITEM = "mall4cloud-purchase-order-item"; + + /** + * 采购订单地址id + */ + String MALL4CLOUD_PURCHASE_ORDER_ADDR = "mall4cloud-purchase-order-addr"; + + /** + * 订单结算id + */ + String MALL4CLOUD_ORDER_SETTLEMENT = "mall4cloud-order-settlement"; + + /** + * 订单发票号 + */ + String MALL4CLOUD_ORDER_INVOICE = "mall4cloud-order-invoice"; + + /** + * 自提订单的地址id + */ + String MALL4CLOUD_ORDER_SELF_STATION = "mall4cloud-order-self-station"; + + /** + * 订单自提码 + */ + String MALL4CLOUD_ORDER_STATION_CODE = "mall4cloud-order-station-code"; + + /** + * 虚拟订单核销记录id + */ + String MALL4CLOUD_ORDER_VIRTUAL_INFO = "mall4cloud-order-virtual-info"; + + /** + * 虚拟订单核销码 + */ + String MALL4CLOUD_ORDER_VIRTUAL_CODE = "mall4cloud-order-virtual-code"; + + /** + * 订单预售id + */ + String MALL4CLOUD_ORDER_PRE_SALE = "mall4cloud-order-pre-sale"; + + /** + * 退款单号 + */ + String MALL4CLOUD_REFUND = GlobalDistributedIdKey.MALL4CLOUD_REFUND.value(); + + /** + * 核销日志 + */ + String MALL4CLOUD_ORDER_VIRTUAL_INFO_LOG = "mall4cloud-order-virtual-info-log"; + + /** + * 订单物流id + */ + String MALL4CLOUD_DELIVERY_ORDER = "mall4cloud-delivery-order"; + + /** + * 订单物流项id + */ + String MALL4CLOUD_DELIVERY_ORDER_ITEM = "mall4cloud-delivery-order-item"; + + /** + * 门店端用户id uid + */ + String MALL4CLOUD_STATION_USER = "mall4cloud-station-user"; + + /** + * 钱包日志id + */ + String MALL4CLOUD_SHOP_WALLET_LOG = GlobalDistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG.value(); + + /** + * 门店库存点id + */ + String MALL4CLOUD_STOCK_POINT = GlobalDistributedIdKey.MALL4CLOUD_STOCK_POINT.value(); + + /** + * 调拨订单id + */ + String MALL4CLOUD_ALLOT_ORDER = "mall4cloud-allot-order"; + + /** + * 调拨订单商品id + */ + String MALL4CLOUD_ALLOT_ORDER_ITEM = "mall4cloud-allot-order-item"; +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryAliInfoBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryAliInfoBO.java new file mode 100644 index 0000000..938a9f1 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryAliInfoBO.java @@ -0,0 +1,126 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 阿里订单快递信息VO + * + * @author lhd + * @date 2020-05-18 15:10:00 + */ +public class DeliveryAliInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "物流公司名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String expName; + + @Schema(description = "物流公司官网", requiredMode = Schema.RequiredMode.REQUIRED) + private String expSite; + + @Schema(description = "物流订单号", requiredMode = Schema.RequiredMode.REQUIRED) + private String number; + + @Schema(description = "物流状态", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer deliverystatus; + + @Schema(description = "物流状态 0:没有记录 1:已揽收 2:运输途中 201:达到目的城市 3:已签收 4:问题件", requiredMode = Schema.RequiredMode.REQUIRED) + private List list; + + public String getExpName() { + return expName; + } + + public void setExpName(String expName) { + this.expName = expName; + } + + public String getExpSite() { + return expSite; + } + + public void setExpSite(String expSite) { + this.expSite = expSite; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } + + public Integer getDeliverystatus() { + return deliverystatus; + } + + public void setDeliverystatus(Integer deliverystatus) { + this.deliverystatus = switchState(deliverystatus); + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + /** + * 阿里快递的6种状态码转成快递鸟的6种 + * + * @param deliverystatus 阿里快递状态码 + * 0 快递收件(揽件) + * 1 在途中 + * 2 正在派件 + * 3 已签收 + * 4 派送失败(无法联系到收件人或客户要求择日派送,地址不详或手机号不清) + * 5 疑难件(收件人拒绝签收,地址有误或不能送达派送区域,收费等原因无法正常派送) + * 6 退件签收 + * @return 快递鸟状态码: 0:没有记录 1:已揽收 2:运输途中 201:达到目的城市 3:已签收 4:问题件 + */ + private Integer switchState(Integer deliverystatus) { + int status = deliverystatus; + switch (deliverystatus) { + case 0: + status = 1; + break; + case 1: + status = 2; + break; + case 5: + case 6: + status = 4; + break; + default: + break; + } + return status; + } + + @Override + public String toString() { + return "DeliveryAliInfoBO{" + + "expName='" + expName + '\'' + + ", expSite='" + expSite + '\'' + + ", number='" + number + '\'' + + ", deliverystatus=" + deliverystatus + + ", list=" + list + + '}'; + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryAliItemInfoBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryAliItemInfoBO.java new file mode 100644 index 0000000..fafe42b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryAliItemInfoBO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 阿里快递信息项VO + * + * @author lhd + * @date 2020-05-18 15:10:00 + */ +public class DeliveryAliItemInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "接受站点", requiredMode = Schema.RequiredMode.REQUIRED) + private String status; + @Schema(description = "接受时间", requiredMode = Schema.RequiredMode.REQUIRED) + private String time; + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + @Override + public String toString() { + return "DeliveryInfoVO{" + + "status='" + status + '\'' + + ", time='" + time + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/StationOrderBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/StationOrderBO.java new file mode 100644 index 0000000..e04bfbc --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/StationOrderBO.java @@ -0,0 +1,59 @@ +package com.tmerclub.cloud.delivery.bo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author gaozijie + * @date 2023-05-11 + */ +public class StationOrderBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户id + */ + private Long userId; + /** + * 订单金额 + */ + private Long amount; + /** + * 支付时间 + */ + private Date payTime; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + @Override + public String toString() { + return "StationOrderBO{" + + "userId=" + userId + + ", amount=" + amount + + ", payTime=" + payTime + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/constant/DeliveryCompanyType.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/constant/DeliveryCompanyType.java new file mode 100644 index 0000000..9b24b37 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/constant/DeliveryCompanyType.java @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.constant; + +import com.tmerclub.cloud.delivery.vo.DeliveryCompanyVO; +import com.tmerclub.cloud.delivery.vo.OutletConfigInfoVO; + +import java.util.ArrayList; +import java.util.List; + +/** + * 快递100电子面单--快递公司类型 + * 一联 76*130 + * 电子面单账号申请:https://api.kuaidi100.com/document/zhanghaoshenqingzhinan.html + * @author TRACK + */ +public enum DeliveryCompanyType { + /** + * 顺丰速运 partnerId月结账号 100*150 + */ + SHUNFENG(1, "顺丰速运", "shunfeng", "", "SFEXPRESS", "SF", "shunfeng", + "62cfc4f9cce62b00130f0977", "61bc872bc66fb00013a1ade4"), + /** + * 京东快递 partnerId商家编码 100*180 + */ + JD(2, "京东快递", "jd", "", "JD", "JD", "jd", + "60acf369f4602900133763fa", "61b700b54cb635001301fef3"), + /** + * 圆通速递 partnerId商家代码 partnerKey商家密钥 100*180 + */ + YUANTONG(3, "圆通速递", "yuantong", "", "YTO", "YTO", "yuantong", + "60d1cbc4c7cbaa001441d1d9", "628c61d1e07e350013c1ae99"), + /** + * 韵达快递 partnerId韵达白马账号 partnerKey联调密码 100*203 + */ + YUNDA(4, "韵达快递", "yunda", "", "YUNDA", "YD", "yunda", + "60d48922c7cbaa001441d3ab", "6114921e8b71ba00131341cf"), + /** + * 中通快递 partnerId合作方代码 partnerKey合作方密钥 net网点编码 100*180 + */ + ZHONGTONG(5, "中通快递", "zhongtong", "ztoOpen", "ZTO", "ZTO", "zhongtong", + "6256a96111aeb20013c7f182", "62cd4ab8ac76350013866e6b"), + /** + * 申通快递 partnerId客户名称 partnerKey客户密码 net网点 + */ + SHENTONG(6, "申通快递", "shentong", "44", "STO", "STO", "shentong", + "60d3267f71ec3d00137c8312", null), + /** + * 百世快递 partnerId操作编码 partnerKey密钥 + */ + HUITONGKUAIDI(7, "百世快递", "huitongkuaidi", "", "HTKY", "HTKY", "huitongkuaidi", + "60cbff8ec7cbaa001441d087", null), + /** + * EMS partnerId协议客户号 partnerKey电商客户标识 100*180 + */ + EMS(8, "EMS", "ems", "", "EMS", "EMS", "ems", + "60d57ed3c7cbaa001441d45a", "61aec09ac66fb00013a10920"), + ; + + private final Integer type; + + private final String name; + + /** + * 快递公司编码 + */ + private final String kuaidicom; + + /** + * 电子面单承载编号 + */ + private final String code; + /** + * 物流公司编号(阿里) + */ + private final String aliNo; + /** + * 物流公司编号(快递鸟) + */ + private final String bridNo; + /** + * 物流公司编号(快递100) + */ + private final String hundredNo; + /** + * 一联编码 + */ + private final String oneLineCode; + /** + * 二联编码 + */ + private final String twoLineCode; + + DeliveryCompanyType(Integer type, String name, String kuaidicom, String code, String aliNo, String bridNo, String hundredNo, String oneLineCode, String twoLineCode) { + this.type = type; + this.name = name; + this.kuaidicom = kuaidicom; + this.code = code; + this.aliNo = aliNo; + this.bridNo = bridNo; + this.hundredNo = hundredNo; + this.oneLineCode = oneLineCode; + this.twoLineCode = twoLineCode; + } + + public Integer getType() { + return type; + } + + public String getName() { + return name; + } + + public String getKuaidicom() { + return kuaidicom; + } + + public String getCode() { + return code; + } + + public String getOneLineCode() { + return oneLineCode; + } + + public String getTwoLineCode() { + return twoLineCode; + } + + public static DeliveryCompanyType instance(Integer type) { + DeliveryCompanyType[] enums = values(); + for (DeliveryCompanyType statusEnum : enums) { + if (statusEnum.getType().equals(type)) { + return statusEnum; + } + } + return null; + } + + public static String getTempId(Integer type, Integer paperSize) { + DeliveryCompanyType[] enums = values(); + for (DeliveryCompanyType statusEnum : enums) { + if (statusEnum.getType().equals(type)) { + return paperSize == 1 ? statusEnum.getOneLineCode() : statusEnum.getTwoLineCode(); + } + } + return null; + } + + public static List getInfoList() { + DeliveryCompanyType[] enums = values(); + List list = new ArrayList<>(8); + for (DeliveryCompanyType deliveryCompanyType : enums) { + OutletConfigInfoVO outletConfigInfoVO = new OutletConfigInfoVO(); + outletConfigInfoVO.setDeliveryCompanyName(deliveryCompanyType.getName()); + outletConfigInfoVO.setDeliveryCompanyType(deliveryCompanyType.getType()); + outletConfigInfoVO.setIsConfig(0); + list.add(outletConfigInfoVO); + } + return list; + } + + public static DeliveryCompanyVO getByDeliveryCompanyType(Long deliveryCompanyType) { + DeliveryCompanyVO deliveryCompanyVO = new DeliveryCompanyVO(); + DeliveryCompanyType[] enums = values(); + for (DeliveryCompanyType statusEnum : enums) { + if (Long.valueOf(statusEnum.getType()).equals(deliveryCompanyType)) { + deliveryCompanyVO.setAliNo(statusEnum.aliNo); + deliveryCompanyVO.setBirdNo(statusEnum.bridNo); + deliveryCompanyVO.setHundredNo(statusEnum.hundredNo); + deliveryCompanyVO.setName(statusEnum.name); + } + } + return deliveryCompanyVO; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/OrderDeliveryController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/OrderDeliveryController.java new file mode 100644 index 0000000..f34cdcc --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/OrderDeliveryController.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.admin; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.delivery.service.DeliveryOrderService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author lhd on 2020/05/15. + */ +@Controller +@RestController("adminOrderDeliveryController") +@RequestMapping("/mp/order_delivery") +@Tag(name = "物流包裹") +public class OrderDeliveryController { + + @Autowired + private DeliveryOrderService deliveryOrderService; + + @GetMapping("/info") + @Operation(summary = "查询订单物流包裹信息", description = "查询订单物流包裹信息") + public ServerResponseEntity> page(@RequestParam("orderId") Long orderId) { + List deliveryOrders = deliveryOrderService.getByDeliveryByOrderId(orderId); + return ServerResponseEntity.success(deliveryOrders); + } + + /** + * 修改订单物流包裹信息 + */ + @PutMapping("/update") + public ServerResponseEntity updateOrderDeliveries(@RequestBody List list) { + deliveryOrderService.updateOrderDeliveries(list); + return ServerResponseEntity.success(); + } + + @GetMapping("/{deliveryOrderId}") + @Operation(summary = "物流包裹查询接口", description = "根据orderDeliveryId查询订单包裹信息") + @Parameter(name = "deliveryOrderId", description = "订单物流包裹id") + public ServerResponseEntity deliveryOrder(@PathVariable("deliveryOrderId") Long deliveryOrderId) { + DeliveryOrderFeignVO deliveryOrder = deliveryOrderService.deliveryOrderItemInfo(deliveryOrderId); + return ServerResponseEntity.success(deliveryOrder); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/TransportController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/TransportController.java new file mode 100644 index 0000000..12f0800 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/TransportController.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.admin; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.TransportVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.delivery.dto.TransportDTO; +import com.tmerclub.cloud.delivery.service.TransportService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 运费模板 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@RestController("adminTransportController") +@RequestMapping("/mp/transport") +@Tag(name = "运费模板") +public class TransportController { + + @Autowired + private TransportService transportService; + + + @GetMapping("/page") + @Operation(summary = "获取运费模板列表", description = "分页获取运费模板列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, TransportDTO transportDTO) { + Long tenantId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + transportDTO.setShopId(tenantId); + transportDTO.setSysType(sysType); + + PageVO transports = transportService.page(pageDTO, transportDTO); + return ServerResponseEntity.success(transports); + } + + @GetMapping + @Operation(summary = "获取运费模板", description = "根据transportId获取运费模板") + public ServerResponseEntity getByTransportId(@RequestParam Long transportId) { + TransportVO transportVo = transportService.getTransportAndAllItemsById(transportId); + return ServerResponseEntity.success(transportVo); + } + + @PostMapping + @Operation(summary = "保存运费模板", description = "保存运费模板") + public ServerResponseEntity save(@Valid @RequestBody TransportDTO transportDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + transportDTO.setShopId(shopId); + transportDTO.setSysType(sysType); + if (Objects.isNull(transportDTO.getTransFees()) && transportDTO.getIsFreeFee() == 0) { + throw new LuckException("请选择可配送区域"); + } + transportService.insertTransportAndTransFee(transportDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新运费模板", description = "更新运费模板") + public ServerResponseEntity update(@Valid @RequestBody TransportDTO transportDTO) { + if (Objects.isNull(transportDTO.getTransFees()) && transportDTO.getIsFreeFee() == 0) { + throw new LuckException("请选择可配送区域"); + } + UidInfoBO uidInfoBO = AuthUserContext.get(); + transportDTO.setShopId(uidInfoBO.getTenantId()); + transportDTO.setSysType(uidInfoBO.getSysType()); + transportService.updateTransportAndTransFee(transportDTO); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "根据id批量删除运费模板", description = "根据运费模板id批量删除运费模板") + public ServerResponseEntity delete(@RequestParam Long[] transportIds) { + // 删除运费模板的缓存 + for (Long transportId : transportIds) { + transportService.deleteTransportAndTransFeeAndTransCityById(transportId); + transportService.removeTransportAndAllItemsCache(transportId); + } + return ServerResponseEntity.success(); + } + + /** + * 获取运费模板列表 + */ + @GetMapping("/list") + public ServerResponseEntity> list(@RequestParam(value = "shopId", required = false) Long shopId) { + Long tenantId = AuthUserContext.get().getTenantId(); + if (Objects.equals(tenantId, Constant.PLATFORM_SHOP_ID) && Objects.nonNull(shopId)) { + tenantId = shopId; + } + + List transports = transportService.listTransport(tenantId); + return ServerResponseEntity.success(transports); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/AreaController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/AreaController.java new file mode 100644 index 0000000..797ed51 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/AreaController.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.app; + +import com.tmerclub.cloud.common.order.vo.AreaVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.delivery.service.AreaService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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.util.List; + +/** + * 省市区地区信息 + * + * @author YXF + * @date 2020-11-25 14:48:52 + */ +@RestController("appAreaController") +@RequestMapping("/area") +@Tag(name = "app-地区信息") +public class AreaController { + + @Autowired + private AreaService areaService; + + @GetMapping("/list") + @Operation(summary = "获取省市区地区信息列表", description = "获取省市区地区信息列表") + public ServerResponseEntity> list() { + List list = areaService.listAreaOfEnable(); + return ServerResponseEntity.success(list); + } + + @GetMapping("/list_by_pid") + @Operation(summary = "通过父级id获取区域列表", description = "通过父级id获取区域列表") + public ServerResponseEntity> listByPid(Long pid) { + List list = areaService.listByPid(pid); + return ServerResponseEntity.success(list); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/MyDeliveryController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/MyDeliveryController.java new file mode 100644 index 0000000..edc5054 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/MyDeliveryController.java @@ -0,0 +1,62 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.app; + +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.delivery.service.DeliveryOrderService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author + */ +@RestController("appMyDeliveryController") +@RequestMapping("/my_delivery") +@Tag(name = "app-我的物流接口") +public class MyDeliveryController { + + @Autowired + private DeliveryOrderService deliveryOrderService; + + @DubboReference + private OrderFeignClient orderFeignClient; + + /** + * 物流查询接口 + */ + @GetMapping("/order_info/{orderId}") + @Operation(summary = "物流查询接口", description = "根据orderNumber查询订单所有包裹信息") + public ServerResponseEntity> info(@PathVariable("orderId") String orderId) { + List deliveryOrders = deliveryOrderService.getByDeliveryByOrderId(Long.parseLong(orderId)); + return ServerResponseEntity.success(deliveryOrders); + } + + @GetMapping("/delivery_order/{deliveryOrderId}") + @Operation(summary = "物流包裹查询接口", description = "根据orderDeliveryId查询订单包裹信息") + @Parameter(name = "deliveryOrderId", description = "订单物流包裹id") + public ServerResponseEntity info(@PathVariable("deliveryOrderId") Long deliveryOrderId) { + DeliveryOrderFeignVO deliveryOrder = deliveryOrderService.deliveryOrderItemInfo(deliveryOrderId); + return ServerResponseEntity.success(deliveryOrder); + } + + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TransfeeController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TransfeeController.java new file mode 100644 index 0000000..17893a4 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TransfeeController.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.app; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.TransfeeVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.dto.TransfeeDTO; +import com.tmerclub.cloud.delivery.model.Transfee; +import com.tmerclub.cloud.delivery.service.TransfeeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 运费项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@RestController("appTransfeeController") +@RequestMapping("/transfee") +@Tag(name = "运费项") +public class TransfeeController { + + @Autowired + private TransfeeService transfeeService; + + + @GetMapping("/page") + @Operation(summary = "获取运费项列表", description = "分页获取运费项列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO transfeePage = transfeeService.page(pageDTO); + return ServerResponseEntity.success(transfeePage); + } + + @GetMapping + @Operation(summary = "获取运费项", description = "根据transfeeId获取运费项") + public ServerResponseEntity getByTransfeeId(@RequestParam Long transfeeId) { + return ServerResponseEntity.success(transfeeService.getByTransfeeId(transfeeId)); + } + + @PostMapping + @Operation(summary = "保存运费项", description = "保存运费项") + public ServerResponseEntity save(@Valid @RequestBody TransfeeDTO transfeeDTO) { + Transfee transfee = BeanUtil.map(transfeeDTO, Transfee.class); + transfee.setTransfeeId(null); + transfeeService.save(transfee); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新运费项", description = "更新运费项") + public ServerResponseEntity update(@Valid @RequestBody TransfeeDTO transfeeDTO) { + Transfee transfee = BeanUtil.map(transfeeDTO, Transfee.class); + transfeeService.update(transfee); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除运费项", description = "根据运费项id删除运费项") + public ServerResponseEntity delete(@RequestParam Long transfeeId) { + transfeeService.deleteById(transfeeId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TransfeeFreeController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TransfeeFreeController.java new file mode 100644 index 0000000..93a3143 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TransfeeFreeController.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.app; + +import com.tmerclub.cloud.delivery.service.TransfeeFreeService; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 指定条件包邮项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@RestController("appTransfeeFreeController") +@RequestMapping("/transfee_free") +@Tag(name = "指定条件包邮项") +public class TransfeeFreeController { + + @Autowired + private TransfeeFreeService transfeeFreeService; + + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TransportController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TransportController.java new file mode 100644 index 0000000..d36b208 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TransportController.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.app; + +import com.tmerclub.cloud.delivery.service.TransportService; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 运费模板 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@RestController("appTransportController") +@RequestMapping("/transport") +@Tag(name = "运费模板") +public class TransportController { + + @Autowired + private TransportService transportService; + + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/platform/AreaController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/platform/AreaController.java new file mode 100644 index 0000000..a6203c6 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/platform/AreaController.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.platform; + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.AreaVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.constant.AreaLevel; +import com.tmerclub.cloud.common.order.dto.AreaDTO; +import com.tmerclub.cloud.delivery.model.Area; +import com.tmerclub.cloud.delivery.service.AreaService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 省市区地区信息 + * + * @author YXF + * @date 2020-11-25 14:48:52 + */ +@RestController("platformAreaController") +@RequestMapping("/p/area") +@Tag(name = "店铺-地区信息") +public class AreaController { + + @Autowired + private AreaService areaService; + + + @PostMapping + @Operation(summary = "保存省市区地区信息", description = "保存省市区地区信息") + public ServerResponseEntity save(@Valid @RequestBody AreaDTO areaDTO) { + Area area = BeanUtil.map(areaDTO, Area.class); + area.setAreaId(null); + // 查询相同上级的当前地区名称数量 + Integer count = areaService.countByNameAndParentId(areaDTO.getAreaName(), areaDTO.getLevel(), areaDTO.getParentId(), null); + if (count > 0) { + throw new LuckException("同一上级的当前地区名称已经存在"); + } + areaService.save(area); + areaService.removeAllCache(area.getParentId()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新省市区地区信息", description = "更新省市区地区信息") + public ServerResponseEntity update(@Valid @RequestBody AreaDTO areaDTO) { + Area area = BeanUtil.map(areaDTO, Area.class); + AreaVO dbArea = areaService.getByAreaId(area.getAreaId()); + // 判断当前省市区级别,如果是1级、2级则不能修改级别,不能修改成别人的下级 + if(Objects.equals(dbArea.getLevel(), AreaLevel.FIRST_LEVEL.value()) && !Objects.equals(area.getLevel(), AreaLevel.FIRST_LEVEL.value())){ + throw new LuckException("不能改变一级行政地区的级别"); + } + if(Objects.equals(dbArea.getLevel(), AreaLevel.SECOND_LEVEL.value()) && !Objects.equals(area.getLevel(), AreaLevel.SECOND_LEVEL.value())){ + throw new LuckException("不能改变二级行政地区的级别"); + } + // 查询相同上级的当前地区名称数量 + Integer count = areaService.countByNameAndParentId(areaDTO.getAreaName(), areaDTO.getLevel(), areaDTO.getParentId(), dbArea.getAreaId()); + if (count > 0) { + throw new LuckException("同一上级的当前地区名称已经存在"); + } + areaService.update(area); + areaService.removeAllCache(dbArea.getParentId()); + areaService.removeAreaCacheByParentId(area.getParentId()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除省市区地区信息", description = "根据省市区地区信息id删除省市区地区信息") + public ServerResponseEntity delete(@RequestParam Long areaId) { + AreaVO dbArea = areaService.getByAreaId(areaId); + areaService.deleteById(areaId); + areaService.removeAllCache(dbArea.getParentId()); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/platform/StationController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/platform/StationController.java new file mode 100644 index 0000000..43b8424 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/platform/StationController.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.platform; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.delivery.dto.StationDTO; +import com.tmerclub.cloud.delivery.model.Station; +import com.tmerclub.cloud.delivery.service.StationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 自提点信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@RestController("platformStationController") +@RequestMapping("/p/station") +@Tag(name = "[平台端]自提点信息") +public class StationController { + private static final Logger logger = LoggerFactory.getLogger(StationController.class); + + @DubboReference + private OfflineHandleEventFeignClient offlineHandleEventFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @Autowired + private StationService stationService; + + @GetMapping("/page") + @Operation(summary = "获取自提点信息列表", description = "分页获取自提点信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, StationDTO stationDTO) { + if (null != stationDTO.getShopName() && !stationDTO.getShopName().isEmpty()) { + logger.info("根据店铺名称模糊查询店铺id"); + List shopIds = shopDetailFeignClient.getShopIdsByLikeShopName(stationDTO.getShopName()).getData(); + if (shopIds.isEmpty()) { + logger.info("查询店铺结果为空直接返回"); + return ServerResponseEntity.success(new PageVO<>()); + } + stationDTO.setShopIds(shopIds); + } + PageVO stationPage = stationService.pageStation(pageDTO, stationDTO); + // 平台端需补充关联店铺名称 + List stations = stationPage.getList(); + if (!CollectionUtils.isEmpty(stations)) { + for (StationVO stationVO : stations) { + if (StrUtil.isNotBlank(stationVO.getMobile()) && PrincipalUtil.isMobile(stationVO.getMobile())) { + stationVO.setMobile(PhoneUtil.hideBetween(stationVO.getMobile()).toString()); + } + } + Set shopIds = stations.stream().map(StationVO::getShopId).collect(Collectors.toSet()); + List shopDetails = shopDetailFeignClient.listByShopIds(new ArrayList<>(shopIds)).getData(); + if (!CollectionUtils.isEmpty(shopDetails)) { + Map shopNameMap = shopDetails.stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName)); + for (StationVO station : stations) { + station.setShopName(shopNameMap.get(station.getShopId())); + } + } + } + return ServerResponseEntity.success(stationPage); + } + + @GetMapping + @Operation(summary = "获取自提点信息", description = "根据stationId获取自提点信息") + public ServerResponseEntity getByStationId(@RequestParam Long stationId) { + StationVO stationVO = stationService.getByStationId(stationId); + if (Objects.nonNull(stationVO) && StrUtil.isNotBlank(stationVO.getMobile()) && PrincipalUtil.isMobile(stationVO.getMobile())) { + stationVO.setMobile(PhoneUtil.hideBetween(stationVO.getMobile()).toString()); + } + if (stationVO != null && stationVO.getStatus() == -1) { + stationVO = null; + } + return ServerResponseEntity.success(stationVO); + } + + @GetMapping("/get_offline_handle_event/{stationId}") + @Operation(summary = "通过自提点id获取下线信息") + @Parameter(name = "stationId", description = "自提点id", required = true) + public ServerResponseEntity getOfflineHandleEventByStationId(@PathVariable("stationId") Long stationId) { + OfflineHandleEventVO offlineHandleEventVO = offlineHandleEventFeignClient.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.STATION.getValue(), stationId, null).getData(); + return ServerResponseEntity.success(offlineHandleEventVO); + } + + @PostMapping("/offline") + @Operation(summary = "下线自提点") + public ServerResponseEntity offline(@RequestBody OfflineHandleEventDTO eventDTO) { + this.isExist(eventDTO.getHandleId()); + // 新增下线信息 + eventDTO.setSysType(SysTypeEnum.STATION.value()); + eventDTO.setHandleType(OfflineHandleEventType.STATION.getValue()); + offlineHandleEventFeignClient.save(eventDTO); + // 修改门店状态 + Station station = new Station(); + station.setStationId(eventDTO.getHandleId()); + station.setStatus(2); + stationService.update(station); + return ServerResponseEntity.success(); + } + + @PostMapping("/audit_station") + @Operation(summary = "自提点下线审核") + public ServerResponseEntity auditStation(@RequestBody OfflineHandleEventDTO eventDTO) { + this.isExist(eventDTO.getHandleId()); + offlineHandleEventFeignClient.auditOfflineEvent(eventDTO); + // 修改门店状态 + Station station = new Station(); + station.setStationId(eventDTO.getHandleId()); + if (OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue().equals(eventDTO.getStatus())) { + station.setStatus(0); + } else { + station.setStatus(4); + } + stationService.update(station); + return ServerResponseEntity.success(); + } + + /** + * 检验门店是否存在 + * + * @param stationId 门店id + */ + private void isExist(Long stationId) { + StationVO stationVO = stationService.getByStationId(stationId); + if (stationVO == null || stationVO.getStatus() == -1) { + // 未找到该自提点信息 + throw new LuckException("未找到相应门店"); + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/OrderDeliveryController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/OrderDeliveryController.java new file mode 100644 index 0000000..ad1eecd --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/OrderDeliveryController.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.supplier; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.delivery.service.DeliveryOrderService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author lhd on 2020/05/15. + */ +@Controller +@RestController("supplierOrderDeliveryController") +@RequestMapping("/s/order_delivery") +@Tag(name = "供应商订单物流包裹") +public class OrderDeliveryController { + + @Autowired + private DeliveryOrderService deliveryOrderService; + + @GetMapping("/info") + @Operation(summary = "查询订单物流包裹信息", description = "查询订单物流包裹信息") + public ServerResponseEntity> page(@RequestParam("orderId") Long orderId) { + List deliveryOrders = deliveryOrderService.getByDeliveryByOrderId(orderId); + return ServerResponseEntity.success(deliveryOrders); + } + + /** + * 修改订单物流包裹信息 + */ + @PutMapping("/update") + public ServerResponseEntity updateOrderDeliveries(@RequestBody List list) { + deliveryOrderService.updateOrderDeliveries(list); + return ServerResponseEntity.success(); + } + + @GetMapping("/{deliveryOrderId}") + @Operation(summary = "物流包裹查询接口", description = "根据orderDeliveryId查询订单包裹信息") + @Parameter(name = "deliveryOrderId", description = "订单物流包裹id") + public ServerResponseEntity deliveryOrder(@PathVariable("deliveryOrderId") Long deliveryOrderId) { + DeliveryOrderFeignVO deliveryOrder = deliveryOrderService.deliveryOrderItemInfo(deliveryOrderId); + return ServerResponseEntity.success(deliveryOrder); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/TransportController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/TransportController.java new file mode 100644 index 0000000..6eb8099 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/TransportController.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.supplier; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.TransportVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.delivery.dto.TransportDTO; +import com.tmerclub.cloud.delivery.service.TransportService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 运费模板 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@RestController("supplierTransportController") +@RequestMapping("/s/transport") +@Tag(name = "运费模板") +public class TransportController { + + @Autowired + private TransportService transportService; + + + @GetMapping("/page") + @Operation(summary = "获取运费模板列表", description = "分页获取运费模板列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, TransportDTO transportDTO) { + Long tenantId = AuthUserContext.get().getTenantId(); + transportDTO.setShopId(tenantId); + PageVO transports = transportService.page(pageDTO, transportDTO); + return ServerResponseEntity.success(transports); + } + + @GetMapping + @Operation(summary = "获取运费模板", description = "根据transportId获取运费模板") + public ServerResponseEntity getByTransportId(@RequestParam Long transportId) { + TransportVO transportVo = transportService.getTransportAndAllItemsById(transportId); + return ServerResponseEntity.success(transportVo); + } + + @PostMapping + @Operation(summary = "保存运费模板", description = "保存运费模板") + public ServerResponseEntity save(@Valid @RequestBody TransportDTO transportDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + transportDTO.setShopId(shopId); + if (Objects.isNull(transportDTO.getTransFees()) && transportDTO.getIsFreeFee() == 0) { + throw new LuckException("请选择可配送区域"); + } + transportService.insertTransportAndTransFee(transportDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新运费模板", description = "更新运费模板") + public ServerResponseEntity update(@Valid @RequestBody TransportDTO transportDTO) { + if (Objects.isNull(transportDTO.getTransFees()) && transportDTO.getIsFreeFee() == 0) { + throw new LuckException("请选择可配送区域"); + } + UidInfoBO uidInfoBO = AuthUserContext.get(); + transportDTO.setShopId(uidInfoBO.getTenantId()); + transportDTO.setSysType(uidInfoBO.getSysType()); + transportService.updateTransportAndTransFee(transportDTO); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除运费模板", description = "根据运费模板id删除运费模板") + public ServerResponseEntity delete(@RequestParam Long transportId) { + transportService.deleteTransportAndTransFeeAndTransCityById(transportId); + // 删除运费模板的缓存 + transportService.removeTransportAndAllItemsCache(transportId); + return ServerResponseEntity.success(); + } + + /** + * 获取运费模板列表 + */ + @GetMapping("/list") + public ServerResponseEntity> list(@RequestParam(value = "shopId", required = false) Long shopId) { + Long tenantId = AuthUserContext.get().getTenantId(); + if (Objects.equals(tenantId, Constant.PLATFORM_SHOP_ID) && Objects.nonNull(shopId)) { + tenantId = shopId; + } + List transports = transportService.listTransport(tenantId); + return ServerResponseEntity.success(transports); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TranscityFreeDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TranscityFreeDTO.java new file mode 100644 index 0000000..7791fda --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TranscityFreeDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 指定条件包邮城市项DTO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class TranscityFreeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "指定条件包邮城市项id") + private Long transcityFreeId; + + @Schema(description = "指定条件包邮项id") + private Long transfeeFreeId; + + @Schema(description = "城市id") + private Long freeCityId; + + public Long getTranscityFreeId() { + return transcityFreeId; + } + + public void setTranscityFreeId(Long transcityFreeId) { + this.transcityFreeId = transcityFreeId; + } + + public Long getTransfeeFreeId() { + return transfeeFreeId; + } + + public void setTransfeeFreeId(Long transfeeFreeId) { + this.transfeeFreeId = transfeeFreeId; + } + + public Long getFreeCityId() { + return freeCityId; + } + + public void setFreeCityId(Long freeCityId) { + this.freeCityId = freeCityId; + } + + @Override + public String toString() { + return "TranscityFreeDTO{" + + "transcityFreeId=" + transcityFreeId + + ",transfeeFreeId=" + transfeeFreeId + + ",freeCityId=" + freeCityId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TransfeeDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TransfeeDTO.java new file mode 100644 index 0000000..d421a61 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TransfeeDTO.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.dto; + +import com.tmerclub.cloud.common.order.dto.AreaDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 运费项DTO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class TransfeeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "运费项id") + private Long transfeeId; + + @Schema(description = "运费模板id") + private Long transportId; + + @Schema(description = "续件数量") + private Double continuousPiece; + + @Schema(description = "首件数量") + private Double firstPiece; + + @Schema(description = "续件费用") + private Long continuousFee; + + @Schema(description = "首件费用") + private Long firstFee; + + @Schema(description = "指定条件运费城市项") + private List cityList; + + public Long getTransfeeId() { + return transfeeId; + } + + public void setTransfeeId(Long transfeeId) { + this.transfeeId = transfeeId; + } + + public Long getTransportId() { + return transportId; + } + + public void setTransportId(Long transportId) { + this.transportId = transportId; + } + + public Double getContinuousPiece() { + return continuousPiece; + } + + public void setContinuousPiece(Double continuousPiece) { + this.continuousPiece = continuousPiece; + } + + public Double getFirstPiece() { + return firstPiece; + } + + public void setFirstPiece(Double firstPiece) { + this.firstPiece = firstPiece; + } + + public Long getContinuousFee() { + return continuousFee; + } + + public void setContinuousFee(Long continuousFee) { + this.continuousFee = continuousFee; + } + + public Long getFirstFee() { + return firstFee; + } + + public void setFirstFee(Long firstFee) { + this.firstFee = firstFee; + } + + public List getCityList() { + return cityList; + } + + public void setCityList(List cityList) { + this.cityList = cityList; + } + + @Override + public String toString() { + return "TransfeeDTO{" + + "transfeeId=" + transfeeId + + ", transportId=" + transportId + + ", continuousPiece=" + continuousPiece + + ", firstPiece=" + firstPiece + + ", continuousFee=" + continuousFee + + ", firstFee=" + firstFee + + ", cityList=" + cityList + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/AreaFeignController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/AreaFeignController.java new file mode 100644 index 0000000..5002b37 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/AreaFeignController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.feign; + + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.delivery.feign.AreaFeignClient; +import com.tmerclub.cloud.common.order.vo.AreaVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.service.AreaService; +import io.seata.common.util.CollectionUtils; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + + +/** + * @author YXF + * @date 2021/06/02 + */ +@DubboService +public class AreaFeignController implements AreaFeignClient { + + @Autowired + private AreaService areaService; + + + @Override + public List listProvinceArea() { + return BeanUtil.mapAsList(areaService.getAreaListInfo(), AreaVO.class); + } + + @Override + public List listByAreaIdList(List areaIdList) { + if (CollectionUtils.isEmpty(areaIdList)) { + return new ArrayList<>(); + } + return areaService.listByAreaIdList(areaIdList); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/SameCityFeignController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/SameCityFeignController.java new file mode 100644 index 0000000..1c83c1f --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/SameCityFeignController.java @@ -0,0 +1,37 @@ +package com.tmerclub.cloud.delivery.feign; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.tmerclub.cloud.api.delivery.feign.SameCityFeignClient; +import com.tmerclub.cloud.api.delivery.vo.SameCityVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.delivery.model.SameCity; +import com.tmerclub.cloud.delivery.service.SameCityService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lanhai + */ +@DubboService +public class SameCityFeignController implements SameCityFeignClient { + + @Autowired + private SameCityService sameCityService; + + @Override + public void clearPositionInfo(Long shopId) { + SameCity sameCity = new SameCity(); + sameCity.setShopId(shopId); + sameCity.setPositionInfo("[]"); + sameCityService.updateByShopId(sameCity); + } + + @Override + public ServerResponseEntity getSameCityByShopId(Long shopId) { + SameCity sameCity = sameCityService.getSameCityByShopId(shopId); + SameCityVO sameCityVO = JSONObject.parseObject(JSON.toJSONString(sameCity), SameCityVO.class); + return ServerResponseEntity.success(sameCityVO); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/StationFeignController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/StationFeignController.java new file mode 100644 index 0000000..cb8a2ad --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/StationFeignController.java @@ -0,0 +1,43 @@ +package com.tmerclub.cloud.delivery.feign; + +import com.tmerclub.cloud.api.delivery.feign.StationFeignClient; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.common.order.vo.OrderSelfStationVO; +import com.tmerclub.cloud.common.order.vo.OrderStationSpuDTO; +import com.tmerclub.cloud.common.order.vo.UserDeliveryInfoVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.delivery.service.StationService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author lanhai + */ +@DubboService +public class StationFeignController implements StationFeignClient { + @Autowired + private StationService stationService; + + @Override + public ServerResponseEntity getStationByInside(Long stationId) { + return ServerResponseEntity.success(stationService.getByStationId(stationId)); + } + + @Override + public List listStationByIds(List stationIds) { + return stationService.listByStationId(stationIds); + } + + @Override + public OrderSelfStationVO getOrderStation(UserDeliveryInfoVO userDeliveryInfoVO, ArrayList orderStationSpuList) { + return stationService.getOrderStation(userDeliveryInfoVO, orderStationSpuList); + } + + @Override + public Integer getStationSize(Long shopId) { + return stationService.listByShopId(shopId).size(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/DeliveryCompanyMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/DeliveryCompanyMapper.java new file mode 100644 index 0000000..83bcdb4 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/DeliveryCompanyMapper.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.mapper; + +import com.tmerclub.cloud.delivery.dto.DeliveryCompanyDTO; +import com.tmerclub.cloud.delivery.model.DeliveryCompany; +import com.tmerclub.cloud.delivery.vo.DeliveryCompanyVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Set; + +/** + * 物流公司 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public interface DeliveryCompanyMapper { + + /** + * 获取物流公司列表 + * + * @return 物流公司列表 + */ + List list(); + + /** + * 根据物流公司id获取物流公司 + * + * @param deliveryCompanyId 物流公司id + * @return 物流公司 + */ + DeliveryCompanyVO getByDeliveryCompanyId(@Param("deliveryCompanyId") Long deliveryCompanyId); + + /** + * 保存物流公司 + * + * @param deliveryCompany 物流公司 + */ + void save(@Param("deliveryCompany") DeliveryCompany deliveryCompany); + + /** + * 更新物流公司 + * + * @param deliveryCompany 物流公司 + */ + void update(@Param("deliveryCompany") DeliveryCompany deliveryCompany); + + /** + * 根据物流公司id删除物流公司 + * + * @param deliveryCompanyId + */ + void deleteById(@Param("deliveryCompanyId") Long deliveryCompanyId); + + /** + * 分页获取物流公司列表 + * + * @param deliveryCompanyDTO + * @return + */ + List listBySearch(@Param("deliveryCompany") DeliveryCompanyDTO deliveryCompanyDTO); + + /** + * 根据快递公司名称统计已存在的快递公司数量 + * + * @param name 快递公司名称 + * @param deliveryCompanyId + * @return 快递公司数量 + */ + Integer countName(@Param("name") String name, @Param("deliveryCompanyId") Long deliveryCompanyId); + + /** + * 根据物流公司id列表,获取物流公司列表 + * + * @param ids + * @return + */ + List listByIds(@Param("ids") Set ids); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/DeliveryOrderItemMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/DeliveryOrderItemMapper.java new file mode 100644 index 0000000..a04f8e4 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/DeliveryOrderItemMapper.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.mapper; + +import com.tmerclub.cloud.delivery.model.DeliveryOrderItem; +import com.tmerclub.cloud.delivery.vo.DeliveryOrderItemVO; +import com.tmerclub.cloud.delivery.vo.DeliveryOrderVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 物流订单项信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public interface DeliveryOrderItemMapper { + + /** + * 根据物流订单项信息id获取物流订单项信息 + * + * @param id 物流订单项信息id + * @return 物流订单项信息 + */ + DeliveryOrderItemVO getById(@Param("id") Long id); + + /** + * 保存物流订单项信息 + * + * @param deliveryOrderItem 物流订单项信息 + */ + void save(@Param("deliveryOrderItem") DeliveryOrderItem deliveryOrderItem); + + /** + * 更新物流订单项信息 + * + * @param deliveryOrderItem 物流订单项信息 + */ + void update(@Param("deliveryOrderItem") DeliveryOrderItem deliveryOrderItem); + + /** + * 根据物流订单项信息id删除物流订单项信息 + * + * @param id + */ + void deleteById(@Param("id") Long id); + + /** + * 批量保存订单项物流 + * + * @param deliveryOrderItems + */ + void saveBatch(@Param("deliveryOrderItems") List deliveryOrderItems); + + /** + * 查询订单物流包裹信息 + * + * @param orderId + * @return + */ + List listDetailDelivery(@Param("orderId") Long orderId); + + /** + * 根据订单物流id获取订单包裹信息 + * @param deliveryOrderId + * @return + */ + List listItemDelivery(@Param("deliveryOrderId") Long deliveryOrderId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/DeliveryOrderMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/DeliveryOrderMapper.java new file mode 100644 index 0000000..cae7d2d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/DeliveryOrderMapper.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.mapper; + +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.tmerclub.cloud.delivery.model.DeliveryOrder; +import com.tmerclub.cloud.delivery.vo.DeliveryOrderVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单快递信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public interface DeliveryOrderMapper { + + + /** + * 根据订单快递信息id获取订单快递信息 + * + * @param deliveryOrderId 订单快递信息id + * @return 订单快递信息 + */ + DeliveryOrderVO getByDeliveryOrderId(@Param("deliveryOrderId") Long deliveryOrderId); + + /** + * 保存订单快递信息 + * + * @param deliveryOrder 订单快递信息 + */ + void save(@Param("deliveryOrder") DeliveryOrder deliveryOrder); + + /** + * 更新订单快递信息 + * + * @param deliveryOrder 订单快递信息 + */ + void update(@Param("deliveryOrder") DeliveryOrder deliveryOrder); + + /** + * 根据订单快递信息id删除订单快递信息 + * + * @param deliveryOrderId + */ + void deleteById(@Param("deliveryOrderId") Long deliveryOrderId); + + /** + * 根据订单号获取包裹信息 + * + * @param orderId 订单id + * @param deliveryOrderId 订单物流包裹id + * @return + */ + List getByDeliveryByOrderId(@Param("orderId") Long orderId, @Param("deliveryOrderId") Long deliveryOrderId); + + /** + * 根据订单编号获取发货数量 + * + * @param orderIds + * @return + */ + List listDeliveryCountByOrderId(@Param("orderIds") List orderIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/OutletConfigMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/OutletConfigMapper.java new file mode 100644 index 0000000..46c45ac --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/OutletConfigMapper.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.mapper; + +import com.tmerclub.cloud.delivery.dto.OutletConfigDTO; +import com.tmerclub.cloud.delivery.model.OutletConfig; +import com.tmerclub.cloud.delivery.vo.OutletConfigInfoVO; +import com.tmerclub.cloud.delivery.vo.OutletConfigVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 网点配置 + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +public interface OutletConfigMapper { + + /** + * 获取网点配置列表 + * @param outletConfigDTO + * @return 网点配置列表 + */ + List list(@Param("outletConfig") OutletConfigDTO outletConfigDTO); + + /** + * 根据网点配置id获取网点配置 + * + * @param outletConfigId 网点配置id + * @return 网点配置 + */ + OutletConfig getByOutletConfigId(@Param("outletConfigId") Long outletConfigId); + + /** + * 保存网点配置 + * @param outletConfig 网点配置 + */ + void save(@Param("outletConfig") OutletConfig outletConfig); + + /** + * 更新网点配置 + * @param outletConfig 网点配置 + */ + void update(@Param("outletConfig") OutletConfig outletConfig); + + /** + * 根据网点配置id删除网点配置 + * @param outletConfigId + */ + void deleteById(@Param("outletConfigId") Long outletConfigId); + + /** + * 检查网点配置是否重复 + * @param outletConfig + * @return + */ + int checkIsExist(@Param("outletConfig") OutletConfig outletConfig); + + /** + * 取消默认 + * @param shopId + * @param supplierId + */ + void cancelDefault(@Param("shopId") Long shopId, @Param("supplierId") Long supplierId); + + /** + * 设为/取消默认 + * @param outletConfigId + */ + void setDefault(@Param("outletConfigId") Long outletConfigId); + + /** + * 获取店铺网点配置列表 + * @param shopId + * @param sysType + * @return + */ + List listByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/StationMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/StationMapper.java new file mode 100644 index 0000000..380edd5 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/StationMapper.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.mapper; + +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.delivery.dto.OrderStationDTO; +import com.tmerclub.cloud.delivery.dto.StationDTO; +import com.tmerclub.cloud.delivery.model.Station; +import com.tmerclub.cloud.order.vo.StationDetailVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 自提点信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface StationMapper { + + /** + * 获取自提点信息列表 + * + * @return 自提点信息列表 + */ + List list(); + + /** + * 获取自提点列表信息 + * + * @param stationDTO + * @return + */ + List listStation(@Param("stationDTO") StationDTO stationDTO); + + /** + * 根据自提点信息id获取自提点信息 + * + * @param stationId 自提点信息id + * @return 自提点信息 + */ + StationVO getByStationId(@Param("stationId") Long stationId); + + /** + * 保存自提点信息 + * + * @param station 自提点信息 + */ + void save(@Param("station") Station station); + + /** + * 更新自提点信息 + * + * @param station 自提点信息 + */ + void update(@Param("station") Station station); + + /** + * 根据自提点信息id删除自提点信息 + * + * @param stationId + */ + void deleteById(@Param("stationId") Long stationId); + + + /** + * 条件查询,分页获取经纬度最近的自提门店信息列表 + * + * @param orderStationDTO 自提门店筛选参数 + * @return 分页经纬度最近的自提门店信息列表 + */ + List getStationList(@Param("page") PageAdapter page, @Param("orderStationDTO") OrderStationDTO orderStationDTO); + + + /** + * 获取自提点距离 + * + * @param stationId 自提点id + * @param lat 纬度 + * @param lng 经度 + * @return + */ + Double getStationDistance(@Param("stationId") Long stationId, @Param("lat") Double lat, @Param("lng") Double lng); + + /** + * 根据自提点id删除自提点(逻辑删除) + * + * @param stationId + */ + void logicDeleteById(Long stationId); + + /** + * 获取自提点列表 + * @param stationIds + * @return + */ + List getStationListById(@Param("stationIds") List stationIds); + + /** + * 获取指点店铺的门店列表 + * @param shopId + * @param status + * @return + */ + List listSimpleStation(@Param("shopId") Long shopId, @Param("status") Integer status); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TranscityMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TranscityMapper.java new file mode 100644 index 0000000..8cc3582 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TranscityMapper.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.mapper; + +import com.tmerclub.cloud.delivery.model.Transcity; +import com.tmerclub.cloud.delivery.vo.TranscityVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 运费项和运费城市关联信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface TranscityMapper { + + /** + * 获取运费项和运费城市关联信息列表 + * @return 运费项和运费城市关联信息列表 + */ + List list(); + + /** + * 根据运费项和运费城市关联信息id获取运费项和运费城市关联信息 + * + * @param transcityId 运费项和运费城市关联信息id + * @return 运费项和运费城市关联信息 + */ + TranscityVO getByTranscityId(@Param("transcityId") Long transcityId); + + /** + * 保存运费项和运费城市关联信息 + * @param transcity 运费项和运费城市关联信息 + */ + void save(@Param("transcity") Transcity transcity); + + /** + * 更新运费项和运费城市关联信息 + * @param transcity 运费项和运费城市关联信息 + */ + void update(@Param("transcity") Transcity transcity); + + /** + * 根据运费项和运费城市关联信息id删除运费项和运费城市关联信息 + * @param transcityId + */ + void deleteById(@Param("transcityId") Long transcityId); + + /** + * 批量保存运费项关联城市信息 + * @param transCities 关联信息 + */ + void saveBatch(@Param("transCities") List transCities); + + /** + * 删除所有运费项包含的城市 + * @param transFeeIds 运费项id + */ + void deleteBatchByTransFeeIds(@Param("transFeeIds") List transFeeIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/DeliveryOrder.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/DeliveryOrder.java new file mode 100644 index 0000000..4cd11eb --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/DeliveryOrder.java @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单快递信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public class DeliveryOrder extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单物流包裹id + */ + private Long deliveryOrderId; + + /** + * 订单号 + */ + private Long orderId; + + /** + * 用户id + */ + private Long userId; + + /** + * 快递公司id + */ + private Long deliveryCompanyId; + + /** + * 快递单号 + */ + private String deliveryNo; + + /** + * 收件人姓名 + */ + private String consigneeName; + + /** + * 收件人电话(顺丰快递需要) + */ + private String consigneeMobile; + + /** + * 物流状态 1正常 -1删除 + */ + private Integer status; + + /** + * 包裹商品总数 + */ + private Integer allCount; + + /** + * 删除时间 + */ + private Date deleteTime; + + /** + * 物流公司名称 + */ + private String companyName; + + /** + * 包裹项 + */ + private List deliveryOrderItemList; + + /** + * 发货方式(0.线上发货 1.自行联系快递 2.用户自提 3.无需物流 4.同城配送) + */ + private Integer deliveryType; + + public Long getDeliveryOrderId() { + return deliveryOrderId; + } + + public void setDeliveryOrderId(Long deliveryOrderId) { + this.deliveryOrderId = deliveryOrderId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getDeliveryCompanyId() { + return deliveryCompanyId; + } + + public void setDeliveryCompanyId(Long deliveryCompanyId) { + this.deliveryCompanyId = deliveryCompanyId; + } + + public String getDeliveryNo() { + return deliveryNo; + } + + public void setDeliveryNo(String deliveryNo) { + this.deliveryNo = deliveryNo; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Date getDeleteTime() { + return deleteTime; + } + + public void setDeleteTime(Date deleteTime) { + this.deleteTime = deleteTime; + } + + public List getDeliveryOrderItemList() { + return deliveryOrderItemList; + } + + public void setDeliveryOrderItemList(List deliveryOrderItemList) { + this.deliveryOrderItemList = deliveryOrderItemList; + } + + public String getConsigneeName() { + return consigneeName; + } + + public void setConsigneeName(String consigneeName) { + this.consigneeName = consigneeName; + } + + public String getConsigneeMobile() { + return consigneeMobile; + } + + public void setConsigneeMobile(String consigneeMobile) { + this.consigneeMobile = consigneeMobile; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "DeliveryOrder{" + + "deliveryOrderId=" + deliveryOrderId + + ", orderId=" + orderId + + ", userId=" + userId + + ", deliveryCompanyId=" + deliveryCompanyId + + ", deliveryNo='" + deliveryNo + '\'' + + ", consigneeName='" + consigneeName + '\'' + + ", consigneeMobile='" + consigneeMobile + '\'' + + ", status=" + status + + ", allCount=" + allCount + + ", deleteTime=" + deleteTime + + ", companyName='" + companyName + '\'' + + ", deliveryOrderItemList=" + deliveryOrderItemList + + ", deliveryType=" + deliveryType + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/DeliveryOrderItem.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/DeliveryOrderItem.java new file mode 100644 index 0000000..349930a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/DeliveryOrderItem.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 物流订单项信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public class DeliveryOrderItem extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long deliveryOrderItemId; + + /** + * 订单物流包裹id + */ + private Long deliveryOrderId; + + /** + * 商品图片 + */ + private String imgUrl; + + /** + * 商品名称 + */ + private String spuName; + + /** + * 商品数量 + */ + private Integer count; + + /** + * 商品图片 + */ + private String supplierImgUrl; + + /** + * 商品名称 + */ + private String supplierSpuName; + + public String getSupplierImgUrl() { + return supplierImgUrl; + } + + public void setSupplierImgUrl(String supplierImgUrl) { + this.supplierImgUrl = supplierImgUrl; + } + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public Long getDeliveryOrderItemId() { + return deliveryOrderItemId; + } + + public void setDeliveryOrderItemId(Long deliveryOrderItemId) { + this.deliveryOrderItemId = deliveryOrderItemId; + } + + public Long getDeliveryOrderId() { + return deliveryOrderId; + } + + public void setDeliveryOrderId(Long deliveryOrderId) { + this.deliveryOrderId = deliveryOrderId; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "DeliveryOrderItem{" + + "deliveryOrderItemId=" + deliveryOrderItemId + + ", deliveryOrderId=" + deliveryOrderId + + ", imgUrl='" + imgUrl + '\'' + + ", spuName='" + spuName + '\'' + + ", count=" + count + + ", supplierImgUrl='" + supplierImgUrl + '\'' + + ", supplierSpuName='" + supplierSpuName + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Transcity.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Transcity.java new file mode 100644 index 0000000..a12788b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Transcity.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 运费项和运费城市关联信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class Transcity extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long transcityId; + + /** + * 运费项id + */ + private Long transfeeId; + + /** + * 城市id + */ + private Long cityId; + + public Long getTranscityId() { + return transcityId; + } + + public void setTranscityId(Long transcityId) { + this.transcityId = transcityId; + } + + public Long getTransfeeId() { + return transfeeId; + } + + public void setTransfeeId(Long transfeeId) { + this.transfeeId = transfeeId; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + @Override + public String toString() { + return "Transcity{" + + "transcityId=" + transcityId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",transfeeId=" + transfeeId + + ",cityId=" + cityId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Transfee.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Transfee.java new file mode 100644 index 0000000..0fd5c67 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Transfee.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 运费项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class Transfee extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 运费项id + */ + private Long transfeeId; + + /** + * 运费模板id + */ + private Long transportId; + + /** + * 续件数量 + */ + private Double continuousPiece; + + /** + * 首件数量 + */ + private Double firstPiece; + + /** + * 续件费用 + */ + private Long continuousFee; + + /** + * 首件费用 + */ + private Long firstFee; + + public Long getTransfeeId() { + return transfeeId; + } + + public void setTransfeeId(Long transfeeId) { + this.transfeeId = transfeeId; + } + + public Long getTransportId() { + return transportId; + } + + public void setTransportId(Long transportId) { + this.transportId = transportId; + } + + public Double getContinuousPiece() { + return continuousPiece; + } + + public void setContinuousPiece(Double continuousPiece) { + this.continuousPiece = continuousPiece; + } + + public Double getFirstPiece() { + return firstPiece; + } + + public void setFirstPiece(Double firstPiece) { + this.firstPiece = firstPiece; + } + + public Long getContinuousFee() { + return continuousFee; + } + + public void setContinuousFee(Long continuousFee) { + this.continuousFee = continuousFee; + } + + public Long getFirstFee() { + return firstFee; + } + + public void setFirstFee(Long firstFee) { + this.firstFee = firstFee; + } + + @Override + public String toString() { + return "Transfee{" + + "transfeeId=" + transfeeId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",transportId=" + transportId + + ",continuousPiece=" + continuousPiece + + ",firstPiece=" + firstPiece + + ",continuousFee=" + continuousFee + + ",firstFee=" + firstFee + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Transport.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Transport.java new file mode 100644 index 0000000..0e23cdc --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Transport.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 运费模板 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class Transport extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 运费模板id + */ + private Long transportId; + + /** + * 运费模板名称 + */ + private String transName; + + /** + * 系统类型见SysTypeEnum 0.普通用户系统 1.商家端 2平台端 3供应商端 + */ + @Schema(description = "系统类型") + private Integer sysType; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 收费方式(0 按件数,1 按重量 2 按体积) + */ + private Integer chargeType; + + /** + * 是否包邮 0:不包邮 1:包邮 + */ + private Integer isFreeFee; + + /** + * 是否含有包邮条件 0 否 1是 + */ + private Integer hasFreeCondition; + + public Long getTransportId() { + return transportId; + } + + public void setTransportId(Long transportId) { + this.transportId = transportId; + } + + public String getTransName() { + return transName; + } + + public void setTransName(String transName) { + this.transName = transName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Integer getChargeType() { + return chargeType; + } + + public void setChargeType(Integer chargeType) { + this.chargeType = chargeType; + } + + public Integer getIsFreeFee() { + return isFreeFee; + } + + public void setIsFreeFee(Integer isFreeFee) { + this.isFreeFee = isFreeFee; + } + + public Integer getHasFreeCondition() { + return hasFreeCondition; + } + + public void setHasFreeCondition(Integer hasFreeCondition) { + this.hasFreeCondition = hasFreeCondition; + } + + @Override + public String toString() { + return "Transport{" + + "transportId=" + transportId + + ", transName='" + transName + '\'' + + ", sysType=" + sysType + + ", shopId=" + shopId + + ", chargeType=" + chargeType + + ", isFreeFee=" + isFreeFee + + ", hasFreeCondition=" + hasFreeCondition + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/DeliveryOrderService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/DeliveryOrderService.java new file mode 100644 index 0000000..c836299 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/DeliveryOrderService.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.tmerclub.cloud.common.order.vo.TransportVO; +import com.tmerclub.cloud.delivery.model.DeliveryOrder; +import com.tmerclub.cloud.delivery.vo.DeliveryOrderVO; + +import java.io.UnsupportedEncodingException; +import java.util.List; + +/** + * 订单快递信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public interface DeliveryOrderService { + + /** + * 根据订单快递信息id获取订单快递信息 + * + * @param deliveryOrderId 订单快递信息id + * @return 订单快递信息 + */ + DeliveryOrderVO getByDeliveryOrderId(Long deliveryOrderId); + + /** + * 保存订单快递信息 + * + * @param deliveryOrder 订单快递信息 + */ + void save(DeliveryOrder deliveryOrder); + + /** + * 更新订单快递信息 + * + * @param deliveryOrder 订单快递信息 + */ + void update(DeliveryOrder deliveryOrder); + + /** + * 根据订单快递信息id删除订单快递信息 + * + * @param deliveryOrderId + */ + void deleteById(Long deliveryOrderId); + + /** + * 根据订单号获取包裹信息 + * + * @param orderId 订单id + * @return 包裹信息 + * @throws UnsupportedEncodingException 编码异常 + */ + List getByDeliveryByOrderId(Long orderId); + + /** + * 生成物流信息及保存物流与订单关联 + * + * @param deliveryOrder 订单发货信息 + * @param isPurchase 是否为采购订单 0否1是 + * @param unDeliveryNum 未发货数量(采购订单默认为0) + */ + void saveDeliveryInfo(DeliveryOrderDTO deliveryOrder, Integer isPurchase, Integer unDeliveryNum); + + /** + * 查询订单物流包裹信息 + * + * @param orderId + * @return + */ + List listDetailDelivery(Long orderId); + + /** + * 修改订单物流包裹信息 + * + * @param list + */ + void updateOrderDeliveries(List list); + + /** + * 获取物流信息 + * + * @param deliveryOrderId 订单物流包裹id + * @return 物流信息 + */ + DeliveryOrderFeignVO deliveryOrderItemInfo(Long deliveryOrderId); + + /** + * 根据订单编号获取发货数量 + * + * @param orderIds + * @return + */ + List listDeliveryCountByOrderId(List orderIds); + + /** + * 判断用户地址是否包含在配送范围内 + * @param transportVO + * @param userId + * @param addrId + * @return + */ + Boolean checkAddr(TransportVO transportVO, Long userId, Long addrId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/OutletConfigService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/OutletConfigService.java new file mode 100644 index 0000000..a7fcd00 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/OutletConfigService.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.delivery.dto.OutletConfigDTO; +import com.tmerclub.cloud.delivery.model.OutletConfig; +import com.tmerclub.cloud.delivery.vo.OutletConfigInfoVO; +import com.tmerclub.cloud.delivery.vo.OutletConfigVO; + +import java.util.List; + +/** + * 网点配置 + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +public interface OutletConfigService { + + /** + * 分页获取网点配置列表 + * @param pageDTO 分页参数 + * @param outletConfigDTO + * @return 网点配置列表分页数据 + */ + PageVO page(PageDTO pageDTO, OutletConfigDTO outletConfigDTO); + + /** + * 根据网点配置id获取网点配置 + * + * @param outletConfigId 网点配置id + * @param sysType + * @return 网点配置 + */ + OutletConfig getByOutletConfig(Long outletConfigId, Integer sysType); + + /** + * 保存网点配置 + * @param outletConfig 网点配置 + */ + void save(OutletConfig outletConfig); + + /** + * 更新网点配置 + * @param outletConfig 网点配置 + */ + void update(OutletConfig outletConfig); + + /** + * 根据网点配置id删除网点配置 + * @param outletConfigId 网点配置id + */ + void deleteById(Long outletConfigId); + + /** + * 设为/取消默认 + * @param outletConfigId + */ + void setDefault(Long outletConfigId); + + /** + * 获取店铺网点配置列表 + * @param shopId + * @param sysType + * @return + */ + List listByShopId(Long shopId, Integer sysType); + + /** + * 删除缓存 + * @param shopId + * @param sysType + */ + void removeCache(Long shopId, Integer sysType); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/PrinterService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/PrinterService.java new file mode 100644 index 0000000..19e6c56 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/PrinterService.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.delivery.dto.PrinterDTO; +import com.tmerclub.cloud.delivery.model.Printer; +import com.tmerclub.cloud.delivery.vo.PrinterVO; + +import java.util.List; + +/** + * 打印机 + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +public interface PrinterService { + + /** + * 分页获取打印机列表 + * @param pageDTO 分页参数 + * @param printerDTO + * @return 打印机列表分页数据 + */ + PageVO page(PageDTO pageDTO, PrinterDTO printerDTO); + + /** + * 根据打印机id获取打印机 + * + * @param printerId 打印机id + * @return 打印机 + */ + Printer getByPrinterId(Long printerId); + + /** + * 保存打印机 + * @param printer 打印机 + */ + void save(Printer printer); + + /** + * 更新打印机 + * @param printer 打印机 + */ + void update(Printer printer); + + /** + * 根据打印机id删除打印机 + * @param printerId 打印机id + */ + void deleteById(Long printerId); + + /** + * 设为/取消默认 + * @param printerId + */ + void setDefault(Long printerId); + + /** + * 获取店铺打印机列表 + * @param shopId + * @param sysType + * @return + */ + List listByShopId(Long shopId, Integer sysType); + + /** + * 删除缓存 + * @param shopId + * @param sysType + */ + void removeCache(Long shopId, Integer sysType); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/SameCityService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/SameCityService.java new file mode 100644 index 0000000..c68d588 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/SameCityService.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service; + +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.order.vo.UserDeliveryInfoVO; +import com.tmerclub.cloud.delivery.model.SameCity; + +import java.util.List; + +/** + * 同城配送信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface SameCityService { + + /** + * 根据店铺id获取同城配送信息 + * + * @param shopId 同城配送信息id + * @return 同城配送信息 + */ + SameCity getSameCityByShopId(Long shopId); + + /** + * 保存同城配送信息 + * @param sameCity 同城配送信息 + */ + void save(SameCity sameCity); + + /** + * 更新同城配送信息 + * @param sameCity 同城配送信息 + */ + void updateByShopId(SameCity sameCity); + + /** + * 移除缓存 + * + * @param shopId 同城配送信息id + * @return 同城配送信息 + */ + void removeSameCityCacheByShopId(Long shopId); + + /** + * 计算同城配送的运费 + * @param shopCartItems 订单项 + * @param userDeliveryInfo + * @return 运费 + */ + long calculateTransFee(List shopCartItems, UserDeliveryInfoVO userDeliveryInfo); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/StationService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/StationService.java new file mode 100644 index 0000000..10d0f7f --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/StationService.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service; + +import com.tmerclub.cloud.api.delivery.dto.StationSalesDTO; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.OrderSelfStationVO; +import com.tmerclub.cloud.common.order.vo.UserDeliveryInfoVO; +import com.tmerclub.cloud.delivery.dto.OrderStationDTO; +import com.tmerclub.cloud.common.order.vo.OrderStationSpuDTO; +import com.tmerclub.cloud.delivery.dto.StationDTO; +import com.tmerclub.cloud.delivery.model.Station; +import com.tmerclub.cloud.order.vo.StationDetailVO; + +import java.util.List; + +/** + * 自提点信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface StationService { + + /** + * 分页获取自提点信息列表 + * @param pageDTO 分页参数 + * @return 自提点信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 分页获取自提点列表 + * @param pageDTO + * @param stationDTO + * @return + */ + PageVO pageStation(PageDTO pageDTO, StationDTO stationDTO); + + /** + * 根据自提点信息id获取自提点信息 + * + * @param stationId 自提点信息id + * @return 自提点信息 + */ + StationVO getByStationId(Long stationId); + + /** + * 保存自提点信息 + * @param station 自提点信息 + */ + void save(Station station); + + /** + * 更新自提点信息 + * @param station 自提点信息 + */ + void update(Station station); + + /** + * 根据自提点信息id删除自提点信息 + * @param stationId + */ + void deleteById(Long stationId); + + /** + * 根据自提点id删除自提点(逻辑删除) + * @param stationId + */ + void logicDeleteById(Long stationId); + + /** + * 统计门店销售数据 + * @param shopId + * @param stationId + * @return + */ + List getStationSalesRecord(Long shopId, Long stationId); + + + /** + * 分页获取用户常用自提门店以及由近及远的自提门店列表 + * @param page 分页参数 + * @param orderStationDTO 自提门店筛选参数 + * @return 分页用户常用自提门店以及由近及远的自提门店列表 + */ + PageVO getStationList(PageDTO page, OrderStationDTO orderStationDTO); + + + /** + * 获取自提门店详情 + * @param stationId 自提门店id + * @return 门店详情 + */ + StationVO getStationInfoById(Long stationId); + + /** + * 获取门店距离 + * @param stationId 自提点id + * @param lat 维度 + * @param lng 经度 + * @return + */ + Double getStationDistance(Long stationId, Double lat, Double lng); + + /** + * 获取自提点列表 + * @param stationIds + * @return + */ + List listByStationId(List stationIds); + + /** + * 根据店铺id获取自提点 + * @param shopId + * @return + */ + List listByShopId(Long shopId); + + /** + * 切换门店库存模式 + * @param stationId + * @param type 共享库存模式(1同步到默认仓库 2库存清零),只有切换成共享库存模式才有值 + */ + void switchStationStockMode(Long stationId, Integer type); + + /** + * 获取自提订单的门店数据 - 仅订单stationId为null时,获取距离用户最近的门店,如果没有传经纬度,则是返回一个有库存的门店 + * @param userDeliveryInfoVO + * @param orderStationSpuList + * @return + */ + OrderSelfStationVO getOrderStation(UserDeliveryInfoVO userDeliveryInfoVO, List orderStationSpuList); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TranscityFreeService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TranscityFreeService.java new file mode 100644 index 0000000..df2d9eb --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TranscityFreeService.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.delivery.model.TranscityFree; +import com.tmerclub.cloud.delivery.vo.TranscityFreeVO; + +/** + * 指定条件包邮城市项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface TranscityFreeService { + + /** + * 分页获取指定条件包邮城市项列表 + * @param pageDTO 分页参数 + * @return 指定条件包邮城市项列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据指定条件包邮城市项id获取指定条件包邮城市项 + * + * @param transcityFreeId 指定条件包邮城市项id + * @return 指定条件包邮城市项 + */ + TranscityFreeVO getByTranscityFreeId(Long transcityFreeId); + + /** + * 保存指定条件包邮城市项 + * @param transcityFree 指定条件包邮城市项 + */ + void save(TranscityFree transcityFree); + + /** + * 更新指定条件包邮城市项 + * @param transcityFree 指定条件包邮城市项 + */ + void update(TranscityFree transcityFree); + + /** + * 根据指定条件包邮城市项id删除指定条件包邮城市项 + * @param transcityFreeId + */ + void deleteById(Long transcityFreeId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TransfeeFreeService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TransfeeFreeService.java new file mode 100644 index 0000000..60aee7c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TransfeeFreeService.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.TransfeeFreeVO; + +/** + * 指定条件包邮项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface TransfeeFreeService { + + /** + * 分页获取指定条件包邮项列表 + * @param pageDTO 分页参数 + * @return 指定条件包邮项列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据指定条件包邮项id获取指定条件包邮项 + * + * @param transfeeFreeId 指定条件包邮项id + * @return 指定条件包邮项 + */ + TransfeeFreeVO getByTransfeeFreeId(Long transfeeFreeId); + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/DeliveryOrderItemServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/DeliveryOrderItemServiceImpl.java new file mode 100644 index 0000000..04d2d04 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/DeliveryOrderItemServiceImpl.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service.impl; + +import com.tmerclub.cloud.delivery.mapper.DeliveryOrderItemMapper; +import com.tmerclub.cloud.delivery.model.DeliveryOrderItem; +import com.tmerclub.cloud.delivery.service.DeliveryOrderItemService; +import com.tmerclub.cloud.delivery.vo.DeliveryOrderItemVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 物流订单项信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +@Service +public class DeliveryOrderItemServiceImpl implements DeliveryOrderItemService { + + @Autowired + private DeliveryOrderItemMapper deliveryOrderItemMapper; + + @Override + public DeliveryOrderItemVO getById(Long id) { + return deliveryOrderItemMapper.getById(id); + } + + @Override + public void save(DeliveryOrderItem deliveryOrderItem) { + deliveryOrderItemMapper.save(deliveryOrderItem); + } + + @Override + public void update(DeliveryOrderItem deliveryOrderItem) { + deliveryOrderItemMapper.update(deliveryOrderItem); + } + + @Override + public void deleteById(Long id) { + deliveryOrderItemMapper.deleteById(id); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/PrinterServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/PrinterServiceImpl.java new file mode 100644 index 0000000..77934d0 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/PrinterServiceImpl.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service.impl; + +import com.tmerclub.cloud.common.cache.constant.DeliveryCacheNames; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.delivery.dto.PrinterDTO; +import com.tmerclub.cloud.delivery.mapper.PrinterMapper; +import com.tmerclub.cloud.delivery.model.Printer; +import com.tmerclub.cloud.delivery.service.PrinterService; +import com.tmerclub.cloud.delivery.vo.PrinterVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +/** + * 打印机 + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +@Service +public class PrinterServiceImpl implements PrinterService { + + @Autowired + private PrinterMapper printerMapper; + + @Override + public PageVO page(PageDTO pageDTO, PrinterDTO printerDTO) { + return PageUtil.doPage(pageDTO, () -> printerMapper.list(printerDTO)); + } + + @Override + public Printer getByPrinterId(Long printerId) { + Integer sysType = AuthUserContext.get().getSysType(); + Printer printer = printerMapper.getByPrinterId(printerId); + if (Objects.isNull(printer)) { + throw new LuckException("打印机信息为空"); + } + if (Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + if (!Objects.equals(printer.getSupplierId(), AuthUserContext.get().getTenantId())) { + throw new LuckException("暂无权限查看该配置"); + } + } else { + if (!Objects.equals(printer.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException("暂无权限查看该配置"); + } + } + return printer; + } + + @Override + public void save(Printer printer) { + checkInfo(printer); + printerMapper.save(printer); + } + + private void checkInfo(Printer printer) { + int count = printerMapper.countByName(printer.getShopId(), printer.getSupplierId(), printer.getPrinterName(), printer.getPrinterId()); + if (count > 0) { + throw new LuckException("设备名称已存在"); + } + } + + @Override + public void update(Printer printer) { + checkInfo(printer); + printerMapper.update(printer); + } + + @Override + public void deleteById(Long printerId) { + printerMapper.deleteById(printerId); + } + + @Override + public void setDefault(Long printerId) { + Printer printer = getByPrinterId(printerId); + if (Objects.isNull(printer)) { + throw new LuckException("设备不存在"); + } + if (Objects.equals(printer.getIsDefault(), 0)) { + // 设为默认 + printerMapper.cancelDefault(printer.getShopId(), printer.getSupplierId()); + } + printerMapper.setDefault(printerId); + } + + @Override + @Cacheable(cacheNames = DeliveryCacheNames.PRINTER_LIST_KEY, key = "#shopId + ':' + #sysType") + public List listByShopId(Long shopId, Integer sysType) { + return printerMapper.listByShopId(shopId, sysType); + } + + @Override + @CacheEvict(cacheNames = DeliveryCacheNames.PRINTER_LIST_KEY, key = "#shopId + ':' + #sysType") + public void removeCache(Long shopId, Integer sysType) {} +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/StationServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/StationServiceImpl.java new file mode 100644 index 0000000..f2034f6 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/StationServiceImpl.java @@ -0,0 +1,527 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.delivery.dto.StationSalesDTO; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.api.product.dto.WarehouseDTO; +import com.tmerclub.cloud.api.product.dto.WarehouseSearchDTO; +import com.tmerclub.cloud.api.product.feign.TakeStockFeignClient; +import com.tmerclub.cloud.api.product.feign.WarehouseFeignClient; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.product.feign.SkuStockFeignClient; +import com.tmerclub.cloud.api.product.feign.StockPointFeignClient; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.constant.StockModeEnum; +import com.tmerclub.cloud.common.order.dto.AreaDTO; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.delivery.bo.StationOrderBO; +import com.tmerclub.cloud.api.delivery.constant.StationStockStatus; +import com.tmerclub.cloud.delivery.dto.OrderStationDTO; +import com.tmerclub.cloud.delivery.dto.StationDTO; +import com.tmerclub.cloud.delivery.mapper.StationMapper; +import com.tmerclub.cloud.delivery.model.Station; +import com.tmerclub.cloud.delivery.service.StationService; +import com.tmerclub.cloud.order.service.AllotOrderService; +import com.tmerclub.cloud.order.service.PurchaseOrderService; +import com.tmerclub.cloud.order.vo.StationDetailVO; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 自提点信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@Service +public class StationServiceImpl implements StationService { + + @Autowired + private StationMapper stationMapper; + @Autowired + private AllotOrderService allotOrderService; + @Lazy + @Autowired + private PurchaseOrderService purchaseOrderService; + @DubboReference + private SearchOrderFeignClient searchOrderFeignClient; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private SkuStockFeignClient skuStockFeignClient; + @DubboReference + private WarehouseFeignClient warehouseFeignClient; + @DubboReference + private StockPointFeignClient stockPointFeignClient; + @DubboReference + private TakeStockFeignClient takeStockFeignClient; + + private static final int TEN = 10; + private static final int TWELVE = 12; + private static final int EIGHTEEN = 18; + private static final int THIRTY = 30; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> stationMapper.list()); + } + + @Override + public PageVO pageStation(PageDTO pageDTO, StationDTO stationDTO) { + PageVO pageVO = PageUtil.doPage(pageDTO, () -> stationMapper.listStation(stationDTO)); + if (pageVO.getList().size() == 0) { + return pageVO; + } + if (Objects.nonNull(stationDTO.getSkuId())) { + List stationIds = pageVO.getList().stream().map(StationVO::getStationId).collect(Collectors.toList()); + Map stockMap = skuStockFeignClient.getStockMapBySkuIdAndStockPointIds(stationDTO.getSkuId(), stationIds).getData(); + for (StationVO stationVO : pageVO.getList()) { + stationVO.setStock(stockMap.containsKey(stationVO.getStationId()) ? stockMap.get(stationVO.getStationId()) : 0); + } + } + return pageVO; + } + + @Override + public StationVO getByStationId(Long stationId) { + return stationMapper.getByStationId(stationId); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public void save(Station station) { + station.setStationId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_STOCK_POINT)); + stationMapper.save(station); + // 创建一个门店仓库 + this.saveStationWarehouse(station); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public void update(Station station) { + // 更新门店仓库 + this.updateStationWarehouse(station); + station.setStockMode(null); + stationMapper.update(station); + } + + @Override + public void deleteById(Long stationId) { + stationMapper.deleteById(stationId); + // 删除仓库 + this.deleteStationWarehouse(stationId); + } + + @Override + public void logicDeleteById(Long stationId) { + stationMapper.logicDeleteById(stationId); + } + + @Override + public List getStationSalesRecord(Long shopId, Long stationId) { + // es订单检索数据准备 + OrderSearchDTO orderSearchDTO = new OrderSearchDTO(); + orderSearchDTO.setStationId(stationId); + orderSearchDTO.setGtePayTime(true); + orderSearchDTO.setStatusList(Arrays.asList( + OrderStatus.PAYED.value(), + OrderStatus.CONSIGNMENT.value(), + OrderStatus.SUCCESS.value(), + OrderStatus.WAIT_GROUP.value()) + ); + Date day = DateUtil.beginOfDay(new Date()); + Date month = DateUtil.beginOfMonth(day); + // 查询"当月"自提门店订单信息 + orderSearchDTO.setPayTime(month); + List esOrders = searchOrderFeignClient.listEsOrder(orderSearchDTO).getData(); + List monthOrders = this.esOrderToStationOrder(esOrders, stationId); + // 通过数据过滤,获取“当日”自提门店订单信息 + List dayOrders = new ArrayList<>(16); + if (!CollectionUtils.isEmpty(monthOrders)) { + monthOrders.sort((o1, o2) -> o2.getPayTime().compareTo(o1.getPayTime())); + for (StationOrderBO order : monthOrders) { + if (order.getPayTime().compareTo(day) < 0) { + break; + } + dayOrders.add(order); + } + } + // 数据统计 + StationSalesDTO daySalesDTO = this.calStationSales(dayOrders); + daySalesDTO.setSalesType(1); + StationSalesDTO monthSalesDTO = this.calStationSales(monthOrders); + monthSalesDTO.setSalesType(2); + return Arrays.asList(daySalesDTO, monthSalesDTO); + } + + /** + * es订单转成自提门店订单 + * + * @return + */ + private List esOrderToStationOrder(List esOrders, Long stationId) { + List stationOrders = new ArrayList<>(Constant.INITIAL_CAPACITY); + StationOrderBO stationOrder; + long prodPrice; + // 遍历转换成门店订单数据 + for (EsOrderVO esOrder : esOrders) { + stationOrder = new StationOrderBO(); + stationOrder.setUserId(esOrder.getUserId()); + stationOrder.setPayTime(esOrder.getPayTime()); + stationOrder.setAmount(0L); + if (CollectionUtils.isEmpty(esOrder.getOrderVirtualInfoList())) { + // 门店自提订单 [收益 = 订单实际金额 + 平台优惠金额] + stationOrder.setAmount(esOrder.getActualTotal() + esOrder.getPlatformAmount()); + } else { + // 虚拟核销订单 [核销单次收益 = (订单实际金额+平台优惠金额) / 订单商品数量] + prodPrice = (long) Arith.div(Arith.add(esOrder.getActualTotal(), esOrder.getPlatformAmount()), esOrder.getAllCount(), 0); + for (OrderVirtualInfoVO orderVirtualInfo : esOrder.getOrderVirtualInfoList()) { + if (Objects.equals(orderVirtualInfo.getStationId(), stationId)) { + stationOrder.setAmount(stationOrder.getAmount() + prodPrice); + } + } + } + stationOrders.add(stationOrder); + } + return stationOrders; + } + + /** + * 统计数据 + * + * @param orders + * @return + */ + private StationSalesDTO calStationSales(List orders) { + StationSalesDTO stationSalesDTO = new StationSalesDTO(); + Set userIds = new HashSet<>(Constant.INITIAL_CAPACITY); + double payAmount = 0.0; + double customerUnitPrice = 0.0; + int orderNum = 0; + if (!CollectionUtils.isEmpty(orders)) { + orderNum += orders.size(); + for (StationOrderBO order : orders) { + userIds.add(order.getUserId()); + payAmount = Arith.add(payAmount, order.getAmount()); + } + customerUnitPrice = Arith.div(payAmount, userIds.size(), 2); + } + // 赋值 + stationSalesDTO.setPayAmount(payAmount); + stationSalesDTO.setPayOrderNumber(orderNum); + stationSalesDTO.setUserNum(userIds.size()); + stationSalesDTO.setCustomerUnitPrice(customerUnitPrice); + return stationSalesDTO; + } + + @Override + public PageVO getStationList(PageDTO page, OrderStationDTO orderStationDTO) { + // 要判断门店是否有库存,所以先查询所有的门店列表 + List shopStationList = stationMapper.listSimpleStation(orderStationDTO.getShopId(), StatusEnum.ENABLE.value()); + // 没有门店,直接返回null + if (CollUtil.isEmpty(shopStationList)) { + PageVO pageVO = new PageVO<>(); + pageVO.setTotal(0L); + pageVO.setPages(0); + return pageVO; + } + + + // 有库存,可以自提的门店id列表 + Set stationSet = stationStockSet(orderStationDTO.getStationSpuList(), shopStationList, orderStationDTO.getShopId()); + // 查询门店列表及计算距离 + List stationList = stationMapper.getStationList(new PageAdapter(page), orderStationDTO); + // 组装门店列表数据 + PageVO stationPage = new PageVO<>(); + stationPage.setTotal((long) shopStationList.size()); + stationPage.setList(stationList); + stationPage.setPages(PageUtil.getPages(stationPage.getTotal(), page.getPageSize())); + // 拆分处理门店列表的数据 + handleStationOrderInfo(stationSet, stationList); + return stationPage; + } + + @Override + public StationVO getStationInfoById(Long stationId) { + return stationMapper.getByStationId(stationId); + } + + @Override + public Double getStationDistance(Long stationId, Double lat, Double lng) { + return stationMapper.getStationDistance(stationId, lat, lng); + } + + @Override + public List listByStationId(List stationIds) { + if (CollUtil.isEmpty(stationIds)) { + return new ArrayList<>(); + } + return stationMapper.getStationListById(stationIds); + } + + @Override + public List listByShopId(Long shopId) { + StationDTO stationDTO = new StationDTO(); + stationDTO.setShopId(shopId); + stationDTO.setStockMode(StockModeEnum.SINGLE_STOCK.value()); + return stationMapper.listStation(stationDTO); + } + + /** + * 创建门店仓库 + * @param station 门店 + */ + private void saveStationWarehouse(Station station) { + WarehouseDTO warehouseDTO = this.buildWarehouseDTO(station); + // warehouseId和stationId一样 + warehouseDTO.setWarehouseId(station.getStationId()); + warehouseFeignClient.insertWarehouseAndArea(warehouseDTO); + } + + /** + * 更新门店仓库 + * @param station 门店 + */ + private void updateStationWarehouse(Station station) { + StationVO dbStation = stationMapper.getByStationId(station.getStationId()); + // "门店名称"或"地址"或"联系电话"更改后才更新仓库数据 + boolean isUpdate = !Objects.equals(dbStation.getStationName(), station.getStationName()) + || !Objects.equals(dbStation.getAreaId(), station.getAreaId()) + || !Objects.equals(dbStation.getMobile(), station.getMobile()); + if (!isUpdate) { + return; + } + if (Objects.nonNull(station.getMobile()) && !PrincipalUtil.isDbPhone(station.getMobile(), dbStation.getMobile(), false)) { + throw new LuckException("请输入正确的手机号"); + } + if (Objects.isNull(station.getMobile()) || station.getMobile().contains(Constant.ASTERISK)) { + station.setMobile(dbStation.getMobile()); + } + WarehouseSearchDTO searchParam = new WarehouseSearchDTO(); + searchParam.setShopId(station.getStationId()); + searchParam.setSysType(SysTypeEnum.STATION.value()); + List warehouses = warehouseFeignClient.listWarehouse(searchParam); + if (CollectionUtils.isEmpty(warehouses)) { + this.saveStationWarehouse(station); + return; + } + WarehouseDTO warehouseDTO = this.buildWarehouseDTO(station); + warehouseDTO.setWarehouseId(warehouses.get(0).getWarehouseId()); + warehouseFeignClient.updateWarehouseAndArea(warehouseDTO); + } + + /** + * 删除门店仓库 + * @param stationId 门店id + */ + private void deleteStationWarehouse(Long stationId) { + WarehouseSearchDTO searchParam = new WarehouseSearchDTO(); + searchParam.setShopId(stationId); + searchParam.setSysType(SysTypeEnum.STATION.value()); + List warehouses = warehouseFeignClient.listWarehouse(searchParam); + if (!CollectionUtils.isEmpty(warehouses)) { + warehouseFeignClient.deleteWarehouseAndArea(warehouses.get(0).getWarehouseId()); + } + } + + /** + * 构建仓库DTO + * @param station 门店 + * @return 仓库dto + */ + private WarehouseDTO buildWarehouseDTO(Station station) { + WarehouseDTO warehouseDTO = new WarehouseDTO(); + BeanUtils.copyProperties(station, warehouseDTO); + warehouseDTO.setShopId(station.getStationId()); + warehouseDTO.setSysType(SysTypeEnum.STATION.value()); + warehouseDTO.setWarehouseName(station.getStationName()); + warehouseDTO.setType(1); + warehouseDTO.setPhone(station.getMobile()); + warehouseDTO.setAddress(station.getAddr()); + List areas = new ArrayList<>(); + areas.add(new AreaDTO(station.getAreaId(), null, null, null)); + warehouseDTO.setCityList(areas); + return warehouseDTO; + } + + @Override + public void switchStationStockMode(Long stationId, Integer type) { + Integer stockMode; + Station station = new Station(); + station.setStationId(stationId); + if (Objects.nonNull(type)) { + stockMode = StockModeEnum.ALL_STOCK.value(); + } else { + stockMode = StockModeEnum.SINGLE_STOCK.value(); + } + station.setStockMode(stockMode); + stationMapper.update(station); + // 更新库存 + skuStockFeignClient.updateStockMode(stationId, stockMode, type); + // 切换成共享库存时,需作废调拨订单,采购订单和实物盘点 + if (Objects.equals(stockMode, StockModeEnum.ALL_STOCK.value())) { + WarehouseSearchDTO warehouseSearchDTO = new WarehouseSearchDTO(); + warehouseSearchDTO.setShopId(stationId); + warehouseSearchDTO.setSysType(SysTypeEnum.STATION.value()); + List warehouseVOS = warehouseFeignClient.listWarehouse(warehouseSearchDTO); + if (CollectionUtils.isEmpty(warehouseVOS)) { + return; + } + Long warehouseId = warehouseVOS.get(0).getWarehouseId(); + // 作废调拨 + allotOrderService.nullifyOrderByWarehouseId(warehouseId); + // 作废采购 + purchaseOrderService.nullifyByWarehouseId(warehouseId); + // 作废实物盘点 + takeStockFeignClient.nullifyByWarehouseId(warehouseId); + } + } + + @Override + public OrderSelfStationVO getOrderStation(UserDeliveryInfoVO userDeliveryInfoVO, List orderStationSpuList) { + OrderStationDTO orderStationDTO = new OrderStationDTO(); + orderStationDTO.setStationId(userDeliveryInfoVO.getStationId()); + OrderSelfStationVO orderSelfStationVO = userDeliveryInfoVO.getOrderSelfStation(); + orderStationDTO.setLat(orderSelfStationVO.getLat()); + orderStationDTO.setLng(orderSelfStationVO.getLng()); + orderStationDTO.setShopId(userDeliveryInfoVO.getDvyTypes().get(0).getShopId()); + + // 要判断门店是否有库存,所以先查询所有的门店列表 + List shopStationList = stationMapper.listSimpleStation(orderStationDTO.getShopId(), StatusEnum.ENABLE.value()); + // 没有门店,直接返回null + if (CollUtil.isEmpty(shopStationList)) { + // 没有门店列表 + orderSelfStationVO.setStationStockStatus(StationStockStatus.NOT_STATION_LIST.getStatus()); + return orderSelfStationVO; + } + Set stationSet = stationStockSet(orderStationSpuList, shopStationList, orderStationDTO.getShopId()); + + + // 有门店,但所有门店的库存数量都不足时,返回一个状态为库存不足的门店,代表当前区域库存不足 + if (CollUtil.isEmpty(stationSet)) { + // 门店没有库存 + orderSelfStationVO.setStationStockStatus(StationStockStatus.NOT_STOCK.getStatus()); + return orderSelfStationVO; + } + // 存在库存充足的门店 + orderStationDTO.setStationIds(new ArrayList<>(stationSet)); + List stationList = stationMapper.getStationList(new PageAdapter(1,1), orderStationDTO); + if (CollUtil.isEmpty(stationList)) { + // 门店没有库存 + orderSelfStationVO.setStationStockStatus(StationStockStatus.NOT_STOCK.getStatus()); + return orderSelfStationVO; + } + StationDetailVO stationDetailVO = stationList.get(0); + orderSelfStationVO.setStationId(stationDetailVO.getStationId()); + orderSelfStationVO.setStationName(stationDetailVO.getStationName()); + orderSelfStationVO.setStationImgUrl(stationDetailVO.getImgUrl()); + return orderSelfStationVO; + } + + private static void handleStationOrderInfo(Set stationSet, List stationList) { + for (StationDetailVO stationParam : stationList) { + double distance = 0L; + if (Objects.nonNull(stationParam.getDistance())) { + distance = stationParam.getDistance(); + } + stationParam.setDistance(distance); + String timeDate = stationParam.getTimeInfo(); + StationDetailVO.TimeInfoModeVO timeInfoModeVO = Json.parseObject(timeDate, StationDetailVO.TimeInfoModeVO.class); + Long[] shopTime = timeInfoModeVO.getShopTime(); + String startTime = DateUtil.format(new Date(shopTime[0]), "HH:mm"); + String endTime = DateUtil.format(new Date(shopTime[1]), "HH:mm"); + stationParam.setBusiness(startTime + "-" + endTime); + // 自提门店的库存是否充足 + stationParam.setHasStock(stationSet.contains(stationParam.getStationId()) ? 1 : 0); + } + } + + private Set stationStockSet(List orderStationSpuList, List shopStationList, Long shopId) { + // 库存模式是共享总部库存, 或者包含虚拟商品,需要查询默认库存 + List warehousedList = warehouseFeignClient.listWarehouseByShopId(shopId, SysTypeEnum.MULTISHOP.value()); + long defaultStockPointId = warehousedList.get(0).getWarehouseId(); + List stockPointSkuVOList = new ArrayList<>(orderStationSpuList.size() * shopStationList.size()); + for (OrderStationSpuDTO orderStationSpuDTO : orderStationSpuList) { + // 商品类别是虚拟商品,使用默认库存 + if (Objects.equals(orderStationSpuDTO.getSpuMold(), SpuMold.VIRTUAL.value())) { + stockPointSkuVOList.add(new StockPointSkuVO(orderStationSpuDTO.getSkuId(), defaultStockPointId)); + continue; + } + for (StationDetailVO stationDetailVO : shopStationList) { + if (Objects.equals(stationDetailVO.getStockMode(), StockModeEnum.ALL_STOCK.value())) { + stockPointSkuVOList.add(new StockPointSkuVO(orderStationSpuDTO.getSkuId(), defaultStockPointId)); + } else { + stockPointSkuVOList.add(new StockPointSkuVO(orderStationSpuDTO.getSkuId(), stationDetailVO.getStationId())); + } + } + } + ServerResponseEntity> stockServerResponseEntity = skuStockFeignClient.mapSkuPointStockByStockPoints(stockPointSkuVOList); + if (!stockServerResponseEntity.isSuccess()) { + throw new LuckException(stockServerResponseEntity.getMsg()); + } + Map stockMap = stockServerResponseEntity.getData(); + // 有库存,可以自提的门店id列表 + Set stationSet = new HashSet<>(shopStationList.size()); + for (StationDetailVO stationDetailVO : shopStationList) { + // 判断门店库存是否充足 + if (!checkStationStock(orderStationSpuList, defaultStockPointId, stockMap, stationDetailVO)) { + continue; + } + stationSet.add(stationDetailVO.getStationId()); + } + return stationSet; + } + + + private static boolean checkStationStock(List orderStationSpuList, long defaultStockPointId, Map stockMap, StationDetailVO stationParam) { + for (OrderStationSpuDTO orderStationSpuDTO : orderStationSpuList) { + long pointId = defaultStockPointId; + // 独立仓库并且不是虚拟商品,才能使用门店库存 + if (Objects.equals(stationParam.getStockMode(), StockModeEnum.SINGLE_STOCK.value()) && !Objects.equals(orderStationSpuDTO.getSpuMold(), SpuMold.VIRTUAL.value())) { + pointId = stationParam.getStationId(); + } + SkuStockVO skuStockVO = stockMap.get(orderStationSpuDTO.getSkuId() + Constant.UNDERLINE + pointId); + if (skuStockVO.getStock() < orderStationSpuDTO.getCount()) { + return false; + } + } + return true; + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TransportServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TransportServiceImpl.java new file mode 100644 index 0000000..29d25a2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TransportServiceImpl.java @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.delivery.vo.ShopTransportVO; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.cache.constant.DeliveryCacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.TransfeeFreeVO; +import com.tmerclub.cloud.common.order.vo.TransfeeVO; +import com.tmerclub.cloud.common.order.vo.TransportVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.order.dto.AreaDTO; +import com.tmerclub.cloud.delivery.dto.TransfeeDTO; +import com.tmerclub.cloud.delivery.dto.TransfeeFreeDTO; +import com.tmerclub.cloud.delivery.dto.TransportDTO; +import com.tmerclub.cloud.delivery.mapper.*; +import com.tmerclub.cloud.delivery.model.Transcity; +import com.tmerclub.cloud.delivery.model.TranscityFree; +import com.tmerclub.cloud.delivery.model.Transport; +import com.tmerclub.cloud.delivery.service.TransportService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 运费模板 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@Service +public class TransportServiceImpl implements TransportService { + + @Autowired + private TransportMapper transportMapper; + + + @Autowired + private TranscityFreeMapper transcityFreeMapper; + + @Autowired + private TransfeeMapper transfeeMapper; + + @Autowired + private TranscityMapper transcityMapper; + + @Autowired + private TransfeeFreeMapper transfeeFreeMapper; + + @DubboReference + private SpuFeignClient spuFeignClient; + + + @Override + public PageVO page(PageDTO pageDTO, TransportDTO transportDTO) { + return PageUtil.doPage(pageDTO, () -> transportMapper.list(transportDTO)); + } + + + @Override + @Cacheable(cacheNames = DeliveryCacheNames.TRANSPORT_BY_ID_PREFIX, key = "#transportId", sync = true) + public TransportVO getTransportAndAllItemsById(Long transportId) { + TransportVO transport = transportMapper.getTransportAndTransfeeAndTranscityById(transportId); + if (transport == null) { + return null; + } + List transFeeFrees = transportMapper.getTransFeeFreeAndTransCityFreeByTransportId(transportId); + transport.setTransFeeFrees(transFeeFrees); + return transport; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertTransportAndTransFee(TransportDTO transportDTO) { + this.checkIsRepeat(transportDTO); + Transport transport = BeanUtil.map(transportDTO, Transport.class); + Date createTime = new Date(); + transport.setCreateTime(createTime); + // 插入运费模板 + transportMapper.save(transport); + // 插入所有的运费项和城市 + insertTransFeeAndTransCity(transport.getTransportId(), transportDTO.getTransFees()); + + // 插入所有的指定包邮条件项和城市 + if (transport.getHasFreeCondition() == 1) { + insertTransFeeFreeAndTransCityFree(transport.getTransportId(), transportDTO.getTransFeeFrees()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = DeliveryCacheNames.TRANSPORT_BY_ID_PREFIX, key = "#transportDTO.transportId") + public void updateTransportAndTransFee(TransportDTO transportDTO) { + TransportVO transportDb = transportMapper.getTransportAndTransfeeAndTranscityById(transportDTO.getTransportId()); + this.checkIsRepeat(transportDTO); + if (!Objects.equals(transportDb.getShopId(), transportDTO.getShopId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + + Transport transport = BeanUtil.map(transportDTO, Transport.class); + // 更新运费模板 + transportMapper.updateById(transport); + + deleteTransportById(transportDTO.getTransportId()); + + // 插入所有的运费项和城市 + insertTransFeeAndTransCity(transport.getTransportId(), transportDTO.getTransFees()); + // 插入所有的指定包邮条件项和城市 + if (transport.getHasFreeCondition() == 1) { + insertTransFeeFreeAndTransCityFree(transport.getTransportId(), transportDTO.getTransFeeFrees()); + } + } + + private void checkIsRepeat(TransportDTO transportDTO) { + int count = transportMapper.countByTransName(transportDTO.getShopId(), transportDTO.getTransName(), transportDTO.getSysType(), transportDTO.getTransportId()); + if (count > 0) { + throw new LuckException("运费模板名称已存在,请重新输入"); + } + // 查询是否已经存在包邮模板,一个店铺只能有一个包邮模板 + if (transportDTO.getIsFreeFee() == 1) { + int freeCount = transportMapper.countByFreeAndShopId(transportDTO.getIsFreeFee(), transportDTO.getShopId(), transportDTO.getSysType(), transportDTO.getTransportId()); + if (freeCount > 0) { + throw new LuckException("已包含包邮模板,不能重复创建"); + } + } + } + + private void deleteTransportById(Long transportId) { + TransportVO dbTransport = getTransportAndAllItemsById(transportId); + // 删除所有的运费项 + transfeeMapper.deleteByTransportId(dbTransport.getTransportId()); + // 删除所有的指定包邮条件项 + transfeeFreeMapper.deleteTransFeeFreesByTransportId(dbTransport.getTransportId()); + + List transFeeIds = dbTransport.getTransFees().stream().map(TransfeeVO::getTransfeeId).collect(Collectors.toList()); + List transFeeFreeIds = dbTransport.getTransFeeFrees().stream().map(TransfeeFreeVO::getTransfeeFreeId).collect(Collectors.toList()); + + + // 删除所有运费项包含的城市 + transcityMapper.deleteBatchByTransFeeIds(transFeeIds); + if (CollectionUtil.isNotEmpty(transFeeFreeIds)) { + // 删除所有指定包邮条件项包含的城市 + transcityFreeMapper.deleteBatchByTransFeeFreeIds(transFeeFreeIds); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteTransportAndTransFeeAndTransCityById(Long transportId) { + int count = spuFeignClient.countByTransportId(transportId).getData(); + if (count > 0) { + TransportVO dbTransport = getTransportAndAllItemsById(transportId); + throw new LuckException("模板" + dbTransport.getTransName() + "正在使用中,无法进行删除操作"); + } + deleteTransportById(transportId); + + // 删除运费模板 + transportMapper.deleteById(transportId); + + } + + private void insertTransFeeAndTransCity(Long transportId, List transFeeList) { + for (TransfeeDTO transfeeDTO : transFeeList) { + transfeeDTO.setTransportId(transportId); + } + // 批量插入运费项 并返回运费项id,供下面循环使用 + transfeeMapper.saveBatch(transFeeList); + List transCities = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (TransfeeDTO transFee : transFeeList) { + List cityList = transFee.getCityList(); + if (CollectionUtil.isEmpty(cityList)) { + continue; + } + // 当地址不为空时 + for (AreaDTO area : cityList) { + Transcity transcity = new Transcity(); + transcity.setTransfeeId(transFee.getTransfeeId()); + transcity.setCityId(area.getAreaId()); + transCities.add(transcity); + } + } + + // 批量插入运费项中的城市 + if (CollectionUtil.isNotEmpty(transCities)) { + transcityMapper.saveBatch(transCities); + } + } + + private void insertTransFeeFreeAndTransCityFree(Long transportId, List transFeeFrees) { + if (CollUtil.isEmpty(transFeeFrees)) { + return; + } + for (TransfeeFreeDTO transFeeFree : transFeeFrees) { + transFeeFree.setTransportId(transportId); + } + // 批量插入指定包邮条件项 并返回指定包邮条件项 id,供下面循环使用 + transfeeFreeMapper.saveBatch(transFeeFrees); + + List transCityFrees = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (TransfeeFreeDTO transFeeFree : transFeeFrees) { + List cityList = transFeeFree.getFreeCityList(); + if (CollectionUtil.isEmpty(cityList)) { + // 请选择指定包邮城市 + throw new LuckException("请选择指定包邮城市"); + } + // 当地址不为空时 + for (AreaDTO area : cityList) { + TranscityFree transcityFree = new TranscityFree(); + transcityFree.setTransfeeFreeId(transFeeFree.getTransfeeFreeId()); + transcityFree.setFreeCityId(area.getAreaId()); + transCityFrees.add(transcityFree); + } + } + + // 批量插入指定包邮条件项中的城市 + if (CollectionUtil.isNotEmpty(transCityFrees)) { + transcityFreeMapper.saveBatch(transCityFrees); + } + } + + @Override + @CacheEvict(cacheNames = DeliveryCacheNames.TRANSPORT_BY_ID_PREFIX, key = "#transportId") + public void removeTransportAndAllItemsCache(Long transportId) { + + } + + @Override + public List listTransport(Long tenantId) { + Integer sysType = AuthUserContext.get().getSysType(); + return transportMapper.listTransport(tenantId, sysType); + } + + @Override + public List listTransportByIds(List ids) { + return transportMapper.listTransportByIds(ids); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/DeliveryCompanyVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/DeliveryCompanyVO.java new file mode 100644 index 0000000..87098c1 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/DeliveryCompanyVO.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 物流公司VO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public class DeliveryCompanyVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "ID") + private Long deliveryCompanyId; + + @Schema(description = "物流公司名称") + private String name; + + @Schema(description = "公司主页") + private String homeUrl; + + @Schema(description = "物流公司编号(阿里)") + private String aliNo; + + @Schema(description = "物流公司编号(快递鸟)") + private String birdNo; + + @Schema(description = "物流公司编号(快递100)") + private String hundredNo; + + @Schema(description = "物流公司编号(其他不知名公司)") + private String otherNo; + + public Long getDeliveryCompanyId() { + return deliveryCompanyId; + } + + public void setDeliveryCompanyId(Long deliveryCompanyId) { + this.deliveryCompanyId = deliveryCompanyId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHomeUrl() { + return homeUrl; + } + + public void setHomeUrl(String homeUrl) { + this.homeUrl = homeUrl; + } + + public String getAliNo() { + return aliNo; + } + + public void setAliNo(String aliNo) { + this.aliNo = aliNo; + } + + public String getBirdNo() { + return birdNo; + } + + public void setBirdNo(String birdNo) { + this.birdNo = birdNo; + } + + public String getHundredNo() { + return hundredNo; + } + + public void setHundredNo(String hundredNo) { + this.hundredNo = hundredNo; + } + + public String getOtherNo() { + return otherNo; + } + + public void setOtherNo(String otherNo) { + this.otherNo = otherNo; + } + + @Override + public String toString() { + return "DeliveryCompanyVO{" + + "deliveryCompanyId=" + deliveryCompanyId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",name=" + name + + ",homeUrl=" + homeUrl + + ",aliNo=" + aliNo + + ",birdNo=" + birdNo + + ",hundredNo=" + hundredNo + + ",otherNo=" + otherNo + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/DeliveryOrderItemVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/DeliveryOrderItemVO.java new file mode 100644 index 0000000..607162c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/DeliveryOrderItemVO.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 物流订单项信息VO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public class DeliveryOrderItemVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long id; + + @Schema(description = "订单物流包裹id") + private Long deliveryOrderId; + + @Schema(description = "商品图片") + private String imgUrl; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品数量") + private Integer count; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeliveryOrderId() { + return deliveryOrderId; + } + + public void setDeliveryOrderId(Long deliveryOrderId) { + this.deliveryOrderId = deliveryOrderId; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "DeliveryOrderItemVO{" + + "id=" + id + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",deliveryOrderId=" + deliveryOrderId + + ",imgUrl=" + imgUrl + + ",spuName=" + spuName + + ",count=" + count + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/OutletConfigAddrVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/OutletConfigAddrVO.java new file mode 100644 index 0000000..12e508b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/OutletConfigAddrVO.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @author TRACK + */ +public class OutletConfigAddrVO { + + @Schema(description = "完整地址") + private String printAddr; + + @Schema(description = "网点配置id") + private Long outletConfigId; + + @Schema(description = "是否默认") + private Integer isDefault; + + public String getPrintAddr() { + return printAddr; + } + + public void setPrintAddr(String printAddr) { + this.printAddr = printAddr; + } + + public Long getOutletConfigId() { + return outletConfigId; + } + + public void setOutletConfigId(Long outletConfigId) { + this.outletConfigId = outletConfigId; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + @Override + public String toString() { + return "OutletConfigAddrVO{" + + ", printAddr='" + printAddr + '\'' + + ", outletConfigId=" + outletConfigId + + ", isDefault=" + isDefault + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/OutletConfigInfoVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/OutletConfigInfoVO.java new file mode 100644 index 0000000..b0a7ad2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/OutletConfigInfoVO.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.List; + +/** + * @author TRACK + */ +public class OutletConfigInfoVO { + + @Schema(description = "快递公司类型") + private Integer deliveryCompanyType; + + @Schema(description = "快递公司名称") + private String deliveryCompanyName; + + @Schema(description = "是否配置 0否1是") + private Integer isConfig; + + @Schema(description = "是否默认 0否1是") + private Integer isDefault; + + @Schema(description = "商家地址列表") + private List shopAddrList; + + public Integer getDeliveryCompanyType() { + return deliveryCompanyType; + } + + public void setDeliveryCompanyType(Integer deliveryCompanyType) { + this.deliveryCompanyType = deliveryCompanyType; + } + + public String getDeliveryCompanyName() { + return deliveryCompanyName; + } + + public void setDeliveryCompanyName(String deliveryCompanyName) { + this.deliveryCompanyName = deliveryCompanyName; + } + + public Integer getIsConfig() { + return isConfig; + } + + public void setIsConfig(Integer isConfig) { + this.isConfig = isConfig; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public List getShopAddrList() { + return shopAddrList; + } + + public void setShopAddrList(List shopAddrList) { + this.shopAddrList = shopAddrList; + } + + @Override + public String toString() { + return "OutletConfigInfoVO{" + + "deliveryCompanyType=" + deliveryCompanyType + + ", deliveryCompanyName='" + deliveryCompanyName + '\'' + + ", isConfig=" + isConfig + + ", isDefault=" + isDefault + + ", shopAddrList=" + shopAddrList + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/TranscityFreeVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/TranscityFreeVO.java new file mode 100644 index 0000000..e8f3e29 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/TranscityFreeVO.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 指定条件包邮城市项VO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class TranscityFreeVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "指定条件包邮城市项id") + private Long transcityFreeId; + + @Schema(description = "指定条件包邮项id") + private Long transfeeFreeId; + + @Schema(description = "城市id") + private Long freeCityId; + + public Long getTranscityFreeId() { + return transcityFreeId; + } + + public void setTranscityFreeId(Long transcityFreeId) { + this.transcityFreeId = transcityFreeId; + } + + public Long getTransfeeFreeId() { + return transfeeFreeId; + } + + public void setTransfeeFreeId(Long transfeeFreeId) { + this.transfeeFreeId = transfeeFreeId; + } + + public Long getFreeCityId() { + return freeCityId; + } + + public void setFreeCityId(Long freeCityId) { + this.freeCityId = freeCityId; + } + + @Override + public String toString() { + return "TranscityFreeVO{" + + "transcityFreeId=" + transcityFreeId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",transfeeFreeId=" + transfeeFreeId + + ",freeCityId=" + freeCityId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/TranscityVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/TranscityVO.java new file mode 100644 index 0000000..511de64 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/TranscityVO.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 运费项和运费城市关联信息VO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class TranscityVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long transcityId; + + @Schema(description = "运费项id") + private Long transfeeId; + + @Schema(description = "城市id") + private Long cityId; + + public Long getTranscityId() { + return transcityId; + } + + public void setTranscityId(Long transcityId) { + this.transcityId = transcityId; + } + + public Long getTransfeeId() { + return transfeeId; + } + + public void setTransfeeId(Long transfeeId) { + this.transfeeId = transfeeId; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + @Override + public String toString() { + return "TranscityVO{" + + "transcityId=" + transcityId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",transfeeId=" + transfeeId + + ",cityId=" + cityId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/OrderVirtualInfoLogBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/OrderVirtualInfoLogBO.java new file mode 100644 index 0000000..02e01a9 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/OrderVirtualInfoLogBO.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 虚拟订单核销记录 + * + * @author TRACK + */ +public class OrderVirtualInfoLogBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "核销日志id") + private Long orderVirutalInfoLogId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "订单号") + private Long orderId; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "自提点id") + private Long stationId; + + @Schema(description = "核销门店") + private String stationName; + + @Schema(description = "核销码") + private String writeOffCode; + + @Schema(description = "是否核销 1.已核销 0.未核销") + private Integer isWriteOff; + + @Schema(description = "核销时间是否过期 1是 0 否") + private Integer isExpired; + + public Long getOrderVirutalInfoLogId() { + return orderVirutalInfoLogId; + } + + public void setOrderVirutalInfoLogId(Long orderVirutalInfoLogId) { + this.orderVirutalInfoLogId = orderVirutalInfoLogId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + public String getWriteOffCode() { + return writeOffCode; + } + + public void setWriteOffCode(String writeOffCode) { + this.writeOffCode = writeOffCode; + } + + public Integer getIsWriteOff() { + return isWriteOff; + } + + public void setIsWriteOff(Integer isWriteOff) { + this.isWriteOff = isWriteOff; + } + + public Integer getIsExpired() { + return isExpired; + } + + public void setIsExpired(Integer isExpired) { + this.isExpired = isExpired; + } + + @Override + public String toString() { + return "OrderVirtualInfoLogBO{" + + "orderVirutalInfoLogId=" + orderVirutalInfoLogId + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", createTime=" + createTime + + ", stationId=" + stationId + + ", stationName='" + stationName + '\'' + + ", writeOffCode='" + writeOffCode + '\'' + + ", isWriteOff=" + isWriteOff + + ", isExpired=" + isExpired + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/SubmitOrderPayAmountInfoBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/SubmitOrderPayAmountInfoBO.java new file mode 100644 index 0000000..93448b7 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/SubmitOrderPayAmountInfoBO.java @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author FrozenWatermelon + * @date 2021/2/4 + */ +public class SubmitOrderPayAmountInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "总共需要支付金额") + private Long totalFee; + + @Schema(description = "总共需要支付定金") + private Long depositAmount; + + @Schema(description = "总共需要支付尾款") + private Long balanceAmount; + + @Schema(description = "运费") + private Long freightAmount; + + @Schema(description = "平台减免运费金额") + private Long platformFreeFreightAmount; + + @Schema(description = "总共需要支付积分(积分抵扣金额)") + private Long totalScore; + + @Schema(description = "总共需要支付积分数量") + private Long orderScore; + + @Schema(description = "订单类型") + private Integer orderType; + + @Schema(description = "订单类型") + private Integer preSaleType; + + @Schema(description = "定金预售支付状态 1.已支付定金 2.已支付尾款") + private Integer preSalePayStatus; + + @Schema(description = "订单地址id") + private Long orderAddrId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "尾款支付开始时间") + private Date balanceStartTime; + + @Schema(description = "尾款支付开始时间") + private Date balanceEndTime; + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Date getBalanceStartTime() { + return balanceStartTime; + } + + public void setBalanceStartTime(Date balanceStartTime) { + this.balanceStartTime = balanceStartTime; + } + + public Date getBalanceEndTime() { + return balanceEndTime; + } + + public void setBalanceEndTime(Date balanceEndTime) { + this.balanceEndTime = balanceEndTime; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Integer getPreSalePayStatus() { + return preSalePayStatus; + } + + public void setPreSalePayStatus(Integer preSalePayStatus) { + this.preSalePayStatus = preSalePayStatus; + } + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getTotalFee() { + return totalFee; + } + + public void setTotalFee(Long totalFee) { + this.totalFee = totalFee; + } + + public Long getTotalScore() { + return totalScore; + } + + public void setTotalScore(Long totalScore) { + this.totalScore = totalScore; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Long getOrderAddrId() { + return orderAddrId; + } + + public void setOrderAddrId(Long orderAddrId) { + this.orderAddrId = orderAddrId; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "SubmitOrderPayAmountInfoBO{" + + "createTime=" + createTime + + ", totalFee=" + totalFee + + ", depositAmount=" + depositAmount + + ", balanceAmount=" + balanceAmount + + ", freightAmount=" + freightAmount + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", totalScore=" + totalScore + + ", orderScore=" + orderScore + + ", orderType=" + orderType + + ", preSaleType=" + preSaleType + + ", preSalePayStatus=" + preSalePayStatus + + ", orderAddrId=" + orderAddrId + + ", userId=" + userId + + ", balanceStartTime=" + balanceStartTime + + ", balanceEndTime=" + balanceEndTime + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoAllotOrderBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoAllotOrderBO.java new file mode 100644 index 0000000..88fc99a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoAllotOrderBO.java @@ -0,0 +1,257 @@ +package com.tmerclub.cloud.order.bo.mongo; + +import com.tmerclub.cloud.order.constant.AllotOrderStatusEnum; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author gaozijie + * @since 2023-11-24 + */ +@Document("allot_order") +public class MongoAllotOrderBO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 调拨订单id + */ + @Id + private Long allotOrderId; + + /** + * 调出点仓库id + */ + private Long outWarehouseId; + + /** + * 调出点库存点类型 + * @see com.tmerclub.cloud.common.product.constant.StockPointType + */ + private Integer outStockPointType; + + /** + * 调入点仓库id + */ + private Long inWarehouseId; + + /** + * 调入点库存点类型 + * @see com.tmerclub.cloud.common.product.constant.StockPointType + */ + private Integer inStockPointType; + + /** + * 物流公司id + */ + private Long dvyCompanyId; + + /** + * 物流方式 + * @see com.tmerclub.cloud.common.order.constant.DeliveryType + */ + private Integer dvyType; + + /** + * 物流单号 + */ + private String dvyOrderNumber; + + /** + * 状态 + * @see AllotOrderStatusEnum + */ + private Integer status; + + /** + * 总调拨数量 + */ + private Integer totalAllotCount; + + /** + * 备注 + */ + private String remark; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 系统类型 + * @see com.tmerclub.cloud.common.constant.SysTypeEnum + */ + private Integer sysType; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 调拨订单订单项 + */ + private List allotOrderItemBOList; + + public Long getAllotOrderId() { + return allotOrderId; + } + + public void setAllotOrderId(Long allotOrderId) { + this.allotOrderId = allotOrderId; + } + + public Long getOutWarehouseId() { + return outWarehouseId; + } + + public void setOutWarehouseId(Long outWarehouseId) { + this.outWarehouseId = outWarehouseId; + } + + public Integer getOutStockPointType() { + return outStockPointType; + } + + public void setOutStockPointType(Integer outStockPointType) { + this.outStockPointType = outStockPointType; + } + + public Long getInWarehouseId() { + return inWarehouseId; + } + + public void setInWarehouseId(Long inWarehouseId) { + this.inWarehouseId = inWarehouseId; + } + + public Integer getInStockPointType() { + return inStockPointType; + } + + public void setInStockPointType(Integer inStockPointType) { + this.inStockPointType = inStockPointType; + } + + public Long getDvyCompanyId() { + return dvyCompanyId; + } + + public void setDvyCompanyId(Long dvyCompanyId) { + this.dvyCompanyId = dvyCompanyId; + } + + public Integer getDvyType() { + return dvyType; + } + + public void setDvyType(Integer dvyType) { + this.dvyType = dvyType; + } + + public String getDvyOrderNumber() { + return dvyOrderNumber; + } + + public void setDvyOrderNumber(String dvyOrderNumber) { + this.dvyOrderNumber = dvyOrderNumber; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getTotalAllotCount() { + return totalAllotCount; + } + + public void setTotalAllotCount(Integer totalAllotCount) { + this.totalAllotCount = totalAllotCount; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public List getAllotOrderItemBOList() { + return allotOrderItemBOList; + } + + public void setAllotOrderItemBOList(List allotOrderItemBOList) { + this.allotOrderItemBOList = allotOrderItemBOList; + } + + @Override + public String toString() { + return "MongoAllotOrderBO{" + + "allotOrderId=" + allotOrderId + + ", outWarehouseId=" + outWarehouseId + + ", outStockPointType=" + outStockPointType + + ", inWarehouseId=" + inWarehouseId + + ", inStockPointType=" + inStockPointType + + ", dvyCompanyId=" + dvyCompanyId + + ", dvyType=" + dvyType + + ", dvyOrderNumber='" + dvyOrderNumber + '\'' + + ", status=" + status + + ", totalAllotCount=" + totalAllotCount + + ", remark='" + remark + '\'' + + ", shopId=" + shopId + + ", sysType=" + sysType + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", allotOrderItemBOList=" + allotOrderItemBOList + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoOrderVirtualInfoLogBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoOrderVirtualInfoLogBO.java new file mode 100644 index 0000000..2aeb737 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoOrderVirtualInfoLogBO.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.bo.mongo; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 虚拟订单核销记录 + * + * @author TRACK + */ +@CompoundIndexes({ + @CompoundIndex(name = "order_idx", def = "{'orderId':1}"), + @CompoundIndex(name = "shop_idx", def = "{'shopId':1}"), + @CompoundIndex(name = "station_idx", def = "{'stationId':1}") +}) +@Document("order_virtual_info_log") +public class MongoOrderVirtualInfoLogBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 核销日志id + */ + @Id + private Long orderVirutalInfoLogId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 订单号 + */ + private Long orderId; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 自提点id + */ + private Long stationId; + + /** + * 核销码 + */ + private String writeOffCode; + + public MongoOrderVirtualInfoLogBO() { + } + + public Long getOrderVirutalInfoLogId() { + return orderVirutalInfoLogId; + } + + public void setOrderVirutalInfoLogId(Long orderVirutalInfoLogId) { + this.orderVirutalInfoLogId = orderVirutalInfoLogId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getWriteOffCode() { + return writeOffCode; + } + + public void setWriteOffCode(String writeOffCode) { + this.writeOffCode = writeOffCode; + } + + @Override + public String toString() { + return "MongoOrderVirtualInfoLogBO{" + + "orderVirutalInfoLogId=" + orderVirutalInfoLogId + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", createTime=" + createTime + + ", stationId=" + stationId + + ", writeOffCode='" + writeOffCode + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoPurchaseOrderBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoPurchaseOrderBO.java new file mode 100644 index 0000000..091cf6e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoPurchaseOrderBO.java @@ -0,0 +1,418 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.bo.mongo; + +import com.tmerclub.cloud.order.model.PurchaseOrderLang; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 采购订单信息 + * + * @author YXF + * @date 20222-09-20 + */ +@CompoundIndexes({ + @CompoundIndex(name = "shop_idx", def = "{'shopId':1}"), + @CompoundIndex(name = "supplier_idx", def = "{'supplierId':1}") +}) +@Document("purchase_order") +public class MongoPurchaseOrderBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 采购id + */ + @Id + private Long purchaseOrderId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 订单创建时间 + */ + private Date createTime; + + /** + * 订单更新时间 + */ + private Date updateTime; + + /** + * 送达时间 + */ + private Date deliverTime; + + /** + * 发货时间 + */ + private Date deliveryTime; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 供应商名称 + */ + private String supplierName; + + /** + * 总采购金额 + */ + private Double totalAmount; + + /** + * 总采购库存数量 + */ + private Integer totalStock; + + /** + * 实际总库存数量 + */ + private Integer actualTotalStock; + + /** + * 采购订单地址id + */ + private Long purchaseOrderAddrId; + + /** + * 状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成 + */ + private Integer status; + + /** + * 备注 + */ + private String remark; + + /** + * 操作员工id + */ + private Long employeeId; + + /** + * 配送类型 1:快递 2:自提 3:无需快递 4同城配送 + */ + private Integer deliveryType; + + /** + * 收货人姓名 + */ + private String consignee; + + /** + * 收货人手机号 + */ + private String mobile; + + /** + * 商品中文名称 + */ + private String spuNameZh; + + /** + * 商品英文名称 + */ + private String spuNameEn; + + /** + * 付款凭证图片 多个图片逗号分隔 + */ + private String voucherImgUrls; + + /** + * 仓库id + */ + private Long warehouseId; + + /** + * 库存点类型 + */ + private Integer stockPointType; + + /** + * 供应商仓库id + */ + private Long supplierWarehouseId; + + @Schema(description = "采购订单项列表") + private List purchaseOrderItems; + + @Schema(description = "采购订单项列表") + private List purchaseOrderLangs; + + public Long getPurchaseOrderAddrId() { + return purchaseOrderAddrId; + } + + public void setPurchaseOrderAddrId(Long purchaseOrderAddrId) { + this.purchaseOrderAddrId = purchaseOrderAddrId; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getDeliverTime() { + return deliverTime; + } + + public void setDeliverTime(Date deliverTime) { + this.deliverTime = deliverTime; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Double getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Double totalAmount) { + this.totalAmount = totalAmount; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getActualTotalStock() { + return actualTotalStock; + } + + public void setActualTotalStock(Integer actualTotalStock) { + this.actualTotalStock = actualTotalStock; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public List getPurchaseOrderItems() { + return purchaseOrderItems; + } + + public void setPurchaseOrderItems(List purchaseOrderItems) { + this.purchaseOrderItems = purchaseOrderItems; + } + + public List getPurchaseOrderLangs() { + return purchaseOrderLangs; + } + + public void setPurchaseOrderLangs(List purchaseOrderLangs) { + this.purchaseOrderLangs = purchaseOrderLangs; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getSpuNameZh() { + return spuNameZh; + } + + public void setSpuNameZh(String spuNameZh) { + this.spuNameZh = spuNameZh; + } + + public String getSpuNameEn() { + return spuNameEn; + } + + public void setSpuNameEn(String spuNameEn) { + this.spuNameEn = spuNameEn; + } + + public String getVoucherImgUrls() { + return voucherImgUrls; + } + + public void setVoucherImgUrls(String voucherImgUrls) { + this.voucherImgUrls = voucherImgUrls; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Long getSupplierWarehouseId() { + return supplierWarehouseId; + } + + public void setSupplierWarehouseId(Long supplierWarehouseId) { + this.supplierWarehouseId = supplierWarehouseId; + } + + @Override + public String toString() { + return "MongoPurchaseOrderBO{" + + "purchaseOrderId=" + purchaseOrderId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", deliverTime=" + deliverTime + + ", deliveryTime=" + deliveryTime + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", totalAmount=" + totalAmount + + ", totalStock=" + totalStock + + ", actualTotalStock=" + actualTotalStock + + ", purchaseOrderAddrId=" + purchaseOrderAddrId + + ", status=" + status + + ", remark='" + remark + '\'' + + ", employeeId=" + employeeId + + ", deliveryType=" + deliveryType + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", spuNameZh='" + spuNameZh + '\'' + + ", spuNameEn='" + spuNameEn + '\'' + + ", voucherImgUrls='" + voucherImgUrls + '\'' + + ", warehouseId=" + warehouseId + + ", stockPointType=" + stockPointType + + ", supplierWarehouseId=" + supplierWarehouseId + + ", purchaseOrderItems=" + purchaseOrderItems + + ", purchaseOrderLangs=" + purchaseOrderLangs + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoPurchaseOrderItemBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoPurchaseOrderItemBO.java new file mode 100644 index 0000000..6f57b9c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoPurchaseOrderItemBO.java @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.bo.mongo; + +import com.tmerclub.cloud.order.model.PurchaseOrderItemLang; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 采购商品 + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public class MongoPurchaseOrderItemBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long purchaseItemId; + + /** + * 商品id + */ + private Long spuId; + + /** + * sku id + */ + private Long skuId; + + /** + * 采购金额 + */ + private Long purchaseAmount; + + /** + * 采购价 + */ + private Long purchasePrice; + + /** + * 采购库存数量 + */ + private Integer purchaseStock; + + /** + * 实际库存数量 + */ + private Integer actualStock; + /** + * 实际库存数量 + */ + private Integer deliveryType; + + /** + * 状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成 + */ + private Integer status; + + /** + * 商品编码 + */ + private String spuCode; + + /** + * sku编码 + */ + private String partyCode; + + /** + * 商品图片 + */ + private String pic; + + /** + * 待发货数量 + */ + private Integer beDeliveredNum; + + /** + * 商品中文名称 + */ + private String spuNameZh; + + /** + * 商品英文名称 + */ + private String spuNameEn; + + /** + * sku中文名称 + */ + private String skuNameZh; + + /** + * sku英文名称 + */ + private String skuNameEn; + + /** + * 国际化 + */ + private List purchaseOrderItemLangs; + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Integer getBeDeliveredNum() { + return beDeliveredNum; + } + + public void setBeDeliveredNum(Integer beDeliveredNum) { + this.beDeliveredNum = beDeliveredNum; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Long getPurchaseItemId() { + return purchaseItemId; + } + + public void setPurchaseItemId(Long purchaseItemId) { + this.purchaseItemId = purchaseItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getPurchaseAmount() { + return purchaseAmount; + } + + public void setPurchaseAmount(Long purchaseAmount) { + this.purchaseAmount = purchaseAmount; + } + + public Long getPurchasePrice() { + return purchasePrice; + } + + public void setPurchasePrice(Long purchasePrice) { + this.purchasePrice = purchasePrice; + } + + public Integer getPurchaseStock() { + return purchaseStock; + } + + public void setPurchaseStock(Integer purchaseStock) { + this.purchaseStock = purchaseStock; + } + + public Integer getActualStock() { + return actualStock; + } + + public void setActualStock(Integer actualStock) { + this.actualStock = actualStock; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public List getPurchaseOrderItemLangs() { + return purchaseOrderItemLangs; + } + + public void setPurchaseOrderItemLangs(List purchaseOrderItemLangs) { + this.purchaseOrderItemLangs = purchaseOrderItemLangs; + } + + public String getSpuNameZh() { + return spuNameZh; + } + + public void setSpuNameZh(String spuNameZh) { + this.spuNameZh = spuNameZh; + } + + public String getSpuNameEn() { + return spuNameEn; + } + + public void setSpuNameEn(String spuNameEn) { + this.spuNameEn = spuNameEn; + } + + public String getSkuNameZh() { + return skuNameZh; + } + + public void setSkuNameZh(String skuNameZh) { + this.skuNameZh = skuNameZh; + } + + public String getSkuNameEn() { + return skuNameEn; + } + + public void setSkuNameEn(String skuNameEn) { + this.skuNameEn = skuNameEn; + } + + @Override + public String toString() { + return "MongoPurchaseOrderItemBO{" + + "purchaseItemId=" + purchaseItemId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", purchaseAmount=" + purchaseAmount + + ", purchasePrice=" + purchasePrice + + ", purchaseStock=" + purchaseStock + + ", actualStock=" + actualStock + + ", deliveryType=" + deliveryType + + ", status=" + status + + ", spuCode='" + spuCode + '\'' + + ", partyCode='" + partyCode + '\'' + + ", pic='" + pic + '\'' + + ", beDeliveredNum=" + beDeliveredNum + + ", spuNameZh='" + spuNameZh + '\'' + + ", spuNameEn='" + spuNameEn + '\'' + + ", skuNameZh='" + skuNameZh + '\'' + + ", skuNameEn='" + skuNameEn + '\'' + + ", purchaseOrderItemLangs=" + purchaseOrderItemLangs + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/Constant.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/Constant.java new file mode 100644 index 0000000..b1924d9 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/Constant.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + +/** + * @author Lzk + */ +public class Constant { + + public static final Integer INITIAL_CAPACITY = 16; + public static final Integer WAIT_PURCHASES_STATUS = 8; + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/FinanceBizType.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/FinanceBizType.java new file mode 100644 index 0000000..87b0d16 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/FinanceBizType.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + +/** + * 财务明细类型 1.订单 2.退款 2.余额充值 3.会员购买 + * @author TRACK + */ +public enum FinanceBizType { + /** + * 订单 + */ + ORDER(1, "订单支付"), + + /** + * 退款 + */ + REFUND(2, "订单退款"), + /** + * 余额充值 + */ + RECHARGE(3, "余额充值"), + + /** + * 会员购买 + */ + LEVEL(4, "会员购买"); + + private final Integer num; + + private final String str; + + FinanceBizType(Integer num, String str) { + this.num = num; + this.str = str; + } + + public Integer value() { + return num; + } + + public String str() { + return str; + } + + public static FinanceBizType instance(Integer value) { + FinanceBizType[] enums = values(); + for (FinanceBizType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/InterventionRefundType.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/InterventionRefundType.java new file mode 100644 index 0000000..f9e4017 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/InterventionRefundType.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + +/** + * 平台介入金额退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款 + * + * @author lhd + */ +public enum InterventionRefundType { + /** + * 商家承担 + */ + SHOP(1), + /** + * 商家供应商承担(供应商发货订单) + */ + COMMON(2), + /** + * 不同意退款 + */ + REJECT(3); + + private final Integer num; + + InterventionRefundType(Integer num) { + this.num = num; + } + + public Integer value() { + return num; + } + + public static InterventionRefundType instance(Integer value) { + InterventionRefundType[] enums = values(); + for (InterventionRefundType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/OrderExportError.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/OrderExportError.java new file mode 100644 index 0000000..9053137 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/OrderExportError.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + +/** + * 订单导入错误信息原因 + * + * @author TRACK + */ +public enum OrderExportError { + /** + * 订单id + */ + ORDER_ID(1, "订单ID错误的序号为:"), + + /** + * 配送方式 + */ + DELIVERY_TYPE(2, "配送方式错误的序号为:"), + + /** + * 快递公司名称 + */ + DELIVERY_COMPANY_NAME(3, "快递公司名称错误的序号为:"), + + /** + * 快递单号 + */ + DELIVERY_NO(4, "快递单号错误的序号为:"), + + /** + * 收货人信息[暂无校验] + */ + CONSIGNEE(5, "收货人信息错误的序号为:"), + + /** + * 已部分发货 + */ + BE_DELIVERY(6, "订单已被部分发货的序号为"), + + /** + * 其他异常 + */ + OTHER(100, "订单信息错误的序号为:"), + + /** + * 校验表头数据 + */ + EXCEL_ERROR(101, "请导入正确的待发货订单文件"); + + private final Integer value; + + private final String errorInfo; + + public Integer value() { + return value; + } + + public String errorInfo() { + return errorInfo; + } + + OrderExportError(Integer value, String errorInfo) { + this.value = value; + this.errorInfo = errorInfo; + } + + public static OrderExportError instance(Integer value) { + OrderExportError[] enums = values(); + for (OrderExportError orderExportError : enums) { + if (orderExportError.value().equals(value)) { + return orderExportError; + } + } + return null; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/PlatformInterventionStatus.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/PlatformInterventionStatus.java new file mode 100644 index 0000000..aab1b67 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/PlatformInterventionStatus.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + +/** + * 平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功 + * + * @author lhd + */ +public enum PlatformInterventionStatus { + /** + * 没有介入 + */ + NONE(-1), + /** + * 用户申请介入 + */ + APPLY(1), + /** + * 平台同意介入 + */ + AGREE(2), + /** + * 平台拒绝介入 + */ + REJECT(3), + /** + * 平台同意退款成功 + */ + SUCCESS(5); +// /** +// * 用户取消平台介入 +// */ +// CANCEL(6); + + private final Integer num; + + PlatformInterventionStatus(Integer num) { + this.num = num; + } + + public Integer value() { + return num; + } + + public static PlatformInterventionStatus instance(Integer value) { + PlatformInterventionStatus[] enums = values(); + for (PlatformInterventionStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/PurchasesStatusEnum.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/PurchasesStatusEnum.java new file mode 100644 index 0000000..4f715ee --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/PurchasesStatusEnum.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + +import java.util.Objects; + +/** + * 地区层级 + * + * @author cl + */ +public enum PurchasesStatusEnum { + + + /** + * 已作废 + */ + VOIDED(0, "已作废"), + + /** + * 待发货 + */ + WAIT_STOCK(1, "待发货"), + + /** + * 待收货-待入库 + */ + DELIVERY(2, "待收货"), + + /** + * 部分入库 + */ + PARTIALLY_STOCK(3, "部分入库"), + + /** + * 没有付款.待付款 + */ + UNPAY(4, "待付款"), + + /** + * 已完成 + */ + COMPLETION(5, "已完成"), + + /** + * 待审核 + */ + WAITAUDIT(6, "待审核"); + + private final Integer num; + private final String stationName; + + public Integer value() { + return num; + } + + public String stationName() { + return stationName; + } + + PurchasesStatusEnum(Integer num, String stationName) { + this.num = num; + this.stationName = stationName; + } + + public static PurchasesStatusEnum instance(Integer value) { + PurchasesStatusEnum[] enums = values(); + for (PurchasesStatusEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static String getStatusName(Integer value) { + PurchasesStatusEnum[] enums = values(); + for (PurchasesStatusEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum.stationName; + } + } + return null; + } + + /** + * 未发货 + * @param value + * @return + */ + public static boolean unDelivery(Integer value) { + if (Objects.equals(value,UNPAY.num) || Objects.equals(value, WAITAUDIT.value()) || Objects.equals(value, WAIT_STOCK.value())) { + return true; + } + return false; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundApplyType.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundApplyType.java new file mode 100644 index 0000000..283a8d0 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundApplyType.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + +/** + * 退款申请类型 1,仅退款,2退款退货 + * + * @author FrozenWatermelon + */ +public enum RefundApplyType { + /** + * 仅退款 + */ + REFUND(1), + /** + * 退款退货 + */ + REFUND_AND_RETURNS(2); + + private final Integer num; + + RefundApplyType(Integer num) { + this.num = num; + } + + public Integer value() { + return num; + } + + public static RefundApplyType instance(Integer value) { + RefundApplyType[] enums = values(); + for (RefundApplyType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundInterventionType.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundInterventionType.java new file mode 100644 index 0000000..1e1f512 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundInterventionType.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + + +/** + * 平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款 + * + * @author lhd + */ +public enum RefundInterventionType { + + /** + * 商家承担 + */ + SHOP(1, "商家承担"), + + /** + * 商家供应商承担(供应商发货订单) + */ + COMMON(2, "商家供应商承担(供应商发货订单)"), + + /** + * 不同意退款 + */ + ORDER_REFUND(3, "不同意退款"); + + private final Integer num; + + private final String shopWalletChangeReason; + + public Integer value() { + return num; + } + + public String getShopWalletChangeReason() { + return shopWalletChangeReason; + } + + RefundInterventionType(Integer num, String shopWalletChangeReason) { + this.num = num; + this.shopWalletChangeReason = shopWalletChangeReason; + } + + public static RefundInterventionType instance(Integer value) { + RefundInterventionType[] enums = values(); + for (RefundInterventionType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static String getReason(Integer value) { + RefundInterventionType[] enums = values(); + for (RefundInterventionType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum.shopWalletChangeReason; + } + } + return null; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundStsType.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundStsType.java new file mode 100644 index 0000000..4770de3 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundStsType.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + +/** + * @author FrozenWatermelon + */ +public enum RefundStsType { + /** + * 待审核 + */ + PROCESS(1), + /** + * 同意 + */ + AGREE(2), + /** + * 不同意 + */ + DISAGREE(3); + + private final Integer num; + + RefundStsType(Integer num) { + this.num = num; + } + + public Integer value() { + return num; + } + + public static RefundStsType instance(Integer value) { + RefundStsType[] enums = values(); + for (RefundStsType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundType.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundType.java new file mode 100644 index 0000000..23199d2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundType.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + +/** + * 退款类型 + * + * @author FrozenWatermelon + */ +public enum RefundType { + /** + * 整单退款 + */ + ALL(1), + /** + * 单项退款 + */ + SINGLE(2); + + private final Integer num; + + RefundType(Integer num) { + this.num = num; + } + + public Integer value() { + return num; + } + + public static RefundType instance(Integer value) { + RefundType[] enums = values(); + for (RefundType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/SupplierHandleStatus.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/SupplierHandleStatus.java new file mode 100644 index 0000000..22c3a61 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/SupplierHandleStatus.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + +/** + * 供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝 + * + * @author lhd + */ +public enum SupplierHandleStatus { + /** + * 商家自行处理 + */ + NORMAL(-1), + /** + * 移交供应商待处理 + */ + TRANSFER_SUPPLIER(0), + /** + * 供应商已同意 + */ + SUPPLIER_AGREE(1), + /** + * 供应商已拒绝 + */ + SUPPLIER_DISAGREE(2); + + private final Integer num; + + SupplierHandleStatus(Integer num) { + this.num = num; + } + + public Integer value() { + return num; + } + + public static SupplierHandleStatus instance(Integer value) { + SupplierHandleStatus[] enums = values(); + for (SupplierHandleStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/admin/OrderItemController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/admin/OrderItemController.java new file mode 100644 index 0000000..6eea098 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/admin/OrderItemController.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.admin; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.order.service.OrderItemService; +import com.tmerclub.cloud.order.vo.OrderDetailVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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; + +/** + * @author Pineapple + * @date 2021/6/9 9:19 + */ +@RestController("adminOrderItemController") +@RequestMapping("/mp/order_item") +@Tag(name = "admin-订单项信息") +public class OrderItemController { + + @Autowired + private OrderItemService orderItemService; + + @GetMapping("/get_order_detail") + @Operation(summary = "查询订单项、退款详情", description = "根据id查询") + public ServerResponseEntity getOrderItemDetail(Long orderId, Long refundId) { + OrderDetailVO orderDetailVO = orderItemService.listDetailByParam(orderId, refundId); + return ServerResponseEntity.success(orderDetailVO); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderController.java new file mode 100644 index 0000000..0d0e014 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderController.java @@ -0,0 +1,470 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.app; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.coupon.dto.PlatformChooseCouponDTO; +import com.tmerclub.cloud.api.coupon.feign.CouponOrderFeignClient; +import com.tmerclub.cloud.api.delivery.dto.CalculateAndGetDeliverInfoDTO; +import com.tmerclub.cloud.api.product.feign.WarehouseFeignClient; +import com.tmerclub.cloud.api.feign.MarketingFeignClient; +import com.tmerclub.cloud.api.order.manager.ConfirmOrderManager; +import com.tmerclub.cloud.api.order.manager.SubmitOrderManager; +import com.tmerclub.cloud.api.product.manager.ShopCartAdapter; +import com.tmerclub.cloud.api.product.manager.ShopCartItemAdapter; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.api.user.dto.ShopCustomerReqDTO; +import com.tmerclub.cloud.api.user.feign.ShopCustomerFeignClient; +import com.tmerclub.cloud.api.user.feign.UserLevelAndScoreOrderFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.order.dto.SubmitOrderDTO; +import com.tmerclub.cloud.common.order.util.OrderLangUtil; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.delivery.manager.DeliveryManager; +import com.tmerclub.cloud.order.bo.SubmitOrderPayAmountInfoBO; +import com.tmerclub.cloud.order.model.OrderAddr; +import com.tmerclub.cloud.order.service.OrderAddrService; +import com.tmerclub.cloud.order.service.OrderItemService; +import com.tmerclub.cloud.order.service.OrderService; +import com.tmerclub.cloud.order.vo.SubmitOrderPayInfoVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.stream.Collectors; + +/** + * 订单信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +@RestController("appOrderController") +@RequestMapping("/order") +@Tag(name = "app-订单信息") +public class OrderController { + + private static final Logger LOGGER = LoggerFactory.getLogger(OrderController.class); + @Autowired + private OrderService orderService; + @Autowired + private ShopCartAdapter shopCartAdapter; + @Autowired + private ConfirmOrderManager confirmOrderManager; + @Autowired + private ShopCartItemAdapter shopCartItemAdapter; + @Autowired + private ThreadPoolExecutor orderThreadPoolExecutor; + @Autowired + private DeliveryManager deliveryManager; + @Autowired + private OrderItemService orderItemService; + @Autowired + private OrderAddrService orderAddrService; + @Autowired + private SubmitOrderManager submitOrderManager; + @Autowired + private RocketMQTemplate orderCancelTemplate; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private WarehouseFeignClient warehouseFeignClient; + @DubboReference + private MarketingFeignClient marketingFeignClient; + @DubboReference + private SeckillFeignClient seckillFeignClient; + @DubboReference + private CouponOrderFeignClient couponOrderFeignClient; + @DubboReference + private UserLevelAndScoreOrderFeignClient userLevelAndScoreOrderFeignClient; + @DubboReference + private ShopCustomerFeignClient shopCustomerFeignClient; + + + /** + * 生成订单 + */ + @PostMapping("/confirm") + @Operation(summary = "结算,生成订单信息", description = "传入下单所需要的参数进行下单") + public ServerResponseEntity confirm(@Valid @RequestBody OrderDTO orderParam) throws ExecutionException, InterruptedException { + UidInfoBO uidInfoBO = AuthUserContext.get(); + Long userId = uidInfoBO.getUserId(); + // 将要返回给前端的完整的订单信息 + ShopCartOrderMergerVO shopCartOrderMerger = getShopCartOrderMergerVO(orderParam); + shopCartOrderMerger.setUserId(userId); + List shopCartItemsDb = shopCartItemAdapter.getShopCartItems(orderParam.getShopCartItem(), userId, orderParam.getAddrId(), orderParam.getDvyTypes()); + // 获取用户地址信息 + UserDeliveryInfoVO userDeliveryInfoVO = deliveryManager.getUserDeliveryInfoVO(shopCartItemsDb, userId, orderParam); + // 筛选过滤掉不同配送的商品 + List shopCartItems = confirmOrderManager.filterShopItemsByType(shopCartOrderMerger, userDeliveryInfoVO, shopCartItemsDb); + // 自提订单处理 + deliveryManager.handleStationOrder(shopCartOrderMerger, shopCartItems, userDeliveryInfoVO); + + setMold(shopCartOrderMerger, shopCartItemsDb); + + setPreSaleType(shopCartOrderMerger, shopCartItems); + + OrderLangUtil.shopCartItemList(shopCartItems); + + // 购物车 + List shopCarts = shopCartAdapter.conversionShopCart(shopCartItems); + + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + + // 异步计算运费,运费暂时和优惠券没啥关联,可以与优惠券异步计算,获取用户地址,自提信息 + CompletableFuture> deliveryFuture = CompletableFuture.supplyAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + // 多线程手动设置下用户信息 + AuthUserContext.set(uidInfoBO); + return deliveryManager.calculateAndGetDeliverInfo(new CalculateAndGetDeliverInfoDTO(shopCartItemsDb, userDeliveryInfoVO)); + }, orderThreadPoolExecutor); + + // 计算满减、套餐、优惠券,重新组合购物车,并返回优惠券信息 (满减是从购物车的时候就已经计算好了,提交订单理所当然应该用相同的方法) + shopCarts = marketingFeignClient.calculateMarketingAndMakeUpShopCart(shopCarts, orderParam.getCouponIds(), orderParam.getUserChangeCoupon()); + + // 运费用异步计算,最后要等运费出结果 + ServerResponseEntity userDeliveryInfoResponseEntity = deliveryFuture.get(); + if (!userDeliveryInfoResponseEntity.isSuccess()) { + LOGGER.info("运费计算失败,失败原因:{}", userDeliveryInfoResponseEntity.getMsg()); + return ServerResponseEntity.transform(userDeliveryInfoResponseEntity); + } + // 等活动处理完之后,再插入sku的库存区域id -- 赠品、套餐和组合商品需要在marketing模块中处理 + confirmOrderManager.handleShopCartStockPoint(userDeliveryInfoVO, shopCarts, shopCartItemsDb, shopCartOrderMerger.getSpuMold()); + + // 当算完一遍店铺的各种满减活动时,重算一遍订单金额 + confirmOrderManager.recalculateAmountWhenFinishingCalculateShop(shopCartOrderMerger, shopCarts, userDeliveryInfoResponseEntity.getData()); + long orderShopReduce = shopCartOrderMerger.getOrderReduce(); + + // ===============================================开始平台优惠的计算================================================== + // 计算平台优惠券,并返回平台优惠券信息 + ServerResponseEntity couponOrderMergerResponseEntity = couponOrderFeignClient.choosePlatformCoupon(new PlatformChooseCouponDTO(orderParam.getUserChangeCoupon(), orderParam.getCouponIds(), shopCartOrderMerger)); + + if (!couponOrderMergerResponseEntity.isSuccess()) { + return ServerResponseEntity.transform(couponOrderMergerResponseEntity); + } + + shopCartOrderMerger = couponOrderMergerResponseEntity.getData(); + ServerResponseEntity calculateLevelDiscountResponseEntity = userLevelAndScoreOrderFeignClient.calculateLevelAndScoreDiscount(shopCartOrderMerger); + if (!calculateLevelDiscountResponseEntity.isSuccess()) { + LOGGER.info("计算会员等级优惠失败,失败原因:{}", calculateLevelDiscountResponseEntity.getMsg()); + return ServerResponseEntity.transform(calculateLevelDiscountResponseEntity); + } + shopCartOrderMerger = calculateLevelDiscountResponseEntity.getData(); + + + // ===============================================结束平台优惠的计算================================================== + + // 结束平台优惠的计算之后,还要重算一遍金额 + confirmOrderManager.recalculateAmountWhenFinishingCalculatePlatform(shopCartOrderMerger, userDeliveryInfoResponseEntity.getData()); + + // 重新插入spu、sku + resetSpu(shopCartOrderMerger, shopCartItems); + shopCartOrderMerger.setOrderShopReduce(orderShopReduce); + // 计算平台佣金-跟订单其他金额是独立的,可以单独计算 + confirmOrderManager.confirmPlatformCommission(shopCartOrderMerger); +// // 如果下单项有组合商品,在组合一下返回给前端 +// confirmOrderManager.assembleComboShopCart(shopCartOrderMerger, shopCartItemsDb); + // 缓存计算新 + confirmOrderManager.cacheCalculatedInfo(userId, shopCartOrderMerger); + + // 无法配送的商品添加商品详细和店铺详细 + shopCartAdapter.setFilterShopItemsLong(shopCartOrderMerger); + return ServerResponseEntity.success(shopCartOrderMerger); + } + + + /** + * 购物车/立即购买 提交订单,根据店铺拆单 + */ + @PostMapping("/submit") + @Operation(summary = "提交订单,返回支付流水号", description = "根据传入的参数判断是否为购物车提交订单,同时对购物车进行删除,用户开始进行支付") + public ServerResponseEntity> submitOrders(@Valid @RequestBody SubmitOrderDTO submitOrderParam) { + Long userId = AuthUserContext.get().getUserId(); + + // 在这里面已经生成了订单id了 + ServerResponseEntity checkResult = submitOrderManager.checkSubmitInfo(submitOrderParam, userId); + if (!checkResult.isSuccess()) { + LOGGER.info("提交订单失败,失败原因:{}", checkResult.getMsg()); + return ServerResponseEntity.transform(checkResult); + } + ShopCartOrderMergerVO mergerOrder = checkResult.getData(); + mergerOrder.setUserId(userId); + + List shopCartOrders = mergerOrder.getShopCartOrders(); + List orderIds = new ArrayList<>(mergerOrder.getShopCartOrders().size()); + Map mainOrderIdMap = new HashMap<>(Constant.INITIAL_CAPACITY); + + // 优惠券列表 + Map shopCouponMap = new HashMap<>(); + if (CollUtil.isNotEmpty(mergerOrder.getShopCoupons())) { + for (CouponOrderVO shopCoupon : mergerOrder.getShopCoupons()) { + shopCoupon.setOrderIds(new ArrayList<>()); + shopCouponMap.put(shopCoupon.getShopId(), shopCoupon); + } + } + // 需要主单号的ids + if(CollUtil.isNotEmpty(mergerOrder.getNeedMainOrderIds())){ + for (Long skuIds : mergerOrder.getNeedMainOrderIds()) { + Long orderId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER, mergerOrder.getUserId()); + mainOrderIdMap.put(skuIds,orderId); + } + } + // 判断套餐是否失效 + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + if(mainOrderIdMap.containsKey(shopCartOrder.getMainOrderId())){ + shopCartOrder.setMainOrderId(mainOrderIdMap.get(shopCartOrder.getMainOrderId())); + }else{ + shopCartOrder.setMainOrderId(0L); + } + Long orderId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER, mergerOrder.getUserId()); + shopCartOrder.setOrderId(orderId); + orderIds.add(orderId); + // 使用了店铺优惠券,且优惠金额大于0,将订单id加入优惠券订单id列表中 + if (shopCouponMap.containsKey(shopCartOrder.getShopId()) && shopCartOrder.getCouponReduce() > 0) { + CouponOrderVO couponOrderVO = shopCouponMap.get(shopCartOrder.getShopId()); + couponOrderVO.getOrderIds().add(orderId); + } + List shopCartItemDiscounts = shopCartOrder.getShopCartItemDiscounts(); + // TODO 套餐缓存更改 + this.checkComboActivity(shopCartItemDiscounts); + } + + // 锁定库存 + submitOrderManager.tryLockStock(mergerOrder); + + // 锁定优惠券 + submitOrderManager.tryLockCoupon(mergerOrder); + + // 锁积分 + submitOrderManager.tryLockScore(mergerOrder); + + // 发送消息,如果三十分钟后没有支付,则取消订单 + SendStatus sendStatus = orderCancelTemplate.syncSend(RocketMqConstant.ORDER_CANCEL_TOPIC, new GenericMessage<>(orderIds), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常 + throw new LuckException(ResponseEnum.EXCEPTION); + } + + // 提交订单 + orderService.submit(mergerOrder); + + // 店铺客户 + this.saveShopCustomer(mergerOrder); + return ServerResponseEntity.success(orderIds); + } + + @GetMapping("/order_pay_info") + @Operation(summary = "获取订单支付信息", description = "获取订单支付的商品/地址信息") + @Parameter(name = "orderIds", description = "订单流水号", required = true) + public ServerResponseEntity getOrderPayInfo(@RequestParam("orderIds") String orderIds) { + long[] orderIdList = StrUtil.splitToLong(orderIds, ","); + Long userId = AuthUserContext.get().getUserId(); + SubmitOrderPayInfoVO orderPayInfoParam = new SubmitOrderPayInfoVO(); + List spuNameList = new ArrayList<>(Constant.INITIAL_CAPACITY); + //获取订单信息 + ServerResponseEntity shopCartOrderMergerResp = seckillFeignClient.getSeckillOrderByRedis(orderIdList[0], userId); + SubmitOrderPayAmountInfoBO submitOrderPayAmountInfo; + if(Objects.nonNull(shopCartOrderMergerResp.getData())){ + if (!shopCartOrderMergerResp.isSuccess()) { + throw new LuckException(shopCartOrderMergerResp.getMsg()); + } + if (Objects.isNull(shopCartOrderMergerResp.getData())){ + LOGGER.error("订单不存在,订单号:{}", orderIds); + return ServerResponseEntity.fail(ResponseEnum.ORDER_NOT_EXIST); + } + ShopCartOrderMergerVO shopCartOrderMerger = shopCartOrderMergerResp.getData(); + submitOrderPayAmountInfo = new SubmitOrderPayAmountInfoBO(); + submitOrderPayAmountInfo.setTotalScore(0L); + submitOrderPayAmountInfo.setPreSaleType(shopCartOrderMerger.getPreSaleType()); + submitOrderPayAmountInfo.setTotalFee(shopCartOrderMerger.getActualTotal()); + submitOrderPayAmountInfo.setOrderType(shopCartOrderMerger.getOrderType().value()); + submitOrderPayAmountInfo.setCreateTime(shopCartOrderMerger.getCreateTime()); + submitOrderPayAmountInfo.setUserId(shopCartOrderMerger.getUserId()); + // 地址 + if (Objects.nonNull(shopCartOrderMerger.getUserAddr())) { + UserAddrVO orderAddr = shopCartOrderMerger.getUserAddr(); + //写入商品名、收货地址/电话 + String address = orderAddr.getProvince() + orderAddr.getCity() + orderAddr.getArea() + orderAddr.getAddr(); + orderPayInfoParam.setUserAddr(address); + orderPayInfoParam.setConsignee(orderAddr.getConsignee()); + orderPayInfoParam.setMobile(orderAddr.getMobile()); + } + // 获取商品名称 + String spuName = shopCartOrderMerger.getShopCartOrders().get(0).getShopCartItemDiscounts().get(0).getShopCartItems().get(0).getSpuName(); + spuNameList.add(spuName); + }else{ + submitOrderPayAmountInfo = orderService.getSubmitOrderPayAmountInfo(orderIdList); + spuNameList = orderItemService.getSpuNameListByOrderIds(orderIdList); + } + if(Objects.isNull(submitOrderPayAmountInfo.getCreateTime()) || !Objects.equals(userId, submitOrderPayAmountInfo.getUserId())) { + LOGGER.error("订单不存在,订单号:{}", orderIds); + return ServerResponseEntity.fail(ResponseEnum.ORDER_NOT_EXIST); + } + + Date endTime = DateUtil.offsetMillisecond(submitOrderPayAmountInfo.getCreateTime(), RocketMqConstant.CANCEL_TIME_INTERVAL); + + orderPayInfoParam.setSpuNameList(spuNameList); + orderPayInfoParam.setEndTime(endTime); + orderPayInfoParam.setTotalFee(submitOrderPayAmountInfo.getTotalFee()); + orderPayInfoParam.setTotalScore(submitOrderPayAmountInfo.getTotalScore()); + orderPayInfoParam.setOrderScore(submitOrderPayAmountInfo.getOrderScore()); + orderPayInfoParam.setOrderType(submitOrderPayAmountInfo.getOrderType()); + // 如果是定金预售,判断下是支付尾款还是定金 + if (Objects.equals(submitOrderPayAmountInfo.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + if (Objects.equals(submitOrderPayAmountInfo.getPreSalePayStatus(), 0)) { + orderPayInfoParam.setTotalFee(submitOrderPayAmountInfo.getDepositAmount()); + } else { + orderPayInfoParam.setTotalFee(submitOrderPayAmountInfo.getBalanceAmount() + submitOrderPayAmountInfo.getFreightAmount() - submitOrderPayAmountInfo.getPlatformFreeFreightAmount()); + // 支付尾款的话,修改下剩余支付时间 + endTime = DateUtil.offsetMillisecond(submitOrderPayAmountInfo.getBalanceEndTime(), RocketMqConstant.CANCEL_TIME_INTERVAL); + orderPayInfoParam.setEndTime(endTime); + orderPayInfoParam.setPreSalePayStatus(submitOrderPayAmountInfo.getPreSalePayStatus()); + orderPayInfoParam.setBalanceStartTime(submitOrderPayAmountInfo.getBalanceStartTime()); + } + } + // 地址 + if (Objects.nonNull(submitOrderPayAmountInfo.getOrderAddrId())) { + OrderAddr orderAddr = orderAddrService.getById(submitOrderPayAmountInfo.getOrderAddrId()); + LOGGER.info("订单地址信息:{}", orderAddr); + if (Objects.nonNull(orderAddr)) { + //写入商品名、收货地址/电话 + String addr = orderAddr.getProvince() + orderAddr.getCity() + orderAddr.getArea() + orderAddr.getAddr(); + orderPayInfoParam.setUserAddr(addr); + orderPayInfoParam.setConsignee(orderAddr.getConsignee()); + orderPayInfoParam.setMobile(orderAddr.getMobile()); + } + } + return ServerResponseEntity.success(orderPayInfoParam); + } + + private void saveShopCustomer(ShopCartOrderMergerVO mergerOrder) { + mergerOrder.getShopCartOrders().get(0).setUserId(mergerOrder.getUserId()); + Set shopIdList = mergerOrder.getShopCartOrders().stream().map(ShopCartOrderVO::getShopId).collect(Collectors.toSet()); + List shopCustomerReqList = new ArrayList<>(shopIdList.size()); + for (Long shopId : shopIdList) { + ShopCustomerReqDTO shopCustomerReqDTO = new ShopCustomerReqDTO(); + shopCustomerReqDTO.setUserId(mergerOrder.getUserId()); + shopCustomerReqDTO.setShopId(shopId); + shopCustomerReqList.add(shopCustomerReqDTO); + } + shopCustomerFeignClient.saveBatchByOrders(shopCustomerReqList); + } + + + private static void setPreSaleType(ShopCartOrderMergerVO shopCartOrderMerger, List shopCartItems) { + // 该商品不满足任何的配送方式 + if (CollectionUtil.isEmpty(shopCartItems)) { + LOGGER.info("该商品不满足任何的配送方式,并设置配送方式为-1"); + shopCartOrderMerger.setPreSaleType(-1); + } else { + // 判断下预售 + ShopCartItemVO firstShopCartItem = shopCartItems.get(0); + // 是否为预售订单 + shopCartOrderMerger.setPreSaleType(firstShopCartItem.getPreSaleType()); + LOGGER.info("是否为预售订单:{}", shopCartOrderMerger.getPreSaleType()); + } + } + + private static void resetSpu(ShopCartOrderMergerVO shopCartOrderMerger, List shopCartItemsDb) { + Map shopCartItemMap = shopCartItemsDb.stream().collect(Collectors.toMap(ShopCartItemVO::getSkuId, s -> s, (s1, s2) -> s1)); + for (ShopCartOrderVO shopCartOrder : shopCartOrderMerger.getShopCartOrders()) { + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartOrder.getShopCartItemDiscounts()) { + for (ShopCartItemVO shopCartItem : shopCartItemDiscount.getShopCartItems()) { + ShopCartItemVO shopCartItemVO = shopCartItemMap.get(shopCartItem.getSkuId()); + shopCartItem.setSkuLangList(shopCartItemVO.getSkuLangList()); + shopCartItem.setSpuLangList(shopCartItemVO.getSpuLangList()); + } + } + } + } + + private static void setMold(ShopCartOrderMergerVO shopCartOrderMerger, List shopCartItemsDb) { + // 商品类别 0.实物商品 1. 虚拟商品 2.组合商品 + int mold = 0; + if (shopCartItemsDb.stream().filter(shopCartItemDto -> Objects.nonNull(shopCartItemDto.getMold()) && shopCartItemDto.getMold() == 1).count() == shopCartItemsDb.size()) { + LOGGER.info("订单项中的所有商品都为虚拟商品时,才是虚拟订单,并设置配送方式为不配送"); + // 订单项中的所有商品都为虚拟商品时,才是虚拟订单 + mold = 1; + shopCartOrderMerger.getDvyTypes().forEach(s -> s.setDvyType(DeliveryType.NOT_DELIVERY.value())); + } + shopCartOrderMerger.setSpuMold(mold); + List comboShopCartItems = shopCartItemsDb.stream().filter(shopCartItemDto -> Objects.nonNull(shopCartItemDto.getMold()) && Objects.equals(shopCartItemDto.getMold(), SpuMold.COMBO.value())).toList(); + if(mold == 1 || CollectionUtil.isEmpty(comboShopCartItems)){ + return; + } + // 如果有组合商品且为全虚拟的组合商品就为虚拟商品订单 + mold = 1; + for (ShopCartItemVO comboShopCartItem : comboShopCartItems) { + if(comboShopCartItem.getComboShopCartItems().stream().filter(shopCartItemDto -> Objects.nonNull(shopCartItemDto.getMold()) && shopCartItemDto.getMold() == 0).count() > 0){ + mold = 0; + break; + } + } + if(mold == 1){ + shopCartOrderMerger.getDvyTypes().forEach(s -> s.setDvyType(DeliveryType.NOT_DELIVERY.value())); + } + shopCartOrderMerger.setSpuMold(mold); + } + + private static ShopCartOrderMergerVO getShopCartOrderMergerVO(OrderDTO orderParam) { + ShopCartOrderMergerVO shopCartOrderMerger = new ShopCartOrderMergerVO(); + shopCartOrderMerger.setIsScorePay(orderParam.getIsScorePay()); + shopCartOrderMerger.setDvyTypes(orderParam.getDvyTypes()); + shopCartOrderMerger.setUsableScore(orderParam.getUserUseScore()); + shopCartOrderMerger.setOrderType(OrderType.ORDINARY); + return shopCartOrderMerger; + } + + + private void checkComboActivity(List shopCartItemDiscounts) { + List shopCartItemDiscountVOList = shopCartItemDiscounts.stream() + .filter(shopCartItemDiscountVO -> Objects.nonNull(shopCartItemDiscountVO.getChooseComboItemVo())).toList(); + if (CollUtil.isEmpty(shopCartItemDiscountVOList)) { + // 没有套餐活动 + return; + } + ServerResponseEntity serverResponseEntity = marketingFeignClient.checkComboActivity(shopCartItemDiscountVOList); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderInvoiceController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderInvoiceController.java new file mode 100644 index 0000000..24c5676 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderInvoiceController.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.app; + +import cn.hutool.core.map.MapUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.dto.OrderInvoiceDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderItemVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.order.constant.InvoiceHeaderType; +import com.tmerclub.cloud.order.constant.OrderInvoiceState; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderInvoice; +import com.tmerclub.cloud.order.service.OrderInvoiceService; +import com.tmerclub.cloud.order.service.OrderService; +import com.tmerclub.cloud.order.vo.MyOrderItemVO; +import com.tmerclub.cloud.order.vo.OrderInvoiceVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author Pineapple + * @date 2021/8/2 8:59 + */ +@RestController("appOrderInvoiceController") +@RequestMapping("/order_invoice") +@Tag(name = "用户端订单发票") +public class OrderInvoiceController { + + private final Logger LOGGER = LoggerFactory.getLogger(OrderInvoiceController.class); + @Autowired + private OrderInvoiceService orderInvoiceService; + @Autowired + private OrderService orderService; + + + @GetMapping + @Operation(summary = "获取发票信息", description = "根据orderInvoiceId获取") + public ServerResponseEntity getByOrderInvoiceId(@RequestParam Long orderInvoiceId) { + OrderInvoiceVO orderInvoice = orderInvoiceService.getById(orderInvoiceId); + if (Objects.nonNull(orderInvoice.getUserId()) && !Objects.equals(orderInvoice.getUserId(), AuthUserContext.get().getUserId())) { + LOGGER.error("无法查看非当前用户的发票信息"); + //非当前用户的发票信息 + throw new LuckException("无法查看非当前用户的发票信息"); + } + Map> comboMap = orderInvoice.getOrderItemVOList().stream() + .filter(order -> Objects.equals(order.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(MyOrderItemVO::getActivityId)); + if (MapUtil.isEmpty(comboMap)) { + return ServerResponseEntity.success(orderInvoice); + } + Iterator iterator = orderInvoice.getOrderItemVOList().iterator(); + while (iterator.hasNext()) { + MyOrderItemVO orderItem = iterator.next(); + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + iterator.remove(); + } + orderItem.setComboList(comboMap.get(orderItem.getOrderItemId())); + } + return ServerResponseEntity.success(orderInvoice); + } + + @PostMapping + @Operation(summary = "申请开票", description = "保存申请信息") + public ServerResponseEntity save(@Valid @RequestBody OrderInvoiceDTO orderInvoiceDTO) { + if (Objects.isNull(orderInvoiceDTO.getShopId())) { + LOGGER.error("店铺id不能为空"); + throw new LuckException("店铺id不能为空"); + } + Order order = orderService.getByOrderId(orderInvoiceDTO.getOrderId()); + if (Objects.isNull(order)) { + throw new LuckException("订单不存在"); + } + Long orderId = orderInvoiceService.getByOrderId(orderInvoiceDTO.getOrderId(), orderInvoiceDTO.getShopId(), null); + if (Objects.nonNull(orderId)) { + LOGGER.error("该订单已经申请发票,请勿重复申请!"); + throw new LuckException("该订单已经申请发票,请勿重复申请!"); + } + OrderInvoice orderInvoice = BeanUtil.map(orderInvoiceDTO, OrderInvoice.class); + orderInvoice.setShopId(orderInvoiceDTO.getShopId()); + if (Objects.equals(InvoiceHeaderType.PERSONAL.value(), orderInvoice.getHeaderType())) { + LOGGER.error("个人发票不需要填写税号"); + orderInvoice.setInvoiceTaxNumber(null); + } + orderInvoice.setSupplierId(Objects.isNull(order.getSupplierId()) ? 0L : order.getSupplierId()); + orderInvoice.setInvoiceState(OrderInvoiceState.APPLICATION.value()); + orderInvoice.setApplicationTime(new Date()); + orderInvoiceService.save(AuthUserContext.get().getUserId(), orderInvoice); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "申请换开", description = "更新发票信息") + public ServerResponseEntity update(@Valid @RequestBody OrderInvoiceDTO orderInvoiceDTO) { + OrderInvoice orderInvoice = BeanUtil.map(orderInvoiceDTO, OrderInvoice.class); + orderInvoice.setInvoiceState(OrderInvoiceState.APPLICATION.value()); + orderInvoice.setApplicationTime(new Date()); + if (Objects.equals(InvoiceHeaderType.PERSONAL.value(), orderInvoice.getHeaderType())) { + LOGGER.error("个人发票不需要填写税号"); + orderInvoice.setInvoiceTaxNumber(null); + } + orderInvoiceService.update(orderInvoice); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderRefundInterventionController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderRefundInterventionController.java new file mode 100644 index 0000000..bbd63b7 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderRefundInterventionController.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.app; + +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.order.dto.OrderRefundInterventionDTO; +import com.tmerclub.cloud.order.service.OrderRefundInterventionService; +import com.tmerclub.cloud.order.service.OrderRefundService; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 订单退款介入记录信息 + * + * @author FrozenWatermelon + * @date 2023-08-25 10:45:35 + */ +@RestController("appOrderRefundInterventionController") +@RequestMapping("/order_refund_intervention") +@Tag(name = "订单退款介入记录信息") +public class OrderRefundInterventionController { + @Autowired + private OrderRefundInterventionService orderRefundInterventionService; + @Autowired + private OrderRefundService orderRefundService; + + /** + * 用户添加介入凭证 + */ + @PutMapping("/save_intervention_voucher") + @Operation(summary = "用户添加介入凭证") + public ServerResponseEntity savePlatormIntervertion(@RequestBody OrderRefundInterventionDTO orderRefundParam) { + OrderRefundVO orderRefundVO = orderRefundService.getByRefundId(orderRefundParam.getRefundId()); + Long userId = AuthUserContext.get().getUserId(); + orderRefundParam.setBizId(userId); + orderRefundParam.setSysType(SysTypeEnum.ORDINARY.value()); + orderRefundInterventionService.savePlatormIntervertion(orderRefundParam); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderRefundController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderRefundController.java new file mode 100644 index 0000000..501bf50 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderRefundController.java @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.multishop; + + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.multishop.feign.ShopWalletFeignClient; +import com.tmerclub.cloud.api.payment.constant.PayEntry; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.dto.PayInfoApiDto; +import com.tmerclub.cloud.api.payment.feign.PaymentFeignClient; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.constant.ReturnProcessStatusEnum; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.constant.RefundApplyType; +import com.tmerclub.cloud.order.constant.RefundStsType; +import com.tmerclub.cloud.order.constant.SupplierHandleStatus; +import com.tmerclub.cloud.order.dto.multishop.OrderRefundDTO; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderRefund; +import com.tmerclub.cloud.order.model.OrderRefundAddr; +import com.tmerclub.cloud.order.model.OrderSettlement; +import com.tmerclub.cloud.order.service.OrderRefundAddrService; +import com.tmerclub.cloud.order.service.OrderRefundService; +import com.tmerclub.cloud.order.service.OrderService; +import com.tmerclub.cloud.order.service.OrderSettlementService; +import com.tmerclub.cloud.order.vo.OrderRefundAddrVO; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + + +/** + * @author FrozenWatermelon + */ +@RestController("multishopOrderRefundController") +@RequestMapping("/m/order_refund") +public class OrderRefundController { + + private final Logger LOGGER = LoggerFactory.getLogger(OrderRefundController.class); + @Autowired + private OrderRefundService orderRefundService; + @DubboReference + private ShopWalletFeignClient shopWalletFeignClient; + @Autowired + private OrderRefundAddrService orderRefundAddrService; + @Autowired + private OrderSettlementService orderSettlementService; + @Autowired + private OrderService orderService; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private PaymentFeignClient paymentFeignClient; + + /** + * 通过id查询 + * + * @param refundId id + * @return 查询详细信息 + */ + @GetMapping("/info/{refundId}") + public ServerResponseEntity getById(@PathVariable("refundId") Long refundId) { + OrderRefundVO orderRefund = orderRefundService.getDetailByRefundId(refundId); + // 退款单是否移交给供应商处理(是则备注信息从shopSellerMsg取) + if (!Objects.equals(orderRefund.getSupplierHandleStatus(), SupplierHandleStatus.NORMAL.value())) { + orderRefund.setSellerMsg(orderRefund.getShopSellerMsg()); + } + if (!Objects.equals(orderRefund.getShopId(), AuthUserContext.get().getTenantId())) { + LOGGER.error("非法访问,当前用户的租户id为:{},但是请求的退款单的租户id为:{}", AuthUserContext.get().getTenantId(), orderRefund.getShopId()); + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + if (Objects.equals(orderRefund.getApplyType(), RefundApplyType.REFUND_AND_RETURNS.value()) && orderRefund.getHandelTime() != null) { + OrderRefundAddr orderRefundAddr = orderRefundAddrService.getByRefundId(refundId); + orderRefund.setOrderRefundAddr(BeanUtil.map(orderRefundAddr, OrderRefundAddrVO.class)); + LOGGER.info("退货退款的退款单详情:{}", orderRefund); + } + if (StrUtil.isNotBlank(orderRefund.getBuyerMobile())) { + orderRefund.setBuyerMobile(PhoneUtil.hideBetween(orderRefund.getBuyerMobile()).toString()); + } + return ServerResponseEntity.success(orderRefund); + } + + + /** + * 进入这个方法,会出现两种情况: + * 1. 仅退款,此时商家同意买家的退款申请,执行发放退款的操作 + * 2. 退货退款操作: + * 2.1)退货退款的第一步,商家允许买家退款的申请,商家进行设置退货地址,不执行发放退款的操作 + * 2.2)退货退款的第二步,当商家收到货之后,同意买家退款,此时需要发放退款,但不会执行这个方法,执行的是下面这个方法 + * + * @see OrderRefundController#returnMoney(OrderRefundDTO) + */ + @PutMapping("/return_and_refund_audit") + public ServerResponseEntity returnAndRefundAudit(@RequestBody OrderRefundDTO orderRefundParam) { + // 处理退款操作 + OrderRefundVO orderRefundVO = orderRefundService.getDetailByRefundId(orderRefundParam.getRefundId()); + if (!Objects.equals(ReturnProcessStatusEnum.APPLY.value(), orderRefundVO.getReturnMoneySts())) { + // 订单退款状态已发生改变,请勿重复操作 + LOGGER.error("订单退款状态已发生改变,请勿重复操作,订单退款单详情:{}", orderRefundVO); + return ServerResponseEntity.showFailMsg("订单退款状态已发生改变,请勿重复操作"); + } + if (!Objects.equals(orderRefundVO.getShopId(), AuthUserContext.get().getTenantId())) { + LOGGER.error("非法访问,当前用户的租户id为:{},但是请求的退款单的租户id为:{}", AuthUserContext.get().getTenantId(), orderRefundVO.getShopId()); + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + + // 拒绝退款,可以不需要分布式事务啥的,因为就单纯拒绝,发个通知给用户,做幂等处理就好了 + if (Objects.equals(orderRefundParam.getRefundSts(), RefundStsType.DISAGREE.value())) { + orderRefundVO.setSupplierHandleStatus(null); + orderRefundService.disagreeRefund(orderRefundParam, orderRefundVO); + LOGGER.info("商家拒绝退款,退款单详情:{}", orderRefundVO); + return ServerResponseEntity.success(); + } + + OrderSettlement orderSettlement = orderSettlementService.getByOrderId(orderRefundVO.getOrderId()); + if (Objects.isNull(orderSettlement)) { + LOGGER.error("没有查询到支付记录,无法申请退款,退款单详情:{}", orderRefundVO); + return ServerResponseEntity.showFailMsg("没有查询到支付记录,无法申请退款"); + } + + if (!Objects.equals(orderRefundVO.getSupplierId(), 0L)) { + // 移交供应商处理,改变下状态即可 + if (Objects.equals(orderRefundParam.getSupplierHandleStatus(), SupplierHandleStatus.TRANSFER_SUPPLIER.value())) { + orderRefundService.transferRefundOrderToSupplier(orderRefundParam, orderRefundVO); + LOGGER.info("移交供应商处理退款,退款单详情:{}", orderRefundVO); + return ServerResponseEntity.success(); + } + if (!Objects.equals(orderRefundParam.getSupplierHandleStatus(), SupplierHandleStatus.NORMAL.value())) { + LOGGER.error("供应商订单只能选择自行处理或者移交供应商处理,退款单详情:{}", orderRefundVO); + return ServerResponseEntity.showFailMsg("供应商订单只能选择自行处理或者移交供应商处理"); + } + Order order = orderService.getOrderByOrderIdAndUserId(orderRefundVO.getOrderId(), orderRefundVO.getUserId()); + // 不是待采购状态的供应商订单,才检查下钱是否足够 + if (!Objects.equals(order.getWaitPurchase(), 1)) { + // 检查一下商家结算金额是否足够 + ServerResponseEntity amountResp = shopWalletFeignClient.getSettlementAmountByShopId(orderRefundVO.getShopId(), order.getPaySysType()); + if (!amountResp.isSuccess()) { + LOGGER.error("查询商家结算金额失败,失败原因:{}", amountResp.getMsg()); + throw new LuckException(amountResp.getMsg()); + } + // 供应商改变金额 = 供应商改变金额 - 平台供应商佣金改变量 + 运费 + Long supplierRealRefundAmount = orderRefundVO.getPurchaseRefundAmount() - orderRefundVO.getPurPlatformRefundCommission() + + order.getFreightAmount(); + + if (amountResp.getData() < supplierRealRefundAmount) { + LOGGER.error("商家余额不足,商家结算金额:{},供应商实际退款金额:{}", amountResp.getData(), supplierRealRefundAmount); + return ServerResponseEntity.showFailMsg("商家余额不足,请去进行充值后重试"); + } + // 如果订单是通联支付的,执行商家余额扣除,让商家跳转到通联输入支付密码等校验 + if (Objects.equals(order.getPaySysType(), PaySysType.ALLINPAY.value())) { + LOGGER.info("订单是通联支付的,执行商家余额扣除,让商家跳转到通联输入支付密码等校验,退款单详情:{}", orderRefundVO); + return allinPayBalancePay(supplierRealRefundAmount, order, order.getShopId(), orderRefundParam); + } + } + } + + // 同意退货,可以不需要分布式事务啥的,因为就单纯拒绝,发个通知给用户,做幂等处理就好了 + if (Objects.equals(orderRefundVO.getApplyType(), RefundApplyType.REFUND_AND_RETURNS.value())) { + LOGGER.info("商家同意退货,退款单详情:{}", orderRefundVO); + orderRefundService.agreeReturns(orderRefundParam, orderRefundVO, SysTypeEnum.MULTISHOP.value()); + return ServerResponseEntity.success(); + } + + // 同意退款,上面只是同意退货,关系到钱要看下面的 + return orderRefundService.agreeRefund(orderRefundParam, orderRefundVO); + } + + @GetMapping("/is_last_refund") + @Operation(summary = "是否为最后一单退款") + public ServerResponseEntity isLastRefund(Long refundId) { + Long shopId = AuthUserContext.get().getTenantId(); + return ServerResponseEntity.success(orderRefundService.getIsLastRefund(refundId, shopId)); + } + + + /** + * 退货退款的第二步,当商家收到货之后,同意买家退款,此时需要发放退款 + */ + @PutMapping("/return_money") + public ServerResponseEntity returnMoney(@Valid @RequestBody OrderRefundDTO orderRefundParam) { + Long shopId = AuthUserContext.get().getTenantId(); + // 获取退款单信息 + OrderRefundVO orderRefundVO = orderRefundService.getDetailByRefundId(orderRefundParam.getRefundId()); + if (!Objects.equals(ReturnProcessStatusEnum.CONSIGNMENT.value(), orderRefundVO.getReturnMoneySts())) { + LOGGER.error("订单退款状态已发生改变,请勿重复操作,退款单详情:{}", orderRefundVO); + throw new LuckException("订单退款状态已发生改变,请勿重复操作"); + } + if (!Objects.equals(orderRefundVO.getShopId(), AuthUserContext.get().getTenantId())) { + LOGGER.error("商家只能操作自己店铺的退款单,退款单详情:{}", orderRefundVO); + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + // 拒绝退款,可以不需要分布式事务啥的,因为就单纯拒绝,发个通知给用户,做幂等处理就好了 + if (Objects.equals(orderRefundParam.getRefundSts(), RefundStsType.DISAGREE.value())) { + orderRefundVO.setSupplierHandleStatus(null); + orderRefundService.disagreeRefund(orderRefundParam, orderRefundVO); + LOGGER.info("商家拒绝退款"); + return ServerResponseEntity.success(); + } + OrderSettlement orderSettlement = orderSettlementService.getByOrderId(orderRefundVO.getOrderId()); + if (orderSettlement == null) { + LOGGER.error("没有查询到支付记录,无法申请退款,退款单详情:{}", orderRefundVO); + return ServerResponseEntity.showFailMsg("没有查询到支付记录,无法申请退款"); + } + if (!Objects.equals(orderRefundVO.getSupplierId(), 0L) && Objects.equals(orderRefundVO.getSupplierHandleStatus(), SupplierHandleStatus.NORMAL.value())) { + // 商家自行处理的退款订单,在退货退款的最后一步在检查一下商家结算金额是否足够 + ServerResponseEntity amountResp = shopWalletFeignClient.getSettlementAmountByShopId(orderRefundVO.getShopId(), orderRefundVO.getPaySysType()); + if (!amountResp.isSuccess()) { + LOGGER.error("查询商家结算金额失败,失败原因:{}", amountResp.getMsg()); + throw new LuckException(amountResp.getMsg()); + } + Order order = orderService.getOrderByOrderIdAndUserId(orderRefundVO.getOrderId(), orderRefundVO.getUserId()); + // 供应商改变金额 = 供应商改变金额 - 平台供应商佣金改变量 + Long supplierRealRefundAmount = orderRefundVO.getPurchaseRefundAmount() - orderRefundVO.getPurPlatformRefundCommission() + order.getFreightAmount(); + if (amountResp.getData() < supplierRealRefundAmount) { + LOGGER.error("商家余额不足自行处理供应商订单退款,请去进行充值后重试,退款单详情:{}", orderRefundVO); + return ServerResponseEntity.showFailMsg("商家余额不足自行处理供应商订单退款,请去进行充值后重试"); + } + // 如果订单是通联支付的,执行商家余额扣除,让商家跳转到通联输入支付密码等校验 + if (Objects.equals(order.getPaySysType(), PaySysType.ALLINPAY.value())) { + LOGGER.info("通联支付,执行商家余额扣除,更新订单退款信息,退款单详情:{}", orderRefundVO); + OrderRefund orderRefund = new OrderRefund(); + orderRefund.setRefundId(orderRefundVO.getRefundId()); + orderRefund.setSellerMsg(orderRefundParam.getSellerMsg()); + orderRefundService.update(orderRefund); + return allinPayBalancePay(supplierRealRefundAmount, order, shopId, orderRefundParam); + } + } + + return orderRefundService.agreeRefund(orderRefundParam, orderRefundVO); + } + + private ServerResponseEntity allinPayBalancePay(Long payAmount, Order order, Long tenantId, OrderRefundDTO orderRefundDTO) { + PayInfoApiDto orderPayInfoVO = new PayInfoApiDto(); + orderPayInfoVO.setBody("商家余额支付订单"); + orderPayInfoVO.setPayAmount(payAmount); + orderPayInfoVO.setPayType(PayType.BALANCE.value()); + orderPayInfoVO.setOrderIds(order.getOrderId().toString()); + orderPayInfoVO.setRefundId(orderRefundDTO.getRefundId()); + orderPayInfoVO.setUserId(order.getUserId().toString()); + orderPayInfoVO.setReturnUrl(orderRefundDTO.getReturnUrl()); + orderPayInfoVO.setPayEntry(PayEntry.SHOP_BALANCE_PAY_REFUND_SPREAD.value()); + // 存入支付扩展信息 + orderRefundDTO.setSellerMsg(null); + orderPayInfoVO.setExtendInfo(Json.toJsonString(orderRefundDTO)); + orderPayInfoVO.setBizUserId(order.getSupplierId().toString()); + orderPayInfoVO.setShopId(tenantId.toString()); + return paymentFeignClient.doAllinPayShopBalance(orderPayInfoVO); + } + + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderSelfStationController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderSelfStationController.java new file mode 100644 index 0000000..f35d16e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderSelfStationController.java @@ -0,0 +1,77 @@ +package com.tmerclub.cloud.order.controller.multishop; + +import com.google.common.collect.Lists; +import com.tmerclub.cloud.common.order.constant.RefundStatusEnum; +import com.tmerclub.cloud.common.order.dto.OrderSelfStationDTO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.order.vo.OrderSelfStationVO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.order.service.OrderItemService; +import com.tmerclub.cloud.order.service.OrderRefundService; +import com.tmerclub.cloud.order.service.OrderSelfStationService; +import com.tmerclub.cloud.order.service.OrderService; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; +/** + * @author lanhai + */ +@RestController("multishopOrderSelfStationController") +@RequestMapping("/m/order_self_station") +@Tag(name = "商家端自提订单接口") +public class OrderSelfStationController { + + @Autowired + private OrderService orderService; + @Autowired + private OrderSelfStationService orderSelfStationService; + @Autowired + private OrderRefundService orderRefundService; + @Autowired + private OrderItemService orderItemService; + + @GetMapping("/get_order_item_and_station_info") + @Operation(summary = "获取提货订单详情") + public ServerResponseEntity getOrderItemAndStationInfo(@RequestParam("orderId") Long orderId) { + OrderVO orderVO = orderService.getOrderByOrderId(orderId); + List orderItemVOList = orderItemService.listOrderItemAndLangByOrderId(orderId); + orderVO.setOrderItems(orderItemVOList); + OrderSelfStationVO orderSelfStation = orderSelfStationService.getStationByOrderId(null, orderId); + orderSelfStation.setOrderStatus(orderVO.getStatus()); + if (Objects.nonNull(orderVO.getRefundStatus()) && !Objects.equals(orderVO.getRefundStatus(), RefundStatusEnum.DISAGREE.value())) { + List refundVOList = orderRefundService.getProcessingOrderRefundByOrderId(orderVO.getOrderId()); + for (OrderRefundVO orderRefund : refundVOList) { + //整单退款 + if (orderRefund.getRefundType() == 1) { + for (OrderItemVO orderItem : orderVO.getOrderItems()) { + orderItem.setReturnMoneySts(orderRefund.getReturnMoneySts()); + } + break; + } + // 单项退款,每个单号都不一样 + for (OrderItemVO orderItem : orderVO.getOrderItems()) { + if (Objects.equals(orderItem.getOrderItemId(), orderRefund.getOrderItemId())) { + orderItem.setReturnMoneySts(orderRefund.getReturnMoneySts()); + } + } + } + } + orderSelfStation.setOrderItems(orderVO.getOrderItems()); + return ServerResponseEntity.success(orderSelfStation); + } + + @PutMapping("/change_status_and_order_station") + @Operation(summary = "自提订单发货") + public ServerResponseEntity changeStatusAndOrderStation(@RequestBody OrderSelfStationDTO orderSelfStationDTO) { + List orderIdList = Lists.newArrayList(); + orderIdList.add(orderSelfStationDTO.getOrderId()); + orderService.orderStationByOrderId(orderIdList, null, orderSelfStationDTO.getStationId()); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/PurchaseOrderController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/PurchaseOrderController.java new file mode 100644 index 0000000..4904ec6 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/PurchaseOrderController.java @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.multishop; + + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.delivery.feign.DeliveryFeignClient; +import com.tmerclub.cloud.api.order.vo.PurchaseOrderAddrVO; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.order.dto.PurchaseOrderDTO; +import com.tmerclub.cloud.order.dto.PurchaseOrderItemDTO; +import com.tmerclub.cloud.order.model.PurchaseOrder; +import com.tmerclub.cloud.order.model.PurchaseOrderAddr; +import com.tmerclub.cloud.order.service.PurchaseOrderAddrService; +import com.tmerclub.cloud.order.service.PurchaseOrderExcelService; +import com.tmerclub.cloud.order.service.PurchaseOrderService; +import com.tmerclub.cloud.order.vo.PurchaseOrderInboundExcelVO; +import com.tmerclub.cloud.order.vo.PurchaseOrderItemVO; +import com.tmerclub.cloud.order.vo.PurchaseOrderVO; +import com.tmerclub.cloud.order.vo.PurchaseSpuImportVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.*; + +/** + * 采购订单 + * + * @author YXF + * @date 2021-09-08 10:42:01 + */ +@RestController("multishopPurchaseOrderController") +@RequestMapping("/m/purchase/order") +@Tag(name = "multishop-采购订单接口") +public class PurchaseOrderController { + + @Autowired + private PurchaseOrderService purchaseOrderService; + @Autowired + private PurchaseOrderExcelService purchaseOrderExcelService; + @Autowired + private SegmentManager segmentManager; + @Autowired + private PurchaseOrderAddrService purchaseOrderAddrService; + @DubboReference + private DeliveryFeignClient deliveryFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + + /** + * 通过id查询 + * + * @param purchaseOrderId id + * @return 单个数据 + */ + @GetMapping("/info/{purchaseOrderId}") + @Operation(summary = "根据id查询采购订单", description = "根据id查询采购订单") + public ServerResponseEntity getById(@PathVariable("purchaseOrderId") Long purchaseOrderId) { + PurchaseOrderVO purchaseOrderVO = purchaseOrderService.info(purchaseOrderId, null); + if (!Objects.equals(AuthUserContext.getShopId(), purchaseOrderVO.getShopId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + // 详情用户收货地址 + PurchaseOrderAddr purchaseOrderAddr = purchaseOrderAddrService.getById(purchaseOrderVO.getPurchaseOrderAddrId()); + purchaseOrderVO.setPurchaseOrderAddrVO(BeanUtil.map(purchaseOrderAddr, PurchaseOrderAddrVO.class)); + return ServerResponseEntity.success(purchaseOrderVO); + } + + + /** + * 新增 + * + * @param purchaseOrder + * @return 是否新增成功 + */ + @PostMapping + @Operation(summary = "新增采购订单", description = "新增采购订单") + public ServerResponseEntity save(@RequestBody @Valid PurchaseOrderDTO purchaseOrder) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + purchaseOrder.setShopId(uidInfoBO.getTenantId()); + purchaseOrder.setEmployeeId(uidInfoBO.getUserId()); + + Map> purchaseOrderMap = new HashMap<>(purchaseOrder.getPurchaseOrderItemList().size()); + for (PurchaseOrderItemDTO purchaseOrderItem : purchaseOrder.getPurchaseOrderItemList()) { + if (purchaseOrderItem.getPurchaseStock() <= 0) { + throw new LuckException("请输入大于0的采购数量"); + } + // 每个供应商的独立orderItemList + List purchaseOrderItemList = purchaseOrderMap.get(purchaseOrderItem.getSupplierId()); + if (Objects.isNull(purchaseOrderItemList)) { + purchaseOrderItemList = new ArrayList<>(Constant.INITIAL_CAPACITY); + purchaseOrderMap.put(purchaseOrderItem.getSupplierId(), purchaseOrderItemList); + } + purchaseOrderItemList.add(purchaseOrderItem); + } + + purchaseOrderMap.forEach((supplierId, purchaseOrderItemList) -> { + PurchaseOrderDTO purchaseOrderDTO = new PurchaseOrderDTO(); + purchaseOrderDTO.setShopId(purchaseOrder.getShopId()); + purchaseOrderDTO.setSupplierId(supplierId); + purchaseOrderDTO.setPurchaseOrderItemList(purchaseOrderItemList); + purchaseOrderDTO.setRemark(purchaseOrder.getRemark()); + purchaseOrderDTO.setWarehouseId(purchaseOrder.getWarehouseId()); + purchaseOrderDTO.setEmployeeId(purchaseOrder.getEmployeeId()); + // 获取订单号 + this.loadPurchaseOrderDateId(purchaseOrderDTO); + purchaseOrderService.savePurchaseOrder(purchaseOrderDTO); + }); + return ServerResponseEntity.success(); + } + + /** + * 上传付款凭证 + * + * @param purchaseOrder + * @return 是否修改成功 + */ + @PutMapping("/updatePayVoucher") + @Operation(summary = "上传付款凭证-更新订单", description = "上传付款凭证") + public ServerResponseEntity updatePayVoucher(@RequestBody PurchaseOrderDTO purchaseOrder) { + purchaseOrder.setShopId(AuthUserContext.get().getTenantId()); + purchaseOrderService.updatePayVoucher(purchaseOrder); + return ServerResponseEntity.success(); + } + + /** + * 入库 + * + * @param purchaseOrder + * @return 是否修改成功 + */ + @PutMapping("/inbound") + @Operation(summary = "入库采购订单", description = "入库采购订单") + public ServerResponseEntity inbound(@RequestBody PurchaseOrderDTO purchaseOrder) { + purchaseOrder.setShopId(AuthUserContext.get().getTenantId()); + purchaseOrderService.inbound(purchaseOrder); + return ServerResponseEntity.success(); + } + + /** + * 作废 + * + * @param purchaseOrderId + */ + @DeleteMapping("/nullify/{purchaseOrderId}") + @Operation(summary = "作废采购订单", description = "作废采购订单") + public ServerResponseEntity nullify(@PathVariable Long purchaseOrderId) { + purchaseOrderService.nullify(AuthUserContext.get().getTenantId(), purchaseOrderId); + return ServerResponseEntity.success(); + } + + /** + * 完成 + * + * @param purchaseOrder + */ + @PutMapping("/complete") + @Operation(summary = "完成采购订单", description = "完成采购订单") + public ServerResponseEntity finish(@RequestBody PurchaseOrder purchaseOrder) { + purchaseOrder.setShopId(AuthUserContext.get().getTenantId()); + purchaseOrderService.complete(AuthUserContext.get().getTenantId(), purchaseOrder.getPurchaseOrderId()); + return ServerResponseEntity.success(); + } + + /** + * 下载模板 + * + * @param response + */ + @GetMapping("/download_model") + @ResponseBody + @Operation(summary = "下载导入采购商品模板", description = "下载导入采购商品模板") + public void downloadModel(HttpServletResponse response) { + purchaseOrderService.downloadModel(response); + } + + @Operation(summary = "导入采购商品", description = "导入采购商品") + @Parameter(name = "warehouseId", description = "仓库id") + @PostMapping("/export_excel") + public ServerResponseEntity exportExcel(@RequestPart("excelFile") MultipartFile excelFile, + Long warehouseId) { + if (excelFile == null) { + // 网络繁忙,请稍后重试 + throw new LuckException("网络繁忙,请稍后重试"); + } + Long shopId = AuthUserContext.get().getTenantId(); + return ServerResponseEntity.success(purchaseOrderService.parseFile(excelFile, shopId, warehouseId)); + } + + @GetMapping("/inbound/export") + @Schema(description = "导出入库商品") + public void export(@RequestParam("purchaseOrderId") Long purchaseOrderId, HttpServletResponse response) { + List purchaseOrderInboundExcelList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.equals(purchaseOrderId, 0L)) { + purchaseOrderInboundExcelList.add(new PurchaseOrderInboundExcelVO()); + ExcelUtil.soleExcel(response, purchaseOrderInboundExcelList, PurchaseOrderInboundExcelVO.EXCEL_NAME, PurchaseOrderInboundExcelVO.MERGE_ROW_INDEX, + PurchaseOrderInboundExcelVO.MERGE_COLUMN_INDEX, PurchaseOrderInboundExcelVO.class); + return; + } + PurchaseOrderVO purchaseOrderVO = purchaseOrderService.info(purchaseOrderId, null); + int index = 0; + for (PurchaseOrderItemVO purchaseOrderItemVO : purchaseOrderVO.getPurchaseOrderItemList()) { + PurchaseOrderInboundExcelVO purchaseOrderInboundExcelVO = new PurchaseOrderInboundExcelVO(); + purchaseOrderInboundExcelVO.setPartyCode(purchaseOrderItemVO.getPartyCode()); + purchaseOrderInboundExcelVO.setSpuName(purchaseOrderItemVO.getSpuName()); + purchaseOrderInboundExcelVO.setPurchaseStock(purchaseOrderItemVO.getPurchaseStock()); + purchaseOrderInboundExcelVO.setActualStock(purchaseOrderItemVO.getPurchaseStock() - purchaseOrderItemVO.getActualStock()); + purchaseOrderInboundExcelVO.setBeDeliveredNum(purchaseOrderItemVO.getPurchaseStock() - purchaseOrderItemVO.getActualStock()); + purchaseOrderInboundExcelList.add(purchaseOrderInboundExcelVO); + } + ExcelUtil.soleExcel(response, purchaseOrderInboundExcelList, PurchaseOrderInboundExcelVO.EXCEL_NAME, PurchaseOrderInboundExcelVO.MERGE_ROW_INDEX, + PurchaseOrderInboundExcelVO.MERGE_COLUMN_INDEX, PurchaseOrderInboundExcelVO.class); + } + + @Schema(description = "导入入库文件") + @Parameter(name = "purchaseOrderId", description = "采购订单id") + @PostMapping("/inbound/exportExcel/{purchaseOrderId}") + public ServerResponseEntity> inboundExportExcel(@RequestPart("excelFile") MultipartFile excelFile, + @PathVariable Long purchaseOrderId) { + if (excelFile == null) { + // 网络繁忙,请稍后重试 + throw new LuckException("网络繁忙,请稍后重试"); + } + Long shopId = AuthUserContext.get().getTenantId(); + List excelInfoVO = purchaseOrderExcelService.inboundParseFile(excelFile, shopId, purchaseOrderId); + return ServerResponseEntity.success(excelInfoVO); + } + + private void loadPurchaseOrderDateId(PurchaseOrderDTO purchaseOrder) { + Long purchaseOrderId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_PURCHASE_ORDER, purchaseOrder.getShopId()); + purchaseOrder.setPurchaseOrderId(purchaseOrderId); + Long addId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_PURCHASE_ORDER_ADDR, purchaseOrder.getShopId()); + purchaseOrder.setAddrId(addId); + for (PurchaseOrderItemDTO purchaseOrderItemDTO : purchaseOrder.getPurchaseOrderItemList()) { + Long purchaseItemId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_PURCHASE_ORDER_ITEM, purchaseOrder.getShopId()); + purchaseOrderItemDTO.setPurchaseItemId(purchaseItemId); + } + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderController.java new file mode 100644 index 0000000..bcf7ba6 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderController.java @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.platform; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.order.constant.Constant; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderAddr; +import com.tmerclub.cloud.order.service.OrderAddrService; +import com.tmerclub.cloud.order.service.OrderExcelService; +import com.tmerclub.cloud.order.service.OrderSelfStationService; +import com.tmerclub.cloud.order.service.OrderService; +import io.swagger.v3.oas.annotations.Operation; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 平台订单管理 + * + * @author: cl + * @date: 2021-05-06 16:15:15 + */ +@RestController("platformOrderController") +@RequestMapping("/p/order") +public class OrderController { + private static final Logger logger = LoggerFactory.getLogger(OrderController.class); + + @Autowired + private OrderService orderService; + @Autowired + private OrderExcelService orderExcelService; + @Autowired + private OrderAddrService orderAddrService; + @DubboReference + private UserFeignClient userFeignClient; + @Autowired + private OrderSelfStationService orderSelfStationService; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + + /** + * 分页获取 + */ + @GetMapping("/page") + public ServerResponseEntity> page(OrderSearchDTO orderSearchDTO) { + if (Objects.equals(orderSearchDTO.getStatus(), OrderStatus.PAYED.value())) { + orderSearchDTO.setWaitPurchase(0); + } + if (Objects.equals(orderSearchDTO.getStatus(), Constant.WAIT_PURCHASES_STATUS)) { + orderSearchDTO.setStatus(OrderStatus.PAYED.value()); + orderSearchDTO.setWaitPurchase(1); + } + // 判断处理供应商名称和店铺名称,防止因改名而导致的数据错误 + Map shopNameMap = orderService.checkShopName(orderSearchDTO); + Map supplierNameMap = orderService.checkSupplierName(orderSearchDTO); + EsPageVO orderPage = orderService.orderPage(orderSearchDTO); + for (EsOrderVO esOrderVO : orderPage.getList()) { + if (StrUtil.isNotBlank(esOrderVO.getMobile())) { + esOrderVO.setMobile(PhoneUtil.hideBetween(esOrderVO.getMobile()).toString()); + } + } + // 数据准备 + List supplierIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List shopIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (EsOrderVO orderVO : orderPage.getList()) { + userIds.add(orderVO.getUserId()); + supplierIds.add(orderVO.getSupplierId()); + shopIds.add(orderVO.getShopId()); + } + List userList = userFeignClient.getUserByUserIds(userIds).getData(); + Map userMap = userList.stream().collect(Collectors.toMap(UserApiVO::getUserId, UserApiVO::getNickName)); + if (CollUtil.isEmpty(supplierNameMap) && CollUtil.isNotEmpty(supplierIds)) { + logger.info("补充供应商订单消息"); + List supplierList = supplierDetailFeignClient.listBySupplierIds(supplierIds).getData(); + supplierNameMap.putAll(supplierList.stream().collect(Collectors.toMap(SupplierApiDetailVO::getSupplierId, SupplierApiDetailVO::getSupplierName))); + } + if (CollUtil.isEmpty(shopNameMap)) { + logger.info("补充店铺订单消息"); + List shopList = shopDetailFeignClient.listByShopIds(shopIds).getData(); + shopNameMap.putAll(shopList.stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName))); + } + for (EsOrderVO orderVO : orderPage.getList()) { + orderVO.setShopName(null == shopNameMap.get(orderVO.getShopId()) ? null : shopNameMap.get(orderVO.getShopId())); + orderVO.setSupplierName(null == supplierNameMap.get(orderVO.getSupplierId()) ? null : supplierNameMap.get(orderVO.getSupplierId())); + orderVO.setUserName(null == userMap.get(orderVO.getUserId()) ? "*用户已注销*" : userMap.get(orderVO.getUserId())); + //赠品处理 + Map> map = orderVO.getOrderItems().stream().filter(s -> Objects.equals(s.getActivityType(), OrderActivityType.GIVEAWAY.value())) + .collect(Collectors.groupingBy(EsOrderItemVO::getActivityId)); + //组合处理 + Map> comboMap = orderVO.getOrderItems().stream().filter(s -> Objects.equals(s.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(EsOrderItemVO::getActivityId)); + // 如果没有赠品,就不需要处理 + if (MapUtil.isEmpty(map) && MapUtil.isEmpty(comboMap)) { + continue; + } + // 将赠品放到对应的主订单项中 + Iterator iterator = orderVO.getOrderItems().iterator(); + while (iterator.hasNext()) { + EsOrderItemVO myOrderItemDto = iterator.next(); + // 移除赠品的订单项,进入下一个循环 + if (Objects.equals(myOrderItemDto.getActivityType(), OrderActivityType.GIVEAWAY.value()) || Objects.equals(myOrderItemDto.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + iterator.remove(); + continue; + } + // 主订单项插入赠品订单项 + if (map.containsKey(myOrderItemDto.getOrderItemId())) { + myOrderItemDto.setGiveawayList(map.get(myOrderItemDto.getOrderItemId())); + } + // 主订单项插入组合订单项 + if (comboMap.containsKey(myOrderItemDto.getOrderItemId())) { + myOrderItemDto.setComboList(comboMap.get(myOrderItemDto.getOrderItemId())); + } + } + } + return ServerResponseEntity.success(orderPage); + } + + /** + * 获取信息 + */ + @GetMapping("/order_info/{orderId}") + public ServerResponseEntity info(@PathVariable("orderId") Long orderId) { + // 订单和订单项 + Order order = orderService.getOrderAndOrderItemData(orderId, null); + OrderVO orderVO = BeanUtil.map(order, OrderVO.class); + //如果是自提订单就没有收货地址 + if (!Objects.equals(orderVO.getDeliveryType(), DeliveryType.STATION.value())) { + // 详情用户收货地址 + OrderAddr orderAddr = orderAddrService.getById(order.getOrderAddrId()); + if (Objects.nonNull(orderAddr)) { + orderAddr.setMobile(PhoneUtil.hideBetween(orderAddr.getMobile()).toString()); + } + orderVO.setOrderAddr(BeanUtil.map(orderAddr, OrderAddrVO.class)); + } + // 处理下赠品 + // 获取赠品map + Map> giveawayMap = orderVO.getOrderItems().stream().filter(item -> Objects.equals(item.getActivityType(), OrderActivityType.GIVEAWAY.value())) + .collect(Collectors.groupingBy(OrderItemVO::getActivityId)); + // 获取组合map + Map> comboMap = orderVO.getOrderItems().stream().filter(item -> Objects.equals(item.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(OrderItemVO::getActivityId)); + List orderItemDbList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderItemVO orderItem : orderVO.getOrderItems()) { + // 赠品订单项不需要进行处理 + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.GIVEAWAY.value()) || Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + continue; + } + // 放入赠品 + if (giveawayMap.containsKey(orderItem.getOrderItemId())) { + orderItem.setGiveawayList(giveawayMap.get(orderItem.getOrderItemId())); + } + // 放入组合 + if (comboMap.containsKey(orderItem.getOrderItemId())) { + orderItem.setComboItemList(comboMap.get(orderItem.getOrderItemId())); + } + orderItemDbList.add(orderItem); + } + orderVO.setOrderItems(orderItemDbList); + // 补充自提点信息 + if (order.getDeliveryType() != null + && DeliveryType.STATION.value().equals(order.getDeliveryType())) { + logger.info("自提订单,补充自提点信息"); + OrderSelfStationVO stationVO = orderSelfStationService.getStationByOrderId(null, orderId); + orderVO.setOrderSelfStationVO(stationVO); + } + orderVO.setOrderItems(orderItemDbList); + return ServerResponseEntity.success(orderVO); + } + + + @GetMapping("/get_order_by_userId") + @Operation(summary = "分页获取某个用户的订单数据", description = "分页获取某个用户的订单数据") + public ServerResponseEntity> getOrderByUserId(PageDTO pageDTO, String userId) { + EsPageVO pages = orderService.pageByUserId(pageDTO, userId); + return ServerResponseEntity.success(pages); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderFinanceController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderFinanceController.java new file mode 100644 index 0000000..3a03032 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderFinanceController.java @@ -0,0 +1,47 @@ +package com.tmerclub.cloud.order.controller.platform; + +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailExcelVO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.order.service.OrderFinanceService; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +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.util.List; + +/** + * 财务明细 + * + * @author TRACK + */ +@RestController("platformOrderFinanceController") +@RequestMapping("/p/finance") +public class OrderFinanceController { + + @Autowired + private OrderFinanceService orderFinanceService; + + @GetMapping("/get_finance_detail") + @Operation(summary = "获取财务明细", description = "分页获取财务明细") + public ServerResponseEntity> getFinanceDetail(@Valid PageDTO pageDTO, FinanceDetailDTO financeDetailDTO) { + PageVO pageFinanceDetail = orderFinanceService.pageFinanceDetail(pageDTO, financeDetailDTO); + return ServerResponseEntity.success(pageFinanceDetail); + } + + @GetMapping("/finance_detail_export") + @Operation(summary = "导出excel", description = "导出财务明细") + public ServerResponseEntity financeDetailExport(HttpServletResponse response, FinanceDetailDTO financeDetailDTO) { + List list = orderFinanceService.listExcelFinanceDetail(financeDetailDTO); + ExcelUtil.soleExcel(response, list, FinanceDetailExcelVO.EXCEL_NAME, FinanceDetailExcelVO.MERGE_ROW_INDEX, FinanceDetailExcelVO.MERGE_COLUMN_INDEX, FinanceDetailExcelVO.class); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderStatisticsController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderStatisticsController.java new file mode 100644 index 0000000..eab2b0a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderStatisticsController.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.platform; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.order.service.OrderStatisticsService; +import com.tmerclub.cloud.order.vo.OrderOverviewVO; +import com.tmerclub.cloud.order.vo.OrderRefundStatisticsVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @Author lth + * @Date 2021/4/30 14:01 + */ +@RestController("platformOrderStatisticsController") +@RequestMapping("/p/order_statistics") +@Tag(name = "platform-订单数据统计接口") +public class OrderStatisticsController { + + @Autowired + private OrderStatisticsService orderStatisticsService; + + @GetMapping("/get_detail_by_hour") + @Operation(summary = "获取当天与昨天订单实时统计数据", description = "获取当天与昨天订单实时统计数据") + public ServerResponseEntity getDetailInfoByHour() { + OrderOverviewVO orderOverviewVO = orderStatisticsService.getDetailInfoByHour(null); + return ServerResponseEntity.success(orderOverviewVO); + } + + @GetMapping("/get_order_info_by_day_count") + @Operation(summary = "获取近多少天内的订单统计数据", description = "获取近多少天内订单内的订单统计数据") + @Parameters(@Parameter(name = "dayCount", description = "天数(几天内的统计数据)")) + public ServerResponseEntity getCurrentMonthInfoByDay(@RequestParam(value = "dayCount", defaultValue = "30") Integer dayCount) { + OrderOverviewVO orderOverviewVO = orderStatisticsService.getOrderInfoByDayCountAndShopId(null, dayCount); + return ServerResponseEntity.success(orderOverviewVO); + } + + @GetMapping("/list_spu_ranking_by_order_count") + @Operation(summary = "获取商品订单数量排行榜", description = "获取商品订单数量排行榜") + @Parameters({ + @Parameter(name = "dayCount", description = "天数(几天内的排行榜)"), + @Parameter(name = "limit", description = "排行榜条数") + }) + public ServerResponseEntity> listSpuRankingByPayActual(@RequestParam(value = "dayCount", defaultValue = "30") Integer dayCount, + @RequestParam(value = "limit", defaultValue = "10") Integer limit) { + List orderOverviewVOList = orderStatisticsService.listSpuRankingByOrderCount(null, DateUtil.endOfDay(DateUtil.date()), dayCount, limit); + return ServerResponseEntity.success(orderOverviewVOList); + } + + @GetMapping("/list_shop_ranking_by_pay_actual") + @Operation(summary = "获取店铺销售排行榜", description = "获取店铺销售排行榜") + @Parameters({ + @Parameter(name = "dayCount", description = "天数(几天内的排行榜)"), + @Parameter(name = "limit", description = "排行榜条数") + }) + public ServerResponseEntity> listShopRankingByPayActual(@RequestParam(value = "dayCount", defaultValue = "30") Integer dayCount, + @RequestParam(value = "limit", defaultValue = "10") Integer limit) { + List orderOverviewVOList = orderStatisticsService.listShopRankingByPayActual(DateUtil.endOfDay(DateUtil.date()), dayCount, limit); + return ServerResponseEntity.success(orderOverviewVOList); + } + + @GetMapping("/list_shop_ranking_by_refund_count") + @Operation(summary = "获取店铺退款订单数量排行榜", description = "获取店铺退款订单数量排行榜") + @Parameters({ + @Parameter(name = "dayCount", description = "天数(几天内的排行榜)"), + @Parameter(name = "limit", description = "排行榜条数") + }) + public ServerResponseEntity> listRefundRankingByProd(@RequestParam(value = "dayCount", defaultValue = "30") Integer dayCount, + @RequestParam(value = "limit", defaultValue = "10") Integer limit) { + List orderRefundStatisticsVOList = orderStatisticsService.listShopRankingByRefundCount(DateUtil.endOfDay(DateUtil.date()), dayCount, limit); + return ServerResponseEntity.success(orderRefundStatisticsVOList); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderInvoiceController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderInvoiceController.java new file mode 100644 index 0000000..24e0f22 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderInvoiceController.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.supplier; + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.dto.OrderInvoiceDTO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.order.constant.OrderInvoiceState; +import com.tmerclub.cloud.order.model.OrderInvoice; +import com.tmerclub.cloud.order.service.OrderInvoiceService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.Objects; + +/** + * @author Pineapple + * @date 2021/8/2 8:59 + */ +@RestController("supplierOrderInvoiceController") +@RequestMapping("/s/order_invoice") +@Tag(name = "供应商端订单发票") +public class OrderInvoiceController { + @Autowired + private OrderInvoiceService orderInvoiceService; + + + @GetMapping + @Operation(summary = "获取详细发票信息", description = "根据orderInvoiceId获取发票信息") + public ServerResponseEntity getByOrderInvoiceId(@RequestParam Long orderInvoiceId) { + return ServerResponseEntity.success(orderInvoiceService.getByOrderInvoiceId(orderInvoiceId)); + } + + @PutMapping + @Operation(summary = "更新发票信息", description = "更新发票信息") + public ServerResponseEntity update(@Valid @RequestBody OrderInvoiceDTO orderInvoiceDTO) { + OrderInvoice orderInvoice = BeanUtil.map(orderInvoiceDTO, OrderInvoice.class); + if (Objects.isNull(orderInvoiceDTO.getFileId())) { + //商家提交,不上传文件不给保存 + throw new LuckException("请上传文件"); + } + orderInvoice.setInvoiceState(OrderInvoiceState.ISSUED.value()); + orderInvoice.setUploadTime(new Date()); + orderInvoiceService.update(orderInvoice); + return ServerResponseEntity.success(); + } + + @Operation(summary = "该订单是否已经上传发票") + @GetMapping("/is_upload") + public ServerResponseEntity isUpload(@RequestParam Long orderId) { + Long supplierId = AuthUserContext.get().getTenantId(); + return ServerResponseEntity.success(orderInvoiceService.isUpload(orderId, null, supplierId)); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderRefundController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderRefundController.java new file mode 100644 index 0000000..8ff9c71 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderRefundController.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.supplier; + + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.ReturnProcessStatusEnum; +import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderRefundVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.order.constant.RefundApplyType; +import com.tmerclub.cloud.order.constant.RefundStsType; +import com.tmerclub.cloud.order.constant.SupplierHandleStatus; +import com.tmerclub.cloud.order.dto.multishop.OrderRefundDTO; +import com.tmerclub.cloud.order.model.OrderRefundAddr; +import com.tmerclub.cloud.order.model.OrderSettlement; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.vo.OrderRefundAddrVO; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.client.producer.TransactionSendResult; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + + +/** + * @author FrozenWatermelon + */ +@RestController("supplierOrderRefundController") +@RequestMapping("/s/order_refund") +@Tag(name = "供应商端订单退款") +public class OrderRefundController { + + private final Logger LOGGER = LoggerFactory.getLogger(OrderRefundController.class); + + @Autowired + private OrderRefundService orderRefundService; + @Autowired + private OrderRefundAddrService orderRefundAddrService; + @Autowired + private RocketMQTemplate orderRefundTemplate; + @Autowired + private OrderSettlementService orderSettlementService; + @Autowired + private OrderItemService orderItemService; + @Autowired + private OrderService orderService; + + /** + * 查看我的退款订单列表 + */ + @GetMapping("/page") + @Operation(summary = "我的退款订单列表", description = "我的退款订单列表,显示数量") + public ServerResponseEntity> list(PageDTO page, OrderRefundSearchDTO orderRefundPageDTO) { + orderRefundPageDTO.setSupplierId(AuthUserContext.get().getTenantId()); + orderRefundPageDTO.setSysType(AuthUserContext.get().getSysType()); + EsPageVO pageList = orderRefundService.page(page, orderRefundPageDTO); + return ServerResponseEntity.success(pageList); + } + + /** + * 通过id查询 + * + * @param refundId id + * @return 查询详细信息 + */ + @GetMapping("/info/{refundId}") + public ServerResponseEntity getById(@PathVariable("refundId") Long refundId) { + OrderRefundVO orderRefund = orderRefundService.getDetailByRefundId(refundId); + if (!Objects.equals(orderRefund.getSupplierId(), AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + if (Objects.equals(orderRefund.getApplyType(), RefundApplyType.REFUND_AND_RETURNS.value()) && orderRefund.getHandelTime() != null) { + + OrderRefundAddr orderRefundAddr = orderRefundAddrService.getByRefundId(refundId); + orderRefund.setOrderRefundAddr(BeanUtil.map(orderRefundAddr, OrderRefundAddrVO.class)); + } + if (StrUtil.isNotBlank(orderRefund.getBuyerMobile())) { + orderRefund.setBuyerMobile(PhoneUtil.hideBetween(orderRefund.getBuyerMobile()).toString()); + } + return ServerResponseEntity.success(orderRefund); + } + + + /** + * 进入这个方法,会出现两种情况: + * 1. 仅退款,此时商家同意买家的退款申请,执行发放退款的操作 + * 2. 退货退款操作: + * 2.1)退货退款的第一步,商家允许买家退款的申请,商家进行设置退货地址,不执行发放退款的操作 + * 2.2)退货退款的第二步,当商家收到货之后,同意买家退款,此时需要发放退款,但不会执行这个方法,执行的是下面这个方法 + * + * @see OrderRefundController#returnMoney(OrderRefundDTO) + */ + @PutMapping("/return_and_refund_audit") + public ServerResponseEntity returnAndRefundAudit(@RequestBody OrderRefundDTO orderRefundParam) { + // 处理退款操作 + + OrderRefundVO orderRefundVO = orderRefundService.getDetailByRefundId(orderRefundParam.getRefundId()); + if (!Objects.equals(ReturnProcessStatusEnum.APPLY.value(), orderRefundVO.getReturnMoneySts())) { + // 订单退款状态已发生改变,请勿重复操作 + return ServerResponseEntity.showFailMsg("订单退款状态已发生改变,请勿重复操作"); + } + if (!Objects.equals(orderRefundVO.getSupplierId(), AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + // 拒绝退款,可以不需要分布式事务啥的,因为就单纯拒绝,发个通知给用户,做幂等处理就好了 + if (Objects.equals(orderRefundParam.getRefundSts(), RefundStsType.DISAGREE.value())) { + orderRefundVO.setSupplierHandleStatus(SupplierHandleStatus.SUPPLIER_DISAGREE.value()); + orderRefundService.disagreeRefund(orderRefundParam, orderRefundVO); + return ServerResponseEntity.success(); + } + + // 同意退货,可以不需要分布式事务啥的,因为就单纯拒绝,发个通知给用户,做幂等处理就好了 + if (Objects.equals(orderRefundVO.getApplyType(), RefundApplyType.REFUND_AND_RETURNS.value())) { + + orderRefundService.agreeReturns(orderRefundParam, orderRefundVO, SysTypeEnum.SUPPLIER.value()); + return ServerResponseEntity.success(); + } + + // 同意退款,上面只是同意退货,关系到钱要看下面的 + return agreeRefund(orderRefundParam, orderRefundVO); + } + + @GetMapping("/is_last_refund") + @Operation(summary = "是否为最后一单退款") + public ServerResponseEntity isLastRefund(Long refundId) { + Long shopId = AuthUserContext.get().getTenantId(); + return ServerResponseEntity.success(orderRefundService.getIsLastRefund(refundId, shopId)); + } + + + /** + * 退货退款的第二步,当商家收到货之后,同意买家退款,此时需要发放退款 + */ + @PutMapping("/return_money") + public ServerResponseEntity returnMoney(@Valid @RequestBody OrderRefundDTO orderRefundParam) { + + // 获取退款单信息 + OrderRefundVO orderRefundVO = orderRefundService.getDetailByRefundId(orderRefundParam.getRefundId()); + if (!Objects.equals(ReturnProcessStatusEnum.CONSIGNMENT.value(), orderRefundVO.getReturnMoneySts())) { + throw new LuckException("订单退款状态已发生改变,请勿重复操作"); + } + if (!Objects.equals(orderRefundVO.getSupplierId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + // 拒绝退款,可以不需要分布式事务啥的,因为就单纯拒绝,发个通知给用户,做幂等处理就好了 + if (Objects.equals(orderRefundParam.getRefundSts(), RefundStsType.DISAGREE.value())) { + orderRefundVO.setSupplierHandleStatus(SupplierHandleStatus.SUPPLIER_DISAGREE.value()); + orderRefundService.disagreeRefund(orderRefundParam, orderRefundVO); + return ServerResponseEntity.success(); + } + + return agreeRefund(orderRefundParam, orderRefundVO); + } + + + private ServerResponseEntity agreeRefund(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo) { + + OrderSettlement orderSettlement = orderSettlementService.getByOrderId(orderRefundVo.getOrderId()); + if (orderSettlement == null) { + return ServerResponseEntity.showFailMsg("没有查询到支付记录,无法申请退款"); + } + + orderRefundService.setSupplierOrderRefundInfo(orderRefundVo, orderSettlement); + // 执行退款,真正意义上的退款,需要确保 + // 发送事务消息 + TransactionSendResult transactionSendResult = orderRefundTemplate.sendMessageInTransaction(RocketMqConstant.ORDER_REFUND_TOPIC, new GenericMessage<>(orderRefundVo), orderRefundParam); + + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + LOGGER.error("退款事务消息发送失败,事务状态:{}", transactionSendResult.getLocalTransactionState()); + return ServerResponseEntity.fail(ResponseEnum.EXCEPTION); + } + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderRefundInterventionController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderRefundInterventionController.java new file mode 100644 index 0000000..716ebdf --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderRefundInterventionController.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.supplier; + +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.order.dto.OrderRefundInterventionDTO; +import com.tmerclub.cloud.order.service.OrderRefundInterventionService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 订单退款介入记录信息 + * + * @author FrozenWatermelon + * @date 2023-08-25 10:45:35 + */ +@RestController("supplierOrderRefundInterventionController") +@RequestMapping("/s/order_refund_intervention") +@Tag(name = "订单退款介入记录信息") +public class OrderRefundInterventionController { + + @Autowired + private OrderRefundInterventionService orderRefundInterventionService; + + /** + * 添加介入凭证 + */ + @PutMapping("/save_intervention_voucher") + @Operation(summary = "添加介入凭证") + public ServerResponseEntity savePlatormIntervertion(@RequestBody OrderRefundInterventionDTO orderRefundParam) { + Long tenantId = AuthUserContext.get().getTenantId(); + orderRefundParam.setBizId(tenantId); + orderRefundParam.setSysType(SysTypeEnum.SUPPLIER.value()); + orderRefundInterventionService.savePlatormIntervertion(orderRefundParam); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/PurchaseOrderController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/PurchaseOrderController.java new file mode 100644 index 0000000..71382cc --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/PurchaseOrderController.java @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.supplier; + +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.excel.EasyExcel; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.api.delivery.feign.DeliveryFeignClient; +import com.tmerclub.cloud.api.order.vo.PurchaseOrderAddrVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.order.constant.PurchasesStatusEnum; +import com.tmerclub.cloud.order.dto.PurchaseOrderDTO; +import com.tmerclub.cloud.order.listener.PurchaseOrderExcelListener; +import com.tmerclub.cloud.order.model.PurchaseOrderAddr; +import com.tmerclub.cloud.order.service.PurchaseOrderAddrService; +import com.tmerclub.cloud.order.service.PurchaseOrderExcelService; +import com.tmerclub.cloud.order.service.PurchaseOrderService; +import com.tmerclub.cloud.order.vo.PurchaseOrderExcelVO; +import com.tmerclub.cloud.order.vo.PurchaseOrderItemVO; +import com.tmerclub.cloud.order.vo.PurchaseOrderVO; +import com.tmerclub.cloud.order.vo.UnDeliveryPurchaseOrderExcelVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon on 2018/09/15. + */ +@RestController("supplierPurchaseOrderController") +@RequestMapping("/s/purchase/order") +@Tag(name = "供应商端采购订单") +public class PurchaseOrderController { + + @Autowired + private PurchaseOrderService purchaseOrderService; + @Autowired + private PurchaseOrderExcelService orderExcelService; + @Autowired + private PurchaseOrderAddrService purchaseOrderAddrService; + @DubboReference + private DeliveryFeignClient deliveryFeignClient; + + private static final Logger logger = LoggerFactory.getLogger(PurchaseOrderController.class); + + /** + * 通过id查询 + * + * @param purchaseOrderId id + * @return 单个数据 + */ + @GetMapping("/info/{purchaseOrderId}") + @Operation(summary = "根据id查询采购订单", description = "根据id查询采购订单") + public ServerResponseEntity getById(@PathVariable("purchaseOrderId") Long purchaseOrderId) { + PurchaseOrderVO purchaseOrderVO = purchaseOrderService.info(purchaseOrderId, null); + if (!Objects.equals(AuthUserContext.get().getTenantId(), purchaseOrderVO.getSupplierId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + // 详情用户收货地址 + PurchaseOrderAddr purchaseOrderAddr = purchaseOrderAddrService.getById(purchaseOrderVO.getPurchaseOrderAddrId()); + purchaseOrderVO.setPurchaseOrderAddrVO(BeanUtil.map(purchaseOrderAddr, PurchaseOrderAddrVO.class)); + return ServerResponseEntity.success(purchaseOrderVO); + } + + /** + * 订单项待发货数量查询 + */ + @GetMapping("/order_item_and_address/{purchaseOrderId}") + @Operation(summary = "订单项待发货数量查询", description = "订单项待发货数量查询") + public ServerResponseEntity getOrderItemAndAddress(@PathVariable("purchaseOrderId") Long purchaseOrderId) { + // 订单和订单项 + PurchaseOrderVO purchaseOrderVO = purchaseOrderService.info(purchaseOrderId, AuthUserContext.get().getTenantId()); + List orderItems = purchaseOrderVO.getPurchaseOrderItemList(); + for (PurchaseOrderItemVO orderItem : orderItems) { + orderItem.setChangeNum(orderItem.getBeDeliveredNum() == -1 ? orderItem.getPurchaseStock() : orderItem.getBeDeliveredNum()); + } + // 用户收货地址 + PurchaseOrderAddr purchaseOrderAddr = purchaseOrderAddrService.getById(purchaseOrderVO.getPurchaseOrderAddrId()); + purchaseOrderVO.setPurchaseOrderAddrVO(BeanUtil.map(purchaseOrderAddr, PurchaseOrderAddrVO.class)); + return ServerResponseEntity.success(purchaseOrderVO); + } + + /** + * 审核付款凭证 + * + * @param purchaseOrder + * @return 是否修改成功 + */ + @PutMapping("/auditVoucher") + @Operation(summary = "审核付款凭证", description = "审核付款凭证") + public ServerResponseEntity auditVoucher(@RequestBody PurchaseOrderDTO purchaseOrder) { + + purchaseOrder.setSupplierId(AuthUserContext.get().getTenantId()); + purchaseOrderService.auditVoucher(purchaseOrder); + return ServerResponseEntity.success(); + } + + /** + * 发货 + */ + @PostMapping("/delivery") + @Operation(summary = "发货", description = "发货") + public ServerResponseEntity delivery(@Valid @RequestBody DeliveryOrderDTO deliveryOrderParam) { + // 检查发货数量 + PurchaseOrderVO purchaseOrderVO = purchaseOrderService.info(deliveryOrderParam.getOrderId(), AuthUserContext.get().getTenantId()); + if (Objects.isNull(purchaseOrderVO)) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + // 订单不在支付状态 + if (!Objects.equals(purchaseOrderVO.getStatus(), PurchasesStatusEnum.WAIT_STOCK.value())) { + return ServerResponseEntity.showFailMsg("订单状态异常"); + } + List selectOrderItems = deliveryOrderParam.getSelectOrderItems(); + if (CollectionUtil.isEmpty(selectOrderItems)) { + return ServerResponseEntity.showFailMsg("请至少选择一个订单项进行发货操作"); + } + Map orderItemMap = purchaseOrderVO.getPurchaseOrderItemList().stream().collect(Collectors.toMap(PurchaseOrderItemVO::getPurchaseItemId, orderItem -> orderItem)); + for (DeliveryOrderItemDTO selectOrderItem : selectOrderItems) { + if (!orderItemMap.containsKey(selectOrderItem.getOrderItemId())) { + throw new LuckException("订单项不存在"); + } + PurchaseOrderItemVO orderItem = orderItemMap.get(selectOrderItem.getOrderItemId()); + if (orderItem.getBeDeliveredNum() < selectOrderItem.getChangeNum()) { + throw new LuckException("订单项可发货数量不足,请刷新后重试"); + } + } + // 用户收货地址 + PurchaseOrderAddr purchaseOrderAddr = purchaseOrderAddrService.getById(purchaseOrderVO.getPurchaseOrderAddrId()); + if (Objects.nonNull(purchaseOrderAddr)) { + deliveryOrderParam.setConsignee(purchaseOrderAddr.getConsignee()); + deliveryOrderParam.setMobile(purchaseOrderAddr.getMobile()); + } + purchaseOrderService.delivery(deliveryOrderParam); + return ServerResponseEntity.success(); + } + + @GetMapping("/un_delivery_sold_excel") + @Operation(summary = "导出待发货的订单excel") + public ServerResponseEntity unDeliveryOrderSoldExcel(HttpServletResponse response, PurchaseOrderDTO purchaseOrder) { + purchaseOrder.setSupplierId(AuthUserContext.get().getTenantId()); + orderExcelService.excelUnDeliveryOrderList(response, purchaseOrder); + return ServerResponseEntity.success(); + } + + @PostMapping("/export_order_excel") + @Operation(summary = "导入订单") + public ServerResponseEntity exportOrderExcel(@RequestParam("excelFile") MultipartFile file) { + if (Objects.isNull(file)) { + throw new LuckException("网络繁忙,请稍后重试"); + } + String info; + try { + Map> errorMap = new HashMap<>(8); + EasyExcel.read(file.getInputStream(), UnDeliveryPurchaseOrderExcelVO.class, new PurchaseOrderExcelListener(orderExcelService, errorMap)).sheet().doRead(); + info = orderExcelService.orderExportError(errorMap); + } catch (IOException e) { + logger.error("导入订单失败,失败原因:{}", e.getMessage()); + throw new LuckException(e.getMessage()); + } + return ServerResponseEntity.success(info); + } + + @GetMapping("/sold_excel") + @Operation(summary = "导出excel", description = "导出订单excel") + public ServerResponseEntity orderSoldExcel(HttpServletResponse response, PurchaseOrderDTO purchaseOrder) { + purchaseOrder.setSupplierId(AuthUserContext.get().getTenantId()); + List list = orderExcelService.excelOrderList(purchaseOrder); + ExcelUtil.soleExcel(response, list, PurchaseOrderExcelVO.EXCEL_NAME, PurchaseOrderExcelVO.MERGE_ROW_INDEX, PurchaseOrderExcelVO.MERGE_COLUMN_INDEX, PurchaseOrderExcelVO.class); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/AllotOrderItemDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/AllotOrderItemDTO.java new file mode 100644 index 0000000..0717111 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/AllotOrderItemDTO.java @@ -0,0 +1,158 @@ +package com.tmerclub.cloud.order.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.time.LocalDateTime; + +/** + * 调拨订单商品dto + * @author gaozijie + * @date 2023-11-20 + */ +public class AllotOrderItemDTO { + + @Schema(description = "调拨订单商品id") + private Long allotOrderItemId; + + @Schema(description = "调拨订单id") + private Long allotOrderId; + + @Schema(description = "商品spuId") + private Long spuId; + + @Schema(description = "spu名称") + private String spuName; + + @Schema(description = "商品skuId") + private Long skuId; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "调拨数量") + private Integer allotCount; + + @Schema(description = "入库数量") + private Integer inboundCount; + + @Hidden + @Schema(description = "调拨入库数量") + private Integer allotInCount; + + @Hidden + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + @Hidden + @Schema(description = "店铺id") + private Long shopId; + + public AllotOrderItemDTO() { + } + + public Long getAllotOrderItemId() { + return allotOrderItemId; + } + + public void setAllotOrderItemId(Long allotOrderItemId) { + this.allotOrderItemId = allotOrderItemId; + } + + public Long getAllotOrderId() { + return allotOrderId; + } + + public void setAllotOrderId(Long allotOrderId) { + this.allotOrderId = allotOrderId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Integer getAllotCount() { + return allotCount; + } + + public void setAllotCount(Integer allotCount) { + this.allotCount = allotCount; + } + + public Integer getInboundCount() { + return inboundCount; + } + + public void setInboundCount(Integer inboundCount) { + this.inboundCount = inboundCount; + } + + public Integer getAllotInCount() { + return allotInCount; + } + + public void setAllotInCount(Integer allotInCount) { + this.allotInCount = allotInCount; + } + + public LocalDateTime getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(LocalDateTime updateTime) { + this.updateTime = updateTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "AllotOrderItemDTO{" + + "allotOrderItemId=" + allotOrderItemId + + ", allotOrderId=" + allotOrderId + + ", spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", skuId=" + skuId + + ", skuName='" + skuName + '\'' + + ", allotCount=" + allotCount + + ", inboundCount=" + inboundCount + + ", allotInCount=" + allotInCount + + ", updateTime=" + updateTime + + ", shopId=" + shopId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderRefundAddrDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderRefundAddrDTO.java new file mode 100644 index 0000000..621b447 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderRefundAddrDTO.java @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户退货物流地址DTO + * + * @author FrozenWatermelon + * @date 2021-03-09 13:44:31 + */ +public class OrderRefundAddrDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "物流ID") + private Long refundAddrId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "退款号") + private Long refundId; + + @Schema(description = "买家ID") + private Long userId; + + @Schema(description = "物流公司ID") + private Long deliveryCompanyId; + + @Schema(description = "物流公司名称") + private String deliveryName; + + @Schema(description = "物流单号") + private String deliveryNo; + + @Schema(description = "收件人姓名") + private String consigneeName; + + @Schema(description = "收件人电话(顺丰快递需要)") + private String consigneeMobile; + + @Schema(description = "收件人座机") + private String consigneeTelephone; + + @Schema(description = "收件人邮政编码") + private String consigneePostCode; + + @Schema(description = "收件人地址") + private String consigneeAddr; + + @Schema(description = "发送人手机号码") + private String senderMobile; + + @Schema(description = "买家备注") + private String senderRemarks; + + @Schema(description = "图片凭证") + private String imgs; + + public Long getRefundAddrId() { + return refundAddrId; + } + + public void setRefundAddrId(Long refundAddrId) { + this.refundAddrId = refundAddrId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getDeliveryCompanyId() { + return deliveryCompanyId; + } + + public void setDeliveryCompanyId(Long deliveryCompanyId) { + this.deliveryCompanyId = deliveryCompanyId; + } + + public String getDeliveryName() { + return deliveryName; + } + + public void setDeliveryName(String deliveryName) { + this.deliveryName = deliveryName; + } + + public String getDeliveryNo() { + return deliveryNo; + } + + public void setDeliveryNo(String deliveryNo) { + this.deliveryNo = deliveryNo; + } + + public String getConsigneeName() { + return consigneeName; + } + + public void setConsigneeName(String consigneeName) { + this.consigneeName = consigneeName; + } + + public String getConsigneeMobile() { + return consigneeMobile; + } + + public void setConsigneeMobile(String consigneeMobile) { + this.consigneeMobile = consigneeMobile; + } + + public String getConsigneeTelephone() { + return consigneeTelephone; + } + + public void setConsigneeTelephone(String consigneeTelephone) { + this.consigneeTelephone = consigneeTelephone; + } + + public String getConsigneePostCode() { + return consigneePostCode; + } + + public void setConsigneePostCode(String consigneePostCode) { + this.consigneePostCode = consigneePostCode; + } + + public String getConsigneeAddr() { + return consigneeAddr; + } + + public void setConsigneeAddr(String consigneeAddr) { + this.consigneeAddr = consigneeAddr; + } + + public String getSenderMobile() { + return senderMobile; + } + + public void setSenderMobile(String senderMobile) { + this.senderMobile = senderMobile; + } + + public String getSenderRemarks() { + return senderRemarks; + } + + public void setSenderRemarks(String senderRemarks) { + this.senderRemarks = senderRemarks; + } + + public String getImgs() { + return imgs; + } + + public void setImgs(String imgs) { + this.imgs = imgs; + } + + @Override + public String toString() { + return "OrderRefundAddrDTO{" + + "refundAddrId=" + refundAddrId + + ",shopId=" + shopId + + ",refundId=" + refundId + + ",userId=" + userId + + ",deliveryCompanyId=" + deliveryCompanyId + + ",deliveryName=" + deliveryName + + ",deliveryNo=" + deliveryNo + + ",consigneeName=" + consigneeName + + ",consigneeMobile=" + consigneeMobile + + ",consigneeTelephone=" + consigneeTelephone + + ",consigneePostCode=" + consigneePostCode + + ",consigneeAddr=" + consigneeAddr + + ",senderMobile=" + senderMobile + + ",senderRemarks=" + senderRemarks + + ",imgs=" + imgs + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderRefundInterventionDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderRefundInterventionDTO.java new file mode 100644 index 0000000..e525b6b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderRefundInterventionDTO.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 订单退款介入记录信息DTO + * + * @author FrozenWatermelon + * @date 2023-08-25 10:45:35 + */ +public class OrderRefundInterventionDTO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "退款id") + private Long refundId; + + @Schema(description = "商家/供应商/用户id") + private Long bizId; + + @Schema(description = "系统类型, 0.普通用户 1.商家端 2.平台端 3.供应商端") + private Integer sysType; + + @Schema(description = "凭证说明") + private String voucherDesc; + + @Schema(description = "文件凭证(逗号隔开)") + private String imgUrls; + + @Schema(description = "退款金额") + private Long refundAmount; + + /** + * 退款原因 + */ + @Schema(description = "退款原因") + private String rejectMessage; + + @Schema(description = "平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款") + private Integer platformInterventionRefundType; + + /** + * 平台留言 + */ + @Schema(description = "平台留言") + private String platformMessage; + @Schema(description = "支付完成回跳地址", requiredMode = Schema.RequiredMode.REQUIRED) + private String returnUrl; + /** + * 商家备注 + */ + private String sellerMsg; + + public String getRejectMessage() { + return rejectMessage; + } + + public void setRejectMessage(String rejectMessage) { + this.rejectMessage = rejectMessage; + } + + public String getReturnUrl() { + return returnUrl; + } + + public void setReturnUrl(String returnUrl) { + this.returnUrl = returnUrl; + } + + public String getSellerMsg() { + return sellerMsg; + } + + public void setSellerMsg(String sellerMsg) { + this.sellerMsg = sellerMsg; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Integer getPlatformInterventionRefundType() { + return platformInterventionRefundType; + } + + public void setPlatformInterventionRefundType(Integer platformInterventionRefundType) { + this.platformInterventionRefundType = platformInterventionRefundType; + } + + public String getPlatformMessage() { + return platformMessage; + } + + public void setPlatformMessage(String platformMessage) { + this.platformMessage = platformMessage; + } + + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public String getVoucherDesc() { + return voucherDesc; + } + + public void setVoucherDesc(String voucherDesc) { + this.voucherDesc = voucherDesc; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + @Override + public String toString() { + return "OrderRefundInterventionDTO{" + + ", refundId=" + refundId + + ", bizId=" + bizId + + ", sysType=" + sysType + + ", voucherDesc='" + voucherDesc + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", refundAmount=" + refundAmount + + ", rejectMessage='" + rejectMessage + '\'' + + ", platformInterventionRefundType=" + platformInterventionRefundType + + ", platformMessage='" + platformMessage + '\'' + + ", returnUrl='" + returnUrl + '\'' + + ", sellerMsg='" + sellerMsg + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/app/OrderRefundDeliveryDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/app/OrderRefundDeliveryDTO.java new file mode 100644 index 0000000..f83191b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/app/OrderRefundDeliveryDTO.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto.app; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2021/3/9 + */ +public class OrderRefundDeliveryDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "退款编号名称", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "退款编号不能为空") + private Long refundId; + + @Schema(description = "物流公司ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull + private Long deliveryCompanyId; + + @Schema(description = "物流公司名称", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty + private String deliveryName; + + @Schema(description = "物流单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty + @Length(max = 50, message = "物流单号长度不能超过50") + private String deliveryNo; + + @Schema(description = "手机号码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty + @Length(max = 11, message = "手机号码长度不能超过11") + private String mobile; + + @Schema(description = "备注信息") + @Length(max = 255, message = "备注信息长度不能超过255") + private String senderRemarks; + + @Schema(description = "图片举证") + private String imgs; + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getDeliveryCompanyId() { + return deliveryCompanyId; + } + + public void setDeliveryCompanyId(Long deliveryCompanyId) { + this.deliveryCompanyId = deliveryCompanyId; + } + + public String getDeliveryName() { + return deliveryName; + } + + public void setDeliveryName(String deliveryName) { + this.deliveryName = deliveryName; + } + + public String getDeliveryNo() { + return deliveryNo; + } + + public void setDeliveryNo(String deliveryNo) { + this.deliveryNo = deliveryNo; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getSenderRemarks() { + return senderRemarks; + } + + public void setSenderRemarks(String senderRemarks) { + this.senderRemarks = senderRemarks; + } + + public String getImgs() { + return imgs; + } + + public void setImgs(String imgs) { + this.imgs = imgs; + } + + @Override + public String toString() { + return "OrderRefundDeliveryDTO{" + + "refundId=" + refundId + + ", deliveryCompanyId=" + deliveryCompanyId + + ", deliveryName='" + deliveryName + '\'' + + ", deliveryNo='" + deliveryNo + '\'' + + ", mobile='" + mobile + '\'' + + ", senderRemarks='" + senderRemarks + '\'' + + ", imgs='" + imgs + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/app/OrderRefundPageDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/app/OrderRefundPageDTO.java new file mode 100644 index 0000000..3b688f5 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/app/OrderRefundPageDTO.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto.app; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 申请退款参数 + * + * @author FrozenWatermelon + */ +public class OrderRefundPageDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单号") + private Long orderId; + + @Schema(description = "退款单类型(1:整单退款,2:单个物品退款)") + private Integer refundType; + + @Schema(description = "申请类型:1,仅退款,2退款退货") + private Integer applyType; + + @Schema(description = "手机号码(默认当前订单手机号码)") + private String buyerMobile; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "退款申请开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date beginTime; + + @Schema(description = "退款申请结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)") + private Integer returnMoneySts; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "订单类型 1团购订单 2秒杀订单 3积分订单") + private Integer orderType; + + private Integer sysType; + + private Long supplierId; + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getRefundType() { + return refundType; + } + + public void setRefundType(Integer refundType) { + this.refundType = refundType; + } + + public Integer getApplyType() { + return applyType; + } + + public void setApplyType(Integer applyType) { + this.applyType = applyType; + } + + public String getBuyerMobile() { + return buyerMobile; + } + + public void setBuyerMobile(String buyerMobile) { + this.buyerMobile = buyerMobile; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Date getBeginTime() { + return beginTime; + } + + public void setBeginTime(Date beginTime) { + this.beginTime = beginTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + @Override + public String toString() { + return "OrderRefundPageDTO{" + + "orderId=" + orderId + + ", refundType=" + refundType + + ", applyType=" + applyType + + ", buyerMobile='" + buyerMobile + '\'' + + ", userId=" + userId + + ", shopId=" + shopId + + ", refundId=" + refundId + + ", beginTime=" + beginTime + + ", endTime=" + endTime + + ", returnMoneySts=" + returnMoneySts + + ", shopName='" + shopName + '\'' + + ", orderType=" + orderType + + ", sysType=" + sysType + + ", supplierId=" + supplierId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderItemDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderItemDTO.java new file mode 100644 index 0000000..bc90f1a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderItemDTO.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto.multishop; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单项VO + * + * @author FrozenWatermelon + * @date 2020-12-04 11:27:35 + */ +public class OrderItemDTO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单项ID") + private Long orderItemId; + + @Schema(description = "变化金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long changeAmount; + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(Long changeAmount) { + this.changeAmount = changeAmount; + } + + @Override + public String toString() { + return "OrderItemDTO{" + + "orderItemId=" + orderItemId + + ", changeAmount=" + changeAmount + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderRefundDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderRefundDTO.java new file mode 100644 index 0000000..66a1581 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderRefundDTO.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto.multishop; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + */ +@Schema(description = "multishop-申请退款参数") +public class OrderRefundDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 退款ID + */ + @NotNull(message = "退款ID不能为空") + private Long refundId; + + /** + * 处理状态(2:同意,3:不同意) + */ + @NotNull(message = "处理状态不能为空") + private Integer refundSts; + + /** + * 退款原因 + */ + private String rejectMessage; + + /** + * 退款地址标识(ID) + */ + private Long shopRefundAddrId; + + /** + * 商家备注 + */ + private String sellerMsg; + + /** + * 商家/供应商文件凭证(逗号隔开) + */ + @Schema(description = "商家/供应商文件凭证(逗号隔开)") + private String imgUrls; + /** + * 是否收到货 + */ + @NotNull(message = "是否收到货不能为空") + private Boolean isReceived; + + /** + * 供应商处理状态, -1.商家自行处理 0.供应商处理 1.供应商已同意 2.供应商已拒绝 + */ + @NotNull(message = "供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝") + @Min(value = -1, message = "最小只能为-1") + @Max(value = 2, message = "最大只能为2") + private Integer supplierHandleStatus; + + @Schema(description = "支付完成回跳地址", requiredMode = Schema.RequiredMode.REQUIRED) + private String returnUrl; + + @Hidden + @Schema(description = "用户id") + private Long userId; + + @Hidden + @Schema(description = "不包含的退款状态集合") + private List notInStatuses; + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public String getReturnUrl() { + return returnUrl; + } + + public void setReturnUrl(String returnUrl) { + this.returnUrl = returnUrl; + } + + public Boolean getReceived() { + return isReceived; + } + + public void setReceived(Boolean received) { + isReceived = received; + } + + public Integer getSupplierHandleStatus() { + return supplierHandleStatus; + } + + public void setSupplierHandleStatus(Integer supplierHandleStatus) { + this.supplierHandleStatus = supplierHandleStatus; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Integer getRefundSts() { + return refundSts; + } + + public void setRefundSts(Integer refundSts) { + this.refundSts = refundSts; + } + + public String getRejectMessage() { + return rejectMessage; + } + + public void setRejectMessage(String rejectMessage) { + this.rejectMessage = rejectMessage; + } + + public Long getShopRefundAddrId() { + return shopRefundAddrId; + } + + public void setShopRefundAddrId(Long shopRefundAddrId) { + this.shopRefundAddrId = shopRefundAddrId; + } + + public String getSellerMsg() { + return sellerMsg; + } + + public void setSellerMsg(String sellerMsg) { + this.sellerMsg = sellerMsg; + } + + public Boolean getIsReceived() { + return isReceived; + } + + public void setIsReceived(Boolean received) { + isReceived = received; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public List getNotInStatuses() { + return notInStatuses; + } + + public void setNotInStatuses(List notInStatuses) { + this.notInStatuses = notInStatuses; + } + + @Override + public String toString() { + return "OrderRefundDTO{" + + "refundId=" + refundId + + ", refundSts=" + refundSts + + ", rejectMessage='" + rejectMessage + '\'' + + ", shopRefundAddrId=" + shopRefundAddrId + + ", sellerMsg='" + sellerMsg + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", isReceived=" + isReceived + + ", supplierHandleStatus=" + supplierHandleStatus + + ", returnUrl='" + returnUrl + '\'' + + ", userId=" + userId + + ", notInStatuses=" + notInStatuses + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/AllotOrderFeignController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/AllotOrderFeignController.java new file mode 100644 index 0000000..264bee5 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/AllotOrderFeignController.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.order.feign; + +import com.tmerclub.cloud.api.order.bo.EsAllotOrderBO; +import com.tmerclub.cloud.api.order.feign.AllotOrderFeignClient; +import com.tmerclub.cloud.order.service.AllotOrderService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author gaozijie + * @since 2023-11-24 + */ +@DubboService +public class AllotOrderFeignController implements AllotOrderFeignClient { + + @Autowired + private AllotOrderService allotOrderService; + + @Override + public EsAllotOrderBO saveMongoAndGetEsInfo(Long allotOrderId) { + return allotOrderService.saveMongoAndGetEsInfo(allotOrderId); + } + + @Override + public Long countUnFinish(Long warehouseId) { + return allotOrderService.countUnFinish(warehouseId); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderAddrFeignController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderAddrFeignController.java new file mode 100644 index 0000000..2d913e6 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderAddrFeignController.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.feign; + +import com.tmerclub.cloud.api.order.feign.OrderAddrFeignClient; +import com.tmerclub.cloud.common.order.vo.OrderAddrVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.order.service.OrderAddrService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Author lth + * @Date 2021/11/22 9:21 + */ +@DubboService +public class OrderAddrFeignController implements OrderAddrFeignClient { + + @Autowired + private OrderAddrService orderAddrService; + + @Override + public ServerResponseEntity getOrderAddrByOrderId(Long orderId) { + OrderAddrVO orderAddrVO = orderAddrService.getByOrderId(orderId); + return ServerResponseEntity.success(orderAddrVO); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderFeignController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderFeignController.java new file mode 100644 index 0000000..6bc1a25 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderFeignController.java @@ -0,0 +1,564 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.feign; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.api.order.bo.UserScoreLogOrderBO; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.dto.CustomerRetainedDTO; +import com.tmerclub.cloud.api.order.dto.FlowOrderItemDTO; +import com.tmerclub.cloud.api.order.dto.FormExcelDTO; +import com.tmerclub.cloud.api.order.dto.QueryOrderDTO; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.order.vo.*; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.api.user.bo.UserOrderStatisticBO; +import com.tmerclub.cloud.api.user.bo.UserOrderStatisticListBO; +import com.tmerclub.cloud.api.user.dto.MemberReqDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.bo.OrderIdWithRefundIdBO; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.RefundStatusEnum; +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.dto.OrderVirtualInfoDTO; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.order.manager.MongoOrderManager; +import com.tmerclub.cloud.order.mapper.OrderItemMapper; +import com.tmerclub.cloud.order.mapper.OrderMapper; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderItem; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.service.*; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.client.producer.TransactionSendResult; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/12/25 + */ +@DubboService +public class OrderFeignController implements OrderFeignClient { + + private static final Logger logger = LoggerFactory.getLogger(OrderFeignController.class); + + @Autowired + private OrderService orderService; + @Autowired + private OrderMapper orderMapper; + @Autowired + private OrderItemMapper orderItemMapper; + @Autowired + private OrderItemService orderItemService; + @Autowired + private OrderAnalysisService orderAnalysisService; + @Autowired + private OrderStatisticsService orderStatisticsService; + @Autowired + private MongoOrderManager mongoOrderManager; + @Autowired + private RocketMQTemplate orderSettledShopTemplate; + @Autowired + private RocketMQTemplate orderSettlementShopByAllinpayTemplate; + @Autowired + private RocketMQTemplate orderReceiptTemplate; + @Autowired + private OrderAllinpayService orderAllinpayService; + @Autowired + private OrderVirtualInfoService orderVirtualInfoService; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private SeckillFeignClient seckillFeignClient; + @Autowired + private RocketMQTemplate orderCancelTemplate; + + @Override + public ServerResponseEntity getOrdersAmountAndIfNoCancel(List orderIds, Long userId) { + List orderStatus = orderService.getOrdersStatus(orderIds); + + if (CollectionUtil.isEmpty(orderStatus)) { + // 查询一下redis有没有数据,因为秒杀订单还存在redis + ServerResponseEntity seckillOrderByRedisResp = seckillFeignClient.getSeckillOrderByRedis(orderIds.get(0), userId); + if (!seckillOrderByRedisResp.isSuccess()) { + throw new LuckException(seckillOrderByRedisResp.getMsg()); + } + if (Objects.isNull(seckillOrderByRedisResp.getData())) { + return ServerResponseEntity.fail(ResponseEnum.ORDER_NOT_EXIST); + } + ShopCartOrderMergerVO shopCartOrderMergerVO = seckillOrderByRedisResp.getData(); + ShopCartOrderVO shopCartOrderVO = shopCartOrderMergerVO.getShopCartOrders().get(0); + OrderAmountVO orderAmountVO = new OrderAmountVO(); + orderAmountVO.setPayAmount(shopCartOrderMergerVO.getActualTotal()); + orderAmountVO.setPayScore(0L); + + // 添加下收款人和金额 + ShopAmountVO shopAmountVO = new ShopAmountVO(); + shopAmountVO.setBizUserId(shopCartOrderVO.getShopId().toString()); + shopAmountVO.setAmount(shopCartOrderMergerVO.getActualTotal()); + + orderAmountVO.setShopAmountList(Collections.singletonList(shopAmountVO)); + return ServerResponseEntity.success(orderAmountVO); + } + for (OrderStatusBO orderStatusBO : orderStatus) { + // 订单已关闭 + if (orderStatusBO.getStatus() == null || Objects.equals(orderStatusBO.getStatus(), OrderStatus.CLOSE.value())) { + return ServerResponseEntity.showFailMsg("订单已关闭"); + } + } + OrderAmountVO orderAmountVO = orderService.getOrdersActualAmount(orderIds); + return ServerResponseEntity.success(orderAmountVO); + } + + @Override + public ServerResponseEntity getOrdersAmountAndCheckOrderStatus(List orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return ServerResponseEntity.showFailMsg("订单id列表不能为空"); + } + List orderStatus = orderService.getOrdersStatus(orderIds); + if (CollectionUtil.isEmpty(orderStatus)) { + return ServerResponseEntity.fail(ResponseEnum.ORDER_NOT_EXIST); + } + + for (OrderStatusBO statusBO : orderStatus) { + // 如果现在时间大于尾款时间,尾款时间已过期不能支付 + boolean dateCheck = DateUtil.compare(new Date(), statusBO.getBalanceEndTime()) > 0; + // 订单状态不可支付尾款,请稍后再试 + if (statusBO.getStatus() == null || !Objects.equals(statusBO.getStatus(), OrderStatus.WAIT_BALANCE.value()) || dateCheck) { + return ServerResponseEntity.showFailMsg("订单状态不可支付尾款,请稍后再试"); + } + } + OrderAmountVO orderAmountVO = orderService.getOrdersActualAmount(orderIds); + return ServerResponseEntity.success(orderAmountVO); + } + + @Override + public ServerResponseEntity> getOrdersStatus(List orderIds) { + List orderStatus = orderService.getOrdersStatus(orderIds); + return ServerResponseEntity.success(orderStatus); + } + + @Override + public ServerResponseEntity> getOrdersSimpleAmountInfo(List orderIds) { + return ServerResponseEntity.success(orderService.getOrdersSimpleAmountInfo(orderIds)); + } + + @Override + public ServerResponseEntity getEsOrder(Long orderId) { + EsOrderBO esOrderBO = orderService.getEsOrder(orderId); + return ServerResponseEntity.success(esOrderBO); + } + + @Override + public void submit(ShopCartOrderMergerVO mergerOrder) { + // 发送消息,如果三十分钟后没有支付,则取消订单 + Long orderId = mergerOrder.getShopCartOrders().get(0).getOrderId(); + SendStatus sendStatus = orderCancelTemplate.syncSend(RocketMqConstant.ORDER_CANCEL_TOPIC, new GenericMessage<>(Collections.singletonList(orderId)), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常 + throw new LuckException(ResponseEnum.EXCEPTION); + } + // 目前用于团购活动的提交订单 + orderService.submit(mergerOrder); + } + + @Override + public ServerResponseEntity> countOrderByUserIds(QueryOrderDTO queryOrderDTO) { + Long shopId = queryOrderDTO.getShopId() == null ? 0L : queryOrderDTO.getShopId(); + return ServerResponseEntity.success(orderStatisticsService.countOrderByUserIds(queryOrderDTO.getUserIds(), shopId)); + } + + @Override + public ServerResponseEntity countOrderByUserId(Long userId) { + OrderCountVO orderCount = orderService.countNumberOfStatus(userId); + return ServerResponseEntity.success(orderCount); + } + + @Override + public ServerResponseEntity> getOrderUserIdsBySearchDTO(OrderSearchDTO orderSearchDTO) { + return ServerResponseEntity.success(orderStatisticsService.getOrderUserIdsBySearchDTO(orderSearchDTO)); + } + + @Override + public ServerResponseEntity> listUserIdByPurchaseNum(Integer isPayed, Integer deleteStatus, Date startDate, Date endDate, Integer status, Long minNum, Long maxNum) { + List userIds = orderStatisticsService.listUserIdByPurchaseNum(isPayed, deleteStatus, startDate, endDate, status, minNum, maxNum); + return ServerResponseEntity.success(userIds); + } + + @Override + public ServerResponseEntity> listUserIdByAverageActualTotal(Integer isPayed, Integer deleteStatus, Date startDate, Date endDate, Integer status, Long minAmount, Long maxAmount) { + List userIds = orderStatisticsService.listUserIdByAverageActualTotal(isPayed, deleteStatus, startDate, endDate, status, minAmount, maxAmount); + return ServerResponseEntity.success(userIds); + } + + @Override + public ServerResponseEntity> getProdEffectByDateAndProdIds(List spuIds, Long startTime, Long endTime) { + return ServerResponseEntity.success(orderStatisticsService.getProdEffectByDateAndProdIds(spuIds, new Date(startTime), new Date(endTime))); + } + + @Override + public ServerResponseEntity> getTradeRetained(CustomerRetainedDTO customerRetainedDTO) { + List list = orderAnalysisService.getTradeRetained(customerRetainedDTO); + return ServerResponseEntity.success(list); + } + + @Override + public ServerResponseEntity> listFlowOrderByOrderIds(Collection orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return ServerResponseEntity.success(new ArrayList<>(0)); + } + List orderList = orderStatisticsService.listFlowOrderByOrderIds(orderIds); + return ServerResponseEntity.success(orderList); + } + + @Override + public ServerResponseEntity getPaidMemberByParam(MemberReqDTO param) { + return ServerResponseEntity.success(orderStatisticsService.getPaidMemberByParam(param)); + } + + @Override + public ServerResponseEntity getMemberPayData(MemberReqDTO param) { + UserOrderStatisticListBO userOrderStatisticListBO = orderStatisticsService.getMemberPayData(param); + return ServerResponseEntity.success(userOrderStatisticListBO); + } + + @Override + public ServerResponseEntity removeCacheTradeRetained(CustomerRetainedDTO customerRetainedDTO) { + orderAnalysisService.removeCacheTradeRetained(customerRetainedDTO); + return ServerResponseEntity.success(); + } + + @Override + public void updateOrderItemBatchById(List orderItemVOList) { + List orderItems = BeanUtil.mapAsList(orderItemVOList, OrderItem.class); + for (OrderItem orderItem : orderItems) { + orderItemMapper.update(orderItem); + } + } + + @Override + public EsOrderBO getEsOrderInfo(Long orderId) { + return orderService.getEsOrderInfo(orderId); + } + + + @Override + public ServerResponseEntity getOrderDetailInfo(Long orderId) { + return ServerResponseEntity.success(orderService.getOrderInfoByOrderId(orderId)); + } + + @Override + public ServerResponseEntity countNormalOrderByOrderIds(List orderIds) { + int count = orderMapper.countNormalOrderByOrderIds(orderIds);; + return ServerResponseEntity.success(count); + } + + @Override + public ServerResponseEntity> listSumDataByUserIds(List userIds) { + return ServerResponseEntity.success(orderStatisticsService.listSumDataByUserIds(userIds)); + } + + @Override + public ServerResponseEntity hasBuySuccessProd(Long spuId, Long userId) { + return ServerResponseEntity.success(orderStatisticsService.hasBuySuccessProd(spuId, userId)); + } + + @Override + public ServerResponseEntity calculateUserInShopData(Long userId) { + return ServerResponseEntity.success(orderStatisticsService.calculateUserInShopData(userId)); + } + + @Override + public ServerResponseEntity sumTotalDistributionAmountByOrderItem(List orderItems) { + // 订单总分销金额 + BigDecimal totalDistributionAmount = new BigDecimal(Constant.ZERO_LONG.toString()); + if (CollectionUtil.isNotEmpty(orderItems)) { + for (OrderItemVO orderItem : orderItems) { + if (Objects.isNull(orderItem.getDistributionUserId())) { + continue; + } + // 如果改订单项已经退款了的话,分销员的佣金就已经回退了,不需要继续算钱 + if (Objects.equals(orderItem.getRefundStatus(), RefundStatusEnum.SUCCEED.value()) || Objects.equals(orderItem.getRefundStatus(), RefundStatusEnum.PARTIAL_SUCCESS.value())) { + continue; + } + // 分销佣金 + if (orderItem.getDistributionAmount() != null && orderItem.getDistributionAmount() > 0) { + totalDistributionAmount = totalDistributionAmount.add(new BigDecimal(orderItem.getDistributionAmount().toString())); + } + // 上级分销佣金 + if (orderItem.getDistributionParentAmount() != null && orderItem.getDistributionParentAmount() > 0) { + totalDistributionAmount = totalDistributionAmount.add(new BigDecimal(orderItem.getDistributionParentAmount().toString())); + } + } + } + return ServerResponseEntity.success(totalDistributionAmount.longValue()); + } + + @Override + public ServerResponseEntity> listOrderItemByOrderIds(List orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return ServerResponseEntity.success(new ArrayList<>(0)); + } + return ServerResponseEntity.success(orderItemMapper.listOrderItemByOrderIds(orderIds)); + } + + @Override + public ServerResponseEntity> getInsightSpuIdsByDate(Integer begin, Integer size, Long shopId, Long startTime, Long endTime) { + List spuIds = orderStatisticsService.getInsightSpuIdsByDate(begin, size, shopId, new Date(startTime), new Date(endTime)); + return ServerResponseEntity.success(spuIds); + } + + @Override + public ServerResponseEntity> getUserScoreLogDetail(List orderIds) { + return ServerResponseEntity.success(orderItemService.getUserScoreLogDetail(orderIds)); + } + + @Override + public ServerResponseEntity settledOrder(List orderChangeShopWalletAmountList) { + List orderIds = orderChangeShopWalletAmountList.stream().map(OrderChangeShopWalletAmountBO::getOrderId).filter(Objects::nonNull).toList(); + // 开启事务消息,通知订单自己,开始往各个服务发送通知了 + TransactionSendResult transactionSendResult = orderSettledShopTemplate.sendMessageInTransaction(RocketMqConstant.ORDER_SETTLED_SHOP_TOPIC, new GenericMessage<>(orderChangeShopWalletAmountList), orderIds); + + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity confirmOrder(List orderIds) { + for (Long orderId : orderIds) { + // 开启事务消息,通知订单自己,开始往各个服务发送通知了 + TransactionSendResult transactionSendResult = orderReceiptTemplate.sendMessageInTransaction(RocketMqConstant.ORDER_RECEIPT_TOPIC, new GenericMessage<>(orderId), null); + + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity getActivityOrderInfo(Long orderId) { + OrderActivityVO orderVO = orderMapper.getActivityOrderInfo(orderId); + if (Objects.isNull(orderVO)) { + throw new LuckException("订单不存在, 订单id:" + orderId); + } + OrderItemVO orderItemVO = orderVO.getOrderItems().get(0); + orderVO.setActivityId(orderItemVO.getActivityId()); + orderVO.setActivityType(orderItemVO.getActivityType()); + orderVO.setSpuId(orderItemVO.getSpuId()); + orderVO.setSkuId(orderItemVO.getSkuId()); + orderVO.setCount(orderItemVO.getCount()); + orderVO.setUserId(orderVO.getUserId()); + return ServerResponseEntity.success(orderVO); + } + + @Override + public ServerResponseEntity getUserBuyNumByActivityId(Long activityId, Integer activityType, Long spuId, Long userId) { + Integer num = orderMapper.getUserBuyNumByActivityId(activityId, activityType, spuId, userId); + if (Objects.isNull(num)) { + num = 0; + } + return ServerResponseEntity.success(num); + } + + @Override + public List getActivitySalesQuantity(List orderIds, Integer activityType) { + if (CollUtil.isEmpty(orderIds)) { + throw new LuckException("订单id不能为空"); + } + List orderItemList = orderItemMapper.listOrderItemByOrderIds(orderIds); + List activityIds = orderItemList.stream() + .filter(orderItemVO -> Objects.equals(orderItemVO.getActivityType(), activityType) && Objects.nonNull(orderItemVO.getActivityId())) + .map(OrderItemVO::getActivityId) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(activityIds)) { + return Collections.emptyList(); + } + List orderActivityList = orderStatisticsService.getActivitySalesQuantity(activityIds, activityType); + if (CollUtil.isEmpty(orderActivityList)) { + logger.error("套餐订单数量统计-无套餐统计结果, 套餐活动ids:{}", activityIds); + } + return orderActivityList; + } + + @Override + public ServerResponseEntity> getUserByOrderIdList(List orderIds) { + return ServerResponseEntity.success(orderMapper.getUserByOrderIdList(orderIds)); + } + + @Override + public ServerResponseEntity countActivityOrderSale(Long activityId, Integer activityType) { + return countActivitySkuSale(null, activityId, activityType); + } + + @Override + public ServerResponseEntity countActivitySkuSale(Long skuId, Long activityId, Integer activityType) { + if (Objects.isNull(activityId)) { + throw new LuckException("活动id不能为空"); + } + if (Objects.isNull(activityType)) { + throw new LuckException("活动类型不能为空"); + } + Long activityOrderSale = orderStatisticsService.countActivityOrderSale(skuId, activityId, activityType); + return ServerResponseEntity.success(activityOrderSale.intValue()); + } + + @Override + public ServerResponseEntity> listOrderAndOrderItemByOrderIds(List orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return ServerResponseEntity.success(new ArrayList<>(0)); + } + List orderVOList = orderMapper.listOrderAndOrderItemByOrderIds(orderIds); + return ServerResponseEntity.success(orderVOList); + } + + @Override + public ServerResponseEntity getAccountOrderDetail(Date startTime, Date endTime, String shopName, Long shopId) { + AccountOrderDetailVO accountOrderDetail = orderStatisticsService.getAccountOrderDetail(startTime, endTime, shopName, shopId); + return ServerResponseEntity.success(accountOrderDetail); + } + + @Override + public ServerResponseEntity listShopAccountDetail(Date startTime, Date endTime, String shopName, Integer pageSize, Integer pageNum) { + PageShopAccountOrderVO list = orderStatisticsService.listShopAccountDetail(startTime, endTime, shopName, pageSize, pageNum); + return ServerResponseEntity.success(list); + } + + @Override + public ServerResponseEntity listOrderPayInfo(Date startTime, Date endTime, Long shopId, String shopName, Integer pageSize, Integer pageNum) { + PageShopAccountOrderVO list = orderStatisticsService.listOrderPayInfo(startTime, endTime, shopId, shopName, pageSize, pageNum); + return ServerResponseEntity.success(list); + } + + @Override + public List listFormExcelByParam(FormExcelParamVO formExcelParamVO) { + return orderStatisticsService.listFormExcel(formExcelParamVO); + } + + @Override + public ServerResponseEntity> getSoldNumRankByShopIdAndTime(String key, Long shopId, Integer time, Integer expireTime, Integer esRenovationSpuSort, Long primaryCategoryId) { + return ServerResponseEntity.success(orderStatisticsService.addSoldNumRankCacheByShopIdAndTime(key, shopId, time, expireTime, esRenovationSpuSort, primaryCategoryId)); + } + + @Override + public ServerResponseEntity getGroupInfoById(Long groupActivityId) { + return ServerResponseEntity.success(orderStatisticsService.getGroupInfo(groupActivityId)); + } + + @Override + public ServerResponseEntity> getStationOrderBySeachDTO(OrderSearchDTO orderSearchDTO) { + orderSearchDTO.setDeliveryType(DeliveryType.STATION.value()); + EsPageVO esPageVO = orderService.orderPage(orderSearchDTO); + return ServerResponseEntity.success(esPageVO.getList()); + } + + @Override + public ServerResponseEntity orderStationByOrderId(List orderIds, Long stationId) throws LuckException{ + orderService.orderStationByOrderId(orderIds, null, stationId); + return ServerResponseEntity.success(Boolean.TRUE); + } + + @Override + public ServerResponseEntity> listStationOrder(OrderDTO orderDTO) { + return ServerResponseEntity.success(orderService.listStationOrder(orderDTO)); + } + + @Override + public ServerResponseEntity orderWriteOffByOrderId(OrderVirtualInfoDTO orderVirtualInfoDTO, Long orderId, Long statinoId) { + Order order = orderService.getByOrderId(orderId); + if (Objects.isNull(order) || order.getOrderMold() == 0) { + // 订单不存在 + throw new LuckException("订单不存在"); + } + orderVirtualInfoService.orderWriteOffByOrderId(orderVirtualInfoDTO, order, statinoId); + return ServerResponseEntity.success(Boolean.TRUE); + } + + @Override + public void deleteAllinpayCache() { + orderAllinpayService.deleteAllinpayCache(); + } + + @Override + public ServerResponseEntity settledOrderByAllinpay(List orderList) { + // 开启消息 + SendStatus sendStatus = orderSettlementShopByAllinpayTemplate.syncSend(RocketMqConstant.ORDER_SETTLED_SHOP_BY_ALLINPAY_TOPIC, new GenericMessage<>(orderList)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常 + throw new LuckException(ResponseEnum.EXCEPTION); + } + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> listWaitPurchaseAndUnPayBalanceOrderIds(Integer paySysType) { + List orderList = orderMapper.listWaitPurchaseAndUnPayBalanceOrderIds(paySysType); + List orderIdWithRefundIdList = new ArrayList<>(); + for (OrderVO orderVO : orderList) { + Long segmentId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_REFUND,orderVO.getUserId()); + OrderIdWithRefundIdBO orderIdWithRefundIdBO = new OrderIdWithRefundIdBO(); + orderIdWithRefundIdBO.setOrderId(orderVO.getOrderId()); + orderIdWithRefundIdBO.setRefundId(segmentId); + orderIdWithRefundIdBO.setShopId(orderVO.getShopId()); + orderIdWithRefundIdList.add(orderIdWithRefundIdBO); + } + + return ServerResponseEntity.success(orderIdWithRefundIdList); + } + + @Override + public ServerResponseEntity checkOrderSearchInfo(OrderSearchDTO orderSearchDTO) { + orderService.checkShopName(orderSearchDTO); + orderService.checkSupplierName(orderSearchDTO); + return ServerResponseEntity.success(orderSearchDTO); + } + + @Override + public List listOrderByOrderIds(List orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return new ArrayList<>(); + } + List orderList = orderMapper.listOrderByOrderIds(orderIds); + return orderList; + } + + @Override + public List listFlowOrderItems(FlowOrderItemDTO flowOrderItemDTO) { + return mongoOrderManager.listFlowOrderItems(flowOrderItemDTO); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderInvoiceFeignController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderInvoiceFeignController.java new file mode 100644 index 0000000..b07057f --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderInvoiceFeignController.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.feign; + +import com.tmerclub.cloud.api.order.bo.EsOrderInvoiceBO; +import com.tmerclub.cloud.api.order.feign.OrderInvoiceFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.order.mapper.OrderInvoiceMapper; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/25 + */ +@DubboService +public class OrderInvoiceFeignController implements OrderInvoiceFeignClient { + + private static final Logger logger = LoggerFactory.getLogger(OrderInvoiceFeignController.class); + + @Autowired + private OrderInvoiceMapper orderInvoiceMapper; + + @Override + public ServerResponseEntity getEsOrderInvoice(Long orderInvoiceId) { + return ServerResponseEntity.success(orderInvoiceMapper.getEsOrderInvoice(orderInvoiceId)); + } + + @Override + public ServerResponseEntity> listEsOrderInvoiceByOrderId(Long orderId) { + return ServerResponseEntity.success(orderInvoiceMapper.listEsOrderInvoiceByOrderId(orderId)); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/PurchaseOrderFeignController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/PurchaseOrderFeignController.java new file mode 100644 index 0000000..a78bd91 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/PurchaseOrderFeignController.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.feign; + +import com.tmerclub.cloud.api.order.bo.EsPurchaseOrderBO; +import com.tmerclub.cloud.api.order.feign.PurchaseOrderFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.order.manager.MongoPurchaseOrderManager; +import com.tmerclub.cloud.order.service.PurchaseOrderService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Date; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/25 + */ +@DubboService +public class PurchaseOrderFeignController implements PurchaseOrderFeignClient { + + @Autowired + private PurchaseOrderService purchaseOrderService; + @Autowired + private MongoPurchaseOrderManager mongoPurchaseOrderManager; + + @Override + public ServerResponseEntity saveMongoAndGetEsInfo(Long purchaseOrderId) { + EsPurchaseOrderBO esOrderBO = purchaseOrderService.saveMongoAndGetEsInfo(purchaseOrderId); + return ServerResponseEntity.success(esOrderBO); + } + + + @Override + public ServerResponseEntity updatePurchaseOrderStatus(List purchaseOrderIds, Integer purchaseOrderStatus) { + purchaseOrderService.updatePurchaseOrderStatus(purchaseOrderIds, purchaseOrderStatus); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> listSpuIdOfStockChange(Date beginTime, Date endTime) { + List spuIds = mongoPurchaseOrderManager.listSpuIdOfStockChange(beginTime, endTime); + return ServerResponseEntity.success(spuIds); + } + + @Override + public Long countUnFinish(Long warehouseId) { + return purchaseOrderService.countUnFinish(warehouseId); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/GroupOrderSuccessConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/GroupOrderSuccessConsumer.java new file mode 100644 index 0000000..a25e24d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/GroupOrderSuccessConsumer.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.group.bo.GroupOrderNotifyBO; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.order.mapper.OrderInvoiceMapper; +import com.tmerclub.cloud.order.mapper.OrderMapper; +import com.tmerclub.cloud.order.service.OrderService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.GROUP_ORDER_SUCCESS_TOPIC, consumerGroup = RocketMqConstant.GROUP_ORDER_SUCCESS_GROUP) +public class GroupOrderSuccessConsumer implements RocketMQListener { + + private final Logger LOGGER = LoggerFactory.getLogger(GroupOrderSuccessConsumer.class); + @Autowired + private OrderMapper orderMapper; + @Autowired + private RedissonClient redissonClient; + @DubboReference + private OrderFeignClient orderFeignClient; + @Autowired + private OrderService orderService; + @Autowired + private OrderInvoiceMapper orderInvoiceMapper; + @Autowired + private RocketMQTemplate orderPurchaseNotifyShopTemplate; + @Autowired + private SegmentManager segmentManager; + + /** + * 团购订单成团了,将订单状态变为待发货 + * + * @param orderIds + */ + @Override + public void onMessage(GroupOrderNotifyBO groupOrderNotifyBO) { + List orderIds = groupOrderNotifyBO.getOrderIds(); + if (CollUtil.isEmpty(orderIds)) { + LOGGER.info("团购订单成团了,将订单状态变为待发货, orderIds is empty"); + return; + } + ServerResponseEntity> ordersStatusResponse = orderFeignClient.getOrdersStatus(orderIds); + if (!ordersStatusResponse.isSuccess()) { + LOGGER.error("团购订单成团了,将订单状态变为待发货, 获取订单状态失败, orderIds: {}, msg: {}", orderIds, ordersStatusResponse.getMsg()); + throw new LuckException(ordersStatusResponse.getMsg()); + } + orderMapper.updateGroupOrderSuccessStatus(ordersStatusResponse.getData().get(0).getOrderMold(), orderIds); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderCancelConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderCancelConsumer.java new file mode 100644 index 0000000..b7a672e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderCancelConsumer.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.order.service.OrderService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_CANCEL_TOPIC, consumerGroup = RocketMqConstant.ORDER_CANCEL_TOPIC) +public class OrderCancelConsumer implements RocketMQListener> { + + private final Logger LOGGER = LoggerFactory.getLogger(OrderCancelConsumer.class); + @Autowired + private OrderService orderService; + + /** + * 订单取消,将订单变成已取消状态,如果订单未支付的话 + * 首先先进行订单取消,再进行其他操作,是害怕当订单取消的服务还没处理完成的时候,其他服务查询订单没有被取消,反而失败了 + * 如原本应该判断订是否已经取消,然后还原库存的,但是此时库存服务运行较快,订单服务运行较慢,导致库存服务查订单有没有被取消时,发现订单没被取消,此时还原库存失败。 + * 因此,应该先进行订单取消,再进行其他服务的操作 + */ + @Override + public void onMessage(List orderIds) { + // 如果订单未支付的话,将订单设为取消状态 + LOGGER.info("订单取消,将订单变成已取消状态, orderIds: {}", orderIds); + orderService.cancelOrderAndGetCancelOrderIds(null,orderIds); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderExcelListener.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderExcelListener.java new file mode 100644 index 0000000..0881a88 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderExcelListener.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.tmerclub.cloud.order.constant.Constant; +import com.tmerclub.cloud.order.constant.OrderExportError; +import com.tmerclub.cloud.order.service.OrderExcelService; +import com.tmerclub.cloud.order.vo.UnDeliveryOrderExcelVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 待发货订单导入监听,对数据进行校验 + * + * @author Pineapple + * @date 2021/7/20 11:11 + */ +public class OrderExcelListener extends AnalysisEventListener { + + private static final Logger LOGGER = LoggerFactory.getLogger(OrderExcelListener.class); + private OrderExcelService orderExcelService; + private Map> errorMap; + private List list; + private UnDeliveryOrderExcelVO unDeliveryOrderExcel; + + private static final int BATCH_COUNT = 1000; + private static String seq; + + public OrderExcelListener() { + + } + + public OrderExcelListener(OrderExcelService orderExcelService, Map> errorMap) { + this.orderExcelService = orderExcelService; + this.errorMap = errorMap; + this.list = new ArrayList<>(Constant.INITIAL_CAPACITY); + } + + /** + * 每条数据解析时均会调用 + */ + @Override + public void invoke(UnDeliveryOrderExcelVO unDeliveryOrderExcelVO, AnalysisContext analysisContext) { + if (Objects.isNull(unDeliveryOrderExcelVO.getSeq())) { + if (Objects.isNull(unDeliveryOrderExcel)) { + return; + } + unDeliveryOrderExcelVO.setSeq(unDeliveryOrderExcel.getSeq()); + unDeliveryOrderExcelVO.setOrderId(unDeliveryOrderExcel.getOrderId()); + unDeliveryOrderExcelVO.setDeliveryType(unDeliveryOrderExcel.getDeliveryType()); + unDeliveryOrderExcelVO.setDeliveryCompanyName(unDeliveryOrderExcel.getDeliveryCompanyName()); + unDeliveryOrderExcelVO.setDeliveryNo(unDeliveryOrderExcel.getDeliveryNo()); + } + boolean isSave = Objects.nonNull(seq) && !Objects.equals(seq, unDeliveryOrderExcelVO.getSeq()) && list.size() > BATCH_COUNT; + if (isSave) { + saveData(); + } + unDeliveryOrderExcel = unDeliveryOrderExcelVO; + seq = unDeliveryOrderExcelVO.getSeq(); + list.add(unDeliveryOrderExcelVO); + } + + /** + * 所有数据解析完成调用 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + saveData(); + } + + private void saveData() { + if (CollUtil.isEmpty(list)) { + return; + } + try { + orderExcelService.exportOrderExcel(list, errorMap); + } catch (Exception e) { + List errorList = errorMap.get(OrderExportError.OTHER.value()); + if (CollectionUtil.isEmpty(errorList)) { + errorList = new ArrayList<>(0); + errorMap.put(OrderExportError.OTHER.value(), errorList); + } + errorList.add(e.getMessage()); + } + list.clear(); + } +} \ No newline at end of file diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderPurchaseFinishConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderPurchaseFinishConsumer.java new file mode 100644 index 0000000..16c09ee --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderPurchaseFinishConsumer.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.service.OrderService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * 商家余额支付成功,订单采购完成 + * + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SHOP_BALANCE_PAY_SUCCESS_TOPIC, consumerGroup = RocketMqConstant.SHOP_BALANCE_PAY_SUCCESS_TOPIC) +public class OrderPurchaseFinishConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(OrderPurchaseFinishConsumer.class); + + @Autowired + private OrderService orderService; + + /** + * 修改订单为待采购状态 + */ + @Override + public void onMessage(Long orderId) { + if (Objects.isNull(orderId)) { + return; + } + LOG.info("商家余额支付成功,修改订单为采购完成状态... message: {}", Json.toJsonString(orderId)); + Order order = new Order(); + order.setOrderId(orderId); + // 修改订单的采购状态 + orderService.sourcingOrder(order); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderReceiptTransactionListener.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderReceiptTransactionListener.java new file mode 100644 index 0000000..cb73e97 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderReceiptTransactionListener.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.service.OrderService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * 确认收货事务监听 + * + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQTransactionListener(rocketMQTemplateBeanName = "orderReceiptTemplate", maximumPoolSize = 20) +public class OrderReceiptTransactionListener implements RocketMQLocalTransactionListener { + + @Autowired + private OrderService orderService; + @DubboReference + private OrderFeignClient orderFeignClient; + + @Override + public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) { + Long orderId = Json.parseObject((byte[]) msg.getPayload(), Long.class); + // 众所周知,确认收货之后是不能改变状态的, + // 但是确认收货之前是可以改变状态的,如果在确认收货之前, + // 也就是下面这条sql执行之前进行了订单状态的改变(比如退款),那会造成不可预知的后果, + // 所以更新订单状态的时候也要在条件当中加上订单状态,确定这条sql是原子性的 + // 这里的确认收货,条件加上订单的状态,确保这次更新是幂等的 + int updateStats = orderService.receiptOrder(orderId); + if (updateStats == 0) { + // 如果啥都没有更新,就检查一下 + return checkLocalTransaction(msg); + } + return RocketMQLocalTransactionState.COMMIT; + } + + @Override + public RocketMQLocalTransactionState checkLocalTransaction(Message msg) { + Long orderId = Json.parseObject((byte[]) msg.getPayload(), Long.class); + ServerResponseEntity> ordersStatusResponse = orderFeignClient.getOrdersStatus(Collections.singletonList(orderId)); + if (!ordersStatusResponse.isSuccess()) { + throw new LuckException(ordersStatusResponse.getMsg()); + } + if (CollUtil.isNotEmpty(ordersStatusResponse.getData()) && + !Objects.equals(ordersStatusResponse.getData().get(0).getStatus(), OrderStatus.SUCCESS.value())) { + return RocketMQLocalTransactionState.ROLLBACK; + } + return RocketMQLocalTransactionState.COMMIT; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/RefundIntervertionCanalConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/RefundIntervertionCanalConsumer.java new file mode 100644 index 0000000..bc0fbb2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/RefundIntervertionCanalConsumer.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.constant.PlatformInterventionStatus; +import com.tmerclub.cloud.order.dto.OrderRefundInterventionDTO; +import com.tmerclub.cloud.order.service.OrderRefundService; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.REFUND_INTERVENTION_CANAL_TOPIC, consumerGroup = RocketMqConstant.REFUND_INTERVENTION_CANAL_TOPIC) +public class RefundIntervertionCanalConsumer implements RocketMQListener> { + + @Autowired + private OrderRefundService orderRefundService; + + private static final Logger LOG = LoggerFactory.getLogger(RefundIntervertionCanalConsumer.class); + + @Override + public void onMessage(List refundIds) { + LOG.info("退款平台介入超时回调开始... message: {}", Json.toJsonString(refundIds)); + if (CollectionUtil.isEmpty(refundIds)) { + return; + } + OrderRefundInterventionDTO orderRefundParam = new OrderRefundInterventionDTO(); + orderRefundParam.setPlatformMessage("平台介入超时,系统自动拒绝介入"); + for (Long refundId : refundIds) { + OrderRefundVO orderRefundVO = orderRefundService.getByRefundId(refundId); + orderRefundVO.setPlatformInterventionStatus(PlatformInterventionStatus.REJECT.value()); + orderRefundService.disagreeIntervention(orderRefundParam, orderRefundVO); + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/SeckillOrderCreateConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/SeckillOrderCreateConsumer.java new file mode 100644 index 0000000..55cb173 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/SeckillOrderCreateConsumer.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.RedisSeckillOrderBO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.order.service.OrderService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SECKILL_ORDER_TIME_OUT_CANCEL_TOPIC, consumerGroup = RocketMqConstant.SECKILL_ORDER_TIME_OUT_CANCEL_TOPIC) +public class SeckillOrderCreateConsumer implements RocketMQListener { + private static final Logger LOG = LoggerFactory.getLogger(SeckillOrderCreateConsumer.class); + @Autowired + private OrderService orderService; + @DubboReference + private SeckillFeignClient seckillFeignClient; + + /** + * 秒杀订单超时支付,创建订单 + */ + @Override + public void onMessage(RedisSeckillOrderBO redisSeckillOrderBO) { + LOG.info("秒杀订单超时支付,创建订单:{}", redisSeckillOrderBO); + Long orderId = redisSeckillOrderBO.getOrderId(); + // 查询一下redis中是否有订单数据,没有直接return + ServerResponseEntity seckillOrderResp = seckillFeignClient.getSeckillOrderByRedis(redisSeckillOrderBO.getOrderId(), redisSeckillOrderBO.getUserId()); + if (!seckillOrderResp.isSuccess()) { + throw new LuckException(seckillOrderResp.getMsg()); + } + if(Objects.isNull(seckillOrderResp.getData())){ + return; + } + orderService.cancelOrderAndGetCancelOrderIds(seckillOrderResp.getData(), Collections.singletonList(orderId)); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/StockBillLogPurchaseStorageTransactionListener.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/StockBillLogPurchaseStorageTransactionListener.java new file mode 100644 index 0000000..8253f73 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/StockBillLogPurchaseStorageTransactionListener.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.feign.SkuStockChangeFeignClient; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.product.constant.StockBillStatus; +import com.tmerclub.cloud.common.product.vo.StockBillLogItemVO; +import com.tmerclub.cloud.common.product.vo.StockBillLogVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 采购订单入库事务监听 + * + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQTransactionListener(rocketMQTemplateBeanName = "stockBillLogPurchaseStorageTemplate", maximumPoolSize = 20) +public class StockBillLogPurchaseStorageTransactionListener implements RocketMQLocalTransactionListener { + @DubboReference + private SkuStockChangeFeignClient skuStockChangeFeignClient; + @DubboReference + private SkuFeignClient skuFeignClient; + + @Override + public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object object) { + StockBillLogVO stockBillLog = (StockBillLogVO) object; + List skuStockList = new ArrayList<>(); + + for (StockBillLogItemVO stockBillLogItem : stockBillLog.getStockBillLogItems()) { + skuStockList.add(new SkuStockVO(stockBillLogItem.getSkuId(), stockBillLogItem.getStockCount())); + + } + String stockInfo = skuStockChangeFeignClient.changeStock(skuStockList); + // 入库是增加库存,不会出现库存不足的情况 + if (StrUtil.isBlank(stockInfo)) { + // 库存更新失败,直接回滚 + return RocketMQLocalTransactionState.ROLLBACK; + } + int index = 0; + // skuId_仓库id_剩余库存,skuId_仓库id_剩余库存... + String[] skuStockArray = stockInfo.split(Constant.COMMA); + Map skuStockMap = new HashMap<>(Constant.INITIAL_CAPACITY); + for (StockBillLogItemVO stockBillLogItem : stockBillLog.getStockBillLogItems()) { + String skuStockValue = skuStockArray[index++]; + String[] skuArray = skuStockValue.split(Constant.UNDERLINE); + skuStockMap.put(stockBillLogItem.getSkuId(), Integer.parseInt(skuArray[2])); + // 插入变更后的剩余库存数量 + stockBillLogItem.setAfterStock(skuStockMap.get(stockBillLogItem.getSkuId())); + } + stockBillLog.setStatus(StockBillStatus.SUCCESS.value()); + return RocketMQLocalTransactionState.COMMIT; + } + + + @Override + public RocketMQLocalTransactionState checkLocalTransaction(Message msg) { + //库存更新失败,直接回滚 + return RocketMQLocalTransactionState.ROLLBACK; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoOrderManager.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoOrderManager.java new file mode 100644 index 0000000..33fc19e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoOrderManager.java @@ -0,0 +1,2423 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.constant.EsRenovationProductSortEnum; +import com.tmerclub.cloud.api.multishop.bo.ShopSimpleBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.constant.TimeTypeEnum; +import com.tmerclub.cloud.api.order.dto.CustomerRetainedDTO; +import com.tmerclub.cloud.api.order.dto.FlowOrderItemDTO; +import com.tmerclub.cloud.api.order.dto.FormExcelDTO; +import com.tmerclub.cloud.api.order.vo.*; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.user.bo.UserOrderStatisticBO; +import com.tmerclub.cloud.api.user.bo.UserOrderStatisticListBO; +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.dto.MemberReqDTO; +import com.tmerclub.cloud.api.user.dto.ShopCustomerReqDTO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.mongodb.bo.order.MongoOrderBO; +import com.tmerclub.cloud.common.mongodb.bo.order.MongoOrderItemBO; +import com.tmerclub.cloud.common.order.constant.*; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.OrderActivityVO; +import com.tmerclub.cloud.common.order.vo.OrderCountVO; +import com.tmerclub.cloud.common.order.vo.UserOrderStatisticVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.DateUtils; +import com.tmerclub.cloud.order.constant.FinanceBizType; +import com.tmerclub.cloud.order.service.OrderAllinpayService; +import com.tmerclub.cloud.order.vo.HotProductVO; +import com.tmerclub.cloud.order.vo.OrderOverviewVO; +import com.tmerclub.cloud.order.vo.SupplierOrderOverviewVO; +import com.tmerclub.cloud.order.vo.mongo.*; +import com.tmerclub.cloud.order.vo.mongo.*; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.math.BigDecimal; +import java.util.*; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * 订单统计 + * + * @author FrozenWatermelon + * @date 2020/12/07 + */ +@Component +public class MongoOrderManager { + private static final Logger logger = LoggerFactory.getLogger(MongoOrderManager.class); + + @Autowired + private MongoTemplate mongoTemplate; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @Autowired + private OrderAllinpayService orderAllinpayService; + + public void save(MongoOrderBO mongoOrderBO) { + mongoTemplate.save(mongoOrderBO); + } + + public OrderOverviewVO getOrderOverviewInfoByShopId(Long shopId, Date startTime, Date endTime) { + + // 如果是预售订单,且未付尾款,订单金额为用户支付的定金,其他请求才是订单实际支付金额 + ProjectionOperation initProjectOperation = Aggregation.project("userId","platformAmount") + .and(ConditionalOperators.when(Criteria.where("status").is(OrderStatus.WAIT_BALANCE.value())).then("$depositAmount").otherwise("$actualTotal")).as("actualTotal"); + + // 先根据用户进行分组,统计 + GroupOperation userGroupOperation = Aggregation.group("userId") + .count().as("payOrderCount") + .sum("actualTotal").as("actualTotal") + .sum("platformAmount").as("platformAmount"); + GroupOperation groupOperation = Aggregation.group() + .count().as("payUserCount") + .sum("payOrderCount").as("payOrderCount") + .sum("actualTotal").as("actualTotal") + .sum("platformAmount").as("platformAmount"); + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(1); + filterQuery(criteria, shopId, startTime, endTime); + // 只查询已支付的订单 + // 显示refundSpuCount, refundProdName,字段_id取别名spuId + ProjectionOperation project = Aggregation.project("payUserCount", "payOrderCount", "actualTotal", "platformAmount"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + initProjectOperation, + userGroupOperation, + groupOperation, + project + ); + logger.info("构建getOrderOverviewInfoByShopId()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + OrderOverviewVO orderOverviewVO; + if (CollUtil.isNotEmpty(list)) { + MongoOrderStatisticsVO mongoOrderStatisticsVO = list.get(0); + orderOverviewVO = BeanUtil.map(mongoOrderStatisticsVO, OrderOverviewVO.class); + if (Objects.isNull(shopId)) { + orderOverviewVO.setPayActual(Arith.div(mongoOrderStatisticsVO.getActualTotal(), 100, 2)); + } else { + orderOverviewVO.setPayActual(Arith.div(mongoOrderStatisticsVO.getActualTotal() + mongoOrderStatisticsVO.getPlatformAmount(), 100, 2)); + } + } else { + orderOverviewVO = new OrderOverviewVO(); + orderOverviewVO.setPayOrderCount(0); + orderOverviewVO.setPayUserCount(0); + orderOverviewVO.setPayActual(0.0D); + } + return orderOverviewVO; + } + + public List listActualByHour(Long shopId, Date startTime, Date endTime) { + // 分组前,先处理下要用于分组的时间 + ProjectionOperation projectionOperation = Aggregation.project("actualTotal", "platformAmount") + .and(DateOperators.DateToString.dateOf("createTime").toString("%H")).as("groupDate"); + + // 分组 + GroupOperation groupOperation = Aggregation.group("groupDate") + .sum("actualTotal").as("actualTotal") + .sum("platformAmount").as("platformAmount"); + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(1); + filterQuery(criteria, shopId, startTime, endTime); + + ProjectionOperation project = Aggregation.project("actualTotal", "platformAmount").and("_id").as("timeData"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation, + project + ); + logger.info("listActualByHour()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + List orderOverviewList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (MongoOrderStatisticsVO mongoOrderStatisticsVO : list) { + OrderOverviewVO orderOverviewVO = new OrderOverviewVO(); + orderOverviewVO.setTimeData(mongoOrderStatisticsVO.getTimeData()); + if (Objects.isNull(shopId)) { + orderOverviewVO.setPayActual(mongoOrderStatisticsVO.getActualTotal()); + } else { + orderOverviewVO.setPayActual(mongoOrderStatisticsVO.getActualTotal() + mongoOrderStatisticsVO.getPlatformAmount()); + } + orderOverviewList.add(orderOverviewVO); + } + return orderOverviewList; + } + + public List listOrderOverviewInfoByShopIdAndDateRange(Long shopId, Date startTime, Date endTime, Integer dayCount) { + List refundStatus = new ArrayList<>(Constant.INITIAL_CAPACITY); + refundStatus.add(RefundStatusEnum.SUCCEED.value()); + refundStatus.add(RefundStatusEnum.PARTIAL_SUCCESS.value()); + // 分组前,先处理下要用于分组的时间 + ProjectionOperation projectionOperation = Aggregation.project("actualTotal", "platformAmount", "refundStatus") + .and(ConditionalOperators.when(Criteria.where("refundStatus").in(refundStatus)).then(1).otherwise(0)).as("refundStatus") + .and(DateOperators.DateToString.dateOf("payTime").toString("%Y-%m-%d")).as("groupDate"); + // 分组 + GroupOperation groupOperation = Aggregation.group("groupDate") + .count().as("payOrderCount") + .sum("refundStatus").as("chargebackCount") + .sum("actualTotal").as("actualTotal") + .sum("platformAmount").as("platformAmount"); + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(1); + filterQuery(criteria, shopId, startTime, endTime); + + ProjectionOperation project = Aggregation.project("actualTotal", "platformAmount", "payOrderCount", "chargebackCount") + .and("_id").as("timeData"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation, + project + ); + logger.info("listOrderOverviewInfoByShopIdAndDateRange()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + List orderOverviewList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (MongoOrderStatisticsVO mongoOrderStatisticsVO : list) { + OrderOverviewVO orderOverviewVO = new OrderOverviewVO(); + orderOverviewVO.setTimeData(mongoOrderStatisticsVO.getTimeData()); + orderOverviewVO.setPayOrderCount(mongoOrderStatisticsVO.getPayOrderCount()); + orderOverviewVO.setChargebackCount(mongoOrderStatisticsVO.getChargebackCount()); + if (Objects.isNull(shopId)) { + orderOverviewVO.setPayActual(mongoOrderStatisticsVO.getActualTotal()); + } else { + orderOverviewVO.setPayActual(mongoOrderStatisticsVO.getActualTotal() + mongoOrderStatisticsVO.getPlatformAmount()); + } + orderOverviewList.add(orderOverviewVO); + } + return orderOverviewList; + } + + public OrderCountVO getOrderCountOfStatusByShopId(Long shopId) { + // 分组前,先处理下要用于分组的时间 + ProjectionOperation projectionOperation = Aggregation.project() + .and(ConditionalOperators.when(new Criteria().orOperator(Criteria.where("status").is(1), Criteria.where("status").is(9))) + .then(1).otherwise(0)).as("unPay") + .and(ConditionalOperators.when(new Criteria().andOperator(Criteria.where("status").is(2), Criteria.where("waitPurchase").ne(1))).then(1).otherwise(0)).as("payed") + .and(ConditionalOperators.when(Criteria.where("status").is(3)).then(1).otherwise(0)).as("consignment") + .and(ConditionalOperators.when(Criteria.where("status").is(5)).then(1).otherwise(0)).as("success"); + // 分组 + GroupOperation groupOperation = Aggregation.group() + .count().as("allCount") + .sum("unPay").as("unPay") + .sum("payed").as("payed") + .sum("consignment").as("consignment") + .sum("success").as("success"); + + ProjectionOperation project = Aggregation.project("actualTotal", "platformAmount", "payOrderCount", "chargebackCount").and("_id").as("timeData"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(Criteria.where("shopId").is(shopId)), + projectionOperation, + groupOperation + ); + logger.info("getOrderCountOfStatusByShopId()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + OrderCountVO orderCountVO; + if (CollUtil.isNotEmpty(list)) { + orderCountVO = BeanUtil.map(list.get(0), OrderCountVO.class); + } else { + orderCountVO = new OrderCountVO(); + orderCountVO.setAllCount(0); + orderCountVO.setUnPay(0); + orderCountVO.setPayed(0); + orderCountVO.setConsignment(0); + orderCountVO.setSuccess(0); + } + return orderCountVO; + } + + public List listSpuRankingByOrderCount(Long shopId, Date startTime, Date endTime, int limit) { + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(1); + filterQuery(criteria, shopId, startTime, endTime); + Integer lang = I18nMessage.getLang(); + + String spuName = "orderItems.spuNameZh"; + if (Objects.equals(lang, LanguageEnum.LANGUAGE_EN.getLang())) { + spuName = "orderItems.spuNameEn"; + } + + // 分组 + GroupOperation groupOperation = Aggregation.group("orderItems.spuId") + .count().as("payOrderCount") + .last(spuName).as("spuName"); + + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "payOrderCount"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + Aggregation.unwind("orderItems"), + groupOperation, + sortOperation, + Aggregation.limit(limit) + ); + logger.info("listSpuRankingByOrderCount()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + List orderOverviewList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isEmpty(list)) { + return orderOverviewList; + } + for (MongoOrderStatisticsVO mongoOrderStatisticsVO : list) { + OrderOverviewVO orderOverviewVO = new OrderOverviewVO(); + orderOverviewVO.setPayOrderCount(mongoOrderStatisticsVO.getPayOrderCount()); + orderOverviewVO.setSpuName(mongoOrderStatisticsVO.getSpuName()); + orderOverviewList.add(orderOverviewVO); + } + return orderOverviewList; + } + + public List listShopRankingByPayActual(Date startTime, Date endTime, int limit) { + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(1); + filterQuery(criteria, null, startTime, endTime); + + // 分组 + GroupOperation userGroupOperation = Aggregation.group(new String[]{"shopId", "userId"}) + .count().as("payOrderCount") + .sum("actualTotal").as("payActual"); + + + // 分组 + GroupOperation groupOperation = Aggregation.group("_id.shopId") + .count().as("payUserCount") + .sum("payOrderCount").as("payOrderCount") + .sum("payActual").as("payActual"); + + ProjectionOperation projectionOperation = Aggregation.project("payUserCount", "payOrderCount", "payActual").and("_id").as("shopId"); + + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "payActual"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + userGroupOperation, + groupOperation, + projectionOperation, + sortOperation, + Aggregation.limit(limit) + ); + logger.info("listShopRankingByPayActual()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(0); + } + return BeanUtil.mapAsList(list, OrderOverviewVO.class); + } + + public List statisticalUserOrderData(List userIds, Long shopId) { + if (CollUtil.isEmpty(userIds)) { + return new ArrayList<>(0); + } + + ProjectionOperation projection = Aggregation.project("userId", "payTime") + .and(ConditionalOperators.when(Criteria.where("payType").ne(0)).then("$total").otherwise(0)).as("total") + .and(ConditionalOperators.when(Criteria.where("payType").ne(0)).then("$freightAmount").otherwise(0)).as("freightAmount") + .and(ConditionalOperators.when(Criteria.where("payType").ne(0)).then("$actualTotal").otherwise(0)).as("actualAmount") + .and(ConditionalOperators.when(Criteria.where("payType").ne(0)).then(1).otherwise(0)).as("consTimes") + .and(ConditionalOperators.when(Criteria.where("payType").ne(0)).then("$reduceAmount").otherwise(0)).as("reduceAmount") + .and(ConditionalOperators.when(Criteria.where("payType").ne(0)).then("$actualTotal").otherwise(0)).as("totalAmount"); + + // 分组 + GroupOperation groupOperation = Aggregation.group("userId") + .last("payTime").as("payTime") + .sum("total").as("total") + .sum("freightAmount").as("freightAmount") + .sum("actualAmount").as("actualAmount") + .sum("consTimes").as("consTimes") + .sum("reduceAmount").as("reduceAmount") + .sum("totalAmount").as("totalAmount"); + + ProjectionOperation projectionOperation = Aggregation.project("payTime", "total", "freightAmount", "actualAmount", "consTimes", "reduceAmount", "totalAmount") + .and("_id").as("userId"); + + Criteria criteria; + if (Objects.nonNull(shopId) && !Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + criteria = Criteria.where("isPayed").is(1).and("userId").in(userIds).and("shopId").is(shopId); + } else { + criteria = Criteria.where("isPayed").is(1).and("userId").in(userIds); + } + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + projection, + groupOperation, + projectionOperation + ); + logger.info("statisticalUserOrderData()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + List userOrderStatisticList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (MongoOrderStatisticsVO mongoOrderStatisticsVO : list) { + mongoOrderStatisticsVO.setConsAmount(mongoOrderStatisticsVO.getTotal() + mongoOrderStatisticsVO.getFreightAmount()); + UserOrderStatisticVO userOrderStatistic = BeanUtil.map(mongoOrderStatisticsVO, UserOrderStatisticVO.class); + userOrderStatistic.setReConsTime(mongoOrderStatisticsVO.getPayTime()); + if (Objects.nonNull(mongoOrderStatisticsVO.getConsAmount()) && mongoOrderStatisticsVO.getConsAmount() > 0) { + double averDiscount = Arith.div(Double.valueOf(mongoOrderStatisticsVO.getTotalAmount()), Double.valueOf(mongoOrderStatisticsVO.getConsAmount()), 2); + userOrderStatistic.setAverDiscount(new BigDecimal(averDiscount)); + } else { + userOrderStatistic.setAverDiscount(new BigDecimal(0)); + } + userOrderStatisticList.add(userOrderStatistic); + } + return userOrderStatisticList; + } + + public UserOrderStatisticBO getPaidMemberByParam(MemberReqDTO param) { + Criteria criteria = Criteria.where("isPayed").is(1); + filterQuery(criteria, null, param.getStartTime(), param.getEndTime()); + + if (Objects.nonNull(param.getMemberType()) && param.getMemberType() > 0) { + criteria.and("userType").is(param.getMemberType() - 1); + } + + // 分组 + GroupOperation userGroupOperation = Aggregation.group("userId") + .count().as("consTimes") + .sum("actualTotal").as("actualAmount"); + + + // 分组 + GroupOperation groupOperation = Aggregation.group() + .count().as("payUserCount") + .sum("consTimes").as("consTimes") + .sum("actualAmount").as("actualAmount"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + UserOrderStatisticBO.class, + Aggregation.match(criteria), + userGroupOperation, + groupOperation + ); + logger.info("getPaidMemberByParam()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, "order", UserOrderStatisticBO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + + + if (CollUtil.isNotEmpty(list)) { + return list.get(0); + } + UserOrderStatisticBO userOrderStatisticBO = new UserOrderStatisticBO(); + userOrderStatisticBO.setPayUserCount(0); + userOrderStatisticBO.setActualAmount(0L); + userOrderStatisticBO.setConsTimes(0); + return userOrderStatisticBO; + } + + public UserOrderStatisticListBO getMemberPayData(MemberReqDTO param) { + // 过滤 + UserOrderStatisticListBO userOrderStatisticListBO = this.totalMemberPayData(param); + Criteria criteria = Criteria.where("isPayed").is(1); + filterQuery(criteria, null, param.getStartTime(), param.getEndTime()); + // 分组前,先处理下要用于分组的时间 + ProjectionOperation beforeProjectionOperation = Aggregation.project("userId", "newPayUser", "actualTotal", "firstOrder") + .and(DateOperators.DateToString.dateOf("payTime").toString("%Y-%m-%d")).as("payTime"); + + // 分组, 统计用户的支付信息 + GroupOperation userGroupOperation = Aggregation.group(new String[]{"payTime", "userId"}) + .count().as("consTimes") + //.sum("newPayUser").as("newPayUserCount") + .sum("firstOrder").as("newPayUserCount") + .sum("actualTotal").as("consAmount"); + + // 分组, 统计新老用户的支付信息 + GroupOperation groupOperation = Aggregation.group(new String[]{"_id.payTime", "newPayUserCount"}) + .count().as("payUserCount") + .sum("consTimes").as("consTimes") + .sum("consAmount").as("consAmount"); + + ProjectionOperation projectionOperation = Aggregation.project("payUserCount", "consAmount", "consTimes") + .andExclude("_id") + .and("payTime").as("timeData") + .and("newPayUserCount").as("userType"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + beforeProjectionOperation, + userGroupOperation, + groupOperation, + projectionOperation + ); + logger.info("getMemberPayData()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return userOrderStatisticListBO; + } + Map> map = list.stream().collect(Collectors.groupingBy(MongoOrderStatisticsVO::getUserType)); + if (map.containsKey(0)) { + userOrderStatisticListBO.setOldUserOrderStatisticList(BeanUtil.mapAsList(map.get(0), UserOrderStatisticBO.class)); + } + if (map.containsKey(1)) { + userOrderStatisticListBO.setNewUserOrderStatisticList(BeanUtil.mapAsList(map.get(1), UserOrderStatisticBO.class)); + } + return userOrderStatisticListBO; + } + + private UserOrderStatisticListBO totalMemberPayData(MemberReqDTO param) { + Criteria criteria = Criteria.where("isPayed").is(1); + filterQuery(criteria, null, param.getStartTime(), param.getEndTime()); + + // 分组, 统计用户的支付信息 + GroupOperation userGroupOperation = Aggregation.group("userId") + .count().as("consTimes") + .sum("newPayUser").as("newPayUserCount") + .sum("actualTotal").as("consAmount"); + + // 分组, 统计新老用户的支付信息 + GroupOperation groupOperation = Aggregation.group("newPayUserCount") + .count().as("payUserCount") + .sum("consTimes").as("consTimes") + .sum("consAmount").as("consAmount"); + + ProjectionOperation projectionOperation = Aggregation.project("payUserCount", "consTimes", "consAmount").and("_id").as("userType"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + userGroupOperation, + groupOperation, + projectionOperation + ); + logger.info("getMemberPayData()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + UserOrderStatisticListBO userOrderStatisticListBO = new UserOrderStatisticListBO(); + if (CollUtil.isEmpty(list)) { + return userOrderStatisticListBO; + } + for (MongoOrderStatisticsVO mongoOrderStatisticsVO : list) { + UserOrderStatisticBO userOrderStatisticBO = BeanUtil.map(mongoOrderStatisticsVO, UserOrderStatisticBO.class); + if (Objects.equals(mongoOrderStatisticsVO.getUserType(), 1)) { + userOrderStatisticListBO.setNewUserOrderStatistic(userOrderStatisticBO); + continue; + } + userOrderStatisticListBO.setOldUserOrderStatistic(userOrderStatisticBO); + } + return userOrderStatisticListBO; + } + + /** + * - 获取新支付用户的信息 + * - 关联订单,过滤掉不属于筛选时间段内的订单 + * - 根据从表的用户和时间进行分组,得到每个用户的购买时间 + * - 根据主表时间和从表的时间进行分组,计算每组的数量返回即可 + * + * @param customerRetainedDTO + * @return + */ + public List getTradeRetained(CustomerRetainedDTO customerRetainedDTO) { + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(1).and("firstOrder").is(1); + filterQuery(criteria, null, customerRetainedDTO.getStartTime(), customerRetainedDTO.getEndTime()); + + ProjectionOperation initProjectionOperation = Aggregation.project("userId").and(DateOperators.DateToString.dateOf("payTime").toString("%Y%m")).as("newPayTime"); +// // 分不分组都行,分组保险一点 +// // 分组 + GroupOperation userGroupOperation = Aggregation.group("newPayTime", "userId"); + + // 关联order表 + LookupOperation lookupOperation = Aggregation.lookup("order", "_id.userId", "userId", "orders"); + + + MatchOperation lookupMatchOperation = Aggregation.match( + Criteria.where("orders.isPayed").is(1) + .and("orders.payTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(customerRetainedDTO.getStartTime()))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(customerRetainedDTO.getEndTime()))) + ); + + UnwindOperation lookupUnwindOperation = Aggregation.unwind("orders"); + + ProjectionOperation lookupProjectionOperation = Aggregation.project() + .and(DateOperators.DateToString.dateOf("orders.payTime").toString("%Y%m")).as("payTime") + .and("$_id.newPayTime").as("newPayTime") + .and("$orders.userId").as("userId"); + + // 关联分组 + GroupOperation lookupGroupOperation = Aggregation.group("newPayTime", "payTime", "userId"); + + // 分组 + GroupOperation groupOperation = Aggregation.group(new String[]{"_id.newPayTime", "_id.payTime"}) + .count().as("payUserCount"); + + ProjectionOperation projectionOperation = Aggregation.project("payUserCount") + .and("newPayTime").as("currentMonth") + .and("payTime").as("timeData"); + + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + initProjectionOperation, + userGroupOperation, + lookupOperation, + lookupUnwindOperation, + lookupMatchOperation, + lookupProjectionOperation, + lookupGroupOperation, + groupOperation, + projectionOperation + ); + logger.info("getTradeRetained()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + List customerRetainList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (MongoOrderStatisticsVO mongoOrderStatisticsVO : list) { + CustomerRetainVO customerRetainVO = new CustomerRetainVO(); + customerRetainVO.setNewCustomers(mongoOrderStatisticsVO.getPayUserCount()); + customerRetainVO.setDealMonth(mongoOrderStatisticsVO.getTimeData()); + customerRetainVO.setCurrentMonth(mongoOrderStatisticsVO.getCurrentMonth()); + customerRetainList.add(customerRetainVO); + } + return customerRetainList; + } + + public List listHotProdRanking(Long supplierId, Date startTime, Date endTime, Integer lang) { + List prodList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(1) + .and("supplierDeliveryType").is(1) + .and("waitPurchase").ne(1); + filterQuery(criteria, null, startTime, endTime); + if (Objects.nonNull(supplierId)) { + criteria.and("supplierId").is(supplierId); + } + + UnwindOperation unwindOperation = Aggregation.unwind("orderItems"); + + String spuName; + if (Objects.equals(lang, LanguageEnum.LANGUAGE_EN.getLang())) { + spuName = "orderItems.spuNameEn"; + } else { + spuName = "orderItems.spuNameZh"; + } + + // 分组 + GroupOperation groupOperation = Aggregation.group("orderItems.spuId") + .count().as("payOrderCount") + .sum("orderItems.actualTotal").as("totalAmount") + .sum("orderItems.count").as("payProdCount") + .last(spuName).as("spuName"); + // 支付金额倒序 + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "totalAmount"); + ProjectionOperation projectionOperation = Aggregation.project("payOrderCount", "totalAmount", "payProdCount", "spuName") + .and("_id").as("spuId"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + unwindOperation, + groupOperation, + sortOperation, + projectionOperation + ); + logger.info("listHotProdRanking()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return prodList; + } + for (MongoOrderStatisticsVO mongoOrderStatisticsVO : list) { + HotProductVO hotProductVO = new HotProductVO(); + hotProductVO.setSpuId(mongoOrderStatisticsVO.getSpuId()); + hotProductVO.setSpuName(mongoOrderStatisticsVO.getSpuName()); + hotProductVO.setOrderNums(mongoOrderStatisticsVO.getPayOrderCount()); + hotProductVO.setProductNums(mongoOrderStatisticsVO.getPayProdCount()); + hotProductVO.setPayAmount(Double.valueOf(mongoOrderStatisticsVO.getTotalAmount())); + prodList.add(hotProductVO); + } + return prodList; + } + + public OrderOverviewVO getOrderOverviewInfoBySupplierId(Long supplierId, Date startTime, Date endTime) { + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(1) + .and("supplierDeliveryType").is(1) + .and("waitPurchase").ne(1); + filterQuery(criteria, null, startTime, endTime); + if (Objects.nonNull(supplierId)) { + criteria.and("supplierId").is(supplierId); + } + + // 根据用户进行分组 + GroupOperation userIdGroupOperation = Aggregation.group("userId") + .sum("actualTotal").as("actualTotal") + .sum("platformAmount").as("platformAmount"); + + // 分组 + GroupOperation groupOperation = Aggregation.group() + .count().as("payUserCount") + .sum("actualTotal").as("actualTotal") + .sum("platformAmount").as("platformAmount"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + userIdGroupOperation, + groupOperation + ); + logger.info("getOrderOverviewInfoBySupplierId()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + OrderOverviewVO orderOverviewVO = new OrderOverviewVO(); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + orderOverviewVO.setPayUserCount(0); + orderOverviewVO.setPayActual(0.0D); + return orderOverviewVO; + } + MongoOrderStatisticsVO mongoOrderStatisticsVO = list.get(0); + if (Objects.isNull(supplierId)) { + orderOverviewVO.setPayActual(mongoOrderStatisticsVO.getActualTotal()); + } else { + orderOverviewVO.setPayActual(mongoOrderStatisticsVO.getActualTotal() + mongoOrderStatisticsVO.getPlatformAmount()); + } + orderOverviewVO.setPayUserCount(mongoOrderStatisticsVO.getPayUserCount()); + return orderOverviewVO; + } + + public List listProdSoldCountByHour(Long supplierId, Date startTime, Date endTime) { + List orderList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(1) + .and("supplierDeliveryType").is(1) + .and("status").ne(6); + filterQuery(criteria, null, startTime, endTime); + if (Objects.nonNull(supplierId)) { + criteria.and("supplierId").is(supplierId); + } + + ProjectionOperation beginProjectionOperation = Aggregation.project("payTime", "allCount") + .and(DateOperators.DateToString.dateOf("payTime").toString("%H")).as("timeData"); + + // 根据用户进行分组 + GroupOperation groupOperation = Aggregation.group("timeData") + .sum("allCount").as("payOrderCount"); + + + ProjectionOperation projectionOperation = Aggregation.project("payOrderCount").and("_id").as("timeData"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + beginProjectionOperation, + groupOperation, + projectionOperation + ); + logger.info("listProdSoldCountByHour()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return orderList; + } + for (MongoOrderStatisticsVO mongoOrderStatisticsVO : list) { + SupplierOrderOverviewVO supplierOrderOverviewVO = new SupplierOrderOverviewVO(); + supplierOrderOverviewVO.setTimeData(mongoOrderStatisticsVO.getTimeData()); + supplierOrderOverviewVO.setTodayProdSoldNums(mongoOrderStatisticsVO.getPayOrderCount()); + orderList.add(supplierOrderOverviewVO); + } + return orderList; + } + + public List listPayActualByDay(Long supplierId, Date startTime, Date endTime) { + List orderList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(1) + .and("supplierDeliveryType").is(1) + .and("waitPurchase").ne(1); + filterQuery(criteria, null, startTime, endTime); + if (Objects.nonNull(supplierId)) { + criteria.and("supplierId").is(supplierId); + } + + ProjectionOperation beginProjectionOperation = Aggregation.project("actualTotal", "platformAmount") + .and(DateOperators.DateToString.dateOf("payTime").toString("%Y-%m-%d")).as("timeData"); + + // 根据用户进行分组 + GroupOperation groupOperation = Aggregation.group("timeData") + .sum("actualTotal").as("actualTotal") + .sum("platformAmount").as("platformAmount"); + + + ProjectionOperation projectionOperation = Aggregation.project("actualTotal", "platformAmount").and("_id").as("timeData"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + beginProjectionOperation, + groupOperation, + projectionOperation + ); + logger.info("listPayActualByDay()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return orderList; + } + for (MongoOrderStatisticsVO mongoOrderStatisticsVO : list) { + OrderOverviewVO orderOverviewVO = new OrderOverviewVO(); + if (Objects.isNull(supplierId)) { + orderOverviewVO.setPayActual(mongoOrderStatisticsVO.getActualTotal()); + } else { + orderOverviewVO.setPayActual(mongoOrderStatisticsVO.getActualTotal() + mongoOrderStatisticsVO.getPlatformAmount()); + } + orderOverviewVO.setTimeData(mongoOrderStatisticsVO.getTimeData()); + orderList.add(orderOverviewVO); + } + return orderList; + } + + public Integer getShopNewUsersBySupplierId(Long supplierId, Date startTime, Date endTime) { + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(1) + .and("supplierDeliveryType").is(1) + .and("firstSupplierOrder").is(1) + .and("supplierId").is(supplierId); + filterQuery(criteria, null, startTime, endTime); + + // 分组 + GroupOperation groupOperation = Aggregation.group() + .count().as("payUserCount"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + groupOperation + ); + logger.info("getShopNewUsersBySupplierId()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return 0; + } + return list.get(0).getPayUserCount(); + } + + public OrderCountVO getOrderCountOfStatusBySupplierId(Long supplierId) { + // 过滤 + Criteria criteria = Criteria.where("supplierId").is(supplierId) + .and("supplierDeliveryType").is(1) + .and("waitPurchase").ne(1); + + // 分组前,先处理下要用于分组的时间 + ProjectionOperation projectionOperation = Aggregation.project() + .and(ConditionalOperators.when(Criteria.where("status").is(1)).then(1).otherwise(0)).as("unPay") + .and(ConditionalOperators.when(Criteria.where("status").is(2)).then(1).otherwise(0)).as("payed") + .and(ConditionalOperators.when(Criteria.where("status").is(3)).then(1).otherwise(0)).as("consignment") + .and(ConditionalOperators.when(Criteria.where("status").is(5)).then(1).otherwise(0)).as("success"); + // 分组 + GroupOperation groupOperation = Aggregation.group() + .count().as("allCount") + .sum("unPay").as("unPay") + .sum("payed").as("payed") + .sum("consignment").as("consignment") + .sum("success").as("success"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation + ); + logger.info("getOrderCountOfStatusBySupplierId()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + OrderCountVO orderCountVO; + if (CollUtil.isNotEmpty(list)) { + orderCountVO = BeanUtil.map(list.get(0), OrderCountVO.class); + } else { + orderCountVO = new OrderCountVO(); + orderCountVO.setAllCount(0); + orderCountVO.setUnPay(0); + orderCountVO.setPayed(0); + orderCountVO.setConsignment(0); + orderCountVO.setSuccess(0); + } + return orderCountVO; + } + + public List getOrderUserIdsBySearchDTO(OrderSearchDTO orderSearchDTO) { + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(1); + filterQuery(criteria, null, orderSearchDTO.getStartTime(), orderSearchDTO.getEndTime()); + if (Objects.nonNull(orderSearchDTO.getDeleteStatus())) { + criteria.and("deleteStatus").is(orderSearchDTO.getDeleteStatus()); + } + if (Objects.nonNull(orderSearchDTO.getStatus())) { + criteria.and("status").is(orderSearchDTO.getStatus()); + } + if (Objects.nonNull(orderSearchDTO.getActualTotalMin()) && Objects.nonNull(orderSearchDTO.getActualTotalMax())) { + criteria.and("actualTotal").gte(orderSearchDTO.getActualTotalMin()).lte(orderSearchDTO.getActualTotalMax()); + } + + // 分组 + GroupOperation groupOperation = Aggregation.group("userId"); + + ProjectionOperation projectionOperation = Aggregation.project().and("_id").as("userId"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + groupOperation, + projectionOperation + ); + logger.info("getOrderUserIdsBySearchDTO()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(0); + } + return list.stream().map(MongoOrderStatisticsVO::getUserId).collect(Collectors.toList()); + } + + /** + * 获取在一定时间内消费一定次数的会员信息 + * + * @param isPayed 是否已支付 + * @param deleteStatus 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除 + * @param startDate 开始时间 + * @param endDate 结束时间 + * @param status 状态 + * @param minNum 最小数量 + * @param maxNum 最大数量 + * @return 会员id + */ + public List listUserIdByPurchaseNum(Integer isPayed, Integer deleteStatus, Date startDate, Date endDate, Integer status, Long minNum, Long maxNum) { + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(isPayed); + if (Objects.nonNull(deleteStatus)) { + criteria.and("deleteStatus").is(deleteStatus); + } + if (Objects.nonNull(status)) { + criteria.and("status").is(status); + } + String timeFiled = "finallyTime"; + if (Objects.equals(isPayed, 1)) { + timeFiled = "payTime"; + } + if (Objects.nonNull(startDate) || Objects.nonNull(endDate)) { + if (Objects.nonNull(startDate) && Objects.nonNull(endDate)) { + criteria.and(timeFiled).gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startDate))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endDate))); + } else if (Objects.nonNull(startDate)) { + criteria.and(timeFiled).gte(startDate); + } else { + criteria.and(timeFiled).lte(endDate); + } + } + + // 分组 + GroupOperation groupOperation = Aggregation.group("userId") + .count().as("count"); + + + ProjectionOperation projectionOperation = Aggregation.project().and("_id").as("userId"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + groupOperation, + Aggregation.match(Criteria.where("count").gte(minNum).lte(maxNum)), + projectionOperation + ); + logger.info("listUserIdByPurchaseNum()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(0); + } + return list.stream().map(MongoOrderStatisticsVO::getUserId).collect(Collectors.toList()); + } + + /** + * 获取在一定时间内消费一定金额的会员信息 + * + * @param isPayed 是否已支付 + * @param deleteStatus 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除 + * @param startDate 开始时间 + * @param endDate 结束时间 + * @param status 状态 + * @param minAmount 最小支付金额 + * @param maxAmount 最大支付金额 + * @return 会员id + */ + public List listUserIdByAverageActualTotal(Integer isPayed, Integer deleteStatus, Date startDate, Date endDate, Integer status, Long minAmount, Long maxAmount) { + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(isPayed); + if (Objects.nonNull(deleteStatus)) { + criteria.and("deleteStatus").is(deleteStatus); + } + if (Objects.nonNull(status)) { + criteria.and("status").is(status); + } + + String timeField = "finallyTime"; + if (Objects.equals(isPayed, 1)) { + timeField = "payTime"; + } + if (Objects.nonNull(startDate) || Objects.nonNull(endDate)) { + if (Objects.nonNull(startDate) && Objects.nonNull(endDate)) { + criteria.and(timeField).gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startDate))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endDate))); + } else if (Objects.nonNull(startDate)) { + criteria.and(timeField).gte(startDate); + } else { + criteria.and(timeField).lte(endDate); + } + } + + // 分组 + GroupOperation groupOperation = Aggregation.group("userId") + .avg("actualTotal").as("avgAmount"); + + ProjectionOperation projectionOperation = Aggregation.project().and("_id").as("userId"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + groupOperation, + Aggregation.match(Criteria.where("avgAmount").gte(minAmount).lte(maxAmount)), + projectionOperation + ); + logger.info("listUserIdByAverageActualTotal()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(0); + } + return list.stream().map(MongoOrderStatisticsVO::getUserId).collect(Collectors.toList()); + } + + /** + * 根据参数获取数据分析中的订单信息 + * + * @param spuIds 产品id列表 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 商品分析数据 + */ + public List getProdEffectByDateAndProdIds(List spuIds, Date startTime, Date endTime) { + // 过滤 + Criteria criteria = Criteria.where("orderItems.spuId").in(spuIds) + .and("createTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + + UnwindOperation unwindOperation = Aggregation.unwind("orderItems"); + + ProjectionOperation userProjectionOperation = Aggregation.project("userId", "isPayed") + .and("orderItems.spuId").as("spuId") + .and("orderItems.count").as("count") + .and("orderItems.refundAmount").as("actualTotal") + .and(ConditionalOperators.when(Criteria.where("isPayed").is(1)).then("$orderItems.count").otherwise(0)).as("payNum") + .and(ConditionalOperators.when(Criteria.where("isPayed").is(1)).then("$orderItems.actualTotal").otherwise(0)).as("payAmount"); + + // 分组 + GroupOperation userGroupOperation = Aggregation.group(new String[]{"spuId", "userId"}) + .first("isPayed").as("isPayed") + .sum("count").as("placeOrderNum") + .sum("payNum").as("payNum") + .sum("actualTotal").as("placeOrderAmount") + .sum("payAmount").as("payAmount") + .sum("isPayed").as("payOrder"); + ProjectionOperation spuProjectionOperation = Aggregation.project("isPayed", "placeOrderNum", "payNum", "placeOrderAmount", "payAmount", "payOrder") + .and(ConditionalOperators.when(Criteria.where("payOrder").gt(0)).then(1).otherwise(0)).as("payPerson") + .and("_id.spuId").as("spuId"); + + // 分组 + GroupOperation groupOperation = Aggregation.group("spuId") + .count().as("placeOrderPerson") + .first("spuId").as("spuId") + .sum("payPerson").as("payPerson") + .sum("payNum").as("payNum") + .sum("placeOrderNum").as("placeOrderNum") + .sum("placeOrderAmount").as("placeOrderAmount") + .sum("payAmount").as("payAmount") + .sum("payOrder").as("payOrderNum"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + unwindOperation, + userProjectionOperation, + userGroupOperation, + spuProjectionOperation, + groupOperation + ); + logger.info("getProdEffectByDateAndProdIds()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + List orderProdEffectRespList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isEmpty(list)) { + return orderProdEffectRespList; + } + return BeanUtil.mapAsList(list, OrderProdEffectRespVO.class); + } + + /** + * 根据订单id列表, 获取订单流量信息列表 + * + * @param orderIds 订单id列表 + * @return 订单流量信息列表 + */ + public List listFlowOrderByOrderIds(Collection orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return new ArrayList<>(0); + } + // 过滤 + Criteria criteria = Criteria.where("_id").in(orderIds); + + UnwindOperation unwindOperation = Aggregation.unwind("orderItems"); + + // 分组 + GroupOperation groupOperation = Aggregation.group(new String[]{"_id", "orderItems.spuId"}) + .first("_id").as("orderId") + .first("orderItems.userId").as("userId") + .first("orderItems.spuId").as("spuId") + .first("isPayed").as("isPayed") + .sum("orderItems.actualTotal").as("actualAmount"); + + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + unwindOperation, + groupOperation + ); + logger.info("listFlowOrderByOrderIds()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + List flowOrderList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isEmpty(list)) { + return flowOrderList; + } + for (MongoOrderStatisticsVO mongoOrderStatisticsVO : list) { + FlowOrderVO flowOrderVO = BeanUtil.map(mongoOrderStatisticsVO, FlowOrderVO.class); + flowOrderVO.setOrderAmount(mongoOrderStatisticsVO.getActualAmount()); + flowOrderList.add(flowOrderVO); + } + return flowOrderList; + } + + public List getInsightSpuIdsByDate(Integer begin, Integer size, Long shopId, Date startTime, Date endTime) { + // 过滤掉多余的订单数据 + Criteria orderCriteria = Criteria.where("updateTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + if (Objects.nonNull(shopId) && shopId > 0) { + orderCriteria.and("shopId").is(shopId); + } + + UnwindOperation unwindOperation = Aggregation.unwind("orderItems"); + + ProjectionOperation initProjectionOperation = Aggregation.project("orderId", "updateTime", "createTime") + .and("orderItems.spuId").as("spuId"); + + LookupOperation lookupOperation = Aggregation.lookup("order_refund", "orderId", "orderId", "refundList"); + + // 过滤掉退款时间不在规定时间范围内的订单 + List criteriaList = new ArrayList<>(Constant.INITIAL_CAPACITY); + criteriaList.add(Criteria.where("refundList.refundTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime)))); + criteriaList.add(Criteria.where("createTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime)))); + + // 保留创建时间或退款时间在规定时间范围内的订单 + Criteria criteria = Criteria.where("spuId").exists(Boolean.TRUE).orOperator(criteriaList); + + // 分组 + GroupOperation groupOperation = Aggregation.group("spuId").first("createTime").as("createTime"); + + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "createTime"); + ProjectionOperation projectionOperation = Aggregation.project().and("_id").as("spuId"); + + TypedAggregation typedAggregation; + if (size > 0) { + // 按顺序组合每一个聚合步骤 + typedAggregation = Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(orderCriteria), + unwindOperation, + initProjectionOperation, + lookupOperation, + Aggregation.match(criteria), + groupOperation, + sortOperation, + projectionOperation, + Aggregation.limit(size), + Aggregation.skip(begin) + ); + } else { + // 按顺序组合每一个聚合步骤 + typedAggregation = Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(orderCriteria), + unwindOperation, + initProjectionOperation, + lookupOperation, + Aggregation.match(criteria), + groupOperation, + sortOperation, + projectionOperation + ); + } + + + logger.info("getInsightSpuIdsByDate()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(0); + } + return list.stream().map(MongoOrderStatisticsVO::getSpuId).collect(Collectors.toList()); + } + + /** + * 根据用户id列表获取积累消费金额和积累消费笔数 + * + * @param userIds 用户id列表 + * @return + */ + public List listSumDataByUserIds(List userIds) { + // 过滤 + Criteria criteria = Criteria.where("userId").in(userIds).and("isPayed").is(1).and("actualTotal").gt(0); + + // 分组 + GroupOperation groupOperation = Aggregation.group("userId") + .first("userId").as("userId") + .sum("actualTotal").as("actualTotal") + .count().as("payOrderCount"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + groupOperation + ); + logger.info("listSumDataByUserIds()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + List sumAmountList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (MongoOrderStatisticsVO mongoOrderStatisticsVO : list) { + SumAmountVO sumAmountVO = new SumAmountVO(); + sumAmountVO.setUserId(mongoOrderStatisticsVO.getUserId()); + sumAmountVO.setExpenseNumber(mongoOrderStatisticsVO.getPayOrderNum()); + sumAmountVO.setSumOfConsumption(mongoOrderStatisticsVO.getActualTotal()); + sumAmountList.add(sumAmountVO); + } + return sumAmountList; + } + + /** + * 获取用户购买过的商品数量 + * + * @param spuId 商品id + * @param userId 分销员userId + * @return + */ + public Long hasBuySuccessProd(Long spuId, Long userId) { + // 过滤 + Criteria criteria = Criteria.where("userId").is(userId) + .and("orderItems.spuId").is(spuId) + .and("status").is(OrderStatus.SUCCESS.value()); + // 分组 + GroupOperation groupOperation = Aggregation.group() + .count().as("payOrderCount"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + groupOperation + ); + logger.info("hasBuySuccessProd()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return 0L; + } + Integer payOrderCount = list.get(0).getPayOrderCount(); + if (Objects.isNull(payOrderCount)) { + payOrderCount = 0; + } + return Long.valueOf(payOrderCount); + } + + /** + * 统计用户购物数据 + * + * @param userId 用户id + * @return 用户购物数据 + */ + public UserShoppingDataVO calculateUserInShopData(Long userId) { + List statusList = new ArrayList<>(Constant.INITIAL_CAPACITY); + statusList.add(4); + statusList.add(5); + // 过滤 + Criteria criteria = Criteria.where("userId").is(userId).and("status").in(statusList); + + // 分组 + GroupOperation groupOperation = Aggregation.group() + .count().as("payOrderCount") + .sum("actualTotal").as("actualAmount"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + groupOperation + ); + logger.info("calculateUserInShopData()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + UserShoppingDataVO userShoppingDataVO = new UserShoppingDataVO(); + if (CollUtil.isEmpty(list) || Objects.isNull(list.get(0))) { + userShoppingDataVO.setExpenseNumber(0L); + userShoppingDataVO.setSumOfConsumption(0L); + } + MongoOrderStatisticsVO mongoOrderStatisticsVO = list.get(0); + userShoppingDataVO.setExpenseNumber(Long.valueOf(mongoOrderStatisticsVO.getPayOrderCount())); + userShoppingDataVO.setSumOfConsumption(mongoOrderStatisticsVO.getActualAmount()); + return userShoppingDataVO; + } + + /** + * 获取活动销售的商品数量 + * + * @param activityIds + * @param activityType + * @return + */ + public List getActivitySalesQuantity(List activityIds, Integer activityType) { + // 过滤 + MatchOperation initMatchOperation = Aggregation.match(Criteria.where("isPayed").is(1).and("orderItems.activityId").in(activityIds).and("orderItems.activityType").is(activityType)); + + MatchOperation matchOperation = Aggregation.match(Criteria.where("orderItems.activityId").in(activityIds).and("orderItems.activityType").is(activityType)); + // 分组 + GroupOperation groupOperation = Aggregation.group("orderItems.activityId") + .sum("orderItems.count").as("payProdCount"); + + ProjectionOperation projectionOperation = Aggregation.project("payProdCount").and("_id").as("activityId"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + initMatchOperation, + Aggregation.unwind("orderItems"), + matchOperation, + groupOperation, + projectionOperation + ); + logger.info("getActivitySalesQuantity()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + List activityList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isEmpty(list)) { + return activityList; + } + for (MongoOrderStatisticsVO mongoOrderStatisticsVO : list) { + OrderActivityVO orderActivityVO = new OrderActivityVO(); + orderActivityVO.setActivityId(mongoOrderStatisticsVO.getActivityId()); + orderActivityVO.setCount(mongoOrderStatisticsVO.getPayProdCount()); + activityList.add(orderActivityVO); + } + return activityList; + } + + + /** + * @param skuId + * @param activityId + * @param activityType + * @return + */ + public Long countActivityOrderSale(Long skuId, Long activityId, Integer activityType) { + // 过滤 + Criteria criteria = Criteria.where("orderItems.activityId").is(activityId) + .and("orderItems.activityType").is(activityType) + .and("status").ne(OrderStatus.CLOSE.value()); + if (Objects.nonNull(skuId)) { + criteria.and("orderItems.skuId").is(skuId); + } + + // 分组 + GroupOperation groupOperation = Aggregation.group() + .sum("orderItems.count").as("payProdCount"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.unwind("orderItems"), + Aggregation.match(criteria), + groupOperation + ); + logger.info("countActivityOrderSale()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + List activityList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isEmpty(list) || Objects.isNull(list.get(0))) { + return 0L; + } + return Long.valueOf(list.get(0).getPayProdCount()); + } + + private void filterQuery(Criteria criteria, Long shopId, Date startTime, Date endTime) { + if (Objects.nonNull(shopId)) { + criteria.and("shopId").is(shopId); + } + if (Objects.nonNull(startTime) || Objects.nonNull(endTime)) { + if (Objects.nonNull(startTime) && Objects.nonNull(endTime)) { + criteria.and("payTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + } else if (Objects.nonNull(startTime)) { + criteria.and("payTime").gte(startTime); + } else { + criteria.and("payTime").lte(endTime); + } + } + } + + public AccountOrderDetailVO getAccountOrderDetail(Date startTime, Date endTime, String shopName, Long shopId) { + // 过滤 + Criteria criteria = new Criteria(); + Integer paySysType = orderAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + criteria.and("paySysType").is(paySysType); + criteria.and("isPayed").is(1); + if (StrUtil.isNotBlank(shopName) && Objects.isNull(shopId)) { + criteria.and("shopName").regex(Pattern.compile("^.*" + shopName + ".*$", Pattern.CASE_INSENSITIVE)); + } + if (Objects.nonNull(shopId)) { + criteria.and("shopId").is(shopId); + } + if (Objects.nonNull(startTime)) { + criteria.and("payTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + } + + ProjectionOperation projectionOperation = Aggregation.project("payType", "orderScore") + .and(ConditionalOperators.when(Criteria.where("payType").in(2, 6, 7)).then("$actualTotal").otherwise(0)).as("alipayAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(1, 3, 4, 5, 8)).then("$actualTotal").otherwise(0)).as("wechatAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(9)).then("$actualTotal").otherwise(0)).as("balanceAmount"); + + // 分组 + GroupOperation groupOperation = Aggregation.group() + .sum("alipayAmount").as("alipayAmount") + .sum("wechatAmount").as("wechatAmount") + .sum("balanceAmount").as("balanceAmount") + .sum("orderScore").as("scoreCount"); + + ProjectionOperation project = Aggregation.project("scoreCount", "alipayAmount", "wechatAmount", "balanceAmount"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoAccountOrderDetailVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation, + project + ); + logger.info("getAccountOrderDetail()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoAccountOrderDetailVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + return BeanUtil.map(CollUtil.isEmpty(list) ? new MongoAccountOrderDetailVO() : list.get(0), AccountOrderDetailVO.class); + } + + public PageShopAccountOrderVO listShopAccountDetail(Date startTime, Date endTime, String shopName, + Integer pageSize, Integer pageNum) { + // 过滤 + Criteria criteria = new Criteria(); + Integer paySysType = orderAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + criteria.and("paySysType").is(paySysType); + if (StrUtil.isNotBlank(shopName)) { + criteria.and("shopName").regex(Pattern.compile("^.*" + shopName + ".*$", Pattern.CASE_INSENSITIVE)); + } + if (Objects.nonNull(startTime)) { + criteria.and("payTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + } + criteria.and("shopId").ne(Constant.PLATFORM_SHOP_ID); + + ProjectionOperation projectionOperation = Aggregation.project("shopId", "shopName", "payType", "orderScore") + .and(ConditionalOperators.when(Criteria.where("payType").in(2, 6, 7)).then("$actualTotal").otherwise(0)).as("alipayAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(1, 3, 4, 5, 8)).then("$actualTotal").otherwise(0)).as("wechatAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(9)).then("$actualTotal").otherwise(0)).as("balanceAmount") + .and("$actualTotal").as("total"); + // 分组 + GroupOperation shopGroupOperation = Aggregation.group("shopId") + .first("shopId").as("shopId") + .first("shopName").as("shopName") + .sum("alipayAmount").as("alipayAmount") + .sum("wechatAmount").as("wechatAmount") + .sum("balanceAmount").as("balanceAmount") + .sum("orderScore").as("scoreCount") + .sum("total").as("total"); + + ProjectionOperation project = Aggregation.project("shopId", "shopName", "scoreCount", "alipayAmount", "wechatAmount", "balanceAmount", "total"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC, "shopId"); + // 分页数据 + SkipOperation skipOperation = Aggregation.skip((long) pageSize * (pageNum - 1)); + LimitOperation limitOperation = Aggregation.limit(pageSize); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoShopAccountOrderDetailVO.class, + Aggregation.match(criteria), + projectionOperation, + shopGroupOperation, + project, + sortOperation, + skipOperation, + limitOperation + ); + logger.info("listShopAccountDetail()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoShopAccountOrderDetailVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + + // 总条数 + TypedAggregation aggregation = Aggregation.newAggregation( + MongoShopAccountOrderDetailVO.class, + Aggregation.match(criteria), + projectionOperation, + shopGroupOperation, + project + ); + AggregationResults aggregate = mongoTemplate.aggregate(aggregation, MongoShopAccountOrderDetailVO.class); + List mappedResults = aggregate.getMappedResults(); + PageShopAccountOrderVO pageShopAccountOrderVO = new PageShopAccountOrderVO(); + pageShopAccountOrderVO.setShopList(BeanUtil.mapAsList(list, ShopAccountOrderDetailVO.class)); + pageShopAccountOrderVO.setTotal((long) mappedResults.size()); + return pageShopAccountOrderVO; + } + + public PageVO pageOrderFinanceDetail(PageDTO pageDTO, FinanceDetailDTO financeDetailDTO) { + // 过滤 + Criteria criteria = getFinanceCriteria(financeDetailDTO); + Integer lang = I18nMessage.getLang(); + String spuName = "orderItems.spuNameZh"; + if (Objects.equals(lang, LanguageEnum.LANGUAGE_EN.getLang())) { + spuName = "orderItems.spuNameEn"; + } + UnwindOperation unwindOperation = Aggregation.unwind("orderItems"); + // 分组 + GroupOperation groupOperation = Aggregation.group("_id") + .first("_id").as("orderId") + .first("payType").as("payType") + .first("payTime").as("transDate") + .first("createTime").as("placeTime") + .first("actualTotal").as("transAmount") + .first("shopId").as("shopId") + .first("shopName").as("shopName") + .first("userId").as("userId") + .first("payId").as("payIds") + .push(spuName).as("prodNames"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "transDate"); + // 分页数据 + SkipOperation skipOperation = Aggregation.skip((long) pageDTO.getPageSize() * (pageDTO.getPageNum() - 1)); + LimitOperation limitOperation = Aggregation.limit(pageDTO.getPageSize()); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoFinanceOrderDetailVO.class, + Aggregation.match(criteria), + unwindOperation, + groupOperation, + sortOperation, + skipOperation, + limitOperation + ); + logger.info("pageOrderFinanceDetail()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoFinanceOrderDetailVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + list.forEach(data -> { + data.setBizType(FinanceBizType.ORDER.value()); + data.setProdName(data.getProdNames().toString().substring(1, data.getProdNames().toString().length() - 1)); + }); + // 总条数 + TypedAggregation aggregation = Aggregation.newAggregation( + MongoFinanceOrderDetailVO.class, + Aggregation.match(criteria), + unwindOperation, + groupOperation + ); + AggregationResults aggregate = mongoTemplate.aggregate(aggregation, MongoFinanceOrderDetailVO.class); + List mappedResults = aggregate.getMappedResults(); + PageVO page = new PageVO<>(); + page.setTotal((long) mappedResults.size()); + page.setList(BeanUtil.mapAsList(list, FinanceDetailVO.class)); + page.setPages(PageUtil.getPages(mappedResults.size(), pageDTO.getPageSize())); + return page; + } + + public List listOrderFinanceDetail(FinanceDetailDTO financeDetailDTO) { + // 过滤 + Criteria criteria = getFinanceCriteria(financeDetailDTO); + Integer lang = I18nMessage.getLang(); + String spuName = "orderItems.spuNameZh"; + if (Objects.equals(lang, LanguageEnum.LANGUAGE_EN.getLang())) { + spuName = "orderItems.spuNameEn"; + } + // 分组 + GroupOperation groupOperation = Aggregation.group("_id") + .first("_id").as("orderId") + .first("payTime").as("transDate") + .first("payType").as("payType") + .first("createTime").as("placeTime") + .first("actualTotal").as("transAmount") + .first("shopName").as("shopName") + .first("userId").as("userId") + .first("payId").as("payIds") + .push(spuName).as("prodNames"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "transDate"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoFinanceOrderDetailVO.class, + Aggregation.match(criteria), + Aggregation.unwind("orderItems"), + groupOperation, + sortOperation + ); + logger.info("listOrderFinanceDetail()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoFinanceOrderDetailVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + list.forEach(data -> { + data.setBizType(FinanceBizType.ORDER.value()); + data.setProdName(data.getProdNames().toString().substring(1, data.getProdNames().toString().length() - 1)); + }); + return BeanUtil.mapAsList(list, FinanceDetailVO.class); + } + + public PageShopAccountOrderVO pageOrderPayInfo(Date startTime, Date endTime, Long shopId, Integer pageSize, Integer pageNum) { + // 过滤 + Criteria criteria = new Criteria(); + Integer paySysType = orderAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + criteria.and("paySysType").is(paySysType); + criteria.and("isPayed").is(1); + criteria.and("shopId").is(shopId); + if (Objects.nonNull(startTime)) { + criteria.and("payTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + } + ProjectionOperation projectionOperation = Aggregation.project("shopId", "shopName", "payType", "payId", "payTime", "updateTime") + .and("actualTotal").as("payAmount") + .and("_id").as("orderIds") + .and("orderScore").as("scoreCount") + .and(ConditionalOperators.when(Criteria.where("payType").in(2, 6, 7)).then("$actualTotal").otherwise(0)).as("alipayAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(1, 3, 4, 5, 8)).then("$actualTotal").otherwise(0)).as("wechatAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(9)).then("$actualTotal").otherwise(0)).as("balanceAmount"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "updateTime"); + // 分页数据 + SkipOperation skipOperation = Aggregation.skip((long) pageSize * (pageNum - 1)); + LimitOperation limitOperation = Aggregation.limit(pageSize); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoOrderPayInfoVO.class, + Aggregation.match(criteria), + projectionOperation, + sortOperation, + skipOperation, + limitOperation + ); + logger.info("pageOrderPayInfo()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoOrderPayInfoVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + list.forEach(data -> data.setPayEntry(0)); + // 总条数 + TypedAggregation aggregation = Aggregation.newAggregation( + MongoOrderPayInfoVO.class, + Aggregation.match(criteria), + projectionOperation + ); + AggregationResults aggregate = mongoTemplate.aggregate(aggregation, MongoOrderPayInfoVO.class); + List mappedResults = aggregate.getMappedResults(); + PageShopAccountOrderVO pageShopAccountOrderVO = new PageShopAccountOrderVO(); + pageShopAccountOrderVO.setPayInfoList(BeanUtil.mapAsList(list, OrderPayInfoVO.class)); + pageShopAccountOrderVO.setTotal((long) mappedResults.size()); + return pageShopAccountOrderVO; + } + + public PageShopAccountOrderVO listOrderPayInfo(Date startTime, Date endTime, String shopName) { + // 过滤 + Criteria criteria = new Criteria(); + Integer paySysType = orderAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + criteria.and("paySysType").is(paySysType); + if (StrUtil.isNotBlank(shopName)) { + criteria.and("shopName").regex(Pattern.compile("^.*" + shopName + ".*$", Pattern.CASE_INSENSITIVE)); + } + criteria.and("isPayed").is(1); + if (Objects.nonNull(startTime)) { + criteria.and("payTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + } + ProjectionOperation projectionOperation = Aggregation.project("shopId", "shopName", "payType", "payId", "payTime") + .and("_id").as("orderIds") + .and("orderScore").as("scoreCount") + .and(ConditionalOperators.when(Criteria.where("payType").in(2, 6, 7)).then("$actualTotal").otherwise(0)).as("alipayAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(1, 3, 4, 5, 8)).then("$actualTotal").otherwise(0)).as("wechatAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(9)).then("$actualTotal").otherwise(0)).as("balanceAmount"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "payTime"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoOrderPayInfoVO.class, + Aggregation.match(criteria), + projectionOperation, + sortOperation + ); + logger.info("listOrderPayInfo()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoOrderPayInfoVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + list.forEach(data -> data.setPayEntry(0)); + PageShopAccountOrderVO pageShopAccountOrderVO = new PageShopAccountOrderVO(); + pageShopAccountOrderVO.setPayInfoList(BeanUtil.mapAsList(list, OrderPayInfoVO.class)); + return pageShopAccountOrderVO; + } + + private Criteria getFinanceCriteria(FinanceDetailDTO financeDetailDTO) { + Criteria criteria = new Criteria(); + criteria.and("isPayed").is(1); + Integer paySysType = orderAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + criteria.and("paySysType").is(paySysType); + if (Objects.nonNull(financeDetailDTO.getStartTime())) { + criteria.and("payTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(financeDetailDTO.getStartTime()))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(financeDetailDTO.getEndTime()))); + } + if (Objects.nonNull(financeDetailDTO.getPayType()) && financeDetailDTO.getPayType() > -1) { + criteria.and("payType").is(financeDetailDTO.getPayType()); + } + if (Objects.nonNull(financeDetailDTO.getOrderId())) { + criteria.and("_id").is(financeDetailDTO.getOrderId()); + } + return criteria; + } + + public List getSoldNumRankCacheByShopIdAndTime(Long shopId, Integer dayNum, Integer esRenovationSpuSort, Long primaryCategoryId) { + Date time = null; + if (dayNum != 0) { + time = DateUtil.offsetDay(new DateTime(), -dayNum); + } + // 过滤 + Criteria criteria = Criteria.where("isPayed").is(1).and("status").ne(6); + if (Objects.nonNull(time)) { + criteria.and("payTime").gt(time); + } + if (Objects.nonNull(shopId) && !Objects.equals(shopId, 0L)) { + criteria.and("shopId").is(shopId); + } + if (Objects.nonNull(primaryCategoryId)) { + criteria.and("orderItems.primaryCategoryId").is(primaryCategoryId); + } + // 分组 + GroupOperation spuIdGroupOperation = Aggregation.group("orderItems.spuId").sum("orderItems.count").as("totalNum"); + ProjectionOperation projectionOperation = Aggregation.project("totalNum") + .and("_id").as("spuId"); + Sort.Direction sort; + if (Objects.equals(esRenovationSpuSort, EsRenovationProductSortEnum.SALE_NUM_DESC.value())) { + sort = Sort.Direction.DESC; + } else { + sort = Sort.Direction.ASC; + } + SortOperation sortOperation = Aggregation.sort(sort, "totalNum"); + TypedAggregation typedAggregation; + // 按顺序组合每一个聚合步骤 + typedAggregation = + Aggregation.newAggregation( + MongoSpuSoldNumRankVO.class, + Aggregation.match(criteria), + Aggregation.unwind("orderItems"), + spuIdGroupOperation, + projectionOperation, + sortOperation, + Aggregation.limit(1000) + ); + logger.info("getSoldNumRankCacheByShopIdAndTime()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoSpuSoldNumRankVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(0); + } + return list.stream().map(MongoSpuSoldNumRankVO::getSpuId).collect(Collectors.toList()); + } + + public GroupInfoVO getGroupInfo(Long groupActivityId) { + Criteria criteria = new Criteria(); + // 获取该拼团活动 + criteria.and("orderItems.activityId").is(groupActivityId) + .and("orderItems.activityType").is(OrderActivityType.GROUP.value()) + .and("isPayed").is(1) + .and("orderType").is(OrderType.GROUP.value()) + .and("status").ne(OrderStatus.CLOSE.value()); + UnwindOperation unwindOperation = Aggregation.unwind("orderItems"); + GroupOperation groupOperation = Aggregation.group(new String[]{"orderItems.activityId", "userId"}) + .count().as("payUserCount") + .count().as("payOrderCount"); + ProjectionOperation projectionOperation = Aggregation.project("payUserCount", "payOrderCount").and("_id.orderItems.activityId").as("activityId"); + GroupOperation operation = Aggregation.group("activityId") + .count().as("payUserCount") + .sum("payOrderCount").as("payOrderCount"); + // 按顺序组合操作 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + unwindOperation, + groupOperation, + projectionOperation, + operation + ); + logger.info("getGroupInfo()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return null; + } + MongoOrderStatisticsVO orderStatisticsVO = list.get(0); + GroupInfoVO groupInfoVO = new GroupInfoVO(); + groupInfoVO.setOrderCount(orderStatisticsVO.getPayOrderCount()); + groupInfoVO.setNumberCount(orderStatisticsVO.getPayUserCount()); + return groupInfoVO; + } + + public List listFormExcel(FormExcelParamVO formExcelParamVO) { + Criteria criteria = new Criteria(); + criteria.and("createTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(formExcelParamVO.getStartTime()))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(formExcelParamVO.getEndTime()))); + if (Objects.nonNull(formExcelParamVO.getShopId())) { + criteria.and("shopId").is(formExcelParamVO.getShopId()); + } + + String format = getFormatStr(formExcelParamVO); + ProjectionOperation projectionOperation = Aggregation.project("userId", "actualTotal", "platformAmount", "allCount") + .and(DateOperators.DateToString.dateOf("createTime").toString(format)).as("formatTime"); + + // 根据用户进行分组 + GroupOperation groupOperation = Aggregation.group(new String[]{"formatTime", "userId"}) + .count().as("orderNums") + .sum("actualTotal").as("orderAmount") + .sum("platformAmount").as("platformAmount") + .sum("allCount").as("productNums"); + + ProjectionOperation operation = Aggregation.project("orderNums", "orderAmount", "platformAmount", "productNums", "userId").and("_id.formatTime").as("formatTime"); + // 根据时间分组 + GroupOperation timeGroupOperation = Aggregation.group("formatTime") + .count().as("userNums") + .sum("orderAmount").as("orderAmount") + .sum("platformAmount").as("platformAmount") + .sum("orderNums").as("orderNums") + .sum("productNums").as("productNums"); + + ProjectionOperation timeOperation = Aggregation.project("orderNums", "orderAmount", "platformAmount", "productNums", "userNums").and("_id").as("formatTime"); + // 按顺序组合操作 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoOrderFormExcelVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation, + operation, + timeGroupOperation, + timeOperation + ); + logger.info("listFormExcel()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoOrderFormExcelVO.class); + // 取出最终结果 + List list = new ArrayList<>(aggregationResults.getMappedResults()); + // 店铺的订单金额要加上平台补贴金额 + if (CollUtil.isNotEmpty(list)) { + MongoOrderFormExcelVO mongoOrderFormExcelVO = list.get(0); + if (Objects.isNull(formExcelParamVO.getShopId())) { + mongoOrderFormExcelVO.setOrderAmount(mongoOrderFormExcelVO.getOrderAmount()); + } else { + mongoOrderFormExcelVO.setOrderAmount(mongoOrderFormExcelVO.getOrderAmount() + mongoOrderFormExcelVO.getPlatformAmount()); + } + } + + Map orderMap = list.stream().collect(Collectors.toMap(MongoOrderFormExcelVO::getFormatTime, l -> l)); + if (formExcelParamVO.getSelfOperatedAmount() || formExcelParamVO.getSelfOperatedOrderNums() || formExcelParamVO.getSelfOperatedProductNums() || formExcelParamVO.getSelfOperatedUserNums()) { + ShopSimpleBO shopSimpleBO = new ShopSimpleBO(); + shopSimpleBO.setType(ShopType.SELF_SHOP.value()); + ServerResponseEntity> serverResponse = shopDetailFeignClient.listSimple(shopSimpleBO); + if (!serverResponse.isSuccess()) { + throw new LuckException(serverResponse.getMsg()); + } + List shopList = serverResponse.getData(); + if (CollUtil.isNotEmpty(shopList)) { + List shopIds = shopList.stream().map(ShopSimpleBO::getShopId).collect(Collectors.toList()); + // 自营信息 + setSelfInfo(list, formExcelParamVO, orderMap, shopIds); + } + } + if (formExcelParamVO.getPayAmount() || formExcelParamVO.getPayOrderNums() || formExcelParamVO.getPayProductNums() || formExcelParamVO.getPayUserNums()) { + // 支付信息 + setPayInfo(list, formExcelParamVO, orderMap); + } + if (formExcelParamVO.getRefundAmount() || formExcelParamVO.getRefundOrderNums() || formExcelParamVO.getPayProductNums() || formExcelParamVO.getPayUserNums()) { + // 退款信息 + setRefundInfo(list, formExcelParamVO, orderMap); + } + if (CollUtil.isNotEmpty(list)) { + for (MongoOrderFormExcelVO mongoOrderFormExcelVO : list) { + // 设默认值 + setDefaultInfo(mongoOrderFormExcelVO); + } + } + return BeanUtil.mapAsList(list, FormExcelDTO.class); + } + + private void setDefaultInfo(MongoOrderFormExcelVO info) { + if (Objects.isNull(info.getOrderAmount())) { + info.setOrderAmount(0L); + } + if (Objects.isNull(info.getOrderNums())) { + info.setOrderNums(0); + } + if (Objects.isNull(info.getProductNums())) { + info.setProductNums(0); + } + if (Objects.isNull(info.getUserNums())) { + info.setUserNums(0); + } + if (Objects.isNull(info.getSelfOperatedAmount())) { + info.setSelfOperatedAmount(0L); + } + if (Objects.isNull(info.getSelfOperatedOrderNums())) { + info.setSelfOperatedOrderNums(0); + } + if (Objects.isNull(info.getSelfOperatedProductNums())) { + info.setSelfOperatedProductNums(0); + } + if (Objects.isNull(info.getSelfOperatedUserNums())) { + info.setSelfOperatedUserNums(0); + } + if (Objects.isNull(info.getPayAmount())) { + info.setPayAmount(0L); + } + if (Objects.isNull(info.getPayOrderNums())) { + info.setPayOrderNums(0); + } + if (Objects.isNull(info.getPayProductNums())) { + info.setPayProductNums(0); + } + if (Objects.isNull(info.getPayUserNums())) { + info.setPayUserNums(0); + } + if (Objects.isNull(info.getRefundAmount())) { + info.setRefundAmount(0L); + } + if (Objects.isNull(info.getRefundOrderNums())) { + info.setRefundOrderNums(0); + } + } + + private void setSelfInfo(List list, FormExcelParamVO formExcelParamVO, Map orderMap, List shopIds) { + // 自营过滤 + Criteria selfCriteria = Criteria.where("isPayed").is(1) + .and("shopId").in(shopIds) + .and("createTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(formExcelParamVO.getStartTime()))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(formExcelParamVO.getEndTime()))); + + String format = getFormatStr(formExcelParamVO); + ProjectionOperation projectionOperation = Aggregation.project("userId", "actualTotal", "allCount") + .and(DateOperators.DateToString.dateOf("createTime").toString(format)).as("formatTime"); + + // 根据用户进行分组 + GroupOperation groupOperation = Aggregation.group(new String[]{"formatTime", "userId"}) + .count().as("selfOperatedOrderNums") + .sum("actualTotal").as("selfOperatedAmount") + .sum("allCount").as("selfOperatedProductNums"); + + ProjectionOperation operation = Aggregation.project( + "selfOperatedAmount", "selfOperatedOrderNums", "selfOperatedProductNums").and("_id.formatTime").as("formatTime"); + // 根据时间分组 + GroupOperation timeGroupOperation = Aggregation.group("formatTime") + .count().as("selfOperatedUserNums") + .sum("selfOperatedAmount").as("selfOperatedAmount") + .sum("selfOperatedOrderNums").as("selfOperatedOrderNums") + .sum("selfOperatedProductNums").as("selfOperatedProductNums"); + + ProjectionOperation timeOperation = Aggregation.project( + "selfOperatedAmount", "selfOperatedOrderNums", "selfOperatedProductNums", "selfOperatedUserNums").and("_id").as("formatTime"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "formatTime"); + // 按顺序组合操作 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoOrderFormExcelVO.class, + Aggregation.match(selfCriteria), + projectionOperation, + groupOperation, + operation, + timeGroupOperation, + timeOperation, + sortOperation + ); + logger.info("setSelfInfo()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoOrderFormExcelVO.class); + List selfList = aggregationResults.getMappedResults(); + Map selfOrderMap = selfList.stream().collect(Collectors.toMap(MongoOrderFormExcelVO::getFormatTime, l -> l)); + for (String time : selfOrderMap.keySet()) { + MongoOrderFormExcelVO mongoOrderFormExcelVO = orderMap.get(time); + boolean isNew = false; + if (Objects.isNull(mongoOrderFormExcelVO)) { + mongoOrderFormExcelVO = new MongoOrderFormExcelVO(); + isNew = true; + } + MongoOrderFormExcelVO selfInfo = selfOrderMap.get(time); + mongoOrderFormExcelVO.setFormatTime(time); + mongoOrderFormExcelVO.setSelfOperatedAmount(selfInfo.getSelfOperatedAmount()); + mongoOrderFormExcelVO.setSelfOperatedOrderNums(selfInfo.getSelfOperatedOrderNums()); + mongoOrderFormExcelVO.setSelfOperatedProductNums(selfInfo.getSelfOperatedProductNums()); + mongoOrderFormExcelVO.setSelfOperatedUserNums(selfInfo.getSelfOperatedUserNums()); + if (isNew) { + list.add(mongoOrderFormExcelVO); + } + } + } + + private void setPayInfo(List list, FormExcelParamVO formExcelParamVO, Map orderMap) { + // 支付过滤 + Criteria payCriteria = new Criteria(); + payCriteria.and("isPayed").is(1).and("createTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(formExcelParamVO.getStartTime()))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(formExcelParamVO.getEndTime()))); + if (Objects.nonNull(formExcelParamVO.getShopId())) { + payCriteria.and("shopId").is(formExcelParamVO.getShopId()); + } + String format = getFormatStr(formExcelParamVO); + ProjectionOperation projectionOperation = Aggregation.project("userId", "actualTotal", "allCount") + .and(DateOperators.DateToString.dateOf("createTime").toString(format)).as("formatTime"); + + // 根据用户进行分组 + GroupOperation groupOperation = Aggregation.group("formatTime", "userId") + .sum("actualTotal").as("payAmount") + .sum("allCount").as("payProductNums") + .count().as("payOrderNums"); + + ProjectionOperation operation = Aggregation.project( + "payAmount", "payProductNums", "payOrderNums").and("_id.formatTime").as("formatTime"); + // 根据时间分组 + GroupOperation timeGroupOperation = Aggregation.group("formatTime") + .count().as("payUserNums") + .sum("payAmount").as("payAmount") + .sum("payProductNums").as("payProductNums") + .sum("payOrderNums").as("payOrderNums"); + + ProjectionOperation timeOperation = Aggregation.project( + "payUserNums", "payAmount", "payProductNums", "payOrderNums").and("_id").as("formatTime"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "formatTime"); + // 按顺序组合操作 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoOrderFormExcelVO.class, + Aggregation.match(payCriteria), + projectionOperation, + groupOperation, + operation, + timeGroupOperation, + timeOperation, + sortOperation + ); + logger.info("setPayInfo()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoOrderFormExcelVO.class); + // 取出最终结果 + List payList = aggregationResults.getMappedResults(); + Map payOrderMap = payList.stream().collect(Collectors.toMap(MongoOrderFormExcelVO::getFormatTime, l -> l)); + for (String time : payOrderMap.keySet()) { + MongoOrderFormExcelVO mongoOrderFormExcelVO = orderMap.get(time); + boolean isNew = false; + if (Objects.isNull(mongoOrderFormExcelVO)) { + mongoOrderFormExcelVO = new MongoOrderFormExcelVO(); + isNew = true; + } + MongoOrderFormExcelVO payInfo = payOrderMap.get(time); + mongoOrderFormExcelVO.setFormatTime(time); + mongoOrderFormExcelVO.setPayUserNums(payInfo.getPayUserNums()); + mongoOrderFormExcelVO.setPayOrderNums(payInfo.getPayOrderNums()); + mongoOrderFormExcelVO.setPayAmount(payInfo.getPayAmount()); + mongoOrderFormExcelVO.setPayProductNums(payInfo.getPayProductNums()); + if (isNew) { + list.add(mongoOrderFormExcelVO); + } + } + } + + private void setRefundInfo(List list, FormExcelParamVO formExcelParamVO, Map orderMap) { + Criteria criteria = new Criteria(); + criteria.and("createTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(formExcelParamVO.getStartTime()))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(formExcelParamVO.getEndTime()))); + if (Objects.nonNull(formExcelParamVO.getShopId())) { + criteria.and("shopId").is(formExcelParamVO.getShopId()); + } + criteria.and("returnMoneySts").is(ReturnProcessStatusEnum.SUCCESS.value()); + String format = getFormatStr(formExcelParamVO); + ProjectionOperation projectionOperation = Aggregation.project("orderId", "refundAmount", "platformRefundAmount") + .and(DateOperators.DateToString.dateOf("createTime").toString(format)).as("formatTime"); + + // 根据用户进行分组 + GroupOperation groupOperation = Aggregation.group("orderId", "formatTime") + .sum("platformRefundAmount").as("platformRefundAmount") + .sum("refundAmount").as("refundAmount"); + + ProjectionOperation operation = Aggregation.project("refundAmount", "platformRefundAmount").and("_id.formatTime").as("formatTime"); + + GroupOperation timeGroupOperation = Aggregation.group("formatTime") + .count().as("refundOrderNums") + .sum("platformRefundAmount").as("platformRefundAmount") + .sum("refundAmount").as("refundAmount"); + + ProjectionOperation timeOperation = Aggregation.project("refundOrderNums", "refundAmount", "platformRefundAmount").and("_id").as("formatTime"); + + // 按顺序组合操作 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoOrderRefundFormExcelVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation, + operation, + timeGroupOperation, + timeOperation + ); + logger.info("setRefundInfo()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoOrderRefundFormExcelVO.class); + // 取出最终结果 + List refundList = aggregationResults.getMappedResults(); + Map refundOrderMap = refundList.stream().collect(Collectors.toMap(MongoOrderRefundFormExcelVO::getFormatTime, l -> l)); + for (String time : refundOrderMap.keySet()) { + MongoOrderFormExcelVO mongoOrderFormExcelVO = orderMap.get(time); + boolean isNew = false; + if (Objects.isNull(mongoOrderFormExcelVO)) { + mongoOrderFormExcelVO = new MongoOrderFormExcelVO(); + isNew = true; + } + MongoOrderRefundFormExcelVO refundInfo = refundOrderMap.get(time); + mongoOrderFormExcelVO.setFormatTime(time); + mongoOrderFormExcelVO.setRefundOrderNums(refundInfo.getRefundOrderNums()); + if (Objects.nonNull(formExcelParamVO.getShopId())) { + // 商家退款金额 = 退货用户的金额 + 退还平台的补贴金额 + mongoOrderFormExcelVO.setRefundAmount(refundInfo.getRefundAmount() + refundInfo.getPlatformRefundAmount()); + } else { + // 平台退款金额 = 退货用户的金额 + mongoOrderFormExcelVO.setRefundAmount(refundInfo.getRefundAmount()); + } + if (isNew) { + list.add(mongoOrderFormExcelVO); + } + } + } + + private String getFormatStr(FormExcelParamVO formExcelParamVO) { + String format = ""; + if (Objects.equals(formExcelParamVO.getTimeType(), TimeTypeEnum.DAY.value())) { + // 天 + format = "%Y-%m-%d"; + } else if (Objects.equals(formExcelParamVO.getTimeType(), TimeTypeEnum.WEEK.value())) { + // 周 + format = "%Y-%U"; + } else if (Objects.equals(formExcelParamVO.getTimeType(), TimeTypeEnum.MONTH.value())) { + // 月 + format = "%Y-%m"; + } + return format; + } + + public List getShopOrderCountByUserIdAndShopId(List userIds, Long shopId) { + // 过滤 + Criteria criteria = Criteria.where("shopId").is(shopId) + .and("userId").in(userIds); + // 分组 + GroupOperation groupOperation = Aggregation.group("userId") + .count().as("allCount"); + ProjectionOperation projectionOperation = Aggregation.project("allCount") + .and("_id").as("userId"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderStatisticsVO.class, + Aggregation.match(criteria), + groupOperation, + projectionOperation + ); + logger.info("getShopOrderCountByUserIdAndShopId()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + List userOrderStatisticList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (MongoOrderStatisticsVO mongoOrderStatisticsVO : list) { + UserOrderStatisticVO userOrderStatistic = BeanUtil.map(mongoOrderStatisticsVO, UserOrderStatisticVO.class); + userOrderStatisticList.add(userOrderStatistic); + } + return userOrderStatisticList; + } + + /** + * 获取订单商品流量统计数据 + * @param flowOrderItemDTO 查询参数 + * @return + */ + public List listFlowOrderItems(FlowOrderItemDTO flowOrderItemDTO) { + // 组装查询条件 + Criteria criteria = Criteria.where("isPayed").is(1) + .and("orderItems.spuId").is(flowOrderItemDTO.getSpuId()); + if (!Objects.isNull(flowOrderItemDTO.getShopId())) { + criteria.and("shopId").is(flowOrderItemDTO.getShopId()); + } + if (!Objects.isNull(flowOrderItemDTO.getStartTime()) + && !Objects.isNull(flowOrderItemDTO.getEndTime())) { + criteria.and("payTime").gte(flowOrderItemDTO.getStartTime()).lte(flowOrderItemDTO.getEndTime()); + } + Query query = new Query(criteria).with(Sort.by(Sort.Direction.ASC, "payTime")); + logger.info("listFlowOrderItems()的mongodb查询语句:{}", query); + // 查询数据 + List orders = mongoTemplate.find(query, MongoOrderBO.class); + if (CollectionUtils.isEmpty(orders)) { + return new ArrayList<>(); + } + // 封装为VO类 + FlowOrderItemVO flowOrderItem; + List flowOrderItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (MongoOrderBO order : orders) { + for (MongoOrderItemBO orderItem : order.getOrderItems()) { + if (!Objects.equals(orderItem.getSpuId(), flowOrderItemDTO.getSpuId())) { + continue; + } + flowOrderItem = new FlowOrderItemVO(); + flowOrderItem.setSpuId(orderItem.getSpuId()); + flowOrderItem.setCount(orderItem.getCount()); + flowOrderItem.setAmount(orderItem.getActualTotal()); + flowOrderItem.setPayTime(order.getPayTime()); + flowOrderItems.add(flowOrderItem); + } + } + return flowOrderItems; + } + + public List listUserAndShopDataByTime(Date startTime, Date endTime) { + Criteria criteria = Criteria.where("shopId").ne(Constant.PLATFORM_SHOP_ID); + if (Objects.nonNull(startTime)) { + criteria.and("create_time").gte(startTime).lt(endTime); + } + + GroupOperation groupOperation = Aggregation.group("shopId", "userId") + .first("shopId").as("shopId") + .first("userId").as("userId"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + ShopCustomerReqDTO.class, + Aggregation.match(criteria), + groupOperation + ); + logger.info("listUserAndShopDataByTime()的mongodb查询语句: {}", typedAggregation); + + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, ShopCustomerReqDTO.class); + return aggregationResults.getMappedResults(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoOrderRefundManager.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoOrderRefundManager.java new file mode 100644 index 0000000..348f682 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoOrderRefundManager.java @@ -0,0 +1,877 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.order.vo.*; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.order.vo.UserOrderStatisticVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.DateUtils; +import com.tmerclub.cloud.order.bo.mongo.MongoOrderRefundBO; +import com.tmerclub.cloud.order.constant.FinanceBizType; +import com.tmerclub.cloud.order.dto.multishop.OrderRefundDTO; +import com.tmerclub.cloud.order.service.OrderAllinpayService; +import com.tmerclub.cloud.order.vo.OrderRefundStatisticsVO; +import com.tmerclub.cloud.order.vo.mongo.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * 订单统计 + * + * @author FrozenWatermelon + * @date 2020/12/07 + */ +@Component +public class MongoOrderRefundManager { + private static final Logger logger = LoggerFactory.getLogger(MongoOrderRefundManager.class); + + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private OrderAllinpayService orderAllinpayService; + + public void save(MongoOrderRefundBO mongoOrderRefundBO) { + mongoTemplate.save(mongoOrderRefundBO); + } + + public List listRefundRankingByProd(Long shopId, Date startTime, Date endTime) { + + String spuName = "orderItems.spuNameZh"; + if (Objects.equals(I18nMessage.getLang(), LanguageEnum.LANGUAGE_EN.getLang())) { + spuName = "orderItems.spuNameEn"; + } + + //分组 + GroupOperation groupOperation = Aggregation.group("orderItems.spuId") + .sum("refundCount").as("refundSpuCount") + .first(spuName).as("refundProdName"); + //过滤 + Criteria criteria = Criteria.where("returnMoneySts").ne(-1); + filterQuery(criteria, shopId, startTime, endTime); + // 显示refundSpuCount, refundProdName,字段_id取别名spuId + ProjectionOperation project = Aggregation.project("refundSpuCount", "refundProdName").and("_id").as("spuId"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation(MongoOrderRefundStatisticsVO.class, + Aggregation.match(criteria), + Aggregation.unwind("orderItems"), + groupOperation, + project, + Aggregation.sort(Sort.Direction.DESC, "refundSpuCount"), + Aggregation.limit(10) + ); + logger.info("构建listRefundRankingByProd()}的mongodb查询语句: {}", typedAggregation); + + //执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderRefundStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + return BeanUtil.mapAsList(list, OrderRefundStatisticsVO.class); + } + + public List listRefundRankingByReason(Long shopId, Date startTime, Date endTime) { + // 分组 + GroupOperation groupOperation = Aggregation.group("buyerReason") + .count().as("refundCount") + .sum("refundAmount").as("refundAmount"); + // 过滤 + Criteria criteria = Criteria.where("returnMoneySts").is(5); + filterQuery(criteria, shopId, startTime, endTime); + // 显示refundSpuCount, refundProdName,字段_id取别名spuId + ProjectionOperation project = Aggregation.project("refundCount", "refundAmount").and("_id").as("buyerReason"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation(MongoOrderRefundStatisticsVO.class, + Aggregation.match(criteria), + groupOperation, + project, + Aggregation.sort(Sort.Direction.DESC, "refundAmount"), + Aggregation.limit(5) + ); + logger.info("构建listRefundRankingByReason()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderRefundStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + return BeanUtil.mapAsList(list, OrderRefundStatisticsVO.class); + } + + public OrderRefundStatisticsVO getOrderRefundInfoByShopId(Long shopId, Date startTime, Date endTime) { + // 分组 + GroupOperation groupOperation = Aggregation.group() + .count().as("refundCount") + .sum("refundAmount").as("refundAmount") + .sum("platformRefundAmount").as("platformRefundAmount"); + // 过滤 + Criteria criteria = Criteria.where("returnMoneySts").is(5); + filterQuery(criteria, shopId, startTime, endTime); + + // 显示refundSpuCount, refundProdName,字段_id取别名spuId + ProjectionOperation project = Aggregation.project("refundCount", "refundAmount", "platformRefundAmount"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation(MongoOrderRefundStatisticsVO.class, + Aggregation.match(criteria), + groupOperation, + project, + Aggregation.sort(Sort.Direction.DESC, "refundAmount") + ); + logger.info("构建listRefundRankingByReason()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderRefundStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + OrderRefundStatisticsVO orderRefundStatisticsVO; + if (CollUtil.isNotEmpty(list)) { + MongoOrderRefundStatisticsVO mongoOrderRefundStatisticsVO = list.get(0); + orderRefundStatisticsVO = BeanUtil.map(mongoOrderRefundStatisticsVO, OrderRefundStatisticsVO.class); + if (Objects.isNull(shopId)) { + orderRefundStatisticsVO.setPayActualTotal(mongoOrderRefundStatisticsVO.getRefundAmount()); + } else { + orderRefundStatisticsVO.setPayActualTotal(mongoOrderRefundStatisticsVO.getRefundAmount() + mongoOrderRefundStatisticsVO.getPlatformRefundAmount()); + } + } else { + orderRefundStatisticsVO = new OrderRefundStatisticsVO(); + orderRefundStatisticsVO.setRefundCount(0); + orderRefundStatisticsVO.setPayActualTotal(0L); + } + return orderRefundStatisticsVO; + } + + public List listOrderRefundInfoByShopIdAndDateRange(Long shopId, Date startTime, Date endTime, Integer dayCount) { + // 过滤 + Criteria criteria = Criteria.where("returnMoneySts").is(5); + filterQuery(criteria, shopId, startTime, endTime); + + // 分组前,先处理下要用于分组的时间 + ProjectionOperation projectionOperation = Aggregation.project("refundAmount", "platformRefundAmount", "orderId") + .and(DateOperators.DateToString.dateOf("refundTime").toString("%Y-%m-%d")).as("refundTime"); + + // 根据退款时间和订单id进行分组 + GroupOperation refundTimeAndOrderIdGroupOperation = Aggregation.group("refundTime", "orderId") + .sum("refundAmount").as("refundAmount") + .sum("platformRefundAmount").as("platformRefundAmount"); + // + GroupOperation groupOperation = Aggregation.group("_id.refundTime") + .count().as("refundCount") + .sum("refundAmount").as("refundAmount") + .sum("platformRefundAmount").as("platformRefundAmount"); + + ProjectionOperation project = Aggregation.project("refundAmount", "platformRefundAmount", "refundCount").and("_id").as("timeData"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderRefundStatisticsVO.class, + Aggregation.match(criteria), + projectionOperation, + refundTimeAndOrderIdGroupOperation, + groupOperation, + project + ); + logger.info("listOrderOverviewInfoByShopIdAndDateRange()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderRefundStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + List orderRefundStatisticsList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isNotEmpty(list)) { + for (MongoOrderRefundStatisticsVO mongoOrderRefundStatisticsVO : list) { + OrderRefundStatisticsVO orderRefundStatisticsVO = new OrderRefundStatisticsVO(); + orderRefundStatisticsVO.setRefundCount(mongoOrderRefundStatisticsVO.getRefundCount()); + orderRefundStatisticsVO.setRefundDateToString(mongoOrderRefundStatisticsVO.getTimeData()); + orderRefundStatisticsVO.setPayActualTotal(mongoOrderRefundStatisticsVO.getRefundAmount() + mongoOrderRefundStatisticsVO.getPlatformRefundAmount()); + orderRefundStatisticsList.add(orderRefundStatisticsVO); + } + } + + return orderRefundStatisticsList; + } + + public Integer getOrderRefundCountOfStatusByShopId(Long shopId) { + // 分组前,先处理下要用于分组的时间 + ProjectionOperation projectionOperation = Aggregation.project("_id", "orderId"); + + // 根据订单id进行分组 + GroupOperation groupOperation = Aggregation.group("orderId") + .count().as("refundCount"); + // + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderRefundStatisticsVO.class, + Aggregation.match(Criteria.where("shopId").is(shopId)), + projectionOperation, + groupOperation + ); + logger.info("listOrderOverviewInfoByShopIdAndDateRange()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderRefundStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return 0; + } + Integer refundCount = list.get(0).getRefundCount(); + if (CollUtil.isEmpty(list) || Objects.isNull(refundCount)) { + return 0; + } + return refundCount; + } + + public List listShopRankingByRefundCount(Date startTime, Date endTime, Integer limit) { + // 过滤 + Criteria criteria = Criteria.where("returnMoneySts").is(5); + filterQuery(criteria, null, startTime, endTime); + // 根据订单id进行分组 + GroupOperation groupOperation = Aggregation.group("shopId") + .count().as("refundCount"); + ProjectionOperation projectionOperation = Aggregation.project("refundCount").and("_id").as("shopId"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderRefundStatisticsVO.class, + Aggregation.match(criteria), + groupOperation, + projectionOperation, + Aggregation.sort(Sort.Direction.DESC, "refundCount"), + Aggregation.limit(limit) + ); + logger.info("listShopRankingByRefundCount()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderRefundStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(0); + } + return BeanUtil.mapAsList(list, OrderRefundStatisticsVO.class); + } + + public List statisticalUserOrderData(List userIds, Long shopId) { + // 根据订单id进行分组 + GroupOperation groupOperation = Aggregation.group("userId") + .sum("refundAmount").as("afterSaleAmount") + .count().as("afterSaleTimes"); + ProjectionOperation projectionOperation = Aggregation.project("afterSaleAmount", "afterSaleTimes"). + and("_id").as("userId"); + Criteria criteria; + if (Objects.nonNull(shopId) && !Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + criteria = Criteria.where("returnMoneySts").is(5).and("userId").in(userIds).and("shopId").is(shopId); + } else { + criteria = Criteria.where("returnMoneySts").is(5).and("userId").in(userIds); + } + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderRefundStatisticsVO.class, + Aggregation.match(criteria), + groupOperation, + projectionOperation + ); + logger.info("statisticalUserOrderData()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderRefundStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(0); + } + return BeanUtil.mapAsList(list, UserOrderStatisticVO.class); + } + + public OrderRefundStatisticsVO getOrderRefundInfoBySupplierId(Long supplierId, Date startTime, Date endTime) { + // 过滤 + Criteria criteria = Criteria.where("returnMoneySts").is(5) + .and("supplierHandleStatus").is(1); + filterQuery(criteria, null, startTime, endTime); + if (Objects.nonNull(supplierId)) { + criteria.and("supplierId").is(supplierId); + } + // 根据订单id进行分组 + GroupOperation orderGroupOperation = Aggregation.group("orderId") + .sum("refundAmount").as("refundAmount") + .sum("platformRefundAmount").as("platformRefundAmount"); + + // 根据订单id进行分组 + GroupOperation groupOperation = Aggregation.group("orderId") + .count().as("refundCount") + .sum("refundAmount").as("refundAmount") + .sum("platformRefundAmount").as("platformRefundAmount"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderRefundStatisticsVO.class, + Aggregation.match(criteria), + orderGroupOperation, + groupOperation + ); + logger.info("getOrderRefundInfoBySupplierId()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderRefundStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + OrderRefundStatisticsVO orderRefundStatisticsVO = new OrderRefundStatisticsVO(); + if (CollUtil.isEmpty(list)) { + orderRefundStatisticsVO.setPayActualTotal(0L); + orderRefundStatisticsVO.setRefundCount(0); + return orderRefundStatisticsVO; + } + + MongoOrderRefundStatisticsVO mongoOrderRefundStatisticsVO = list.get(0); + if (Objects.isNull(supplierId)) { + orderRefundStatisticsVO.setPayActualTotal(mongoOrderRefundStatisticsVO.getRefundAmount()); + } else { + orderRefundStatisticsVO.setPayActualTotal(mongoOrderRefundStatisticsVO.getRefundAmount() + mongoOrderRefundStatisticsVO.getPlatformRefundAmount()); + } + orderRefundStatisticsVO.setRefundCount(mongoOrderRefundStatisticsVO.getRefundCount()); + return orderRefundStatisticsVO; + } + + public Integer getOrderCountBySupplierId(Long supplierId) { + // 过滤 + Criteria criteria = Criteria.where("returnMoneySts").is(1) + .and("supplierHandleStatus").is(0) + .and("supplierId").is(supplierId); + + // 根据订单id进行分组 + GroupOperation orderGroupOperation = Aggregation.group("orderId"); + + LookupOperation lookupOperation = Aggregation.lookup("order", "_id", "orderId", "order"); + + Criteria lookupCriteria = Criteria.where("order.supplierId").is(supplierId) + .and("order.supplierDeliveryType").is(1) + .and("order.waitPurchase").ne(1); + + // 根据订单id进行分组 + GroupOperation groupOperation = Aggregation.group() + .count().as("refundCount"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderRefundStatisticsVO.class, + Aggregation.match(criteria), + orderGroupOperation, + lookupOperation, + Aggregation.match(lookupCriteria), + groupOperation + ); + logger.info("getOrderCountBySupplierId()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderRefundStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return 0; + } + return list.get(0).getRefundCount(); + } + + /** + * 根据参数获取商品退款订单数据分析 + * + * @param spuIds 商品id列表 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 商品退款订单数据 + */ + public List getProdRefundEffectByDateAndProdIds(List spuIds, Date startTime, Date endTime) { + // 过滤 + Criteria criteria = Criteria.where("createTime") + .gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))) + .lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))) + .and("returnMoneySts") + .gte(1) + .lte(5) + .and("orderItems.spuId") + .in(spuIds); + // 筛选退款项数据字段 + ProjectionOperation refundProjectionOperation = Aggregation.project("refundId", "refundType", "returnMoneySts", "userId") + .and("orderItems.spuId").as("spuId") + .and("orderItems.count").as("count") + .and(ConditionalOperators.when(Criteria.where("returnMoneySts").is(5)).then("$orderItems.refundAmount").otherwise(0)).as("refundAmount") + .and(ConditionalOperators.when(Criteria.where("returnMoneySts").is(5)).then(1).otherwise(0)).as("refundSuccessNum") + .and(ConditionalOperators.when(Criteria.where("returnMoneySts").is(5)).then(1).otherwise(0)).as("refundSuccessPerson"); + + + // 根据用户id进行分组 + GroupOperation userGroupOperation = Aggregation.group("spuId", "userId") + .sum("refundAmount").as("refundSuccessAmount") + .sum("count").as("refundNum") + .sum("refundSuccessNum").as("refundSuccessNum") + .sum("refundSuccessPerson").as("refundSuccessPerson"); + + // 筛选用户id分类后的数据字段 + ProjectionOperation userProjectionOperation = Aggregation.project("refundSuccessAmount", "refundNum", "refundSuccessNum", "refundSuccessPerson") + .and("_id.spuId").as("spuId") + .and(ConditionalOperators.when(Criteria.where("refundSuccessPerson").gte(1)).then(1).otherwise(0)).as("refundSuccessPerson"); + + // 根据用户id进行分组 + GroupOperation groupOperation = Aggregation.group("spuId") + .sum("refundSuccessAmount").as("refundSuccessAmount") + .sum("refundNum").as("refundNum") + .sum("refundSuccessNum").as("refundSuccessNum") + .count().as("refundPerson") + .sum("refundSuccessPerson").as("refundSuccessPerson"); + + ProjectionOperation projectionOperation = Aggregation.project("refundSuccessAmount", "refundNum", "refundSuccessNum", "refundPerson", "refundSuccessPerson") + .and("_id").as("spuId"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoOrderRefundStatisticsVO.class, + Aggregation.match(criteria), + Aggregation.unwind("orderItems"), + refundProjectionOperation, + Aggregation.match(Criteria.where("spuId").in(spuIds)), + userGroupOperation, + userProjectionOperation, + groupOperation, + projectionOperation + ); + logger.info("getOrderCountBySupplierId()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderRefundStatisticsVO.class); + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(0); + } + return BeanUtil.mapAsList(list, OrderRefundProdEffectRespVO.class); + } + + private void filterQuery(Criteria criteria, Long shopId, Date startTime, Date endTime) { + if (Objects.nonNull(shopId)) { + criteria.and("shopId").is(shopId); + } + if (Objects.nonNull(startTime) || Objects.nonNull(endTime)) { + if (Objects.nonNull(startTime) && Objects.nonNull(endTime)) { + criteria.and("refundTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + } else if (Objects.nonNull(startTime)) { + criteria.and("refundTime").gte(startTime); + } else { + criteria.and("refundTime").lte(endTime); + } + } + } + + public AccountOrderDetailVO getAccountRefundOrderDetail(Date startTime, Date endTime, String shopName, Long shopId) { + // 过滤 + Criteria criteria = getShopNameCriteria(Objects.isNull(shopId) && StrUtil.isNotBlank(shopName), shopName); + if (Objects.nonNull(shopId)) { + criteria.and("shopId").is(shopId); + } + if (Objects.nonNull(startTime)) { + criteria.and("refundTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + } + // 统计退款成功 + criteria.and("returnMoneySts").is(5); + + ProjectionOperation logProjectOperation = Aggregation.project("refundScore", "refundAmount", "payType") + .and(ConditionalOperators.when(Criteria.where("payType").in(2, 6, 7)).then("$refundAmount").otherwise(0)).as("alipayAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(1, 3, 4, 5, 8)).then("$refundAmount").otherwise(0)).as("wechatAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(9)).then("$refundAmount").otherwise(0)).as("balanceAmount"); + + // 分组 + GroupOperation groupOperation = Aggregation.group() + .sum("alipayAmount").as("alipayAmount") + .sum("wechatAmount").as("wechatAmount") + .sum("balanceAmount").as("balanceAmount") + .sum("refundScore").as("scoreCount"); + + ProjectionOperation project = Aggregation.project("scoreCount", "alipayAmount", "wechatAmount", "balanceAmount"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoAccountOrderRefundDetailVO.class, + Aggregation.match(criteria), + logProjectOperation, + groupOperation, + project + ); + logger.info("getAccountRefundOrderDetail()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoAccountOrderRefundDetailVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + return BeanUtil.map(CollUtil.isEmpty(list) ? new MongoAccountOrderRefundDetailVO() : list.get(0), AccountOrderDetailVO.class); + } + + public PageShopAccountOrderVO listShopRefundAccountDetail(Date startTime, Date endTime, String shopName, + Integer pageSize, Integer pageNum) { + // 过滤 + Criteria criteria = getShopNameCriteria(StrUtil.isNotBlank(shopName), shopName); + if (Objects.nonNull(startTime)) { + criteria.and("refundTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + } + criteria.and("shopId").ne(Constant.PLATFORM_SHOP_ID); + + // 主表返回字段 + ProjectionOperation itemProjectionOperation = Aggregation.project("orderId", "refundScore", "refundAmount", "shopId", "shopName", "payType"); + + ProjectionOperation projectionOperation = Aggregation.project("shopId", "shopName", "payType", "refundScore") + .and(ConditionalOperators.when(Criteria.where("payType").in(2, 6, 7)).then("$refundAmount").otherwise(0)).as("alipayAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(1, 3, 4, 5, 8)).then("$refundAmount").otherwise(0)).as("wechatAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(9)).then("$refundAmount").otherwise(0)).as("balanceAmount") + .and("$refundAmount").as("total"); + // 分组 + GroupOperation shopGroupOperation = Aggregation.group("shopId") + .first("shopId").as("shopId") + .first("shopName").as("shopName") + .sum("wechatAmount").as("wechatAmount") + .sum("alipayAmount").as("alipayAmount") + .sum("balanceAmount").as("balanceAmount") + .sum("refundScore").as("scoreCount") + .sum("total").as("total"); + + ProjectionOperation project = Aggregation.project("shopId", "shopName", "scoreCount", "wechatAmount", "alipayAmount", "balanceAmount", "total"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC, "shopId"); + // 分页数据 + SkipOperation skipOperation = Aggregation.skip((long) pageSize * (pageNum - 1)); + LimitOperation limitOperation = Aggregation.limit(pageSize); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoShopAccountOrderRefundDetailVO.class, + Aggregation.match(criteria), + itemProjectionOperation, + projectionOperation, + shopGroupOperation, + project, + sortOperation, + skipOperation, + limitOperation + ); + logger.info("listShopRefundAccountDetail()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoShopAccountOrderRefundDetailVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + + // 总条数 + TypedAggregation aggregation = Aggregation.newAggregation( + MongoShopAccountOrderRefundDetailVO.class, + Aggregation.match(criteria), + itemProjectionOperation, + projectionOperation, + shopGroupOperation, + project + ); + AggregationResults aggregate = mongoTemplate.aggregate(aggregation, MongoShopAccountOrderRefundDetailVO.class); + List mappedResults = aggregate.getMappedResults(); + PageShopAccountOrderVO pageShopAccountOrderVO = new PageShopAccountOrderVO(); + pageShopAccountOrderVO.setShopList(BeanUtil.mapAsList(list, ShopAccountOrderDetailVO.class)); + pageShopAccountOrderVO.setTotal((long) mappedResults.size()); + return pageShopAccountOrderVO; + } + + private Criteria getShopNameCriteria(boolean shopName, String shopName1) { + Criteria criteria = new Criteria(); + Integer paySysType = orderAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + criteria.and("paySysType").is(paySysType); + if (shopName) { + criteria.and("shopName").regex(Pattern.compile("^.*" + shopName1 + ".*$", Pattern.CASE_INSENSITIVE)); + } + return criteria; + } + + public PageVO pageRefundFinanceDetail(PageDTO pageDTO, FinanceDetailDTO financeDetailDTO) { + // 过滤 + Criteria criteria = getFinanceCriteria(financeDetailDTO); + Integer lang = I18nMessage.getLang(); + String spuName = "orderItems.spuNameZh"; + if (Objects.equals(lang, LanguageEnum.LANGUAGE_EN.getLang())) { + spuName = "orderItems.spuNameEn"; + } + UnwindOperation unwindOperation = Aggregation.unwind("orderItems"); + // 分组 + GroupOperation groupOperation = Aggregation.group("_id") + .first("_id").as("refundId") + .first("orderId").as("orderId") + .first("refundTime").as("transDate") + .first("payType").as("payType") + .first("decisionTime").as("placeTime") + .first("refundAmount").as("transAmount") + .first("shopId").as("shopId") + .first("shopName").as("shopName") + .first("userId").as("userId") + .first("_id").as("payIds") + .push(spuName).as("prodNames"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "transDate"); + // 分页数据 + SkipOperation skipOperation = Aggregation.skip((long) pageDTO.getPageSize() * (pageDTO.getPageNum() - 1)); + LimitOperation limitOperation = Aggregation.limit(pageDTO.getPageSize()); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoFinanceOrderRefundDetailVO.class, + Aggregation.match(criteria), + unwindOperation, + groupOperation, + sortOperation, + skipOperation, + limitOperation + ); + logger.info("pageRefundFinanceDetail()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + List list = getList(typedAggregation); + // 总条数 + TypedAggregation aggregation = Aggregation.newAggregation( + MongoFinanceOrderRefundDetailVO.class, + Aggregation.match(criteria), + unwindOperation, + groupOperation + ); + AggregationResults aggregate = mongoTemplate.aggregate(aggregation, MongoFinanceOrderRefundDetailVO.class); + List mappedResults = aggregate.getMappedResults(); + PageVO page = new PageVO<>(); + page.setTotal((long) mappedResults.size()); + page.setList(BeanUtil.mapAsList(list, FinanceDetailVO.class)); + page.setPages(PageUtil.getPages(mappedResults.size(), pageDTO.getPageSize())); + return page; + } + + private List getList(TypedAggregation typedAggregation) { + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoFinanceOrderRefundDetailVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + list.forEach(data -> { + data.setBizType(FinanceBizType.REFUND.value()); + data.setProdName(data.getProdNames().toString().substring(1, data.getProdNames().toString().length() - 1)); + }); + return list; + } + + public List listRefundFinanceDetail(FinanceDetailDTO financeDetailDTO) { + // 过滤 + Criteria criteria = getFinanceCriteria(financeDetailDTO); + Integer lang = I18nMessage.getLang(); + String spuName = "orderItems.spuNameZh"; + if (Objects.equals(lang, LanguageEnum.LANGUAGE_EN.getLang())) { + spuName = "orderItems.spuNameEn"; + } + // 分组 + GroupOperation groupOperation = Aggregation.group("_id") + .first("_id").as("orderId") + .first("_id").as("refundId") + .first("refundTime").as("transDate") + .first("payType").as("payType") + .first("decisionTime").as("placeTime") + .first("refundAmount").as("transAmount") + .first("shopName").as("shopName") + .first("userId").as("userId") + .first("_id").as("payIds") + .push(spuName).as("prodNames"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "transDate"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoFinanceOrderRefundDetailVO.class, + Aggregation.match(criteria), + Aggregation.unwind("orderItems"), + groupOperation, + sortOperation + ); + logger.info("listRefundFinanceDetail()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + List list = getList(typedAggregation); + return BeanUtil.mapAsList(list, FinanceDetailVO.class); + } + + public PageShopAccountOrderVO pageOrderRefundInfo(Date startTime, Date endTime, Long shopId, Integer pageSize, Integer pageNum) { + // 过滤 + Criteria criteria = new Criteria(); + Integer paySysType = orderAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + criteria.and("paySysType").is(paySysType); + criteria.and("returnMoneySts").is(5); + criteria.and("shopId").is(shopId); + if (Objects.nonNull(startTime)) { + criteria.and("refundTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + } + ProjectionOperation projectionOperation = getProjectionOperation(); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "refundTime"); + // 分页数据 + SkipOperation skipOperation = Aggregation.skip((long) pageSize * (pageNum - 1)); + LimitOperation limitOperation = Aggregation.limit(pageSize); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoOrderRefundInfoVO.class, + Aggregation.match(criteria), + projectionOperation, + sortOperation, + skipOperation, + limitOperation + ); + logger.info("pageOrderRefundInfo()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoOrderRefundInfoVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + list.forEach(data -> data.setPayEntry(0)); + // 总条数 + TypedAggregation aggregation = Aggregation.newAggregation( + MongoOrderRefundInfoVO.class, + Aggregation.match(criteria), + projectionOperation + ); + AggregationResults aggregate = mongoTemplate.aggregate(aggregation, MongoOrderRefundInfoVO.class); + List mappedResults = aggregate.getMappedResults(); + PageShopAccountOrderVO pageShopAccountOrderVO = new PageShopAccountOrderVO(); + pageShopAccountOrderVO.setRefundInfoList(BeanUtil.mapAsList(list, OrderRefundInfoVO.class)); + pageShopAccountOrderVO.setTotal((long) mappedResults.size()); + return pageShopAccountOrderVO; + } + + private static ProjectionOperation getProjectionOperation() { + return Aggregation.project("shopId", "shopName", "payType", "refundTime", "payId", "refundAmount", "orderId") + .and("_id").as("refundId") + .and("refundScore").as("scoreCount") + .and(ConditionalOperators.when(Criteria.where("payType").in(2, 6, 7)).then("$refundAmount").otherwise(0)).as("alipayAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(1, 3, 4, 5, 8)).then("$refundAmount").otherwise(0)).as("wechatAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(9)).then("$refundAmount").otherwise(0)).as("balanceAmount"); + } + + public PageShopAccountOrderVO listOrderRefundInfo(Date startTime, Date endTime, String shopName) { + Criteria criteria = getShopNameCriteria(StrUtil.isNotBlank(shopName), shopName); + criteria.and("returnMoneySts").is(5); + if (Objects.nonNull(startTime)) { + criteria.and("refundTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + } + ProjectionOperation projectionOperation = getProjectionOperation(); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "refundTime"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoOrderRefundInfoVO.class, + Aggregation.match(criteria), + projectionOperation, + sortOperation + ); + logger.info("listOrderRefundInfo()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoOrderRefundInfoVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + list.forEach(data -> data.setPayEntry(0)); + PageShopAccountOrderVO pageShopAccountOrderVO = new PageShopAccountOrderVO(); + pageShopAccountOrderVO.setRefundInfoList(BeanUtil.mapAsList(list, OrderRefundInfoVO.class)); + return pageShopAccountOrderVO; + } + + private Criteria getFinanceCriteria(FinanceDetailDTO financeDetailDTO) { + Criteria criteria = new Criteria(); + Integer paySysType = orderAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + criteria.and("paySysType").is(paySysType); + criteria.and("returnMoneySts").is(5); + if (Objects.nonNull(financeDetailDTO.getStartTime())) { + criteria.and("refundTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(financeDetailDTO.getStartTime()))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(financeDetailDTO.getEndTime()))); + } + if (Objects.nonNull(financeDetailDTO.getOrderId())) { + criteria.and("_id").is(financeDetailDTO.getOrderId()); + } + if (Objects.nonNull(financeDetailDTO.getPayType()) && financeDetailDTO.getPayType() > -1) { + criteria.and("payType").is(financeDetailDTO.getPayType()); + } + return criteria; + } + + public List listShouldUpdateRefund(Date decisionStartTime, Date decisionEndTime, Integer payType, Integer returnMoneySts) { + //过滤 + Criteria criteria = Criteria.where("returnMoneySts").is(returnMoneySts).and("payType").is(payType); + criteria.and("decisionTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(decisionStartTime))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(decisionEndTime))); + criteria.and("refundTime").isNull(); + ProjectionOperation project = Aggregation.project().and("_id").as("refundId"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation(MongoOrderRefundInfoVO.class, + Aggregation.match(criteria), + project + ); + logger.info("listShouldUpdateRefund()}的mongodb查询语句: {}", typedAggregation); + + //执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoOrderRefundInfoVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + List refundIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isNotEmpty(list)) { + refundIds = list.stream().map(MongoOrderRefundInfoVO::getRefundId).collect(Collectors.toList()); + } + return refundIds; + } + + /** + * 统计退款单数据量 + * @param orderRefundDTO 退款单DTO + * @return 退款单数量 + */ + public Long countRefundOrder(OrderRefundDTO orderRefundDTO) { + Criteria criteria = new Criteria(); + if (!Objects.isNull(orderRefundDTO.getUserId())) { + criteria.and("userId").is(orderRefundDTO.getUserId()); + } + if (!CollectionUtils.isEmpty(orderRefundDTO.getNotInStatuses())) { + criteria.and("returnMoneySts").nin(orderRefundDTO.getNotInStatuses()); + } + Query query = new Query(criteria); + logger.info("countRefundOrder()的mongodb查询语句: {}", query); + return mongoTemplate.count(query, MongoOrderRefundBO.class); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/AllotOrderMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/AllotOrderMapper.java new file mode 100644 index 0000000..debf29b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/AllotOrderMapper.java @@ -0,0 +1,33 @@ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.order.dto.AllotOrderDTO; +import com.tmerclub.cloud.order.model.AllotOrder; +import com.tmerclub.cloud.order.vo.AllotOrderVO; +import org.apache.ibatis.annotations.Param; + +/** + * @author gaozijie + * @date 2023-11-20 + */ +public interface AllotOrderMapper { + + /** + * 获取调拨订单详情 + * @param allotOrderDTO 调拨订单dto + * @return 调拨订单详情 + */ + AllotOrderVO getAllotOrder(@Param("allotOrderDTO") AllotOrderDTO allotOrderDTO); + + /** + * 新增调拨订单 + * @param allotOrder 调拨订单 + */ + void addAllotOrder(@Param("allotOrder") AllotOrder allotOrder); + + /** + * 更新调拨订单 + * @param allotOrder 调拨订单 + */ + void updateAllotOrder(@Param("allotOrder") AllotOrder allotOrder); + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderItemLangMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderItemLangMapper.java new file mode 100644 index 0000000..f025bd2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderItemLangMapper.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.common.order.vo.OrderItemLangVO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.order.model.OrderItemLang; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单项-国际化 + * + * @author YXF + * @date 2021-05-17 10:26:54 + */ +public interface OrderItemLangMapper { + + /** + * 获取订单项-国际化列表 + * + * @return 订单项-国际化列表 + */ + List list(); + + /** + * 根据订单项-国际化id获取订单项-国际化 + * + * @param orderItemId 订单项-国际化id + * @return 订单项-国际化 + */ + OrderItemLang getByOrderItemId(@Param("orderItemId") Long orderItemId); + + /** + * 保存订单项-国际化 + * + * @param orderItemLangList 订单项-国际化 + */ + void saveBatch(@Param("orderItemLangList") List orderItemLangList); + + /** + * 更新订单项-国际化 + * + * @param orderItemLang 订单项-国际化 + */ + void update(@Param("orderItemLang") OrderItemLang orderItemLang); + + /** + * 根据订单项-国际化id删除订单项-国际化 + * + * @param orderItemId + */ + void deleteById(@Param("orderItemId") Long orderItemId); + + /** + * 获取订单项国际化信息 + * @param orderIdList 订单id列表 + * @return 订单项国际化数据列表 + */ + List getLangListByOrderIds(@Param("orderIdList") long[] orderIdList); + + /** + * 根据订单项id列表获取订单项国际化信息列表 + * @param orderItemIds + * @param lang + * @return + */ + List listOrderItemLangByIds(@Param("orderItemIds") List orderItemIds, @Param("lang") Integer lang); + + /** + * 根据订单项id列表获取订单项信息列表 + * @param orderItemIds + * @param lang + * @return + */ + List getListByOrderItemId(@Param("orderItemIds") List orderItemIds, @Param("lang") Integer lang); + + /** + * 批量删除 + * + * @param removeItemIds + */ + void deleteBatchByIds(@Param("orderItemIds") List removeItemIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderItemMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderItemMapper.java new file mode 100644 index 0000000..cc65065 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderItemMapper.java @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.api.order.bo.DistributionAmountWithOrderIdBO; +import com.tmerclub.cloud.api.order.bo.UserScoreLogOrderBO; +import com.tmerclub.cloud.common.order.bo.EsOrderItemBO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.order.model.OrderItem; +import com.tmerclub.cloud.order.vo.OrderItemDetailVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单项 + * + * @author FrozenWatermelon + * @date 2020-12-04 11:27:35 + */ +public interface OrderItemMapper { + + /** + * 获取订单项列表 + * + * @return 订单项列表 + */ + List list(); + + /** + * 根据订单项id获取订单项 + * + * @param orderItemId 订单项id + * @param lang + * @return 订单项 + */ + com.tmerclub.cloud.common.order.vo.OrderItemVO getByOrderItemId(@Param("orderItemId") Long orderItemId, @Param("lang") Integer lang); + + /** + * 保存订单项 + * + * @param orderItem 订单项 + */ + void save(@Param("orderItem") OrderItem orderItem); + + /** + * 保存订单项 + * + * @param orderItems 订单项 + */ + void saveBatch(@Param("orderItems") List orderItems); + + /** + * 更新订单项 + * + * @param orderItem 订单项 + */ + void update(@Param("orderItem") OrderItem orderItem); + + /** + * 根据订单项id删除订单项 + * + * @param orderItemId + */ + void deleteById(@Param("orderItemId") Long orderItemId); + + /** + * 根据订单项ids删除订单项 + * + * @param orderItemIds + */ + void deleteBatchByIds(@Param("orderItemIds") List orderItemIds); + + /** + * 根据订单号获取订单项 + * + * @param orderId 订单id + * @return 订单项 + */ + List listOrderItemsByOrderId(@Param("orderId") Long orderId); + + /** + * 根据订单号获取订单项,不包含赠品 + * + * @param orderId 订单id + * @return 订单项 + */ + List listOrderItemsByOrderIds(@Param("orderId") Long orderId); + + /** + * 根据订单号获取订单项 + * + * @param orderIds 订单id + * @return 订单项 + */ + List listOrderItemAndLangByOrderIds(@Param("orderIds") List orderIds); + + /** + * 计算订单项已结算分销金额 + * + * @param orderIds + * @return + */ + List sumTotalDistributionAmountByOrderIds(@Param("orderIds") List orderIds); + + /** + * 根据订单id获取订单项商品数量 + * + * @param orderId + * @return + */ + Integer sumNumByOrderId(@Param("orderId") Long orderId); + + /** + * 根据订单id获取订单项数量 + * + * @param orderId + * @return + */ + Integer countByOrderId(@Param("orderId") Long orderId); + + /** + * 更新订单项发货数量信息 + * + * @param orderItem 发货订单项 + * @param deliveryType 发货方式 + */ + void updateByDelivery(@Param("orderItem") DeliveryOrderItemDTO orderItem, @Param("deliveryType") Integer deliveryType); + + /** + * 计算未发货商品数量 + * + * @param orderId + * @return + */ + int countUnDeliveryNumByOrderId(@Param("orderId") Long orderId); + + /** + * 减少订单项待发货数量 + * + * @param orderItemId + * @param count + */ + void reduceUnDeliveryNumByOrderItemId(@Param("orderItemId") Long orderItemId, @Param("count") Integer count); + + /** + * 更新订单项退款状态 + * + * @param orderId + * @param refundStatus + */ + void updateRefundStatusByOrderId(@Param("orderId") Long orderId, @Param("refundStatus") Integer refundStatus); + + /** + * 根据订单id查询订单项、退款详情 + * + * @param orderId 订单id + * @param lang 语言 + * @return 订单项、退款详情 + */ + List listDetailByOrderId(@Param("orderId") Long orderId, @Param("lang") Integer lang); + + /** + * 根据订单项id获取订单项中的商品信息 + * + * @param orderItemId + * @param lang + * @return + */ + com.tmerclub.cloud.common.order.vo.OrderItemVO getSpuInfoByOrderItemId(@Param("orderItemId") Long orderItemId, @Param("lang") Integer lang); + + /** + * 根据订单号获取订单项的物流类型 + * + * @param orderItemId 订单号 + * @return 物流类型 + */ + int getDevTypeByOrderItemId(@Param("orderItemId") Long orderItemId); + + /** + * 根据订单号获取订单项 + * + * @param orderId 订单号 + * @return 订单id以及发货方式 + */ + List getDevTypeByOrderId(@Param("orderId") Long orderId); + + /** + * 批量修改订单项的分销金额 + * + * @param orderItem 订单项 + * @return 受影响行数 + */ + int updateBatchDistributionAmount(@Param("orderItem") EsOrderItemBO orderItem); + + /** + * 获取指定的订单项 + * + * @param orderIds + * @return + */ + List listOrderItemByOrderIds(@Param("orderIds") List orderIds); + + /** + * 根据订单号获取用户积分订单详情 + * + * @param orderIds 订单号 + * @return 订单详情 + */ + List getUserScoreLogDetail(@Param("orderIds") List orderIds); + + + /** + * 根据赠送主订单项id获取 + * + * @param userId + * @param giveawayOrderItemId + * @return + */ + List getOrderItemByGiveawayOrderItemId(@Param("userId") Long userId, @Param("giveawayOrderItemId") Long giveawayOrderItemId); + + /** + * 根据赠送主订单项id获取 + * + * @param giveawayOrderItemIds + * @param userId + * @param sysType + * @return + */ + List getOrderItemByGiveawayOrderItemIds(@Param("giveawayOrderItemIds") List giveawayOrderItemIds, @Param("userId") Long userId, @Param("sysType") Integer sysType); + + /** + * 获取用户指定的订单项列表 + * + * @param userId + * @param orderIds + * @return + */ + List listOrderItemsByUserIdAndOrderIds(@Param("userId") Long userId, @Param("orderIds") List orderIds); + + /** + * 根据ids获取订单项 + * + * @param itemIds + * @return + */ + List listByIds(@Param("itemIds") List itemIds); + + /** + * 查询指定的订单项及语言数据 + * + * @param orderItemIds + * @return + */ + List listOrderItemAndLangByOrderItemIds(@Param("orderItemIds") List orderItemIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderMapper.java new file mode 100644 index 0000000..e36106e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderMapper.java @@ -0,0 +1,395 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.mongodb.bo.order.MongoOrderBO; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.order.bo.SubmitOrderPayAmountInfoBO; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.vo.OrderAndPreSaleVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderMapper { + + /** + * 根据订单信息id获取订单信息 + * + * @param orderId 订单信息id + * @return 订单信息 + */ + Order getByOrderId(@Param("orderId") Long orderId); + + /** + * 更新订单信息 + * + * @param order 订单信息 + */ + void update(@Param("order") Order order); + + /** + * 根据订单信息id删除订单信息 + * + * @param orderId + */ + void deleteById(@Param("orderId") Long orderId); + + /** + * 批量保存订单数据 + * + * @param orders + */ + void saveBatch(@Param("orders") List orders); + + /** + * 查询订单状态 + * + * @param orderIds 多个订单的订单id + * @return 订单状态列表 + */ + List getOrdersStatus(@Param("orderIds") List orderIds); + + /** + * 计算订单实际金额 + * + * @param orderIds 多个订单的订单id + * @return 订单实际金额总和 + */ + List listOrderActualAmount(@Param("orderIds") List orderIds); + + /** + * 将订单改为已支付状态 + * + * @param orderStatus 订单信息 + * @param payType 支付方式 + * @param paySysType + */ + void updateByToPaySuccess(@Param("orderStatus") OrderStatusBO orderStatus, @Param("payType") Integer payType, @Param("paySysType") Integer paySysType); + + /** + * 获取订单中的金额信息,不包含退款 + * + * @param orderIds 多个订单的订单id + * @return 获取订单中的金额信息 + */ + List getOrdersSimpleAmountInfo(@Param("orderIds") List orderIds); + + /** + * 取消订单 + * + * @param orderIds 订单ids + * @return + */ + int cancelOrders(@Param("orderIds") List orderIds); + + /** + * 根据订单号和用户id获取订单 + * + * @param orderId orderId + * @param userId userId + * @return Order + */ + Order getOrderByOrderIdAndUserId(@Param("orderId") Long orderId, @Param("userId") Long userId); + + /** + * 根据订单号和自提点id获取订单 + * + * @param orderId orderId + * @param stationId stationId + * @return Order + */ + Order getOrderByOrderIdAndStationId(@Param("orderId") Long orderId, @Param("stationId") Long stationId); + + /** + * 注意:如果你无法理解下面这句话的话,请不要随意更改里面的sql + * 众所周知,确认收货之后是不能改变状态的, + * 但是确认收货之前是可以改变状态的,如果在确认收货之前, + * 也就是下面这条sql执行之前进行了订单状态的改变(比如退款),那会造成不可预知的后果, + * 所以更新订单状态的时候也要在条件当中加上订单状态,确定这条sql是原子性的 + * 这里的确认收货,条件加上订单的状态,确保这次更新是幂等的 + * + * @param orderId + * @return + */ + int receiptOrder(@Param("orderId") Long orderId); + + /** + * 根据订单号删除订单 + * + * @param orderId 订单号 + */ + void deleteOrder(@Param("orderId") Long orderId); + + /** + * 根据订单号和店铺id获取订单 + * + * @param orderId orderId + * @param shopId shopId + * @return Order + */ + Order getOrderByOrderIdAndShopId(@Param("orderId") Long orderId, @Param("shopId") Long shopId); + + /** + * 获取订单和订单项的数据 + * + * @param orderId + * @param shopId + * @return + */ + Order getOrderAndOrderItemData(@Param("orderId") Long orderId, @Param("shopId") Long shopId); + + /** + * 根据订单id列表获取订单金额信息 + * + * @param orderIdList 订单id列表 + * @return + */ + SubmitOrderPayAmountInfoBO getSubmitOrderPayAmountInfo(@Param("orderIdList") long[] orderIdList); + + /** + * 获取订单需要保存到es中的数据 + * + * @param orderId 订单id + * @return + */ + EsOrderBO getEsOrder(@Param("orderId") Long orderId); + + /** + * 计算每个订单状态的状态数量 + * + * @param userId 用户id + * @return + */ + OrderCountVO countNumberOfStatus(@Param("userId") Long userId); + + /** + * 获取订单的创建状态,给秒杀提供查询是否已经创建订单成功的功能 + * + * @param orderId 订单id + * @return + */ + int countByOrderId(Long orderId); + + /** + * 将订单更新为待成团状态 + * + * @param orderIds 需要更新的订单id + * @param payType 支付方式 + * @param paySysType + */ + void updateByToGroupPaySuccess(@Param("orderIds") List orderIds, @Param("payType") Integer payType, @Param("paySysType") Integer paySysType); + + /** + * 将预售订单更新为预售队赢状态 + * + * @param orderIds 需要更新的订单id + * @param status 订单未更新前状态 + */ + void updateByToPreSaleSuccess(@Param("orderIds") List orderIds, @Param("status") Integer status); + + /** + * 将自提订单更新为待收货(已自提)状态 + * + * @param orderIds 需要更新的订单id + */ + void updateByToStatinoSuccess(@Param("orderIds") List orderIds); + + /** + * 更新团购订单到待发货状态 + * + * @param orderMold + * @param orderIds 订单ids + */ + void updateGroupOrderSuccessStatus(@Param("orderMold") Integer orderMold, @Param("orderIds") List orderIds); + + /** + * 将订单标记为已结算状态 + * + * @param orderIds 订单ids + * @return 变更数量 + */ + int settledOrder(@Param("orderIds") List orderIds); + + /** + * 获取订单及订单项的列表信息 + * + * @param orderId 订单id + * @return 订单信息 + */ + EsOrderBO getEsOrderInfo(@Param("orderId") Long orderId); + + /** + * 批量修改订单采购信息 + * + * @param order 订单信息 + */ + void updateWaitPurchase(@Param("order") Order order); + + /** + * 获取正常状态的订单数量 + * + * @param orderIds 订单ids + * @return 订单详情 + */ + Integer countNormalOrderByOrderIds(@Param("orderIds") List orderIds); + + /** + * 更新订单时间,用于更新es数据,发票使用 + * + * @param orderId + */ + void updateOrderTime(@Param("orderId") Long orderId); + + /** + * 修改订单分销金额 + * + * @param orders 订单 + */ + void updateDistributionAmount(@Param("order") Order order); + + /** + * 根据订单id获取发货需要的信息 + * + * @param orderId + * @return + */ + Order getDeliveryInfoByOrderId(@Param("orderId") Long orderId); + + /** + * 获取指定的预售订单 + * + * @param orderId + * @return + */ + OrderAndPreSaleVO getBalanceTimeExpireByOrderId(@Param("orderId") Long orderId); + + /** + * 获取用户的第一笔支付订单id + * + * @param userId + * @param supplierId + * @param orderId + * @return + */ + MongoOrderBO getUserFirstUserOrder(@Param("userId") Long userId, @Param("supplierId") Long supplierId, @Param("orderId") Long orderId); + + /** + * 获取活动订单的支付信息列表 + * + * @param orderId + * @return + */ + OrderActivityVO getActivityOrderInfo(Long orderId); + + + /** + * 获取活动订单的支付信息 + * + * @param activityId 活动id + * @param activityType 活动类型 + * @param spuId 商品id + * @param userId 用户id + * @return + */ + Integer getUserBuyNumByActivityId(@Param("activityId") Long activityId, @Param("activityType") Integer activityType, @Param("spuId") Long spuId, @Param("userId") Long userId); + + + /** + * 根据订单集合获取对应用户 + * + * @param orderIds + * @return + */ + List getUserByOrderIdList(@Param("orderIds") List orderIds); + + /** + * 获取订单分页的订单id列表 + * + * @param orderSearchDTO + * @return + */ + Long countPageOrderIds(@Param("orderSearchDTO") OrderSearchDTO orderSearchDTO); + + /** + * 获取订单分页的订单id列表 + * + * @param orderSearchDTO + * @return + */ + List pageOrderIds(@Param("orderSearchDTO") OrderSearchDTO orderSearchDTO, @Param("page") PageAdapter pageAdapter); + + /** + * 订单列表(用户端) + * + * @param orderIds + * @param lang + * @return + */ + List userOrderList(@Param("orderIds") List orderIds, @Param("lang") Integer lang); + + /** + * 查询指定的订单及订单项列表 + * + * @param orderIds + * @return + */ + List listOrderAndOrderItemByOrderIds(@Param("orderIds") List orderIds); + + /** + * 根据信息获取 + * @param orderIds + * @return + */ + List listOrderAndLangByOrderIds(@Param("orderIds") List orderIds); + + /** + * 获取待自提的订单 + * + * @param orderIdList 订单编号列表 + * @param userId 用户id + * @param stationId 自提点id + * @return 订单列表 + */ + List getStationOrderByOrderIds(@Param("orderIdList") List orderIdList, @Param("userId") Long userId, @Param("stationId") Long stationId); + + /** + * 获取自提点订单列表 + * @param orderDTO + * @return + */ + List listStationOrder(@Param("orderDTO") OrderDTO orderDTO); + + /** + * 获取待采购订单和支付定金未支付尾款的订单Ids + * @param paySysType + * @return 订单Ids + */ + List listWaitPurchaseAndUnPayBalanceOrderIds(@Param("paySysType") Integer paySysType); + + /** + * 查询指定订单数据列表 + * + * @param orderIds + * @return + */ + List listOrderByOrderIds(@Param("orderIds") List orderIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderPreSaleInfoMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderPreSaleInfoMapper.java new file mode 100644 index 0000000..e5bbd3d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderPreSaleInfoMapper.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.common.order.vo.OrderPreSaleInfoVO; +import com.tmerclub.cloud.order.model.OrderPreSaleInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单预售信息 + * + * @author lhd + * @date 2022-08-17 16:36:47 + */ +public interface OrderPreSaleInfoMapper { + + /** + * 根据订单id获取订单预售信息 + * + * @param orderId 订单id + * @return 订单预售信息 + */ + OrderPreSaleInfoVO getByOrderId(@Param("orderId") Long orderId); + + /** + * 保存订单预售信息 + * + * @param orderPreSaleInfo 订单预售信息 + */ + void save(@Param("orderPreSaleInfo") OrderPreSaleInfo orderPreSaleInfo); + + + /** + * 批量保存订单预售信息 + * + * @param orderPreSaleInfos 订单预售信息 + */ + void saveBatch(@Param("orderPreSaleInfos") List orderPreSaleInfos); + + /** + * 更新订单预售信息 + * + * @param orderPreSaleInfo 订单预售信息 + */ + void update(@Param("orderPreSaleInfo") OrderPreSaleInfo orderPreSaleInfo); + + /** + * 根据订单号获取ids + * + * @param orderIds + * @return + */ + List listByOrderIds(@Param("orderIds") List orderIds); + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundInterventionMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundInterventionMapper.java new file mode 100644 index 0000000..9cef210 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundInterventionMapper.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.order.model.OrderRefundIntervention; +import com.tmerclub.cloud.order.vo.OrderRefundInterventionVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单退款介入记录信息 + * + * @author FrozenWatermelon + * @date 2023-08-25 10:45:35 + */ +public interface OrderRefundInterventionMapper { + + /** + * 获取订单退款介入记录信息列表 + * + * @param refundId + * @return 订单退款介入记录信息列表 + */ + List listByRefundId(@Param("refundId") Long refundId); + + /** + * 根据订单退款介入记录信息id获取订单退款介入记录信息 + * + * @param refundIntervertionId 订单退款介入记录信息id + * @return 订单退款介入记录信息 + */ + OrderRefundIntervention getByRefundIntervertionId(@Param("refundIntervertionId") Long refundIntervertionId); + + /** + * 保存订单退款介入记录信息 + * @param orderRefundIntervention 订单退款介入记录信息 + */ + void save(@Param("orderRefundIntervention") OrderRefundIntervention orderRefundIntervention); + + /** + * 更新订单退款介入记录信息 + * @param orderRefundIntervention 订单退款介入记录信息 + */ + void update(@Param("orderRefundIntervention") OrderRefundIntervention orderRefundIntervention); + + /** + * 根据订单退款id删除订单退款介入记录信息 + * @param refundIntervertirefundIdonId + */ + void deleteById(@Param("refundId") Long refundId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundSettlementMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundSettlementMapper.java new file mode 100644 index 0000000..bbcf204 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundSettlementMapper.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.order.model.OrderRefundSettlement; +import com.tmerclub.cloud.order.vo.OrderRefundSettlementVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 退款支付结算单据 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderRefundSettlementMapper { + + /** + * 获取退款支付结算单据列表 + * + * @return 退款支付结算单据列表 + */ + List list(); + + /** + * 根据退款支付结算单据id获取退款支付结算单据 + * + * @param settlementId 退款支付结算单据id + * @return 退款支付结算单据 + */ + OrderRefundSettlementVO getBySettlementId(@Param("settlementId") Long settlementId); + + /** + * 保存退款支付结算单据 + * + * @param orderRefundSettlement 退款支付结算单据 + */ + void save(@Param("orderRefundSettlement") OrderRefundSettlement orderRefundSettlement); + + /** + * 更新退款支付结算单据 + * + * @param orderRefundSettlement 退款支付结算单据 + */ + void update(@Param("orderRefundSettlement") OrderRefundSettlement orderRefundSettlement); + + /** + * 根据退款支付结算单据id删除退款支付结算单据 + * + * @param settlementId + */ + void deleteById(@Param("settlementId") Long settlementId); + + /** + * 根据订单号获取统一退款订单数量 + * + * @param refundId + * @return + */ + int countByRefundId(@Param("refundId") Long refundId); + + /** + * 根据退款单号更新结算单为已退款状态 + * + * @param refundId + * @return 是否更新成功 + */ + int updateToSuccessByRefundId(@Param("refundId") Long refundId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderReturnReasonMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderReturnReasonMapper.java new file mode 100644 index 0000000..757fbdf --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderReturnReasonMapper.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.order.model.OrderReturnReason; +import com.tmerclub.cloud.order.vo.OrderReturnReasonVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 退款原因 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderReturnReasonMapper { + + /** + * 获取退款原因列表 + * @return 退款原因列表 + */ + List list(); + + /** + * 根据退款原因id获取退款原因 + * + * @param reasonId 退款原因id + * @return 退款原因 + */ + OrderReturnReasonVO getByReasonId(@Param("reasonId") Long reasonId); + + /** + * 保存退款原因 + * @param orderReturnReason 退款原因 + */ + void save(@Param("orderReturnReason") OrderReturnReason orderReturnReason); + + /** + * 更新退款原因 + * @param orderReturnReason 退款原因 + */ + void update(@Param("orderReturnReason") OrderReturnReason orderReturnReason); + + /** + * 根据退款原因id删除退款原因 + * @param reasonId + */ + void deleteById(@Param("reasonId") Long reasonId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderVirtualInfoMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderVirtualInfoMapper.java new file mode 100644 index 0000000..77d1d0c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderVirtualInfoMapper.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.common.order.vo.OrderVirtualInfoVO; +import com.tmerclub.cloud.order.model.OrderVirtualInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单虚拟商品信息 + * + * @author FrozenWatermelon + * @date 2023-02-24 13:55:55 + */ +public interface OrderVirtualInfoMapper { + + /** + * 获取订单虚拟商品信息列表 + * + * @return 订单虚拟商品信息列表 + */ + List list(); + + /** + * 根据订单虚拟商品信息id获取订单虚拟商品信息 + * + * @param id 订单虚拟商品信息id + * @return 订单虚拟商品信息 + */ + OrderVirtualInfo getById(@Param("id") Long id); + + /** + * 保存订单虚拟商品信息 + * + * @param orderVirtualInfo 订单虚拟商品信息 + */ + void save(@Param("orderVirtualInfo") OrderVirtualInfo orderVirtualInfo); + + /** + * 更新订单虚拟商品信息 + * + * @param orderVirtualInfo 订单虚拟商品信息 + */ + void update(@Param("orderVirtualInfo") OrderVirtualInfoVO orderVirtualInfo); + + /** + * 更新订单虚拟商品信息 + * + * @param orderVirtualInfos 订单虚拟商品信息 + */ + void updateBatchByItemId(@Param("orderVirtualInfos") List orderVirtualInfos); + + /** + * 根据订单虚拟商品信息id删除订单虚拟商品信息 + * + * @param id + */ + void deleteById(@Param("id") Long id); + + /** + * 批量保存虚拟订单信息 + * + * @param orderVirtualInfoList + */ + void saveBatch(@Param("orderVirtualInfoList") List orderVirtualInfoList); + + /** + * 根据订单id和自提点id获取虚拟订单 + * + * @param orderId + * @param stationId + * @return + */ + List getByOrderIdAndStationId(@Param("orderId") Long orderId, @Param("stationId") Long stationId); + + /** + * 根据订单id和店铺id获取虚拟订单 + * + * @param orderId + * @param shopId + * @param isWriteOff 1.已核销 0.未核销 + * @return + */ + List getByOrderIdAndShopId(@Param("orderId") Long orderId, @Param("shopId") Long shopId, @Param("isWriteOff") Integer isWriteOff); + + /** + * 根据订单id和核销码获取虚拟订单 + * + * @param orderId + * @param code + * @return + */ + List getByOrderIdAndCode(@Param("orderId") Long orderId, @Param("code") String code); + + /** + * 根据订单id获取核销数量 + * + * @param orderId + * @return + */ + int countWriteOffByOrderId(@Param("orderId") Long orderId); + + /** + * 根据订单id获取核销记录 + * @param orderId + * @return + */ + List getByOrderId(@Param("orderId") Long orderId); + /** + * 根据订单id获取核销记录 + * @param orderItemIds + * @return + */ + List listByOrderItemIds(@Param("orderItemIds") List orderItemIds); + + /** + * 根据itemId删除虚拟商品信息 + * + * @param orderItemIds + */ + void deleteByOrderItemId(@Param("orderItemIds") List orderItemIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderItemMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderItemMapper.java new file mode 100644 index 0000000..ec226b7 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderItemMapper.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.order.model.PurchaseOrderItem; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 采购商品 + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public interface PurchaseOrderItemMapper { + + /** + * 获取采购商品列表 + * + * @return 采购商品列表 + */ + List list(); + + /** + * 根据采购商品id获取采购商品 + * + * @param purchaseSpuId 采购商品id + * @return 采购商品 + */ + PurchaseOrderItem getByPurchaseSpuId(@Param("purchaseSpuId") Long purchaseSpuId); + + /** + * 保存采购商品 + * + * @param purchaseOrderItem 采购商品 + */ + void save(@Param("purchaseOrderItem") PurchaseOrderItem purchaseOrderItem); + + /** + * 更新采购商品 + * + * @param purchaseOrderItem 采购商品 + */ + void update(@Param("purchaseOrderItem") PurchaseOrderItem purchaseOrderItem); + + /** + * 批量保存采购商品 + * + * @param purchaseOrderItemList 采购商品 + */ + void saveBatch(@Param("purchaseOrderItemList") List purchaseOrderItemList); + + /** + * 根据订单号获取订单项的物流类型 + * + * @param orderItemId 订单号 + * @return 物流类型 + */ + int getDevTypeByOrderItemId(@Param("orderItemId") Long orderItemId); + + /** + * 更新订单项发货数量信息 + * + * @param orderItem 发货订单项 + * @param deliveryType 发货方式 + */ + void updateByDelivery(@Param("orderItem") DeliveryOrderItemDTO orderItem, @Param("deliveryType") Integer deliveryType); + + /** + * 计算未发货商品数量 + * + * @param orderId + * @return + */ + int countUnDeliveryNumByOrderId(@Param("orderId") Long orderId); + + /** + * 根据订单号获取订单项 + * + * @param orderId 订单号 + * @return 订单id以及发货方式 + */ + List getDevTypeByOrderId(@Param("orderId") Long orderId); + + /** + * 更新指定采购订单的状态 + * + * @param purchaseOrderIds + * @param status + */ + void updateStatusByPurchaseOrderId(@Param("purchaseOrderIds") List purchaseOrderIds, @Param("status") Integer status); + + /** + * 获取采购订单商品列表 + * @param purchaseOrderId 采购订单id + * @return 采购订单商品列表 + */ + List listItemByPurchaseOrderId(@Param("purchaseOrderId") Long purchaseOrderId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderLangMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderLangMapper.java new file mode 100644 index 0000000..7a5b3c8 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderLangMapper.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.order.model.PurchaseOrderLang; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 采购订单-国际化 + * + * @author lhd + * @date 2022-07-12 13:57:20 + */ +public interface PurchaseOrderLangMapper { + + + /** + * 保存采购订单-国际化 + * @param purchaseOrderLangList 采购订单-国际化 + */ + void saveBatch(@Param("purchaseOrderLangList") List purchaseOrderLangList); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderMapper.java new file mode 100644 index 0000000..00e6f49 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderMapper.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.order.bo.mongo.MongoPurchaseOrderBO; +import com.tmerclub.cloud.order.dto.PurchaseOrderDTO; +import com.tmerclub.cloud.order.model.PurchaseOrder; +import com.tmerclub.cloud.order.vo.PurchaseOrderExcelVO; +import com.tmerclub.cloud.order.vo.PurchaseOrderVO; +import com.tmerclub.cloud.order.vo.UnDeliveryPurchaseOrderExcelVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 采购订单 + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public interface PurchaseOrderMapper { + + /** + * 根据id获取采购订单列表 + * @param purchaseOrderIds 采购订单id + * @return 采购订单列表 + */ + List listByPurchaseOrderIds(@Param("purchaseOrderIds") List purchaseOrderIds); + + /** + * 根据采购订单id获取采购订单 + * + * @param purchaseOrderId 采购订单id + * @return 采购订单 + */ + PurchaseOrder getByPurchaseOrderId(@Param("purchaseOrderId") Long purchaseOrderId); + + /** + * 保存采购订单 + * + * @param purchaseOrder 采购订单 + */ + void save(@Param("purchaseOrder") PurchaseOrder purchaseOrder); + + /** + * 更新采购订单 + * + * @param purchaseOrder 采购订单 + */ + void updateByPurchaseId(@Param("purchaseOrder") PurchaseOrder purchaseOrder); + + /** + * 采购订单信息 + * + * @param purchaseOrderId 采购订单号 + * @param supplierId + * @param lang + * @return + */ + PurchaseOrderVO info(@Param("purchaseOrderId") Long purchaseOrderId, @Param("supplierId") Long supplierId, @Param("lang") Integer lang); + + /** + * 获取 + * + * @param purchaseOrderDTO + * @param supplierIds + * @param shopIds + * @return + */ + List listUnDeliveryPurchaseOrder(@Param("purchaseOrder") PurchaseOrderDTO purchaseOrderDTO, @Param("supplierIds") List supplierIds, @Param("shopIds") List shopIds); + + /** + * 分页 + * + * @param purchaseOrderDTO + * @param supplierIds + * @param shopIds + * @return + */ + List listPurchaseOrderDetail(@Param("purchaseOrder") PurchaseOrderDTO purchaseOrderDTO, @Param("supplierIds") List supplierIds, @Param("shopIds") List shopIds); + + /** + * 获取采购订单及订单项的信息 + * + * @param purchaseOrderId 采购订单id + * @return 采购订单信息 + */ + MongoPurchaseOrderBO getMongoPruchaseOrderInfo(@Param("purchaseOrderId") Long purchaseOrderId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/AllotOrder.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/AllotOrder.java new file mode 100644 index 0000000..eab3704 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/AllotOrder.java @@ -0,0 +1,237 @@ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.order.constant.AllotOrderStatusEnum; + +import java.time.LocalDateTime; + +/** + * 调拨订单entity + * @author gaozijie + * @date 2023-11-20 + */ +public class AllotOrder { + + /** + * 调拨订单id + */ + private Long allotOrderId; + + /** + * 调出点仓库id + */ + private Long outWarehouseId; + + /** + * 调出点库存点类型 + * @see com.tmerclub.cloud.common.product.constant.StockPointType + */ + private Integer outStockPointType; + + /** + * 调入点仓库id + */ + private Long inWarehouseId; + + /** + * 调入点库存点类型 + * @see com.tmerclub.cloud.common.product.constant.StockPointType + */ + private Integer inStockPointType; + + /** + * 物流公司id + */ + private Long dvyCompanyId; + + /** + * 物流方式 + * @see com.tmerclub.cloud.common.order.constant.DeliveryType + */ + private Integer dvyType; + + /** + * 物流单号 + */ + private String dvyOrderNumber; + + /** + * 状态 + * @see AllotOrderStatusEnum + */ + private Integer status; + + /** + * 总调拨数量 + */ + private Integer totalAllotCount; + + /** + * 备注 + */ + private String remark; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 系统类型 + * @see com.tmerclub.cloud.common.constant.SysTypeEnum + */ + private Integer sysType; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + public AllotOrder() { + } + + public Long getAllotOrderId() { + return allotOrderId; + } + + public void setAllotOrderId(Long allotOrderId) { + this.allotOrderId = allotOrderId; + } + + public Long getOutWarehouseId() { + return outWarehouseId; + } + + public void setOutWarehouseId(Long outWarehouseId) { + this.outWarehouseId = outWarehouseId; + } + + public Integer getOutStockPointType() { + return outStockPointType; + } + + public void setOutStockPointType(Integer outStockPointType) { + this.outStockPointType = outStockPointType; + } + + public Long getInWarehouseId() { + return inWarehouseId; + } + + public void setInWarehouseId(Long inWarehouseId) { + this.inWarehouseId = inWarehouseId; + } + + public Integer getInStockPointType() { + return inStockPointType; + } + + public void setInStockPointType(Integer inStockPointType) { + this.inStockPointType = inStockPointType; + } + + public Long getDvyCompanyId() { + return dvyCompanyId; + } + + public void setDvyCompanyId(Long dvyCompanyId) { + this.dvyCompanyId = dvyCompanyId; + } + + public Integer getDvyType() { + return dvyType; + } + + public void setDvyType(Integer dvyType) { + this.dvyType = dvyType; + } + + public String getDvyOrderNumber() { + return dvyOrderNumber; + } + + public void setDvyOrderNumber(String dvyOrderNumber) { + this.dvyOrderNumber = dvyOrderNumber; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getTotalAllotCount() { + return totalAllotCount; + } + + public void setTotalAllotCount(Integer totalAllotCount) { + this.totalAllotCount = totalAllotCount; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + public LocalDateTime getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(LocalDateTime updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "AllotOrder{" + + "allotOrderId=" + allotOrderId + + ", outWarehouseId=" + outWarehouseId + + ", outStockPointType=" + outStockPointType + + ", inWarehouseId=" + inWarehouseId + + ", inStockPointType=" + inStockPointType + + ", dvyCompanyId=" + dvyCompanyId + + ", dvyType=" + dvyType + + ", dvyOrderNumber='" + dvyOrderNumber + '\'' + + ", status=" + status + + ", totalAllotCount=" + totalAllotCount + + ", remark='" + remark + '\'' + + ", shopId=" + shopId + + ", sysType=" + sysType + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/Order.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/Order.java new file mode 100644 index 0000000..2ebb5a9 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/Order.java @@ -0,0 +1,872 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import com.tmerclub.cloud.api.payment.constant.PaySysType; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class Order extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 订单ID + */ + private Long orderId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 用户订单地址Id + */ + private Long orderAddrId; + + /** + * 支付系统类型 + * + * @see PaySysType + */ + private Integer paySysType; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 总值 + */ + private Long total; + + /** + * 实际总值 + */ + private Long actualTotal; + + /** + * 订单使用积分 + */ + private Long orderScore; + + /** + * 订单发票id + */ + private Long orderInvoiceId; + + /** + * 买家备注 + */ + private String remarks; + + /** + * 卖家备注 + */ + private String shopRemarks; + + /** + * 订单状态 1:待付款 2:待发货(待自提) 3:待收货(已发货) 5:成功 6:失败 7:待成团 + */ + private Integer status; + + /** + * 支付方式 请参考枚举PayType + */ + private Integer payType; + + /** + * 配送类型 1:快递 2:自提 3:无需快递 4同城配送 + */ + private Integer deliveryType; + + /** + * 订单类型1团购订单 2秒杀订单 3积分订单 + */ + private Integer orderType; + + /** + * 订单关闭原因 1-超时未支付 2-退款关闭 4-买家取消 15-已通过货到付款交易 + */ + private Integer closeType; + + /** + * 订单商品总数 + */ + private Integer allCount; + + /** + * 付款时间 + */ + private Date payTime; + + /** + * 发货时间 + */ + private Date deliveryTime; + + /** + * 完成时间 + */ + private Date finallyTime; + + /** + * 结算时间 + */ + private Date settledTime; + + /** + * 取消时间 + */ + private Date cancelTime; + + /** + * 预售发货时间 + */ + private Date bookTime; + + /** + * 是否已支付,1.已支付0.未支付 + */ + private Integer isPayed; + + /** + * 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除 + */ + private Integer deleteStatus; + + /** + * 订单退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败) + */ + private Integer refundStatus; + + /** + * 订单运费 + */ + private Long freightAmount; + + /** + * 积分抵扣金额 + */ + private Long scoreAmount; + + /** + * 会员折扣金额 + */ + private Long memberAmount; + + /** + * 平台优惠券优惠金额 + */ + private Long platformCouponAmount; + + /** + * 商家优惠券优惠金额 + */ + private Long shopCouponAmount; + + /** + * 满减优惠金额 + */ + private Long discountAmount; + + /** + * 分销佣金 + */ + private Long distributionAmount; + /** + * 平台优惠金额 + */ + private Long platformAmount; + + /** + * 运费减免金额 + */ + private Long freeFreightAmount; + + /** + * 平台运费减免金额 + */ + private Long platformFreeFreightAmount; + + /** + * 店铺改价优惠金额 + */ + private Long shopChangeFreeAmount; + + /** + * 优惠总额 + */ + private Long reduceAmount; + + /** + * 平台佣金 + */ + private Long platformCommission; + + /** + * 是否已经进行结算 + */ + private Integer isSettled; + + /** + * 订单项 + */ + private List orderItems; + + /** + * 订单地址 + */ + private OrderAddr orderAddr; + + /** + * 收货人姓名 + */ + private String consignee; + + /** + * 收货人手机号 + */ + private String mobile; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 供应商商品发货方式 1.供应商发货 2.仓库发货 + */ + private Integer supplierDeliveryType; + /** + * 是否待采购 1.是 0.否 2.采购完成 + */ + private Integer waitPurchase; + /** + * 商家采购价差(需要商家从结算金额补上采购价的金额) + */ + private Long purchaseSpreadAmount; + /** + * 预售类型 -1.未开启预售 0.全款预售类型 1.定金预售 + */ + private Integer preSaleType; + /** + * 是否为虚拟商品订单 1.是 0.否 + */ + private Integer orderMold; + /** + * 预售信息 + */ + private OrderPreSaleInfo orderPreSaleInfo; + + /** + * 套餐优惠金额 + */ + private Long shopComboAmount; + + /** + * 核销次数 -1.多次核销 0.无需核销 1.单次核销 + */ + private Integer writeOffNum; + + /** + * 多次核销次数 -1.无限次 + */ + private Integer writeOffMultipleCount; + + /** + * 核销开始时间 + */ + private Date writeOffStart; + + /** + * 核销结束时间 + */ + private Date writeOffEnd; + + /** + * 订单核销状态 0.待核销 1.核销完成 + */ + private Integer writeOffStatus; + + /** + * 订单被核销次数 + */ + private Integer writeOffCount; + + /** + * 主单号,在组合商品拆单时会存在 + */ + private Long mainOrderId; + + public Long getMainOrderId() { + return mainOrderId; + } + + public void setMainOrderId(Long mainOrderId) { + this.mainOrderId = mainOrderId; + } + + public Integer getWriteOffCount() { + return writeOffCount; + } + + public void setWriteOffCount(Integer writeOffCount) { + this.writeOffCount = writeOffCount; + } + + public Integer getWriteOffStatus() { + return writeOffStatus; + } + + public void setWriteOffStatus(Integer writeOffStatus) { + this.writeOffStatus = writeOffStatus; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public Long getShopComboAmount() { + return shopComboAmount; + } + + public void setShopComboAmount(Long shopComboAmount) { + this.shopComboAmount = shopComboAmount; + } + + public OrderPreSaleInfo getOrderPreSaleInfo() { + return orderPreSaleInfo; + } + + public void setOrderPreSaleInfo(OrderPreSaleInfo orderPreSaleInfo) { + this.orderPreSaleInfo = orderPreSaleInfo; + } + + + public Integer getOrderMold() { + return orderMold; + } + + public void setOrderMold(Integer orderMold) { + this.orderMold = orderMold; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Long getPurchaseSpreadAmount() { + return purchaseSpreadAmount; + } + + public void setPurchaseSpreadAmount(Long purchaseSpreadAmount) { + this.purchaseSpreadAmount = purchaseSpreadAmount; + } + + public Integer getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Integer waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderAddrId() { + return orderAddrId; + } + + public void setOrderAddrId(Long orderAddrId) { + this.orderAddrId = orderAddrId; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public String getRemarks() { + return remarks; + } + + public Long getOrderInvoiceId() { + return orderInvoiceId; + } + + public void setOrderInvoiceId(Long orderInvoiceId) { + this.orderInvoiceId = orderInvoiceId; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getShopRemarks() { + return shopRemarks; + } + + public void setShopRemarks(String shopRemarks) { + this.shopRemarks = shopRemarks; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getFinallyTime() { + return finallyTime; + } + + public void setFinallyTime(Date finallyTime) { + this.finallyTime = finallyTime; + } + + public Date getCancelTime() { + return cancelTime; + } + + public void setCancelTime(Date cancelTime) { + this.cancelTime = cancelTime; + } + + public Date getBookTime() { + return bookTime; + } + + public void setBookTime(Date bookTime) { + this.bookTime = bookTime; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Integer getDeleteStatus() { + return deleteStatus; + } + + public void setDeleteStatus(Integer deleteStatus) { + this.deleteStatus = deleteStatus; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Long getScoreAmount() { + return scoreAmount; + } + + public void setScoreAmount(Long scoreAmount) { + this.scoreAmount = scoreAmount; + } + + public Long getMemberAmount() { + return memberAmount; + } + + public void setMemberAmount(Long memberAmount) { + this.memberAmount = memberAmount; + } + + public Long getPlatformCouponAmount() { + return platformCouponAmount; + } + + public void setPlatformCouponAmount(Long platformCouponAmount) { + this.platformCouponAmount = platformCouponAmount; + } + + public Long getShopCouponAmount() { + return shopCouponAmount; + } + + public void setShopCouponAmount(Long shopCouponAmount) { + this.shopCouponAmount = shopCouponAmount; + } + + public Long getDiscountAmount() { + return discountAmount; + } + + public void setDiscountAmount(Long discountAmount) { + this.discountAmount = discountAmount; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public Long getShopChangeFreeAmount() { + return shopChangeFreeAmount; + } + + public void setShopChangeFreeAmount(Long shopChangeFreeAmount) { + this.shopChangeFreeAmount = shopChangeFreeAmount; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + public OrderAddr getOrderAddr() { + return orderAddr; + } + + public void setOrderAddr(OrderAddr orderAddr) { + this.orderAddr = orderAddr; + } + + public Integer getIsSettled() { + return isSettled; + } + + public void setIsSettled(Integer isSettled) { + this.isSettled = isSettled; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Date getSettledTime() { + return settledTime; + } + + public void setSettledTime(Date settledTime) { + this.settledTime = settledTime; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "Order{" + + "orderId=" + orderId + + ", shopId=" + shopId + + ", userId=" + userId + + ", orderAddrId=" + orderAddrId + + ", paySysType=" + paySysType + + ", shopName='" + shopName + '\'' + + ", total=" + total + + ", actualTotal=" + actualTotal + + ", orderScore=" + orderScore + + ", orderInvoiceId=" + orderInvoiceId + + ", remarks='" + remarks + '\'' + + ", shopRemarks='" + shopRemarks + '\'' + + ", status=" + status + + ", payType=" + payType + + ", deliveryType=" + deliveryType + + ", orderType=" + orderType + + ", closeType=" + closeType + + ", allCount=" + allCount + + ", payTime=" + payTime + + ", deliveryTime=" + deliveryTime + + ", finallyTime=" + finallyTime + + ", settledTime=" + settledTime + + ", cancelTime=" + cancelTime + + ", bookTime=" + bookTime + + ", isPayed=" + isPayed + + ", deleteStatus=" + deleteStatus + + ", refundStatus=" + refundStatus + + ", freightAmount=" + freightAmount + + ", scoreAmount=" + scoreAmount + + ", memberAmount=" + memberAmount + + ", platformCouponAmount=" + platformCouponAmount + + ", shopCouponAmount=" + shopCouponAmount + + ", discountAmount=" + discountAmount + + ", distributionAmount=" + distributionAmount + + ", platformAmount=" + platformAmount + + ", freeFreightAmount=" + freeFreightAmount + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", shopChangeFreeAmount=" + shopChangeFreeAmount + + ", reduceAmount=" + reduceAmount + + ", platformCommission=" + platformCommission + + ", isSettled=" + isSettled + + ", orderItems=" + orderItems + + ", orderAddr=" + orderAddr + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", supplierId=" + supplierId + + ", supplierDeliveryType=" + supplierDeliveryType + + ", waitPurchase=" + waitPurchase + + ", purchaseSpreadAmount=" + purchaseSpreadAmount + + ", preSaleType=" + preSaleType + + ", orderMold=" + orderMold + + ", orderPreSaleInfo=" + orderPreSaleInfo + + ", shopComboAmount=" + shopComboAmount + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", writeOffStatus=" + writeOffStatus + + ", writeOffCount=" + writeOffCount + + ", mainOrderId=" + mainOrderId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderInvoice.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderInvoice.java new file mode 100644 index 0000000..e20ce59 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderInvoice.java @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author Pineapple + * @date 2021/8/2 8:52 + */ +public class OrderInvoice extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单发票ID + */ + private Long orderInvoiceId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 发票类型 1.电子普通发票 + */ + private Integer invoiceType; + + /** + * 抬头类型 1.单位 2.个人 + */ + private Integer headerType; + + /** + * 抬头名称 + */ + private String headerName; + + /** + * 发票税号 + */ + private String invoiceTaxNumber; + + /** + * 发票内容 1.商品明细 + */ + private Integer invoiceContext; + + /** + * 发票状态 1.申请中 2.已开票 + */ + private Integer invoiceState; + + /** + * 文件id + */ + private Long fileId; + + /** + * 申请时间 + */ + private Date applicationTime; + + /** + * 上传时间 + */ + private Date uploadTime; + + private Integer orderStatus; + + public Long getOrderInvoiceId() { + return orderInvoiceId; + } + + public void setOrderInvoiceId(Long orderInvoiceId) { + this.orderInvoiceId = orderInvoiceId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getInvoiceType() { + return invoiceType; + } + + public void setInvoiceType(Integer invoiceType) { + this.invoiceType = invoiceType; + } + + public Integer getHeaderType() { + return headerType; + } + + public void setHeaderType(Integer headerType) { + this.headerType = headerType; + } + + public String getHeaderName() { + return headerName; + } + + public void setHeaderName(String headerName) { + this.headerName = headerName; + } + + public String getInvoiceTaxNumber() { + return invoiceTaxNumber; + } + + public void setInvoiceTaxNumber(String invoiceTaxNumber) { + this.invoiceTaxNumber = invoiceTaxNumber; + } + + public Integer getInvoiceContext() { + return invoiceContext; + } + + public void setInvoiceContext(Integer invoiceContext) { + this.invoiceContext = invoiceContext; + } + + public Integer getInvoiceState() { + return invoiceState; + } + + public void setInvoiceState(Integer invoiceState) { + this.invoiceState = invoiceState; + } + + public Long getFileId() { + return fileId; + } + + public void setFileId(Long fileId) { + this.fileId = fileId; + } + + public Date getApplicationTime() { + return applicationTime; + } + + public void setApplicationTime(Date applicationTime) { + this.applicationTime = applicationTime; + } + + public Date getUploadTime() { + return uploadTime; + } + + public void setUploadTime(Date uploadTime) { + this.uploadTime = uploadTime; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + @Override + public String toString() { + return "OrderInvoice{" + + "orderInvoiceId=" + orderInvoiceId + + ", orderId=" + orderId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", invoiceType=" + invoiceType + + ", headerType=" + headerType + + ", headerName='" + headerName + '\'' + + ", invoiceTaxNumber='" + invoiceTaxNumber + '\'' + + ", invoiceContext=" + invoiceContext + + ", invoiceState=" + invoiceState + + ", fileId=" + fileId + + ", applicationTime=" + applicationTime + + ", uploadTime=" + uploadTime + + ", orderStatus=" + orderStatus + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderItemLang.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderItemLang.java new file mode 100644 index 0000000..39dda5a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderItemLang.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 订单项-国际化 + * + * @author YXF + * @date 2021-05-17 10:26:54 + */ +public class OrderItemLang extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单项ID + */ + private Long orderItemId; + + /** + * 语言 1.中文 2.英文 + */ + private Integer lang; + + /** + * 商品名称 + */ + private String spuName; + + /** + * sku名称 + */ + private String skuName; + + /** + * 供应商spu名称 + */ + private String supplierSpuName; + + /** + * 供应商sku名称 + */ + private String supplierSkuName; + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public String getSupplierSkuName() { + return supplierSkuName; + } + + public void setSupplierSkuName(String supplierSkuName) { + this.supplierSkuName = supplierSkuName; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + @Override + public String toString() { + return "OrderItemLang{" + + "orderItemId=" + orderItemId + + ", lang=" + lang + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", supplierSpuName='" + supplierSpuName + '\'' + + ", supplierSkuName='" + supplierSkuName + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderPreSaleInfo.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderPreSaleInfo.java new file mode 100644 index 0000000..bc1fb5c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderPreSaleInfo.java @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单预售信息 + * + * @author lhd + * @date 2022-08-17 16:36:47 + */ +public class OrderPreSaleInfo extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long orderPreSaleInfoId; + + /** + * 订单编号 + */ + private Long orderId; + + /** + * 用户id + */ + private Long userId; + + /** + * 定金金额 + */ + private Long depositAmount; + + /** + * 定金优惠金额 + */ + private Long depositReduceAmount; + + /** + * 定金膨胀金额 + */ + private Long depositExpansionAmount; + /** + * 预售类型 -1.未开启预售 0.全款预售类型 1.定金预售 + */ + private Integer preSaleType; + /** + * 尾款金额 + */ + private Long balanceAmount; + + /** + * 尾款支付开始时间 + */ + private Date balanceStartTime; + + /** + * 尾款支付结束时间 + */ + private Date balanceEndTime; + /** + * 尾款支付时间 + */ + private Date balancePayTime; + /** + * 定金预售支付状态 1.已支付定金 2.已支付尾款 + */ + private Integer payStatus; + + /** + * 预售发货类型 -1.固定时间 x.尾款支付后x天发货 + */ + private Integer preSaleDeliveryType; + + /** + * 预售发货时间 + */ + private Date preSaleDeliveryTime; + + public Long getDepositReduceAmount() { + return depositReduceAmount; + } + + public void setDepositReduceAmount(Long depositReduceAmount) { + this.depositReduceAmount = depositReduceAmount; + } + + public Integer getPayStatus() { + return payStatus; + } + + public void setPayStatus(Integer payStatus) { + this.payStatus = payStatus; + } + + public Date getBalancePayTime() { + return balancePayTime; + } + + public void setBalancePayTime(Date balancePayTime) { + this.balancePayTime = balancePayTime; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Long getOrderPreSaleInfoId() { + return orderPreSaleInfoId; + } + + public void setOrderPreSaleInfoId(Long orderPreSaleInfoId) { + this.orderPreSaleInfoId = orderPreSaleInfoId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Long getDepositExpansionAmount() { + return depositExpansionAmount; + } + + public void setDepositExpansionAmount(Long depositExpansionAmount) { + this.depositExpansionAmount = depositExpansionAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Date getBalanceStartTime() { + return balanceStartTime; + } + + public void setBalanceStartTime(Date balanceStartTime) { + this.balanceStartTime = balanceStartTime; + } + + public Date getBalanceEndTime() { + return balanceEndTime; + } + + public void setBalanceEndTime(Date balanceEndTime) { + this.balanceEndTime = balanceEndTime; + } + + public Integer getPreSaleDeliveryType() { + return preSaleDeliveryType; + } + + public void setPreSaleDeliveryType(Integer preSaleDeliveryType) { + this.preSaleDeliveryType = preSaleDeliveryType; + } + + public Date getPreSaleDeliveryTime() { + return preSaleDeliveryTime; + } + + public void setPreSaleDeliveryTime(Date preSaleDeliveryTime) { + this.preSaleDeliveryTime = preSaleDeliveryTime; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "OrderPreSaleInfo{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", orderPreSaleInfoId=" + orderPreSaleInfoId + + ", orderId=" + orderId + + ", userId=" + userId + + ", depositAmount=" + depositAmount + + ", depositReduceAmount=" + depositReduceAmount + + ", depositExpansionAmount=" + depositExpansionAmount + + ", preSaleType=" + preSaleType + + ", balanceAmount=" + balanceAmount + + ", balanceStartTime=" + balanceStartTime + + ", balanceEndTime=" + balanceEndTime + + ", balancePayTime=" + balancePayTime + + ", payStatus=" + payStatus + + ", preSaleDeliveryType=" + preSaleDeliveryType + + ", preSaleDeliveryTime=" + preSaleDeliveryTime + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderRefundAddr.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderRefundAddr.java new file mode 100644 index 0000000..0a4c9a3 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderRefundAddr.java @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户退货物流地址 + * + * @author FrozenWatermelon + * @date 2021-03-09 13:44:31 + */ +public class OrderRefundAddr extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 物流ID + */ + private Long refundAddrId; + + /** + * 店铺ID + */ + private Long shopId; + + /** + * 退款号 + */ + private Long refundId; + + /** + * 买家ID + */ + private Long userId; + + /** + * 物流公司ID + */ + private Long deliveryCompanyId; + + /** + * 物流公司名称 + */ + private String deliveryName; + + /** + * 物流单号 + */ + private String deliveryNo; + + /** + * 收件人姓名 + */ + private String consigneeName; + + /** + * 收件人电话(顺丰快递需要) + */ + private String consigneeMobile; + + /** + * 收件人座机 + */ + private String consigneeTelephone; + + /** + * 收件人邮政编码 + */ + private String consigneePostCode; + + /** + * 收件人地址 + */ + private String consigneeAddr; + + /** + * 发送人手机号码 + */ + private String senderMobile; + + /** + * 买家备注 + */ + private String senderRemarks; + + /** + * 图片凭证 + */ + private String imgs; + + public Long getRefundAddrId() { + return refundAddrId; + } + + public void setRefundAddrId(Long refundAddrId) { + this.refundAddrId = refundAddrId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getDeliveryCompanyId() { + return deliveryCompanyId; + } + + public void setDeliveryCompanyId(Long deliveryCompanyId) { + this.deliveryCompanyId = deliveryCompanyId; + } + + public String getDeliveryName() { + return deliveryName; + } + + public void setDeliveryName(String deliveryName) { + this.deliveryName = deliveryName; + } + + public String getDeliveryNo() { + return deliveryNo; + } + + public void setDeliveryNo(String deliveryNo) { + this.deliveryNo = deliveryNo; + } + + public String getConsigneeName() { + return consigneeName; + } + + public void setConsigneeName(String consigneeName) { + this.consigneeName = consigneeName; + } + + public String getConsigneeMobile() { + return consigneeMobile; + } + + public void setConsigneeMobile(String consigneeMobile) { + this.consigneeMobile = consigneeMobile; + } + + public String getConsigneeTelephone() { + return consigneeTelephone; + } + + public void setConsigneeTelephone(String consigneeTelephone) { + this.consigneeTelephone = consigneeTelephone; + } + + public String getConsigneePostCode() { + return consigneePostCode; + } + + public void setConsigneePostCode(String consigneePostCode) { + this.consigneePostCode = consigneePostCode; + } + + public String getConsigneeAddr() { + return consigneeAddr; + } + + public void setConsigneeAddr(String consigneeAddr) { + this.consigneeAddr = consigneeAddr; + } + + public String getSenderMobile() { + return senderMobile; + } + + public void setSenderMobile(String senderMobile) { + this.senderMobile = senderMobile; + } + + public String getSenderRemarks() { + return senderRemarks; + } + + public void setSenderRemarks(String senderRemarks) { + this.senderRemarks = senderRemarks; + } + + public String getImgs() { + return imgs; + } + + public void setImgs(String imgs) { + this.imgs = imgs; + } + + @Override + public String toString() { + return "OrderRefundAddr{" + + "refundAddrId=" + refundAddrId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",shopId=" + shopId + + ",refundId=" + refundId + + ",userId=" + userId + + ",deliveryCompanyId=" + deliveryCompanyId + + ",deliveryName=" + deliveryName + + ",deliveryNo=" + deliveryNo + + ",consigneeName=" + consigneeName + + ",consigneeMobile=" + consigneeMobile + + ",consigneeTelephone=" + consigneeTelephone + + ",consigneePostCode=" + consigneePostCode + + ",consigneeAddr=" + consigneeAddr + + ",senderMobile=" + senderMobile + + ",senderRemarks=" + senderRemarks + + ",imgs=" + imgs + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderSelfStation.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderSelfStation.java new file mode 100644 index 0000000..8a4a711 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderSelfStation.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 自提订单自提点信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderSelfStation extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long orderSelfStationId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 订单编号 + */ + private Long orderId; + + /** + * 自提点id + */ + private Long stationId; + + /** + * 自提人的手机 + */ + private String stationUserMobile; + + /** + * 自提人的名字 + */ + private String stationUserName; + + /** + * 自提时间(用户下单时选择) + */ + private String stationTime; + + /** + * 自提提货码 + */ + private String stationCode; + + /** + * 上门自提点的地址 + */ + private String stationAddress; + + /** + * 上门自提点的联系电话 + */ + private String stationPhone; + + /** + * 用户id + */ + private Long userId; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderSelfStationId() { + return orderSelfStationId; + } + + public void setOrderSelfStationId(Long orderSelfStationId) { + this.orderSelfStationId = orderSelfStationId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getStationUserMobile() { + return stationUserMobile; + } + + public void setStationUserMobile(String stationUserMobile) { + this.stationUserMobile = stationUserMobile; + } + + public String getStationUserName() { + return stationUserName; + } + + public void setStationUserName(String stationUserName) { + this.stationUserName = stationUserName; + } + + public String getStationTime() { + return stationTime; + } + + public void setStationTime(String stationTime) { + this.stationTime = stationTime; + } + + public String getStationCode() { + return stationCode; + } + + public void setStationCode(String stationCode) { + this.stationCode = stationCode; + } + + public String getStationAddress() { + return stationAddress; + } + + public void setStationAddress(String stationAddress) { + this.stationAddress = stationAddress; + } + + public String getStationPhone() { + return stationPhone; + } + + public void setStationPhone(String stationPhone) { + this.stationPhone = stationPhone; + } + + @Override + public String toString() { + return "OrderSelfStation{" + + "orderSelfStationId=" + orderSelfStationId + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", stationId=" + stationId + + ", stationUserMobile='" + stationUserMobile + '\'' + + ", stationUserName='" + stationUserName + '\'' + + ", stationTime='" + stationTime + '\'' + + ", stationCode='" + stationCode + '\'' + + ", stationAddress='" + stationAddress + '\'' + + ", stationPhone='" + stationPhone + '\'' + + ", userId=" + userId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrder.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrder.java new file mode 100644 index 0000000..babd3df --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrder.java @@ -0,0 +1,269 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 采购订单 + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public class PurchaseOrder extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 采购id + */ + private Long purchaseOrderId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 送达时间 + */ + private Date deliverTime; + + /** + * 发货时间 + */ + private Date deliveryTime; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 总采购金额 + */ + private Double totalAmount; + + /** + * 总采购库存数量 + */ + private Integer totalStock; + + /** + * 实际总库存数量 + */ + private Integer actualTotalStock; + + /** + * 状态 0:已作废 1:待入库 2:已发货 3:部分入库 4:待付款 5:已完成 + */ + private Integer status; + + /** + * 备注 + */ + private String remark; + + /** + * 操作员工id + */ + private Long employeeId; + + /** + * 配送类型 1:快递 2:自提 3:无需快递 4同城配送 + */ + private Integer deliveryType; + + /** + * 采购订单地址 + */ + private Long purchaseOrderAddrId; + + /** + * 付款凭证图片 多个图片逗号分隔 + */ + private String voucherImgUrls; + + /** + * 仓库id + */ + private Long warehouseId; + + /** + * 供应商仓库id + */ + private Long supplierWarehouseId; + + /** + * 库存点类型 + */ + private Integer stockPointType; + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Long getPurchaseOrderAddrId() { + return purchaseOrderAddrId; + } + + public void setPurchaseOrderAddrId(Long purchaseOrderAddrId) { + this.purchaseOrderAddrId = purchaseOrderAddrId; + } + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getDeliverTime() { + return deliverTime; + } + + public void setDeliverTime(Date deliverTime) { + this.deliverTime = deliverTime; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Double getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Double totalAmount) { + this.totalAmount = totalAmount; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getActualTotalStock() { + return actualTotalStock; + } + + public void setActualTotalStock(Integer actualTotalStock) { + this.actualTotalStock = actualTotalStock; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public String getVoucherImgUrls() { + return voucherImgUrls; + } + + public void setVoucherImgUrls(String voucherImgUrls) { + this.voucherImgUrls = voucherImgUrls; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Long getSupplierWarehouseId() { + return supplierWarehouseId; + } + + public void setSupplierWarehouseId(Long supplierWarehouseId) { + this.supplierWarehouseId = supplierWarehouseId; + } + + @Override + public String toString() { + return "PurchaseOrder{" + + "purchaseOrderId=" + purchaseOrderId + + ", shopId=" + shopId + + ", deliverTime=" + deliverTime + + ", deliveryTime=" + deliveryTime + + ", supplierId=" + supplierId + + ", totalAmount=" + totalAmount + + ", totalStock=" + totalStock + + ", actualTotalStock=" + actualTotalStock + + ", status=" + status + + ", remark='" + remark + '\'' + + ", employeeId=" + employeeId + + ", deliveryType=" + deliveryType + + ", purchaseOrderAddrId=" + purchaseOrderAddrId + + ", voucherImgUrls='" + voucherImgUrls + '\'' + + ", warehouseId=" + warehouseId + + ", stockPointType=" + stockPointType + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrderItem.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrderItem.java new file mode 100644 index 0000000..229e731 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrderItem.java @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 采购商品 + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public class PurchaseOrderItem extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long purchaseItemId; + + /** + * 采购订单号 + */ + private Long purchaseOrderId; + + /** + * 商品id + */ + private Long spuId; + + /** + * sku id + */ + private Long skuId; + + /** + * 采购金额 + */ + private Long purchaseAmount; + + /** + * 采购价 + */ + private Long purchasePrice; + + /** + * 采购库存数量 + */ + private Integer purchaseStock; + + /** + * 实际库存数量 + */ + private Integer actualStock; + /** + * 实际库存数量 + */ + private Integer deliveryType; + + /** + * 状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成 + */ + private Integer status; + + /** + * 商品编码 + */ + private String spuCode; + /** + * sku编码 + */ + private String partyCode; + + /** + * 商品图片 + */ + private String pic; + /** + * 待发货数量 + */ + private Integer beDeliveredNum; + + @Schema(description = "spu名称列表") + private List purchaseOrderItemLangList; + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Integer getBeDeliveredNum() { + return beDeliveredNum; + } + + public void setBeDeliveredNum(Integer beDeliveredNum) { + this.beDeliveredNum = beDeliveredNum; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public List getPurchaseOrderItemLangList() { + return purchaseOrderItemLangList; + } + + public void setPurchaseOrderItemLangList(List purchaseOrderItemLangList) { + this.purchaseOrderItemLangList = purchaseOrderItemLangList; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Long getPurchaseItemId() { + return purchaseItemId; + } + + public void setPurchaseItemId(Long purchaseItemId) { + this.purchaseItemId = purchaseItemId; + } + + public Long getSpuId() { + return spuId; + } + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getPurchaseAmount() { + return purchaseAmount; + } + + public void setPurchaseAmount(Long purchaseAmount) { + this.purchaseAmount = purchaseAmount; + } + + public Long getPurchasePrice() { + return purchasePrice; + } + + public void setPurchasePrice(Long purchasePrice) { + this.purchasePrice = purchasePrice; + } + + public Integer getPurchaseStock() { + return purchaseStock; + } + + public void setPurchaseStock(Integer purchaseStock) { + this.purchaseStock = purchaseStock; + } + + public Integer getActualStock() { + return actualStock; + } + + public void setActualStock(Integer actualStock) { + this.actualStock = actualStock; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "PurchaseOrderItem{" + + "purchaseItemId=" + purchaseItemId + + ", purchaseOrderId=" + purchaseOrderId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", purchaseAmount=" + purchaseAmount + + ", purchasePrice=" + purchasePrice + + ", purchaseStock=" + purchaseStock + + ", actualStock=" + actualStock + + ", deliveryType=" + deliveryType + + ", status=" + status + + ", spuCode='" + spuCode + '\'' + + ", partyCode='" + partyCode + '\'' + + ", pic='" + pic + '\'' + + ", beDeliveredNum=" + beDeliveredNum + + ", purchaseOrderItemLangList=" + purchaseOrderItemLangList + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/AllotOrderService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/AllotOrderService.java new file mode 100644 index 0000000..75aebca --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/AllotOrderService.java @@ -0,0 +1,101 @@ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.api.order.bo.EsAllotOrderBO; +import com.tmerclub.cloud.order.dto.AllotOrderDTO; +import com.tmerclub.cloud.order.vo.AllotOrderVO; +import com.tmerclub.cloud.order.vo.AllotSpuImportVO; +import com.tmerclub.cloud.order.vo.AllotSpuInboundImportVO; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.multipart.MultipartFile; + +/** + * @author gaozijie + * @date 2023-11-20 + */ +public interface AllotOrderService { + + /** + * 获取调拨订单详情 + * @param allotOrderDTO 调拨订单dto + * @return 调拨订单详情 + */ + AllotOrderVO getAllotOrder(AllotOrderDTO allotOrderDTO); + + /** + * 新增调拨订单 + * @param allotOrderDTO 调拨订单dto + */ + void addAllotOrder(AllotOrderDTO allotOrderDTO); + + /** + * 更新调拨订单 + * @param allotOrderDTO 调拨订单dto + */ + void updateAllotOrder(AllotOrderDTO allotOrderDTO); + + /** + * 调拨商品入库 + * @param allotOrderDTO 调拨订单dto + */ + void inbound(AllotOrderDTO allotOrderDTO); + + /** + * 完成调拨订单 + * @param allotOrderDTO 调拨订单dto + */ + void completeOrder(AllotOrderDTO allotOrderDTO); + + /** + * 作废调拨订单 + * @param allotOrderDTO 调拨订单dto + */ + void nullifyOrder(AllotOrderDTO allotOrderDTO); + + /** + * 作废调拨订单(通过仓库Id) + * @param warehouseId 仓库id + */ + void nullifyOrderByWarehouseId(Long warehouseId); + + /** + * 保存mongo数据并获取es数据 + * @param allotOrderId 调拨订单id + */ + EsAllotOrderBO saveMongoAndGetEsInfo(Long allotOrderId); + + /** + * 下载商品导入模板 + * @param response 响应 + */ + void downloadModel(HttpServletResponse response); + + /** + * 解析excel文件 + * @param excelFile excel文件 + * @param allotOrderDTO 调拨订单dto + * @return excel解析后数据 + */ + AllotSpuImportVO parseFile(MultipartFile excelFile, AllotOrderDTO allotOrderDTO); + + /** + * 下载商品入库导入模板 + * @param response 响应 + * @param allotOrderDTO 调拨订单dto + */ + void downloadInboundModel(HttpServletResponse response, AllotOrderDTO allotOrderDTO); + + /** + * 解析入库excel文件 + * @param excelFile excel文件 + * @param allotOrderDTO 调拨订单dto + * @return excel解析后的数据 + */ + AllotSpuInboundImportVO parseInboundFile(MultipartFile excelFile, AllotOrderDTO allotOrderDTO); + + /** + * 统计未完成的调拨订单数量 + * @param warehouseId 仓库id + * @return 未完成数 + */ + Long countUnFinish(Long warehouseId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderAddrService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderAddrService.java new file mode 100644 index 0000000..892ca6b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderAddrService.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.OrderAddrVO; +import com.tmerclub.cloud.order.model.OrderAddr; + +/** + * 用户订单配送地址 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderAddrService { + + /** + * 分页获取用户订单配送地址列表 + * @param pageDTO 分页参数 + * @return 用户订单配送地址列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据用户订单配送地址id获取用户订单配送地址 + * + * @param orderAddrId 用户订单配送地址id + * @return 用户订单配送地址 + */ + OrderAddr getById(Long orderAddrId); + + /** + * 保存用户订单配送地址 + * @param orderAddr 用户订单配送地址 + */ + void save(OrderAddr orderAddr); + + /** + * 更新用户订单配送地址 + * @param orderAddr 用户订单配送地址 + */ + void update(OrderAddr orderAddr); + + /** + * 根据用户订单配送地址id删除用户订单配送地址 + * @param orderAddrId + */ + void deleteById(Long orderAddrId); + + /** + * 根据订单id获取订单地址 + * @param orderId + * @return + */ + OrderAddrVO getByOrderId(Long orderId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderAllinpayService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderAllinpayService.java new file mode 100644 index 0000000..79f3e02 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderAllinpayService.java @@ -0,0 +1,18 @@ +package com.tmerclub.cloud.order.service; + +/** + * @author TRACK + */ +public interface OrderAllinpayService { + + /** + * 获取通联支付是否开启 + * @return + */ + boolean getIsAllinpay(); + + /** + * 删除通联支付缓存 + */ + void deleteAllinpayCache(); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderAnalysisService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderAnalysisService.java new file mode 100644 index 0000000..3bbb5bf --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderAnalysisService.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + + +import com.tmerclub.cloud.api.order.dto.CustomerRetainedDTO; +import com.tmerclub.cloud.api.order.vo.CustomerRetainVO; + +import java.util.List; + +/** + * 订单分析 + * + * @author cl + * @date 2021-05-25 09:13:02 + */ +public interface OrderAnalysisService { + + /** + * 获取用户的成交留存率 + * @param customerRetainedDTO 条件查询参数 + * @return 成交留存信息列表 + */ + List getTradeRetained(CustomerRetainedDTO customerRetainedDTO); + + + /** + * 清除成交留存率换成 + * @param customerRetainedDTO 参数 + */ + void removeCacheTradeRetained(CustomerRetainedDTO customerRetainedDTO); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderInvoiceService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderInvoiceService.java new file mode 100644 index 0000000..c320b23 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderInvoiceService.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.order.model.OrderInvoice; +import com.tmerclub.cloud.order.vo.OrderInvoiceVO; + +import java.util.List; + +/** + * @author Pineapple + * @date 2021/8/2 8:57 + */ + +public interface OrderInvoiceService { + + + /** + * 根据id获取 + * + * @param orderInvoiceId id + * @return + */ + OrderInvoice getByOrderInvoiceId(Long orderInvoiceId); + + /** + * 保存 + * @param orderInvoice + * @param userId + */ + void save(Long userId, OrderInvoice orderInvoice); + + /** + * 批量保存 + * @param orderInvoices + * @param userId + */ + void saveBatch(List orderInvoices); + + /** + * 更新 + * @param orderInvoice + */ + void update(OrderInvoice orderInvoice); + + /** + * 根据id删除 + * @param orderInvoiceId id + */ + void deleteById(Long orderInvoiceId); + + /** + * 根据订单发票id获取,app端使用 + * @param orderInvoiceId 订单发票id + * @return 信息 + */ + OrderInvoiceVO getById(Long orderInvoiceId); + + /** + * 根据订单id获取发票id + * @param orderId 订单id + * @return + */ + Long getByOrderId(Long orderId, Long shopId, Long supplierId); + + /** + * 该订单是否已经开具发票 + * @param orderId + * @return + */ + boolean isUpload(Long orderId, Long shopId, Long supplierId); + + /** + * 批量删除 + * @param orderIds 被取消的订单id + */ + void deleteBatch(List orderIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderItemLangService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderItemLangService.java new file mode 100644 index 0000000..5342603 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderItemLangService.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.OrderItemLangVO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.order.model.OrderItem; +import com.tmerclub.cloud.order.model.OrderItemLang; + +import java.util.List; + +/** + * 订单项-国际化 + * + * @author YXF + * @date 2021-05-17 15:26:54 + */ +public interface OrderItemLangService { + + /** + * 分页获取订单项-国际化列表 + * @param pageDTO 分页参数 + * @return 订单项-国际化列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据订单项-国际化id获取订单项-国际化 + * + * @param orderItemId 订单项-国际化id + * @return 订单项-国际化 + */ + OrderItemLang getByOrderItemId(Long orderItemId); + + /** + * 更新订单项-国际化 + * @param orderItemLang 订单项-国际化 + */ + void update(OrderItemLang orderItemLang); + + /** + * 根据订单项-国际化id删除订单项-国际化 + * @param orderItemId 订单项-国际化id + */ + void deleteById(Long orderItemId); + + /** + * 保存订单项语言信息 + * @param orderItems + */ + void saveOrderItemLang(List orderItems); + + /** + * 根据订单项id列表获取订单项国际化信息列表 + * @param orderItemIds + * @return + */ + List listOrderItemLangByIds(List orderItemIds); + + /** + * 根据订单项id列表获取订单项信息列表 + * @param orderItemIds + * @param lang + * @return + */ + List getListByOrderItemId(List orderItemIds, Integer lang); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderItemService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderItemService.java new file mode 100644 index 0000000..fe89a0d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderItemService.java @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.api.order.bo.DistributionAmountWithOrderIdBO; +import com.tmerclub.cloud.api.order.bo.UserScoreLogOrderBO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.bo.EsOrderItemBO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.order.model.OrderItem; +import com.tmerclub.cloud.order.vo.OrderDetailVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单项 + * + * @author FrozenWatermelon + * @date 2020-12-04 11:27:35 + */ +public interface OrderItemService { + + /** + * 分页获取订单项列表 + * + * @param pageDTO 分页参数 + * @return 订单项列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据订单项id获取订单项 + * + * @param orderItemId 订单项id + * @return 订单项 + */ + com.tmerclub.cloud.common.order.vo.OrderItemVO getByOrderItemId(Long orderItemId); + + /** + * 保存订单项 + * + * @param orderItem 订单项 + */ + void save(OrderItem orderItem); + + /** + * 更新订单项 + * + * @param orderItem 订单项 + */ + void update(OrderItem orderItem); + + /** + * 根据订单项id删除订单项 + * + * @param orderItemId + */ + void deleteById(Long orderItemId); + /** + * 根据订单项id删除订单项 + * + * @param orderItemIds + */ + void deleteBatchByIds(List orderItemIds); + + /** + * 根据订单号获取订单项 + * + * @param orderId 订单id + * @return 订单项 + */ + List listOrderItemsByOrderId(Long orderId); + + /** + * 根据订单号获取订单项,不包含赠品 + * + * @param orderId 订单id + * @return 订单项 + */ + List listOrderItemsByOrderIds(Long orderId); + + /** + * 根据订单号获取订单项(包含sku、spu名称) + * + * @param orderId 订单id + * @return 订单项 + */ + List listOrderItemAndLangByOrderId(Long orderId); + + /** + * 批量获取指定订单的订单项(包含sku、spu名称) + * + * @param orderIds 订单id列表 + * @return 订单项 + */ + List listOrderItemAndLangByOrderIds(List orderIds); + + /** + * 计算订单项已结算分销金额 + * + * @param orderIds + * @return + */ + List sumTotalDistributionAmountByOrderIds(List orderIds); + + /** + * 批量保存订单项信息 + * + * @param orderItems + */ + void saveBatch(List orderItems); + + /** + * 批量更新订单项信息 + * + * @param orderItems + */ + void updateBatch(List orderItems); + + /** + * 根据订单id获取商品名称 + * + * @param orderIdList 订单id + * @return 商品名称列表 + */ + List getSpuNameListByOrderIds(long[] orderIdList); + + /** + * 根据订单id获取订单项数量 + * @param orderId + * @return + */ + Integer countByOrderId(@Param("orderId") Long orderId); + + /** + * 根据订单id获取订单项商品数量 + * @param orderId + * @return + */ + Integer sumNumByOrderId(@Param("orderId") Long orderId); + + /** + * 更新订单项发货数量信息 + * + * @param deliveryOrderItems 发货订单项 + * @param deliveryType 发货方式 + * @param orderId + */ + void updateByDeliveries(List deliveryOrderItems, Integer deliveryType, Long orderId); + + /** + * 计算未发货商品数量 + * @param orderId + * @return + */ + int countUnDeliveryNumByOrderId(Long orderId); + + /** + * 减少订单项待发货数量 + * @param orderItemId + * @param count + */ + void reduceUnDeliveryNumByOrderItemId(Long orderItemId, Integer count); + + /** + * 更新订单项退款状态 + * @param orderId + * @param refundStatus + */ + void updateRefundStatusByOrderId(Long orderId, Integer refundStatus); + + /** + * 根据订单id查询订单项、退款详情 + * @param orderId 订单id + * @param refundId 退款单号 + * @return 订单项、退款详情 + */ + OrderDetailVO listDetailByParam(Long orderId, Long refundId); + + /** + * 根据订单项id获取该订单项的商品信息 + * @param orderItemId + * @return + */ + com.tmerclub.cloud.common.order.vo.OrderItemVO getSpuInfoByOrderItemId(Long orderItemId); + + /** + * 根据订单号获取订单项的物流类型 + * @param orderId 订单号 + * @return 物流类型 + */ + boolean getDevTypeByOrderId(Long orderId); + + /** + * 批量修改订单项的分销金额 + * @param message 订单项 + */ + void updateBatchDistributionAmount(List message); + + /** + * 根据订单号获取用户积分订单详情 + * @param orderIds 订单号 + * @return 订单详情 + */ + List getUserScoreLogDetail(List orderIds); + + /** + * 根据赠送主订单项id获取 + * @param userId + * @param giveawayOrderItemId + * @return + */ + List getOrderItemByGiveawayOrderItemId(Long userId, Long giveawayOrderItemId); + + /** + * 根据赠送主订单项id获取 + * @param giveawayOrderItemIds + * @param userId 用户id + * @param sysType notnull:查询赠品订单项 null: 查询订单项 + * @return + */ + List getOrderItemByGiveawayOrderItemIds(List giveawayOrderItemIds, Long userId, Integer sysType); + + /** + * 获取用户指定的订单项列表 + * @param userId + * @param orderIds + * @return + */ + List listOrderItemsByUserIdAndOrderIds(Long userId, List orderIds); + + /** + * 根据ids获取订单项 + * @param itemIds + * @return + */ + List listByIds(List itemIds); + + /** + * 查询指定的订单项及语言数据 + * @param orderItemIds + * @return + */ + List listOrderItemAndLangByOrderItemIds(List orderItemIds); + + /** + * 团购订单拆单订单项处理 + * @param insertOrderItems + */ + void updateByGroupSplit(List insertOrderItems); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderPreSaleInfoService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderPreSaleInfoService.java new file mode 100644 index 0000000..d62e674 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderPreSaleInfoService.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.common.order.vo.OrderPreSaleInfoVO; +import com.tmerclub.cloud.order.model.OrderPreSaleInfo; + +import java.util.Date; +import java.util.List; + +/** + * 订单预售信息 + * + * @author lhd + * @date 2022-08-17 16:36:47 + */ +public interface OrderPreSaleInfoService { + + /** + * 根据订单预售信息id获取订单预售信息 + * + * @param id 订单预售信息id + * @return 订单预售信息 + */ + OrderPreSaleInfoVO getByOrderId(Long id); + + /** + * 根据订单预售信息id获取订单预售信息 + * + * @param orderIds 订单预售信息id + * @return 订单预售信息 + */ + List listByOrderIds(List orderIds); + + /** + * 保存订单预售信息 + * + * @param orderPreSaleInfo 订单预售信息 + * @param createTime + */ + void saveBatch(List orderPreSaleInfo, Date createTime); + + + /** + * 批量更新订单预售信息 + * @param orderPreSaleInfoList 订单预售信息 + */ + void updateBatch(List orderPreSaleInfoList); + + /** + * 预售订单,尾款时间过期未支付时的处理 + * @param orderIds 需要处理的订单id + * @param canalOrderList + */ + void handleBalanceTimeExpireOrder(List orderIds, List canalOrderList); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundInterventionService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundInterventionService.java new file mode 100644 index 0000000..0173cdc --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundInterventionService.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.order.dto.OrderRefundInterventionDTO; + +/** + * 订单退款介入记录信息 + * + * @author FrozenWatermelon + * @date 2023-08-25 10:45:35 + */ +public interface OrderRefundInterventionService { + + /** + * 保存介入凭证 + * @param orderRefundParam + */ + void savePlatormIntervertion(OrderRefundInterventionDTO orderRefundParam); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundSettlementService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundSettlementService.java new file mode 100644 index 0000000..da328de --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundSettlementService.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.order.model.OrderRefundSettlement; +import com.tmerclub.cloud.order.vo.OrderRefundSettlementVO; + +/** + * 退款支付结算单据 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderRefundSettlementService { + + /** + * 分页获取退款支付结算单据列表 + * @param pageDTO 分页参数 + * @return 退款支付结算单据列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据退款支付结算单据id获取退款支付结算单据 + * + * @param settlementId 退款支付结算单据id + * @return 退款支付结算单据 + */ + OrderRefundSettlementVO getBySettlementId(Long settlementId); + + /** + * 保存退款支付结算单据 + * @param orderRefundSettlement 退款支付结算单据 + */ + void save(OrderRefundSettlement orderRefundSettlement); + + /** + * 更新退款支付结算单据 + * @param orderRefundSettlement 退款支付结算单据 + */ + void update(OrderRefundSettlement orderRefundSettlement); + + /** + * 根据退款支付结算单据id删除退款支付结算单据 + * @param settlementId + */ + void deleteById(Long settlementId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderService.java new file mode 100644 index 0000000..1a939f7 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderService.java @@ -0,0 +1,348 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.order.vo.OrderAmountVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.order.bo.SubmitOrderPayAmountInfoBO; +import com.tmerclub.cloud.order.dto.multishop.OrderAdminDTO; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderItem; + +import java.util.List; +import java.util.Map; + +/** + * 订单信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderService { + + /** + * 根据订单信息id获取订单信息 + * + * @param orderId 订单信息id + * @return 订单信息 + */ + Order getByOrderId(Long orderId); + + /** + * 更新订单信息 + * + * @param order 订单信息 + */ + void update(Order order); + + /** + * 根据订单信息id删除订单信息 + * + * @param orderId + */ + void deleteById(Long orderId); + + + /** + * 提交订单 + * + * @param mergerOrder + * @return + */ + void submit(ShopCartOrderMergerVO mergerOrder); + + /** + * 查询订单状态 + * + * @param orderIds 多个订单的订单id + * @return 订单状态列表 + */ + List getOrdersStatus(List orderIds); + + /** + * 计算订单实际金额 + * + * @param orderIds 多个订单的订单id + * @return 订单实际金额总和 + */ + OrderAmountVO getOrdersActualAmount(List orderIds); + + /** + * 将订单改为已支付状态 + * + * @param message 支付成功的订单信息 + * @param ordersStatus + * @param orderIds + */ + List updateByToPaySuccess(PayNotifyBO message, List ordersStatus, List orderIds); + + /** + * 获取订单中的金额信息,不包含退款 + * + * @param orderIds 多个订单的订单id + * @return 订单商家id列表 + */ + List getOrdersSimpleAmountInfo(List orderIds); + + /** + * 取消订单 + * + * @param orderInfo + * @param orderId 订单id + */ + void cancelOrderAndGetCancelOrderIds(ShopCartOrderMergerVO orderInfo, List orderId); + + /** + * 根据订单号和用户id获取订单 + * + * @param orderId orderId + * @param userId userId + * @return Order + */ + Order getOrderByOrderIdAndUserId(Long orderId, Long userId); + + /** + * 根据订单号和自提id获取订单 + * + * @param orderId orderId + * @param stationId stationId + * @return Order + */ + Order getOrderByOrderIdAndStationId(Long orderId, Long stationId); + + /** + * 根据订单号和店铺id获取订单 + * + * @param orderId orderId + * @return Order + */ + OrderVO getOrderByOrderId(Long orderId); + + /** + * 确认收货订单和mq日志要同时落地,所以要事务消息 + * 这里的确认收货,条件加上订单的状态,确保这次更新是幂等的 + * + * @param orderId 订单号 + * @return 是否成功 + */ + int receiptOrder(Long orderId); + + /** + * 根据订单号删除订单 + * + * @param orderId 订单号 + */ + void deleteOrder(Long orderId); + + /** + * 订单物流发货 + * + * @param deliveryOrderParam 发货参数 + */ + void delivery(DeliveryOrderDTO deliveryOrderParam); + + /** + * 改变订单金额 + * + * @param orderAdminDTO + * @param dbOrder + */ + void changeAmount(OrderAdminDTO orderAdminDTO, Order dbOrder); + + /** + * 改变预售订单金额 + * + * @param orderAdminDTO + * @param dbOrder + */ + void changeAmountByPreSale(OrderAdminDTO orderAdminDTO, Order dbOrder); + + /** + * 根据订单id列表获取订单金额信息 + * + * @param orderIdList 订单id列表 + * @return + */ + SubmitOrderPayAmountInfoBO getSubmitOrderPayAmountInfo(long[] orderIdList); + + /** + * 获取订单需要保存到es中的数据 + * + * @param orderId 订单id + * @return + */ + EsOrderBO getEsOrder(Long orderId); + + /** + * 计算订单项的总分销金额 + * + * @param orderItems + * @return + */ + Long sumTotalDistributionAmountByOrderItem(List orderItems); + + /** + * 获取订单和订单项信息 + * + * @param orderId 订单id + * @param shopId 店铺id + * @return + */ + Order getOrderAndOrderItemData(Long orderId, Long shopId); + + /** + * 计算每个订单状态的状态数量 + * + * @param userId 用户id + * @return + */ + OrderCountVO countNumberOfStatus(Long userId); + + /** + * 我的订单分页(用户端) + * 通过商品名称筛选时,使用es查询,否则使用mysql查询 + * + * @param orderSearchDTO + * @return + */ + EsPageVO myOrderPage(OrderSearchDTO orderSearchDTO); + + /** + * 订单管理分页列表 + * + * @param orderSearchDTO + * @return + */ + EsPageVO orderPage(OrderSearchDTO orderSearchDTO); + + /** + * 获取订单的创建状态,给秒杀提供查询是否已经创建订单成功的功能 + * + * @param orderId 订单id + * @return + */ + int countByOrderId(Long orderId); + + /** + * 分页获取某个用户的订单数据 + * + * @param pageDTO + * @param userId + * @return + */ + EsPageVO pageByUserId(PageDTO pageDTO, String userId); + + /** + * 将订单标记为已结算状态 + * + * @param orderIds 订单ids + * @return 变更数量 + */ + int settledOrder(List orderIds); + + /** + * 获取mongodb订单数据 + * + * @param orderId + * @return 订单信息 + */ + EsOrderBO getEsOrderInfo(Long orderId); + + + /** + * 通过订单号获取订单信息 + * + * @param orderId 订单号 + * @return 订单相关信息 + */ + SendNotifyBO getOrderInfoByOrderId(Long orderId); + + /** + * 批量修改订单采购信息 + * + * @param orders 订单信息 + */ + void updateWaitPurchaseBatchById(List orders); + + /** + * 修改订单为已采购状态,并扣除商家金额 + * + * @param order order + */ + void sourcingOrder(Order order); + + + /** + * 获取订单用于发送消息的数据列表 + * @param orderIds + * @return + */ + List listSimpleSendNotifyBO(List orderIds); + + /** + * 获取订单信息,发送消息给客户 + * + * @param orderIds + * @return + */ + List listSendNotifyByOrderIds(List orderIds); + + /** + * 获取订单的退款状态信息 + * @param orderVO + */ + void getReturnOrderStatus(OrderVO orderVO); + + /** + * 提货 + * + * @param orderIdList 提货单列表 + * @param userId 用户id + * @param stationId 自提点id + */ + void orderStationByOrderId(List orderIdList, Long userId, Long stationId); + + /** + * 获取自提点订单列表 + * + * @param orderDTO + * @return + */ + List listStationOrder(OrderDTO orderDTO); + + /** + * 判断查询条件的店铺名称,并返回店铺信息 + * @param orderSearchDTO + * @return + */ + Map checkShopName(OrderSearchDTO orderSearchDTO); + + /** + * 判断查询条件的供应商名称,并返回供应商信息 + * @param orderSearchDTO + * @return + */ + Map checkSupplierName(OrderSearchDTO orderSearchDTO); + + /** + * 根据订单整合信息获取订单信息 + * @param shopCartOrderMergerVO + * @return + */ + Order getOrderInfoByShopCartOrderMerger(ShopCartOrderMergerVO shopCartOrderMergerVO); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderAddrService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderAddrService.java new file mode 100644 index 0000000..b6d847e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderAddrService.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + + +import com.tmerclub.cloud.order.model.PurchaseOrderAddr; + +/** + * 采购订单配送地址 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface PurchaseOrderAddrService { + + /** + * 根据采购订单配送地址id获取采购订单配送地址 + * + * @param purchaseOrderAddrId 采购订单配送地址id + * @return 采购订单配送地址 + */ + PurchaseOrderAddr getById(Long purchaseOrderAddrId); + + /** + * 保存采购订单配送地址 + * @param purchaseOrderAddr 采购订单配送地址 + */ + void save(PurchaseOrderAddr purchaseOrderAddr); + + /** + * 更新采购订单配送地址 + * @param purchaseOrderAddr 采购订单配送地址 + */ + void update(PurchaseOrderAddr purchaseOrderAddr); + + /** + * 根据采购订单配送地址id删除采购订单配送地址 + * @param purchaseOrderAddrId + */ + void deleteById(Long purchaseOrderAddrId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderExcelService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderExcelService.java new file mode 100644 index 0000000..1ba99f8 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderExcelService.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.order.dto.PurchaseOrderDTO; +import com.tmerclub.cloud.order.vo.PurchaseOrderExcelVO; +import com.tmerclub.cloud.order.vo.PurchaseOrderItemVO; +import com.tmerclub.cloud.order.vo.UnDeliveryPurchaseOrderExcelVO; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.Map; + +/** + * 采购订单 + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public interface PurchaseOrderExcelService { + /** + * 获取订单信息列表(excel导出) + * + * @param orderSearchDTO 搜索参数 + * @return 订单信息列表 + */ + List excelOrderList(PurchaseOrderDTO orderSearchDTO); + + /** + * 获取待发货的订单信息列表(excel) + * + * @param response + * @param orderSearchDTO 搜索参数 + */ + void excelUnDeliveryOrderList(HttpServletResponse response, PurchaseOrderDTO orderSearchDTO); + + /** + * 导入待发货订单 + * + * @param list + * @param errorMap + */ + void exportOrderExcel(List list, Map> errorMap); + + /** + * 待发货订单导入的错误信息 + * + * @param errorMap + * @return + */ + String orderExportError(Map> errorMap); + + /** + * 导入excel(采购入库) + * + * @param excelFile + * @param shopId + * @param purchaseOrderId + * @return + */ + List inboundParseFile(MultipartFile excelFile, Long shopId, Long purchaseOrderId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderService.java new file mode 100644 index 0000000..45d80c2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderService.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.order.bo.EsPurchaseOrderBO; +import com.tmerclub.cloud.order.dto.PurchaseOrderDTO; +import com.tmerclub.cloud.order.vo.PurchaseOrderVO; +import com.tmerclub.cloud.order.vo.PurchaseSpuImportVO; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 采购订单 + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public interface PurchaseOrderService { + /** + * 保存 + * @param purchaseOrder + */ + void savePurchaseOrder(PurchaseOrderDTO purchaseOrder); + + /** + * 采购订单详情 + * @param purchaseOrderId + * @param supplierId + * @return + */ + PurchaseOrderVO info(Long purchaseOrderId, Long supplierId); + + /** + * 发货 + * @param deliveryOrderParam + * + */ + void delivery(DeliveryOrderDTO deliveryOrderParam); + + /** + * 更新采购订单付款凭证 + * @param purchaseOrder + */ + void updatePayVoucher(PurchaseOrderDTO purchaseOrder); + + /** + * 供应商审核采购订单付款凭证 + * @param purchaseOrder + */ + void auditVoucher(PurchaseOrderDTO purchaseOrder); + + /** + * 入库 + * @param purchaseOrder + * @return + */ + void inbound(PurchaseOrderDTO purchaseOrder); + + /** + * 作废 + * @param shopId + * @param purchaseOrderId + */ + void nullify(Long shopId, Long purchaseOrderId); + + /** + * 作废订单(通过仓库id) + * @param warehouseId 仓库id + */ + void nullifyByWarehouseId(Long warehouseId); + + /** + * 完成采购订单 + * @param shopId + * @param purchaseOrderId + */ + void complete(Long shopId, Long purchaseOrderId); + + /** + * 下载模板 + * @param response + */ + void downloadModel(HttpServletResponse response); + + /** + * 解析文件 + * @param excelFile excel文件 + * @param shopId 店铺id + * @param warehouseId 仓库id + * @return + */ + PurchaseSpuImportVO parseFile(MultipartFile excelFile, Long shopId, Long warehouseId); + + /** + * 获取采购订单需要保存到es中的数据 + * @param purchaseOrderId 采购订单id + * @return + */ + EsPurchaseOrderBO saveMongoAndGetEsInfo(Long purchaseOrderId); + + /** + * 更新采购订单的状态 + * @param purchaseOrderIds 采购订单id + * @param purchaseOrderStatus 采购订单状态 + * @return + */ + void updatePurchaseOrderStatus(List purchaseOrderIds, Integer purchaseOrderStatus); + + /** + * 统计未完成的采购订单数 + * @param warehouseId 仓库id + * @return 未完成数 + */ + Long countUnFinish(Long warehouseId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderAddrServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderAddrServiceImpl.java new file mode 100644 index 0000000..6a9e6e2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderAddrServiceImpl.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.OrderAddrVO; +import com.tmerclub.cloud.order.mapper.OrderAddrMapper; +import com.tmerclub.cloud.order.model.OrderAddr; +import com.tmerclub.cloud.order.service.OrderAddrService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 用户订单配送地址 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +@Service +public class OrderAddrServiceImpl implements OrderAddrService { + + @Autowired + private OrderAddrMapper orderAddrMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> orderAddrMapper.list()); + } + + @Override + public OrderAddr getById(Long orderAddrId) { + return orderAddrMapper.getByOrderAddrId(orderAddrId); + } + + @Override + public void save(OrderAddr orderAddr) { + orderAddrMapper.save(orderAddr); + } + + @Override + public void update(OrderAddr orderAddr) { + orderAddrMapper.update(orderAddr); + } + + @Override + public void deleteById(Long orderAddrId) { + orderAddrMapper.deleteById(orderAddrId); + } + + @Override + public OrderAddrVO getByOrderId(Long orderId) { + return orderAddrMapper.getByOrderId(orderId); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderAllinpayServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderAllinpayServiceImpl.java new file mode 100644 index 0000000..5b7a07a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderAllinpayServiceImpl.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.order.service.impl; + +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.bean.PaySettlementConfig; +import com.tmerclub.cloud.common.cache.constant.OrderCacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.service.OrderAllinpayService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * @author TRACK + */ +@Service +public class OrderAllinpayServiceImpl implements OrderAllinpayService { + + @DubboReference + private ConfigFeignClient configFeignClient; + + @Override + @Cacheable(cacheNames = OrderCacheNames.ALLINPAY_CONFIG_KEY, key = "'0'") + public boolean getIsAllinpay() { + // 获取是否开启通联支付 + ServerResponseEntity response = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG); + if (!response.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + PaySettlementConfig paySettlementConfig = Json.parseObject(response.getData(), PaySettlementConfig.class); + return Objects.equals(paySettlementConfig.getPaySettlementType(), 1); + } + + @Override + @CacheEvict(cacheNames = OrderCacheNames.ALLINPAY_CONFIG_KEY, key = "'0'") + public void deleteAllinpayCache() { + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderAnalysisServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderAnalysisServiceImpl.java new file mode 100644 index 0000000..4c6303e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderAnalysisServiceImpl.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.order.dto.CustomerRetainedDTO; +import com.tmerclub.cloud.api.order.vo.CustomerRetainVO; +import com.tmerclub.cloud.common.cache.constant.OrderCacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.order.manager.MongoOrderManager; +import com.tmerclub.cloud.order.service.OrderAnalysisService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单数据分析 + * @author cl + * @date 2021-05-25 09:13:38 + */ +@Service +public class OrderAnalysisServiceImpl implements OrderAnalysisService { + + private static final Logger log = LoggerFactory.getLogger(OrderAnalysisServiceImpl.class); + + @Autowired + private MongoOrderManager mongoOrderManager; + + + @Override + public List getTradeRetained(CustomerRetainedDTO customerRetainedDTO) { + List list = mongoOrderManager.getTradeRetained(customerRetainedDTO); + + // 按月份进行分组 + Map> map = new HashMap<>(8); + if (CollUtil.isNotEmpty(list)) { + map = list.stream() + .filter(customerRetainVO -> Objects.nonNull(customerRetainVO.getCurrentMonth()) && Objects.nonNull(customerRetainVO.getDealMonth())) + .collect(Collectors.groupingBy(CustomerRetainVO::getCurrentMonth)); + } + List customerRetainList = new ArrayList<>(Constant.INITIAL_CAPACITY); + + Date startTime = customerRetainedDTO.getStartTime(); + long endTime = customerRetainedDTO.getEndTime().getTime(); + while (startTime.getTime() < endTime) { + String startTimeFormat = DateUtil.format(startTime, "yyyyMM"); + CustomerRetainVO customerRetainVO = initCustomerRetainVO(startTimeFormat); + customerRetainList.add(customerRetainVO); + + // 时间更新为下一月 + startTime = DateUtil.beginOfMonth(DateUtil.offsetMonth(startTime, 1)); + + // 没有交易数据 + if (!map.containsKey(startTimeFormat)) { + continue; + } + + // 用户的交易数据处理 + Map dealMap = map.get(startTimeFormat).stream().collect(Collectors.toMap(CustomerRetainVO::getDealMonth, c -> c)); + if (!dealMap.containsKey(startTimeFormat)) { + continue; + } + CustomerRetainVO dealCustomerRetain = dealMap.get(startTimeFormat); + customerRetainVO.setNewCustomers(dealCustomerRetain.getNewCustomers()); + + // 从第二个月开始获取用户留存数量 + customerRetainVO.setFirstMonthRemain(getNewCustomers(startTime, dealMap, 0)); + customerRetainVO.setSecondMonthRemain(getNewCustomers(startTime, dealMap, 1)); + customerRetainVO.setThirdMonthRemain(getNewCustomers(startTime, dealMap, 2)); + customerRetainVO.setFourthMonthRemain(getNewCustomers(startTime, dealMap, 3)); + customerRetainVO.setFifthMonthRemain(getNewCustomers(startTime, dealMap, 4)); + customerRetainVO.setSixthMonthRemain(getNewCustomers(startTime, dealMap, 5)); + } + return customerRetainList; + } + + private Integer getNewCustomers(Date dealTime, Map dealMap, int month) { + String dealTimeFarmat = DateUtil.format(DateUtil.offsetMonth(dealTime, month), "yyyyMM"); + Integer newCustomers = 0; + if (dealMap.containsKey(dealTimeFarmat)) { + CustomerRetainVO customerRetainVO = dealMap.get(dealTimeFarmat); + newCustomers = customerRetainVO.getNewCustomers(); + } + return newCustomers; + } + + + private CustomerRetainVO initCustomerRetainVO(String startTimeFormat) { + CustomerRetainVO customerRetainVO = new CustomerRetainVO(); + customerRetainVO.setCurrentMonth(startTimeFormat); + customerRetainVO.setNewCustomers(0); + customerRetainVO.setFifthMonthRemain(0); + customerRetainVO.setSecondMonthRemain(0); + customerRetainVO.setThirdMonthRemain(0); + customerRetainVO.setFourthMonthRemain(0); + customerRetainVO.setFirstMonthRemain(0); + customerRetainVO.setSixthMonthRemain(0); + return customerRetainVO; + } + + @Override + @CacheEvict(cacheNames = OrderCacheNames.ORDER_TRADE_RETAINED_KEY, key = "#customerRetainedDTO.retainType +':'+ #customerRetainedDTO.dateType") + public void removeCacheTradeRetained(CustomerRetainedDTO customerRetainedDTO) { + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderRefundInterventionServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderRefundInterventionServiceImpl.java new file mode 100644 index 0000000..4c3c533 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderRefundInterventionServiceImpl.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.ReturnProcessStatusEnum; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.order.constant.PlatformInterventionStatus; +import com.tmerclub.cloud.order.dto.OrderRefundInterventionDTO; +import com.tmerclub.cloud.order.mapper.OrderRefundInterventionMapper; +import com.tmerclub.cloud.order.model.OrderRefundIntervention; +import com.tmerclub.cloud.order.service.OrderRefundInterventionService; +import com.tmerclub.cloud.order.service.OrderRefundService; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * 订单退款介入记录信息 + * + * @author FrozenWatermelon + * @date 2023-08-25 10:45:35 + */ +@Service +public class OrderRefundInterventionServiceImpl implements OrderRefundInterventionService { + + @Autowired + private OrderRefundInterventionMapper orderRefundInterventionMapper; + + @Autowired + private OrderRefundService orderRefundService; + + @Override + public void savePlatormIntervertion(OrderRefundInterventionDTO orderRefundParam) { + OrderRefundVO orderRefundVO = orderRefundService.getByRefundId(orderRefundParam.getRefundId()); + if (Objects.isNull(orderRefundVO)) { + // 撤销失败 退款订单不存在 + throw new LuckException("退款订单不存在"); + } + if (Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.SUCCESS.value())) { + // 买家已发货,不能撤销退款申请 + throw new LuckException("退款已经成功,不能提交凭证"); + } + if (!Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.FAIL.value())) { + // 卖家正在处理退款,不能撤销退款申请 + throw new LuckException("卖家正在处理退款,不能提交凭证"); + } + if (!Objects.equals(orderRefundVO.getPlatformInterventionStatus(), PlatformInterventionStatus.APPLY.value())) { + throw new LuckException("平台介入状态异常,不能提交凭证"); + } + Boolean timeCheck = DateUtil.compare(DateUtil.offsetHour(orderRefundVO.getApplyInterventionTime(),72) , DateUtil.date()) < 0; + if (timeCheck) { + throw new LuckException("已过添加凭证的时间,不能继续提交凭证"); + } + OrderRefundIntervention orderRefundIntervention = BeanUtil.map(orderRefundParam, OrderRefundIntervention.class); + orderRefundInterventionMapper.save(orderRefundIntervention); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderSettlementServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderSettlementServiceImpl.java new file mode 100644 index 0000000..3a9b846 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderSettlementServiceImpl.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.order.vo.OrderSettlementSimpleVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.order.mapper.OrderSettlementMapper; +import com.tmerclub.cloud.order.model.OrderSettlement; +import com.tmerclub.cloud.order.service.OrderSettlementService; +import com.tmerclub.cloud.order.vo.OrderSettlementVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 订单结算表 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +@Service +public class OrderSettlementServiceImpl implements OrderSettlementService { + + @Autowired + private OrderSettlementMapper orderSettlementMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> orderSettlementMapper.list()); + } + + @Override + public OrderSettlementVO getBySettlementId(Long settlementId) { + return orderSettlementMapper.getBySettlementId(settlementId); + } + + @Override + public void update(OrderSettlement orderSettlement) { + orderSettlementMapper.update(orderSettlement); + } + + @Override + public void deleteById(Long settlementId) { + orderSettlementMapper.deleteById(settlementId); + } + + @Override + public OrderSettlement getByOrderId(Long orderId) { + return orderSettlementMapper.getByOrderId(orderId); + } + + @Override + public List listOrderIdsByPayIds(Long userId, List payIds) { + if (CollUtil.isEmpty(payIds)) { + return new ArrayList<>(0); + } + return orderSettlementMapper.listOrderIdsByPayIds(userId, payIds); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderVirtualInfoLogServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderVirtualInfoLogServiceImpl.java new file mode 100644 index 0000000..2b7cde9 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderVirtualInfoLogServiceImpl.java @@ -0,0 +1,77 @@ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.bo.OrderVirtualInfoLogBO; +import com.tmerclub.cloud.order.bo.mongo.MongoOrderVirtualInfoLogBO; +import com.tmerclub.cloud.order.service.OrderVirtualInfoLogService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +/** + * @author TRACK + */ +@Service +public class OrderVirtualInfoLogServiceImpl implements OrderVirtualInfoLogService { + private static final Logger logger = LoggerFactory.getLogger(OrderVirtualInfoLogServiceImpl.class); + + @Autowired + private MongoTemplate mongoTemplate; + + @Override + public void saveLog(MongoOrderVirtualInfoLogBO mongoOrderVirtualInfoLogBO) { + logger.info("保存核销记录到mongodb{}", mongoOrderVirtualInfoLogBO); + mongoTemplate.insert(mongoOrderVirtualInfoLogBO); + } + + @Override + public void saveBatch(List mongoOrderVirtualInfoLogBOList) { + logger.info("插入核销日志:{}", Json.toJsonString(mongoOrderVirtualInfoLogBOList)); + if (CollUtil.isEmpty(mongoOrderVirtualInfoLogBOList)) { + return; + } + // 批量操作 + try { + mongoTemplate.insert(mongoOrderVirtualInfoLogBOList, MongoOrderVirtualInfoLogBO.class); + } catch (DuplicateKeyException e) { + logger.info("重复核销数据插入异常:{}", Json.toJsonString(mongoOrderVirtualInfoLogBOList)); + } + } + + @Override + public List getByOrderId(Long orderId) { + Criteria criteria = new Criteria(); + if (Objects.nonNull(orderId)) { + criteria.and("orderId").is(orderId); + } + Query query = new Query(criteria); + logger.info("getByOrderId()的mongodb查询语句:{}", query); + List orderVirtualInfoLogList = mongoTemplate.find(query, MongoOrderVirtualInfoLogBO.class); + List orderVirtualInfoLogBOList = BeanUtil.mapAsList(orderVirtualInfoLogList, OrderVirtualInfoLogBO.class); + return orderVirtualInfoLogBOList; + } + + @Override + public List getByWriteOffCode(String writeOffCode) { + Criteria criteria = new Criteria(); + if (StrUtil.isNotBlank(writeOffCode)) { + criteria.and("writeOffCode").is(writeOffCode); + } + Query query = new Query(criteria); + logger.info("getByWriteOffCode()的mongodb查询语句:{}", query); + List orderVirtualInfoLogList = mongoTemplate.find(query, MongoOrderVirtualInfoLogBO.class); + List orderVirtualInfoLogBOList = BeanUtil.mapAsList(orderVirtualInfoLogList, OrderVirtualInfoLogBO.class); + return orderVirtualInfoLogBOList; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderItemServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderItemServiceImpl.java new file mode 100644 index 0000000..7b1e403 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderItemServiceImpl.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.order.mapper.PurchaseOrderItemMapper; +import com.tmerclub.cloud.order.model.PurchaseOrderItem; +import com.tmerclub.cloud.order.service.PurchaseOrderItemService; +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 java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * 采购商品 + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +@Service +public class PurchaseOrderItemServiceImpl implements PurchaseOrderItemService { + private static final Logger LOGGER = LoggerFactory.getLogger(PurchaseOrderItemServiceImpl.class); + + @Autowired + private PurchaseOrderItemMapper purchaseOrderItemMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> purchaseOrderItemMapper.list()); + } + + @Override + public PurchaseOrderItem getByPurchaseSpuId(Long purchaseSpuId) { + return purchaseOrderItemMapper.getByPurchaseSpuId(purchaseSpuId); + } + + @Override + public void save(PurchaseOrderItem purchaseOrderItem) { + purchaseOrderItemMapper.save(purchaseOrderItem); + } + + + @Override + public void updateByDeliveries(List deliveryOrderItems, Integer deliveryType) { + Integer initDeliveryType = deliveryType; + int devType; + for (DeliveryOrderItemDTO deliveryOrderItem : deliveryOrderItems) { + devType = purchaseOrderItemMapper.getDevTypeByOrderItemId(deliveryOrderItem.getOrderItemId()); + LOGGER.info("物流配送方式为:" + devType + "传参为:" + deliveryType); + if (Objects.equals(devType, DeliveryType.DELIVERY.value()) || Objects.equals(devType, DeliveryType.ONLINE.value())) { + //如果快递项已有快递类型,则set进去应当是快递类型 + deliveryType = devType; + } + if (Objects.equals(devType, DeliveryType.ONLINE.value()) && Objects.equals(initDeliveryType, DeliveryType.DELIVERY.value())) { + // 如果是线上发货,现改为线下的话就更新为线下 + deliveryType = DeliveryType.DELIVERY.value(); + } + purchaseOrderItemMapper.updateByDelivery(deliveryOrderItem, deliveryType); + } + } + + @Override + public int countUnDeliveryNumByOrderId(Long orderId) { + return purchaseOrderItemMapper.countUnDeliveryNumByOrderId(orderId); + } + + @Override + public boolean getDevTypeByOrderId(Long orderId) { + List devTypes = purchaseOrderItemMapper.getDevTypeByOrderId(orderId); + return devTypes.contains(DeliveryType.DELIVERY.value()) || devTypes.contains(DeliveryType.ONLINE.value()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateBatchById(List purchaseOrderItemListDb) { + for (PurchaseOrderItem purchaseOrderItem : purchaseOrderItemListDb) { + purchaseOrderItemMapper.update(purchaseOrderItem); + } + } + + @Override + public void updateStatusByPurchaseOrderId(Integer purchaseOrderStatus, Long purchaseOrderId) { + purchaseOrderItemMapper.updateStatusByPurchaseOrderId(Collections.singletonList(purchaseOrderId), purchaseOrderStatus); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderLangServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderLangServiceImpl.java new file mode 100644 index 0000000..1631b83 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderLangServiceImpl.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.order.mapper.PurchaseOrderLangMapper; +import com.tmerclub.cloud.order.model.PurchaseOrderLang; +import com.tmerclub.cloud.order.service.PurchaseOrderLangService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 采购订单-国际化 + * + * @author lhd + * @date 2022-07-12 13:57:20 + */ +@Service +public class PurchaseOrderLangServiceImpl implements PurchaseOrderLangService { + + @Autowired + private PurchaseOrderLangMapper purchaseOrderLangMapper; + + @Override + public void saveBatch(StringBuilder orderSpuNameCn, StringBuilder orderSpuNameEn, Long purchaseOrderId) { + List purchaseOrderLangList = new ArrayList<>(Constant.INITIAL_CAPACITY); + PurchaseOrderLang purchaseOrderLang = new PurchaseOrderLang(); + purchaseOrderLang.setLang(LanguageEnum.LANGUAGE_ZH_CN.getLang()); + purchaseOrderLang.setSpuName(orderSpuNameCn.toString()); + purchaseOrderLang.setPurchaseOrderId(purchaseOrderId); + purchaseOrderLangList.add(purchaseOrderLang); + // sharing 需要单独字段做主键,暂只保存中文数据,避免插入key重复 +// PurchaseOrderLang purchaseOrderLangEn = new PurchaseOrderLang(); +// purchaseOrderLangEn.setLang(LanguageEnum.LANGUAGE_EN.getLang()); +// purchaseOrderLangEn.setSpuName(orderSpuNameEn.toString()); +// purchaseOrderLangEn.setPurchaseOrderId(purchaseOrderId); +// purchaseOrderLangList.add(purchaseOrderLangEn); + purchaseOrderLangMapper.saveBatch(purchaseOrderLangList); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/SupplierOrderStatisticsServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/SupplierOrderStatisticsServiceImpl.java new file mode 100644 index 0000000..b9d1316 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/SupplierOrderStatisticsServiceImpl.java @@ -0,0 +1,334 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.feign.SearchOrderRefundFeignClient; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.product.feign.ProductFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderRefundVO; +import com.tmerclub.cloud.common.order.vo.OrderCountVO; +import com.tmerclub.cloud.common.product.constant.SupplierSpuType; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.DateUtils; +import com.tmerclub.cloud.order.manager.MongoOrderManager; +import com.tmerclub.cloud.order.manager.MongoOrderRefundManager; +import com.tmerclub.cloud.order.mapper.OrderMapper; +import com.tmerclub.cloud.order.mapper.OrderRefundMapper; +import com.tmerclub.cloud.order.service.SupplierOrderStatisticsService; +import com.tmerclub.cloud.order.vo.HotProductVO; +import com.tmerclub.cloud.order.vo.OrderOverviewVO; +import com.tmerclub.cloud.order.vo.OrderRefundStatisticsVO; +import com.tmerclub.cloud.order.vo.SupplierOrderOverviewVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author lth + */ +@Service +public class SupplierOrderStatisticsServiceImpl implements SupplierOrderStatisticsService { + + @Autowired + private OrderMapper orderMapper; + @Autowired + private MongoOrderManager mongoOrderManager; + @Autowired + private MongoOrderRefundManager mongoOrderRefundManager; + @Autowired + private OrderRefundMapper orderRefundMapper; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private ProductFeignClient productFeignClient; + @DubboReference + private SearchOrderRefundFeignClient searchOrderRefundFeignClient; + private static final Integer NUM = 15; + + public static final Logger log = LoggerFactory.getLogger(SupplierOrderStatisticsServiceImpl.class); + + @Override + public OrderCountVO getOrderCountOfStatusBySupplierId(Long supplierId) { + OrderCountVO orderCount = mongoOrderManager.getOrderCountOfStatusBySupplierId(supplierId); + // 暂时使用es统计退款单总数数据 + OrderRefundSearchDTO searchDTO = new OrderRefundSearchDTO(); + searchDTO.setSupplierId(supplierId); + searchDTO.setSysType(AuthUserContext.get().getSysType()); + searchDTO.setReturnMoneySts(1); + EsPageVO data = searchOrderRefundFeignClient.pageOrderRefund(searchDTO).getData(); + orderCount.setRefund(Integer.valueOf(String.valueOf(data.getTotal()))); + return orderCount; + } + + @Override + public SupplierOrderOverviewVO getTodayInfoByHour(Long supplierId, Date startTime, Date endTime) { + SupplierOrderOverviewVO supplierOrderOverviewVO = this.getOrderStatisticsByShopIdAndDateRange(supplierId, startTime, endTime); + List todayProdSoldCountList = this.listProdSoldCountByHour(supplierId, startTime, endTime); + supplierOrderOverviewVO.setTodayProdSoldCountList(todayProdSoldCountList); + + List yesterdayProdSoldCountList = this.listProdSoldCountByHour(supplierId, DateUtil.offsetDay(startTime, -1), DateUtil.offsetDay(endTime, -1)); + supplierOrderOverviewVO.setYesterdayProdSoldCountList(yesterdayProdSoldCountList); + + Integer todayShopNewUserCount = mongoOrderManager.getShopNewUsersBySupplierId(supplierId, startTime, null); + supplierOrderOverviewVO.setTodayNewUserCount(todayShopNewUserCount); + Integer yesterdayShopNewUserCount = mongoOrderManager.getShopNewUsersBySupplierId(supplierId, DateUtil.offsetDay(startTime, -1), DateUtil.offsetDay(endTime, -1)); + supplierOrderOverviewVO.setYesterdayNewUserCount(yesterdayShopNewUserCount); + // 获取店铺近半个月的每天支付金额 + this.listPayActualAmount(supplierId, endTime, supplierOrderOverviewVO); + + ServerResponseEntity> spuListResponse = productFeignClient.listSpuIdsBySupplierIdAndSupplierSpuType(supplierId, null, SupplierSpuType.YES.value()); + if (!spuListResponse.isSuccess()) { + throw new LuckException(spuListResponse.getMsg()); + } + if (CollUtil.isEmpty(spuListResponse.getData())) { + supplierOrderOverviewVO.setTodayProdSoldNums(0); + } else { + supplierOrderOverviewVO.setTodayProdSoldNums(spuListResponse.getData().size()); + } + // 今天上架的spuId + ServerResponseEntity> todaySpuListResponse = productFeignClient.listSpuIdsBySupplierIdAndSupplierSpuType(supplierId, DateUtil.format(DateUtil.beginOfDay(DateUtil.date()), "yyyy-MM-dd"), SupplierSpuType.YES.value()); + if (!todaySpuListResponse.isSuccess()) { + throw new LuckException(todaySpuListResponse.getMsg()); + } + if (CollUtil.isEmpty(todaySpuListResponse.getData())) { + supplierOrderOverviewVO.setYesterdayProdSoldNums(supplierOrderOverviewVO.getTodayProdSoldNums()); + return supplierOrderOverviewVO; + } + // 昨天在售商品数量 = 今天在售商品数量 - 今天上架商品数量 + supplierOrderOverviewVO.setYesterdayProdSoldNums(supplierOrderOverviewVO.getTodayProdSoldNums() - todaySpuListResponse.getData().size()); + return supplierOrderOverviewVO; + } + + @Override + public List listProdRankingByPayActual(Long supplierId, Integer dayCount, Integer limit) { + Date endTime = DateUtil.endOfDay(DateUtil.date()); + Date startTime = this.getStartTime(endTime, dayCount); + List hotProductVOList = mongoOrderManager.listHotProdRanking(supplierId, startTime, endTime, I18nMessage.getLang()); + if (CollectionUtil.isEmpty(hotProductVOList)) { + return hotProductVOList; + } + Map hotProductMap = hotProductVOList.stream().collect(Collectors.toMap(HotProductVO::getSpuId, hotProductVO -> hotProductVO)); + + // 先查询商家端独立发布的商品详情,用于后续获取对应的供应商商品信息 (此处不用es是因为es无法搜索已删除的商品,存在这样一种情况,商家端商品已删除,但其代销的供应商商品处于正常状态) + ServerResponseEntity> merchantSpuListResponse = productFeignClient.listSpuBySpuIds(new ArrayList<>(hotProductMap.keySet())); + if (!merchantSpuListResponse.isSuccess()) { + throw new LuckException(merchantSpuListResponse.getMsg()); + } + List merchantSpuVOList = merchantSpuListResponse.getData(); + if (CollectionUtil.isEmpty(merchantSpuVOList)) { + return hotProductVOList; + } + // 过滤出SupplierSpuId不为null的数据 + merchantSpuVOList = merchantSpuVOList.stream().filter(x -> !Objects.isNull(x.getSupplierSpuId())).collect(Collectors.toList()); + if (CollectionUtil.isEmpty(merchantSpuVOList)) { + return hotProductVOList; + } + Map> consignmentProductMap = merchantSpuVOList.stream().collect(Collectors.groupingBy(SpuVO::getSupplierSpuId)); + + // 根据被代销的供应商商品Id查询商品详情 + ServerResponseEntity> supplierSpuResponse = searchSpuFeignClient.listSpuBySpuIds(new ArrayList<>(consignmentProductMap.keySet())); + if (!supplierSpuResponse.isSuccess()) { + throw new LuckException(supplierSpuResponse.getMsg()); + } + List supplierSpuVOList = supplierSpuResponse.getData(); + + List resultProdRankingList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuSearchVO supplierSpu : supplierSpuVOList) { + Long supplierSpuId = supplierSpu.getSpuId(); + HotProductVO hotProductVO = new HotProductVO(); + hotProductVO.setSpuId(supplierSpuId); + hotProductVO.setPayAmount(0.0); + hotProductVO.setOrderNums(0); + hotProductVO.setProductNums(0); + List merchantSpuList = consignmentProductMap.get(supplierSpuId); + if (CollUtil.isEmpty(merchantSpuList)) { + continue; + } + for (SpuVO merchantSpu : merchantSpuList) { + hotProductVO.setPayAmount(hotProductVO.getPayAmount() + hotProductMap.get(merchantSpu.getSpuId()).getPayAmount()); + hotProductVO.setOrderNums(hotProductVO.getOrderNums() + hotProductMap.get(merchantSpu.getSpuId()).getOrderNums()); + hotProductVO.setProductNums(hotProductVO.getProductNums() + hotProductMap.get(merchantSpu.getSpuId()).getProductNums()); + } + hotProductVO.setSpuName(supplierSpu.getSpuName()); + hotProductVO.setSpuImg(supplierSpu.getMainImgUrl()); + resultProdRankingList.add(hotProductVO); + } + List resultProdList = resultProdRankingList.stream().sorted(Comparator.comparing(HotProductVO::getPayAmount).reversed()).limit(limit).collect(Collectors.toList()); + resultProdList.forEach(item -> item.setPayAmount(Arith.div(item.getPayAmount(), 100, 2))); + return resultProdList; + } + + /** + * 根据spuId列表, 获取spu列表信息 + * + * @param spuIds 商品id列表 + * @return 商品列表 + */ + private List listSpuInfoByIds(List spuIds) { + ServerResponseEntity> supplierSpuResponse = searchSpuFeignClient.listSpuBySpuIds(spuIds); + if (!supplierSpuResponse.isSuccess()) { + throw new LuckException(supplierSpuResponse.getMsg()); + } + return supplierSpuResponse.getData(); + } + + /** + * 根据店铺Id与时间范围获取订单概况信息 + * + * @param supplierId + * @param startTime + * @param endTime + * @return + */ + private SupplierOrderOverviewVO getOrderStatisticsByShopIdAndDateRange(Long supplierId, Date startTime, Date endTime) { + OrderOverviewVO todayOrderOverviewVO = mongoOrderManager.getOrderOverviewInfoBySupplierId(supplierId, startTime, endTime); + OrderOverviewVO yesterdayOrderOverviewVO = mongoOrderManager.getOrderOverviewInfoBySupplierId(supplierId, DateUtil.offsetDay(startTime, -1), DateUtil.offsetDay(endTime, -1)); + OrderRefundStatisticsVO todayOrderRefundStatisticsVO = mongoOrderRefundManager.getOrderRefundInfoBySupplierId(supplierId, startTime, endTime); + OrderRefundStatisticsVO yesterdayOrderRefundStatisticsVO = mongoOrderRefundManager.getOrderRefundInfoBySupplierId(supplierId, DateUtil.offsetDay(startTime, -1), DateUtil.offsetDay(endTime, -1)); + + SupplierOrderOverviewVO supplierOrderOverviewVO = new SupplierOrderOverviewVO(); + supplierOrderOverviewVO.setTodayPayActual(todayOrderOverviewVO.getPayActual()); + supplierOrderOverviewVO.setYesterdayPayActual(yesterdayOrderOverviewVO.getPayActual()); + supplierOrderOverviewVO.setTodayPayUserCount(todayOrderOverviewVO.getPayUserCount()); + supplierOrderOverviewVO.setYesterdayPayUserCount(yesterdayOrderOverviewVO.getPayUserCount()); + supplierOrderOverviewVO.setTodayRefundAmount(todayOrderRefundStatisticsVO.getPayActualTotal()); + supplierOrderOverviewVO.setYesterdayRefundAmount(yesterdayOrderRefundStatisticsVO.getPayActualTotal()); + return supplierOrderOverviewVO; + } + + /** + * 根据供应商Id与时间范围按小时分段获取已出售商品数量列表 + * + * @param supplierId + * @param startTime + * @param endTime + */ + private List listProdSoldCountByHour(Long supplierId, Date startTime, Date endTime) { + List supplierOrderOverviewVOList = mongoOrderManager.listProdSoldCountByHour(supplierId, startTime, endTime); + Map prodSoldCountMap = new HashMap<>(25); + for (SupplierOrderOverviewVO supplierOrderOverviewVO : supplierOrderOverviewVOList) { + prodSoldCountMap.put(Integer.parseInt(supplierOrderOverviewVO.getTimeData()) + 8, supplierOrderOverviewVO.getTodayProdSoldNums()); + } + List todayProdSoldCountList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (int i = 0; i < Constant.MAX_HOUR_NUM_BY_DAY; i++) { + todayProdSoldCountList.add(prodSoldCountMap.getOrDefault(i, 0)); + } + return todayProdSoldCountList; + } + + /* + 根据店铺Id与时间范围按小时分段获取数据支付金额列表 + + @param shopId + * @param startTime + * @param endTime + */ + + /** + * 根据店铺Id与时间范围按日期(以天为单位)分段获取数据支付金额列表 + * + * @param supplierId + * @param endTime + * @param supplierOrderOverviewVO + */ + private void listPayActualAmount(Long supplierId, Date endTime, SupplierOrderOverviewVO supplierOrderOverviewVO) { + Date startTime = this.getStartTime(endTime, 15); + List orderOverviewVOList = mongoOrderManager.listPayActualByDay(supplierId, startTime, endTime); + Map orderOverviewMap = orderOverviewVOList.stream().collect(Collectors.toMap(OrderOverviewVO::getTimeData, orderOverviewVO -> orderOverviewVO)); + + List payActualList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List dateToStringList = new ArrayList<>(Constant.INITIAL_CAPACITY); + + for (int i = 0; i < NUM; i++) { + if (orderOverviewMap.containsKey(DateUtils.dateToStrYmd(startTime))) { + OrderOverviewVO orderOverviewVO = orderOverviewMap.get(DateUtils.dateToStrYmd(startTime)); + payActualList.add(Arith.div(orderOverviewVO.getPayActual(), 100, 2)); + } else { + payActualList.add(0.0); + } + dateToStringList.add(DateUtils.dateToStrYmd(startTime)); + startTime = getNextTime(startTime); + } + + supplierOrderOverviewVO.setDateToStringList(dateToStringList); + supplierOrderOverviewVO.setPayActualList(payActualList); + } + + + /** + * 根据结束时间与天数获取起始时间 + * + * @param endTime + * @param dayCount + * @return + */ + private Date getStartTime(Date endTime, Integer dayCount) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(endTime); + calendar.add(Calendar.DATE, -dayCount + 1); + return DateUtil.beginOfDay(calendar.getTime()); + } + + private Double getChangeRate(double nowValue, double oldValue) { + if (Objects.equals(oldValue, 0.0)) { + return Objects.equals(nowValue, 0.0) ? 0.0 : 1.0; + } + double minus = Arith.sub(nowValue, oldValue); + return Arith.div(minus, oldValue, 4); + } + + /** + * 获取下一次循环的开始时间,以及设置后台显示的时间字符串 + * + * @param startTime 开始时间 + * @return + */ + private Date getNextTime(Date startTime) { + startTime = DateUtil.offsetDay(startTime, 1); + return startTime; + } + + /** + * 计算两个数的百分比 + * + * @param dividend 被除数 + * @param divisor 除数 + * @return + */ + private Double getRatioRate(Integer dividend, Integer divisor) { + if (Objects.isNull(dividend) || dividend == 0.0) { + return 0.0; + } + if (Objects.isNull(divisor) || divisor == 0.0) { + return 100.0; + } + return Arith.mul(Arith.div(dividend, divisor, 4), 100.00); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/task/OrderRefundTask.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/task/OrderRefundTask.java new file mode 100644 index 0000000..b6092fb --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/task/OrderRefundTask.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.task; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.feign.SearchOrderRefundTaskFeignClient; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.ReturnProcessStatusEnum; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.order.manager.MongoOrderRefundManager; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 退款订单定时任务 + * + * @author FrozenWatermelon + */ +@Component +public class OrderRefundTask { + + @DubboReference + private SearchOrderRefundTaskFeignClient searchOrderRefundTaskFeignClient; + @Autowired + private MongoOrderRefundManager orderRefundManager; + @Autowired + private RocketMQTemplate orderRefundUpdateRefundStatusMqTemplate; + + /** + * 取消申请超时的订单,无论该超时订单处于任何状态 + */ + @XxlJob("cancelWhenTimeOut") + public void cancelWhenTimeOut() { + XxlJobHelper.log("取消申请超时的订单,无论该超时订单处于任何状态"); + + ServerResponseEntity serverResponseEntity = searchOrderRefundTaskFeignClient.cancelWhenTimeOut(); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } + + /** + * 退款临近超时提醒,每12小时执行发送一次的提醒 + */ + @XxlJob("pressProximityTimeOutOrder") + public void pressProximityTimeOutOrder() { + XxlJobHelper.log("退款临近超时提醒,每12小时执行发送一次的提醒"); + ServerResponseEntity serverResponseEntity = searchOrderRefundTaskFeignClient.pressProximityTimeOutOrder(); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } + + /** + * 发放退款定时任务,给十分钟之前还没有收到退款回调的订单重新发放退款 + * 一分钟执行一次 + */ + @XxlJob("refundRequest") + public void refundRequest() { + XxlJobHelper.log("发放退款定时任务开始"); + ServerResponseEntity serverResponseEntity = searchOrderRefundTaskFeignClient.refundRequest(); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } + + /** + * 因为支付宝电脑支付订单全额退款成功是没有退款回调的,所以需要该定时任务定时执行 + * 调用主动查单 查十秒钟前,两小时内还没回调的支付宝电脑支付订单退款的状态 + * 一分钟执行一次 + */ + @XxlJob("updateAliPayRefundStatus") + public void updateAliPayRefundStatus() { + XxlJobHelper.log("支付宝退款订单查单开始"); + Date decisionStartTime = DateUtil.offsetHour(new Date(), -2).toJdkDate(); + Date decisionEndTime = DateUtil.offsetSecond(new Date(), -10).toJdkDate(); + List refundIds = orderRefundManager.listShouldUpdateRefund(decisionStartTime, decisionEndTime, PayType.ALIPAY.value(), ReturnProcessStatusEnum.PROCESSING.value()); + if (CollUtil.isNotEmpty(refundIds)) { + // 发送消息,支付宝电脑支付回调 + SendStatus sendStatus = orderRefundUpdateRefundStatusMqTemplate.syncSend(RocketMqConstant.ORDER_REFUND_UPDATE_REFUND_STATUS, new GenericMessage<>(refundIds)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为定时任务回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + } + + /** + * 执行平台介入超时处理,超时则默认平台不同意退款 + */ + @XxlJob("refundInterventionTimeOut") + public void cancelRefundInterventionTimeOut() { + XxlJobHelper.log("执行平台介入超时处理,超时默认平台不同意退款"); + ServerResponseEntity serverResponseEntity = searchOrderRefundTaskFeignClient.cancelRefundInterventionTimeOut(); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/task/OrderTask.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/task/OrderTask.java new file mode 100644 index 0000000..81f5796 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/task/OrderTask.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.task; + + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.feign.SearchOrderTaskFeignClient; +import com.tmerclub.cloud.api.user.dto.ShopCustomerReqDTO; +import com.tmerclub.cloud.api.user.feign.ShopCustomerFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.order.manager.MongoOrderManager; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 订单定时任务 + * + * @author FrozenWatermelon + */ +@Component +public class OrderTask { + + @Autowired + private MongoOrderManager mongoOrderManager; + @DubboReference + private SearchOrderTaskFeignClient searchOrderTaskFeignClient; + @DubboReference + private ShopCustomerFeignClient shopCustomerFeignClient; + + + /** + * 订单结算 + */ + @XxlJob("settledOrder") + public void settledOrder() { + ServerResponseEntity serverResponseEntity = searchOrderTaskFeignClient.settledOrder(); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } + + + /** + * 确认收货 + */ + @XxlJob("confirmOrder") + public void confirmOrder() { + ServerResponseEntity serverResponseEntity = searchOrderTaskFeignClient.confirmOrder(); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } + + /** + * 预售订单,尾款时间过期未支付时的处理 + */ + @XxlJob("balanceTimeExpireOrder") + public void handleBalanceTimeExpireOrder() { + ServerResponseEntity serverResponseEntity = searchOrderTaskFeignClient.handleBalanceTimeExpireOrder(); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } + + /** + * 预售订单,尾款时间开始时尾款金额为0的处理 + */ + @XxlJob("balanceTimeStartOrder") + public void handlerBalanceTimeStartOrder() { + ServerResponseEntity serverResponseEntity = searchOrderTaskFeignClient.handlerBalanceTimeStartOrder(); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } + + /** + * 0点执行一遍检查采购订单支付状态定时任务 + */ + @XxlJob("checkPurchaseOrderPayStatus") + public void checkPurchaseOrderPayStatus() { + ServerResponseEntity serverResponseEntity = searchOrderTaskFeignClient.checkPurchaseOrderPayStatus(); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } + + /** + * 添加店铺会员 + * 每分钟进行一次统计 + */ + @XxlJob("addShopCustomer") + public void addShopCustomer(String str) { + Date startTime = RedisUtil.get(CacheNames.SHOP_CUSTOMER_UPDATE_TIME); + if (Objects.nonNull(startTime)) { + // 将搜索的时间提前一分钟,防止遗漏掉订单 + startTime = DateUtil.offsetMinute(startTime, -1); + } + Date endTime = new Date(); + + List mongoOrderList = mongoOrderManager.listUserAndShopDataByTime(startTime, endTime); + + if (Objects.nonNull(mongoOrderList)) { + // 插入店铺会员 + shopCustomerFeignClient.saveBatchByOrders(mongoOrderList); + } + RedisUtil.set(CacheNames.SHOP_CUSTOMER_UPDATE_TIME, startTime, Constant.DAY_SECOND); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotOrderItemVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotOrderItemVO.java new file mode 100644 index 0000000..1ec4ec1 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotOrderItemVO.java @@ -0,0 +1,156 @@ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.product.vo.SkuLangVO; +import com.tmerclub.cloud.common.product.vo.SpuLangVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.List; + +/** + * 调拨订单商品VO + * @author gaozijie + * @date 2023-11-20 + */ +public class AllotOrderItemVO { + + @Schema(description = "调拨订单商品id") + private Long allotOrderItemId; + + @Schema(description = "商品spuId") + private Long spuId; + + @Schema(description = "spu名称多语言") + private List spuLangVOList; + + @Schema(description = "商品skuId") + private Long skuId; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "sku名称多语言") + private List skuLangVOList; + + @Schema(description = "商品主图") + private String mainImgUrl; + + @Schema(description = "商品规格图") + private String imgUrl; + + @Schema(description = "调拨数量") + private Integer allotCount; + + @Schema(description = "调拨入库数量") + private Integer allotInCount; + + @Schema(description = "入库数量") + private Integer inboundCount; + + public AllotOrderItemVO() { + } + + public Long getAllotOrderItemId() { + return allotOrderItemId; + } + + public void setAllotOrderItemId(Long allotOrderItemId) { + this.allotOrderItemId = allotOrderItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public List getSpuLangVOList() { + return spuLangVOList; + } + + public void setSpuLangVOList(List spuLangVOList) { + this.spuLangVOList = spuLangVOList; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public List getSkuLangVOList() { + return skuLangVOList; + } + + public void setSkuLangVOList(List skuLangVOList) { + this.skuLangVOList = skuLangVOList; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getAllotCount() { + return allotCount; + } + + public void setAllotCount(Integer allotCount) { + this.allotCount = allotCount; + } + + public Integer getAllotInCount() { + return allotInCount; + } + + public void setAllotInCount(Integer allotInCount) { + this.allotInCount = allotInCount; + } + + public Integer getInboundCount() { + return inboundCount; + } + + public void setInboundCount(Integer inboundCount) { + this.inboundCount = inboundCount; + } + + @Override + public String toString() { + return "AllotOrderItemVO{" + + "allotOrderItemId=" + allotOrderItemId + + ", spuId=" + spuId + + ", spuLangVOList=" + spuLangVOList + + ", skuId=" + skuId + + ", partyCode='" + partyCode + '\'' + + ", skuLangVOList=" + skuLangVOList + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", allotCount=" + allotCount + + ", allotInCount=" + allotInCount + + ", inboundCount=" + inboundCount + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuImportVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuImportVO.java new file mode 100644 index 0000000..a7690fe --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuImportVO.java @@ -0,0 +1,45 @@ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.List; + +/** + * @author gaozijie + * @since 2023-11-29 + */ +public class AllotSpuImportVO { + + @Schema(description = "成功解析的数据项") + private List allotSpuVOList; + + @Schema(description = "导入结果提示") + private String tips; + + public AllotSpuImportVO() { + } + + public List getAllotSpuVOList() { + return allotSpuVOList; + } + + public void setAllotSpuVOList(List allotSpuVOList) { + this.allotSpuVOList = allotSpuVOList; + } + + public String getTips() { + return tips; + } + + public void setTips(String tips) { + this.tips = tips; + } + + @Override + public String toString() { + return "AllotSpuImportVO{" + + "allotSpuVOList=" + allotSpuVOList + + ", tips='" + tips + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuInboundExcelVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuInboundExcelVO.java new file mode 100644 index 0000000..89c5db5 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuInboundExcelVO.java @@ -0,0 +1,128 @@ +package com.tmerclub.cloud.order.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.tmerclub.cloud.common.model.ExcelModel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @since 2023-11-30 + */ +public class AllotSpuInboundExcelVO extends ExcelModel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "调拨商品信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + /** + * 表头(用于excel模板校验) + */ + public static final String HEADER = "调拨商品信息"; + public static final String[] HEADER_ARRAY = {"序号", "商品编码(必填)", "商品名称", "商品规格", "预计入库量", "剩余入库量", "实际入库量"}; + + @ExcelProperty(value = {HEADER, "序号"}, index = 0) + private Integer seq; + + @ExcelProperty(value = {HEADER, "商品编码(必填)"}, index = 1) + private String partyCode; + + @ExcelProperty(value = {HEADER, "商品名称"}, index = 2) + private String spuName; + + @ExcelProperty(value = {HEADER, "商品规格"}, index = 3) + private String skuName; + + @ExcelProperty(value = {HEADER, "预计入库量"}, index = 4) + private Integer allotCount; + + @ExcelProperty(value = {HEADER, "剩余入库量"}, index = 5) + private Integer canInboundCount; + + @ExcelProperty(value = {HEADER, "实际入库量"}, index = 6) + private Integer inboundCount; + + public AllotSpuInboundExcelVO() { + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Integer getAllotCount() { + return allotCount; + } + + public void setAllotCount(Integer allotCount) { + this.allotCount = allotCount; + } + + public Integer getCanInboundCount() { + return canInboundCount; + } + + public void setCanInboundCount(Integer canInboundCount) { + this.canInboundCount = canInboundCount; + } + + public Integer getInboundCount() { + return inboundCount; + } + + public void setInboundCount(Integer inboundCount) { + this.inboundCount = inboundCount; + } + + @Override + public String toString() { + return "AllotSpuInboundExcelVO{" + + "seq=" + seq + + ", partyCode='" + partyCode + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", allotCount=" + allotCount + + ", canInboundCount=" + canInboundCount + + ", inboundCount=" + inboundCount + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/ChooseComboItemVo.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/ChooseComboItemVo.java new file mode 100644 index 0000000..855abb8 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/ChooseComboItemVo.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 购物车中选中的套餐活动项信息 + * + * @author xxw + * @date 2022/8/23 14:00 + */ +public class ChooseComboItemVo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "主商品购物车id") + private Long mainProdBasketId; + + @Schema(description = "套餐总金额") + private Double comboTotalAmount; + + @Schema(description = "套餐金额(套餐单价)") + private Double comboAmount; + + @Schema(description = "套餐优惠金额") + private Double preferentialAmount; + + @Schema(description = "套餐数量") + private Integer comboCount; + + @Schema(description = "套餐名称") + private String name; + + /** + * 套餐序号 + * 套餐可能会进行分单操作,且一个订单中可能包含多个相同套餐不同规格,所以需要一个独立的参数来标识套餐 + */ + private Integer index; + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Long getMainProdBasketId() { + return mainProdBasketId; + } + + public void setMainProdBasketId(Long mainProdBasketId) { + this.mainProdBasketId = mainProdBasketId; + } + + public Double getComboTotalAmount() { + return comboTotalAmount; + } + + public void setComboTotalAmount(Double comboTotalAmount) { + this.comboTotalAmount = comboTotalAmount; + } + + public Double getComboAmount() { + return comboAmount; + } + + public void setComboAmount(Double comboAmount) { + this.comboAmount = comboAmount; + } + + public Double getPreferentialAmount() { + return preferentialAmount; + } + + public void setPreferentialAmount(Double preferentialAmount) { + this.preferentialAmount = preferentialAmount; + } + + public Integer getComboCount() { + return comboCount; + } + + public void setComboCount(Integer comboCount) { + this.comboCount = comboCount; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getIndex() { + return index; + } + + public void setIndex(Integer index) { + this.index = index; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/HotProductVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/HotProductVO.java new file mode 100644 index 0000000..6bcfe8f --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/HotProductVO.java @@ -0,0 +1,95 @@ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author chiley + * @date 2022/6/27 15:41 + */ + +@Schema(description = "热卖商品订单数据") +public class HotProductVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品主图片") + private String spuImg; + + @Schema(description = "支付金额") + private Double payAmount; + + @Schema(description = "订单数量") + private Integer orderNums; + + @Schema(description = "商品数量") + private Integer productNums; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSpuImg() { + return spuImg; + } + + public void setSpuImg(String spuImg) { + this.spuImg = spuImg; + } + + public Double getPayAmount() { + return payAmount; + } + + public void setPayAmount(Double payAmount) { + this.payAmount = payAmount; + } + + public Integer getOrderNums() { + return orderNums; + } + + public void setOrderNums(Integer orderNums) { + this.orderNums = orderNums; + } + + public Integer getProductNums() { + return productNums; + } + + public void setProductNums(Integer productNums) { + this.productNums = productNums; + } + + @Override + public String toString() { + return "HotProductVO{" + + "spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", spuImg='" + spuImg + '\'' + + ", payAmount=" + payAmount + + ", orderNums=" + orderNums + + ", productNums=" + productNums + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/MyOrderVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/MyOrderVO.java new file mode 100644 index 0000000..4cbc682 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/MyOrderVO.java @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 我的订单 + * + * @author FrozenWatermelon + */ +@Schema(description = "我的订单") +public class MyOrderVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单项", requiredMode = Schema.RequiredMode.REQUIRED) + private List orderItems; + + @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + @Schema(description = "总价", requiredMode = Schema.RequiredMode.REQUIRED) + private Long actualTotal; + + @Schema(description = "使用积分", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderScore; + + @Schema(description = "订单状态", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer status; + + @Schema(description = "订单类型(0普通订单 1团购订单 2秒杀订单)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer orderType; + + @Schema(description = "退款单类型(1:整单退款,2:单个物品退款)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer refundType; + + @Schema(description = "处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer returnMoneySts; + + @Schema(description = "配送类型 1:快递 2:自提 3:无需快递", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer deliveryType; + + @Schema(description = "店铺名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String shopName; + + @Schema(description = "店铺id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + + @Schema(description = "订单运费", requiredMode = Schema.RequiredMode.REQUIRED) + private Long freightAmount; + + @Schema(description = "订单创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date createTime; + + @Schema(description = "商品总数", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer allCount; + + @Schema(description = "用户备注信息") + private String remarks; + + @Schema(description = "自提点id") + private Long stationId; + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Integer getRefundType() { + return refundType; + } + + public void setRefundType(Integer refundType) { + this.refundType = refundType; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + @Override + public String toString() { + return "MyOrderVO{" + + "orderItems=" + orderItems + + ", orderId=" + orderId + + ", actualTotal=" + actualTotal + + ", orderScore=" + orderScore + + ", status=" + status + + ", orderType=" + orderType + + ", refundType=" + refundType + + ", returnMoneySts=" + returnMoneySts + + ", deliveryType=" + deliveryType + + ", shopName='" + shopName + '\'' + + ", shopId=" + shopId + + ", freightAmount=" + freightAmount + + ", createTime=" + createTime + + ", allCount=" + allCount + + ", remarks='" + remarks + '\'' + + ", stationId=" + stationId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderAndPreSaleVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderAndPreSaleVO.java new file mode 100644 index 0000000..c02ee6a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderAndPreSaleVO.java @@ -0,0 +1,521 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单和订单预售信息 + * + * @author lhd + * @date 2022-08-22 14:13:50 + */ +public class OrderAndPreSaleVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单ID") + private Long orderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "用户ID") + private Long userId; + + @Schema(description = "用户订单地址Id") + private Long orderAddrId; + + @Schema(description = "店铺名称") + private String shopName; + + /** + * 支付系统类型 + * + * @see PaySysType + */ + @Schema(description = "支付系统类型 0默认 1通联") + private Integer paySysType; + + @Schema(description = "总值") + private Long total; + + @Schema(description = "实际总值") + private Long actualTotal; + + @Schema(description = "订单使用积分") + private Long orderScore; + + @Schema(description = "买家备注") + private String remarks; + + @Schema(description = "卖家备注") + private String shopRemarks; + + @Schema(description = "订单状态 1:待付款 2:待发货(待自提) 3:待收货(已发货) 5:成功 6:失败 7:待成团") + private Integer status; + + @Schema(description = "支付方式 请参考枚举PayType") + private Integer payType; + + @Schema(description = "配送类型 1:快递 2:自提 3:无需快递 4同城配送") + private Integer deliveryType; + + @Schema(description = "订单类型1团购订单 2秒杀订单 3积分订单") + private Integer orderType; + + @Schema(description = "订单关闭原因 1-超时未支付 2-退款关闭 4-买家取消 15-已通过货到付款交易") + private Integer closeType; + + @Schema(description = "订单商品总数") + private Integer allCount; + + @Schema(description = "付款时间") + private Date payTime; + + @Schema(description = "发货时间") + private Date deliveryTime; + + @Schema(description = "完成时间") + private Date finallyTime; + + @Schema(description = "取消时间") + private Date cancelTime; + + @Schema(description = "预售发货时间") + private Date bookTime; + + @Schema(description = "是否已支付,1.已支付0.未支付") + private Integer isPayed; + + @Schema(description = "用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除") + private Integer deleteStatus; + + @Schema(description = "订单退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)") + private Integer refundStatus; + + @Schema(description = "订单运费") + private Long freightAmount; + + @Schema(description = "积分抵扣金额") + private Long scoreAmount; + + @Schema(description = "会员折扣金额") + private Long memberAmount; + + @Schema(description = "平台优惠券优惠金额") + private Long platformCouponAmount; + + @Schema(description = "商家优惠券优惠金额") + private Long shopCouponAmount; + + @Schema(description = "满减优惠金额") + private Long discountAmount; + + @Schema(description = "平台优惠金额") + private Long platformAmount; + + @Schema(description = "平台运费减免金额") + private Long platformFreeFreightAmount; + + @Schema(description = "优惠总额") + private Long reduceAmount; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商商品发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + @Schema(description = "定金金额") + private Long depositAmount; + @Schema(description = "尾款金额") + private Long balanceAmount; + + @Schema(description = "预售类型 -1:未开启 0.全款预售 1.定金预售") + private Integer preSaleType; + + @Schema(description = "订单项") + private List orderItems; + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderAddrId() { + return orderAddrId; + } + + public void setOrderAddrId(Long orderAddrId) { + this.orderAddrId = orderAddrId; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getShopRemarks() { + return shopRemarks; + } + + public void setShopRemarks(String shopRemarks) { + this.shopRemarks = shopRemarks; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getFinallyTime() { + return finallyTime; + } + + public void setFinallyTime(Date finallyTime) { + this.finallyTime = finallyTime; + } + + public Date getCancelTime() { + return cancelTime; + } + + public void setCancelTime(Date cancelTime) { + this.cancelTime = cancelTime; + } + + public Date getBookTime() { + return bookTime; + } + + public void setBookTime(Date bookTime) { + this.bookTime = bookTime; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Integer getDeleteStatus() { + return deleteStatus; + } + + public void setDeleteStatus(Integer deleteStatus) { + this.deleteStatus = deleteStatus; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Long getScoreAmount() { + return scoreAmount; + } + + public void setScoreAmount(Long scoreAmount) { + this.scoreAmount = scoreAmount; + } + + public Long getMemberAmount() { + return memberAmount; + } + + public void setMemberAmount(Long memberAmount) { + this.memberAmount = memberAmount; + } + + public Long getPlatformCouponAmount() { + return platformCouponAmount; + } + + public void setPlatformCouponAmount(Long platformCouponAmount) { + this.platformCouponAmount = platformCouponAmount; + } + + public Long getShopCouponAmount() { + return shopCouponAmount; + } + + public void setShopCouponAmount(Long shopCouponAmount) { + this.shopCouponAmount = shopCouponAmount; + } + + public Long getDiscountAmount() { + return discountAmount; + } + + public void setDiscountAmount(Long discountAmount) { + this.discountAmount = discountAmount; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + @Override + public String toString() { + return "OrderAndPreSaleVO{" + + "orderId=" + orderId + + ", shopId=" + shopId + + ", userId=" + userId + + ", orderAddrId=" + orderAddrId + + ", shopName='" + shopName + '\'' + + ", paySysType=" + paySysType + + ", total=" + total + + ", actualTotal=" + actualTotal + + ", orderScore=" + orderScore + + ", remarks='" + remarks + '\'' + + ", shopRemarks='" + shopRemarks + '\'' + + ", status=" + status + + ", payType=" + payType + + ", deliveryType=" + deliveryType + + ", orderType=" + orderType + + ", closeType=" + closeType + + ", allCount=" + allCount + + ", payTime=" + payTime + + ", deliveryTime=" + deliveryTime + + ", finallyTime=" + finallyTime + + ", cancelTime=" + cancelTime + + ", bookTime=" + bookTime + + ", isPayed=" + isPayed + + ", deleteStatus=" + deleteStatus + + ", refundStatus=" + refundStatus + + ", freightAmount=" + freightAmount + + ", scoreAmount=" + scoreAmount + + ", memberAmount=" + memberAmount + + ", platformCouponAmount=" + platformCouponAmount + + ", shopCouponAmount=" + shopCouponAmount + + ", discountAmount=" + discountAmount + + ", platformAmount=" + platformAmount + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", reduceAmount=" + reduceAmount + + ", supplierId=" + supplierId + + ", supplierDeliveryType=" + supplierDeliveryType + + ", depositAmount=" + depositAmount + + ", balanceAmount=" + balanceAmount + + ", preSaleType=" + preSaleType + + ", orderItems=" + orderItems + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderDetailVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderDetailVO.java new file mode 100644 index 0000000..798bb3a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderDetailVO.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lhd + */ +@Schema(description = "订单详细信息") +public class OrderDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "销售店铺名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String shopName; + @Schema(description = "订单运费", requiredMode = Schema.RequiredMode.REQUIRED) + private Long freightAmount; + + @Schema(description = "店铺运费减免金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long freeFreightAmount; + + @Schema(description = "平台运费减免金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long platformFreeFreightAmount; + + @Schema(description = "订单项详细信息") + private List orderItemDetailList; + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public List getOrderItemDetailList() { + return orderItemDetailList; + } + + public void setOrderItemDetailList(List orderItemDetailList) { + this.orderItemDetailList = orderItemDetailList; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + @Override + public String toString() { + return "OrderDetailVO{" + + "shopName='" + shopName + '\'' + + ", freightAmount=" + freightAmount + + ", freeFreightAmount=" + freeFreightAmount + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", orderItemDetailList=" + orderItemDetailList + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderInvoiceVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderInvoiceVO.java new file mode 100644 index 0000000..edfd8c9 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderInvoiceVO.java @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author Pineapple + * @date 2021/8/2 8:50 + */ +public class OrderInvoiceVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单发票ID") + private Long orderInvoiceId; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "发票类型 1.电子普通发票") + private Integer invoiceType; + + @Schema(description = "抬头类型 1.单位 2.个人") + private Integer headerType; + + @Schema(description = "抬头名称") + private String headerName; + + @Schema(description = "发票税号") + private String invoiceTaxNumber; + + @Schema(description = "发票内容 1.商品明细") + private Integer invoiceContext; + + @Schema(description = "发票状态 1.申请中 2.已开票") + private Integer invoiceState; + + @Schema(description = "文件id") + private Long fileId; + + @Schema(description = "申请时间") + private Date applicationTime; + + @Schema(description = "上传时间") + private Date uploadTime; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "订单项列表") + private List orderItemVOList; + + @Schema(description = "商品总数") + private Integer count; + + @Schema(description = "商品总金额") + private Long amount; + + @Schema(description = "订单状态 1:待付款 2:待发货(待自提) 3:待收货(已发货) 5:成功 6:失败 7:待成团") + private Integer orderState; + + @Schema(description = "订单创建时间") + private Date orderCreateTime; + + @Schema(description = "用户id") + private Long userId; + + public Long getOrderInvoiceId() { + return orderInvoiceId; + } + + public void setOrderInvoiceId(Long orderInvoiceId) { + this.orderInvoiceId = orderInvoiceId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getInvoiceType() { + return invoiceType; + } + + public void setInvoiceType(Integer invoiceType) { + this.invoiceType = invoiceType; + } + + public Integer getHeaderType() { + return headerType; + } + + public void setHeaderType(Integer headerType) { + this.headerType = headerType; + } + + public String getHeaderName() { + return headerName; + } + + public void setHeaderName(String headerName) { + this.headerName = headerName; + } + + public String getInvoiceTaxNumber() { + return invoiceTaxNumber; + } + + public void setInvoiceTaxNumber(String invoiceTaxNumber) { + this.invoiceTaxNumber = invoiceTaxNumber; + } + + public Integer getInvoiceContext() { + return invoiceContext; + } + + public void setInvoiceContext(Integer invoiceContext) { + this.invoiceContext = invoiceContext; + } + + public Integer getInvoiceState() { + return invoiceState; + } + + public void setInvoiceState(Integer invoiceState) { + this.invoiceState = invoiceState; + } + + public Long getFileId() { + return fileId; + } + + public void setFileId(Long fileId) { + this.fileId = fileId; + } + + public Date getApplicationTime() { + return applicationTime; + } + + public void setApplicationTime(Date applicationTime) { + this.applicationTime = applicationTime; + } + + public Date getUploadTime() { + return uploadTime; + } + + public void setUploadTime(Date uploadTime) { + this.uploadTime = uploadTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public List getOrderItemVOList() { + return orderItemVOList; + } + + public void setOrderItemVOList(List orderItemVOList) { + this.orderItemVOList = orderItemVOList; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Integer getOrderState() { + return orderState; + } + + public void setOrderState(Integer orderState) { + this.orderState = orderState; + } + + public Date getOrderCreateTime() { + return orderCreateTime; + } + + public void setOrderCreateTime(Date orderCreateTime) { + this.orderCreateTime = orderCreateTime; + } + + @Override + public String toString() { + return "OrderInvoiceVO{" + + "orderInvoiceId=" + orderInvoiceId + + ", orderId=" + orderId + + ", invoiceType=" + invoiceType + + ", headerType=" + headerType + + ", headerName='" + headerName + '\'' + + ", invoiceTaxNumber=" + invoiceTaxNumber + + ", invoiceContext=" + invoiceContext + + ", invoiceState=" + invoiceState + + ", fileId=" + fileId + + ", applicationTime=" + applicationTime + + ", uploadTime=" + uploadTime + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", orderItemVOList=" + orderItemVOList + + ", count=" + count + + ", amount=" + amount + + ", orderState=" + orderState + + ", orderCreateTime=" + orderCreateTime + + ", userId=" + userId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderItemWithAddressVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderItemWithAddressVO.java new file mode 100644 index 0000000..c7fb7b7 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderItemWithAddressVO.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.order.vo.OrderAddrVO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 订单项和地址 + * + * @author FrozenWatermelon + * @date 2021-02-22 14:13:50 + */ +public class OrderItemWithAddressVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单项") + private List orderItems; + + @Schema(description = "订单地址") + private OrderAddrVO orderAddr; + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public OrderAddrVO getOrderAddr() { + return orderAddr; + } + + public void setOrderAddr(OrderAddrVO orderAddr) { + this.orderAddr = orderAddr; + } + + @Override + public String toString() { + return "OrderItemWithAddressVO{" + + "orderItems=" + orderItems + + ", orderAddr=" + orderAddr + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderPayInfoVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderPayInfoVO.java new file mode 100644 index 0000000..6de980c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderPayInfoVO.java @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单支付记录VO + * + * @author FrozenWatermelon + * @date 2020-12-04 11:27:35 + */ +public class OrderPayInfoVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "支付单号") + private Long payId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "外部订单流水号") + private String bizPayNo; + + @Schema(description = "系统类型 见SysTypeEnum") + private Integer sysType; + + @Schema(description = "支付方式 1 微信支付 2 支付宝") + private Integer payType; + + @Schema(description = "支付状态") + private Integer payStatus; + + @Schema(description = "支付积分") + private Long payScore; + + @Schema(description = "支付金额") + private Long payAmount; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "回调内容") + private String callbackContent; + + @Schema(description = "回调时间") + private Date callbackTime; + + @Schema(description = "确认时间") + private Date confirmTime; + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getBizPayNo() { + return bizPayNo; + } + + public void setBizPayNo(String bizPayNo) { + this.bizPayNo = bizPayNo; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getPayStatus() { + return payStatus; + } + + public void setPayStatus(Integer payStatus) { + this.payStatus = payStatus; + } + + public Long getPayScore() { + return payScore; + } + + public void setPayScore(Long payScore) { + this.payScore = payScore; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public String getCallbackContent() { + return callbackContent; + } + + public void setCallbackContent(String callbackContent) { + this.callbackContent = callbackContent; + } + + public Date getCallbackTime() { + return callbackTime; + } + + public void setCallbackTime(Date callbackTime) { + this.callbackTime = callbackTime; + } + + public Date getConfirmTime() { + return confirmTime; + } + + public void setConfirmTime(Date confirmTime) { + this.confirmTime = confirmTime; + } + + @Override + public String toString() { + return "OrderPayInfoVO{" + + "payId=" + payId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",userId=" + userId + + ",bizPayNo=" + bizPayNo + + ",sysType=" + sysType + + ",payType=" + payType + + ",payStatus=" + payStatus + + ",payScore=" + payScore + + ",payAmount=" + payAmount + + ",version=" + version + + ",callbackContent=" + callbackContent + + ",callbackTime=" + callbackTime + + ",confirmTime=" + confirmTime + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundAddrVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundAddrVO.java new file mode 100644 index 0000000..e399cac --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundAddrVO.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户退货物流地址VO + * + * @author FrozenWatermelon + * @date 2021-03-09 13:44:31 + */ +public class OrderRefundAddrVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "物流ID") + private Long refundAddrId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "退款号") + private Long refundId; + + @Schema(description = "买家ID") + private Long userId; + + @Schema(description = "物流公司ID") + private Long deliveryCompanyId; + + @Schema(description = "物流公司名称") + private String deliveryName; + + @Schema(description = "物流单号") + private String deliveryNo; + + @Schema(description = "收件人姓名") + private String consigneeName; + + @Schema(description = "收件人电话(顺丰快递需要)") + private String consigneeMobile; + + @Schema(description = "收件人座机") + private String consigneeTelephone; + + @Schema(description = "收件人邮政编码") + private String consigneePostCode; + + @Schema(description = "收件人地址") + private String consigneeAddr; + + @Schema(description = "发送人手机号码") + private String senderMobile; + + @Schema(description = "买家备注") + private String senderRemarks; + + @Schema(description = "图片凭证") + private String imgs; + + public Long getRefundAddrId() { + return refundAddrId; + } + + public void setRefundAddrId(Long refundAddrId) { + this.refundAddrId = refundAddrId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getDeliveryCompanyId() { + return deliveryCompanyId; + } + + public void setDeliveryCompanyId(Long deliveryCompanyId) { + this.deliveryCompanyId = deliveryCompanyId; + } + + public String getDeliveryName() { + return deliveryName; + } + + public void setDeliveryName(String deliveryName) { + this.deliveryName = deliveryName; + } + + public String getDeliveryNo() { + return deliveryNo; + } + + public void setDeliveryNo(String deliveryNo) { + this.deliveryNo = deliveryNo; + } + + public String getConsigneeName() { + return consigneeName; + } + + public void setConsigneeName(String consigneeName) { + this.consigneeName = consigneeName; + } + + public String getConsigneeMobile() { + return consigneeMobile; + } + + public void setConsigneeMobile(String consigneeMobile) { + this.consigneeMobile = consigneeMobile; + } + + public String getConsigneeTelephone() { + return consigneeTelephone; + } + + public void setConsigneeTelephone(String consigneeTelephone) { + this.consigneeTelephone = consigneeTelephone; + } + + public String getConsigneePostCode() { + return consigneePostCode; + } + + public void setConsigneePostCode(String consigneePostCode) { + this.consigneePostCode = consigneePostCode; + } + + public String getConsigneeAddr() { + return consigneeAddr; + } + + public void setConsigneeAddr(String consigneeAddr) { + this.consigneeAddr = consigneeAddr; + } + + public String getSenderMobile() { + return senderMobile; + } + + public void setSenderMobile(String senderMobile) { + this.senderMobile = senderMobile; + } + + public String getSenderRemarks() { + return senderRemarks; + } + + public void setSenderRemarks(String senderRemarks) { + this.senderRemarks = senderRemarks; + } + + public String getImgs() { + return imgs; + } + + public void setImgs(String imgs) { + this.imgs = imgs; + } + + @Override + public String toString() { + return "OrderRefundAddrVO{" + + "refundAddrId=" + refundAddrId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",shopId=" + shopId + + ",refundId=" + refundId + + ",userId=" + userId + + ",deliveryCompanyId=" + deliveryCompanyId + + ",deliveryName=" + deliveryName + + ",deliveryNo=" + deliveryNo + + ",consigneeName=" + consigneeName + + ",consigneeMobile=" + consigneeMobile + + ",consigneeTelephone=" + consigneeTelephone + + ",consigneePostCode=" + consigneePostCode + + ",consigneeAddr=" + consigneeAddr + + ",senderMobile=" + senderMobile + + ",senderRemarks=" + senderRemarks + + ",imgs=" + imgs + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundInterventionVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundInterventionVO.java new file mode 100644 index 0000000..02018e1 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundInterventionVO.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 订单退款介入记录信息VO + * + * @author FrozenWatermelon + * @date 2023-08-25 10:45:35 + */ +public class OrderRefundInterventionVO extends BaseVO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "记录ID") + private Long refundIntervertionId; + + @Schema(description = "退款id") + private Long refundId; + + @Schema(description = "商家/供应商/用户id") + private Long bizId; + + @Schema(description = "商家/供应商/用户名称") + private String bizName; + + @Schema(description = "系统类型, 0.普通用户 1.商家端 2.平台端 3.供应商端") + private Integer sysType; + + @Schema(description = "凭证说明") + private String voucherDesc; + + @Schema(description = "文件凭证(逗号隔开)") + private String imgUrls; + + public String getBizName() { + return bizName; + } + + public void setBizName(String bizName) { + this.bizName = bizName; + } + + public Long getRefundIntervertionId() { + return refundIntervertionId; + } + + public void setRefundIntervertionId(Long refundIntervertionId) { + this.refundIntervertionId = refundIntervertionId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public String getVoucherDesc() { + return voucherDesc; + } + + public void setVoucherDesc(String voucherDesc) { + this.voucherDesc = voucherDesc; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + @Override + public String toString() { + return "OrderRefundInterventionVO{" + + "refundIntervertionId=" + refundIntervertionId + + ",refundId=" + refundId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",bizId=" + bizId + + ",sysType=" + sysType + + ",voucherDesc=" + voucherDesc + + ",imgUrls=" + imgUrls + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundSettlementVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundSettlementVO.java new file mode 100644 index 0000000..f406735 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundSettlementVO.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 退款支付结算单据VO + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderRefundSettlementVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "退款结算单据id") + private Long settlementId; + + @Schema(description = "订单支付单号") + private Long payId; + + @Schema(description = "订单编号") + private Long orderId; + + @Schema(description = "退款单编号(本系统退款单号)") + private Long refundId; + + @Schema(description = "用户ID") + private Long userId; + + @Schema(description = "微信/支付宝退款单号(支付平台退款单号)") + private String bizRefundNo; + + @Schema(description = "支付方式(1:微信支付 2支付宝支付)") + private Integer payType; + + @Schema(description = "退款状态(1:申请中 2:已完成 -1失败)") + private Integer refundStatus; + + @Schema(description = "退款金额") + private Long refundAmount; + + @Schema(description = "订单总额") + private Long orderTotalAmount; + + @Schema(description = "版本号") + private Integer version; + + public Long getSettlementId() { + return settlementId; + } + + public void setSettlementId(Long settlementId) { + this.settlementId = settlementId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getBizRefundNo() { + return bizRefundNo; + } + + public void setBizRefundNo(String bizRefundNo) { + this.bizRefundNo = bizRefundNo; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Long getOrderTotalAmount() { + return orderTotalAmount; + } + + public void setOrderTotalAmount(Long orderTotalAmount) { + this.orderTotalAmount = orderTotalAmount; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + @Override + public String toString() { + return "OrderRefundSettlementVO{" + + "settlementId=" + settlementId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",payId=" + payId + + ",orderId=" + orderId + + ",refundId=" + refundId + + ",userId=" + userId + + ",bizRefundNo=" + bizRefundNo + + ",payType=" + payType + + ",refundStatus=" + refundStatus + + ",refundAmount=" + refundAmount + + ",orderTotalAmount=" + orderTotalAmount + + ",version=" + version + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundVO.java new file mode 100644 index 0000000..f173c60 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundVO.java @@ -0,0 +1,913 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.order.vo.RefundOrderItemVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单退款记录信息VO + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderRefundVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "记录ID") + private Long refundId; + + @Schema(description = "支付系统 0默认1通联") + private Integer paySysType; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "买家ID") + private Long userId; + + @Schema(description = "订单号") + private Long orderId; + + @Schema(description = "订单项ID(0:为全部订单项)") + private Long orderItemId; + + @Schema(description = "退货数量(0:为全部订单项)") + private Integer refundCount; + + @Schema(description = "退还积分") + private Long refundScore; + + @Schema(description = "退款金额") + private Long refundAmount; + + @Schema(description = "退回的商家采购金额,通联支付独有") + private Long allinpayRefundPurchaseAmount; + + @Schema(description = "平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)") + private Long platformRefundAmount; + + @Schema(description = "平台佣金退款金额") + private Long platformRefundCommission; + + @Schema(description = "退款单总分销金额") + private Long distributionTotalAmount; + + @Schema(description = "退款单类型(1:整单退款,2:单个物品退款)") + private Integer refundType; + + @Schema(description = "申请类型:1,仅退款,2退款退货") + private Integer applyType; + + @Schema(description = "是否接收到商品(1:已收到,0:未收到)") + private Integer isReceived; + + @Schema(description = "退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)") + private Integer closeType; + + @Schema(description = "处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType") + private Integer returnMoneySts; + + @Schema(description = "申请原因") + private Integer buyerReason; + + @Schema(description = "申请原因 中文描述") + private String buyerReasonValue; + + @Schema(description = "申请说明") + private String buyerDesc; + + @Schema(description = "联系方式(退款时留下的手机号码)") + private String buyerMobile; + + @Schema(description = "文件凭证(逗号隔开)") + private String imgUrls; + + @Schema(description = "店铺/供应商文件凭证(逗号隔开)") + private String shopImgUrls; + + @Schema(description = "超时时间(超过该时间不处理,系统将自动处理)(保留字段)") + private Date overTime; + + @Schema(description = "拒绝原因") + private String rejectMessage; + + @Schema(description = "卖家备注") + private String sellerMsg; + + @Schema(description = "受理时间") + private Date handelTime; + + @Schema(description = "发货时间") + private Date deliveryTime; + + @Schema(description = "收货时间") + private Date receiveTime; + + @Schema(description = "关闭时间") + private Date closeTime; + + @Schema(description = "移交供应商时间") + private Date supplierTime; + + @Schema(description = "确定时间(确定退款时间)") + private Date decisionTime; + + @Schema(description = "退款时间") + private Date refundTime; + + @Schema(description = "付款时间") + private Date payTime; + + @Schema(description = "订单实付金额") + private Long actualTotal; + + @Schema(description = "订单实付积分") + private Long orderScore; + + @Schema(description = "订单状态") + private Integer orderStatus; + + @Schema(description = "退款状态") + private Integer refundStatus; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "支付的时候,支付id") + private Long payId; + + @Schema(description = "订单支付ids") + private String payIds; + + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "订单项") + private List orderItems; + + @Schema(description = "退款地址信息") + private OrderRefundAddrVO orderRefundAddr; + + /** + * 是否为未成团而退款的团购订单 + */ + private Integer unSuccessGroupOrder; + + @NotNull(message = "供应商id") + private Long supplierId; + + @Schema(description = "供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝") + private Integer supplierHandleStatus; + + @Schema(description = "采购退款金额") + private Long purchaseRefundAmount; + + @Schema(description = "采购的平台佣金退款金额") + private Long purPlatformRefundCommission; + + @Schema(description = "订单运费") + private Long freightAmount; + + @Schema(description = "供应商订单运费") + private Long supplierFreightAmount; + + @Schema(description = "是否待采购 1.是 0.否") + private Integer waitPurchase; + + @Schema(description = "订单项采购价") + private Long itemPurchaseAmount; + + + @Schema(description = "退款退回的赠品订单项ids") + private String returnGiveawayIds; + + @Schema(description = "当前退款的实付金额(实付金额减去不退回赠品的金额)") + private Long refundActualTotal; + + @Schema(description = "平台运费减免金额") + private Long platformFreeFreightAmount; + + @Schema(description = "预售类型 -1.未开启预售 0.全款预售类型 1.定金预售") + private Integer preSaleType; + + /** + * 最后一单 + */ + private Boolean lastOrder; + + /** + * 商家备注信息(退款单移交供应商处理时保存) + */ + @Hidden + private String shopSellerMsg; + + @Schema(description = "平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功") + private Integer platformInterventionStatus; + + @Schema(description = "用户申请介入理由") + private String applyInterventionReason; + + @Schema(description = "用户申请介入凭证") + private String applyInterventionImgUrls; + + @Schema(description = "平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款") + private Integer interventionRefundType; + + @Schema(description = "平台介入前的退款金额") + private Long afterInterventionRefundAmount; + + @Schema(description = "平台留言") + private String platformMessage; + + @Schema(description = "申请介入时间") + private Date applyInterventionTime; + + @Schema(description = "用户/商家/供应商补充凭证截至时间,平台开始处理时间") + private Date interventionEndTime; + + @Schema(description = "平台介入处理截至时间") + private Date platformProcessingEndTime; + + @Schema(description = "介入完成时间") + private Date interventionFinishTime; + + @Schema(description = "平台介入凭证列表") + private List orderRefundInterventionList; + + @Schema(description = "能否申请平台介入or申请退款") + private Boolean canApplyRefund; + + public Boolean getCanApplyRefund() { + return canApplyRefund; + } + + public void setCanApplyRefund(Boolean canApplyRefund) { + this.canApplyRefund = canApplyRefund; + } + + public Date getPlatformProcessingEndTime() { + return platformProcessingEndTime; + } + + public void setPlatformProcessingEndTime(Date platformProcessingEndTime) { + this.platformProcessingEndTime = platformProcessingEndTime; + } + + public Date getInterventionEndTime() { + return interventionEndTime; + } + + public void setInterventionEndTime(Date interventionEndTime) { + this.interventionEndTime = interventionEndTime; + } + + public String getShopImgUrls() { + return shopImgUrls; + } + + public void setShopImgUrls(String shopImgUrls) { + this.shopImgUrls = shopImgUrls; + } + + public String getApplyInterventionImgUrls() { + return applyInterventionImgUrls; + } + + public void setApplyInterventionImgUrls(String applyInterventionImgUrls) { + this.applyInterventionImgUrls = applyInterventionImgUrls; + } + + public List getOrderRefundInterventionList() { + return orderRefundInterventionList; + } + + public void setOrderRefundInterventionList(List orderRefundInterventionList) { + this.orderRefundInterventionList = orderRefundInterventionList; + } + + public Integer getPlatformInterventionStatus() { + return platformInterventionStatus; + } + + public void setPlatformInterventionStatus(Integer platformInterventionStatus) { + this.platformInterventionStatus = platformInterventionStatus; + } + + public String getApplyInterventionReason() { + return applyInterventionReason; + } + + public void setApplyInterventionReason(String applyInterventionReason) { + this.applyInterventionReason = applyInterventionReason; + } + + public Integer getInterventionRefundType() { + return interventionRefundType; + } + + public void setInterventionRefundType(Integer interventionRefundType) { + this.interventionRefundType = interventionRefundType; + } + + public Long getAfterInterventionRefundAmount() { + return afterInterventionRefundAmount; + } + + public void setAfterInterventionRefundAmount(Long afterInterventionRefundAmount) { + this.afterInterventionRefundAmount = afterInterventionRefundAmount; + } + + public String getPlatformMessage() { + return platformMessage; + } + + public void setPlatformMessage(String platformMessage) { + this.platformMessage = platformMessage; + } + + public Date getApplyInterventionTime() { + return applyInterventionTime; + } + + public void setApplyInterventionTime(Date applyInterventionTime) { + this.applyInterventionTime = applyInterventionTime; + } + + + public Date getInterventionFinishTime() { + return interventionFinishTime; + } + + public void setInterventionFinishTime(Date interventionFinishTime) { + this.interventionFinishTime = interventionFinishTime; + } + public Long getAllinpayRefundPurchaseAmount() { + return allinpayRefundPurchaseAmount; + } + + public void setAllinpayRefundPurchaseAmount(Long allinpayRefundPurchaseAmount) { + this.allinpayRefundPurchaseAmount = allinpayRefundPurchaseAmount; + } + + public Long getRefundActualTotal() { + return refundActualTotal; + } + + public void setRefundActualTotal(Long refundActualTotal) { + this.refundActualTotal = refundActualTotal; + } + + public String getReturnGiveawayIds() { + return returnGiveawayIds; + } + + public void setReturnGiveawayIds(String returnGiveawayIds) { + this.returnGiveawayIds = returnGiveawayIds; + } + + public String getPayIds() { + return payIds; + } + + public void setPayIds(String payIds) { + this.payIds = payIds; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Long getItemPurchaseAmount() { + return itemPurchaseAmount; + } + + public void setItemPurchaseAmount(Long itemPurchaseAmount) { + this.itemPurchaseAmount = itemPurchaseAmount; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Integer getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Integer waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Date getSupplierTime() { + return supplierTime; + } + + public void setSupplierTime(Date supplierTime) { + this.supplierTime = supplierTime; + } + + public Long getPurPlatformRefundCommission() { + return purPlatformRefundCommission; + } + + public void setPurPlatformRefundCommission(Long purPlatformRefundCommission) { + this.purPlatformRefundCommission = purPlatformRefundCommission; + } + + public Long getPurchaseRefundAmount() { + return purchaseRefundAmount; + } + + public void setPurchaseRefundAmount(Long purchaseRefundAmount) { + this.purchaseRefundAmount = purchaseRefundAmount; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSupplierHandleStatus() { + return supplierHandleStatus; + } + + public void setSupplierHandleStatus(Integer supplierHandleStatus) { + this.supplierHandleStatus = supplierHandleStatus; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Integer getRefundCount() { + return refundCount; + } + + public void setRefundCount(Integer refundCount) { + this.refundCount = refundCount; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Long getPlatformRefundAmount() { + return platformRefundAmount; + } + + public void setPlatformRefundAmount(Long platformRefundAmount) { + this.platformRefundAmount = platformRefundAmount; + } + + public Long getPlatformRefundCommission() { + return platformRefundCommission; + } + + public void setPlatformRefundCommission(Long platformRefundCommission) { + this.platformRefundCommission = platformRefundCommission; + } + + public Long getDistributionTotalAmount() { + return distributionTotalAmount; + } + + public void setDistributionTotalAmount(Long distributionTotalAmount) { + this.distributionTotalAmount = distributionTotalAmount; + } + + public Integer getRefundType() { + return refundType; + } + + public void setRefundType(Integer refundType) { + this.refundType = refundType; + } + + public Integer getApplyType() { + return applyType; + } + + public void setApplyType(Integer applyType) { + this.applyType = applyType; + } + + public Integer getIsReceived() { + return isReceived; + } + + public void setIsReceived(Integer isReceived) { + this.isReceived = isReceived; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + public Integer getBuyerReason() { + return buyerReason; + } + + public void setBuyerReason(Integer buyerReason) { + this.buyerReason = buyerReason; + } + + public String getBuyerDesc() { + return buyerDesc; + } + + public void setBuyerDesc(String buyerDesc) { + this.buyerDesc = buyerDesc; + } + + public String getBuyerMobile() { + return buyerMobile; + } + + public void setBuyerMobile(String buyerMobile) { + this.buyerMobile = buyerMobile; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public Date getOverTime() { + return overTime; + } + + public void setOverTime(Date overTime) { + this.overTime = overTime; + } + + public String getRejectMessage() { + return rejectMessage; + } + + public void setRejectMessage(String rejectMessage) { + this.rejectMessage = rejectMessage; + } + + public String getSellerMsg() { + return sellerMsg; + } + + public void setSellerMsg(String sellerMsg) { + this.sellerMsg = sellerMsg; + } + + public Date getHandelTime() { + return handelTime; + } + + public void setHandelTime(Date handelTime) { + this.handelTime = handelTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public Date getCloseTime() { + return closeTime; + } + + public void setCloseTime(Date closeTime) { + this.closeTime = closeTime; + } + + public Date getDecisionTime() { + return decisionTime; + } + + public void setDecisionTime(Date decisionTime) { + this.decisionTime = decisionTime; + } + + public Date getRefundTime() { + return refundTime; + } + + public void setRefundTime(Date refundTime) { + this.refundTime = refundTime; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public Long getRefundScore() { + return refundScore; + } + + public void setRefundScore(Long refundScore) { + this.refundScore = refundScore; + } + + public String getBuyerReasonValue() { + return buyerReasonValue; + } + + public void setBuyerReasonValue(String buyerReasonValue) { + this.buyerReasonValue = buyerReasonValue; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + public OrderRefundAddrVO getOrderRefundAddr() { + return orderRefundAddr; + } + + public void setOrderRefundAddr(OrderRefundAddrVO orderRefundAddr) { + this.orderRefundAddr = orderRefundAddr; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getUnSuccessGroupOrder() { + return unSuccessGroupOrder; + } + + public void setUnSuccessGroupOrder(Integer unSuccessGroupOrder) { + this.unSuccessGroupOrder = unSuccessGroupOrder; + } + + public Long getSupplierFreightAmount() { + return supplierFreightAmount; + } + + public void setSupplierFreightAmount(Long supplierFreightAmount) { + this.supplierFreightAmount = supplierFreightAmount; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Boolean isLastOrder() { + return lastOrder; + } + + public void setLastOrder(Boolean lastOrder) { + this.lastOrder = lastOrder; + } + + public Boolean getLastOrder() { + return lastOrder; + } + + public String getShopSellerMsg() { + return shopSellerMsg; + } + + public void setShopSellerMsg(String shopSellerMsg) { + this.shopSellerMsg = shopSellerMsg; + } + + @Override + public String toString() { + return "OrderRefundVO{" + + "refundId=" + refundId + + ", paySysType=" + paySysType + + ", shopId=" + shopId + + ", userId=" + userId + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", refundCount=" + refundCount + + ", refundScore=" + refundScore + + ", refundAmount=" + refundAmount + + ", allinpayRefundPurchaseAmount=" + allinpayRefundPurchaseAmount + + ", platformRefundAmount=" + platformRefundAmount + + ", platformRefundCommission=" + platformRefundCommission + + ", distributionTotalAmount=" + distributionTotalAmount + + ", refundType=" + refundType + + ", applyType=" + applyType + + ", isReceived=" + isReceived + + ", closeType=" + closeType + + ", returnMoneySts=" + returnMoneySts + + ", buyerReason=" + buyerReason + + ", buyerReasonValue='" + buyerReasonValue + '\'' + + ", buyerDesc='" + buyerDesc + '\'' + + ", buyerMobile='" + buyerMobile + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", shopImgUrls='" + shopImgUrls + '\'' + + ", overTime=" + overTime + + ", rejectMessage='" + rejectMessage + '\'' + + ", sellerMsg='" + sellerMsg + '\'' + + ", handelTime=" + handelTime + + ", deliveryTime=" + deliveryTime + + ", receiveTime=" + receiveTime + + ", closeTime=" + closeTime + + ", supplierTime=" + supplierTime + + ", decisionTime=" + decisionTime + + ", refundTime=" + refundTime + + ", payTime=" + payTime + + ", actualTotal=" + actualTotal + + ", orderScore=" + orderScore + + ", orderStatus=" + orderStatus + + ", refundStatus=" + refundStatus + + ", shopName='" + shopName + '\'' + + ", payId=" + payId + + ", payIds='" + payIds + '\'' + + ", payType=" + payType + + ", orderItems=" + orderItems + + ", orderRefundAddr=" + orderRefundAddr + + ", unSuccessGroupOrder=" + unSuccessGroupOrder + + ", supplierId=" + supplierId + + ", supplierHandleStatus=" + supplierHandleStatus + + ", purchaseRefundAmount=" + purchaseRefundAmount + + ", purPlatformRefundCommission=" + purPlatformRefundCommission + + ", freightAmount=" + freightAmount + + ", supplierFreightAmount=" + supplierFreightAmount + + ", waitPurchase=" + waitPurchase + + ", itemPurchaseAmount=" + itemPurchaseAmount + + ", returnGiveawayIds='" + returnGiveawayIds + '\'' + + ", refundActualTotal=" + refundActualTotal + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", preSaleType=" + preSaleType + + ", lastOrder=" + lastOrder + + ", shopSellerMsg='" + shopSellerMsg + '\'' + + ", platformInterventionStatus=" + platformInterventionStatus + + ", applyInterventionReason='" + applyInterventionReason + '\'' + + ", applyInterventionImgUrls='" + applyInterventionImgUrls + '\'' + + ", interventionRefundType=" + interventionRefundType + + ", afterInterventionRefundAmount=" + afterInterventionRefundAmount + + ", platformMessage='" + platformMessage + '\'' + + ", applyInterventionTime=" + applyInterventionTime + + ", interventionEndTime=" + interventionEndTime + + ", platformProcessingEndTime=" + platformProcessingEndTime + + ", interventionFinishTime=" + interventionFinishTime + + ", orderRefundInterventionList=" + orderRefundInterventionList + + ", canApplyRefund=" + canApplyRefund + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderSettlementVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderSettlementVO.java new file mode 100644 index 0000000..72010aa --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderSettlementVO.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单结算表VO + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderSettlementVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "支付结算单据ID") + private Long settlementId; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "支付单号") + private Long payId; + + @Schema(description = "是否清算 0:否 1:是") + private Integer isClearing; + + @Schema(description = "支付积分") + private Long payScore; + + @Schema(description = "支付金额") + private Long payAmount; + + @Schema(description = "清算时间") + private Date clearingTime; + + @Schema(description = "版本号") + private Integer version; + + public Long getSettlementId() { + return settlementId; + } + + public void setSettlementId(Long settlementId) { + this.settlementId = settlementId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Integer getIsClearing() { + return isClearing; + } + + public void setIsClearing(Integer isClearing) { + this.isClearing = isClearing; + } + + public Long getPayScore() { + return payScore; + } + + public void setPayScore(Long payScore) { + this.payScore = payScore; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Date getClearingTime() { + return clearingTime; + } + + public void setClearingTime(Date clearingTime) { + this.clearingTime = clearingTime; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + @Override + public String toString() { + return "OrderSettlementVO{" + + "settlementId=" + settlementId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",orderId=" + orderId + + ",payId=" + payId + + ",isClearing=" + isClearing + + ",payScore=" + payScore + + ",payAmount=" + payAmount + + ",clearingTime=" + clearingTime + + ",version=" + version + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderShopVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderShopVO.java new file mode 100644 index 0000000..80bf718 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderShopVO.java @@ -0,0 +1,638 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.order.vo.*; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单下的每个店铺 + * + * @author FrozenWatermelon + */ +public class OrderShopVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺ID + **/ + @Schema(description = "店铺id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + + /** + * 店铺名称 + **/ + @Schema(description = "店铺名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String shopName; + + @Schema(description = "实际总值", requiredMode = Schema.RequiredMode.REQUIRED) + private Long actualTotal; + + @Schema(description = "商品总值", requiredMode = Schema.RequiredMode.REQUIRED) + private Long total; + + @Schema(description = "商品总数", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer totalNum; + + @Schema(description = "地址Dto", requiredMode = Schema.RequiredMode.REQUIRED) + private OrderAddrVO orderAddr; + + @Schema(description = "支付方式", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer payType; + + @Schema(description = "产品信息", requiredMode = Schema.RequiredMode.REQUIRED) + private List orderItems; + + @Schema(description = "运费", requiredMode = Schema.RequiredMode.REQUIRED) + private Long transfee; + + @Schema(description = "优惠总额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long reduceAmount; + + @Schema(description = "促销活动优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long discountMoney; + + @Schema(description = "店铺优惠券优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopCouponMoney; + + @Schema(description = "订单创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date createTime; + + @Schema(description = "订单付款时间") + private Date payTime; + + @Schema(description = "订单发货时间") + private Date deliveryTime; + + @Schema(description = "订单完成时间") + private Date finallyTime; + + @Schema(description = "订单取消时间") + private Date cancelTime; + + @Schema(description = "订单更新时间") + private Date updateTime; + + @Schema(description = "订单备注信息", requiredMode = Schema.RequiredMode.REQUIRED) + private String remarks; + + @Schema(description = "配送类型 1:快递 2:自提 3:无需快递", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer deliveryType; + + @Schema(description = "订单类型(1团购订单 2秒杀订单)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer orderType; + + @Schema(description = "订单状态", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer status; + + @Schema(description = "是否为虚拟商品订单 1.是 0.否") + private Integer orderMold; + + @Schema(description = "店铺优惠金额") + private Long shopAmount; + + @Schema(description = "积分抵扣金额") + private Long scoreAmount; + + @Schema(description = "会员折扣金额") + private Long memberAmount; + + @Schema(description = "平台优惠券优惠金额") + private Long platformCouponAmount; + + @Schema(description = "平台运费减免金额") + private Long platformFreeFreightAmount; + + @Schema(description = "商家运费减免金额") + private Long freeFreightAmount; + + @Schema(description = "订单积分") + private Long orderScore; + + @Schema(description = "能否退款", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean canRefund; + + @Schema(description = "能否整单退款", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean canAllRefund; + + @Schema(description = "最终的退款id") + private Long finalRefundId; + + @Schema(description = "当前可退款金额") + private Long canRefundAmount; + + @Schema(description = "店铺改价优惠金额") + private Long shopChangeFreeAmount; + + @Schema(description = "能否修改或者查看物流 1.可以,2.不可以") + private Integer updateOrViewDeliveryInfo; + + @Schema(description = "订单发票id") + private Long orderInvoiceId; + + @Schema(description = "预售信息") + private OrderPreSaleInfoVO orderPreSaleInfoVO; + + @Schema(description = "预售类型 -1.未开启预售 0.全款预售类型 1.定金预售") + private Integer preSaleType; + + @Schema(description = "套餐优惠金额") + private Long shopComboAmount; + + @Schema(description = "自提信息") + private OrderSelfStationVO orderSelfStationVO; + + @Schema(description = "订单自动取消时间") + private Date autoCancelTime; + + @Schema(description = "订单卡券信息") + private List virtualInfoList; + + /** + * 核销次数 -1.多次核销 0.无需核销 1.单次核销 + */ + private Integer writeOffNum; + + /** + * 多次核销次数 -1.无限次 + */ + private Integer writeOffMultipleCount; + + /** + * 核销开始时间 + */ + private Date writeOffStart; + + /** + * 核销结束时间 + */ + private Date writeOffEnd; + + /** + * 订单核销状态 0.待核销 1.核销完成 + */ + private Integer writeOffStatus; + + @Schema(description = "订单退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)") + private Integer refundStatus; + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Integer getWriteOffStatus() { + return writeOffStatus; + } + + public void setWriteOffStatus(Integer writeOffStatus) { + this.writeOffStatus = writeOffStatus; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + + public List getVirtualInfoList() { + return virtualInfoList; + } + + public void setVirtualInfoList(List virtualInfoList) { + this.virtualInfoList = virtualInfoList; + } + + public OrderSelfStationVO getOrderSelfStationVO() { + return orderSelfStationVO; + } + + public void setOrderSelfStationVO(OrderSelfStationVO orderSelfStationVO) { + this.orderSelfStationVO = orderSelfStationVO; + } + + public Long getShopComboAmount() { + return shopComboAmount; + } + + public void setShopComboAmount(Long shopComboAmount) { + this.shopComboAmount = shopComboAmount; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Integer getOrderMold() { + return orderMold; + } + + public void setOrderMold(Integer orderMold) { + this.orderMold = orderMold; + } + + public OrderPreSaleInfoVO getOrderPreSaleInfoVO() { + return orderPreSaleInfoVO; + } + + public void setOrderPreSaleInfoVO(OrderPreSaleInfoVO orderPreSaleInfoVO) { + this.orderPreSaleInfoVO = orderPreSaleInfoVO; + } + + public Long getShopChangeFreeAmount() { + return shopChangeFreeAmount; + } + + public void setShopChangeFreeAmount(Long shopChangeFreeAmount) { + this.shopChangeFreeAmount = shopChangeFreeAmount; + } + + public Integer getUpdateOrViewDeliveryInfo() { + return updateOrViewDeliveryInfo; + } + + public void setUpdateOrViewDeliveryInfo(Integer updateOrViewDeliveryInfo) { + this.updateOrViewDeliveryInfo = updateOrViewDeliveryInfo; + } + + public Long getScoreAmount() { + return scoreAmount; + } + + public void setScoreAmount(Long scoreAmount) { + this.scoreAmount = scoreAmount; + } + + public Long getMemberAmount() { + return memberAmount; + } + + public void setMemberAmount(Long memberAmount) { + this.memberAmount = memberAmount; + } + + public Long getPlatformCouponAmount() { + return platformCouponAmount; + } + + public void setPlatformCouponAmount(Long platformCouponAmount) { + this.platformCouponAmount = platformCouponAmount; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public Long getShopAmount() { + return shopAmount; + } + + public void setShopAmount(Long shopAmount) { + this.shopAmount = shopAmount; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Integer getTotalNum() { + return totalNum; + } + + public void setTotalNum(Integer totalNum) { + this.totalNum = totalNum; + } + + public OrderAddrVO getOrderAddr() { + return orderAddr; + } + + public void setOrderAddr(OrderAddrVO orderAddr) { + this.orderAddr = orderAddr; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public Long getTransfee() { + return transfee; + } + + public void setTransfee(Long transfee) { + this.transfee = transfee; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Long getDiscountMoney() { + return discountMoney; + } + + public void setDiscountMoney(Long discountMoney) { + this.discountMoney = discountMoney; + } + + public Long getShopCouponMoney() { + return shopCouponMoney; + } + + public void setShopCouponMoney(Long shopCouponMoney) { + this.shopCouponMoney = shopCouponMoney; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Date getFinallyTime() { + return finallyTime; + } + + public void setFinallyTime(Date finallyTime) { + this.finallyTime = finallyTime; + } + + public Date getCancelTime() { + return cancelTime; + } + + public void setCancelTime(Date cancelTime) { + this.cancelTime = cancelTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Boolean getCanRefund() { + return canRefund; + } + + public void setCanRefund(Boolean canRefund) { + this.canRefund = canRefund; + } + + public Boolean getCanAllRefund() { + return canAllRefund; + } + + public void setCanAllRefund(Boolean canAllRefund) { + this.canAllRefund = canAllRefund; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Long getFinalRefundId() { + return finalRefundId; + } + + public void setFinalRefundId(Long finalRefundId) { + this.finalRefundId = finalRefundId; + } + + public Long getCanRefundAmount() { + return canRefundAmount; + } + + public void setCanRefundAmount(Long canRefundAmount) { + this.canRefundAmount = canRefundAmount; + } + + public Long getOrderInvoiceId() { + return orderInvoiceId; + } + + public void setOrderInvoiceId(Long orderInvoiceId) { + this.orderInvoiceId = orderInvoiceId; + } + + public Date getAutoCancelTime() { + return autoCancelTime; + } + + public void setAutoCancelTime(Date autoCancelTime) { + this.autoCancelTime = autoCancelTime; + } + + @Override + public String toString() { + return "OrderShopVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", actualTotal=" + actualTotal + + ", total=" + total + + ", totalNum=" + totalNum + + ", orderAddr=" + orderAddr + + ", payType=" + payType + + ", orderItems=" + orderItems + + ", transfee=" + transfee + + ", reduceAmount=" + reduceAmount + + ", discountMoney=" + discountMoney + + ", shopCouponMoney=" + shopCouponMoney + + ", createTime=" + createTime + + ", payTime=" + payTime + + ", deliveryTime=" + deliveryTime + + ", finallyTime=" + finallyTime + + ", cancelTime=" + cancelTime + + ", updateTime=" + updateTime + + ", remarks='" + remarks + '\'' + + ", deliveryType=" + deliveryType + + ", orderType=" + orderType + + ", status=" + status + + ", orderMold=" + orderMold + + ", shopAmount=" + shopAmount + + ", scoreAmount=" + scoreAmount + + ", memberAmount=" + memberAmount + + ", platformCouponAmount=" + platformCouponAmount + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", freeFreightAmount=" + freeFreightAmount + + ", orderScore=" + orderScore + + ", canRefund=" + canRefund + + ", canAllRefund=" + canAllRefund + + ", finalRefundId=" + finalRefundId + + ", canRefundAmount=" + canRefundAmount + + ", shopChangeFreeAmount=" + shopChangeFreeAmount + + ", updateOrViewDeliveryInfo=" + updateOrViewDeliveryInfo + + ", orderInvoiceId=" + orderInvoiceId + + ", orderPreSaleInfoVO=" + orderPreSaleInfoVO + + ", preSaleType=" + preSaleType + + ", shopComboAmount=" + shopComboAmount + + ", orderSelfStationVO=" + orderSelfStationVO + + ", autoCancelTime=" + autoCancelTime + + ", virtualInfoList=" + virtualInfoList + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", writeOffStatus=" + writeOffStatus + + ", refundStatus=" + refundStatus + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderExcelVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderExcelVO.java new file mode 100644 index 0000000..f37355d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderExcelVO.java @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单excel信息 + * + * @author YXF + * @date 2020-3-9 + */ +public class PurchaseOrderExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "订单信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + + @ExcelProperty(value = {"订单信息", "序号"}, index = 0) + private String seq; + + @ExcelProperty(value = {"订单信息", "订单ID"}, index = 1) + private String purchaseOrderId; + + @DateTimeFormat("yyyy-MM-dd") + @ExcelProperty(value = {"订单信息", "下单时间"}, index = 2) + private Date createTime; + + @ExcelProperty(value = {"订单信息", "配送类型"}, index = 3) + private String deliveryType; + + @ExcelProperty(value = {"订单信息", "收货人姓名"}, index = 4) + private String consignee; + + @ExcelProperty(value = {"订单信息", "收货人手机"}, index = 5) + private String mobile; + + @ExcelProperty(value = {"订单信息", "收货地址"}, index = 6) + private String receivingAddr; + + @ExcelProperty(value = {"订单信息", "订单总额"}, index = 7) + private String totalAmount; + + @ExcelProperty(value = {"订单信息", "支付类型"}, index = 8) + private String payType; + + @ExcelProperty(value = {"订单信息", "订单状态"}, index = 9) + private String status; + + @ExcelProperty({"订单项信息", "商品名称"}) + private String spuName; + + @ExcelProperty({"订单项信息", "sku名称"}) + private String skuName; + + @ExcelProperty({"订单项信息", "商品价格"}) + private String purchasePrice; + + @ExcelProperty({"订单项信息", "商品数量"}) + private Integer purchaseStock; + + @ExcelProperty({"订单项信息", "商品总金额"}) + private String purchaseAmount; + + @ExcelIgnore + private List orderItemLangList; + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(String purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(String deliveryType) { + this.deliveryType = deliveryType; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getReceivingAddr() { + return receivingAddr; + } + + public void setReceivingAddr(String receivingAddr) { + this.receivingAddr = receivingAddr; + } + + public String getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(String totalAmount) { + this.totalAmount = totalAmount; + } + + public String getPayType() { + return payType; + } + + public void setPayType(String payType) { + this.payType = payType; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getPurchasePrice() { + return purchasePrice; + } + + public void setPurchasePrice(String purchasePrice) { + this.purchasePrice = purchasePrice; + } + + public Integer getPurchaseStock() { + return purchaseStock; + } + + public void setPurchaseStock(Integer purchaseStock) { + this.purchaseStock = purchaseStock; + } + + public String getPurchaseAmount() { + return purchaseAmount; + } + + public void setPurchaseAmount(String purchaseAmount) { + this.purchaseAmount = purchaseAmount; + } + + public List getOrderItemLangList() { + return orderItemLangList; + } + + public void setOrderItemLangList(List orderItemLangList) { + this.orderItemLangList = orderItemLangList; + } + + @Override + public String toString() { + return "OrderExcelVO{" + + "seq='" + seq + '\'' + + ", purchaseOrderId=" + purchaseOrderId + + ", createTime=" + createTime + + ", deliveryType='" + deliveryType + '\'' + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", receivingAddr='" + receivingAddr + '\'' + + ", total=" + totalAmount + +// ", freightAmount=" + freightAmount + + ", payType=" + payType + + ", status=" + status + + ", spuName=" + spuName + + ", skuName=" + skuName + + ", price=" + purchasePrice + + ", count=" + purchaseStock + + ", spuTotalAmount=" + purchaseAmount + + ", orderItemLangList='" + orderItemLangList + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderItemLangVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderItemLangVO.java new file mode 100644 index 0000000..461ac9e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderItemLangVO.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单项-国际化VO + * + * @author lhd + * @date 2022-06-27 17:49:07 + */ +public class PurchaseOrderItemLangVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单项ID") + private Long purchaseItemId; + + @Schema(description = "语言 1.中文 2.英文") + private Integer lang; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "sku名称") + private String skuName; + + public Long getPurchaseItemId() { + return purchaseItemId; + } + + public void setPurchaseItemId(Long purchaseItemId) { + this.purchaseItemId = purchaseItemId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + @Override + public String toString() { + return "PurchaseOrderItemLangVO{" + + "purchaseItemId=" + purchaseItemId + + ",lang=" + lang + + ",spuName=" + spuName + + ",skuName=" + skuName + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderItemVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderItemVO.java new file mode 100644 index 0000000..5402b76 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderItemVO.java @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.order.vo.OrderSkuLangVO; +import com.tmerclub.cloud.common.order.vo.OrderSpuLangVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import com.tmerclub.cloud.order.model.PurchaseOrderItemLang; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 采购商品VO + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public class PurchaseOrderItemVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long purchaseItemId; + + @Schema(description = "id") + private Long orderItemId; + + @Schema(description = "供应商品id") + private Long supplierSpuId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "sku id") + private Long skuId; + + @Schema(description = "采购金额") + private Long purchaseAmount; + + @Schema(description = "采购价") + private Long purchasePrice; + + @Schema(description = "采购库存数量") + private Integer purchaseStock; + + @Schema(description = "实际库存数量") + private Integer actualStock; + + @Schema(description = "改变库存数量") + private Integer changeStock; + + @Schema(description = "状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成") + private Integer status; + + @Schema(description = "sku编码") + private String partyCode; + + @Schema(description = "sku编码") + private String pic; + + @Schema(description = "sku规格信息列表") + private List skuLangList; + + @Schema(description = "spu名称列表") + private List spuLangList; + + @Schema(description = "spu名称列表") + private List purchaseOrderItemLangList; + + /** + * 商品名称 + */ + @Schema(description = "商品名称") + private String spuName; + + /** + * sku名称 + */ + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "发货改变的数量") + private Integer changeNum; + + @Schema(description = "待发货数量") + private Integer beDeliveredNum; + + @Schema(description = "订单地址id") + private Long orderAddrId; + + @Schema(description = "发货方式") + private Long deliveryType; + + public Integer getChangeStock() { + return changeStock; + } + + public void setChangeStock(Integer changeStock) { + this.changeStock = changeStock; + } + + public Long getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Long deliveryType) { + this.deliveryType = deliveryType; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getOrderAddrId() { + return orderAddrId; + } + + public void setOrderAddrId(Long orderAddrId) { + this.orderAddrId = orderAddrId; + } + + public Integer getBeDeliveredNum() { + return beDeliveredNum; + } + + public void setBeDeliveredNum(Integer beDeliveredNum) { + this.beDeliveredNum = beDeliveredNum; + } + + public Integer getChangeNum() { + return changeNum; + } + + public void setChangeNum(Integer changeNum) { + this.changeNum = changeNum; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public List getPurchaseOrderItemLangList() { + return purchaseOrderItemLangList; + } + + public void setPurchaseOrderItemLangList(List purchaseOrderItemLangList) { + this.purchaseOrderItemLangList = purchaseOrderItemLangList; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public List getSkuLangList() { + return skuLangList; + } + + public void setSkuLangList(List skuLangList) { + this.skuLangList = skuLangList; + } + + public List getSpuLangList() { + return spuLangList; + } + + public void setSpuLangList(List spuLangList) { + this.spuLangList = spuLangList; + } + + public Long getPurchaseItemId() { + return purchaseItemId; + } + + public void setPurchaseItemId(Long purchaseItemId) { + this.purchaseItemId = purchaseItemId; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getPurchaseAmount() { + return purchaseAmount; + } + + public void setPurchaseAmount(Long purchaseAmount) { + this.purchaseAmount = purchaseAmount; + } + + public Long getPurchasePrice() { + return purchasePrice; + } + + public void setPurchasePrice(Long purchasePrice) { + this.purchasePrice = purchasePrice; + } + + public Integer getPurchaseStock() { + return purchaseStock; + } + + public void setPurchaseStock(Integer purchaseStock) { + this.purchaseStock = purchaseStock; + } + + public Integer getActualStock() { + return actualStock; + } + + public void setActualStock(Integer actualStock) { + this.actualStock = actualStock; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "PurchaseOrderItemVO{" + + "purchaseItemId=" + purchaseItemId + + ", orderItemId=" + orderItemId + + ", supplierSpuId=" + supplierSpuId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", purchaseAmount=" + purchaseAmount + + ", purchasePrice=" + purchasePrice + + ", purchaseStock=" + purchaseStock + + ", actualStock=" + actualStock + + ", changeStock=" + changeStock + + ", status=" + status + + ", partyCode='" + partyCode + '\'' + + ", pic='" + pic + '\'' + + ", skuLangList=" + skuLangList + + ", spuLangList=" + spuLangList + + ", purchaseOrderItemLangList=" + purchaseOrderItemLangList + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", changeNum=" + changeNum + + ", beDeliveredNum=" + beDeliveredNum + + ", orderAddrId=" + orderAddrId + + ", deliveryType=" + deliveryType + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderVO.java new file mode 100644 index 0000000..d7f1c73 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderVO.java @@ -0,0 +1,356 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.api.order.vo.PurchaseOrderAddrVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 采购订单VO + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public class PurchaseOrderVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "采购id") + private Long purchaseOrderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "送达时间") + private Date deliverTime; + + @Schema(description = "配送类型 1:快递 3无需快递") + private Integer deliveryType; + + @Schema(description = "配送方式ID") + private Long purchaseOrderAddrId; + + @Schema(description = "物流单号") + private String dvyFlowId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "总采购金额") + private Double totalAmount; + + @Schema(description = "总采购库存数量") + private Integer totalStock; + + @Schema(description = "实际总库存数量") + private Integer actualTotalStock; + + @Schema(description = "状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成") + private Integer status; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "联系方式") + private String contactPhone; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "操作员工id") + private Long employeeId; + + @Schema(description = "收货人") + private String consignee; + + @Schema(description = "收货人手机号") + private String mobile; + + @Schema(description = "付款凭证图片 多个图片逗号分隔") + private String voucherImgUrls; + + @Schema(description = "采购项") + private List purchaseOrderItemList; + + @Schema(description = "订单收货地址信息") + private PurchaseOrderAddrVO purchaseOrderAddr; + + @Schema(description = "仓库id") + private Long warehouseId; + + @Schema(description = "仓库名称") + private String warehouseName; + + @Schema(description = "供应商仓库id") + private Long supplierWarehouseId; + + @Schema(description = "库存点类型(1:门店, 2:仓库)") + private Integer stockPointType; + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getVoucherImgUrls() { + return voucherImgUrls; + } + + public void setVoucherImgUrls(String voucherImgUrls) { + this.voucherImgUrls = voucherImgUrls; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + + public PurchaseOrderAddrVO getPurchaseOrderAddrVO() { + return purchaseOrderAddr; + } + + public void setPurchaseOrderAddrVO(PurchaseOrderAddrVO purchaseOrderAddr) { + this.purchaseOrderAddr = purchaseOrderAddr; + } + + public List getPurchaseOrderItemList() { + return purchaseOrderItemList; + } + + public void setPurchaseOrderItemList(List purchaseOrderItemList) { + this.purchaseOrderItemList = purchaseOrderItemList; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getDeliverTime() { + return deliverTime; + } + + public void setDeliverTime(Date deliverTime) { + this.deliverTime = deliverTime; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Long getPurchaseOrderAddrId() { + return purchaseOrderAddrId; + } + + public void setPurchaseOrderAddrId(Long purchaseOrderAddrId) { + this.purchaseOrderAddrId = purchaseOrderAddrId; + } + + public PurchaseOrderAddrVO getPurchaseOrderAddr() { + return purchaseOrderAddr; + } + + public void setPurchaseOrderAddr(PurchaseOrderAddrVO purchaseOrderAddr) { + this.purchaseOrderAddr = purchaseOrderAddr; + } + + public String getDvyFlowId() { + return dvyFlowId; + } + + public void setDvyFlowId(String dvyFlowId) { + this.dvyFlowId = dvyFlowId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Double getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Double totalAmount) { + this.totalAmount = totalAmount; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getActualTotalStock() { + return actualTotalStock; + } + + public void setActualTotalStock(Integer actualTotalStock) { + this.actualTotalStock = actualTotalStock; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public Long getSupplierWarehouseId() { + return supplierWarehouseId; + } + + public void setSupplierWarehouseId(Long supplierWarehouseId) { + this.supplierWarehouseId = supplierWarehouseId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public String getWarehouseName() { + return warehouseName; + } + + public void setWarehouseName(String warehouseName) { + this.warehouseName = warehouseName; + } + + @Override + public String toString() { + return "PurchaseOrderVO{" + + "purchaseOrderId=" + purchaseOrderId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", deliverTime=" + deliverTime + + ", deliveryType=" + deliveryType + + ", purchaseOrderAddrId=" + purchaseOrderAddrId + + ", dvyFlowId='" + dvyFlowId + '\'' + + ", supplierId=" + supplierId + + ", totalAmount=" + totalAmount + + ", totalStock=" + totalStock + + ", actualTotalStock=" + actualTotalStock + + ", status=" + status + + ", remark='" + remark + '\'' + + ", supplierName='" + supplierName + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", spuName='" + spuName + '\'' + + ", employeeId=" + employeeId + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", voucherImgUrls='" + voucherImgUrls + '\'' + + ", purchaseOrderItemList=" + purchaseOrderItemList + + ", purchaseOrderAddr=" + purchaseOrderAddr + + ", warehouseId=" + warehouseId + + ", warehouseName='" + warehouseName + '\'' + + ", supplierWarehouseId=" + supplierWarehouseId + + ", stockPointType=" + stockPointType + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/ScoreOrderExcelVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/ScoreOrderExcelVO.java new file mode 100644 index 0000000..6b8eb13 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/ScoreOrderExcelVO.java @@ -0,0 +1,326 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import com.tmerclub.cloud.common.order.vo.OrderItemLangVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单excel信息 + * + * @author YXF + * @date 2020-3-9 + */ +public class ScoreOrderExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "订单信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; + + @ExcelProperty(value = {"订单信息", "序号"}, index = 0) + private String seq; + + @ExcelProperty(value = {"订单信息", "订单ID"}, index = 1) + private String orderId; + + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") + @ExcelProperty(value = {"订单信息", "下单时间"}, index = 2) + private Date createTime; + + @ExcelProperty(value = {"订单信息", "配送类型"}, index = 3) + private String deliveryType; + + @ExcelProperty(value = {"订单信息", "收货人姓名"}, index = 4) + private String consignee; + + @ExcelProperty(value = {"订单信息", "收货人手机"}, index = 5) + private String mobile; + + @ExcelProperty(value = {"订单信息", "收货地址"}, index = 6) + private String receivingAddr; + + @ExcelProperty(value = {"订单信息", "订单总额"}, index = 7) + private String total; + + @ExcelProperty(value = {"订单信息", "运费金额"}, index = 8) + private String freightAmount; + + @ExcelProperty(value = {"订单信息", "优惠总额"}, index = 9) + private String reduceAmount; + + @ExcelProperty(value = {"订单信息", "使用积分"}, index = 10) + private String orderScore; + + @ExcelProperty(value = {"订单信息", "实际支付"}, index = 11) + private String actualTotal; + + @ExcelProperty(value = {"订单信息", "支付类型"}, index = 12) + private String payType; + + @ExcelProperty(value = {"订单信息", "订单状态"}, index = 13) + private String status; + + @ExcelProperty({"订单项信息", "商品名称"}) + private String spuName; + + @ExcelProperty({"订单项信息", "sku名称"}) + private String skuName; + + @ExcelProperty({"订单项信息", "商品价格"}) + private String price; + + @ExcelProperty({"订单项信息", "商品数量"}) + private Integer count; + + @ExcelProperty({"订单项信息", "商品总金额"}) + private String spuTotalAmount; + + @ExcelProperty({"订单项信息", "优惠金额"}) + private String shareReduce; + + @ExcelProperty({"订单项信息", "实际金额"}) + private String actualTotalItem; + + @ExcelProperty({"订单项信息", "使用积分"}) + private Long useScore; + + @ExcelIgnore + private List orderItemLangList; + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(String deliveryType) { + this.deliveryType = deliveryType; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getReceivingAddr() { + return receivingAddr; + } + + public void setReceivingAddr(String receivingAddr) { + this.receivingAddr = receivingAddr; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public String getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(String freightAmount) { + this.freightAmount = freightAmount; + } + + public String getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(String reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public String getOrderScore() { + return orderScore; + } + + public void setOrderScore(String orderScore) { + this.orderScore = orderScore; + } + + public String getActualTotal() { + return actualTotal; + } + + public void setActualTotal(String actualTotal) { + this.actualTotal = actualTotal; + } + + public String getPayType() { + return payType; + } + + public void setPayType(String payType) { + this.payType = payType; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public String getSpuTotalAmount() { + return spuTotalAmount; + } + + public void setSpuTotalAmount(String spuTotalAmount) { + this.spuTotalAmount = spuTotalAmount; + } + + public String getShareReduce() { + return shareReduce; + } + + public void setShareReduce(String shareReduce) { + this.shareReduce = shareReduce; + } + + public String getActualTotalItem() { + return actualTotalItem; + } + + public void setActualTotalItem(String actualTotalItem) { + this.actualTotalItem = actualTotalItem; + } + + public Long getUseScore() { + return useScore; + } + + public void setUseScore(Long useScore) { + this.useScore = useScore; + } + + public List getOrderItemLangList() { + return orderItemLangList; + } + + public void setOrderItemLangList(List orderItemLangList) { + this.orderItemLangList = orderItemLangList; + } + + @Override + public String toString() { + return "OrderExcelVO{" + + "seq='" + seq + '\'' + + ", orderId=" + orderId + + ", createTime=" + createTime + + ", deliveryType='" + deliveryType + '\'' + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", receivingAddr='" + receivingAddr + '\'' + + ", total=" + total + + ", freightAmount=" + freightAmount + + ", reduceAmount=" + reduceAmount + + ", orderScore=" + orderScore + + ", actualTotal=" + actualTotal + + ", payType=" + payType + + ", status=" + status + + ", spuName=" + spuName + + ", skuName=" + skuName + + ", price=" + price + + ", count=" + count + + ", spuTotalAmount=" + spuTotalAmount + + ", shareReduce=" + shareReduce + + ", actualTotalItem=" + actualTotalItem + + ", useScore=" + useScore + + ", orderItemLangList='" + orderItemLangList + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoAccountOrderDetailVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoAccountOrderDetailVO.java new file mode 100644 index 0000000..1903c48 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoAccountOrderDetailVO.java @@ -0,0 +1,93 @@ +package com.tmerclub.cloud.order.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +@Document("order") +public class MongoAccountOrderDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "积分") + private Long scoreCount; + + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "实付金额") + private Long actualTotal; + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + @Override + public String toString() { + return "AccountOrderDetailVO{" + + "wechatAmount=" + wechatAmount + + ", alipayAmount=" + alipayAmount + + ", balanceAmount=" + balanceAmount + + ", scoreCount=" + scoreCount + + ", payType=" + payType + + ", actualTotal=" + actualTotal + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoAccountOrderRefundDetailVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoAccountOrderRefundDetailVO.java new file mode 100644 index 0000000..eb527fb --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoAccountOrderRefundDetailVO.java @@ -0,0 +1,93 @@ +package com.tmerclub.cloud.order.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +@Document("order_refund") +public class MongoAccountOrderRefundDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "积分") + private Long scoreCount; + + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "实付金额") + private Long actualTotal; + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + @Override + public String toString() { + return "AccountOrderDetailVO{" + + "wechatAmount=" + wechatAmount + + ", alipayAmount=" + alipayAmount + + ", balanceAmount=" + balanceAmount + + ", scoreCount=" + scoreCount + + ", payType=" + payType + + ", actualTotal=" + actualTotal + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoFinanceOrderRefundDetailVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoFinanceOrderRefundDetailVO.java new file mode 100644 index 0000000..e61ecf8 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoFinanceOrderRefundDetailVO.java @@ -0,0 +1,218 @@ +package com.tmerclub.cloud.order.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author TRACK + */ +@Document("order_refund") +public class MongoFinanceOrderRefundDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "交易时间") + private Date transDate; + + @Schema(description = "订单号") + private String orderId; + + @Schema(description = "下单时间") + private Date placeTime; + + @Schema(description = "交易摘要") + private String prodName; + + @Schema(description = "商品名称列表") + private List prodNames; + + @Schema(description = "发生渠道") + private String shopName; + + @Schema(description = "资金变更申请人") + private String userName; + + @Schema(description = "业务类型 1.订单支付 2.订单退款 3.余额充值 4.购买会员") + private Integer bizType; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式 -1.不限") + private Integer payType; + + @Schema(description = "收支金额") + private Long transAmount; + + @Schema(description = "支付单号") + private Long payId; + + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "支付多单订单号") + private String orderIds; + + @Schema(description = "支付交易单号") + private String payIds; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "用户id") + private Long userId; + + public Date getTransDate() { + return transDate; + } + + public void setTransDate(Date transDate) { + this.transDate = transDate; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public Date getPlaceTime() { + return placeTime; + } + + public void setPlaceTime(Date placeTime) { + this.placeTime = placeTime; + } + + public String getProdName() { + return prodName; + } + + public void setProdName(String prodName) { + this.prodName = prodName; + } + + public List getProdNames() { + return prodNames; + } + + public void setProdNames(List prodNames) { + this.prodNames = prodNames; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getTransAmount() { + return transAmount; + } + + public void setTransAmount(Long transAmount) { + this.transAmount = transAmount; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public String getPayIds() { + return payIds; + } + + public void setPayIds(String payIds) { + this.payIds = payIds; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "MongoFinanceOrderRefundDetailVO{" + + "transDate=" + transDate + + ", orderId=" + orderId + + ", placeTime=" + placeTime + + ", prodName='" + prodName + '\'' + + ", prodNames=" + prodNames + + ", shopName='" + shopName + '\'' + + ", userName='" + userName + '\'' + + ", bizType=" + bizType + + ", payType=" + payType + + ", transAmount=" + transAmount + + ", payId=" + payId + + ", refundId=" + refundId + + ", orderIds='" + orderIds + '\'' + + ", payIds='" + payIds + '\'' + + ", shopId=" + shopId + + ", userId=" + userId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderPayInfoVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderPayInfoVO.java new file mode 100644 index 0000000..61c6ad4 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderPayInfoVO.java @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author TRACK + */ +@Document("order") +public class MongoOrderPayInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "支付时间") + private Date payTime; + + @Schema(description = "支付入口[0订单 1充值 2开通会员]") + private Integer payEntry; + + @Schema(description = "关联订单号") + private String orderIds; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "支付单号") + private String payId; + + @Schema(description = "支付积分") + private Long scoreCount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "合计") + private Long payAmount; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Integer getPayEntry() { + return payEntry; + } + + public void setPayEntry(Integer payEntry) { + this.payEntry = payEntry; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public String getPayId() { + return payId; + } + + public void setPayId(String payId) { + this.payId = payId; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + @Override + public String toString() { + return "MongoOrderPayInfoVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", payTime=" + payTime + + ", payEntry=" + payEntry + + ", orderIds='" + orderIds + '\'' + + ", payType=" + payType + + ", payId=" + payId + + ", scoreCount=" + scoreCount + + ", alipayAmount=" + alipayAmount + + ", wechatAmount=" + wechatAmount + + ", balanceAmount=" + balanceAmount + + ", payAmount=" + payAmount + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderRefundStatisticsVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderRefundStatisticsVO.java new file mode 100644 index 0000000..32c8772 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderRefundStatisticsVO.java @@ -0,0 +1,350 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author lth + */ +@Document("order_refund") +public class MongoOrderRefundStatisticsVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 退款金额 + */ + @Schema(description = "退款金额") + private Long payActualTotal; + + /** + * 退款商品数量 + */ + @Schema(description = "退款商品数量") + private Long refundSpuCount; + /** + * 退款成功订单数 + */ + @Schema(description = "退款成功订单数") + private Integer refundCount; + /** + * 退款金额 + */ + private Long refundAmount; + /** + * 平台退款金额 + */ + private Long platformRefundAmount; + /** + * 总订单数 + */ + @Schema(description = "总订单数") + private Integer totalOrderCount; + /** + * 退款原因 + */ + @Schema(description = "退款原因") + private String buyerReason; + + /** + * 商品ID + */ + @Schema(description = "商品ID") + private Long spuId; + /** + * 退款商品名称 + */ + @Schema(description = "退款商品名称") + private String refundProdName; + /** + * 店铺id + */ + @Schema(description = "店铺id") + private Long shopId; + /** + * 用户id + */ + private Long userId; + /** + * 店铺名称 + */ + @Schema(description = "店铺名称") + private String shopName; + /** + * 退款率 + */ + @Schema(description = "退款率") + private Double refundRate; + /** + * 退款日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Schema(description = "退款日期") + private Date refundDate; + /** + * 退款日期 + */ + @Schema(description = "退款日期") + private String refundDateToString; + /** + * 时间数据 + */ + private String timeData; + /** + * 售后金额 + */ + private BigDecimal afterSaleAmount; + /** + * 售后次数 + */ + private Integer afterSaleTimes; + + /** + * 申请退款订单数 + */ + private Integer refundNum; + + /** + * 申请退款人数 + */ + private Integer refundPerson; + /** + * 成功退款订单数 + */ + private Integer refundSuccessNum; + /** + * 成功退款人数 + */ + private Integer refundSuccessPerson; + /** + * 成功退款金额 + */ + private Double refundSuccessAmount; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getPayActualTotal() { + return payActualTotal; + } + + public void setPayActualTotal(Long payActualTotal) { + this.payActualTotal = payActualTotal; + } + + public Integer getRefundCount() { + return refundCount; + } + + public void setRefundCount(Integer refundCount) { + this.refundCount = refundCount; + } + + public String getBuyerReason() { + return buyerReason; + } + + public void setBuyerReason(String buyerReason) { + this.buyerReason = buyerReason; + } + + public String getRefundProdName() { + return refundProdName; + } + + public void setRefundProdName(String refundProdName) { + this.refundProdName = refundProdName; + } + + public Date getRefundDate() { + return refundDate; + } + + public void setRefundDate(Date refundDate) { + this.refundDate = refundDate; + } + + public String getRefundDateToString() { + return refundDateToString; + } + + public void setRefundDateToString(String refundDateToString) { + this.refundDateToString = refundDateToString; + } + + public Integer getTotalOrderCount() { + return totalOrderCount; + } + + public void setTotalOrderCount(Integer totalOrderCount) { + this.totalOrderCount = totalOrderCount; + } + + public Double getRefundRate() { + return refundRate; + } + + public void setRefundRate(Double refundRate) { + this.refundRate = refundRate; + } + + public Long getRefundSpuCount() { + return refundSpuCount; + } + + public void setRefundSpuCount(Long refundSpuCount) { + this.refundSpuCount = refundSpuCount; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Long getPlatformRefundAmount() { + return platformRefundAmount; + } + + public void setPlatformRefundAmount(Long platformRefundAmount) { + this.platformRefundAmount = platformRefundAmount; + } + + public String getTimeData() { + return timeData; + } + + public void setTimeData(String timeData) { + this.timeData = timeData; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public void setAfterSaleAmount(BigDecimal afterSaleAmount) { + this.afterSaleAmount = afterSaleAmount; + } + + public BigDecimal getAfterSaleAmount() { + return afterSaleAmount; + } + + public Integer getAfterSaleTimes() { + return afterSaleTimes; + } + + public void setAfterSaleTimes(Integer afterSaleTimes) { + this.afterSaleTimes = afterSaleTimes; + } + + public Integer getRefundNum() { + return refundNum; + } + + public void setRefundNum(Integer refundNum) { + this.refundNum = refundNum; + } + + public Integer getRefundPerson() { + return refundPerson; + } + + public void setRefundPerson(Integer refundPerson) { + this.refundPerson = refundPerson; + } + + public Integer getRefundSuccessNum() { + return refundSuccessNum; + } + + public void setRefundSuccessNum(Integer refundSuccessNum) { + this.refundSuccessNum = refundSuccessNum; + } + + public Integer getRefundSuccessPerson() { + return refundSuccessPerson; + } + + public void setRefundSuccessPerson(Integer refundSuccessPerson) { + this.refundSuccessPerson = refundSuccessPerson; + } + + public Double getRefundSuccessAmount() { + return refundSuccessAmount; + } + + public void setRefundSuccessAmount(Double refundSuccessAmount) { + this.refundSuccessAmount = refundSuccessAmount; + } + + @Override + public String toString() { + return "MongoOrderRefundStatisticsVO{" + + "payActualTotal=" + payActualTotal + + ", refundSpuCount=" + refundSpuCount + + ", refundCount=" + refundCount + + ", refundAmount=" + refundAmount + + ", platformRefundAmount=" + platformRefundAmount + + ", totalOrderCount=" + totalOrderCount + + ", buyerReason='" + buyerReason + '\'' + + ", spuId=" + spuId + + ", refundProdName='" + refundProdName + '\'' + + ", shopId=" + shopId + + ", userId=" + userId + + ", shopName='" + shopName + '\'' + + ", refundRate=" + refundRate + + ", refundDate=" + refundDate + + ", refundDateToString='" + refundDateToString + '\'' + + ", timeData='" + timeData + '\'' + + ", afterSaleAmount=" + afterSaleAmount + + ", afterSaleTimes=" + afterSaleTimes + + ", refundNum=" + refundNum + + ", refundPerson=" + refundPerson + + ", refundSuccessNum=" + refundSuccessNum + + ", refundSuccessPerson=" + refundSuccessPerson + + ", refundSuccessAmount=" + refundSuccessAmount + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoSpuSoldNumRankVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoSpuSoldNumRankVO.java new file mode 100644 index 0000000..9ec5d05 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoSpuSoldNumRankVO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +@Document("order") +public class MongoSpuSoldNumRankVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品销量") + private Integer totalNum; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getTotalNum() { + return totalNum; + } + + public void setTotalNum(Integer totalNum) { + this.totalNum = totalNum; + } + + @Override + public String toString() { + return "MongoSpuSoldNumRankVO{" + + "spuId=" + spuId + + ", totalNum=" + totalNum + + '}'; + } +} diff --git a/tmerclub-order/src/main/resources/mapper/AllotOrderMapper.xml b/tmerclub-order/src/main/resources/mapper/AllotOrderMapper.xml new file mode 100644 index 0000000..8845c5e --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/AllotOrderMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO allot_order(`allot_order_id`, `out_warehouse_id`, `out_stock_point_type`, `in_warehouse_id`, `in_stock_point_type`, `dvy_company_id`, `dvy_type`, + `dvy_order_number`, `status`, `total_allot_count`, `remark`, `shop_id`, `sys_type`, `create_time`, `update_time`) + VALUES + (#{allotOrder.allotOrderId}, #{allotOrder.outWarehouseId}, #{allotOrder.outStockPointType}, #{allotOrder.inWarehouseId}, + #{allotOrder.inStockPointType}, #{allotOrder.dvyCompanyId}, #{allotOrder.dvyType}, #{allotOrder.dvyOrderNumber}, #{allotOrder.status}, #{allotOrder.totalAllotCount}, + #{allotOrder.remark}, #{allotOrder.shopId}, #{allotOrder.sysType}, #{allotOrder.createTime}, #{allotOrder.updateTime}) + + + + UPDATE + allot_order + + + `status` = #{allotOrder.status}, + + + `remark` = #{allotOrder.remark}, + + + `update_time` = #{allotOrder.updateTime} + + + WHERE + allot_order_id = #{allotOrder.allotOrderId} + + + \ No newline at end of file diff --git a/tmerclub-order/src/main/resources/mapper/AreaMapper.xml b/tmerclub-order/src/main/resources/mapper/AreaMapper.xml new file mode 100644 index 0000000..1e90afd --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/AreaMapper.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + `area_id`,`area_name`,`parent_id`,`level`,`create_time`,`update_time` + + + + + insert into area (`area_name`,`parent_id`,`level`) + values (#{area.areaName},#{area.parentId},#{area.level}); + + + update area + + + `area_name` = #{area.areaName}, + + + `parent_id` = #{area.parentId}, + + + `level` = #{area.level}, + + + where area_id = #{area.areaId} + + + delete from area where area_id = #{areaId} + + + + + + + + + + + + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderAddrMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderAddrMapper.xml new file mode 100644 index 0000000..a0744e3 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderAddrMapper.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + `order_addr_id`,`create_time`,`update_time`,`user_id`,`consignee`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`addr`,`post_code`,`mobile`, `lng`, `lat` + + + + + + insert into order_addr (`order_addr_id`,`user_id`,`consignee`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`addr`,`post_code`,`mobile`, `lng`, `lat`, `create_time`) + values (#{orderAddr.orderAddrId},#{orderAddr.userId},#{orderAddr.consignee},#{orderAddr.provinceId},#{orderAddr.province},#{orderAddr.cityId},#{orderAddr.city},#{orderAddr.areaId},#{orderAddr.area},#{orderAddr.addr},#{orderAddr.postCode},#{orderAddr.mobile}, #{orderAddr.lng}, #{orderAddr.lat}, #{orderAddr.createTime}); + + + update order_addr + + + `consignee` = #{orderAddr.consignee}, + + + `province_id` = #{orderAddr.provinceId}, + + + `province` = #{orderAddr.province}, + + + `city_id` = #{orderAddr.cityId}, + + + `city` = #{orderAddr.city}, + + + `area_id` = #{orderAddr.areaId}, + + + `area` = #{orderAddr.area}, + + + `addr` = #{orderAddr.addr}, + + + `post_code` = #{orderAddr.postCode}, + + + `mobile` = #{orderAddr.mobile}, + + + where order_addr_id = #{orderAddr.orderAddrId} + + + delete from order_addr where order_addr_id = #{orderAddrId} + + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderItemLangMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderItemLangMapper.xml new file mode 100644 index 0000000..bc25af0 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderItemLangMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + `order_item_id`,`lang`,`spu_name`,`sku_name`,`supplier_spu_name`,`supplier_sku_name` + + + + + + insert into order_item_lang (`order_item_id`,`lang`,`spu_name`,`sku_name`,`supplier_spu_name`,`supplier_sku_name`) + values + + (#{orderItemLang.orderItemId},#{orderItemLang.lang},#{orderItemLang.spuName},#{orderItemLang.skuName},#{orderItemLang.supplierSpuName},#{orderItemLang.supplierSkuName}) + + + + update order_item_lang + + + `lang` = #{orderItemLang.lang}, + + + `spu_name` = #{orderItemLang.spuName}, + + + `sku_name` = #{orderItemLang.skuName}, + + + `spu_name` = #{orderItemLang.supplierSpuName}, + + + `sku_name` = #{orderItemLang.supplierSkuName}, + + + where order_item_id = #{orderItemLang.orderItemId} + + + delete from order_item_lang where order_item_id = #{orderItemId} + + + delete from order_item_lang where order_item_id in + + #{orderItemId} + + + + + + + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderItemMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderItemMapper.xml new file mode 100644 index 0000000..a0d1e9a --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderItemMapper.xml @@ -0,0 +1,532 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `order_item_id`, + `create_time`, + `update_time`, + `shop_id`, + `order_id`, + `category_id`, + `spu_id`, + `sku_id`, + `user_id`, + `final_refund_id`, + `distribution_user_id`, + `stock_point_id`, + `count`, + `spu_name`, + `sku_name`, + `spu_code`, + `party_code`, + `pic`, + `is_comm`, + `comm_time`, + `refund_status`, + `be_delivered_num`, + `delivery_type`, + `shop_cart_time`, + `price`, + `spu_total_amount`, + `actual_total`, + `share_reduce`, + `platform_share_reduce`, + `distribution_amount`, + `distribution_parent_amount`, + `use_score`, + `gain_score`, + `rate`, + `platform_commission`, + `score_amount`, + `member_amount`, + `platform_coupon_amount`, + `shop_coupon_amount`, + `discount_amount`, + `platform_free_freight_amount`, + `free_freight_amount`, + `shop_change_free_amount`, + `score_fee`, + `item_purchase_amount`, + `purchase_platform_commission`, + `supplier_rate`, + `supplier_spu_id`, + `supplier_sku_id`, + `gain_score`, + `giveaway_amount`, + `spu_name`, + `sku_name`, + `activity_id`, + `activity_type`, + `spu_mold`, + main_giveaway + + + + oi.`order_item_id`, + oi.`create_time`, + oi.`update_time`, + oi.`shop_id`, + oi.`order_id`, + oi.`category_id`, + oi.`spu_id`, + oi.`sku_id`, + oi.`user_id`, + oi.`final_refund_id`, + oi.`distribution_user_id`, + oi.`stock_point_id`, + oi.`count`, + oi.`spu_code`, + oi.`party_code`, + oi.`pic`, + oi.`is_comm`, + oi.`comm_time`, + oi.`refund_status`, + oi.`be_delivered_num`, + oi.`delivery_type`, + oi.`shop_cart_time`, + oi.`price`, + oi.`spu_total_amount`, + oi.`actual_total`, + oi.`share_reduce`, + oi.`platform_share_reduce`, + oi.`distribution_amount`, + oi.`distribution_parent_amount`, + oi.`use_score`, + oi.`gain_score`, + oi.`rate`, + oi.`platform_commission`, + oi.`score_amount`, + oi.`member_amount`, + oi.`platform_coupon_amount`, + oi.`shop_coupon_amount`, + oi.`discount_amount`, + oi.`platform_free_freight_amount`, + oi.`free_freight_amount`, + oi.`shop_change_free_amount`, + oi.`score_fee`, + oi.`item_purchase_amount`, + oi.`purchase_platform_commission`, + oi.`supplier_rate`, + oi.`supplier_spu_id`, + oi.`supplier_sku_id`, + oi.`activity_id`, + oi.`activity_type`, + oi.`giveaway_amount`, + oi.`main_giveaway`, + oi.`is_refund`, + oi.`spu_mold`, + oi.`virtual_remark` + + + + + insert into order_item (`order_item_id`, `shop_id`, `order_id`,`category_id`, `spu_id`, `sku_id`, `user_id`, `final_refund_id`, + `distribution_user_id`, `count`, `pic`, `is_comm`, + `refund_status`, `be_delivered_num`, `delivery_type`, `shop_cart_time`, `price`, + `spu_total_amount`, `actual_total`, `share_reduce`, `platform_share_reduce`, + `distribution_amount`, `distribution_parent_amount`, `score_fee`, `use_score`, `gain_score`,`rate`, `platform_commission`, + `score_amount`, `member_amount`, `platform_coupon_amount`, `shop_coupon_amount`, `discount_amount`, + `platform_free_freight_amount`, `free_freight_amount`,`shop_change_free_amount`,`item_purchase_amount`,`purchase_platform_commission`, + `supplier_rate`,`spu_code`,`party_code`,`supplier_spu_id`,`supplier_sku_id`,`spu_mold`,`is_refund`,`virtual_remark`, + `giveaway_amount`,`main_giveaway`,`combo_amount`,`activity_id`,`activity_type`,`supplier_pic`,`create_time`) + values (#{orderItem.orderItemId}, #{orderItem.shopId}, #{orderItem.orderId}, #{orderItem.categoryId}, #{orderItem.spuId}, #{orderItem.skuId}, #{orderItem.userId}, + #{orderItem.finalRefundId}, #{orderItem.distributionUserId}, #{orderItem.count}, #{orderItem.pic}, + #{orderItem.isComm}, #{orderItem.refundStatus}, #{orderItem.beDeliveredNum}, #{orderItem.deliveryType}, + #{orderItem.shopCartTime}, #{orderItem.price}, #{orderItem.spuTotalAmount}, #{orderItem.actualTotal}, + #{orderItem.shareReduce}, #{orderItem.platformShareReduce}, #{orderItem.distributionAmount}, + #{orderItem.distributionParentAmount}, #{orderItem.scoreFee},#{orderItem.useScore}, #{orderItem.gainScore}, #{orderItem.rate}, #{orderItem.platformCommission}, + #{orderItem.scoreAmount}, #{orderItem.memberAmount}, #{orderItem.platformCouponAmount}, #{orderItem.shopCouponAmount}, #{orderItem.discountAmount}, + #{orderItem.platformFreeFreightAmount}, #{orderItem.freeFreightAmount}, #{orderItem.shopChangeFreeAmount}, + #{orderItem.itemPurchaseAmount}, #{orderItem.purchasePlatformCommission}, #{orderItem.supplierRate}, #{orderItem.spuCode}, + #{orderItem.partyCode}, #{orderItem.supplierSpuId}, #{orderItem.supplierSkuId},#{orderItem.spuMold}, #{orderItem.isRefund}, #{orderItem.virtualRemark}, + #{orderItem.giveawayAmount}, #{orderItem.mainGiveaway}, #{orderItem.comboAmount}, #{orderItem.activityId}, #{orderItem.activityType}, #{orderItem.supplierPic}, #{orderItem.createTime}) + + + insert into order_item (`order_item_id`, `shop_id`, `order_id`,`category_id`, `spu_id`, `sku_id`, `user_id`, `final_refund_id`, + `distribution_user_id`, `count`, `pic`, `is_comm`, + `refund_status`, `be_delivered_num`, `delivery_type`, `shop_cart_time`, `price`, + `spu_total_amount`, `actual_total`, `share_reduce`, `platform_share_reduce`, + `distribution_amount`, `distribution_parent_amount`, `score_fee`, `use_score`, `gain_score`,`rate`, `platform_commission`, + `score_amount`, `member_amount`, `platform_coupon_amount`, `shop_coupon_amount`, `discount_amount`, + `platform_free_freight_amount`, `free_freight_amount`,`shop_change_free_amount`,`item_purchase_amount`,`purchase_platform_commission`, + `supplier_rate`,`spu_code`,`party_code`,`supplier_spu_id`,`supplier_sku_id`,`spu_mold`,`is_refund`,`virtual_remark`, + `giveaway_amount`,`main_giveaway`,`combo_amount`,`activity_id`,`activity_type`,`supplier_pic`,`create_time`, + `write_off_num`,`write_off_multiple_count`,`write_off_start`,`write_off_end`,`stock_point_id`) + values + + (#{orderItem.orderItemId}, #{orderItem.shopId}, #{orderItem.orderId}, #{orderItem.categoryId}, #{orderItem.spuId}, #{orderItem.skuId}, #{orderItem.userId}, + #{orderItem.finalRefundId}, #{orderItem.distributionUserId}, #{orderItem.count}, #{orderItem.pic}, + #{orderItem.isComm}, #{orderItem.refundStatus}, #{orderItem.beDeliveredNum}, #{orderItem.deliveryType}, + #{orderItem.shopCartTime}, #{orderItem.price}, #{orderItem.spuTotalAmount}, #{orderItem.actualTotal}, + #{orderItem.shareReduce}, #{orderItem.platformShareReduce}, #{orderItem.distributionAmount}, + #{orderItem.distributionParentAmount}, #{orderItem.scoreFee},#{orderItem.useScore}, #{orderItem.gainScore}, #{orderItem.rate}, #{orderItem.platformCommission}, + #{orderItem.scoreAmount}, #{orderItem.memberAmount}, #{orderItem.platformCouponAmount}, #{orderItem.shopCouponAmount}, #{orderItem.discountAmount}, + #{orderItem.platformFreeFreightAmount}, #{orderItem.freeFreightAmount}, #{orderItem.shopChangeFreeAmount}, + #{orderItem.itemPurchaseAmount}, #{orderItem.purchasePlatformCommission}, #{orderItem.supplierRate}, #{orderItem.spuCode}, + #{orderItem.partyCode}, #{orderItem.supplierSpuId}, #{orderItem.supplierSkuId},#{orderItem.spuMold}, #{orderItem.isRefund}, #{orderItem.virtualRemark}, + #{orderItem.giveawayAmount}, #{orderItem.mainGiveaway}, #{orderItem.comboAmount}, #{orderItem.activityId}, #{orderItem.activityType}, #{orderItem.supplierPic}, #{orderItem.createTime}, + #{orderItem.writeOffNum}, #{orderItem.writeOffMultipleCount}, #{orderItem.writeOffStart}, #{orderItem.writeOffEnd}, #{orderItem.stockPointId}) + + + + update order_item + + + `final_refund_id` = #{orderItem.finalRefundId}, + + + `distribution_user_id` = #{orderItem.distributionUserId}, + + + `count` = #{orderItem.count}, + + + `pic` = #{orderItem.pic}, + + + `is_comm` = #{orderItem.isComm}, + + + `refund_status` = #{orderItem.refundStatus}, + + + `be_delivered_num` = #{orderItem.beDeliveredNum}, + + + `delivery_type` = #{orderItem.deliveryType}, + + + `shop_cart_time` = #{orderItem.shopCartTime}, + + + `price` = #{orderItem.price}, + + + `spu_total_amount` = #{orderItem.spuTotalAmount}, + + + `actual_total` = #{orderItem.actualTotal}, + + + `share_reduce` = #{orderItem.shareReduce}, + + + `platform_share_reduce` = #{orderItem.platformShareReduce}, + + + `distribution_amount` = #{orderItem.distributionAmount}, + + + `platform_commission` = #{orderItem.platformCommission}, + + + `distribution_parent_amount` = #{orderItem.distributionParentAmount}, + + + `shop_change_free_amount` = #{orderItem.shopChangeFreeAmount}, + + + `use_score` = #{orderItem.useScore}, + + + `gain_score` = #{orderItem.gainScore}, + + + `update_time` = #{orderItem.updateTime}, + + + `comm_time` = #{orderItem.commTime}, + + + where order_item_id = #{orderItem.orderItemId} + + + delete + from order_item + where order_item_id = #{orderItemId} + + + delete + from order_item + where order_item_id in + + #{orderItemId} + + + + + + + + + + + + + + + + + + + update order_item + set be_delivered_num = be_delivered_num - #{orderItem.changeNum}, delivery_type = #{deliveryType} + where order_item_id = #{orderItem.orderItemId} + + + + + + + UPDATE order_item set be_delivered_num=be_delivered_num - #{count} WHERE order_item_id = #{orderItemId} + + + + UPDATE order_item set refund_status=#{refundStatus} WHERE order_id = #{orderId} + + + + + + + UPDATE order_item set distribution_amount = #{orderItem.distributionAmount} + + ,distribution_parent_amount = #{orderItem.distributionParentAmount} + + WHERE order_item_id = #{orderItem.orderItemId} and distribution_amount = 0 + + + + + + + + + + + + + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderRefundAddrMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderRefundAddrMapper.xml new file mode 100644 index 0000000..0a9060d --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderRefundAddrMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + `refund_addr_id`,`create_time`,`update_time`,`shop_id`,`refund_id`,`user_id`,`delivery_company_id`,`delivery_name`,`delivery_no`,`consignee_name`,`consignee_mobile`,`consignee_telephone`,`consignee_post_code`,`consignee_addr`,`sender_mobile`,`sender_remarks`,`imgs` + + + + + insert into order_refund_addr (`shop_id`,`refund_id`,`user_id`,`delivery_company_id`,`delivery_name`,`delivery_no`,`consignee_name`,`consignee_mobile`,`consignee_telephone`,`consignee_post_code`,`consignee_addr`,`sender_mobile`,`sender_remarks`,`imgs`) + values (#{orderRefundAddr.shopId},#{orderRefundAddr.refundId},#{orderRefundAddr.userId},#{orderRefundAddr.deliveryCompanyId},#{orderRefundAddr.deliveryName},#{orderRefundAddr.deliveryNo},#{orderRefundAddr.consigneeName},#{orderRefundAddr.consigneeMobile},#{orderRefundAddr.consigneeTelephone},#{orderRefundAddr.consigneePostCode},#{orderRefundAddr.consigneeAddr},#{orderRefundAddr.senderMobile},#{orderRefundAddr.senderRemarks},#{orderRefundAddr.imgs}); + + + update order_refund_addr + + + `delivery_company_id` = #{orderRefundAddr.deliveryCompanyId}, + + + `delivery_name` = #{orderRefundAddr.deliveryName}, + + + `delivery_no` = #{orderRefundAddr.deliveryNo}, + + + `consignee_name` = #{orderRefundAddr.consigneeName}, + + + `consignee_mobile` = #{orderRefundAddr.consigneeMobile}, + + + `consignee_telephone` = #{orderRefundAddr.consigneeTelephone}, + + + `consignee_post_code` = #{orderRefundAddr.consigneePostCode}, + + + `consignee_addr` = #{orderRefundAddr.consigneeAddr}, + + + `sender_mobile` = #{orderRefundAddr.senderMobile}, + + + `sender_remarks` = #{orderRefundAddr.senderRemarks}, + + + `imgs` = #{orderRefundAddr.imgs}, + + + where + refund_addr_id = #{orderRefundAddr.refundAddrId} + + AND refund_id = #{orderRefundAddr.refundId} + + + + delete from order_refund_addr where refund_addr_id = #{refundAddrId} + + + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderRefundInterventionMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderRefundInterventionMapper.xml new file mode 100644 index 0000000..a93c8a8 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderRefundInterventionMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + `refund_intervertion_id`,`refund_id`,`create_time`,`update_time`,`biz_id`,`sys_type`,`voucher_desc`,`img_urls` + + + + + insert into order_refund_intervention (`refund_id`,`biz_id`,`sys_type`,`voucher_desc`,`img_urls`) + values + (#{orderRefundIntervention.refundId},#{orderRefundIntervention.bizId},#{orderRefundIntervention.sysType},#{orderRefundIntervention.voucherDesc},#{orderRefundIntervention.imgUrls}); + + + update order_refund_intervention + + + `refund_id` = #{orderRefundIntervention.refundId}, + + + `biz_id` = #{orderRefundIntervention.bizId}, + + + `sys_type` = #{orderRefundIntervention.sysType}, + + + `voucher_desc` = #{orderRefundIntervention.voucherDesc}, + + + `img_urls` = #{orderRefundIntervention.imgUrls}, + + + where refund_intervertion_id = #{orderRefundIntervention.refundIntervertionId} + + + delete from order_refund_intervention where refund_id = #{refundId} + + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderRefundMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderRefundMapper.xml new file mode 100644 index 0000000..28105fb --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderRefundMapper.xml @@ -0,0 +1,634 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `refund_id`, + `create_time`, + `update_time`, + `shop_id`, + `user_id`, + `order_id`, + `order_item_id`, + `refund_count`, + `refund_amount`, + `platform_refund_commission`, + `platform_refund_amount`, + `distribution_total_amount`, + `refund_type`, + `apply_type`, + `is_received`, + `close_type`, + `return_money_sts`, + `buyer_reason`, + `buyer_desc`, + `buyer_mobile`, + `refund_actual_total`, + `img_urls`, + `over_time`, + `reject_message`, + `seller_msg`, + `handel_time`, + `supplier_time`, + `delivery_time`, + `receive_time`, + `close_time`, + `decision_time`, + `supplier_handle_status`, + `purchase_refund_amount`, + `supplier_id`, + `pur_platform_refund_commission`, + `refund_time`, + `shop_img_urls`, + `return_giveaway_ids`, + `platform_intervention_status`, + `apply_intervention_reason`, + `apply_intervention_img_urls`, + `apply_intervention_time`, + `intervention_refund_type`, + `after_intervention_refund_amount`, + `platform_message`, + `intervention_finish_time`, + `shop_seller_msg` + + + + + r.`refund_id`, + r.`create_time`, + r.`update_time`, + r.`shop_id`, + r.`user_id`, + r.`order_id`, + r.`order_item_id`, + r.`refund_count`, + r.`refund_amount`, + r.`platform_refund_commission`, + r.`platform_refund_amount`, + r.`distribution_total_amount`, + r.`refund_type`, + r.`apply_type`, + r.`Refund_actual_total`, + r.`is_received`, + r.`close_type`, + r.`return_money_sts`, + r.`buyer_reason`, + r.`buyer_desc`, + r.`buyer_mobile`, + r.`img_urls`, + r.`over_time`, + r.`reject_message`, + r.`seller_msg`, + r.`handel_time`, + r.`delivery_time`, + r.`receive_time`, + r.`close_time`, + r.`decision_time`, + r.`supplier_handle_status`, + r.`purchase_refund_amount`, + r.`supplier_id`, + r.`pur_platform_refund_commission`, + r.`refund_time`, + r.`platform_intervention_status`, + r.`apply_intervention_reason`, + r.`apply_intervention_img_urls`, + r.`apply_intervention_time`, + r.`intervention_refund_type`, + r.`after_intervention_refund_amount`, + r.`platform_message`, + r.`intervention_finish_time` + + + + + + insert into order_refund (`refund_id`, `shop_id`, `user_id`, `pay_sys_type`, `order_id`, `order_item_id`, `refund_count`, + `refund_amount`,`platform_refund_commission`, + `platform_refund_amount`, `distribution_total_amount`, `refund_type`, `apply_type`, + `is_received`, `close_type`, `return_money_sts`, `buyer_reason`, `buyer_desc`, + `buyer_mobile`, `img_urls`, `over_time`, `reject_message`, `seller_msg`, + `handel_time`, `delivery_time`, `receive_time`, `close_time`, `decision_time`, + `refund_time`,`supplier_id`,`purchase_refund_amount`,`pur_platform_refund_commission`, + `return_giveaway_ids`,`refund_actual_total`) + values (#{orderRefund.refundId}, #{orderRefund.shopId}, #{orderRefund.userId}, #{orderRefund.paySysType}, #{orderRefund.orderId}, + #{orderRefund.orderItemId},#{orderRefund.refundCount}, #{orderRefund.refundAmount}, + #{orderRefund.platformRefundCommission},#{orderRefund.platformRefundAmount}, + #{orderRefund.distributionTotalAmount}, #{orderRefund.refundType}, #{orderRefund.applyType}, + #{orderRefund.isReceived}, #{orderRefund.closeType}, #{orderRefund.returnMoneySts}, + #{orderRefund.buyerReason}, #{orderRefund.buyerDesc}, #{orderRefund.buyerMobile}, + #{orderRefund.imgUrls}, #{orderRefund.overTime}, #{orderRefund.rejectMessage}, #{orderRefund.sellerMsg}, + #{orderRefund.handelTime}, #{orderRefund.deliveryTime}, #{orderRefund.receiveTime}, + #{orderRefund.closeTime}, #{orderRefund.decisionTime}, #{orderRefund.refundTime}, + #{orderRefund.supplierId}, #{orderRefund.purchaseRefundAmount}, #{orderRefund.purPlatformRefundCommission}, + #{orderRefund.returnGiveawayIds},#{orderRefund.refundActualTotal}); + + + update order_refund + + + `refund_count` = #{orderRefund.refundCount}, + + + `refund_amount` = #{orderRefund.refundAmount}, + + + `platform_refund_amount` = #{orderRefund.platformRefundAmount}, + + + `distribution_total_amount` = #{orderRefund.distributionTotalAmount}, + + + `refund_type` = #{orderRefund.refundType}, + + + `apply_type` = #{orderRefund.applyType}, + + + `is_received` = #{orderRefund.isReceived}, + + + `close_type` = #{orderRefund.closeType}, + + + `return_money_sts` = #{orderRefund.returnMoneySts}, + + + `buyer_reason` = #{orderRefund.buyerReason}, + + + `buyer_desc` = #{orderRefund.buyerDesc}, + + + `buyer_mobile` = #{orderRefund.buyerMobile}, + + + `img_urls` = #{orderRefund.imgUrls}, + + + `over_time` = #{orderRefund.overTime}, + + + `reject_message` = #{orderRefund.rejectMessage}, + + + `seller_msg` = #{orderRefund.sellerMsg}, + + + `handel_time` = #{orderRefund.handelTime}, + + + `delivery_time` = #{orderRefund.deliveryTime}, + + + `receive_time` = #{orderRefund.receiveTime}, + + + `close_time` = #{orderRefund.closeTime}, + + + `decision_time` = #{orderRefund.decisionTime}, + + + `refund_time` = #{orderRefund.refundTime}, + + + `update_time` = #{orderRefund.updateTime}, + + + `supplier_handle_status` = #{orderRefund.supplierHandleStatus}, + + + `shop_seller_msg` = #{orderRefund.shopSellerMsg}, + + + `platform_intervention_status` = #{orderRefund.platformInterventionStatus}, + + + `intervention_finish_time` = null, + + + `apply_intervention_reason` = #{orderRefund.applyInterventionReason}, + + + `apply_intervention_img_urls` = #{orderRefund.applyInterventionImgUrls}, + + + `apply_intervention_time` = #{orderRefund.applyInterventionTime}, + + + `refund_actual_total` = #{orderRefund.refundActualTotal}, + + + `intervention_finish_time` = #{orderRefund.interventionFinishTime} + + + where refund_id = #{orderRefund.refundId} + + + delete + from order_refund + where refund_id = #{refundId} + + + + + + + + + + + + + + + + + update order_refund + set return_money_sts = 2, + seller_msg = #{sellerMsg}, + handel_time = NOW() + where refund_id = #{refundId} + and return_money_sts = 1 + + + + update order_refund + set return_money_sts = -1, + reject_message = #{rejectMessage}, + seller_msg = #{sellerMsg}, + close_type = 2, + close_time = NOW(), + + receive_time = NOW(), + + + handel_time = NOW(), + + + supplier_handle_status = #{supplierHandleStatus}, + + + shop_img_urls = #{imgUrls}, + + is_received = #{receiver} + where refund_id = #{refundId} + and return_money_sts = #{returnMoneySts} + + + + update order_refund + set platform_message = #{platformMessage}, + intervention_finish_time = NOW(), + platform_intervention_status = #{applyInterventionStatus} + where refund_id = #{refundId} + and platform_intervention_status = 1 + + + + update order_refund + set return_money_sts = 2, + + receive_time = NOW(), + + + handel_time = NOW(), + + decision_time = NOW(), + + seller_msg = #{sellerMsg}, + + is_received = #{receiver}, + refund_amount = #{refundAmount}, + purchase_refund_amount = #{purchaseRefundAmount} + + where refund_id = #{refundId} + and return_money_sts = #{returnMoneySts} + + + + update order_refund + set + refund_amount = #{orderRefundVO.refundAmount}, + platform_refund_amount = #{orderRefundVO.platformRefundAmount}, + platform_refund_commission = #{orderRefundVO.platformRefundCommission}, + purchase_refund_amount = #{orderRefundVO.purchaseRefundAmount}, + pur_platform_refund_commission = #{orderRefundVO.purPlatformRefundCommission}, + after_intervention_refund_amount = #{orderRefundVO.afterInterventionRefundAmount}, + intervention_refund_type = #{orderRefundVO.interventionRefundType}, + platform_message = #{orderRefundVO.platformMessage}, + decision_time = NOW(), + platform_intervention_status = 2 + where + refund_id = #{orderRefundVO.refundId} + and platform_intervention_status = 1 + + + + + + + + + + + + + + + + + + UPDATE + order_refund + SET + supplier_handle_status = #{supplierHandleStatus}, + supplier_time = now() + WHERE refund_id = #{refundId} + AND return_money_sts = #{returnMoneySts} + AND supplier_handle_status = #{oldSupplierHandleStatus} + + + + + + + + + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderReturnReasonMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderReturnReasonMapper.xml new file mode 100644 index 0000000..eec5d9c --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderReturnReasonMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + `reason_id`,`create_time`,`update_time`,`reason`,`seq`,`status`,`reduce_amount` + + + + + insert into order_return_reason (`reason`,`seq`,`status`,`reduce_amount`) + values (#{orderReturnReason.reason},#{orderReturnReason.seq},#{orderReturnReason.status},#{orderReturnReason.reduceAmount}); + + + update order_return_reason + + + `reason` = #{orderReturnReason.reason}, + + + `seq` = #{orderReturnReason.seq}, + + + `status` = #{orderReturnReason.status}, + + + `reduce_amount` = #{orderReturnReason.reduceAmount}, + + + where reason_id = #{orderReturnReason.reasonId} + + + delete from order_return_reason where reason_id = #{reasonId} + + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderSettlementMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderSettlementMapper.xml new file mode 100644 index 0000000..8412087 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderSettlementMapper.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + `settlement_id`, + `create_time`, + `update_time`, + `order_id`, + `pay_id`, + `pay_ids`, + `is_clearing`, + `pay_score`, + `pay_amount`, + `clearing_time`, + `pay_type`, + `version` + + + + + update order_settlement + + + `pay_id` = #{orderSettlement.payId}, + + + `is_clearing` = #{orderSettlement.isClearing}, + + + `pay_score` = #{orderSettlement.payScore}, + + + `pay_amount` = #{orderSettlement.payAmount}, + + + `clearing_time` = #{orderSettlement.clearingTime}, + + + `version` = #{orderSettlement.version}, + + + where settlement_id = #{orderSettlement.settlementId} + + + delete + from order_settlement + where settlement_id = #{settlementId} + + + + insert into order_settlement (`settlement_id`,`user_id`, `order_id`, `pay_id`, `is_clearing`, `pay_score`, `pay_amount`, `clearing_time`,`version`) + values (#{orderSettlement.settlementId}, #{orderSettlement.userId}, #{orderSettlement.orderId}, #{orderSettlement.payId}, #{orderSettlement.isClearing}, + #{orderSettlement.payScore}, #{orderSettlement.payAmount}, #{orderSettlement.clearingTime}, + #{orderSettlement.version}) + + + insert into order_settlement (`settlement_id`,`user_id`, `order_id`, `pay_id`, `is_clearing`, `pay_score`, `pay_amount`, `clearing_time`,`version`) + values + + (#{orderSettlement.settlementId}, #{orderSettlement.userId}, #{orderSettlement.orderId}, #{orderSettlement.payId}, #{orderSettlement.isClearing}, + #{orderSettlement.payScore}, #{orderSettlement.payAmount}, #{orderSettlement.clearingTime}, + #{orderSettlement.version}) + + + + + + + update `order_settlement` set + + pay_ids = pay_id, + + + pay_ids = #{payIds}, + + + pay_amount = #{actualTotal}, + + + pay_id = #{payId}, + + + pay_type = #{payType}, + + is_payed =1,update_time=NOW() + where + + order_id = #{orderId} + + + diff --git a/tmerclub-order/src/main/resources/mapper/PurchaseOrderItemLangMapper.xml b/tmerclub-order/src/main/resources/mapper/PurchaseOrderItemLangMapper.xml new file mode 100644 index 0000000..042d42a --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/PurchaseOrderItemLangMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + `purchase_item_id`,`lang`,`spu_name`,`sku_name` + + + + + insert into purchase_order_item_lang (`lang`,`spu_name`,`sku_name`) + values (#{purchaseOrderItemLang.lang},#{purchaseOrderItemLang.spuName},#{purchaseOrderItemLang.skuName}); + + + insert into purchase_order_item_lang (`purchase_item_id`,`lang`,`spu_name`,`sku_name`) values + + (#{orderItemLang.purchaseItemId},#{orderItemLang.lang},#{orderItemLang.spuName},#{orderItemLang.skuName}) + + + + update purchase_order_item_lang + + + `lang` = #{purchaseOrderItemLang.lang}, + + + `spu_name` = #{purchaseOrderItemLang.spuName}, + + + `sku_name` = #{purchaseOrderItemLang.skuName}, + + + where purchase_item_id = #{purchaseOrderItemLang.purchaseItemId} + + + delete from purchase_order_item_lang where purchase_item_id = #{purchaseItemId} + + + diff --git a/tmerclub-order/src/main/resources/mapper/PurchaseOrderItemMapper.xml b/tmerclub-order/src/main/resources/mapper/PurchaseOrderItemMapper.xml new file mode 100644 index 0000000..6f38e13 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/PurchaseOrderItemMapper.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + `purchase_item_id`,`supplier_spu_id`,`spu_id`,`sku_id`,`purchase_amount`,`purchase_price`,`purchase_stock`,`actual_stock`,`delivery_type`,`status`,`be_delivered_num` + + + poi.`purchase_item_id`, + poi.`create_time` , + poi.`update_time`, + poi.`spu_id`, + poi.`sku_id`, + poi.`spu_code`, + poi.`party_code`, + poi.`pic`, + poi.`purchase_amount`, + poi.`purchase_price`, + poi.`purchase_stock`, + poi.`actual_stock`, + poi.`delivery_type`, + poi.`status`, + poi.`be_delivered_num` + + + + + insert into purchase_order_item (`purchase_item_id`,`purchase_order_id`,`spu_id`,`sku_id`,`purchase_amount`,`purchase_price`,`purchase_stock`,`actual_stock`,`delivery_type`,`status`,`be_delivered_num`) + values (#{purchaseOrderItem.purchaseItemId},#{purchaseOrderItem.purchaseOrderId},#{purchaseOrderItem.spuId},#{purchaseOrderItem.skuId},#{purchaseOrderItem.purchaseAmount},#{purchaseOrderItem.purchasePrice},#{purchaseOrderItem.purchaseStock},#{purchaseOrderItem.actualStock},#{purchaseOrderItem.deliveryType},#{purchaseOrderItem.status},#{purchaseOrderItem.beDeliveredNum}); + + + insert into purchase_order_item (`purchase_item_id`,`purchase_order_id`,`spu_id`,`sku_id`,`spu_code`,`party_code`,`pic`,`purchase_amount`,`purchase_price`,`purchase_stock`,`actual_stock`,`delivery_type`,`status`,`be_delivered_num`) values + + (#{purchaseOrderItem.purchaseItemId},#{purchaseOrderItem.purchaseOrderId},#{purchaseOrderItem.spuId},#{purchaseOrderItem.skuId},#{purchaseOrderItem.spuCode},#{purchaseOrderItem.partyCode},#{purchaseOrderItem.pic},#{purchaseOrderItem.purchaseAmount},#{purchaseOrderItem.purchasePrice},#{purchaseOrderItem.purchaseStock},#{purchaseOrderItem.actualStock},#{purchaseOrderItem.deliveryType},#{purchaseOrderItem.status},#{purchaseOrderItem.beDeliveredNum}) + + + + update purchase_order_item + + + `spu_id` = #{purchaseOrderItem.spuId}, + + + `sku_id` = #{purchaseOrderItem.skuId}, + + + `purchase_amount` = #{purchaseOrderItem.purchaseAmount}, + + + `purchase_price` = #{purchaseOrderItem.purchasePrice}, + + + `purchase_stock` = #{purchaseOrderItem.purchaseStock}, + + + `actual_stock` = #{purchaseOrderItem.actualStock}, + + + `delivery_type` = #{purchaseOrderItem.deliveryType}, + + + `status` = #{purchaseOrderItem.status}, + + + `be_delivered_num` = #{purchaseOrderItem.beDeliveredNum}, + + + where purchase_item_id = #{purchaseOrderItem.purchaseItemId} + + + + + + UPDATE purchase_order_item set be_delivered_num=be_delivered_num - #{orderItem.changeNum},delivery_type = #{deliveryType} WHERE purchase_item_id = #{orderItem.orderItemId} + + + + + + + + + + update purchase_order_item + set `status` = #{status} + where + + purchase_order_id = #{purchaseOrderId} + + + diff --git a/tmerclub-order/src/main/resources/mapper/PurchaseOrderMapper.xml b/tmerclub-order/src/main/resources/mapper/PurchaseOrderMapper.xml new file mode 100644 index 0000000..0c80089 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/PurchaseOrderMapper.xml @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + purchase_order_id, + `shop_id`, + `create_time`, + `update_time`, + `deliver_time`, + `delivery_time`, + `delivery_type`, + `supplier_id`, + `total_amount`, + `total_stock`, + `actual_total_stock`, + `status`, + `remark`, + `employee_id`, + `purchase_order_addr_id`, + `voucher_img_urls`, + `warehouse_id`, + `supplier_warehouse_id`, + `stock_point_type` + + + + po.`purchase_order_id`, + po.`shop_id`, + po.`create_time`, + po.`update_time`, + po.`deliver_time`, + po.`delivery_time`, + po.`delivery_type`, + po.`supplier_id`, + po.`total_amount`, + po.`total_stock`, + po.`actual_total_stock`, + po.`status`, + po.`remark`, + po.`employee_id`, + po.`purchase_order_addr_id`, + po.`voucher_img_urls`, + po.`warehouse_id`, + po.`supplier_warehouse_id`, + po.`stock_point_type` + + + + + AND po.shop_id = #{purchaseOrder.shopId} + + + AND oa.consignee LIKE CONCAT('%', #{purchaseOrder.consignee}, '%') + + + AND ol.spu_name LIKE CONCAT('%', #{purchaseOrder.spuName}, '%') + + + AND po.supplier_id = #{purchaseOrder.supplierId} + + + AND po.status = #{purchaseOrder.status} + + + AND po.supplier_id IN + + #{supplierId} + + + + AND po.shop_id IN + + #{shopId} + + + + AND po.create_time >= #{purchaseOrder.startTime} and po.create_time #{purchaseOrder.endTime} + + + + + + + + + + + + + insert into purchase_order ( + `purchase_order_id`,`shop_id`,`deliver_time`,`delivery_time`,`delivery_type`,`supplier_id`,`total_amount`,`total_stock`, + `actual_total_stock`,`status`,`remark`,`employee_id`,`purchase_order_addr_id`,`voucher_img_urls`, `warehouse_id`, + `supplier_warehouse_id`, `stock_point_type`) + values ( + #{purchaseOrder.purchaseOrderId},#{purchaseOrder.shopId},#{purchaseOrder.deliverTime},#{purchaseOrder.deliveryTime}, + #{purchaseOrder.deliveryType},#{purchaseOrder.supplierId},#{purchaseOrder.totalAmount},#{purchaseOrder.totalStock}, + #{purchaseOrder.actualTotalStock},#{purchaseOrder.status},#{purchaseOrder.remark},#{purchaseOrder.employeeId}, + #{purchaseOrder.purchaseOrderAddrId},#{purchaseOrder.voucherImgUrls}, #{purchaseOrder.warehouseId}, + #{purchaseOrder.supplierWarehouseId}, #{purchaseOrder.stockPointType}); + + + + update purchase_order + + + `shop_id` = #{purchaseOrder.shopId}, + + + `deliver_time` = #{purchaseOrder.deliverTime}, + + + `delivery_time` = #{purchaseOrder.deliveryTime}, + + + `delivery_type` = #{purchaseOrder.deliveryType}, + + + `supplier_id` = #{purchaseOrder.supplierId}, + + + `total_amount` = #{purchaseOrder.totalAmount}, + + + `total_stock` = #{purchaseOrder.totalStock}, + + + `actual_total_stock` = #{purchaseOrder.actualTotalStock}, + + + `status` = #{purchaseOrder.status}, + + + `remark` = #{purchaseOrder.remark}, + + + `purchase_order_addr_id` = #{purchaseOrder.purchaseOrderAddrId}, + + + `employee_id` = #{purchaseOrder.employeeId}, + + + `voucher_img_urls` = #{purchaseOrder.voucherImgUrls}, + + + where purchase_order_id = #{purchaseOrder.purchaseOrderId} + + + + + + diff --git a/tmerclub-order/src/main/resources/mapper/SameCityMapper.xml b/tmerclub-order/src/main/resources/mapper/SameCityMapper.xml new file mode 100644 index 0000000..905c317 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/SameCityMapper.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `samecity_id`,`create_time`,`update_time`,`shop_id`,`position_info`,`charge_type`,`start_fee`,`delivery_fee`,`default_distance`,`over_distance`,`over_distance_fee`,`free_weight`,`over_weight`,`over_weight_fee`,`status`,`lng`,`lat`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`detail_address`,`shop_lng`,`shop_lat` + + + + insert into same_city (`shop_id`,`position_info`,`charge_type`,`start_fee`,`delivery_fee`,`default_distance`,`over_distance`,`over_distance_fee`,`free_weight`,`over_weight`,`over_weight_fee`,`status`,`lng`,`lat`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`detail_address`,`shop_lng`,`shop_lat`) + values (#{sameCity.shopId},#{sameCity.positionInfo},#{sameCity.chargeType},#{sameCity.startFee},#{sameCity.deliveryFee},#{sameCity.defaultDistance},#{sameCity.overDistance},#{sameCity.overDistanceFee},#{sameCity.freeWeight},#{sameCity.overWeight},#{sameCity.overWeightFee},#{sameCity.status},#{sameCity.lng},#{sameCity.lat}, + #{sameCity.provinceId},#{sameCity.province},#{sameCity.cityId},#{sameCity.city},#{sameCity.areaId},#{sameCity.area},#{sameCity.detailAddress},#{sameCity.shopLng},#{sameCity.shopLat}); + + + update same_city + + + `shop_id` = #{sameCity.shopId}, + + + `position_info` = #{sameCity.positionInfo}, + + + `charge_type` = #{sameCity.chargeType}, + + + `start_fee` = #{sameCity.startFee}, + + + `delivery_fee` = #{sameCity.deliveryFee}, + + + `default_distance` = #{sameCity.defaultDistance}, + + + `over_distance` = #{sameCity.overDistance}, + + + `over_distance_fee` = #{sameCity.overDistanceFee}, + + + `free_weight` = #{sameCity.freeWeight}, + + + `over_weight` = #{sameCity.overWeight}, + + + `over_weight_fee` = #{sameCity.overWeightFee}, + + + `status` = #{sameCity.status}, + + + `lng` = #{sameCity.lng}, + + + `lat` = #{sameCity.lat}, + + + `province_id` = #{sameCity.provinceId}, + + + `province` = #{sameCity.province}, + + + `city_id` = #{sameCity.cityId}, + + + `city` = #{sameCity.city}, + + + `area_id` = #{sameCity.areaId}, + + + `area` = #{sameCity.area}, + + + `detail_address` = #{sameCity.detailAddress}, + + + `shop_lng` = #{sameCity.shopLng}, + + + `shop_lat` = #{sameCity.shopLat}, + + + where shop_id = #{sameCity.shopId} + + + diff --git a/tmerclub-order/src/main/resources/mapper/StationMapper.xml b/tmerclub-order/src/main/resources/mapper/StationMapper.xml new file mode 100644 index 0000000..2286c65 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/StationMapper.xml @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `station_id`,`create_time`,`update_time`,`shop_id`,`station_name`,`img_url`,`mobile_prefix`,`mobile`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`post_code`,`addr`,`lng`,`lat`,`time_info`,`status`,`account`,`stock_mode` + + + + + + + + insert into station (`station_id`,`shop_id`,`station_name`,`img_url`,`mobile_prefix`,`mobile`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`post_code`,`addr`,`lng`,`lat`,`time_info`,`status`,`stock_mode`) + values (#{station.stationId},#{station.shopId},#{station.stationName},#{station.imgUrl},#{station.mobilePrefix},#{station.mobile},#{station.provinceId},#{station.province},#{station.cityId},#{station.city},#{station.areaId},#{station.area},#{station.postCode},#{station.addr},#{station.lng},#{station.lat},#{station.timeInfo},#{station.status},#{station.stockMode}); + + + update station + + + `shop_id` = #{station.shopId}, + + + `station_name` = #{station.stationName}, + + + `img_url` = #{station.imgUrl}, + + + `mobile_prefix` = #{station.mobilePrefix}, + + + `mobile` = #{station.mobile}, + + + `province_id` = #{station.provinceId}, + + + `province` = #{station.province}, + + + `city_id` = #{station.cityId}, + + + `city` = #{station.city}, + + + `area_id` = #{station.areaId}, + + + `area` = #{station.area}, + + + `post_code` = #{station.postCode}, + + + `addr` = #{station.addr}, + + + `lng` = #{station.lng}, + + + `lat` = #{station.lat}, + + + `time_info` = #{station.timeInfo}, + + + `status` = #{station.status}, + + + `account` = #{station.account} + + + `stock_mode` = #{station.stockMode} + + + where station_id = #{station.stationId} + + + + UPDATE `station` + SET `status` = -1 + WHERE + station_id = #{stationId} + + + + delete from station where station_id = #{stationId} + + + + + + + + + diff --git a/tmerclub-order/src/main/resources/mapper/TransfeeMapper.xml b/tmerclub-order/src/main/resources/mapper/TransfeeMapper.xml new file mode 100644 index 0000000..94cf003 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/TransfeeMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + `transfee_id`,`create_time`,`update_time`,`transport_id`,`continuous_piece`,`first_piece`,`continuous_fee`,`first_fee` + + + + + insert into transfee (`transport_id`,`continuous_piece`,`first_piece`,`continuous_fee`,`first_fee`) + values (#{transfee.transportId},#{transfee.continuousPiece},#{transfee.firstPiece},#{transfee.continuousFee},#{transfee.firstFee}); + + + update transfee + + + `transport_id` = #{transfee.transportId}, + + + `continuous_piece` = #{transfee.continuousPiece}, + + + `first_piece` = #{transfee.firstPiece}, + + + `continuous_fee` = #{transfee.continuousFee}, + + + `first_fee` = #{transfee.firstFee}, + + + where transfee_id = #{transfee.transfeeId} + + + + delete from transfee where transfee_id = #{transfeeId} + + + + delete from transfee where transport_id = #{transportId} + + + + insert into transfee (`transport_id`,`continuous_piece`,`first_piece`,`continuous_fee`,`first_fee`) values + + (#{transFee.transportId},#{transFee.continuousPiece},#{transFee.firstPiece},#{transFee.continuousFee},#{transFee.firstFee}) + + + + diff --git a/tmerclub-order/src/main/resources/mapper/TransportMapper.xml b/tmerclub-order/src/main/resources/mapper/TransportMapper.xml new file mode 100644 index 0000000..971fe16 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/TransportMapper.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `transport_id`,`create_time`,`update_time`,`trans_name`,`shop_id`,`charge_type`,`is_free_fee`,`has_free_condition` + + + + + + + + + + + + insert into transport (`trans_name`, `shop_id`, `sys_type`, `charge_type`, `is_free_fee`, `has_free_condition`) + values (#{transport.transName}, #{transport.shopId}, #{transport.sysType}, #{transport.chargeType}, + #{transport.isFreeFee}, + #{transport.hasFreeCondition}); + + + update transport + + + `trans_name` = #{transport.transName}, + + + `shop_id` = #{transport.shopId}, + + + `charge_type` = #{transport.chargeType}, + + + `is_free_fee` = #{transport.isFreeFee}, + + + `has_free_condition` = #{transport.hasFreeCondition}, + + update_time = now() + + where transport_id = #{transport.transportId} + + + delete + from transport + where transport_id = #{transportId} + + + + + + + + diff --git a/tmerclub-payment/Dockerfile b/tmerclub-payment/Dockerfile new file mode 100644 index 0000000..0b93728 --- /dev/null +++ b/tmerclub-payment/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms512m", "-Xmx512m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/PaymentApplication.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/PaymentApplication.java new file mode 100644 index 0000000..c8b38d2 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/PaymentApplication.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment; + +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.security.servlet.UserDetailsServiceAutoConfiguration; + +/** + * @author FrozenWatermelon + * @date 2020/09/22 + */ +@SpringBootApplication(scanBasePackages = "com.moyuer.cloud", exclude = UserDetailsServiceAutoConfiguration.class) +@EnableDubbo(scanBasePackages = "com.moyuer.cloud.**.feign") +public class PaymentApplication { + + public static void main(String[] args) { + SpringApplication.run(PaymentApplication.class, args); + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/AbstractReq.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/AbstractReq.java new file mode 100644 index 0000000..2ef4e9d --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/AbstractReq.java @@ -0,0 +1,35 @@ +package com.tmerclub.cloud.payment.allinpay; + +/** + * @author LGH + */ +public abstract class AbstractReq { + + /** + * 商户系统用户标识,商户系统中唯一编号 + */ + protected String bizUserId; + + /** + * 服务对象名 + * + * @return 服务对象名 + */ + public abstract String getService(); + + /** + * 调用方法 + * + * @return 调用方法 + */ + public abstract String getMethod(); + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/OpenClient.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/OpenClient.java new file mode 100644 index 0000000..4c6cd7b --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/OpenClient.java @@ -0,0 +1,265 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.JSONWriter; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.payment.allinpay.bean.*; +import com.tmerclub.cloud.payment.allinpay.bean.*; +import com.tmerclub.cloud.payment.allinpay.util.OpTrustManager; +import com.tmerclub.cloud.payment.allinpay.util.OpenUtils; +import com.tmerclub.cloud.payment.allinpay.util.SecretUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.HttpsURLConnection; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @author lanhai + */ +@SuppressWarnings({"rawtypes", "unchecked"}) +public class OpenClient { + private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + private static final String CHARSET = "utf-8"; + private final OpenConfig config; + private final PrivateKey privateKey; + private final PublicKey tlPublicKey; + private static final Logger logger = LoggerFactory.getLogger(OpenClient.class); + private static final String TRACE_ID_HEADER = "x-traceId-header"; + + public OpenClient(OpenConfig config) { + config.validate(); + this.config = config; + this.privateKey = SecretUtils.loadPrivateKey(null, config.getCertPath(), config.getCertPwd()); + this.tlPublicKey = SecretUtils.loadTlPublicKey(config.getTlCertPath()); + } + + public OpenResponse execute(String method, BizParameter param) { + OpenRequest request = this.assembleRequest(method, param); + logger.info("request:{}", request); + String paramStr = this.encodeOnce((Map) JSON.toJSON(request)); + logger.info("post body:{}", paramStr); + Map respMap = this.post(paramStr); + String body = respMap.get("body"); + logger.info("response:{}", body); + OpenResponse resp = this.verify(body); + resp.setTraceId(respMap.get("traceId")); + return resp; + } + + public void asynNotifyForServer(String notifyType, BizParameter param, String notifyUrl, String clientAppId) { + AsynNotiyRequest request = this.assembleAsynRequest(notifyType, param, notifyUrl, clientAppId); + this.post(this.encodeOnce((Map) JSON.toJSON(request))); + } + + public String concatUrlParams(String method, BizParameter param) { + OpenRequest request = this.assembleRequest(method, param); + return this.config.getUrl() + "?" + this.encodeOnce((Map) JSON.toJSON(request)); + } + + public String concatUrlForServer(String method, BizParameter param, String jumpUrl, String clientAppId) { + OpenRequest request = this.assembleServiceRequest(method, param, jumpUrl, clientAppId); + return this.config.getUrl() + "?" + this.encodeOnce((Map) JSON.toJSON(request)); + } + + public String encrypt(String content) { + return SecretUtils.encryptAes(content, this.config.getSecretKey()); + } + + public String decrypt(String content) { + return SecretUtils.decryptAes(content, this.config.getSecretKey()); + } + + public boolean checkSign(String signedValue, String sign) { + return SecretUtils.verify(this.tlPublicKey, signedValue, sign, this.config.getSignType()); + } + + private OpenResponse verify(String resp) throws OpException { + JSONObject map = JSON.parseObject(resp); + String sign = map.getString("sign"); + map.remove("sign"); + String signedValue = JSON.toJSONString(map, JSONWriter.Feature.MapSortField); + if (!SecretUtils.verify(this.tlPublicKey, signedValue, sign, this.config.getSignType())) { + throw new OpException("verify sign error"); + } else { + return JSON.parseObject(resp, OpenResponse.class); + } + } + + private OpenRequest assembleServiceRequest(String method, BizParameter param, String jumpUrl, String clientAppId) { + OpenUtils.assertNotNull(param, "param must not be null "); + OpenServiceRequest request = new OpenServiceRequest(); + request.setAppId(this.config.getAppId()); + request.setClientAppId(clientAppId); + request.setJumpUrl(jumpUrl); + request.setMethod(method); + request.setFormat(this.config.getFormat()); + request.setCharset(this.config.getCharset()); + request.setVersion(this.config.getVersion()); + request.setTimestamp((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())); + request.setBizContent(param.toString()); + request.setNotifyUrl(this.config.getNotifyUrl()); + String signedValue = this.getSignedValue((Map) JSON.toJSON(request)); + logger.info("待签名源串:{}", signedValue); + String sign = SecretUtils.sign(this.privateKey, signedValue, this.config.getSignType()); + request.setSignType(this.config.getSignType()); + request.setSign(sign); + return request; + } + + private AsynNotiyRequest assembleAsynRequest(String noticeType, BizParameter param, String notifyUrl, String clientAppId) { + OpenUtils.assertNotNull(param, "param must not be null"); + AsynNotiyRequest request = new AsynNotiyRequest(); + request.setAppId(this.config.getAppId()); + request.setClientAppId(clientAppId); + request.setNotifyUrl(notifyUrl); + request.setNotifyType(noticeType); + request.setCharset(this.config.getCharset()); + request.setNotifyTime((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())); + request.setVersion(this.config.getVersion()); + request.setBizContent(param.toString()); + request.setNotifyUrl(this.config.getNotifyUrl()); + String signedValue = this.getSignedValue((Map) JSON.toJSON(request)); + logger.debug("待签名源串:{}", signedValue); + String sign = SecretUtils.sign(this.privateKey, signedValue, this.config.getSignType()); + request.setSign(sign); + request.setSignType(this.config.getSignType()); + request.setSign(sign); + return request; + } + + private OpenRequest assembleRequest(String method, BizParameter param) { + OpenUtils.assertNotNull(param, "param must not be null"); + OpenRequest request = new OpenRequest(); + request.setAppId(this.config.getAppId()); + request.setMethod(method); + request.setFormat(this.config.getFormat()); + request.setCharset(this.config.getCharset()); + request.setTimestamp((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())); + request.setVersion(this.config.getVersion()); + request.setBizContent(param.toString()); + String signedValue = this.getSignedValue((Map) JSON.toJSON(request)); + logger.debug("待签名源串:{}", signedValue); + String sign = SecretUtils.sign(this.privateKey, signedValue, this.config.getSignType()); + request.setSign(sign); + request.setSignType(this.config.getSignType()); + return request; + } + + private String getSignedValue(Map reqMap) { + Map copy = new TreeMap<>(); + + for (Map.Entry entry : reqMap.entrySet()) { + if (entry.getValue() != null) { + copy.put(entry.getKey(), entry.getValue().toString()); + } + } + + StringBuilder sb = new StringBuilder(Constant.INITIAL_CAPACITY); + + for (Map.Entry entry : copy.entrySet()) { + sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); + } + + return sb.length() == 0 ? "" : sb.substring(0, sb.length() - 1); + } + + private Map post(String param) { + Map resultMap = new HashMap<>(Constant.INITIAL_CAPACITY); + StringBuilder result = new StringBuilder(Constant.INITIAL_CAPACITY); + BufferedWriter writer = null; + BufferedReader reader = null; + String traceId = ""; + + try { + URL httpUrl = new URL(this.config.getUrl()); + HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection(); + if (connection instanceof HttpsURLConnection) { + ((HttpsURLConnection) connection).setSSLSocketFactory(OpTrustManager.instance().getSslSocketFactory()); + } + + connection.setRequestProperty("Connection", "keep-alive"); + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + connection.setRequestMethod("POST"); + connection.setDoOutput(true); + connection.setDoInput(true); + writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8)); + writer.write(param); + writer.flush(); + Map> headerFields = connection.getHeaderFields(); + Iterator>> var10 = headerFields.entrySet().iterator(); + + label148: + while (true) { + Map.Entry entry; + do { + if (!var10.hasNext()) { + reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)); + + String line; + while ((line = reader.readLine()) != null) { + result.append(line); + } + break label148; + } + + entry = var10.next(); + } while (!"x-traceId-header".equalsIgnoreCase((String) entry.getKey())); + + traceId = entry.getValue() != null && !((Collection) entry.getValue()).isEmpty() ? (String) ((List) entry.getValue()).get(0) : ""; + } + } catch (Exception var20) { + logger.error(var20.getMessage(), var20); + } finally { + try { + if (writer != null) { + writer.close(); + } + + if (reader != null) { + reader.close(); + } + } catch (IOException var19) { + logger.error(var19.getMessage(), var19); + } + + } + + resultMap.put("body", result.toString()); + resultMap.put("traceId", traceId); + return resultMap; + } + + private String encodeOnce(Map jo) { + StringBuilder sb = new StringBuilder(Constant.INITIAL_CAPACITY); + + try { + for (Map.Entry entry : jo.entrySet()) { + String value = entry.getValue() == null ? "" : (String) entry.getValue(); + sb.append(entry.getKey()).append("=").append(URLEncoder.encode(value, "utf-8")).append("&"); + } + } catch (UnsupportedEncodingException var6) { + logger.error("encodeOnce Error", var6); + } + + return sb.substring(0, sb.length() - 1); + } + + public PrivateKey getPrivateKey() { + return this.privateKey; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/AsynNotiyRequest.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/AsynNotiyRequest.java new file mode 100644 index 0000000..66f0eda --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/AsynNotiyRequest.java @@ -0,0 +1,114 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.bean; + +import java.io.Serializable; + +/** + * @author lanhai + */ +public class AsynNotiyRequest implements Serializable { + private static final long serialVersionUID = 1L; + private String notifyTime; + private String notifyType; + private String notifyId; + private String charset; + private String version; + private String signType; + private String sign; + private String appId; + private String clientAppId; + private String notifyUrl; + private String bizContent; + + public String getNotifyTime() { + return this.notifyTime; + } + + public void setNotifyTime(String notifyTime) { + this.notifyTime = notifyTime; + } + + public String getNotifyType() { + return this.notifyType; + } + + public void setNotifyType(String notifyType) { + this.notifyType = notifyType; + } + + public String getNotifyId() { + return this.notifyId; + } + + public void setNotifyId(String notifyId) { + this.notifyId = notifyId; + } + + public String getCharset() { + return this.charset; + } + + public void setCharset(String charset) { + this.charset = charset; + } + + public String getVersion() { + return this.version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getSignType() { + return this.signType; + } + + public void setSignType(String signType) { + this.signType = signType; + } + + public String getSign() { + return this.sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getAppId() { + return this.appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getClientAppId() { + return this.clientAppId; + } + + public void setClientAppId(String clientAppId) { + this.clientAppId = clientAppId; + } + + public String getNotifyUrl() { + return this.notifyUrl; + } + + public void setNotifyUrl(String notifyUrl) { + this.notifyUrl = notifyUrl; + } + + public String getBizContent() { + return this.bizContent; + } + + public void setBizContent(String bizContent) { + this.bizContent = bizContent; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/CustReq.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/CustReq.java new file mode 100644 index 0000000..1ed1cf9 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/CustReq.java @@ -0,0 +1,71 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.annotation.JSONField; + +import java.io.Serializable; + +/** + * @author lanhai + */ +public class CustReq implements Serializable { + private static final long serialVersionUID = 1L; + @JSONField( + name = "PAYEE_ACCT_NO" + ) + private String payeeAcctNo; + @JSONField( + name = "PAYEE_ACCT_NAME" + ) + private String payeeAcctName; + @JSONField( + name = "AMOUNT" + ) + private String amount; + @JSONField( + name = "SUMMARY" + ) + private String summary; + + public String getPayeeAcctNo() { + return this.payeeAcctNo; + } + + public void setPayeeAcctNo(String payeeAcctNo) { + this.payeeAcctNo = payeeAcctNo; + } + + public String getPayeeAcctName() { + return this.payeeAcctName; + } + + public void setPayeeAcctName(String payeeAcctName) { + this.payeeAcctName = payeeAcctName; + } + + public String getAmount() { + return this.amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public String getSummary() { + return this.summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + @Override + public String toString() { + return JSON.toJSONString(this); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpException.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpException.java new file mode 100644 index 0000000..d52fcb2 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpException.java @@ -0,0 +1,20 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.bean; +/** + * @author lanhai + */ +public class OpException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public OpException(String message) { + super(message); + } + + public OpException(String message, Throwable e) { + super(message, e); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenConfig.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenConfig.java new file mode 100644 index 0000000..8724280 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenConfig.java @@ -0,0 +1,148 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.bean; + +import com.tmerclub.cloud.payment.allinpay.util.OpenUtils; + +import java.io.Serializable; +/** + * @author lanhai + */ +public class OpenConfig implements Serializable { + private static final long serialVersionUID = 1L; + private String url; + private String appId; + private String secretKey; + private String certPath; + private String certPwd; + private String tlCertPath; + private String format; + private String charset; + private String signType; + private String version; + private String notifyUrl; + + public OpenConfig(String url, String appId, String secretKey, String certPath, String certPwd, String tlCertPath) { + this(url, appId, secretKey, certPath, certPwd, tlCertPath, "SHA256WithRSA"); + } + + public OpenConfig(String url, String appId, String secretKey, String certPath, String certPwd, String tlCertPath, String signType) { + this.format = "JSON"; + this.charset = "utf-8"; + this.version = "1.0"; + this.url = url; + this.appId = appId; + this.secretKey = secretKey; + this.certPath = certPath; + this.certPwd = certPwd; + this.tlCertPath = tlCertPath; + this.signType = signType; + } + + public String getUrl() { + return this.url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getAppId() { + return this.appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getSecretKey() { + return this.secretKey; + } + + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; + } + + public String getCertPath() { + return this.certPath; + } + + public void setCertPath(String certPath) { + this.certPath = certPath; + } + + public String getCertPwd() { + return this.certPwd; + } + + public void setCertPwd(String certPwd) { + this.certPwd = certPwd; + } + + public String getTlCertPath() { + return this.tlCertPath; + } + + public void setTlCertPath(String tlCertPath) { + this.tlCertPath = tlCertPath; + } + + public String getFormat() { + return this.format; + } + + public String getCharset() { + return this.charset; + } + + public String getSignType() { + return this.signType; + } + + public String getVersion() { + return this.version; + } + + public String getNotifyUrl() { + return this.notifyUrl; + } + + public void setNotifyUrl(String notifyUrl) { + this.notifyUrl = notifyUrl; + } + + public void setFormat(String format) { + this.format = format; + } + + public void setCharset(String charset) { + this.charset = charset; + } + + public void setSignType(String signType) { + this.signType = signType; + } + + public void setVersion(String version) { + this.version = version; + } + + public OpenConfig() { + this.format = "JSON"; + this.charset = "utf-8"; + this.signType = "SHA256WithRSA"; + this.version = "1.0"; + } + + public void validate() { + OpenUtils.assertNotNull(this.url, "property url must be configured"); + OpenUtils.assertNotNull(this.appId, "property appId must be configured"); + OpenUtils.assertNotNull(this.secretKey, "property secretKey must be configured"); + OpenUtils.assertNotNull(this.certPath, "property certPath must be configured"); + OpenUtils.assertNotNull(this.certPwd, "property certPwd must be configured"); + OpenUtils.assertNotNull(this.tlCertPath, "property tlCertPath must be configured"); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenRequest.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenRequest.java new file mode 100644 index 0000000..7939af9 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenRequest.java @@ -0,0 +1,120 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.bean; + +import com.alibaba.fastjson2.JSON; + +import java.io.Serializable; +/** + * @author lanhai + */ +public class OpenRequest implements Serializable { + private static final long serialVersionUID = 1L; + private String appId; + private String method; + private String format; + private String charset; + private String signType; + private String sign; + private String timestamp; + private String version; + private String notifyUrl; + private String appAuthToken; + private String bizContent; + + public String getAppId() { + return this.appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getMethod() { + return this.method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getFormat() { + return this.format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getCharset() { + return this.charset; + } + + public void setCharset(String charset) { + this.charset = charset; + } + + public String getSignType() { + return this.signType; + } + + public void setSignType(String signType) { + this.signType = signType; + } + + public String getSign() { + return this.sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getTimestamp() { + return this.timestamp; + } + + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } + + public String getVersion() { + return this.version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getNotifyUrl() { + return this.notifyUrl; + } + + public void setNotifyUrl(String notifyUrl) { + this.notifyUrl = notifyUrl; + } + + public String getAppAuthToken() { + return this.appAuthToken; + } + + public void setAppAuthToken(String appAuthToken) { + this.appAuthToken = appAuthToken; + } + + public String getBizContent() { + return this.bizContent; + } + + public void setBizContent(String bizContent) { + this.bizContent = bizContent; + } + + @Override + public String toString() { + return JSON.toJSONString(this); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/AuditStatus.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/AuditStatus.java new file mode 100644 index 0000000..230b14e --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/AuditStatus.java @@ -0,0 +1,34 @@ +package com.tmerclub.cloud.payment.allinpay.member.constant; + +/** + * 通联审核状态 + * + * @author LGH + */ +public enum AuditStatus { + + /** + * 待审核 + */ + UN_AUDIT(1), + + /** + * 审核成功 + */ + SUCCESS(2), + + /** + * 审核失败 + */ + FAIL(3); + + private final Integer code; + + public Integer getCode() { + return code; + } + + AuditStatus(Integer code) { + this.code = code; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/ApplyBindAcct.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/ApplyBindAcct.java new file mode 100644 index 0000000..a0a0082 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/ApplyBindAcct.java @@ -0,0 +1,71 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.payment.allinpay.member.constant.PayAcctType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + */ +public class ApplyBindAcct extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "applyBindAcct"; + + /** + * set:绑定, query:查询 + */ + private String operationType = "set"; + + /** + * 支付账户类型 + * + * @see PayAcctType + */ + private String acctType; + + /** + * 支付账户用户标识 + */ + private String acct; + + public String getOperationType() { + return operationType; + } + + public void setOperationType(String operationType) { + this.operationType = operationType; + } + + public String getAcctType() { + return acctType; + } + + public void setAcctType(String acctType) { + this.acctType = acctType; + } + + public String getAcct() { + return acct; + } + + public void setAcct(String acct) { + this.acct = acct; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + @Override + public String toString() { + return "ApplyBindAcct{" + + "operationType='" + operationType + '\'' + + ", acctType='" + acctType + '\'' + + ", acct='" + acct + '\'' + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BankCardChangeBindPhone.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BankCardChangeBindPhone.java new file mode 100644 index 0000000..16f27f5 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BankCardChangeBindPhone.java @@ -0,0 +1,135 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.payment.allinpay.member.constant.IdentityType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-03-23 + */ +public class BankCardChangeBindPhone extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "bankCardChangeBindPhone"; + + /** + * 银行卡号 + */ + private String cardNo; + /** + * 银行预留手机 + */ + private String phone; + /** + * 姓名 + */ + private String name; + /** + * 绑卡方式 + */ + private Long cardCheck; + /** + * 证件类型(暂只支持身份证) + * + * @see IdentityType + */ + private Integer identityType; + /** + * 证件号码 + */ + private String identityNo; + /** + * 有效期 + */ + private String validate; + /** + * cvv2 + */ + private String cvv2; + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getCardCheck() { + return cardCheck; + } + + public void setCardCheck(Long cardCheck) { + this.cardCheck = cardCheck; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public String getIdentityNo() { + return identityNo; + } + + public void setIdentityNo(String identityNo) { + this.identityNo = identityNo; + } + + public String getValidate() { + return validate; + } + + public void setValidate(String validate) { + this.validate = validate; + } + + public String getCvv2() { + return cvv2; + } + + public void setCvv2(String cvv2) { + this.cvv2 = cvv2; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + @Override + public String toString() { + return "BankCardChangeBindPhone{" + + "cardNo='" + cardNo + '\'' + + ", phone='" + phone + '\'' + + ", name='" + name + '\'' + + ", cardCheck=" + cardCheck + + ", identityType=" + identityType + + ", identityNo='" + identityNo + '\'' + + ", validate='" + validate + '\'' + + ", cvv2='" + cvv2 + '\'' + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BindBankCard.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BindBankCard.java new file mode 100644 index 0000000..9d711e2 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BindBankCard.java @@ -0,0 +1,84 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import java.io.Serial; +import java.io.Serializable; +/** + * 确认绑定银行卡 + * + * @author LGH + */ +public class BindBankCard extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "bindBankCard"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + /** + * 流水号 + */ + private String tranceNum; + + /** + * 申请时间 (四要素时必传) + */ + private String transDate; + + /** + * 银行预留手机 + */ + private String phone; + + /** + * 短信验证码 + */ + private String verificationCode; + + + public BindBankCard() { + } + + public BindBankCard(String bizUserId, String tranceNum, String transDate, String phone, String verificationCode) { + this.bizUserId = bizUserId; + this.transDate = transDate; + this.tranceNum = tranceNum; + this.phone = phone; + this.verificationCode = verificationCode; + } + + public String getTranceNum() { + return tranceNum; + } + + public void setTranceNum(String tranceNum) { + this.tranceNum = tranceNum; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + public String getTransDate() { + return transDate; + } + + public void setTransDate(String transDate) { + this.transDate = transDate; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BindCompanyAccount.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BindCompanyAccount.java new file mode 100644 index 0000000..15bc65a --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BindCompanyAccount.java @@ -0,0 +1,118 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 企业会员绑定对公户 + * + * @author LGH + */ +public class BindCompanyAccount extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "bindCompanyAccount"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + /** + * 企业对公账户 AES加密 + */ + private String accountNo; + /** + * 开户银行名称 + */ + private String parentBankName; + /** + * 开户行地区代码 非必填 + */ + private String bankCityNo; + /** + * 开户支行名称 如:“中国工商银行股份有限公司北京樱桃园支行” + */ + private String bankName; + /** + * 支付行号 12位数字 + */ + private String unionBank; + /** + * 开户行所在省 开户行所在市必须同时上送 非必填 + */ + private String province; + /** + * 开户行所在市 开户行所在省必须同时上送 非必填 + */ + private String city; + + public String getAccountNo() { + return accountNo; + } + + public void setAccountNo(String accountNo) { + this.accountNo = accountNo; + } + + public String getParentBankName() { + return parentBankName; + } + + public void setParentBankName(String parentBankName) { + this.parentBankName = parentBankName; + } + + public String getBankCityNo() { + return bankCityNo; + } + + public void setBankCityNo(String bankCityNo) { + this.bankCityNo = bankCityNo; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getUnionBank() { + return unionBank; + } + + public void setUnionBank(String unionBank) { + this.unionBank = unionBank; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + @Override + public String toString() { + return "BindCompanyAccount{" + + ", accountNo='" + accountNo + '\'' + + ", parentBankName='" + parentBankName + '\'' + + ", bankCityNo='" + bankCityNo + '\'' + + ", bankName='" + bankName + '\'' + + ", unionBank='" + unionBank + '\'' + + ", province='" + province + '\'' + + ", city='" + city + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/GetMemberInfo.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/GetMemberInfo.java new file mode 100644 index 0000000..39060c7 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/GetMemberInfo.java @@ -0,0 +1,24 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author LGH + */ +public class GetMemberInfo extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "getMemberInfo"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public GetMemberInfo() { + } + + public GetMemberInfo(String bizUserId) { + this.bizUserId = bizUserId; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/IdCardCollect.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/IdCardCollect.java new file mode 100644 index 0000000..d57068b --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/IdCardCollect.java @@ -0,0 +1,89 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.common.constant.PicType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 影印件核对 + * + * @author LGH + */ +public class IdCardCollect extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + public static final String METHOD_NAME = "idcardCollect"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + private String bizUserId; + + /** + * 影印件核对结果异步通知地址 + */ + private String ocrComparisonResultBackUrl; + + /** + * 影印件类型 + * + * @see PicType + */ + private Integer picType; + + /** + * 影印件图片 + * 影印件图片的 base64 码 + * 图片大小不超过 700k + * 图片格式 jpg、png + */ + private String picture; + + @Override + public String getBizUserId() { + return bizUserId; + } + + @Override + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getOcrComparisonResultBackUrl() { + return ocrComparisonResultBackUrl; + } + + public void setOcrComparisonResultBackUrl(String ocrComparisonResultBackUrl) { + this.ocrComparisonResultBackUrl = ocrComparisonResultBackUrl; + } + + public Integer getPicType() { + return picType; + } + + public void setPicType(Integer picType) { + this.picType = picType; + } + + public String getPicture() { + return picture; + } + + public void setPicture(String picture) { + this.picture = picture; + } + + @Override + public String toString() { + return "IdCardCollect{" + + "bizUserId='" + bizUserId + '\'' + + ", ocrComparisonResultBackUrl='" + ocrComparisonResultBackUrl + '\'' + + ", picType=" + picType + + ", picture='" + picture + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/IdCardCollectByFileUpload.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/IdCardCollectByFileUpload.java new file mode 100644 index 0000000..4744c74 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/IdCardCollectByFileUpload.java @@ -0,0 +1,134 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.common.constant.PicType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 影印件采集(文件上传模式) + * + * @author TRACK + */ +public class IdCardCollectByFileUpload extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "idcardCollectByFileUpload"; + /** + * 请求流水号的长度 + */ + public static final int REQ_SERIAL_NO_LENGTH = 15; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + private String bizUserId; + + /** + * 请求流水号, 15位数字,不可包含“|”字符,客户确保唯一 + */ + private String reqSerialNo; + + /** + * 影印件核对结果异步通知地址 + */ + private String ocrComparisonResultBackUrl; + + /** + * 身份证人像面,上传身份证影印件时,则人像面和国徽面必须同时上传 + * 通过【文件上传下载接口】上传文件图片后获取的token,有效期30分钟,图片不超过2M + */ + private String legalPicFaceToken; + + /** + * 身份证国徽面,上传身份证影印件时,则人像面和国徽面必须同时上传 + * 通过【文件上传下载接口】上传文件图片后获取的token,有效期30分钟,图片不超过2M + */ + private String legalPicEmblemToken; + + /** + * 其他影印件类型,文件上传模式 1-营业执照/统一信用证 + * + * @see PicType + */ + private Integer picType; + + /** + * 影印件图片文件,“其他影印件类型”时,通过本字段上送图片文件内容 + * 通过【文件上传下载接口】上传文件图片后获取的token,有效期30分钟,图片不超过2M + */ + private String token; + + @Override + public String getBizUserId() { + return bizUserId; + } + + @Override + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getReqSerialNo() { + return reqSerialNo; + } + + public void setReqSerialNo(String reqSerialNo) { + this.reqSerialNo = reqSerialNo; + } + + public String getOcrComparisonResultBackUrl() { + return ocrComparisonResultBackUrl; + } + + public void setOcrComparisonResultBackUrl(String ocrComparisonResultBackUrl) { + this.ocrComparisonResultBackUrl = ocrComparisonResultBackUrl; + } + + public String getLegalPicFaceToken() { + return legalPicFaceToken; + } + + public void setLegalPicFaceToken(String legalPicFaceToken) { + this.legalPicFaceToken = legalPicFaceToken; + } + + public String getLegalPicEmblemToken() { + return legalPicEmblemToken; + } + + public void setLegalPicEmblemToken(String legalPicEmblemToken) { + this.legalPicEmblemToken = legalPicEmblemToken; + } + + public Integer getPicType() { + return picType; + } + + public void setPicType(Integer picType) { + this.picType = picType; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + @Override + public String toString() { + return "IdCardCollectByFileUpload{" + + "bizUserId='" + bizUserId + '\'' + + ", reqSerialNo='" + reqSerialNo + '\'' + + ", ocrComparisonResultBackUrl='" + ocrComparisonResultBackUrl + '\'' + + ", legalPicFaceToken='" + legalPicFaceToken + '\'' + + ", legalPicEmblemToken='" + legalPicEmblemToken + '\'' + + ", picType=" + picType + + ", token='" + token + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/LockMember.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/LockMember.java new file mode 100644 index 0000000..dddd05b --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/LockMember.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import java.io.Serial; +import java.io.Serializable; +/** + * 锁定会员 + * + * @author LGH + */ +public class LockMember extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "lockMember"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public LockMember(String bizUserId) { + this.bizUserId = bizUserId; + } + + public LockMember() { + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SetCompanyInfo.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SetCompanyInfo.java new file mode 100644 index 0000000..f7a8991 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SetCompanyInfo.java @@ -0,0 +1,59 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.api.payment.allinpay.member.resp.CompanyBasicInfo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 设置企业信息 + * + * @author LGH + */ +public class SetCompanyInfo extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + public static final String METHOD_NAME = "setCompanyInfo"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + /** + * 设置企业信息 后回调url + */ + private String backUrl; + + private CompanyBasicInfo companyBasicInfo; + + public SetCompanyInfo(String bizUserId, String backUrl, CompanyBasicInfo companyBasicInfo) { + this.backUrl = backUrl; + this.companyBasicInfo = companyBasicInfo; + this.bizUserId = bizUserId; + } + + + public SetCompanyInfo() { + } + + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } + + public CompanyBasicInfo getCompanyBasicInfo() { + return companyBasicInfo; + } + + public void setCompanyBasicInfo(CompanyBasicInfo companyBasicInfo) { + this.companyBasicInfo = companyBasicInfo; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SetRealName.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SetRealName.java new file mode 100644 index 0000000..d981a79 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SetRealName.java @@ -0,0 +1,85 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.payment.allinpay.member.constant.IdentityType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 个人实名认证 + * + * @author LGH + */ +public class SetRealName extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + public static final String METHOD_NAME = "setRealName"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + /** + * 默认为true目前必须通过云账户认证 + */ + private Boolean isAuth = true; + + private String name; + + /** + * 证件类型 目前只支持身份证 + */ + private Integer identityType = IdentityType.ID_CARD.value(); + + /** + * 证件号码(加密) + */ + private String identityNo; + + + public SetRealName() { + } + + public SetRealName(String bizUserId, String name, + String identityNo) { + this.bizUserId = bizUserId; + this.name = name; + this.identityNo = identityNo; + } + + public Boolean getIsAuth() { + return isAuth; + } + + public void setIsAuth(Boolean isAuth) { + this.isAuth = isAuth; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public String getIdentityNo() { + return identityNo; + } + + public void setIdentityNo(String identityNo) { + this.identityNo = identityNo; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UnlockMember.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UnlockMember.java new file mode 100644 index 0000000..3f3b5f1 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UnlockMember.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import java.io.Serial; +import java.io.Serializable; +/** + * 解锁会员 + * + * @author LGH + */ +public class UnlockMember extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "unlockMember"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public UnlockMember(String bizUserId) { + this.bizUserId = bizUserId; + } + + public UnlockMember() { + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UpdatePayPwd.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UpdatePayPwd.java new file mode 100644 index 0000000..a2a9ac1 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UpdatePayPwd.java @@ -0,0 +1,106 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.payment.allinpay.member.constant.IdentityType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + */ +public class UpdatePayPwd extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "updatePayPwd"; + + /** + * 跳转页面类型 + */ + private Long jumpPageType; + /** + * 姓名 + */ + private String name; + /** + * 证件类型(目前只支持身份证) + */ + private Integer identityType = IdentityType.ID_CARD.value(); + /** + * 身份证号 + */ + private String identityNo; + /** + * 跳转返回地址 + */ + private String jumpUrl; + /** + * 后台通知地址 + */ + private String backUrl; + + public Long getJumpPageType() { + return jumpPageType; + } + + public void setJumpPageType(Long jumpPageType) { + this.jumpPageType = jumpPageType; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public String getIdentityNo() { + return identityNo; + } + + public void setIdentityNo(String identityNo) { + this.identityNo = identityNo; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + @Override + public String toString() { + return "UpdatePayPwd{" + + "jumpPageType='" + jumpPageType + '\'' + + ", name='" + name + '\'' + + ", identityType=" + identityType + + ", identityNo='" + identityNo + '\'' + + ", jumpUrl='" + jumpUrl + '\'' + + ", backUrl='" + backUrl + '\'' + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UpdatePhoneByPayPwd.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UpdatePhoneByPayPwd.java new file mode 100644 index 0000000..64bac5d --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UpdatePhoneByPayPwd.java @@ -0,0 +1,145 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.payment.allinpay.member.constant.IdentityType; +import com.tmerclub.cloud.payment.allinpay.member.constant.PageType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-03-23 + */ +public class UpdatePhoneByPayPwd extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "updatePhoneByPayPwd"; + + /** + * 跳转页面类型(默认H5) + * + * @see PageType + */ + private Long jumpPageType = PageType.H5.value(); + + /** + * 姓名 + */ + private String name; + + /** + * 证件类型(暂时只能身份证) + * + * @see IdentityType + */ + private Integer identityType = IdentityType.ID_CARD.value(); + + /** + * 身份证号 + */ + private String identityNo; + + /** + * 原手机号 + */ + private String oldPhone; + + /** + * 成功后跳转地址 + */ + private String jumpUrl; + + /** + * 失败后跳转地址 + */ + private String errorJumpUrl; + + /** + * 通知地址 + */ + private String backUrl; + + public Long getJumpPageType() { + return jumpPageType; + } + + public void setJumpPageType(Long jumpPageType) { + this.jumpPageType = jumpPageType; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public String getIdentityNo() { + return identityNo; + } + + public void setIdentityNo(String identityNo) { + this.identityNo = identityNo; + } + + public String getOldPhone() { + return oldPhone; + } + + public void setOldPhone(String oldPhone) { + this.oldPhone = oldPhone; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public String getErrorJumpUrl() { + return errorJumpUrl; + } + + public void setErrorJumpUrl(String errorJumpUrl) { + this.errorJumpUrl = errorJumpUrl; + } + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + @Override + public String toString() { + return "UpdatePhoneByPayPwd{" + + "jumpPageType=" + jumpPageType + + ", name='" + name + '\'' + + ", identityType=" + identityType + + ", identityNo='" + identityNo + '\'' + + ", oldPhone='" + oldPhone + '\'' + + ", jumpUrl='" + jumpUrl + '\'' + + ", errorJumpUrl='" + errorJumpUrl + '\'' + + ", backUrl='" + backUrl + '\'' + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/AllinpayResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/AllinpayResp.java new file mode 100644 index 0000000..5c801f1 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/AllinpayResp.java @@ -0,0 +1,172 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author lhd + */ +public class AllinpayResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 云商通订单号 + */ + private String orderNo; + /** + * 商户订单号(支付订单) + */ + private String bizOrderNo; + /** + * 原云商通订单号,退款订单该字段才返回 + */ + private String oriOrderNo; + /** + * 原商户订单号,退款订单该字段才返回 + */ + private String oriBizOrderNo; + /** + * 订单金额 + */ + private Long amount; + /** + * 订单支付完成时间 + * 云商通订单支付完成时间 + * yyyy-MM-dd HH:mm:ss + */ + private String payDatetime; + /** + * 商户系统用户标识,商户系统中唯一编号。 + * 付款人,若平台返回大B的uuid,对应门户上设置中“商户号”字段 + */ + private String buyerBizUserId; + /** + * 退款去向 + * 1:到账户余额 + * 2:到原支付账户银行卡/微信/支付宝等 + */ + private Long refundWhereabouts; + /** + * 支付人帐号 + * 微信支付的openid + * 支付宝平台的user_id + * 刷卡交易:隐藏的卡号,例如621700****4586 + */ + private String acct; + /** + * 扩展参数 + */ + private String extendInfo; + /** + * 订单是否成功 + * “OK”标识支付成功; + * “pending”表示进行中(中间状态) + * “error”表示支付失败; + * 提现在成功和失败时都会通知商户;其他订单只在成功时会通知商户。 + */ + private String status; + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getOriOrderNo() { + return oriOrderNo; + } + + public void setOriOrderNo(String oriOrderNo) { + this.oriOrderNo = oriOrderNo; + } + + public String getOriBizOrderNo() { + return oriBizOrderNo; + } + + public void setOriBizOrderNo(String oriBizOrderNo) { + this.oriBizOrderNo = oriBizOrderNo; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public String getPayDatetime() { + return payDatetime; + } + + public void setPayDatetime(String payDatetime) { + this.payDatetime = payDatetime; + } + + public String getBuyerBizUserId() { + return buyerBizUserId; + } + + public void setBuyerBizUserId(String buyerBizUserId) { + this.buyerBizUserId = buyerBizUserId; + } + + public Long getRefundWhereabouts() { + return refundWhereabouts; + } + + public void setRefundWhereabouts(Long refundWhereabouts) { + this.refundWhereabouts = refundWhereabouts; + } + + public String getAcct() { + return acct; + } + + public void setAcct(String acct) { + this.acct = acct; + } + + public String getExtendInfo() { + return extendInfo; + } + + public void setExtendInfo(String extendInfo) { + this.extendInfo = extendInfo; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public String toString() { + return "AllinpayResp{" + + "orderNo='" + orderNo + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", oriOrderNo='" + oriOrderNo + '\'' + + ", oriBizOrderNo='" + oriBizOrderNo + '\'' + + ", amount=" + amount + + ", payDatetime='" + payDatetime + '\'' + + ", buyerBizUserId='" + buyerBizUserId + '\'' + + ", refundWhereabouts=" + refundWhereabouts + + ", acct='" + acct + '\'' + + ", extendInfo='" + extendInfo + '\'' + + ", status='" + status + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BankCardBin.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BankCardBin.java new file mode 100644 index 0000000..bc12d6a --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BankCardBin.java @@ -0,0 +1,20 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author LGH + */ +public class BankCardBin implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String cardBinInfo; + + public String getCardBinInfo() { + return cardBinInfo; + } + + public void setCardBinInfo(String cardBinInfo) { + this.cardBinInfo = cardBinInfo; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BankCardChangeBindPhoneResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BankCardChangeBindPhoneResp.java new file mode 100644 index 0000000..083970a --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BankCardChangeBindPhoneResp.java @@ -0,0 +1,87 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import com.tmerclub.cloud.common.constant.CardType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-03-23 + */ +public class BankCardChangeBindPhoneResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商户userId + */ + private String bizUserId; + /** + * 流水号 + */ + private String tranceNum; + /** + * 银行名称 + */ + private String bankName; + /** + * 银行代码 + */ + private String bankCode; + /** + * 银行卡类型 + * @see CardType + */ + private Integer cardType; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getTranceNum() { + return tranceNum; + } + + public void setTranceNum(String tranceNum) { + this.tranceNum = tranceNum; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getBankCode() { + return bankCode; + } + + public void setBankCode(String bankCode) { + this.bankCode = bankCode; + } + + public Integer getCardType() { + return cardType; + } + + public void setCardType(Integer cardType) { + this.cardType = cardType; + } + + @Override + public String toString() { + return "BankCardChangeBindPhoneResp{" + + "bizUserId='" + bizUserId + '\'' + + ", tranceNum='" + tranceNum + '\'' + + ", bankName='" + bankName + '\'' + + ", bankCode='" + bankCode + '\'' + + ", cardType=" + cardType + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BindBankCardResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BindBankCardResp.java new file mode 100644 index 0000000..fdb5ff8 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BindBankCardResp.java @@ -0,0 +1,50 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * 确认绑定银行卡 + * + * @author LGH + */ +public class BindBankCardResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String bizUserId; + + /** + * 流水号 + */ + private String tranceNum; + + /** + * 申请时间 + */ + private String transDate; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getTranceNum() { + return tranceNum; + } + + public void setTranceNum(String tranceNum) { + this.tranceNum = tranceNum; + } + + public String getTransDate() { + return transDate; + } + + public void setTransDate(String transDate) { + this.transDate = transDate; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/CardBinInfo.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/CardBinInfo.java new file mode 100644 index 0000000..b74a9d3 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/CardBinInfo.java @@ -0,0 +1,118 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * cardBin 信息 + * + * @author LGH + */ +public class CardBinInfo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 卡bin + */ + private String cardBin; + + /** + * 卡种 + */ + private Integer cardType; + + /** + * 发卡行代码 + */ + private String bankCode; + + /** + * 发卡行名称 + */ + private String bankName; + + /** + * 发卡行名称 + */ + private String cardName; + + /** + * 卡片长度 + */ + private String cardLenth; + + /** + * 状态(1:有效;0:无效) + */ + private Integer cardState; + + /** + * 卡种名称 + */ + private String cardTypeLabel; + + public String getCardBin() { + return cardBin; + } + + public void setCardBin(String cardBin) { + this.cardBin = cardBin; + } + + public Integer getCardType() { + return cardType; + } + + public void setCardType(Integer cardType) { + this.cardType = cardType; + } + + public String getBankCode() { + return bankCode; + } + + public void setBankCode(String bankCode) { + this.bankCode = bankCode; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getCardName() { + return cardName; + } + + public void setCardName(String cardName) { + this.cardName = cardName; + } + + public String getCardLenth() { + return cardLenth; + } + + public void setCardLenth(String cardLenth) { + this.cardLenth = cardLenth; + } + + public Integer getCardState() { + return cardState; + } + + public void setCardState(Integer cardState) { + this.cardState = cardState; + } + + public String getCardTypeLabel() { + return cardTypeLabel; + } + + public void setCardTypeLabel(String cardTypeLabel) { + this.cardTypeLabel = cardTypeLabel; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/CreateMemResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/CreateMemResp.java new file mode 100644 index 0000000..742a7c6 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/CreateMemResp.java @@ -0,0 +1,39 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * 创建会员 返回 + * + * @author LGH + */ +public class CreateMemResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 云商通用户唯一标识 + */ + private String userId; + + /** + * 商户系统用户标识,商户系统中唯一编号。 + */ + private String bizUserId; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/FileUploadResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/FileUploadResp.java new file mode 100644 index 0000000..735bdf6 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/FileUploadResp.java @@ -0,0 +1,72 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * 文件上传返回参数 + * @author TRACK + */ +public class FileUploadResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String code; + + private String msg; + + private String subCode; + + private String subMsg; + + private TokenResp data; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getSubCode() { + return subCode; + } + + public void setSubCode(String subCode) { + this.subCode = subCode; + } + + public String getSubMsg() { + return subMsg; + } + + public void setSubMsg(String subMsg) { + this.subMsg = subMsg; + } + + public TokenResp getData() { + return data; + } + + public void setData(TokenResp data) { + this.data = data; + } + + @Override + public String toString() { + return "FileUploadResp{" + + "code='" + code + '\'' + + ", msg='" + msg + '\'' + + ", subCode='" + subCode + '\'' + + ", subMsg='" + subMsg + '\'' + + ", data=" + data + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/IdCardCollectResultResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/IdCardCollectResultResp.java new file mode 100644 index 0000000..91bb734 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/IdCardCollectResultResp.java @@ -0,0 +1,58 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * 影印件采集通知回调 + * + * @author TRACK + */ +public class IdCardCollectResultResp extends BizUserId implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * OCR识别与企业工商认证信息是否一致 0否1是 + */ + private Integer ocrRegnumComparisonResult; + /** + * OCR识别与企业法人实名信息是否一致 0否1是 + */ + private Integer ocrIdcardComparisonResult; + /** + * 比对结果信息 存在多种结果信息一起返回,使用“;”进行拼接 + */ + private String resultInfo; + + public Integer getOcrRegnumComparisonResult() { + return ocrRegnumComparisonResult; + } + + public void setOcrRegnumComparisonResult(Integer ocrRegnumComparisonResult) { + this.ocrRegnumComparisonResult = ocrRegnumComparisonResult; + } + + public Integer getOcrIdcardComparisonResult() { + return ocrIdcardComparisonResult; + } + + public void setOcrIdcardComparisonResult(Integer ocrIdcardComparisonResult) { + this.ocrIdcardComparisonResult = ocrIdcardComparisonResult; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } + + @Override + public String toString() { + return "IdCardCollectResultResp{" + + "ocrRegnumComparisonResult=" + ocrRegnumComparisonResult + + ", ocrIdcardComparisonResult=" + ocrIdcardComparisonResult + + ", resultInfo='" + resultInfo + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/Result.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/Result.java new file mode 100644 index 0000000..2d28d6c --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/Result.java @@ -0,0 +1,30 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable;/** + * @author lanhai + */ +public class Result extends BizUserId implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 结果:成功(OK),失败(error) + */ + private String result; + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + @Override + public String toString() { + return "Result{" + + "result='" + result + '\'' + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/SignAcctProtocolResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/SignAcctProtocolResp.java new file mode 100644 index 0000000..f12d8e2 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/SignAcctProtocolResp.java @@ -0,0 +1,72 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author gaozijie + */ +public class SignAcctProtocolResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商户系统用户id + */ + private String bizUserId; + + /** + * 账户提现协议编号(需要保存进数据库) + */ + private String acctProtocolNo; + + /** + * 签约户名 + */ + private String signAcctName; + + /** + * 签订结果(成功:ok,失败:error) + */ + private String result; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getAcctProtocolNo() { + return acctProtocolNo; + } + + public void setAcctProtocolNo(String acctProtocolNo) { + this.acctProtocolNo = acctProtocolNo; + } + + public String getSignAcctName() { + return signAcctName; + } + + public void setSignAcctName(String signAcctName) { + this.signAcctName = signAcctName; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + @Override + public String toString() { + return "SignAcctProtocolResp{" + + "bizUserId='" + bizUserId + '\'' + + ", acctProtocolNo='" + acctProtocolNo + '\'' + + ", signAcctName='" + signAcctName + '\'' + + ", result='" + result + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/UserBaseInfo.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/UserBaseInfo.java new file mode 100644 index 0000000..8b7c944 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/UserBaseInfo.java @@ -0,0 +1,85 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * 用户基本信息 + * + * @author LGH + */ +public class UserBaseInfo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 姓名 + */ + private String name; + + /** + * 国家 非必填 + */ + private String country; + + /** + * 省份 非必填 + */ + private String province; + + /** + * 地区 非必填 + */ + private String area; + + /** + * 地址 非必填 + */ + private String address; + + public UserBaseInfo() { + } + + public UserBaseInfo(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/UserInfo.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/UserInfo.java new file mode 100644 index 0000000..fb19dcd --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/UserInfo.java @@ -0,0 +1,256 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author LGH + */ +public class UserInfo extends UserBaseInfo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户状态 + */ + private Integer userState; + + /** + * 会员类型 + */ + private Integer memberType; + + /** + * 云账户用户id + */ + private String userId; + + /** + * 手机号 + */ + private String phone; + + /** + * 身份证号码 + */ + private String identityCardNo; + + /** + * 是否绑定手机 + */ + private Boolean isPhoneChecked; + + /** + * 创建时间 + */ + private String registerTime; + + /** + * 创建ip + */ + private String registerIp; + + /** + * 支付失败次数 + */ + private Long payFailAmount; + + /** + * 是否进行实名认证 + */ + private Boolean isIdentityChecked; + + /** + * 实名认证时间 + */ + private String realNameTime; + + /** + * 备注 + */ + private String remark; + + /** + * 访问终端类型 + */ + private String source; + + /** + * 是否设置支付密码 + */ + private Boolean isSetPayPwd; + + /** + * 账户提现签约协议时间 + */ + private String signAcctProtocolTime; + + /** + * 账户提现协议编号 + */ + private String acctProtocolNo; + + /** + * 是否绑定用户支付标识 + */ + public Boolean isBindPayAcct; + + public Integer getUserState() { + return userState; + } + + public void setUserState(Integer userState) { + this.userState = userState; + } + + public Integer getMemberType() { + return memberType; + } + + public void setMemberType(Integer memberType) { + this.memberType = memberType; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getIdentityCardNo() { + return identityCardNo; + } + + public void setIdentityCardNo(String identityCardNo) { + this.identityCardNo = identityCardNo; + } + + public Boolean getIsPhoneChecked() { + return isPhoneChecked; + } + + public void setIsPhoneChecked(Boolean isPhoneChecked) { + this.isPhoneChecked = isPhoneChecked; + } + + public String getRegisterTime() { + return registerTime; + } + + public void setRegisterTime(String registerTime) { + this.registerTime = registerTime; + } + + public String getRegisterIp() { + return registerIp; + } + + public void setRegisterIp(String registerIp) { + this.registerIp = registerIp; + } + + public Long getPayFailAmount() { + return payFailAmount; + } + + public void setPayFailAmount(Long payFailAmount) { + this.payFailAmount = payFailAmount; + } + + public Boolean getIsIdentityChecked() { + return isIdentityChecked; + } + + public void setIsIdentityChecked(Boolean isIdentityChecked) { + this.isIdentityChecked = isIdentityChecked; + } + + public String getRealNameTime() { + return realNameTime; + } + + public void setRealNameTime(String realNameTime) { + this.realNameTime = realNameTime; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public Boolean getIsSetPayPwd() { + return isSetPayPwd; + } + + public void setIsSetPayPwd(Boolean isSetPayPwd) { + this.isSetPayPwd = isSetPayPwd; + } + + public Boolean getPhoneChecked() { + return isPhoneChecked; + } + + public void setPhoneChecked(Boolean phoneChecked) { + isPhoneChecked = phoneChecked; + } + + public Boolean getIdentityChecked() { + return isIdentityChecked; + } + + public void setIdentityChecked(Boolean identityChecked) { + isIdentityChecked = identityChecked; + } + + public Boolean getSetPayPwd() { + return isSetPayPwd; + } + + public void setSetPayPwd(Boolean setPayPwd) { + isSetPayPwd = setPayPwd; + } + + public String getSignAcctProtocolTime() { + return signAcctProtocolTime; + } + + public void setSignAcctProtocolTime(String signAcctProtocolTime) { + this.signAcctProtocolTime = signAcctProtocolTime; + } + + public String getAcctProtocolNo() { + return acctProtocolNo; + } + + public void setAcctProtocolNo(String acctProtocolNo) { + this.acctProtocolNo = acctProtocolNo; + } + + public Boolean getIsBindPayAcct() { + return isBindPayAcct; + } + + public void setIsBindPayAcct(Boolean bindPayAcct) { + isBindPayAcct = bindPayAcct; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/VerifyBankCardChangeBindPhoneResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/VerifyBankCardChangeBindPhoneResp.java new file mode 100644 index 0000000..d08e9c3 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/VerifyBankCardChangeBindPhoneResp.java @@ -0,0 +1,57 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author gaozijie + * @date 2023-03-23 + */ +public class VerifyBankCardChangeBindPhoneResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商户userId + */ + private String bizUserId; + /** + * 流水号 + */ + private String tranceNum; + /** + * 签约协议号 + */ + private String agreementNo; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getTranceNum() { + return tranceNum; + } + + public void setTranceNum(String tranceNum) { + this.tranceNum = tranceNum; + } + + public String getAgreementNo() { + return agreementNo; + } + + public void setAgreementNo(String agreementNo) { + this.agreementNo = agreementNo; + } + + @Override + public String toString() { + return "verifyBankCardChangeBindPhoneResp{" + + "bizUserId='" + bizUserId + '\'' + + ", tranceNum='" + tranceNum + '\'' + + ", agreementNo='" + agreementNo + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ApplicationCollection.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ApplicationCollection.java new file mode 100644 index 0000000..a3482ec --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ApplicationCollection.java @@ -0,0 +1,320 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +import java.util.List; +import java.util.Map; + +/** + * 托管代收申请 + * 说明: + * 1)托管代收交易即将用户(买方)资金代收到中间账户。 + * 2)托管代收申请成功后,需要支付确认。 + * + * @author lhd + */ + +public class ApplicationCollection extends AbstractOrderReq { + /** + * 商户订单号(支付订单) + * 全局唯一,不可重复,商户侧务必保障此订单号全局唯一,不可重复,如订单号重复,则影响订单代付及退款。 + * 不可包含“|”字符 + */ + private String bizOrderNo; + /** + * 商户系统用户标识,商户系统中唯一编号。 + * 付款人 + */ + private String payerId; + /** + * 收款列表 + */ + private List recieverList; + /** + * 电商业务:代收消费金[3001] + 代付购买金[4001] + */ + private String tradeCode; + /** + * 订单金额,单位:分。订单金额=收款列表总金额+手续费 + */ + private Long amount; + /** + * 手续费 + * 内扣,如果不存在,则填0。 + * 单位:分。 + * 如amount为100,fee为2,实际到账金额为98。 + * 如果不填,默认为0。 + */ + private Long fee; + /** + * 交易验证方式 0.仅渠道验证,通商云不做交易验证 1.通商云发送并验证短信验证码,有效期3分钟。2.验证通商云支付密码 + */ + private Long validateType; + /** + * 前台通知地址 + * 前台交易时必填,支付后,跳转的前台页面; + * 1.收银宝网关必传 + * 2.收银宝h5收银台必传 + * 3.收银宝h5网关必传 + * 4.收银宝银联JS选填,若指定页面跳转上送该字段 + * 5.收银宝微信JS选填,若指定页面跳转上送该字段 + * 6.收银宝微信正扫选填,若指定页面跳转则上送该字段 + * 注:必须为https协议地址,且不允许带参数 + */ + private String frontUrl; + /** + * 订单过期时间 + * yyyy-MM-dd HH:mm:ss + * 控制订单可支付时间,订单最长时效为24小时,即过期时间不能大于订单创建时间24小时; + * 1) 需确认支付情况-确认支付时间不能大于订单过期时间; + * 注:收银宝H5收银台若未上送订单过期时间,确认支付后默认订单有效期5分钟 + * 2) 无需确认支付情况-透传至渠道方,最大不超过60分钟,控制订单支付时间范围 + */ + private String orderExpireDatetime; + /** + * TODO 有空优化 + * 行业代码 2510.服装鞋帽 2511.箱包配饰 2522.其他 + */ + private String industryCode; + /** + * 行业名称 + */ + private String industryName; + /** + * 访问终端类型 1.mobile 2.pc + */ + private Long source; + /** + * 摘要 + */ + private String summary; + /** + * 拓展参数,接口将原样返回,不可包含“|”及换行符+,空格,/,?,%,#,&,=等特殊字符,最多100个字符 + */ + private String extendInfo; + /** + * 后台通知地址 + */ + private String backUrl; + /** + * 支付方式 + */ + private Map payMethod; + + private static final String METHOD_NAME = "agentCollectApply"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public ApplicationCollection() { + } + + public ApplicationCollection(String bizOrderNo, String payerId, List recieverList, String tradeCode, Long amount, Long fee, Long validateType, String frontUrl, String orderExpireDatetime, String industryCode, String industryName, Long source, String summary, String extendInfo) { + this.bizOrderNo = bizOrderNo; + this.payerId = payerId; + this.recieverList = recieverList; + this.tradeCode = tradeCode; + this.amount = amount; + this.fee = fee; + this.validateType = validateType; + this.frontUrl = frontUrl; + this.orderExpireDatetime = orderExpireDatetime; + this.industryCode = industryCode; + this.industryName = industryName; + this.source = source; + this.summary = summary; + this.extendInfo = extendInfo; + } + + public Map getPayMethod() { + return payMethod; + } + + public void setPayMethod(Map payMethod) { + this.payMethod = payMethod; + } + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getPayerId() { + return payerId; + } + + public void setPayerId(String payerId) { + this.payerId = payerId; + } + + public List getRecieverList() { + return recieverList; + } + + public void setRecieverList(List recieverList) { + this.recieverList = recieverList; + } + + public String getTradeCode() { + return tradeCode; + } + + public void setTradeCode(String tradeCode) { + this.tradeCode = tradeCode; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Long getFee() { + return fee; + } + + public void setFee(Long fee) { + this.fee = fee; + } + + public Long getValidateType() { + return validateType; + } + + public void setValidateType(Long validateType) { + this.validateType = validateType; + } + + public String getFrontUrl() { + return frontUrl; + } + + public void setFrontUrl(String frontUrl) { + this.frontUrl = frontUrl; + } + + public String getOrderExpireDatetime() { + return orderExpireDatetime; + } + + public void setOrderExpireDatetime(String orderExpireDatetime) { + this.orderExpireDatetime = orderExpireDatetime; + } + + public String getIndustryCode() { + return industryCode; + } + + public void setIndustryCode(String industryCode) { + this.industryCode = industryCode; + } + + public String getIndustryName() { + return industryName; + } + + public void setIndustryName(String industryName) { + this.industryName = industryName; + } + + public Long getSource() { + return source; + } + + public void setSource(Long source) { + this.source = source; + } + + public String getSummary() { + return summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + public String getExtendInfo() { + return extendInfo; + } + + public void setExtendInfo(String extendInfo) { + this.extendInfo = extendInfo; + } + + @Override + public String toString() { + return "ApplicationCollection{" + + "bizOrderNo='" + bizOrderNo + '\'' + + ", payerId='" + payerId + '\'' + + ", recieverList=" + recieverList + + ", tradeCode='" + tradeCode + '\'' + + ", amount=" + amount + + ", fee=" + fee + + ", validateType=" + validateType + + ", frontUrl='" + frontUrl + '\'' + + ", orderExpireDatetime='" + orderExpireDatetime + '\'' + + ", industryCode='" + industryCode + '\'' + + ", industryName='" + industryName + '\'' + + ", source=" + source + + ", summary='" + summary + '\'' + + ", extendInfo='" + extendInfo + '\'' + + ", backUrl='" + backUrl + '\'' + + ", payMethod=" + payMethod + + '}'; + } + + /** + * 收款人信息 + */ + public static class Reciever { + private String bizUserId; + private Long amount; + + public Reciever() { + } + + public Reciever(String bizUserId, Long amount) { + this.bizUserId = bizUserId; + this.amount = amount; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + @Override + public String toString() { + return "Reciever{" + + "bizUserId='" + bizUserId + '\'' + + ", amount=" + amount + + '}'; + } + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ApplicationTransfer.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ApplicationTransfer.java new file mode 100644 index 0000000..b4cb2c6 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ApplicationTransfer.java @@ -0,0 +1,120 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 平台转账 + * 该接口一般用于平台向用户发红包、各类代金券、体验金、购物返利等营销活动。 + * 注: + * 1. 目前只支持从平台保证金账户、营销专用账户和自定义 A 帐户转账到用户托管账户余额。 + * 2. 源帐户集:平台保证金账户、营销专用账户和自定义 A 帐户所属的账户集。 + * 3. 目标账户集:云账户分配给业务端的托管专用账户集。 + * 4. 平台转账无需支付确认。 + * + * @author LGH + */ + +public class ApplicationTransfer extends AbstractOrderReq { + /** + * 商户系统转账编号商户系统唯一 + */ + private String bizTransferNo; + /** + * 源账户集编号 + */ + private String sourceAccountSetNo; + /** + * 云账户编号 + */ + private String targetBizUserId; + /** + * 标账户集编号 + */ + private String targetAccountSetNo; + /** + * 本次退款总金额 + */ + private Long amount; + /** + * 商户批次号 + */ + private String remark; + + private static final String METHOD_NAME = "applicationTransfer"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public ApplicationTransfer() { + } + + public ApplicationTransfer(String bizTransferNo, String sourceAccountSetNo, + String targetBizUserId, String targetAccountSetNo, Long amount, + String remark) { + this.bizTransferNo = bizTransferNo; + this.sourceAccountSetNo = sourceAccountSetNo; + this.targetBizUserId = targetBizUserId; + this.targetAccountSetNo = targetAccountSetNo; + this.amount = amount; + this.remark = remark; + } + + public ApplicationTransfer(String bizTransferNo, String sourceAccountSetNo, + String targetBizUserId, String targetAccountSetNo, Long amount) { + this.bizTransferNo = bizTransferNo; + this.sourceAccountSetNo = sourceAccountSetNo; + this.targetBizUserId = targetBizUserId; + this.targetAccountSetNo = targetAccountSetNo; + this.amount = amount; + } + + public String getBizTransferNo() { + return bizTransferNo; + } + + public void setBizTransferNo(String bizTransferNo) { + this.bizTransferNo = bizTransferNo; + } + + public String getSourceAccountSetNo() { + return sourceAccountSetNo; + } + + public void setSourceAccountSetNo(String sourceAccountSetNo) { + this.sourceAccountSetNo = sourceAccountSetNo; + } + + public String getTargetBizUserId() { + return targetBizUserId; + } + + public void setTargetBizUserId(String targetBizUserId) { + this.targetBizUserId = targetBizUserId; + } + + public String getTargetAccountSetNo() { + return targetAccountSetNo; + } + + public void setTargetAccountSetNo(String targetAccountSetNo) { + this.targetAccountSetNo = targetAccountSetNo; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ConsumeApply.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ConsumeApply.java new file mode 100644 index 0000000..f008cd6 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ConsumeApply.java @@ -0,0 +1,275 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 消费申请 + * + * @author gaozijie + * @date 2023-04-04 + */ +public class ConsumeApply extends AbstractOrderReq { + + public static final String METHOD_NAME = "consumeApply"; + + /** + * 付款方(商户系统userId) + */ + private String payerId; + + /** + * 收款方(商户系统userId)(平台参数为:#yunBizUserId_B2C#) + */ + private String recieverId; + + /** + * 商户订单编号 + */ + private String bizOrderNo; + + /** + * 订单金额 + */ + private Long amount; + + /** + * 手续费 + */ + private Long fee; + + /** + * 交易验证方式 + */ + private Long validateType; + + /** + * 分账规则 + */ + private String splitRule; + + /** + * 前台通知地址 + */ + private String frontUrl; + + /** + * 后台通知地址 + */ + private String backUrl; + + /** + * 订单过期时间 + */ + private String orderExpireDatetime; + + /** + * 支付方式 + */ + private String payMethod; + + /** + * 商户商品编码 + */ + private String bizGoodsNo; + + /** + * 商品名称 + */ + private String goodsName; + + /** + * 行业代码 + */ + private String industryCode; + + /** + * 行业名称 + */ + private String industryName; + + /** + * 访问终端类型 + */ + private Long source; + + /** + * 摘要 + */ + private String summary; + + /** + * 拓展参数 + */ + private String extendInfo; + + public String getPayerId() { + return payerId; + } + + public void setPayerId(String payerId) { + this.payerId = payerId; + } + + public String getRecieverId() { + return recieverId; + } + + public void setRecieverId(String recieverId) { + this.recieverId = recieverId; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Long getFee() { + return fee; + } + + public void setFee(Long fee) { + this.fee = fee; + } + + public Long getValidateType() { + return validateType; + } + + public void setValidateType(Long validateType) { + this.validateType = validateType; + } + + public String getSplitRule() { + return splitRule; + } + + public void setSplitRule(String splitRule) { + this.splitRule = splitRule; + } + + public String getFrontUrl() { + return frontUrl; + } + + public void setFrontUrl(String frontUrl) { + this.frontUrl = frontUrl; + } + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } + + public String getOrderExpireDatetime() { + return orderExpireDatetime; + } + + public void setOrderExpireDatetime(String orderExpireDatetime) { + this.orderExpireDatetime = orderExpireDatetime; + } + + public String getPayMethod() { + return payMethod; + } + + public void setPayMethod(String payMethod) { + this.payMethod = payMethod; + } + + public String getBizGoodsNo() { + return bizGoodsNo; + } + + public void setBizGoodsNo(String bizGoodsNo) { + this.bizGoodsNo = bizGoodsNo; + } + + public String getGoodsName() { + return goodsName; + } + + public void setGoodsName(String goodsName) { + this.goodsName = goodsName; + } + + public String getIndustryCode() { + return industryCode; + } + + public void setIndustryCode(String industryCode) { + this.industryCode = industryCode; + } + + public String getIndustryName() { + return industryName; + } + + public void setIndustryName(String industryName) { + this.industryName = industryName; + } + + public Long getSource() { + return source; + } + + public void setSource(Long source) { + this.source = source; + } + + public String getSummary() { + return summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + public String getExtendInfo() { + return extendInfo; + } + + public void setExtendInfo(String extendInfo) { + this.extendInfo = extendInfo; + } + + @Override + public String toString() { + return "ConsumeApply{" + + "payerId='" + payerId + '\'' + + ", recieverId='" + recieverId + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", amount=" + amount + + ", fee=" + fee + + ", validateType=" + validateType + + ", splitRule='" + splitRule + '\'' + + ", frontUrl='" + frontUrl + '\'' + + ", backUrl='" + backUrl + '\'' + + ", orderExpireDatetime='" + orderExpireDatetime + '\'' + + ", payMethod='" + payMethod + '\'' + + ", bizGoodsNo='" + bizGoodsNo + '\'' + + ", goodsName='" + goodsName + '\'' + + ", industryCode='" + industryCode + '\'' + + ", industryName='" + industryName + '\'' + + ", source='" + source + '\'' + + ", summary='" + summary + '\'' + + ", extendInfo='" + extendInfo + '\'' + + '}'; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/DepositApply.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/DepositApply.java new file mode 100644 index 0000000..8638e7a --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/DepositApply.java @@ -0,0 +1,170 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + + +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.payment.allinpay.member.constant.VisitSourceType; + +/** + * @author gaozijie + * @date 2023-03-29 + */ +public class DepositApply extends AbstractOrderReq { + + public static final String METHOD_NAME = "depositApply"; + + /** + * 商户订单号 + */ + private String bizOrderNo; + /** + * 账户集编号 + */ + private String accountSetNo; + /** + * 金额(单位:分) + */ + private Long amount; + /** + * 手续费 + */ + private Long fee; + /** + * 交易验证方式() + */ + private Long validateType; + /** + * 前台通知地址 + */ + private String frontUrl; + /** + * 后台通知地址 + */ + private String backUrl; + /** + * 支付方式(JSON) + */ + private String payMethod; + /** + * 行业代码 + */ + private String industryCode = AllinpayConstant.INDUSTRY_CODE; + /** + * 行业名称 + */ + private String industryName = AllinpayConstant.INDUSTRY_NAME; + /** + * 访问终端类型 + */ + private Integer source = VisitSourceType.PC.value(); + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getAccountSetNo() { + return accountSetNo; + } + + public void setAccountSetNo(String accountSetNo) { + this.accountSetNo = accountSetNo; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Long getFee() { + return fee; + } + + public void setFee(Long fee) { + this.fee = fee; + } + + public Long getValidateType() { + return validateType; + } + + public void setValidateType(Long validateType) { + this.validateType = validateType; + } + + public String getFrontUrl() { + return frontUrl; + } + + public void setFrontUrl(String frontUrl) { + this.frontUrl = frontUrl; + } + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } + + public String getPayMethod() { + return payMethod; + } + + public void setPayMethod(String payMethod) { + this.payMethod = payMethod; + } + + public String getIndustryCode() { + return industryCode; + } + + public void setIndustryCode(String industryCode) { + this.industryCode = industryCode; + } + + public String getIndustryName() { + return industryName; + } + + public void setIndustryName(String industryName) { + this.industryName = industryName; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + @Override + public String toString() { + return "DepositApply{" + + "bizOrderNo='" + bizOrderNo + '\'' + + ", accountSetNo='" + accountSetNo + '\'' + + ", amount=" + amount + + ", fee=" + fee + + ", validateType=" + validateType + + ", frontUrl='" + frontUrl + '\'' + + ", backUrl='" + backUrl + '\'' + + ", payMethod='" + payMethod + '\'' + + ", industryCode='" + industryCode + '\'' + + ", industryName='" + industryName + '\'' + + ", source=" + source + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/FreezeMoney.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/FreezeMoney.java new file mode 100644 index 0000000..c6c8489 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/FreezeMoney.java @@ -0,0 +1,65 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 冻结金额 + * + * @author LGH + */ +public class FreezeMoney extends AbstractOrderReq { + /** + * 商户冻结金额订单号 + */ + private String bizFreezenNo; + /** + * 账户集编号 + */ + private String accountSetNo; + /** + * 冻结金额 + */ + private Integer amount; + + + public static final String METHOD_NAME = "freezeMoney"; + + public FreezeMoney() { + } + + public FreezeMoney(String bizUserId, String bizFreezenNo, String accountSetNo, Integer amount) { + this.bizUserId = bizUserId; + this.bizFreezenNo = bizFreezenNo; + this.accountSetNo = accountSetNo; + this.amount = amount; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public String getBizFreezenNo() { + return bizFreezenNo; + } + + public void setBizFreezenNo(String bizFreezenNo) { + this.bizFreezenNo = bizFreezenNo; + } + + public String getAccountSetNo() { + return accountSetNo; + } + + public void setAccountSetNo(String accountSetNo) { + this.accountSetNo = accountSetNo; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/GetOrderDetail.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/GetOrderDetail.java new file mode 100644 index 0000000..823d9ba --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/GetOrderDetail.java @@ -0,0 +1,42 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 订单状态 + * + * @author LGH + */ +public class GetOrderDetail extends AbstractOrderReq { + + /** + * 商户订单号 + */ + private String bizOrderNo; + + /** + * 方法名称 + */ + public static final String METHOD_NAME = "getOrderDetail"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public GetOrderDetail() { + } + + public GetOrderDetail(String bizUserId, String bizOrderNo) { + this.bizUserId = bizUserId; + this.bizOrderNo = bizOrderNo; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayByBackSmsReq.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayByBackSmsReq.java new file mode 100644 index 0000000..258f89a --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayByBackSmsReq.java @@ -0,0 +1,103 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 确认支付请求 后台+短信验证码 + * + * @author TRACK + */ +public class PayByBackSmsReq extends AbstractOrderReq { + + public static final String METHOD_NAME = "payByBackSMS"; + + /** + * 商户系统用户标识,商户系统中唯一编号。 + */ + private String bizUserId; + + /** + * 订单申请的商户订单号(支付订单) + */ + private String bizOrderNo; + + /** + * 交易编号 + */ + private String tradeNo; + + /** + * 短信验证码 + */ + private String verificationCode; + + /** + * ip地址 + */ + private String consumerIp; + + public PayByBackSmsReq() { + } + + public PayByBackSmsReq(String bizUserId, String bizOrderNo, String verificationCode) { + this.bizUserId = bizUserId; + this.bizOrderNo = bizOrderNo; + this.verificationCode = verificationCode; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + @Override + public String getBizUserId() { + return bizUserId; + } + + @Override + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getTradeNo() { + return tradeNo; + } + + public void setTradeNo(String tradeNo) { + this.tradeNo = tradeNo; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + public String getConsumerIp() { + return consumerIp; + } + + public void setConsumerIp(String consumerIp) { + this.consumerIp = consumerIp; + } + + @Override + public String toString() { + return "PayByBackSMSReq{" + + "bizUserId='" + bizUserId + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", tradeNo='" + tradeNo + '\'' + + ", verificationCode='" + verificationCode + '\'' + + ", consumerIp='" + consumerIp + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayMethod.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayMethod.java new file mode 100644 index 0000000..52eea97 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayMethod.java @@ -0,0 +1,168 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +import java.util.List; + +/** + * 支付方式 + * + * @author LGH + */ +public class PayMethod { + + /** + * 收银宝子商户号 + */ + private String vspCusid; + /** + * subAppid,通联的微信app支付和h5支付必传 + * 微信端应用ID:appid + */ + private String subAppid; + /** + * 用户下单及调起支付的终端IP + */ + private String cusip; + /** + * 非贷记卡:no_credit + * 借、贷记卡:””,需要传空字符串,不能不传 + */ + private String limitPay; + /** + * 支付金额,单位:分 + */ + private Long amount; + /** + * (支付平台用户标识) + * 微信小程序支付openid——微信分配 + */ + private String acct; + /** + * 场景信息 + * 注: + * //IOS移动应用 + * {"h5_info": {"type":"IOS","app_name": "王者荣耀","bundle_id": "com.tencent.wzryIOS"}} + *

+ * //安卓移动应用 + * {"h5_info": {"type":"Android","app_name": "王者荣耀","package_name": "com.tencent.tmgp.sgame"}} + *

+ * //WAP网站应用 + * {"type":"Wap","wap_url": "...","wap_name": "腾讯充值"}} + */ + private String sceneInfo; + + private List balancePayList; + + public String getVspCusid() { + return vspCusid; + } + + public void setVspCusid(String vspCusid) { + this.vspCusid = vspCusid; + } + + public String getSubAppid() { + return subAppid; + } + + public void setSubAppid(String subAppid) { + this.subAppid = subAppid; + } + + public String getCusip() { + return cusip; + } + + public void setCusip(String cusip) { + this.cusip = cusip; + } + + public String getSceneInfo() { + return sceneInfo; + } + + public void setSceneInfo(String sceneInfo) { + this.sceneInfo = sceneInfo; + } + + public List getBalancePayList() { + return balancePayList; + } + + public void setBalancePayList(List balancePayList) { + this.balancePayList = balancePayList; + } + + public String getLimitPay() { + return limitPay; + } + + public void setLimitPay(String limitPay) { + this.limitPay = limitPay; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public String getAcct() { + return acct; + } + + public void setAcct(String acct) { + this.acct = acct; + } + + public static class BalancePay { + /** + * 账户余额,账户内转账必填 + * 账户集编号 + */ + private String accountSetNo; + /** + * 支付金额,单位:分 + */ + private Long amount; + + public String getAccountSetNo() { + return accountSetNo; + } + + public void setAccountSetNo(String accountSetNo) { + this.accountSetNo = accountSetNo; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + @Override + public String toString() { + return "BalancePay{" + + "accountSetNo='" + accountSetNo + '\'' + + ", amount=" + amount + + '}'; + } + } + + @Override + public String toString() { + return "PayMethod{" + + "subAppId='" + subAppid + '\'' + + ", cusip='" + cusip + '\'' + + ", limitPay='" + limitPay + '\'' + + ", vspCusid='" + vspCusid + '\'' + + ", amount=" + amount + + ", acct='" + acct + '\'' + + ", sceneInfo='" + sceneInfo + '\'' + + ", balancePayList=" + balancePayList + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryInExpDetail.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryInExpDetail.java new file mode 100644 index 0000000..03390a5 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryInExpDetail.java @@ -0,0 +1,106 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 查询账户收支明细 + * + * @author LGH + */ +public class QueryInExpDetail extends AbstractOrderReq { + + /** + * 账户集编号 + */ + private String accountSetNo; + /** + * 开始日期 + */ + private String dateStart; + /** + * 结束日期 + */ + private String dateEnd; + /** + * 起始位置 例如:11-100 startPosition=11 + */ + private Integer startPosition; + /** + * 查询条数 例如:11-100 queryNum=90 + */ + private Integer queryNum; + /** + * 金额类型: 1:余额 2:未结算余额 3:物业费 4:停车费 5:商城收益 + */ + private Integer amountType; + + + /** + * 方法名称 + */ + public static final String METHOD_NAME = "queryInExpDetail"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + + public QueryInExpDetail() { + } + + public QueryInExpDetail(String bizUserId, String accountSetNo, + Integer startPosition, Integer queryNum) { + this.bizUserId = bizUserId; + this.accountSetNo = accountSetNo; + this.startPosition = startPosition; + this.queryNum = queryNum; + } + + public String getAccountSetNo() { + return accountSetNo; + } + + public void setAccountSetNo(String accountSetNo) { + this.accountSetNo = accountSetNo; + } + + public String getDateStart() { + return dateStart; + } + + public void setDateStart(String dateStart) { + this.dateStart = dateStart; + } + + public String getDateEnd() { + return dateEnd; + } + + public void setDateEnd(String dateEnd) { + this.dateEnd = dateEnd; + } + + public Integer getStartPosition() { + return startPosition; + } + + public void setStartPosition(Integer startPosition) { + this.startPosition = startPosition; + } + + public Integer getQueryNum() { + return queryNum; + } + + public void setQueryNum(Integer queryNum) { + this.queryNum = queryNum; + } + + public Integer getAmountType() { + return amountType; + } + + public void setAmountType(Integer amountType) { + this.amountType = amountType; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryOrderSplitRuleListDetail.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryOrderSplitRuleListDetail.java new file mode 100644 index 0000000..32e720a --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryOrderSplitRuleListDetail.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 查询余额 + * + * @author LGH + */ +public class QueryOrderSplitRuleListDetail extends AbstractOrderReq { + + /** + * 商户订单号(支付订单) + */ + private String bizOrderNo; + + /** + * 方法名称 + */ + public static final String METHOD_NAME = "getOrderSplitRuleListDetail"; + + public QueryOrderSplitRuleListDetail(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + @Override + public String toString() { + return "QueryOrderSplitRuleListDetail{" + + "bizOrderNo='" + bizOrderNo + '\'' + + '}'; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/Refund.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/Refund.java new file mode 100644 index 0000000..f7dc249 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/Refund.java @@ -0,0 +1,175 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +import java.util.List; + +/** + * 退款申请(allinpay.yunst.orderService.refund) + * + * @author lhd + */ + +public class Refund extends AbstractOrderReq { + /** + * 商户订单号(支付订单) + * 全局唯一,不可重复,商户侧务必保障此订单号全局唯一,不可重复,如订单号重复,则影响订单代付及退款。 + * 不可包含“|”字符 + */ + private String bizOrderNo; + /** + * 商户原订单号 + */ + private String oriBizOrderNo; + /** + * 原云商通订单号,上送,则按照此字段进行退款 + * 未上送,则按照商户订单号进行退款 + */ + private String oriOrderNo; + + /** + * 退款方式,默认D1 + * D1:D+1日14:30——18:00分批向渠道发起退款,退款到账时间以实际到账为准 + * D0:D+0实时向渠道发起退款 + * 说明:此参数仅对支持退款金额原路返回的支付订单有效 + */ + private String refundType; + /** + * 商户系统用户标识,商户系统中唯一编号。 + * 付款人 + */ + private List refundList; + /** + * 后台通知地址 + */ + private String backUrl; + /** + * 本次退款总金额 + */ + private Long amount; + + private static final String METHOD_NAME = "refund"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getOriBizOrderNo() { + return oriBizOrderNo; + } + + public void setOriBizOrderNo(String oriBizOrderNo) { + this.oriBizOrderNo = oriBizOrderNo; + } + + public String getOriOrderNo() { + return oriOrderNo; + } + + public void setOriOrderNo(String oriOrderNo) { + this.oriOrderNo = oriOrderNo; + } + + public String getRefundType() { + return refundType; + } + + public void setRefundType(String refundType) { + this.refundType = refundType; + } + + public List getRefundList() { + return refundList; + } + + public void setRefundList(List refundList) { + this.refundList = refundList; + } + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + @Override + public String toString() { + return "Refund{" + + "bizOrderNo='" + bizOrderNo + '\'' + + ", oriBizOrderNo='" + oriBizOrderNo + '\'' + + ", oriOrderNo='" + oriOrderNo + '\'' + + ", refundType='" + refundType + '\'' + + ", refundList=" + refundList + + ", backUrl='" + backUrl + '\'' + + ", amount='" + amount + '\'' + + '}'; + } + + public static class RefundAccountInfo { + /** + * 非必填,账户集编号;不送:默认从平台中间账户集退款(标准版代收付需原扣减原recieverList金额) + * ;上送:云商通分配的托管专用账户集的编号,则从bizUserId用户退款。 + */ + private String accountSetNo; + /** + * 商户系统用户标识,商户系统中唯一编号。 + */ + private String bizUserId; + /** + * 金额,单位:分 + */ + private Long amount; + + public String getAccountSetNo() { + return accountSetNo; + } + + public void setAccountSetNo(String accountSetNo) { + this.accountSetNo = accountSetNo; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + @Override + public String toString() { + return "RefundItem{" + + "accountSetNo='" + accountSetNo + '\'' + + ", bizUserId='" + bizUserId + '\'' + + ", amount=" + amount + + '}'; + } + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ResendPaySmsReq.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ResendPaySmsReq.java new file mode 100644 index 0000000..9fa66fe --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/ResendPaySmsReq.java @@ -0,0 +1,43 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 重发支付短信验证码 请求参数 + * + * @author TRACK + */ +public class ResendPaySmsReq extends AbstractOrderReq { + public static final String METHOD_NAME = "resendPaySMS"; + + /** + * 商户订单号 + */ + private String bizOrderNo; + + public ResendPaySmsReq() { + + } + + public ResendPaySmsReq(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + @Override + public String toString() { + return "ResendPaySmsReq{" + + "bizOrderNo='" + bizOrderNo + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/UnfreezeMoney.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/UnfreezeMoney.java new file mode 100644 index 0000000..7891b73 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/UnfreezeMoney.java @@ -0,0 +1,65 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 解冻金额 + * + * @author LGH + */ +public class UnfreezeMoney extends AbstractOrderReq { + + /** + * 商户冻结金额订单号 + */ + private String bizFreezenNo; + /** + * 账户集编号 + */ + private String accountSetNo; + /** + * 冻结金额 + */ + private Integer amount; + + + public static final String METHOD_NAME = "unfreezeMoney"; + + public UnfreezeMoney() { + } + + public UnfreezeMoney(String bizUserId, String bizFreezenNo, String accountSetNo, Integer amount) { + this.bizUserId = bizUserId; + this.bizFreezenNo = bizFreezenNo; + this.accountSetNo = accountSetNo; + this.amount = amount; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public String getBizFreezenNo() { + return bizFreezenNo; + } + + public void setBizFreezenNo(String bizFreezenNo) { + this.bizFreezenNo = bizFreezenNo; + } + + public String getAccountSetNo() { + return accountSetNo; + } + + public void setAccountSetNo(String accountSetNo) { + this.accountSetNo = accountSetNo; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/WithdrawApplyReq.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/WithdrawApplyReq.java new file mode 100644 index 0000000..8a00e6e --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/WithdrawApplyReq.java @@ -0,0 +1,206 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 提现申请请求 + * @author TRACK + */ +public class WithdrawApplyReq extends AbstractOrderReq { + + public static final String METHOD_NAME = "withdrawApply"; + + /** + *商户订单号(支付订单) 全局唯一 + */ + private String bizOrderNo; + + /** + * 商户系统用户标识,商户系统中唯一编号。 + */ + private String bizUserId; + + /** + * 托管账户集编号(个人,企业会员使用) + */ + private String accountSetNo; + + /** + * 订单金额 单位:分,包含手续费 + */ + private Long amount; + + /** + * 手续费 内扣,如果不存在,则填0。 默认0 + */ + private Long fee; + + /** + * 交易验证方式 0.仅渠道验证,通商云不做交易验证 1.通商云发送并验证短信验证码,有效期3分钟。2.验证通商云支付密码 + */ + private Long validateType; + + /** + *后台通知地址 + */ + private String backUrl; + + /** + * 订单过期时间 yyyy-MM-dd HH:mm:ss + * 控制订单可支付时间,订单最长时效为24小时,即过期时间不能大于订单创建时间24小时; + */ + private String orderExpireDatetime; + + /** + *银行卡号/账号 + */ + private String bankCardNo; + + /** + *银行卡/账户属性 0:个人银行卡 1:企业对公账户 + */ + private Integer bankCardPro; + + /** + * 行业代码 默认1910 + */ + private String industryCode; + + /** + * 行业名称 默认其他 + */ + private String industryName; + + /** + * 访问终端类型 + */ + private Integer source; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + @Override + public String getBizUserId() { + return bizUserId; + } + + @Override + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getAccountSetNo() { + return accountSetNo; + } + + public void setAccountSetNo(String accountSetNo) { + this.accountSetNo = accountSetNo; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Long getFee() { + return fee; + } + + public void setFee(Long fee) { + this.fee = fee; + } + + public Long getValidateType() { + return validateType; + } + + public void setValidateType(Long validateType) { + this.validateType = validateType; + } + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } + + public String getOrderExpireDatetime() { + return orderExpireDatetime; + } + + public void setOrderExpireDatetime(String orderExpireDatetime) { + this.orderExpireDatetime = orderExpireDatetime; + } + + public String getBankCardNo() { + return bankCardNo; + } + + public void setBankCardNo(String bankCardNo) { + this.bankCardNo = bankCardNo; + } + + public Integer getBankCardPro() { + return bankCardPro; + } + + public void setBankCardPro(Integer bankCardPro) { + this.bankCardPro = bankCardPro; + } + + public String getIndustryCode() { + return industryCode; + } + + public void setIndustryCode(String industryCode) { + this.industryCode = industryCode; + } + + public String getIndustryName() { + return industryName; + } + + public void setIndustryName(String industryName) { + this.industryName = industryName; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + @Override + public String toString() { + return "WithdrawApplyReq{" + + "bizOrderNo='" + bizOrderNo + '\'' + + ", bizUserId='" + bizUserId + '\'' + + ", accountSetNo='" + accountSetNo + '\'' + + ", amount=" + amount + + ", fee=" + fee + + ", validateType=" + validateType + + ", backUrl='" + backUrl + '\'' + + ", orderExpireDatetime='" + orderExpireDatetime + '\'' + + ", bankCardNo='" + bankCardNo + '\'' + + ", bankCardPro=" + bankCardPro + + ", industryCode='" + industryCode + '\'' + + ", industryName='" + industryName + '\'' + + ", source=" + source + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/AgentPayResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/AgentPayResp.java new file mode 100644 index 0000000..1f98889 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/AgentPayResp.java @@ -0,0 +1,101 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +/** + * 单笔托管代付列表请求返回 + * + * @author lhd + */ +public class AgentPayResp { + /** + * 托管代付状态 + * 1、成功:success + * 2、进行中:pending + * 3、失败:fail + */ + private String payStatus; + + /** + * 支付失败信息,只有payStatus为fail时有效 + */ + private String payFailMessage; + + /** + * 云商通订单号 + */ + private String orderNo; + + /** + * 商户订单号(支付订单) + */ + private String bizOrderNo; + + /** + * 代付去向,1.到账户余额 + */ + private String payWhereabouts; + + /** + * 扩展参数 + */ + private String extendInfo; + + public String getPayStatus() { + return payStatus; + } + + public void setPayStatus(String payStatus) { + this.payStatus = payStatus; + } + + public String getPayFailMessage() { + return payFailMessage; + } + + public void setPayFailMessage(String payFailMessage) { + this.payFailMessage = payFailMessage; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getPayWhereabouts() { + return payWhereabouts; + } + + public void setPayWhereabouts(String payWhereabouts) { + this.payWhereabouts = payWhereabouts; + } + + public String getExtendInfo() { + return extendInfo; + } + + public void setExtendInfo(String extendInfo) { + this.extendInfo = extendInfo; + } + + @Override + public String toString() { + return "AgentPayResp{" + + "payStatus='" + payStatus + '\'' + + ", payFailMessage='" + payFailMessage + '\'' + + ", orderNo='" + orderNo + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", payWhereabouts='" + payWhereabouts + '\'' + + ", extendInfo='" + extendInfo + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ApplicationTransferResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ApplicationTransferResp.java new file mode 100644 index 0000000..55a95e8 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ApplicationTransferResp.java @@ -0,0 +1,47 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +/** + * 平台转账 返回 + * + * @author LGH + */ +public class ApplicationTransferResp { + /** + * 云账户转账编号 + */ + private String transferNo; + /** + * 商户系统转账编号 + */ + private String bizTransferNo; + /** + * 云账户编号 + */ + private Integer amount; + + public String getTransferNo() { + return transferNo; + } + + public void setTransferNo(String transferNo) { + this.transferNo = transferNo; + } + + public String getBizTransferNo() { + return bizTransferNo; + } + + public void setBizTransferNo(String bizTransferNo) { + this.bizTransferNo = bizTransferNo; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/GetOrderStatusResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/GetOrderStatusResp.java new file mode 100644 index 0000000..d3e5f7d --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/GetOrderStatusResp.java @@ -0,0 +1,99 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @author TRACK + */ +public class GetOrderStatusResp { + + @Schema(description = "云商通订单号") + private String orderNo; + + @Schema(description = "商户订单号") + private String bizOrderNo; + + @Schema(description = "订单状态") + private Long orderStatus; + + @Schema(description = "失败原因") + private String errorMessage; + + @Schema(description = "订单金额") + private Long amount; + + @Schema(description = "订单支付完成时间") + private String payDateTime; + + @Schema(description = "是否记账成功") + private Long isAccountSuccess; + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public Long getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Long orderStatus) { + this.orderStatus = orderStatus; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public String getPayDateTime() { + return payDateTime; + } + + public void setPayDateTime(String payDateTime) { + this.payDateTime = payDateTime; + } + + public Long getIsAccountSuccess() { + return isAccountSuccess; + } + + public void setIsAccountSuccess(Long isAccountSuccess) { + this.isAccountSuccess = isAccountSuccess; + } + + @Override + public String toString() { + return "GetOrderStatusResp{" + + "orderNo='" + orderNo + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", orderStatus=" + orderStatus + + ", errorMessage='" + errorMessage + '\'' + + ", amount=" + amount + + ", payDateTime='" + payDateTime + '\'' + + ", isAccountSuccess=" + isAccountSuccess + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/InExpDetail.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/InExpDetail.java new file mode 100644 index 0000000..048dfd8 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/InExpDetail.java @@ -0,0 +1,108 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + + +/** + * 查询账户收支明细 返回 + * + * @author LGH + */ +public class InExpDetail { + + /** + * 订单号 + */ + private String bizOrderNo; + /** + * 现有冻结金额 + */ + private Integer curFreezenAmount; + /** + * 收支明细流水号 + */ + private String tradeNo; + /** + * 原始金额 + */ + private Integer oriAmount; + /** + * 现有金额 + */ + private Integer curAmount; + /** + * 变更金额 + */ + private Integer chgAmount; + /** + * 变更时间 + */ + private String changeTime; + /** + * 账户集名称 + */ + private String accountSetName; + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public Integer getCurFreezenAmount() { + return curFreezenAmount; + } + + public void setCurFreezenAmount(Integer curFreezenAmount) { + this.curFreezenAmount = curFreezenAmount; + } + + public String getTradeNo() { + return tradeNo; + } + + public void setTradeNo(String tradeNo) { + this.tradeNo = tradeNo; + } + + public Integer getOriAmount() { + return oriAmount; + } + + public void setOriAmount(Integer oriAmount) { + this.oriAmount = oriAmount; + } + + public Integer getCurAmount() { + return curAmount; + } + + public void setCurAmount(Integer curAmount) { + this.curAmount = curAmount; + } + + public Integer getChgAmount() { + return chgAmount; + } + + public void setChgAmount(Integer chgAmount) { + this.chgAmount = chgAmount; + } + + public String getChangeTime() { + return changeTime; + } + + public void setChangeTime(String changeTime) { + this.changeTime = changeTime; + } + + public String getAccountSetName() { + return accountSetName; + } + + public void setAccountSetName(String accountSetName) { + this.accountSetName = accountSetName; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/OrderDetailResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/OrderDetailResp.java new file mode 100644 index 0000000..30860ae --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/OrderDetailResp.java @@ -0,0 +1,29 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +/** + * 订单状态 返回 + * + * @author LGH + */ +public class OrderDetailResp { + /** + * 未支付 1 + * 交易失败 3 交易过程中出现错误 + * 交易成功 4 + * 交易成功 -发生退款 5 交易成功,但是发生了退款。 + * 关闭 6 整型 订单在过期时间内,没有进行确认操作。 + * 进行中 99 + */ + + private Integer orderStatus; + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/PayByPwdResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/PayByPwdResp.java new file mode 100644 index 0000000..dd81b78 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/PayByPwdResp.java @@ -0,0 +1,76 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +/** + * 余额支付确认支付后响应参数 + * + * @author lhd + */ +public class PayByPwdResp { + /** + * 成功:success + * 进行中:pending + * 未支付:unpay + * 失败:fail + * 支付状态发生变化时还将发送异步通知:提现在成功和失败都会通知商户;其他订单只在成功时通知商户。 + */ + private String payStatus; + + /** + * 支付失败信息 + * payStatus为fail和unpay时有效; + * 其中payStatus返回unpay时,仅针对收银宝快捷短信验证码输入错误场景,允许商户继续调用确认支付 + */ + private String payFailMessage; + + /** + * 商户系统用户标识,商户系统中唯一编号。 + */ + private String bizUserId; + + /** + * 商户订单号(支付订单) + */ + private String bizOrderNo; + + public String getPayStatus() { + return payStatus; + } + + public void setPayStatus(String payStatus) { + this.payStatus = payStatus; + } + + public String getPayFailMessage() { + return payFailMessage; + } + + public void setPayFailMessage(String payFailMessage) { + this.payFailMessage = payFailMessage; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + @Override + public String toString() { + return "PayByPwdResp{" + + "payStatus='" + payStatus + '\'' + + ", payFailMessage='" + payFailMessage + '\'' + + ", bizUserId='" + bizUserId + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/QueryInExpDetailResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/QueryInExpDetailResp.java new file mode 100644 index 0000000..d3dcf3b --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/QueryInExpDetailResp.java @@ -0,0 +1,57 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +import java.util.List; + +/** + * 账单明细 + * + * @author LGH + */ +public class QueryInExpDetailResp { + + /** + * 用户标志 + */ + private String bizUserId; + /** + * 总条数 + */ + private Long totalNum; + /** + * 账单明细集合 + */ + private List inExpDetail; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public Long getTotalNum() { + return totalNum; + } + + public void setTotalNum(Long totalNum) { + this.totalNum = totalNum; + } + + public List getInExpDetail() { + return inExpDetail; + } + + public void setInExpDetail(List inExpDetail) { + this.inExpDetail = inExpDetail; + } + + @Override + public String toString() { + return "QueryInExpDetailResp{" + + "bizUserId='" + bizUserId + '\'' + + ", totalNum=" + totalNum + + ", inExpDetail=" + inExpDetail + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/QueryReserveFundBalanceResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/QueryReserveFundBalanceResp.java new file mode 100644 index 0000000..54920ac --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/QueryReserveFundBalanceResp.java @@ -0,0 +1,69 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +/** + * @author gaozijie + * @date 2023-06-02 + */ +public class QueryReserveFundBalanceResp { + /** + * 账户号 + */ + private String accountNo; + /** + * 账户名 + */ + private String accountName; + /** + * 余额 + */ + private Long balance; + /** + * 是否默认结算户 + */ + private Long defClr; + + public QueryReserveFundBalanceResp() { + } + + public String getAccountNo() { + return accountNo; + } + + public void setAccountNo(String accountNo) { + this.accountNo = accountNo; + } + + public String getAccountName() { + return accountName; + } + + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + + public Long getDefClr() { + return defClr; + } + + public void setDefClr(Long defClr) { + this.defClr = defClr; + } + + @Override + public String toString() { + return "QueryReserveFundBalanceResp{" + + "accountNo='" + accountNo + '\'' + + ", accountName='" + accountName + '\'' + + ", balance=" + balance + + ", defClr=" + defClr + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/RefundResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/RefundResp.java new file mode 100644 index 0000000..0319f9e --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/RefundResp.java @@ -0,0 +1,55 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +/** + * 退款申请返回(allinpay.yunst.orderService.refund) + * + * @author lhd + */ + +public class RefundResp { + /** + * 云商通订单号 + */ + private String orderNo; + /** + * 商户订单号(支付订单) + */ + private String bizOrderNo; + /** + * 本次退款总金额 + */ + private String amount; + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + @Override + public String toString() { + return "RefundResp{" + + "orderNo='" + orderNo + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", amount='" + amount + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ResendPaySmsResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ResendPaySmsResp.java new file mode 100644 index 0000000..a80b976 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ResendPaySmsResp.java @@ -0,0 +1,56 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +/** + * 重发支付短信验证码返回 + * @author TRACK + */ +public class ResendPaySmsResp { + + /** + * 商户订单号 + */ + private String bizOrderNo; + + /** + * 云商通订单号 + */ + private String orderNo; + + /** + * 手机号码 + */ + private String phone; + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + @Override + public String toString() { + return "ResendPaySms{" + + "bizOrderNo='" + bizOrderNo + '\'' + + ", orderNo='" + orderNo + '\'' + + ", phone='" + phone + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/service/AllinpayMemberService.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/service/AllinpayMemberService.java new file mode 100644 index 0000000..9052edc --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/service/AllinpayMemberService.java @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.allinpay.service; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.*; +import com.tmerclub.cloud.payment.allinpay.OpenClient; +import com.tmerclub.cloud.payment.allinpay.member.req.*; +import com.tmerclub.cloud.payment.allinpay.member.resp.*; +import com.tmerclub.cloud.payment.config.AllinpayConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author LGH + */ +@Component +public class AllinpayMemberService { + + @Autowired + private AllinpayConfig allinpayConfig; + + /** + * @param cm 创建会员 + */ + public void createMember(CreateMember cm) { + allinpayConfig.sendCreateData(cm); + } + + /** + * @param svc 绑定手机号 - 发送短信验证码 + */ + public void sendVerificationCode(SendVerificationCode svc) { + allinpayConfig.sendData(svc, PhoneVerificationResp.class); + } + + /** + * @param bindPhone 绑定手机 + */ + public void bindPhone(BindPhone bindPhone) { + allinpayConfig.sendData(bindPhone, PhoneVerificationResp.class); + } + + /** + * @param unbindPhone 解绑手机 + * @return + */ + public PhoneVerificationResp unbindPhone(UnbindPhone unbindPhone) { + return allinpayConfig.sendData(unbindPhone, PhoneVerificationResp.class); + } + + /** + * 修改绑定手机 + * + * @param updatePhoneByPayPwd + * @return + */ + public String updatePhoneByPayPwd(UpdatePhoneByPayPwd updatePhoneByPayPwd) { + return allinpayConfig.sendUrlData(updatePhoneByPayPwd); + } + + /** + * @param setRealName 个人实名认证 + */ + public void setRealName(SetRealName setRealName) { + allinpayConfig.sendData(setRealName, SetRealNameResp.class); + } + + /** + * @param setCompanyInfo 设置企业信息 + * @return + */ + public SetCompanyInfoResp setCompanyInfo(SetCompanyInfo setCompanyInfo) { + return allinpayConfig.sendData(setCompanyInfo, SetCompanyInfoResp.class); + } + + /** + * 影印件采集 + * + * @param idCardCollect + * @return + */ + public IdCardCollectResp idCardCollect(IdCardCollect idCardCollect) { + return allinpayConfig.sendData(idCardCollect, IdCardCollectResp.class); + } + + /** + * 影印件采集(文件上传模式) + * + * @param idCardCollectByFileUpload + * @return + */ + public IdCardCollectByFileUploadResp idcardCollectByFileUpload(IdCardCollectByFileUpload idCardCollectByFileUpload) { + return allinpayConfig.sendData(idCardCollectByFileUpload, IdCardCollectByFileUploadResp.class); + } + + /** + * @param updateCompanyInfo 修改企业信息 + * @return + */ + public UpdateCompanyInfoResp updateCompanyInfo(UpdateCompanyInfo updateCompanyInfo) { + return allinpayConfig.sendData(updateCompanyInfo, UpdateCompanyInfoResp.class); + } + + + /** + * 获取个人会员信息 + * + * @return + */ + public UserInfo getMemberInfo(GetMemberInfo getMemberInfo) { + MemberInfo memberInfo = allinpayConfig.sendData(getMemberInfo, MemberInfo.class); + return JSON.parseObject(memberInfo.getMemberInfo(), UserInfo.class); + } + + /** + * 获取企业用户信息 + */ + public CompanyInfo getCompanyInfo(GetMemberInfo getMemberInfo) { + MemberInfo memberInfo = allinpayConfig.sendData(getMemberInfo, MemberInfo.class); + return JSON.parseObject(memberInfo.getMemberInfo(), CompanyInfo.class); + } + + /** + * 查询卡bin + */ + public CardBinInfo getBankCardBin(GetBankCardBin getBankCardBin) { + BankCardBin bankCardBin = allinpayConfig.sendData(getBankCardBin, BankCardBin.class); + return JSON.parseObject(bankCardBin.getCardBinInfo(), CardBinInfo.class); + } + + /** + * 绑定银行卡 + */ + public ApplyBindBankCardResp applyBindBankCard(ApplyBindBankCard applyBindBankCard) { + return allinpayConfig.sendData(applyBindBankCard, ApplyBindBankCardResp.class); + } + + /** + * 确认绑定银行卡 + */ + public void bindBankCard(BindBankCard bindBankCard) { + allinpayConfig.sendData(bindBankCard, BindBankCardResp.class); + } + + /** + * 获取用户所绑定的银行卡 + */ + public List queryBankCard(QueryBankCard queryBankCard) { + QueryBankCardResp queryBankCardResp = allinpayConfig.sendData(queryBankCard, QueryBankCardResp.class); + // 卡号解密 + List bindCards = queryBankCardResp.getBindCardList(); + OpenClient client = allinpayConfig.getClient(); + for (BindCard bindCard : bindCards) { + bindCard.setBankCardNo(client.decrypt(bindCard.getBankCardNo())); + } + return bindCards; + } + + /** + * 解除绑定银行卡 + */ + public void unbindBankCard(UnbindBankCard unbindBankCard) { + allinpayConfig.sendData(unbindBankCard, CardNoWithUid.class); + } + + /** + * 锁定会员 + */ + public void lockMember(LockMember lockMember) { + allinpayConfig.sendData(lockMember, BizUserId.class); + } + + /** + * 解锁会员 + */ + public void unlockMember(UnlockMember unlockMember) { + allinpayConfig.sendData(unlockMember, BizUserId.class); + } + + /** + * @param applyBindAcct 会员绑定支付账户用户标识 + * @return + */ + public Result applyBindAcct(ApplyBindAcct applyBindAcct) { + return allinpayConfig.sendData(applyBindAcct, Result.class); + } + + /** + * 查询会员绑定支付账户用户标识 + * + * @param applyBindAcct + * @return + */ + public QueryBindAcctResp queryBindAcct(ApplyBindAcct applyBindAcct) { + return allinpayConfig.sendData(applyBindAcct, QueryBindAcctResp.class); + } + + /** + * @param setPayPwd 设置支付密码 + * @return + */ + public String setPayPwd(SetPayPwd setPayPwd) { + return allinpayConfig.sendUrlData(setPayPwd); + } + + /** + * @param updatePayPwd 设置支付密码 + * @return + */ + public String updatePayPwd(UpdatePayPwd updatePayPwd) { + return allinpayConfig.sendUrlData(updatePayPwd); + } + + /** + * @param resetPayPwd 重置支付密码 + * @return + */ + public String resetPayPwd(ResetPayPwd resetPayPwd) { + return allinpayConfig.sendUrlData(resetPayPwd); + } + + /** + * 企业会员绑定对公户 + * + * @param bindCompanyAccount + */ + public void bindCompanyAccount(BindCompanyAccount bindCompanyAccount) { + allinpayConfig.sendData(bindCompanyAccount, BizUserId.class); + } + + /** + * 账户提现协议签约 + * + * @param signAcctProtocol + * @return + */ + public String signAcctProtocol(SignAcctProtocol signAcctProtocol) { + return allinpayConfig.sendUrlData(signAcctProtocol); + } + + /** + * 账户协议签约查询 + * + * @param signContractQuery + * @return + */ + public String signContractQuery(SignContractQuery signContractQuery) { + return allinpayConfig.sendUrlData(signContractQuery); + } + + /** + * 修改绑定手机(银行卡验证) + * + * @param bankCardChangeBindPhone + * @return + */ + public BankCardChangeBindPhoneResp bankCardChangeBindPhone(BankCardChangeBindPhone bankCardChangeBindPhone) { + return allinpayConfig.sendData(bankCardChangeBindPhone, BankCardChangeBindPhoneResp.class); + } + + /** + * 确认修改绑定手机(银行卡验证) + * + * @param verifyBankCardChangeBindPhone + */ + public void verifyBankCardChangeBindPhone(VerifyBankCardChangeBindPhone verifyBankCardChangeBindPhone) { + allinpayConfig.sendData(verifyBankCardChangeBindPhone, VerifyBankCardChangeBindPhoneResp.class); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/OpTrustManager.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/OpTrustManager.java new file mode 100644 index 0000000..95c96a7 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/OpTrustManager.java @@ -0,0 +1,59 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.util; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; + +/** + * @author lanhai + */ +public class OpTrustManager implements X509TrustManager { + private static volatile OpTrustManager instance; + private SSLSocketFactory sslFactory; + + @Override + public void checkClientTrusted(X509Certificate[] arg0, String arg1) { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + public SSLSocketFactory getSslSocketFactory() { + return this.sslFactory; + } + + private OpTrustManager() { + } + + @SuppressWarnings("rawtypes") + public static OpTrustManager instance() throws NoSuchAlgorithmException, KeyManagementException { + if (instance == null) { + Class var0 = OpTrustManager.class; + synchronized (OpTrustManager.class) { + if (instance == null) { + instance = new OpTrustManager(); + SSLContext sc = SSLContext.getInstance("TLSv1.2"); + sc.init(null, new TrustManager[]{instance}, null); + instance.sslFactory = sc.getSocketFactory(); + } + } + } + + return instance; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/OpenUtils.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/OpenUtils.java new file mode 100644 index 0000000..c5a6a06 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/OpenUtils.java @@ -0,0 +1,41 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.util; + + +import com.tmerclub.cloud.payment.allinpay.bean.CustReq; + +import java.security.PrivateKey; +/** + * @author lanhai + */ +public class OpenUtils { + public static void assertNotNull(Object object, String message) { + if (object == null) { + throw new IllegalArgumentException(message); + } else if (object instanceof String && isEmpty((String) object)) { + throw new IllegalArgumentException(message); + } + } + + public static boolean isEmpty(String str) { + return str == null || str.isEmpty() || str.trim().isEmpty(); + } + + public static String htBankWithdrawSign(CustReq custReq, String certPath, String certPwd) { + assertNotNull(custReq, "custReq is null --参数custReq为空"); + assertNotNull(certPath, "certPath is null --参数certPath为空"); + assertNotNull(certPwd, "certPwd is null --参数certPwd为空"); + assertNotNull(custReq.getAmount(), "AMOUNT is null or empty --参数AMOUNT为空"); + assertNotNull(custReq.getPayeeAcctName(), "PAYEE_ACCT_NAME is null or empty --参数PAYEE_ACCT_NAME为空"); + assertNotNull(custReq.getPayeeAcctNo(), "PAYEE_ACCT_NO is null or empty --参数PAYEE_ACCT_NO为空"); + PrivateKey pk = SecretUtils.loadPrivateKey(null, certPath, certPwd); + return SecretUtils.htSign(pk, custReq.toString()); + } + + private OpenUtils() { + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/SecretUtils.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/SecretUtils.java new file mode 100644 index 0000000..d231f19 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/SecretUtils.java @@ -0,0 +1,321 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.util; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.payment.allinpay.bean.OpException; +import jakarta.validation.constraints.NotNull; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.io.FileInputStream; +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.Enumeration; +import java.util.Locale; +/** + * @author lanhai + */ +public class SecretUtils { + private static final String AES = "AES"; + private static final Provider PROVIDER = new BouncyCastleProvider(); + public static final String DEFAULT_SIGN_TYPE = "SHA256WithRSA"; + public static final Integer LENGTH = 2; + private static final Logger logger = LoggerFactory.getLogger(SecretUtils.class); + + private SecretUtils() { + } + + public static String sign(PrivateKey privateKey, String text, String signType) { + SignAlgorithm signAlgorithm = SecretUtils.SignAlgorithm.fromSignType(signType); + + try { + return sign(privateKey, text, signAlgorithm); + } catch (NoSuchAlgorithmException | SignatureException | InvalidKeyException var5) { + throw new OpException(var5.getMessage(), var5); + } + } + + public static String sign(PrivateKey privateKey, String data, SignAlgorithm signAlgorithm) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException { + String text = signAlgorithm == SecretUtils.SignAlgorithm.SM2 ? data : md5(data); + Signature signature = Signature.getInstance(signAlgorithm.getAlgorithm(), PROVIDER); + signature.initSign(privateKey); + signature.update(text.getBytes(StandardCharsets.UTF_8)); + return Base64.encode(signature.sign()); + } + + public static String htSign(PrivateKey privateKey, String text) { + try { + Signature signature = Signature.getInstance("SHA1WithRSA", PROVIDER); + signature.initSign(privateKey); + signature.update(text.getBytes(StandardCharsets.UTF_8)); + byte[] data = signature.sign(); + return Base64.encode(data); + } catch (NoSuchAlgorithmException | SignatureException | InvalidKeyException var4) { + throw new OpException(var4.getMessage(), var4); + } + } + + public static boolean verify(PublicKey publicKey, String text, String sign) { + return verify(publicKey, text, sign, "SHA256WithRSA"); + } + + public static boolean verify(PublicKey publicKey, String text, String sign, String signType) { + if (OpenUtils.isEmpty(sign)) { + return false; + } else { + SignAlgorithm signAlgorithm = SecretUtils.SignAlgorithm.fromSignType(signType); + return verify(publicKey, text, sign, signAlgorithm); + } + } + + public static boolean verify(PublicKey publicKey, String data, String sign, SignAlgorithm signAlgorithm) { + String text = signAlgorithm == SecretUtils.SignAlgorithm.SM2 ? data : md5(data); + + try { + Signature signature = Signature.getInstance(signAlgorithm.getAlgorithm(), PROVIDER); + signature.initVerify(publicKey); + signature.update(text.getBytes(StandardCharsets.UTF_8)); + return signature.verify(Base64.decode(sign)); + } catch (NoSuchAlgorithmException | SignatureException | InvalidKeyException var6) { + logger.error("签名验签失败,{}", var6.getMessage(), var6); + return false; + } + } + + public static String md5(String src) { + String result = ""; + + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + result = Base64.encode(md.digest(src.getBytes(StandardCharsets.UTF_8))); + } catch (Exception var3) { + logger.error(var3.getMessage(), var3); + } + + return result; + } + + public static PrivateKey loadPrivateKey(String alias, String path, String password) { + try { + FileInputStream ksfis = new FileInputStream(path); + Throwable var4 = null; + + PrivateKey var21; + try { + KeyStore ks = KeyStore.getInstance("pkcs12", PROVIDER); + char[] storePwd = password.toCharArray(); + char[] keyPwd = password.toCharArray(); + ks.load(ksfis, storePwd); + if (OpenUtils.isEmpty(alias)) { + Enumeration aliases = ks.aliases(); + if (aliases.hasMoreElements()) { + alias = aliases.nextElement(); + } + } + + var21 = (PrivateKey) ks.getKey(alias, keyPwd); + } catch (Throwable var18) { + var4 = var18; + throw var18; + } finally { + if (var4 != null) { + try { + ksfis.close(); + } catch (Throwable var17) { + var4.addSuppressed(var17); + } + } else { + ksfis.close(); + } + + } + + return var21; + } catch (Exception var20) { + throw new OpException(var20.getMessage(), var20); + } + } + + public static PublicKey loadPublicKey(String alias, String path, String password) { + try { + FileInputStream ksfis = new FileInputStream(path); + Throwable var4 = null; + + PublicKey var20; + try { + KeyStore ks = KeyStore.getInstance("pkcs12", PROVIDER); + char[] storePwd = password.toCharArray(); + ks.load(ksfis, storePwd); + if (OpenUtils.isEmpty(alias)) { + Enumeration aliases = ks.aliases(); + if (aliases.hasMoreElements()) { + alias = aliases.nextElement(); + } + } + + var20 = ks.getCertificate(alias).getPublicKey(); + } catch (Throwable var17) { + var4 = var17; + throw var17; + } finally { + if (var4 != null) { + try { + ksfis.close(); + } catch (Throwable var16) { + var4.addSuppressed(var16); + } + } else { + ksfis.close(); + } + + } + + return var20; + } catch (Exception var19) { + throw new OpException(var19.getMessage(), var19); + } + } + + public static PublicKey loadTlPublicKey(String certPath) { + try { + FileInputStream certInputStream = new FileInputStream(certPath); + Throwable var2 = null; + + PublicKey var5; + try { + CertificateFactory certificatefactory = CertificateFactory.getInstance("X.509"); + X509Certificate cert = (X509Certificate) certificatefactory.generateCertificate(certInputStream); + var5 = cert.getPublicKey(); + } catch (Throwable var15) { + var2 = var15; + throw var15; + } finally { + if (var2 != null) { + try { + certInputStream.close(); + } catch (Throwable var14) { + var2.addSuppressed(var14); + } + } else { + certInputStream.close(); + } + + } + + return var5; + } catch (Exception var17) { + throw new OpException(var17.getMessage(), var17); + } + } + + public static String encryptAes(String plainText, String privateKey) { + try { + SecretKeySpec secretKeySpec = getSecretKeySpec(privateKey); + Cipher cipher = Cipher.getInstance("AES"); + byte[] byteContent = plainText.getBytes(StandardCharsets.UTF_8); + cipher.init(1, secretKeySpec); + byte[] byteRresult = cipher.doFinal(byteContent); + StringBuilder sb = new StringBuilder(Constant.INITIAL_CAPACITY); + int var12 = byteRresult.length; + + for (byte element : byteRresult) { + String hex = Integer.toHexString(element & 255); + if (hex.length() == 1) { + hex = '0' + hex; + } + + sb.append(hex.toUpperCase(Locale.ROOT)); + } + + return sb.toString(); + } catch (Exception var16) { + logger.error("AES加密失败,{} ", var16.getMessage(), var16); + return plainText; + } + } + + public static String decryptAes(String cipherText, String privateKey) { + try { + if (cipherText.length() < 1) { + return null; + } else { + byte[] byteRresult = new byte[cipherText.length() / 2]; + + for (int i = 0; i < cipherText.length() / LENGTH; ++i) { + int high = Integer.parseInt(cipherText.substring(i << 1, (i << 1) + 1), 16); + int low = Integer.parseInt(cipherText.substring((i << 1) + 1, (i << 1) + 2), 16); + byteRresult[i] = (byte) ((high << 4) + low); + } + + SecretKeySpec secretKeySpec = getSecretKeySpec(privateKey); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(2, secretKeySpec); + byte[] result = cipher.doFinal(byteRresult); + return new String(result, StandardCharsets.UTF_8); + } + } catch (Exception var10) { + logger.error("AES解密失败,{} ", var10.getMessage(), var10); + return cipherText; + } + } + + @NotNull + private static SecretKeySpec getSecretKeySpec(String privateKey) throws NoSuchAlgorithmException { + KeyGenerator kgen = KeyGenerator.getInstance("AES"); + SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); + random.setSeed(privateKey.getBytes(StandardCharsets.UTF_8)); + kgen.init(128, random); + SecretKey secretKey = kgen.generateKey(); + byte[] enCodeFormat = secretKey.getEncoded(); + return new SecretKeySpec(enCodeFormat, "AES"); + } + + private enum SignAlgorithm { + /** + * SHA256WithRSA + */ + RSA2("SHA256WithRSA", "SHA256WithRSA"), + RSA("RSA", "SHA1WithRSA"), + SM2("SM2", "SM3withSM2"); + + private final String signType; + private final String algorithm; + + SignAlgorithm(String signType, String algorithm) { + this.signType = signType; + this.algorithm = algorithm; + } + + public String getSignType() { + return this.signType; + } + + public String getAlgorithm() { + return this.algorithm; + } + + public static SignAlgorithm fromSignType(String signType) { + SignAlgorithm[] var1 = values(); + int var2 = var1.length; + + for (SignAlgorithm item : var1) { + if (item.getSignType().equals(signType)) { + return item; + } + } + + return RSA2; + } + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Sm2Utils.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Sm2Utils.java new file mode 100644 index 0000000..bd9839d --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Sm2Utils.java @@ -0,0 +1,72 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.util; + +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.FileInputStream; +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.Enumeration; +/** + * @author lanhai + */ +public class Sm2Utils { + private static final Provider PROVIDER = new BouncyCastleProvider(); + private static final Logger logger = LoggerFactory.getLogger(Sm2Utils.class); + + public static String sign(PrivateKey privateKey, String text) throws Exception { + Signature signature = Signature.getInstance("SM3withSm2", PROVIDER); + signature.initSign(privateKey); + byte[] plainText = text.getBytes(StandardCharsets.UTF_8); + signature.update(plainText); + byte[] signatureValue = signature.sign(); + return Base64.encode(signatureValue); + } + + public static PublicKey loadPublicKey(String certPath) throws Exception { + PublicKey pubKey; + X509Certificate x509Certificate; + Security.addProvider(PROVIDER); + CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509", "BC"); + FileInputStream fileInputStream = new FileInputStream(certPath); + x509Certificate = (X509Certificate) certificateFactory.generateCertificate(fileInputStream); + fileInputStream.close(); + pubKey = x509Certificate.getPublicKey(); + return pubKey; + } + + public static PrivateKey loadPrivateKey(String certPath, String password) throws Exception { + Security.addProvider(new BouncyCastleProvider()); + KeyStore ks = KeyStore.getInstance("PKCS12", "BC"); + FileInputStream is = new FileInputStream(certPath); + ks.load(is, password.toCharArray()); + is.close(); + Enumeration aliases = ks.aliases(); + String keyAlias = null; + if (aliases.hasMoreElements()) { + keyAlias = aliases.nextElement(); + } + + return (PrivateKey) ks.getKey(keyAlias, password.toCharArray()); + } + + public static boolean verify(PublicKey publicKey, String text, String sign) throws Exception { + if (OpenUtils.isEmpty(sign)) { + return false; + } else { + Signature signature = Signature.getInstance("SM3withSm2", PROVIDER); + signature.initVerify(publicKey); + signature.update(text.getBytes(StandardCharsets.UTF_8)); + byte[] signed = Base64.decode(sign); + return signature.verify(signed); + } + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Sm4.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Sm4.java new file mode 100644 index 0000000..6229578 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Sm4.java @@ -0,0 +1,151 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.util; + +/** + * @author lanhai + */ +@SuppressWarnings("AlibabaUndefineMagicConstant") +public class Sm4 { + public static final int SM4_ENCRYPT = 1; + public static final int SM4_DECRYPT = 0; + public static final byte[] S_BOX_TABLE = {-42, -112, -23, -2, -52, -31, 61, -73, 22, -74, 20, -62, 40, -5, 44, 5, 43, 103, -102, 118, 42, -66, 4, -61, -86, 68, 19, 38, 73, -122, 6, -103, -100, 66, 80, -12, -111, -17, -104, 122, 51, 84, 11, 67, -19, -49, -84, 98, -28, -77, 28, -87, -55, 8, -24, -107, -128, -33, -108, -6, 117, -113, 63, -90, 71, 7, -89, -4, -13, 115, 23, -70, -125, 89, 60, 25, -26, -123, 79, -88, 104, 107, -127, -78, 113, 100, -38, -117, -8, -21, 15, 75, 112, 86, -99, 53, 30, 36, 14, 94, 99, 88, -47, -94, 37, 34, 124, 59, 1, 33, 120, -121, -44, 0, 70, 87, -97, -45, 39, 82, 76, 54, 2, -25, -96, -60, -56, -98, -22, -65, -118, -46, 64, -57, 56, -75, -93, -9, -14, -50, -7, 97, 21, -95, -32, -82, 93, -92, -101, 52, 26, 85, -83, -109, 50, 48, -11, -116, -79, -29, 29, -10, -30, 46, -126, 102, -54, 96, -64, 41, 35, -85, 13, 83, 78, 111, -43, -37, 55, 69, -34, -3, -114, 47, 3, -1, 106, 114, 109, 108, 91, 81, -115, 27, -81, -110, -69, -35, -68, 127, 17, -39, 92, 65, 31, 16, 90, -40, 10, -63, 49, -120, -91, -51, 123, -67, 45, 116, -48, 18, -72, -27, -76, -80, -119, 105, -105, 74, 12, -106, 119, 126, 101, -71, -15, 9, -59, 110, -58, -124, 24, -16, 125, -20, 58, -36, 77, 32, 121, -18, 95, 62, -41, -53, 57, 72}; + public static final int[] FK = {-1548633402, 1453994832, 1736282519, -1301273892}; + public static final int[] CK = {462357, 472066609, 943670861, 1415275113, 1886879365, -1936483679, -1464879427, -993275175, -521670923, -66909679, 404694573, 876298825, 1347903077, 1819507329, -2003855715, -1532251463, -1060647211, -589042959, -117504499, 337322537, 808926789, 1280531041, 1752135293, -2071227751, -1599623499, -1128019247, -656414995, -184876535, 269950501, 741554753, 1213159005, 1684763257}; + + private long getLongBe(byte[] b, int i) { + return (long) (b[i] & 255) << 24 | ((b[i + 1] & 255) << 16) | ((b[i + 2] & 255) << 8) | (b[i + 3] & 255) & 4294967295L; + } + + private void putLongBe(long n, byte[] b, int i) { + b[i] = (byte) ((int) (255L & n >> 24)); + b[i + 1] = (byte) ((int) (255L & n >> 16)); + b[i + 2] = (byte) ((int) (255L & n >> 8)); + b[i + 3] = (byte) ((int) (255L & n)); + } + + private long shl(long x, int n) { + return (x) << n; + } + + private long rotl(long x, int n) { + return this.shl(x, n) | x >> 32 - n; + } + + private void swap(long[] sk, int i) { + long t = sk[i]; + sk[i] = sk[31 - i]; + sk[31 - i] = t; + } + + private byte sm4Sbox(byte inch) { + int i = inch & 255; + return S_BOX_TABLE[i]; + } + + private long sm4Lt(long ka) { + long bb = getBb(ka); + long c; + c = bb ^ this.rotl(bb, 2) ^ this.rotl(bb, 10) ^ this.rotl(bb, 18) ^ this.rotl(bb, 24); + return c; + } + + private long getBb(long ka) { + long bb; + long c; + byte[] a = new byte[4]; + byte[] b = new byte[4]; + this.putLongBe(ka, a, 0); + b[0] = this.sm4Sbox(a[0]); + b[1] = this.sm4Sbox(a[1]); + b[2] = this.sm4Sbox(a[2]); + b[3] = this.sm4Sbox(a[3]); + bb = this.getLongBe(b, 0); + return bb; + } + + private long sm4F(long x0, long x1, long x2, long x3, long rk) { + return x0 ^ this.sm4Lt(x1 ^ x2 ^ x3 ^ rk); + } + + private long sm4Calcirk(long ka) { + long bb = getBb(ka); + long rk; + rk = bb ^ this.rotl(bb, 13) ^ this.rotl(bb, 23); + return rk; + } + + private void sm4Setkey(long[] sk, byte[] key) { + long[] mk = new long[4]; + long[] k = new long[36]; + int i = 0; + mk[0] = this.getLongBe(key, 0); + mk[1] = this.getLongBe(key, 4); + mk[2] = this.getLongBe(key, 8); + mk[3] = this.getLongBe(key, 12); + k[0] = mk[0] ^ FK[0]; + k[1] = mk[1] ^ FK[1]; + k[2] = mk[2] ^ FK[2]; + + for (k[3] = mk[3] ^ FK[3]; i < 32; ++i) { + k[i + 4] = k[i] ^ this.sm4Calcirk(k[i + 1] ^ k[i + 2] ^ k[i + 3] ^ CK[i]); + sk[i] = k[i + 4]; + } + + } + + private void sm4OneRound(long[] sk, byte[] input, byte[] output) { + int i = 0; + long[] ulbuf = new long[36]; + ulbuf[0] = this.getLongBe(input, 0); + ulbuf[1] = this.getLongBe(input, 4); + ulbuf[2] = this.getLongBe(input, 8); + + for (ulbuf[3] = this.getLongBe(input, 12); i < 32; ++i) { + ulbuf[i + 4] = this.sm4F(ulbuf[i], ulbuf[i + 1], ulbuf[i + 2], ulbuf[i + 3], sk[i]); + } + + this.putLongBe(ulbuf[35], output, 0); + this.putLongBe(ulbuf[34], output, 4); + this.putLongBe(ulbuf[33], output, 8); + this.putLongBe(ulbuf[32], output, 12); + } + + private byte[] padding(byte[] input, int mode) { + if (input == null) { + return null; + } else { + byte[] ret; + if (mode == 1) { + int p = 16 - input.length % 16; + ret = new byte[input.length + p]; + System.arraycopy(input, 0, ret, 0, input.length); + + for (int i = 0; i < p; ++i) { + ret[input.length + i] = (byte) p; + } + } else { + int p = input[input.length - 1]; + ret = new byte[input.length - p]; + System.arraycopy(input, 0, ret, 0, input.length - p); + } + + return ret; + } + } + + public void sm4SetkeyEnc(Sm4Context ctx, byte[] key) throws Exception { + if (ctx == null) { + throw new Exception("ctx is null!"); + } else if (key != null && key.length == 16) { + ctx.mode = 1; + this.sm4Setkey(ctx.sk, key); + } else { + throw new Exception("key error!"); + } + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/PayInfoResultBO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/PayInfoResultBO.java new file mode 100644 index 0000000..de7217a --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/PayInfoResultBO.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 支付后,微信/支付宝返回的一些基础数据 + * @author FrozenWatermelon + * @date 2020/12/25 + */ +public class PayInfoResultBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商城支付单号 + */ + private Long payId; + + /** + * 第三方订单流水号 + */ + private String bizPayNo; + + /** + * 是否支付成功 + */ + private Boolean paySuccess; + + /** + * 支付成功的标记 + */ + private String successString; + + /** + * 支付金额 + */ + private Long payAmount; + + /** + * 支付金额 + */ + private String extendInfo; + + /** + * 回调内容 + */ + private String callbackContent; + + private Long refundId; + + /** + * 支付系统类型(0:默认,1:通联) + */ + private Integer paySysType; + + /** + * 是否为支付宝退款回调 + */ + private Boolean isAliRefund; + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public String getExtendInfo() { + return extendInfo; + } + + public void setExtendInfo(String extendInfo) { + this.extendInfo = extendInfo; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public String getBizPayNo() { + return bizPayNo; + } + + public void setBizPayNo(String bizPayNo) { + this.bizPayNo = bizPayNo; + } + + public Boolean getPaySuccess() { + return paySuccess; + } + + public void setPaySuccess(Boolean paySuccess) { + this.paySuccess = paySuccess; + } + + public String getSuccessString() { + return successString; + } + + public void setSuccessString(String successString) { + this.successString = successString; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public String getCallbackContent() { + return callbackContent; + } + + public void setCallbackContent(String callbackContent) { + this.callbackContent = callbackContent; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Boolean getAliRefund() { + return isAliRefund; + } + + public void setAliRefund(Boolean aliRefund) { + isAliRefund = aliRefund; + } + + @Override + public String toString() { + return "PayInfoResultBO{" + + "payId=" + payId + + ", bizPayNo='" + bizPayNo + '\'' + + ", paySuccess=" + paySuccess + + ", successString='" + successString + '\'' + + ", payAmount=" + payAmount + + ", extendInfo='" + extendInfo + '\'' + + ", callbackContent='" + callbackContent + '\'' + + ", refundId=" + refundId + + ", paySysType=" + paySysType + + ", isAliRefund=" + isAliRefund + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/RefundInfoBO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/RefundInfoBO.java new file mode 100644 index 0000000..d68f591 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/RefundInfoBO.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.bo; + +import com.tmerclub.cloud.common.constant.PayType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 退款信息 + * @author FrozenWatermelon + */ +public class RefundInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 支付方式 + */ + private PayType payType; + + /** + * 支付单号 + */ + private Long payId; + + /** + * 支付单号 + */ + private Long refundId; + + /** + * 退款序号 + */ + private Integer refundNumber; + + /** + * 付款金额 + */ + private Long payAmount; + + /** + * 退款金额 + */ + private Long refundAmount; + + /** + * 通知结果 + */ + private String notifyUrl; + + /** + * 是否直接退款 + */ + private Integer onlyRefund; + + private Long userId; + + /** + * 需要退款的用户,通常为商家id + */ + private Long bizUserId; + + public Long getBizUserId() { + return bizUserId; + } + + public void setBizUserId(Long bizUserId) { + this.bizUserId = bizUserId; + } + + public Integer getRefundNumber() { + return refundNumber; + } + + public void setRefundNumber(Integer refundNumber) { + this.refundNumber = refundNumber; + } + + public PayType getPayType() { + return payType; + } + + public void setPayType(PayType payType) { + this.payType = payType; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public String getNotifyUrl() { + return notifyUrl; + } + + public void setNotifyUrl(String notifyUrl) { + this.notifyUrl = notifyUrl; + } + + public Integer getOnlyRefund() { + return onlyRefund; + } + + public void setOnlyRefund(Integer onlyRefund) { + this.onlyRefund = onlyRefund; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "RefundInfoBO{" + + "payType=" + payType + + ", payId=" + payId + + ", refundId=" + refundId + + ", refundNumber=" + refundNumber + + ", payAmount=" + payAmount + + ", refundAmount=" + refundAmount + + ", notifyUrl='" + notifyUrl + '\'' + + ", onlyRefund=" + onlyRefund + + ", userId=" + userId + + ", bizUserId=" + bizUserId + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/RefundInfoResultBO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/RefundInfoResultBO.java new file mode 100644 index 0000000..2211f97 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/RefundInfoResultBO.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 退款后,微信/支付宝返回的一些基础数据 + * @author FrozenWatermelon + * @date 2020/12/25 + */ +public class RefundInfoResultBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商城退款单号 + */ + private Long refundId; + + /** + * 第三方订单退款流水号 + */ + private String bizRefundNo; + + /** + * 是否退款成功 + */ + private Boolean refundSuccess; + + /** + * 退款成功的标记 + */ + private String successString; + + /** + * 退款回调信息 + */ + private String callbackContent; + + public String getBizRefundNo() { + return bizRefundNo; + } + + public void setBizRefundNo(String bizRefundNo) { + this.bizRefundNo = bizRefundNo; + } + + public String getSuccessString() { + return successString; + } + + public void setSuccessString(String successString) { + this.successString = successString; + } + + public String getCallbackContent() { + return callbackContent; + } + + public void setCallbackContent(String callbackContent) { + this.callbackContent = callbackContent; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Boolean getRefundSuccess() { + return refundSuccess; + } + + public void setRefundSuccess(Boolean refundSuccess) { + this.refundSuccess = refundSuccess; + } + + @Override + public String toString() { + return "RefundInfoResultBO{" + + "refundId=" + refundId + + ", bizRefundNo='" + bizRefundNo + '\'' + + ", refundSuccess=" + refundSuccess + + ", successString='" + successString + '\'' + + ", callbackContent='" + callbackContent + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/config/WxConfig.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/config/WxConfig.java new file mode 100644 index 0000000..21a3511 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/config/WxConfig.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.config; + + +import cn.hutool.core.util.StrUtil; +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.service.EntPayService; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.service.impl.EntPayServiceImpl; +import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.common.bean.WxApp; +import com.tmerclub.cloud.common.bean.WxMiniApp; +import com.tmerclub.cloud.common.bean.WxMp; +import com.tmerclub.cloud.common.bean.WxPay; +import com.tmerclub.cloud.common.constant.PayType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * 通过微信配置获取微信的支付信息,登陆信息等 + * @author FrozenWatermelon + */ +@Component +public class WxConfig { + + @Autowired + private FeignShopConfig feignShopConfig; + + /** + * 根据支付方式,获取微信支付信息 + * @param payType + * @return + */ + public WxPayService getWxPayService(PayType payType) { + + String appid; + // 小程序支付 + if (Objects.equals(payType, PayType.WECHATPAY)) { + WxMiniApp wxMiniApp = feignShopConfig.getWxMiniApp(); + appid = wxMiniApp.getAppId(); + } else if (Objects.equals(payType, PayType.WECHATPAY_APP)) { + WxApp wxApp = feignShopConfig.getWxApp(); + appid = wxApp.getAppId(); + } else { + WxMp wxMp = feignShopConfig.getWxMp(); + appid = wxMp.getAppId(); + } + + WxPayConfig payConfig = getWxPay(appid); + + WxPayService wxPayService = new WxPayServiceImpl(); + + wxPayService.setConfig(payConfig); + return wxPayService; + } + + + public EntPayService getEntPayService() { + String appid; + WxMiniApp wxMiniApp = feignShopConfig.getWxMiniApp(); + // 小程序支付 + if (wxMiniApp != null && StrUtil.isNotBlank(wxMiniApp.getAppId())) { + + appid = wxMiniApp.getAppId(); + } else { + WxMp wxMp = feignShopConfig.getWxMp(); + appid = wxMp.getAppId(); + } + + WxPayService wxPayService = new WxPayServiceImpl(); + wxPayService.setConfig(getWxPay(appid)); + return new EntPayServiceImpl(wxPayService); + } + + private WxPayConfig getWxPay(String appid) { + WxPay wxPay = feignShopConfig.getWxPay(); + WxPayConfig payConfig = new WxPayConfig(); + // 都需要的配置 + payConfig.setAppId(appid); + payConfig.setMchId(wxPay.getMchId()); + // v3需要的配置 + if (Objects.equals(WxPay.VERSION_3, wxPay.getVersion())) { + payConfig.setCertSerialNo(wxPay.getCertSerialNo()); + payConfig.setApiV3Key(wxPay.getApiv3Key()); + if (StrUtil.isBlank(wxPay.getPrivateKeyContent())) { + payConfig.setPrivateKeyPath(wxPay.getPrivateKeyPath()); + } else { + payConfig.setPrivateKeyContent(wxPay.getPrivateKeyContent().getBytes()); + } + if (StrUtil.isBlank(wxPay.getPrivateCertContent())) { + payConfig.setPrivateCertPath(wxPay.getPrivateCertPath()); + } else { + payConfig.setPrivateCertContent(wxPay.getPrivateCertContent().getBytes()); + } + } else { + // v2需要的配置 + payConfig.setMchKey(wxPay.getMchKey()); + payConfig.setKeyPath(wxPay.getKeyPath()); + payConfig.setSignType(WxPayConstants.SignType.HMAC_SHA256); + } + return payConfig; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/VerificationCodeType.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/VerificationCodeType.java new file mode 100644 index 0000000..f816488 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/VerificationCodeType.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.payment.constant; + +/** + * 通联-短信验证码类型 + * @author gaozijie + * @date 2023-05-22 + */ +public enum VerificationCodeType { + /** + * 解绑手机 + */ + UN_BIND_PHONE(6), + /** + * 绑定手机 + */ + BIND_PHONE(9); + + private final Integer num; + + VerificationCodeType(Integer num) { + this.num = num; + } + + public Integer getNum() { + return num; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/AllinpayNoticeController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/AllinpayNoticeController.java new file mode 100644 index 0000000..91fe01d --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/AllinpayNoticeController.java @@ -0,0 +1,293 @@ +package com.tmerclub.cloud.payment.controller; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopWithdrawCashFeignClient; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.CompanyInfo; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.UpdateCompanyInfoResp; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.feign.SupplierWithdrawCashFeignClient; +import com.tmerclub.cloud.api.user.dto.UserExtensionDTO; +import com.tmerclub.cloud.api.user.feign.UserExtensionFeignClient; +import com.tmerclub.cloud.api.user.feign.UserWithdrawCashFeignClient; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.AllinpayPayStatus; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.payment.allinpay.bean.OpenRequest; +import com.tmerclub.cloud.payment.allinpay.member.resp.IdCardCollectResultResp; +import com.tmerclub.cloud.payment.allinpay.member.resp.SetPayPwdResp; +import com.tmerclub.cloud.payment.allinpay.member.resp.SignAcctProtocolResp; +import com.tmerclub.cloud.payment.allinpay.member.resp.UpdatePhoneByPayPwdResp; +import com.tmerclub.cloud.payment.allinpay.order.req.GetOrderStatusReq; +import com.tmerclub.cloud.payment.allinpay.order.resp.GetOrderStatusResp; +import com.tmerclub.cloud.payment.allinpay.order.resp.OrderResultNotice; +import com.tmerclub.cloud.payment.allinpay.service.AllinpayOrderService; +import com.tmerclub.cloud.payment.config.AllinpayConfig; +import com.tmerclub.cloud.payment.manager.PayNoticeManager; +import com.tmerclub.cloud.payment.service.AllinpayCompanyService; +import io.swagger.v3.oas.annotations.Hidden; +import jakarta.servlet.http.HttpServletRequest; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.UnsupportedEncodingException; +import java.util.Locale; +import java.util.Objects; + +/** + * 通联通知回调 + * @author lanhai + */ +@Hidden +@RestController +@RequestMapping("/ua/notice/allinpay/member") +public class AllinpayNoticeController { + + private static final Logger logger = LoggerFactory.getLogger(AllinpayNoticeController.class); + + @Autowired + private AllinpayCompanyService allinpayCompanyService; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private ShopWithdrawCashFeignClient shopWithdrawCashFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @DubboReference + private SupplierWithdrawCashFeignClient supplierWithdrawCashFeignClient; + @DubboReference + private UserWithdrawCashFeignClient userWithdrawCashFeignClient; + @DubboReference + private UserExtensionFeignClient userExtensionFeignClient; + @Autowired + private PayNoticeManager payNoticeManager; + @Autowired + private AllinpayOrderService allinpayOrderService; + @Autowired + private AllinpayConfig allinpayConfig; + + /** + * 设置企业信息回调 + */ + @RequestMapping("/setCompanyInfoResult") + public ResponseEntity setCompanyResult(HttpServletRequest request, + @RequestBody(required = false) String data) throws UnsupportedEncodingException { + + OpenRequest openRequest = allinpayConfig.validateAllinpayAndReturn(data, request); + logger.info("企业信息回调:{}", openRequest.getBizContent()); + return ResponseEntity.ok("success"); + } + + /** + * 修改企业信息回调 + * 企业信息修改后,系统准实时触发营业执照及法人证件OCR识别,将修改后信息与预留影印件不匹配的则更新OCR比对结果并通过【企业会员信息修改结果通知】, + * 商户需根据OCR结果判断,是否需通过【影印件采集】接口,重新上传影印件。 + */ + @RequestMapping("/updateCompanyInfoResult") + public ResponseEntity updateCompanyResult(HttpServletRequest request, + @RequestBody(required = false) String data) throws UnsupportedEncodingException { + + OpenRequest openRequest = allinpayConfig.validateAllinpayAndReturn(data, request); + logger.info("修改企业信息回调:{}", openRequest.getBizContent()); + UpdateCompanyInfoResp updateCompanyInfoResp = JSON.parseObject(openRequest.getBizContent(), UpdateCompanyInfoResp.class); + Integer status = allinpayCompanyService.getIdCardStatus(updateCompanyInfoResp.getOcrRegnumComparisonResult(), updateCompanyInfoResp.getOcrIdcardComparisonResult()); + if (updateCompanyInfoResp.getBizUserId().contains(AllinpayConstant.SHOP)) { + ServerResponseEntity response = shopDetailFeignClient.updateCompanyInfoResult(updateCompanyInfoResp.getBizUserId(), status, updateCompanyInfoResp.getResult(), updateCompanyInfoResp.getFailReason()); + if (!response.isSuccess()) { + logger.error("更新店铺企业信息失败:{}", response.getMsg()); + throw new LuckException(response.getMsg()); + } + } else if (updateCompanyInfoResp.getBizUserId().contains(AllinpayConstant.SUPPLIER)) { + ServerResponseEntity response = supplierDetailFeignClient.updateCompanyInfoResult(updateCompanyInfoResp.getBizUserId(), status, updateCompanyInfoResp.getResult(), updateCompanyInfoResp.getFailReason()); + if (!response.isSuccess()) { + logger.error("更新供应商企业信息失败:{}", response.getMsg()); + throw new LuckException(response.getMsg()); + } + } + return ResponseEntity.ok("success"); + } + + /** + * 影印件采集回调 + */ + @RequestMapping("/idCardCollectResult") + public ResponseEntity idCardCollectResult(HttpServletRequest request, + @RequestBody(required = false) String data) throws UnsupportedEncodingException { + + OpenRequest openRequest = allinpayConfig.validateAllinpayAndReturn(data, request); + logger.info("影印件回调:{}", openRequest.getBizContent()); + IdCardCollectResultResp idCardCollectResultResp = JSON.parseObject(openRequest.getBizContent(), IdCardCollectResultResp.class); + allinpayCompanyService.deleteCache(idCardCollectResultResp.getBizUserId()); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(idCardCollectResultResp.getBizUserId()); + Integer status = allinpayCompanyService.getIdCardStatus(companyInfo.getOcrRegnumComparisonResult(), companyInfo.getOcrIdcardComparisonResult()); + if (idCardCollectResultResp.getBizUserId().contains(AllinpayConstant.SHOP)) { + ServerResponseEntity response = shopDetailFeignClient.updateAllinpayIdCardStatus(idCardCollectResultResp.getBizUserId(), status); + if (!response.isSuccess()) { + logger.error("店铺影印件采集回调更新状态失败:{}", response.getMsg()); + } + } else if (idCardCollectResultResp.getBizUserId().contains(AllinpayConstant.SUPPLIER)) { + ServerResponseEntity response = supplierDetailFeignClient.updateAllinpayIdCardStatus(idCardCollectResultResp.getBizUserId(), status); + if (!response.isSuccess()) { + logger.error("供应商影印件采集回调更新状态失败:{}", response.getMsg()); + } + } + return ResponseEntity.ok("success"); + } + + /** + * 签约账户提现协议回调 + */ + @RequestMapping("/signAcctProtocol") + public ResponseEntity signAcctProtocolResult(HttpServletRequest request, + @RequestBody(required = false) String data) throws UnsupportedEncodingException { + + OpenRequest openRequest = allinpayConfig.validateAllinpayAndReturn(data, request); + logger.info("签约账户提现协议回调:{}", openRequest.getBizContent()); + SignAcctProtocolResp signAcctProtocolResp = JSON.parseObject(openRequest.getBizContent(), SignAcctProtocolResp.class); + String bizUserId = signAcctProtocolResp.getBizUserId(); + if (Objects.equals(signAcctProtocolResp.getResult().toUpperCase(Locale.ROOT), AllinpayPayStatus.OK.value())) { + if (bizUserId.contains(AllinpayConstant.USER)) { + // 用户提现协议签约(更新用户拓展信息) + logger.info("用户{}提现协议签约成功", bizUserId); + UserExtensionDTO userExtensionDTO = new UserExtensionDTO(); + userExtensionDTO.setUserId(Long.valueOf(bizUserId)); + userExtensionDTO.setAllinpayProtocolSign(1); + userExtensionFeignClient.updateExtension(userExtensionDTO); + } else if (bizUserId.contains(AllinpayConstant.SHOP)) { + // 商家提现协议签约 + logger.info("商家{}提现协议签约成功", bizUserId); + // 企业会员-“企业名称”“法人姓名”变更后,需重新签约。 + Long shopId = Long.valueOf(bizUserId.substring(AllinpayConstant.SHOP_LENGTH)); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + // 签约类型 1.个人 2.法人 3.企业 + Integer signAcctType = Objects.equals(companyInfo.getCompanyName(), signAcctProtocolResp.getSignAcctName()) ? 3 : 2; + shopDetailFeignClient.updateAcctProtocolNoByType(shopId, signAcctType, signAcctProtocolResp.getAcctProtocolNo()); + } else if (bizUserId.contains(AllinpayConstant.SUPPLIER)) { + // 商家提现协议签约 + logger.info("供应商{}提现协议签约成功", bizUserId); + // 企业会员-“企业名称”“法人姓名”变更后,需重新签约。 + Long supplierId = Long.valueOf(bizUserId.substring(AllinpayConstant.SUPPLIER_LENGTH)); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + // 签约类型 1.个人 2.法人 3.企业 + Integer signAcctType = Objects.equals(companyInfo.getCompanyName(), signAcctProtocolResp.getSignAcctName()) ? 3 : 2; + supplierDetailFeignClient.updateAcctProtocolNoByType(supplierId, signAcctType, signAcctProtocolResp.getAcctProtocolNo()); + } + } + return ResponseEntity.ok("success"); + } + + /** + * 设置支付密码回调 + */ + @RequestMapping("/setPayPwdResult") + public ResponseEntity setPayPwdResult(HttpServletRequest request, + @RequestBody(required = false) String data) throws UnsupportedEncodingException { + OpenRequest openRequest = allinpayConfig.validateAllinpayAndReturn(data, request); + logger.info("设置支付密码回调内容: {}", openRequest.getBizContent()); + SetPayPwdResp setPayPwdResp = JSON.parseObject(openRequest.getBizContent(), SetPayPwdResp.class); + // 更新用户拓展信息 + if (Objects.equals(AllinpayPayStatus.OK.value(), setPayPwdResp.getStatus())) { + logger.info("用户{}设置支付密码成功", setPayPwdResp.getBizUserId()); + UserExtensionDTO userExtensionDTO = new UserExtensionDTO(); + userExtensionDTO.setUserId(Long.valueOf(setPayPwdResp.getBizUserId())); + userExtensionDTO.setAllinpayPayPwdSet(1); + userExtensionFeignClient.updateExtension(userExtensionDTO); + } + return ResponseEntity.ok("success"); + } + + /** + * 修改支付密码回调 + */ + @RequestMapping("/updatePayPwdResult") + public ResponseEntity updatePayPwd(HttpServletRequest request, + @RequestBody(required = false) String data) throws UnsupportedEncodingException { + OpenRequest openRequest = allinpayConfig.validateAllinpayAndReturn(data, request); + logger.info("修改支付密码回调内容: {}", openRequest.getBizContent()); + return ResponseEntity.ok("success"); + } + + /** + * 重置支付密码回调 + */ + @RequestMapping("/resetPayPwdResult") + public ResponseEntity resetPayPwd(HttpServletRequest request, + @RequestBody(required = false) String data) throws UnsupportedEncodingException { + OpenRequest openRequest = allinpayConfig.validateAllinpayAndReturn(data, request); + logger.info("重置支付密码回调内容: {}", openRequest.getBizContent()); + return ResponseEntity.ok("success"); + } + + /** + * 修改绑定手机(密码校验版) + */ + @RequestMapping("/updatePhoneByPayPwdResult") + public ResponseEntity updatePhoneByPayPwdResult(HttpServletRequest request, + @RequestBody(required = false) String data) throws UnsupportedEncodingException { + OpenRequest openRequest = allinpayConfig.validateAllinpayAndReturn(data, request); + logger.info("修改绑定手机回调内容: {}", openRequest.getBizContent()); + UpdatePhoneByPayPwdResp updatePhoneResp = JSON.parseObject(openRequest.getBizContent(), UpdatePhoneByPayPwdResp.class); + return ResponseEntity.ok("success"); + } + + /** + * 提现申请 + */ + @RequestMapping("/withdrawApply") + public ResponseEntity withdrawApply(HttpServletRequest request, + @RequestBody(required = false) String data) throws UnsupportedEncodingException { + + OpenRequest openRequest = allinpayConfig.validateAllinpayAndReturn(data, request); + logger.info("提现回调内容: {}", openRequest.getBizContent()); + OrderResultNotice orderResultNotice = JSON.parseObject(openRequest.getBizContent(), OrderResultNotice.class); + String failStr = ""; + if (Objects.equals(orderResultNotice.getStatus(), AllinpayPayStatus.ERROR.value())) { + GetOrderStatusResp getOrderStatusResp = allinpayOrderService.getOrderStatus(new GetOrderStatusReq(orderResultNotice.getBizOrderNo())); + failStr = getOrderStatusResp.getErrorMessage(); + } + if (orderResultNotice.getBuyerBizUserId().contains(AllinpayConstant.SHOP)) { + ServerResponseEntity response = shopWithdrawCashFeignClient.withdrawBack(orderResultNotice.getBizOrderNo(), orderResultNotice.getStatus(), orderResultNotice.getBuyerBizUserId(), failStr); + if (!response.isSuccess()) { + logger.error("店铺提现回调失败,{}", orderResultNotice); + return ResponseEntity.ok(ResponseEnum.UNAUTHORIZED.value()); + } + } else if (orderResultNotice.getBuyerBizUserId().contains(AllinpayConstant.SUPPLIER)) { + ServerResponseEntity response = supplierWithdrawCashFeignClient.withdrawBack(orderResultNotice.getBizOrderNo(), orderResultNotice.getStatus(), orderResultNotice.getBuyerBizUserId(), failStr); + if (!response.isSuccess()) { + logger.error("供应商提现回调失败,{}", orderResultNotice); + return ResponseEntity.ok(ResponseEnum.UNAUTHORIZED.value()); + } + } else { + ServerResponseEntity response = userWithdrawCashFeignClient.withdrawBack(orderResultNotice.getBizOrderNo(), orderResultNotice.getStatus(), failStr); + if (!response.isSuccess()) { + logger.error("用户余额提现回调失败,{}", orderResultNotice); + return ResponseEntity.ok(ResponseEnum.UNAUTHORIZED.value()); + } + } + return ResponseEntity.ok("success"); + } + + /** + * 充值申请 + */ + @RequestMapping("/rechargeApply") + public ResponseEntity rechargeApply(HttpServletRequest request, + @RequestBody(required = false) String data) throws UnsupportedEncodingException { + + OpenRequest openRequest = allinpayConfig.validateAllinpayAndReturn(data, request); + logger.info("充值回调内容:{}", openRequest.getBizContent()); + OrderResultNotice orderResultNotice = JSON.parseObject(openRequest.getBizContent(), OrderResultNotice.class); + if (orderResultNotice.getBuyerBizUserId().contains(AllinpayConstant.SHOP)) { + payNoticeManager.noticeAllinpayShopRecharge(orderResultNotice); + } + return ResponseEntity.ok("success"); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/PayNoticeController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/PayNoticeController.java new file mode 100644 index 0000000..dbc872f --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/PayNoticeController.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.controller; + +import cn.hutool.core.util.StrUtil; +import com.alipay.api.AlipayApiException; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.payment.bo.PayInfoResultBO; +import com.tmerclub.cloud.payment.constant.PayEntry; +import com.tmerclub.cloud.payment.constant.PayStatus; +import com.tmerclub.cloud.payment.manager.PayManager; +import com.tmerclub.cloud.payment.manager.PayNoticeManager; +import com.tmerclub.cloud.payment.model.PayInfo; +import com.tmerclub.cloud.payment.model.RefundInfo; +import com.tmerclub.cloud.payment.service.PayInfoService; +import com.tmerclub.cloud.payment.service.RefundInfoService; +import io.swagger.v3.oas.annotations.Hidden; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +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 java.io.UnsupportedEncodingException; +import java.util.Date; +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +@Hidden +@RestController +@RequestMapping("/ua/notice/pay") +public class PayNoticeController { + + @Autowired + private PayInfoService payInfoService; + + @Autowired + private PayManager payManager; + + @Autowired + private PayNoticeManager payNoticeManager; + + @Autowired + private RefundInfoService refundInfoService; + + /** + * 支付异步回调 + */ + @RequestMapping("/{paySysType}/{payEntry}/{payType}") + public ResponseEntity notice(HttpServletRequest request, + @PathVariable("paySysType") Integer paySysType, + @PathVariable("payType") Integer payType, + @PathVariable("payEntry") Integer payEntry, + @RequestBody(required = false) String data) throws WxPayException, UnsupportedEncodingException, AlipayApiException { + + PayInfoResultBO payInfoResultBO = payManager.validateAndGetPayInfo(paySysType, request, PayType.instance(payType), data); + if (Objects.nonNull(payInfoResultBO.getAliRefund()) && payInfoResultBO.getAliRefund()) { + RefundInfo refundInfo; + // 支付宝退款回调 + if(Objects.equals(paySysType, PaySysType.DEFAULT.value())) { + // 支付宝退款查询预售的退款 + refundInfo = refundInfoService.getByRefundIdAndWxPay(payInfoResultBO.getRefundId()); + }else{ + refundInfo = refundInfoService.getByRefundId(payInfoResultBO.getRefundId()); + } + if (!payInfoResultBO.getPaySuccess()) { + if (StrUtil.isNotBlank(payInfoResultBO.getCallbackContent())) { + refundInfo.setCallbackContent(payInfoResultBO.getCallbackContent()); + refundInfo.setCallbackTime(new Date()); + refundInfoService.updateByIdPayId(refundInfo); + } + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } else { + refundInfoService.refundSuccess(refundInfo); + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + } + + // 校验订单参数异常,返回未授权 + if (!payInfoResultBO.getPaySuccess()) { + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + + PayInfo payInfo = payInfoService.getByPayId(payInfoResultBO.getPayId()); + // 已经支付 + if (Objects.equals(payInfo.getPayStatus(), PayStatus.PAYED.value()) || Objects.equals(payInfo.getPayStatus(), PayStatus.REFUND.value())) { + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + // 支付金额不对 + if (!Objects.equals(payInfo.getPayAmount(), payInfoResultBO.getPayAmount())) { + return ResponseEntity.ok(ResponseEnum.UNAUTHORIZED.value()); + } + if (Objects.equals(payEntry, PayEntry.ORDER.value())) { + // 订单支付回调 + return payNoticeManager.noticeOrder(payInfoResultBO, payInfo, paySysType); + } else if (Objects.equals(payEntry, PayEntry.RECHARGE.value())) { + // 余额充值回调 + return payNoticeManager.noticeRecharge(payInfoResultBO, payInfo); + } else if (Objects.equals(payEntry, PayEntry.VIP.value())) { + // 购买会员回调 + return payNoticeManager.noticeBuyVip(payInfoResultBO, payInfo); + } else if (Objects.equals(payEntry, PayEntry.SHOP_BALANCE_PAY_PURCHASE.value())) { + // 商家余额支付采购金额(通联支付独有) + return payNoticeManager.noticeBalancePay(payInfoResultBO, payInfo); + } else if (Objects.equals(payEntry, PayEntry.SHOP_BALANCE_PAY_REFUND_SPREAD.value())) { + // 商家余额支付退款自行处理费用(通联支付独有) + return payNoticeManager.noticeShopBalancePayRefundSpread(payInfoResultBO, payInfo); + } else if (Objects.equals(payEntry, PayEntry.ORDER_SETTLEMENT.value())) { + // 订单结算(通联支付独有) + return payNoticeManager.settlementOrderByAllinpay(payInfoResultBO, payInfo); + } + return ResponseEntity.ok(ResponseEnum.UNAUTHORIZED.value()); + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/app/AllinpayMemberController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/app/AllinpayMemberController.java new file mode 100644 index 0000000..483a006 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/app/AllinpayMemberController.java @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.controller.app; + +import cn.hutool.core.util.PhoneUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.feign.AuthSocialFeignClient; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.BindCard; +import com.tmerclub.cloud.api.user.dto.UserExtensionDTO; +import com.tmerclub.cloud.api.user.feign.UserExtensionFeignClient; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.payment.allinpay.constant.AllinpayNoticeUrl; +import com.tmerclub.cloud.payment.allinpay.member.resp.*; +import com.tmerclub.cloud.payment.dto.*; +import com.tmerclub.cloud.payment.allinpay.member.resp.*; +import com.tmerclub.cloud.payment.dto.*; +import com.tmerclub.cloud.payment.service.AllinpayService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @author lanhai + */ +@Tag(name = "通联支付-会员接口(用户端)") +@RestController("appAllinpayMemberController") +@RequestMapping("/allinpay/member") +public class AllinpayMemberController { + + @Autowired + private AllinpayService allinpayService; + + @DubboReference + private NotifyFeignClient notifyFeignClient; + + @DubboReference + private AuthSocialFeignClient authSocialFeignClient; + + @DubboReference + private UserExtensionFeignClient userExtensionFeignClient; + + @Value("${application.domainUrl}") + private String domainUrl; + + @GetMapping("/get_user_info") + @Operation(summary = "获取个人会员信息", description = "获取个人会员信息") + public ServerResponseEntity getMemberInfo() { + String bizUserId = String.valueOf(AuthUserContext.get().getUserId()); + UserInfo userInfo = allinpayService.getUserInfo(bizUserId); + userInfo.setIdentityCardNo(null); + userInfo.setName(null); + userInfo.setPhone(ObjectUtils.isEmpty(userInfo.getPhone()) ? null : PhoneUtil.hideBetween(userInfo.getPhone()).toString()); + // 同时也查询用户是否绑定支付标识 + QueryBindAcctResp queryBindAcctResp = allinpayService.queryBindAcct(bizUserId); + userInfo.setIsBindPayAcct(!CollectionUtils.isEmpty(queryBindAcctResp.getAcctInfoList())); + return ServerResponseEntity.success(userInfo); + } + + @PostMapping("/set_real_name") + @Operation(summary = "个人实名验证", description = "个人实名验证") + public ServerResponseEntity setRealName(@RequestBody SetRealNameBySmsCodeDTO setRealNameBySmsCodeDTO) { + UserExtensionDTO userExtensionDTO = new UserExtensionDTO(); + // 实名认证 + Long userId = AuthUserContext.get().getUserId(); + SetRealNameDTO setRealNameDTO = new SetRealNameDTO(); + BeanUtils.copyProperties(setRealNameBySmsCodeDTO, setRealNameDTO); + allinpayService.setRealName(userId, setRealNameDTO); + // 更新用户拓展信息 + userExtensionDTO.setUserId(userId); + userExtensionDTO.setAllinpayRealNameSet(1); + userExtensionFeignClient.updateExtension(userExtensionDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/set_pay_pwd") + @Operation(summary = "设置支付密码", description = "设置支付密码") + public ServerResponseEntity setPayPwd(@RequestBody SetPayPwdDTO setPayPwdDTO) { + Long userId = AuthUserContext.get().getUserId(); + // 查询用户信息,补充用户姓名和身份证号 + UserInfo userInfo = allinpayService.getUserInfo(userId.toString()); + setPayPwdDTO.setName(userInfo.getName()); + setPayPwdDTO.setIdentityNo(userInfo.getIdentityCardNo()); + setPayPwdDTO.setPhone(userInfo.getPhone()); + String backUrl = domainUrl + AllinpayNoticeUrl.SET_PAY_PWD; + // 返回通联url + String url = allinpayService.setPayPwd(userId, backUrl, setPayPwdDTO); + return ServerResponseEntity.success(url); + } + + @PutMapping("/update_pay_pwd") + @Operation(summary = "修改支付密码", description = "修改支付密码") + public ServerResponseEntity updatePayPwd(@RequestBody SetPayPwdDTO setPayPwdDTO) { + Long userId = AuthUserContext.get().getUserId(); + // 查询用户信息,补充用户姓名和身份证号 + UserInfo userInfo = allinpayService.getUserInfo(userId.toString()); + setPayPwdDTO.setName(userInfo.getName()); + setPayPwdDTO.setIdentityNo(userInfo.getIdentityCardNo()); + setPayPwdDTO.setPhone(userInfo.getPhone()); + String backUrl = domainUrl + AllinpayNoticeUrl.UPDATE_PAY_PWD; + // 返回通联url + String url = allinpayService.updatePayPwd(userId, backUrl, setPayPwdDTO); + return ServerResponseEntity.success(url); + } + + @PutMapping("/reset_pay_pwd") + @Operation(summary = "重置支付密码", description = "重置支付密码") + public ServerResponseEntity resetPayPwd(@RequestBody SetPayPwdDTO setPayPwdDTO) { + Long userId = AuthUserContext.get().getUserId(); + // 查询用户信息,补充用户姓名和身份证号 + UserInfo userInfo = allinpayService.getUserInfo(userId.toString()); + setPayPwdDTO.setName(userInfo.getName()); + setPayPwdDTO.setIdentityNo(userInfo.getIdentityCardNo()); + setPayPwdDTO.setPhone(userInfo.getPhone()); + String backUrl = domainUrl + AllinpayNoticeUrl.RESET_PAY_PWD; + // 返回通联url + String url = allinpayService.resetPayPwd(userId, backUrl, setPayPwdDTO); + return ServerResponseEntity.success(url); + } + + @PutMapping("/update_phone_by_pay_pwd") + @Operation(summary = "修改绑定手机(返回通联页面url)", description = "仅限个人会员") + public ServerResponseEntity updatePhoneByPayPwd(@RequestBody UpdatePhoneByPayPwdDTO updatePhoneByPayPwdDTO) { + String bizUserId = String.valueOf(AuthUserContext.get().getUserId()); + // 查询用户信息,补充用户姓名和身份证号 + UserInfo userInfo = allinpayService.getUserInfo(bizUserId); + updatePhoneByPayPwdDTO.setName(userInfo.getName()); + updatePhoneByPayPwdDTO.setIdentityNo(userInfo.getIdentityCardNo()); + updatePhoneByPayPwdDTO.setOldPhone(userInfo.getPhone()); + String backUrl = domainUrl + AllinpayNoticeUrl.UPDATE_PHONE_BY_PAY_PWD; + // 返回通联页面url + String url = allinpayService.updatePhoneByPayPwd(bizUserId, backUrl, updatePhoneByPayPwdDTO); + return ServerResponseEntity.success(url); + } + + @GetMapping("/query_bind_acct") + @Operation(summary = "查询已绑定的支付账户用户标识", description = "查询已绑定的支付账户用户标识") + public ServerResponseEntity queryBindAcct() { + String bizUserId = String.valueOf(AuthUserContext.get().getUserId()); + QueryBindAcctResp resp = allinpayService.queryBindAcct(bizUserId); + return ServerResponseEntity.success(resp); + } + + @PostMapping("/sign_acct_protocol") + @Operation(summary = "账户提现协议签约", description = "账户提现协议签约") + public ServerResponseEntity signAcctProtocol(@RequestBody SignAcctProtocolDTO signAcctProtocolDTO) { + Long userId = AuthUserContext.get().getUserId(); + // 查询用户信息,补充用户姓名 + UserInfo userInfo = allinpayService.getUserInfo(userId.toString()); + signAcctProtocolDTO.setSignAcctName(userInfo.getName()); + String backUrl = domainUrl + AllinpayNoticeUrl.SIGN_ACCT_PROTOCOL; + // 请求签约,返回签约地址 + String url = allinpayService.signAcctProtocol(String.valueOf(userId), backUrl, signAcctProtocolDTO); + return ServerResponseEntity.success(url); + } + + @GetMapping("/sign_contract_query") + @Operation(summary = "账户协议签约查询", description = "账户协议签约查询") + public ServerResponseEntity signContractQuery(SignAcctProtocolDTO signAcctProtocolDTO) { + Long userId = AuthUserContext.get().getUserId(); + String url = allinpayService.signContractQuery(String.valueOf(userId), signAcctProtocolDTO); + return ServerResponseEntity.success(url); + } + + @PostMapping("/apply_bind_bank_card") + @Operation(summary = "请求绑定银行卡", description = "请求绑定银行卡") + public ServerResponseEntity applyBindBankCard(@RequestBody ApplyBankCardDTO applyBankCardDTO) { + String bizUserId = AuthUserContext.get().getUserId().toString(); + // 查询通联用户信息,补充姓名和身份证号 + UserInfo userInfo = allinpayService.getUserInfo(bizUserId); + applyBankCardDTO.setName(userInfo.getName()); + applyBankCardDTO.setIdentityNo(userInfo.getIdentityCardNo()); + // 请求绑定银行卡 + ApplyBindBankCardResp resp = allinpayService.applyBindBankCard(bizUserId, applyBankCardDTO); + return ServerResponseEntity.success(resp); + } + + @PutMapping("/bind_bank_card") + @Operation(summary = "绑定银行卡", description = "绑定银行卡") + public ServerResponseEntity bindBankCard(@RequestBody BindBankCardDTO bindBankCardDTO) { + Long userId = AuthUserContext.get().getUserId(); + allinpayService.bindBankCard(String.valueOf(userId), bindBankCardDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/unbind_bank_card") + @Operation(summary = "解绑银行卡", description = "解绑银行卡") + public ServerResponseEntity unbindBankCard(@RequestBody UnbindBankCardDTO unbindBankCardDTO) { + Long userId = AuthUserContext.get().getUserId(); + allinpayService.unbindBankCard(String.valueOf(userId), unbindBankCardDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/query_bank_card") + @Operation(summary = "查询银行卡", description = "查询银行卡") + @Parameter(name = "cardNo", description = "银行卡号(不传则查询全部银行卡)") + public ServerResponseEntity> queryBankCard(@RequestParam(value = "cardNo", required = false) String cardNo) { + Long userId = AuthUserContext.get().getUserId(); + List bindCards = allinpayService.queryBankCard(String.valueOf(userId), cardNo); + return ServerResponseEntity.success(bindCards); + } + + @PostMapping("/send_verification_code") + @Operation(summary = "发送短信验证码", description = "发送短信验证码") + public ServerResponseEntity sendVerificationCode(@RequestBody VerificationCodeDTO verificationCodeDTO) { + String bizUserId = AuthUserContext.get().getUserId().toString(); + allinpayService.sendVerificationCode(bizUserId, verificationCodeDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/bind_phone") + @Operation(summary = "绑定手机", description = "绑定手机") + public ServerResponseEntity bindPhone(@RequestBody VerificationCodeDTO verificationCodeDTO) { + String bizUserId = AuthUserContext.get().getUserId().toString(); + // 判断当前用户是否绑定了无感注册的默认手机号,是则先进行解绑 + UserInfo userInfo = allinpayService.getUserInfo(bizUserId); + if (userInfo.getIsPhoneChecked() + && Objects.equals(userInfo.getPhone(), AllinpayConstant.DEFAULT_BIND_PHONE_NUMBER)) { + VerificationCodeDTO unbindDTO = new VerificationCodeDTO(); + unbindDTO.setPhone(AllinpayConstant.DEFAULT_BIND_PHONE_NUMBER); + allinpayService.unbindPhone(bizUserId, unbindDTO); + } + allinpayService.bindPhone(bizUserId, verificationCodeDTO); + // 并更新用户拓展信息 + UserExtensionDTO userExtensionDTO = new UserExtensionDTO(); + userExtensionDTO.setUserId(AuthUserContext.get().getUserId()); + userExtensionDTO.setAllinpayPhoneBind(1); + userExtensionFeignClient.updateExtension(userExtensionDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/unbind_phone") + @Operation(summary = "解绑手机", description = "解绑手机") + public ServerResponseEntity unbindPhone(@RequestBody VerificationCodeDTO verificationCodeDTO) { + Long userId = AuthUserContext.get().getUserId(); + allinpayService.unbindPhone(String.valueOf(userId), verificationCodeDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/bank_card_change_bind_phone") + @Operation(summary = "修改绑定手机(银行卡验证版)", description = "修改绑定手机(银行卡验证版)") + public ServerResponseEntity bankCardChangeBindPhone(@RequestBody BankCardChangeBindPhoneDTO bankCardChangeBindPhoneDTO) { + String bizUserId = String.valueOf(AuthUserContext.get().getUserId()); + BankCardChangeBindPhoneResp resp = allinpayService.bankCardChangeBindPhone(bizUserId, bankCardChangeBindPhoneDTO); + return ServerResponseEntity.success(resp); + } + + @PutMapping("/verify_bank_card_change_bind_phone") + @Operation(summary = "确认修改绑定手机(银行卡验证版)", description = "确认修改绑定手机(银行卡验证版)") + public ServerResponseEntity verifyBankCardChangeBindPhone(@RequestBody VerifyBankCardChangeBindPhoneDTO verifyBankCardChangeBindPhoneDTO) { + String bizUserId = String.valueOf(AuthUserContext.get().getUserId()); + allinpayService.verifyBankCardChangeBindPhone(bizUserId, verifyBankCardChangeBindPhoneDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/create_member") + @Operation(summary = "创建会员", description = "创建会员") + public ServerResponseEntity createMember() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + allinpayService.createMember(uidInfoBO.getUserId().toString(), uidInfoBO.getSysType()); + // 更新用户拓展信息为已创建 + UserExtensionDTO userExtensionDTO = new UserExtensionDTO(); + userExtensionDTO.setUserId(uidInfoBO.getUserId()); + userExtensionDTO.setAllinpayCreate(1); + userExtensionFeignClient.updateExtension(userExtensionDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_bank_card_bin") + @Operation(summary = "查询卡bin", description = "查询卡bin") + @Parameter(name = "cardNo", description = "卡号") + public ServerResponseEntity getBankCardBin(String cardNo) { + CardBinInfo cardBinInfo = allinpayService.getBankCardBin(cardNo); + return ServerResponseEntity.success(cardBinInfo); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/app/AllinpayOrderController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/app/AllinpayOrderController.java new file mode 100644 index 0000000..60472c2 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/app/AllinpayOrderController.java @@ -0,0 +1,91 @@ +package com.tmerclub.cloud.payment.controller.app; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.QueryBalanceResp; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.payment.allinpay.order.resp.GetOrderStatusResp; +import com.tmerclub.cloud.payment.allinpay.order.resp.InExpDetail; +import com.tmerclub.cloud.payment.allinpay.order.resp.ResendPaySmsResp; +import com.tmerclub.cloud.payment.dto.PayByBackSmsDTO; +import com.tmerclub.cloud.payment.dto.PayByPwdDTO; +import com.tmerclub.cloud.payment.dto.PayBySmsDTO; +import com.tmerclub.cloud.payment.dto.QueryInExpDetailDTO; +import com.tmerclub.cloud.payment.service.AllinpayService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @author gaozijie + * @date 2023-03-28 + */ +@Tag(name = "通联支付-订单接口(用户端)") +@RestController +@RequestMapping("/allinpay/order") +public class AllinpayOrderController { + + @Autowired + private AllinpayService allinpayService; + + @GetMapping("/query_balance") + @Operation(summary = "查询账户余额") + public ServerResponseEntity queryBalance() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + String bizUserId = String.valueOf(uidInfoBO.getUserId()); + QueryBalanceResp queryBalanceResp = allinpayService.queryBalance(bizUserId, uidInfoBO.getSysType()); + return ServerResponseEntity.success(queryBalanceResp); + } + + @GetMapping("/query_in_exp_detail") + @Operation(summary = "查询账户收支明细") + public ServerResponseEntity> queryInExpDetail(PageDTO pageDTO, + QueryInExpDetailDTO queryInExpDetailDTO) { + String bizUserId = String.valueOf(AuthUserContext.get().getUserId()); + PageVO pageVO = allinpayService.queryInExpDetail(bizUserId, pageDTO, queryInExpDetailDTO); + return ServerResponseEntity.success(pageVO); + } + + @PostMapping("/pay_confirm_by_front_sms") + @Operation(summary = "确认支付[前台+短信验证码])", description = "通联支付申请后,前端再调用此接口获取通联页面链接") + public ServerResponseEntity payConfirmByFrontSms(@RequestBody PayBySmsDTO payBySmsDTO) { + String bizUserId = String.valueOf(AuthUserContext.get().getUserId()); + String url = allinpayService.payBySms(bizUserId, payBySmsDTO); + return ServerResponseEntity.success(url); + } + + @PostMapping("/pay_confirm_by_front_pwd") + @Operation(summary = "确认支付[前台+密码验证版]", description = "通联支付申请后,前端再调用此接口获取通联页面链接") + public ServerResponseEntity payConfirmByFrontPwd(@RequestBody PayByPwdDTO payByPwdDTO) { + String bizUserId = String.valueOf(AuthUserContext.get().getUserId()); + String url = allinpayService.payByPwd(bizUserId, payByPwdDTO); + return ServerResponseEntity.success(url); + } + + @PostMapping("/pay_confirm_by_back_sms") + @Operation(summary = "确认支付[后台+短信验证码]", description = "通联支付申请后,后端再调用此接口获取通联页面链接") + public ServerResponseEntity payConfirmByBackSms(@RequestBody PayByBackSmsDTO payByBackSmsDTO) { + String bizUserId = String.valueOf(AuthUserContext.get().getUserId()); + PayByBackSmsResp resp = allinpayService.payByBackSms(bizUserId, payByBackSmsDTO); + return ServerResponseEntity.success(resp); + } + + @GetMapping("/resend_pay_sms") + @Operation(summary = "重新发送支付短信验证码") + public ServerResponseEntity resendPaySms(String bizOrderNo) { + ResendPaySmsResp resp = allinpayService.resendPaySms(bizOrderNo); + return ServerResponseEntity.success(resp); + } + + @GetMapping("/get_order_status") + @Operation(summary = "查询订单状态") + public ServerResponseEntity getOrderStatus(String bizOrderNo) { + String bizUserId = String.valueOf(AuthUserContext.get().getUserId()); + GetOrderStatusResp resp = allinpayService.getOrderStatus(bizUserId, bizOrderNo); + return ServerResponseEntity.success(resp); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/multishop/AllinpayCompanyController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/multishop/AllinpayCompanyController.java new file mode 100644 index 0000000..26751de --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/multishop/AllinpayCompanyController.java @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.controller.multishop; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.BindCard; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.CompanyInfo; +import com.tmerclub.cloud.api.payment.dto.BindCompanyAccountDTO; +import com.tmerclub.cloud.api.payment.dto.SetCompanyInfoDTO; +import com.tmerclub.cloud.api.payment.dto.UpdateCompanyInfoDTO; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.payment.allinpay.constant.AllinpayNoticeUrl; +import com.tmerclub.cloud.payment.allinpay.member.constant.AuditStatus; +import com.tmerclub.cloud.payment.allinpay.member.constant.VerificationCodeType; +import com.tmerclub.cloud.payment.dto.*; +import com.tmerclub.cloud.payment.dto.*; +import com.tmerclub.cloud.payment.service.AllinpayCompanyService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author lanhai + */ +@Tag(name = "通联支付-企业会员接口(商家端)") +@RestController("mulitshop-allinpay-company") +@RequestMapping("/m/apply_shop/allinpay/company") +public class AllinpayCompanyController { + + @Autowired + private AllinpayCompanyService allinpayCompanyService; + + @Value("${application.domainUrl}") + private String domainUrl; + + @GetMapping("/create_company_member") + public ServerResponseEntity createCompanyMember(@RequestParam("bizUserId") String bizUserId) { + allinpayCompanyService.createCompanyMember(bizUserId); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_company_info") + @Operation(summary = "获取企业信息", description = "获取企业信息") + public ServerResponseEntity getCompanyInfo() { + String bizUserId = getBizUserId(); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + return ServerResponseEntity.success(companyInfo); + } + + @GetMapping("/get_company_info_by_id") + @Operation(summary = "获取企业信息--测试", description = "获取企业信息") + public ServerResponseEntity getCompanyInfo(@RequestParam("bizUserId") String bizUserId) { + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + return ServerResponseEntity.success(companyInfo); + } + + @PostMapping("/send_verification_code") + @Operation(summary = "发送短信验证码", description = "发送短信验证码") + public ServerResponseEntity sendVerificationCode(@RequestBody VerificationCodeDTO verificationCodeDTO) { + String bizUserId = getBizUserId(); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + if (Objects.equals(verificationCodeDTO.getVerificationCodeType(), VerificationCodeType.BIND_PHONE.value())) { + // 绑定手机号的前提是还没有绑定过 + if (Objects.nonNull(companyInfo.getPhone())) { + throw new LuckException("当前商家账户已经绑定过手机号码,请刷新页面"); + } + } else if (Objects.equals(verificationCodeDTO.getVerificationCodeType(), VerificationCodeType.UNBIND_PHONE.value())) { + // 解绑手机号的前提是有绑定过手机号 + if (Objects.isNull(companyInfo.getPhone())) { + throw new LuckException("当前商家账户还没绑定手机号码,请刷新页面"); + } + } + allinpayCompanyService.sendVerificationCode(bizUserId, verificationCodeDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/bind_phone") + @Operation(summary = "绑定手机", description = "绑定手机") + public ServerResponseEntity bindPhone(@RequestBody VerificationCodeDTO verificationCodeDTO) { + String bizUserId = getBizUserId(); + if (StrUtil.isBlank(verificationCodeDTO.getVerificationCode())) { + throw new LuckException("商家绑定手机验证码不能为空"); + } + // 绑定手机号的前提是还没有绑定过 + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + if (Objects.nonNull(companyInfo.getPhone())) { + throw new LuckException("当前账户已经绑定过手机号码,请刷新页面"); + } + allinpayCompanyService.bindPhone(bizUserId, verificationCodeDTO); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PutMapping("/unbind_phone") + @Operation(summary = "解绑手机", description = "解绑手机") + public ServerResponseEntity unbindPhone(@RequestBody VerificationCodeDTO verificationCodeDTO) { + String bizUserId = getBizUserId(); + // 解绑手机后,用户无法创建订单 + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + // 解绑手机号的前提是有绑定过手机号 + if (Objects.isNull(companyInfo.getPhone())) { + throw new LuckException("当前商家账户还没绑定手机号码,请刷新页面"); + } + if (!Objects.equals(companyInfo.getPhone(), verificationCodeDTO.getPhone())) { + throw new LuckException("解绑手机与当前绑定手机不一致"); + } + allinpayCompanyService.unbindPhone(bizUserId, verificationCodeDTO); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PostMapping("/set_company_info") + @Operation(summary = "设置企业信息--该接口前端不调用", description = "设置企业信息--该接口前端不调用") + public ServerResponseEntity setCompanyInfo(@RequestBody SetCompanyInfoDTO setCompanyInfoDTO) { + String bizUserId = getBizUserId(); + String backUrl = domainUrl + AllinpayNoticeUrl.SET_COMPANY_INFO; + allinpayCompanyService.setCompanyInfo(bizUserId, backUrl, setCompanyInfoDTO); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_company_info") + @Operation(summary = "企业会员信息修改--该接口前端不调用", description = "企业会员信息修改--该接口前端不调用") + public ServerResponseEntity updateCompanyInfo(@RequestBody UpdateCompanyInfoDTO updateCompanyInfoDTO) { + String bizUserId = getBizUserId(); + // 会员要通过审核 + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + if (Objects.isNull(companyInfo) || !Objects.equals(companyInfo.getStatus(), AuditStatus.SUCCESS.getCode())) { + throw new LuckException("商家企业会员尚未通过审核,无法修改信息"); + } + String backUrl = domainUrl + AllinpayNoticeUrl.UPDATE_COMPANY_INFO; + allinpayCompanyService.updateCompanyInfo(bizUserId, backUrl, updateCompanyInfoDTO); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PostMapping("/apply_bind_bank_card") + @Operation(summary = "请求绑定银行卡", description = "请求绑定银行卡-法人") + public ServerResponseEntity applyBindBankCard(@RequestBody ApplyBankCardDTO applyBankCardDTO) { + String bizUserId = getBizUserId(); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + allinpayCompanyService.applyBindBankCard(bizUserId, applyBankCardDTO, companyInfo.getLegalName()); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PutMapping("/bind_bank_card") + @Operation(summary = "确认绑定银行卡--当前绑卡方式为8,该接口不调用", description = "确认绑定银行卡-法人") + public ServerResponseEntity bindBankCard(@RequestBody BindBankCardDTO bindBankCardDTO) { + String bizUserId = getBizUserId(); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + allinpayCompanyService.bindBankCard(bizUserId, bindBankCardDTO, companyInfo.getLegalName()); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PutMapping("/unbind_bank_card") + @Operation(summary = "解绑银行卡", description = "解绑银行卡-法人") + public ServerResponseEntity unbindBankCard(@RequestBody UnbindBankCardDTO unbindBankCardDTO) { + String bizUserId = getBizUserId(); + allinpayCompanyService.unbindBankCard(bizUserId, unbindBankCardDTO); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @GetMapping("query_bank_card") + @Operation(summary = "查询银行卡", description = "查询银行卡") + @Parameter(name = "cardNo", description = "银行卡号(不传则查询全部银行卡)") + public ServerResponseEntity> queryBankCard(@RequestParam(value = "cardNo", required = false) String cardNo) { + String bizUserId = getBizUserId(); + List bindCards = allinpayCompanyService.queryBankCard(bizUserId, cardNo) + .stream().filter(card -> Objects.equals(card.getBindState(), 1)).collect(Collectors.toList()); + return ServerResponseEntity.success(bindCards); + } + + @PostMapping("/bind_company_account") + @Operation(summary = "企业会员绑定对公户", description = "企业会员绑定对公户") + public ServerResponseEntity bindCompanyAccount(@RequestBody BindCompanyAccountDTO bindCompanyAccountDTO) { + String bizUserId = getBizUserId(); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + allinpayCompanyService.bindCompanyAccount(bizUserId, bindCompanyAccountDTO, companyInfo.getCompanyName()); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PostMapping("/sign_acct_protocol") + @Operation(summary = "账户提现协议签约", description = "账户提现协议签约") + public ServerResponseEntity signAcctProtocol(@RequestBody SignAcctProtocolDTO signAcctProtocolDTO) { + String bizUserId = getBizUserId(); + String backUrl = domainUrl + AllinpayNoticeUrl.SIGN_ACCT_PROTOCOL; + String url = allinpayCompanyService.signAcctProtocol(bizUserId, backUrl, signAcctProtocolDTO); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(url); + } + + @GetMapping("/sign_contract_query") + @Operation(summary = "账户协议签约查询", description = "账户协议签约查询") + public ServerResponseEntity signContractQuery(SignAcctProtocolDTO signAcctProtocolDTO) { + String bizUserId = getBizUserId(); + String url = allinpayCompanyService.signContractQuery(bizUserId, signAcctProtocolDTO); + return ServerResponseEntity.success(url); + } + + private static String getBizUserId() { + Long tenantId = AuthUserContext.get().getTenantId(); + return AllinpayConstant.SHOP + tenantId; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/multishop/AllinpayOrderController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/multishop/AllinpayOrderController.java new file mode 100644 index 0000000..6023968 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/multishop/AllinpayOrderController.java @@ -0,0 +1,91 @@ +package com.tmerclub.cloud.payment.controller.multishop; + +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.QueryBalanceResp; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.payment.allinpay.order.resp.GetOrderStatusResp; +import com.tmerclub.cloud.payment.allinpay.order.resp.InExpDetail; +import com.tmerclub.cloud.payment.allinpay.order.resp.ResendPaySmsResp; +import com.tmerclub.cloud.payment.dto.PayByBackSmsDTO; +import com.tmerclub.cloud.payment.dto.PayByPwdDTO; +import com.tmerclub.cloud.payment.dto.PayBySmsDTO; +import com.tmerclub.cloud.payment.dto.QueryInExpDetailDTO; +import com.tmerclub.cloud.payment.service.AllinpayService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @author gaozijie + * @date 2023-03-28 + */ +@Tag(name = "通联支付-订单接口(用户端)") +@RestController("multishopAllinpayOrderController") +@RequestMapping("/m/allinpay/order") +public class AllinpayOrderController { + + @Autowired + private AllinpayService allinpayService; + + @GetMapping("/query_balance") + @Operation(summary = "查询账户余额") + public ServerResponseEntity queryBalance() { + String bizUserId = String.valueOf(AuthUserContext.get().getTenantId()); + QueryBalanceResp queryBalanceResp = allinpayService.queryBalance(AllinpayConstant.SHOP + bizUserId, SysTypeEnum.MULTISHOP.value()); + return ServerResponseEntity.success(queryBalanceResp); + } + + @GetMapping("/query_in_exp_detail") + @Operation(summary = "查询账户收支明细") + public ServerResponseEntity> queryInExpDetail(PageDTO pageDTO, + QueryInExpDetailDTO queryInExpDetailDTO) { + String bizUserId = String.valueOf(AuthUserContext.get().getTenantId()); + PageVO pageVO = allinpayService.queryInExpDetail(AllinpayConstant.SHOP + bizUserId, pageDTO, queryInExpDetailDTO); + return ServerResponseEntity.success(pageVO); + } + + @PostMapping("/pay_confirm_by_front_sms") + @Operation(summary = "确认支付[前台+短信验证码])", description = "通联支付申请后,前端再调用此接口获取通联页面链接") + public ServerResponseEntity payConfirmByFrontSms(@RequestBody PayBySmsDTO payBySmsDTO) { + String bizUserId = String.valueOf(AuthUserContext.get().getTenantId()); + String url = allinpayService.payBySms(AllinpayConstant.SHOP + bizUserId, payBySmsDTO); + return ServerResponseEntity.success(url); + } + + @PostMapping("/pay_confirm_by_front_pwd") + @Operation(summary = "确认支付[前台+密码验证版]", description = "通联支付申请后,前端再调用此接口获取通联页面链接") + public ServerResponseEntity payConfirmByFrontPwd(@RequestBody PayByPwdDTO payByPwdDTO) { + String bizUserId = String.valueOf(AuthUserContext.get().getTenantId()); + String url = allinpayService.payByPwd(AllinpayConstant.SHOP + bizUserId, payByPwdDTO); + return ServerResponseEntity.success(url); + } + + @PostMapping("/pay_confirm_by_back_sms") + @Operation(summary = "确认支付[后台+短信验证码]", description = "通联支付申请后,后端再调用此接口获取通联页面链接") + public ServerResponseEntity payConfirmByBackSms(@RequestBody PayByBackSmsDTO payByBackSmsDTO) { + String bizUserId = String.valueOf(AuthUserContext.get().getTenantId()); + PayByBackSmsResp resp = allinpayService.payByBackSms(AllinpayConstant.SHOP + bizUserId, payByBackSmsDTO); + return ServerResponseEntity.success(resp); + } + + @GetMapping("/resend_pay_sms") + @Operation(summary = "重新发送支付短信验证码") + public ServerResponseEntity resendPaySms(String bizOrderNo) { + ResendPaySmsResp resp = allinpayService.resendPaySms(bizOrderNo); + return ServerResponseEntity.success(resp); + } + + @GetMapping("/get_order_status") + @Operation(summary = "查询订单状态") + public ServerResponseEntity getOrderStatus(String bizOrderNo) { + String bizUserId = String.valueOf(AuthUserContext.get().getTenantId()); + GetOrderStatusResp resp = allinpayService.getOrderStatus(AllinpayConstant.SHOP + bizUserId, bizOrderNo); + return ServerResponseEntity.success(resp); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/multishop/RechargePayController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/multishop/RechargePayController.java new file mode 100644 index 0000000..3d187e9 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/multishop/RechargePayController.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.controller.multishop; + + +import com.alipay.api.AlipayApiException; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.tmerclub.cloud.api.auth.bo.LoginInfoBO; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BooleanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.payment.bo.PayInfoBO; +import com.tmerclub.cloud.payment.constant.PayEntry; +import com.tmerclub.cloud.payment.dto.RechargePayInfoDTO; +import com.tmerclub.cloud.payment.manager.PayManager; +import com.tmerclub.cloud.payment.service.PayInfoService; +import com.tmerclub.cloud.payment.vo.PaySettlementConfigVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +@RestController("multishopRechargePayController") +@RequestMapping("/m/pay") +@Tag(name = "商家余额充值接口") +@RefreshScope +public class RechargePayController { + + @Autowired + private PayInfoService payInfoService; + @Autowired + private PayManager payManager; + @DubboReference + private ConfigFeignClient configFeignClient; + @DubboReference + private TokenFeignClient tokenFeignClient; + @Value("${application.domainUrl}") + private String domainUrl; + + + /** + * 支付接口 + */ + @PostMapping("/recharge") + @Operation(summary = "余额充值接口", description = "进行余额充值") + public ServerResponseEntity pay(@Valid @RequestBody RechargePayInfoDTO payParam) throws AlipayApiException, WxPayException { + if (Objects.equals(payParam.getPayType(), PayType.BALANCE.value()) || Objects.equals(payParam.getPayType(), PayType.SCOREPAY.value())) { + throw new LuckException("不支持该充值方式"); + } + // 查询支付类型(默认支付/通联支付) + ServerResponseEntity configResponse = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG); + if (!configResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + PaySettlementConfigVO paySettlementConfigVO = Json.parseObject(configResponse.getData(), PaySettlementConfigVO.class); + if (Objects.equals(paySettlementConfigVO.getPaySettlementType(), 1)) { + throw new LuckException("该接口不支持通联支付"); + } + LoginInfoBO loginInfoBO = tokenFeignClient.getLoginInfo(); + Long shopId = AuthUserContext.getShopId(); + + PayInfoBO payInfo = payInfoService.recharge(shopId, payParam); + + payInfo.setBizUserId(loginInfoBO.getBizUserId()); + payInfo.setPayType(payParam.getPayType()); + // 回调地址 + payInfo.setApiNoticeUrl(domainUrl + "/ua/notice/pay/" + payInfo.getPaySysType() + "/" + PayEntry.RECHARGE.value() + "/" + payParam.getPayType()); + payInfo.setReturnUrl(payParam.getReturnUrl()); + return payManager.doPay(payInfo); + } + + + @GetMapping("/is_pay/{payEntry}/{orderIds}") + @Operation(summary = "根据订单号查询该订单是否已经支付", description = "根据订单号查询该订单是否已经支付") + public ResponseEntity isPay(@PathVariable Integer payEntry, @PathVariable String orderIds) { + Long shopId = AuthUserContext.getShopId(); + + Integer isPay = payInfoService.isPay(orderIds, shopId, payEntry, 0); + return ResponseEntity.ok(BooleanUtil.isTrue(isPay)); + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/platform/AccountDetailController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/platform/AccountDetailController.java new file mode 100644 index 0000000..75d4843 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/platform/AccountDetailController.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.controller.platform; + +import com.tmerclub.cloud.api.payment.vo.AccountDetailVO; +import com.tmerclub.cloud.api.payment.vo.ShopAccountDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.payment.dto.AccountSearchDTO; +import com.tmerclub.cloud.payment.service.PayInfoService; +import com.tmerclub.cloud.payment.service.RefundInfoService; +import com.tmerclub.cloud.payment.vo.PayInfoVO; +import com.tmerclub.cloud.payment.vo.RefundInfoVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +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.util.Objects; + +/** + * @author TRACK + */ +@RestController("platformAccountDetailController") +@RequestMapping("/p/account_detail") +@Tag(name = "platform-账户详情") +public class AccountDetailController { + @Autowired + private PayInfoService payInfoService; + + @Autowired + private RefundInfoService refundInfoService; + + @GetMapping("/get_income_account_detail") + @Operation(summary = "获取收入账户详情", description = "根据时间获取") + public ServerResponseEntity getIncomeAccountDetail(AccountSearchDTO accountSearchDTO) { + if (Objects.equals(accountSearchDTO.getShopId(), Constant.PLATFORM_SHOP_ID)) { + AccountDetailVO platformIncomeAccountDetail = payInfoService.getPlatformIncomeAccountDetail(accountSearchDTO.getStartTime(), accountSearchDTO.getEndTime()); + return ServerResponseEntity.success(platformIncomeAccountDetail); + } + AccountDetailVO accountDetailVO = payInfoService.getIncomeAccountDetail(accountSearchDTO.getStartTime(), accountSearchDTO.getEndTime(), accountSearchDTO.getShopName()); + return ServerResponseEntity.success(accountDetailVO); + } + + @GetMapping("/get_refund_account_detail") + @Operation(summary = "获取退款账户详情", description = "根据时间获取") + public ServerResponseEntity getRefundAccountDetail(AccountSearchDTO accountSearchDTO) { + if (Objects.equals(accountSearchDTO.getShopId(), Constant.PLATFORM_SHOP_ID)) { + AccountDetailVO platformRefundAccountDetail = refundInfoService.getPlatformRefundAccountDetail(accountSearchDTO.getStartTime(), accountSearchDTO.getEndTime()); + return ServerResponseEntity.success(platformRefundAccountDetail); + } + AccountDetailVO accountDetailVO = refundInfoService.getRefundAccountDetail(accountSearchDTO.getStartTime(), accountSearchDTO.getEndTime(), accountSearchDTO.getShopName()); + return ServerResponseEntity.success(accountDetailVO); + } + + @GetMapping("/get_income_account_detail_info") + @Operation(summary = "分页获取收入账户详情", description = "分页获取收入账户详情") + public ServerResponseEntity> getIncomeAccountDetailInfo(PageDTO pageDTO, AccountSearchDTO accountSearchDTO) { + PageVO accountDetailPage = payInfoService.pageIncomeAccountDetail(pageDTO, accountSearchDTO); + return ServerResponseEntity.success(accountDetailPage); + } + + @GetMapping("/get_refund_account_detail_info") + @Operation(summary = "分页获取退款账户详情", description = "分页获取退款账户详情") + public ServerResponseEntity> getRefundAccountDetailInfo(PageDTO pageDTO, AccountSearchDTO accountSearchDTO) { + PageVO accountDetailPage = refundInfoService.pageRefundAccountDetail(pageDTO, accountSearchDTO); + return ServerResponseEntity.success(accountDetailPage); + } + + @GetMapping("/get_pay_info") + @Operation(summary = "分页获取指定店铺的收入结算明细", description = "根据分页参数和时间获取") + public ServerResponseEntity> getPayInfo(PageDTO pageDTO, AccountSearchDTO accountSearchDTO) { + PageVO pageVO = payInfoService.getPayInfoPage(pageDTO, accountSearchDTO); + return ServerResponseEntity.success(pageVO); + } + + @GetMapping("/get_refund_info") + @Operation(summary = "分页获取指定店铺的退款结算明细", description = "根据分页参数和时间获取") + public ServerResponseEntity> getRefundInfo(PageDTO pageDTO, AccountSearchDTO accountSearchDTO) { + PageVO pageVO = refundInfoService.getRefundInfoPage(pageDTO, accountSearchDTO); + return ServerResponseEntity.success(pageVO); + } + + @GetMapping("/sold_excel") + @Operation(summary = "导出收入对账excel", description = "导出收入对账excel") + public ServerResponseEntity soldExcel(HttpServletResponse response, AccountSearchDTO accountSearchDTO) { + payInfoService.excelPayInfo(response, accountSearchDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/refund_sold_excel") + @Operation(summary = "导出退款对账excel", description = "导出退款对账excel") + public ServerResponseEntity refundSoldExcel(HttpServletResponse response, AccountSearchDTO accountSearchDTO) { + refundInfoService.excelRefundInfo(response, accountSearchDTO); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/user/PayController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/user/PayController.java new file mode 100644 index 0000000..f85ed7d --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/user/PayController.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.controller.user; + + +import com.alipay.api.AlipayApiException; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.tmerclub.cloud.api.auth.bo.LoginInfoBO; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BooleanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.payment.bo.PayInfoBO; +import com.tmerclub.cloud.payment.constant.PayEntry; +import com.tmerclub.cloud.payment.dto.PayInfoDTO; +import com.tmerclub.cloud.payment.manager.PayManager; +import com.tmerclub.cloud.payment.service.PayInfoService; +import com.tmerclub.cloud.payment.vo.PaySettlementConfigVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +/** + * @author FrozenWatermelon + */ +@RestController +@RequestMapping("/pay") +@Tag(name = "订单接口") +@RefreshScope +public class PayController { + + @Autowired + private PayInfoService payInfoService; + @Autowired + private PayManager payManager; + @DubboReference + private TokenFeignClient tokenFeignClient; + @DubboReference + private ConfigFeignClient configFeignClient; + @Value("${application.domainUrl}") + private String domainUrl; + + /** + * 支付接口 + */ + @PostMapping("/order") + @Operation(summary = "根据订单号进行支付", description = "根据订单号进行支付") + public ServerResponseEntity pay(@Valid @RequestBody PayInfoDTO payParam) throws AlipayApiException, WxPayException { + ServerResponseEntity configResponse = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG); + if (!configResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + PaySettlementConfigVO paySettlementConfigVO = Json.parseObject(configResponse.getData(), PaySettlementConfigVO.class); + LoginInfoBO loginInfoBO = tokenFeignClient.getLoginInfo(); + Long userId = AuthUserContext.getUserId(); + String bizUserId = loginInfoBO.getBizUserId(); + PayInfoBO payInfo = payInfoService.pay(userId, payParam, bizUserId); + payInfo.setBizUserId(bizUserId); + payInfo.setPayType(payParam.getPayType()); + payInfo.setUserId(userId.toString()); +// // 回调地址 + payInfo.setApiNoticeUrl(domainUrl + "/ua/notice/pay/" + paySettlementConfigVO.getPaySettlementType() + "/" + PayEntry.ORDER.value() +"/" + payParam.getPayType()); + payInfo.setReturnUrl(payParam.getReturnUrl()); + payInfo.setSystemType(payParam.getSystemType()); + + return payManager.doPay(payInfo); + } + + /** + * 支付预售订单尾款 + */ + @PostMapping("/pay_balance") + @Operation(summary = "根据订单号进行支付尾款", description = "根据订单号进行支付尾款") + public ServerResponseEntity payBalance(@Valid @RequestBody PayInfoDTO payParam) throws AlipayApiException, WxPayException { + ServerResponseEntity configResponse = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG); + if (!configResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + PaySettlementConfigVO paySettlementConfigVO = Json.parseObject(configResponse.getData(), PaySettlementConfigVO.class); + + LoginInfoBO loginInfoBO = tokenFeignClient.getLoginInfo(); + Long userId = AuthUserContext.getUserId(); + + PayInfoBO payInfo = payInfoService.payPreSaleBalance(userId, payParam); + payInfo.setBizUserId(loginInfoBO.getBizUserId()); + payInfo.setPayType(payParam.getPayType()); + // 回调地址 + payInfo.setApiNoticeUrl(domainUrl + "/ua/notice/pay/" + paySettlementConfigVO.getPaySettlementType() + "/" + PayEntry.ORDER.value() + "/" + payParam.getPayType()); + payInfo.setReturnUrl(payParam.getReturnUrl()); + payInfo.setUserId(userId.toString()); + payInfo.setSystemType(payParam.getSystemType()); + return payManager.doPay(payInfo); + } + + @GetMapping("/is_pay/{payEntry}/{orderIds}/{payAmountType}") + @Operation(summary = "根据订单号查询该订单是否已经支付", description = "根据订单号查询该订单是否已经支付") + @Parameter(name = "payAmountType", description = "支付金额类型,0.付定金or普通订单付款 1.付尾款(定金预售订单独有)", required = true) + public ResponseEntity isPay(@PathVariable Integer payEntry, @PathVariable String orderIds, @PathVariable Integer payAmountType) { + Long userId = AuthUserContext.get().getUserId(); + + Integer isPay = payInfoService.isPay(orderIds, userId, payEntry, payAmountType); + return ResponseEntity.ok(BooleanUtil.isTrue(isPay)); + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/user/RechargePayController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/user/RechargePayController.java new file mode 100644 index 0000000..a06ec73 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/user/RechargePayController.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.controller.user; + + +import com.alipay.api.AlipayApiException; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.tmerclub.cloud.api.auth.bo.LoginInfoBO; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.payment.bo.PayInfoBO; +import com.tmerclub.cloud.payment.constant.PayEntry; +import com.tmerclub.cloud.payment.dto.RechargePayInfoDTO; +import com.tmerclub.cloud.payment.manager.PayManager; +import com.tmerclub.cloud.payment.service.AllinpayService; +import com.tmerclub.cloud.payment.service.PayInfoService; +import com.tmerclub.cloud.payment.vo.PaySettlementConfigVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +@RestController +@RequestMapping("/pay") +@Tag(name = "余额充值接口") +@RefreshScope +public class RechargePayController { + + @Autowired + private PayInfoService payInfoService; + @Autowired + private PayManager payManager; + @Autowired + private AllinpayService allinpayService; + @DubboReference + private ConfigFeignClient configFeignClient; + @DubboReference + private TokenFeignClient tokenFeignClient; + @Value("${application.domainUrl}") + private String domainUrl; + + + /** + * 支付接口 + */ + @PostMapping("/recharge") + @Operation(summary = "余额充值接口", description = "进行余额充值") + public ServerResponseEntity pay(@Valid @RequestBody RechargePayInfoDTO payParam) throws AlipayApiException, WxPayException { + if (Objects.equals(payParam.getPayType(), PayType.BALANCE.value()) || Objects.equals(payParam.getPayType(), PayType.SCOREPAY.value())) { + throw new LuckException("不支持该充值方式"); + } + LoginInfoBO loginInfoBO = tokenFeignClient.getLoginInfo(); + + Long userId = AuthUserContext.getUserId(); + + PayInfoBO payInfo = payInfoService.recharge(userId, payParam); + + + payInfo.setPayType(payParam.getPayType()); + // 查询支付类型(默认支付/通联支付) + ServerResponseEntity configResponse = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG); + if (!configResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + PaySettlementConfigVO paySettlementConfigVO = Json.parseObject(configResponse.getData(), PaySettlementConfigVO.class); + Integer paySysType = paySettlementConfigVO.getPaySettlementType(); + payInfo.setAllinpayUserId(String.valueOf(userId)); + payInfo.setBizUserId(loginInfoBO.getBizUserId()); + // 回调地址 + payInfo.setApiNoticeUrl(domainUrl + "/ua/notice/pay/" + paySysType + "/" + PayEntry.RECHARGE.value() + "/" + payParam.getPayType()); + payInfo.setReturnUrl(payParam.getReturnUrl()); + return payManager.doPay(payInfo); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/BasePayInfoDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/BasePayInfoDTO.java new file mode 100644 index 0000000..7ca54db --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/BasePayInfoDTO.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 基本的支付信息 + * + * @author FrozenWatermelon + * @date 2021/5/13 + */ +public class BasePayInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull(message = "支付方式不能为空") + @Schema(description = "支付方式 (0积分支付 1:微信小程序支付 2:支付宝 3微信扫码支付 4 微信h5支付 5微信公众号支付 6支付宝H5支付 7支付宝APP支付 8微信APP支付 9余额支付)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer payType; + + @Schema(description = "支付完成回跳地址", requiredMode = Schema.RequiredMode.REQUIRED) + private String returnUrl; + + @Schema(description = "系统类型 1:移动端 2:pc", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer systemType; + + @Schema(description = "支付的系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer systemModel; + + @Schema(description = "验证类型(0:无验证, 1:短信验证码, 2:支付密码), 默认短信验证") + private Long validateType; + + public Integer getSystemModel() { + return systemModel; + } + + public void setSystemModel(Integer systemModel) { + this.systemModel = systemModel; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public String getReturnUrl() { + return returnUrl; + } + + public void setReturnUrl(String returnUrl) { + this.returnUrl = returnUrl; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + public Long getValidateType() { + return validateType; + } + + public void setValidateType(Long validateType) { + this.validateType = validateType; + } + + @Override + public String toString() { + return "BasePayInfoDTO{" + + "payType=" + payType + + ", returnUrl='" + returnUrl + '\'' + + ", systemType=" + systemType + + ", validateType=" + validateType + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/IdCardCollectDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/IdCardCollectDTO.java new file mode 100644 index 0000000..ac06db6 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/IdCardCollectDTO.java @@ -0,0 +1,71 @@ +package com.tmerclub.cloud.payment.dto; + +import com.tmerclub.cloud.common.constant.PicType; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class IdCardCollectDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商户号") + private String bizUserId; + + @Schema(description = "影印件核对结果异步通知地址 前端不填") + private String ocrComparisonResultBackUrl; + + /** + * @see PicType + */ + @Schema(description = "影印件类型 1.营业执照 8.身份证正面(人像面) 9.身份证反面(国徽面)") + private Integer picType; + + @Schema(description = "影印件图片 图片大小不超过 700k 图片格式 jpg、png") + private String picture; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getOcrComparisonResultBackUrl() { + return ocrComparisonResultBackUrl; + } + + public void setOcrComparisonResultBackUrl(String ocrComparisonResultBackUrl) { + this.ocrComparisonResultBackUrl = ocrComparisonResultBackUrl; + } + + public Integer getPicType() { + return picType; + } + + public void setPicType(Integer picType) { + this.picType = picType; + } + + public String getPicture() { + return picture; + } + + public void setPicture(String picture) { + this.picture = picture; + } + + @Override + public String toString() { + return "IdCardCollectDTO{" + + "bizUserId='" + bizUserId + '\'' + + ", ocrComparisonResultBackUrl='" + ocrComparisonResultBackUrl + '\'' + + ", picType=" + picType + + ", picture='" + picture + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayByBackSmsDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayByBackSmsDTO.java new file mode 100644 index 0000000..278ffec --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayByBackSmsDTO.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-05-05 + */ +public class PayByBackSmsDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单号") + private String bizOrderNo; + + @Schema(description = "短信验证码") + private String verificationCode; + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + @Override + public String toString() { + return "PayByBackSmsDTO{" + + "bizOrderNo='" + bizOrderNo + '\'' + + ", verificationCode='" + verificationCode + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayByPwdDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayByPwdDTO.java new file mode 100644 index 0000000..78c2032 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayByPwdDTO.java @@ -0,0 +1,68 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-05-05 + */ +public class PayByPwdDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "跳转页面类型(1:h5, 2:小程序), 默认h5") + private Long jumpPageType; + + @Schema(description = "订单号") + private String bizOrderNo; + + @Schema(description = "失败后跳转页面") + private String errorJumpUrl; + + @Schema(description = "成功后跳转页面") + private String jumpUrl; + + public Long getJumpPageType() { + return jumpPageType; + } + + public void setJumpPageType(Long jumpPageType) { + this.jumpPageType = jumpPageType; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getErrorJumpUrl() { + return errorJumpUrl; + } + + public void setErrorJumpUrl(String errorJumpUrl) { + this.errorJumpUrl = errorJumpUrl; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + @Override + public String toString() { + return "PayByPwdDTO{" + + "jumpPageType=" + jumpPageType + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", errorJumpUrl='" + errorJumpUrl + '\'' + + ", jumpUrl='" + jumpUrl + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayInfoDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayInfoDTO.java new file mode 100644 index 0000000..dc8738b --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayInfoDTO.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 订单支付记录DTO + * + * @author FrozenWatermelon + * @date 2020-12-25 09:50:59 + */ +public class PayInfoDTO extends BasePayInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotEmpty(message = "订单号不能为空") + @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED) + private List orderIds; + + + public List getOrderIds() { + return orderIds; + } + + public void setOrderIds(List orderIds) { + this.orderIds = orderIds; + } + + @Override + public String toString() { + return "PayInfoDTO{" + + "orderIds=" + orderIds + + "} " + super.toString(); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SetPayPwdDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SetPayPwdDTO.java new file mode 100644 index 0000000..842b1a4 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SetPayPwdDTO.java @@ -0,0 +1,91 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + */ +public class SetPayPwdDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "跳转页面类型(1:H5页面, 2:小程序页面),不传默认H5") + private Long jumpPageType; + + @Schema(description = "手机号码") + private String phone; + + @Schema(description = "姓名") + private String name; + + @Schema(description = "身份证号码") + private String identityNo; + + @Schema(description = "密码设置/修改/重置后跳转地址") + private String jumpUrl; + + @Schema(description = "密码重置出错跳转地址") + private String errorJumpUrl; + + public Long getJumpPageType() { + return jumpPageType; + } + + public void setJumpPageType(Long jumpPageType) { + this.jumpPageType = jumpPageType; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getIdentityNo() { + return identityNo; + } + + public void setIdentityNo(String identityNo) { + this.identityNo = identityNo; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getErrorJumpUrl() { + return errorJumpUrl; + } + + public void setErrorJumpUrl(String errorJumpUrl) { + this.errorJumpUrl = errorJumpUrl; + } + + @Override + public String toString() { + return "SetPayPwdDTO{" + + "jumpPageType=" + jumpPageType + + ", phone='" + phone + '\'' + + ", name='" + name + '\'' + + ", identityNo='" + identityNo + '\'' + + ", jumpUrl='" + jumpUrl + '\'' + + ", errorJumpUrl='" + errorJumpUrl + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SetRealNameBySmsCodeDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SetRealNameBySmsCodeDTO.java new file mode 100644 index 0000000..567a904 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SetRealNameBySmsCodeDTO.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-03-20 + */ +public class SetRealNameBySmsCodeDTO extends SetRealNameDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "手机号") + private String phone; + + @Schema(description = "短信验证码") + private String smsCode; + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getSmsCode() { + return smsCode; + } + + public void setSmsCode(String smsCode) { + this.smsCode = smsCode; + } + + @Override + public String toString() { + return "SetRealNameBySmsCodeDTO{" + + "phone='" + phone + '\'' + + ", smsCode='" + smsCode + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/feign/AllinpayFeignController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/feign/AllinpayFeignController.java new file mode 100644 index 0000000..74c587e --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/feign/AllinpayFeignController.java @@ -0,0 +1,379 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.feign; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SocialType; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.*; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.QueryBalanceResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.WithdrawApplyResp; +import com.tmerclub.cloud.api.payment.dto.AllinpayBalanceDTO; +import com.tmerclub.cloud.api.payment.dto.BindPayAcctDTO; +import com.tmerclub.cloud.api.payment.dto.SetCompanyInfoDTO; +import com.tmerclub.cloud.api.payment.dto.UpdateCompanyInfoDTO; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.user.dto.UserExtensionDTO; +import com.tmerclub.cloud.api.user.feign.UserExtensionFeignClient; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.constant.PicType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.ImageUtil; +import com.tmerclub.cloud.payment.allinpay.constant.AllinpayNoticeUrl; +import com.tmerclub.cloud.payment.allinpay.member.constant.AuditStatus; +import com.tmerclub.cloud.payment.allinpay.member.constant.PayAcctType; +import com.tmerclub.cloud.payment.allinpay.member.constant.VisitSourceType; +import com.tmerclub.cloud.payment.allinpay.member.req.IdCardCollectByFileUpload; +import com.tmerclub.cloud.payment.allinpay.member.resp.QueryBindAcctResp; +import com.tmerclub.cloud.payment.allinpay.member.resp.UserInfo; +import com.tmerclub.cloud.payment.allinpay.order.req.PayByBackSmsReq; +import com.tmerclub.cloud.payment.allinpay.order.req.ResendPaySmsReq; +import com.tmerclub.cloud.payment.allinpay.order.resp.ResendPaySmsResp; +import com.tmerclub.cloud.payment.allinpay.service.AllinpayOrderService; +import com.tmerclub.cloud.payment.bo.PayInfoBO; +import com.tmerclub.cloud.payment.config.AllinpayConfig; +import com.tmerclub.cloud.payment.constant.DistributedIdKey; +import com.tmerclub.cloud.payment.constant.PayEntry; +import com.tmerclub.cloud.payment.constant.PayStatus; +import com.tmerclub.cloud.payment.dto.ApplyBindAcctDTO; +import com.tmerclub.cloud.payment.dto.IdCardCollectDTO; +import com.tmerclub.cloud.payment.dto.LockMemberDTO; +import com.tmerclub.cloud.payment.manager.AllinpayManager; +import com.tmerclub.cloud.payment.mapper.PayInfoMapper; +import com.tmerclub.cloud.payment.model.PayInfo; +import com.tmerclub.cloud.payment.service.AllinpayCompanyService; +import com.tmerclub.cloud.payment.service.AllinpayService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author TRACK + */ +@DubboService +public class AllinpayFeignController implements AllinpayFeignClient { + + private static final Logger log = LoggerFactory.getLogger(AllinpayFeignController.class); + @Autowired + private AllinpayCompanyService allinpayCompanyService; + @Autowired + private AllinpayService allinpayService; + @Autowired + private AllinpayOrderService allinpayOrderService; + @Autowired + private SegmentManager segmentManager; + @Autowired + private AllinpayManager allinpayManager; + @Autowired + private PayInfoMapper payInfoMapper; + @Autowired + private AllinpayConfig allinpayConfig; + @DubboReference + private UserExtensionFeignClient userExtensionFeignClient; + + private static final Integer KEY_LENGTH = 15; + + @Value("${application.domainUrl}") + private String domainUrl; + + @Override + public ServerResponseEntity batchCreateMember(List bizUserIds) { + for (String bizUserId : bizUserIds) { + allinpayCompanyService.createCompanyMember(bizUserId); + } + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity batchCreatePersonalMember(List bizUserIds) { + if (CollectionUtils.isEmpty(bizUserIds)) { + return ServerResponseEntity.success(); + } + List createdUserIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (String bizUserId : bizUserIds) { + try { + allinpayService.createMember(bizUserId, SysTypeEnum.ORDINARY.value()); + createdUserIds.add(Long.valueOf(bizUserId)); + } catch (Exception e) { + if (e.getMessage().contains("已经存在此用户")) { + createdUserIds.add(Long.valueOf(bizUserId)); + } + log.error("用户{}, 创建通联个人会员失败: {}", bizUserId, e.getMessage()); + } + } + // 更新用户拓展信息 + UserExtensionDTO userExtensionDTO = new UserExtensionDTO(); + userExtensionDTO.setAllinpayCreate(1); + userExtensionFeignClient.updateBatchStatus(userExtensionDTO, createdUserIds); + return ServerResponseEntity.success(createdUserIds.size()); + } + + @Override + public ServerResponseEntity getCompanyInfo(String bizUserId) { + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + return ServerResponseEntity.success(companyInfo); + } + + @Override + public ServerResponseEntity getPersonalMemberInfo(String bizUserId) { + UserInfo userInfo = allinpayService.getUserInfo(bizUserId); + PersonalMemberInfo personalMemberInfo = new PersonalMemberInfo(); + BeanUtils.copyProperties(userInfo, personalMemberInfo); + return ServerResponseEntity.success(personalMemberInfo); + } + + @Override + public ServerResponseEntity setCompanyInfo(SetCompanyInfoDTO setCompanyInfoDTO) { + String backUrl = domainUrl + AllinpayNoticeUrl.SET_COMPANY_INFO; + SetCompanyInfoResp setCompanyInfoResp = allinpayCompanyService.setCompanyInfo(setCompanyInfoDTO.getBizUserId(), backUrl, setCompanyInfoDTO); + if (Objects.equals(setCompanyInfoResp.getResult(), AuditStatus.FAIL.getCode())) { + throw new LuckException(setCompanyInfoResp.getFailReason()); + } + allinpayCompanyService.deleteCache(setCompanyInfoDTO.getBizUserId()); + return ServerResponseEntity.success(setCompanyInfoResp); + } + + @Override + public ServerResponseEntity updateCompanyInfo(UpdateCompanyInfoDTO updateCompanyInfoDTO) { + String bizUserId = updateCompanyInfoDTO.getBizUserId(); + // 会员要通过审核 + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + if (Objects.isNull(companyInfo) || !Objects.equals(companyInfo.getStatus(), AuditStatus.SUCCESS.getCode())) { + throw new LuckException("企业会员尚未通过审核,无法修改信息"); + } + String backUrl = domainUrl + AllinpayNoticeUrl.UPDATE_COMPANY_INFO; + UpdateCompanyInfoResp updateCompanyInfoResp = allinpayCompanyService.updateCompanyInfo(bizUserId, backUrl, updateCompanyInfoDTO); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(updateCompanyInfoResp); + } + + @Override + public ServerResponseEntity idCardCollect(String imageUrl, Integer picType, String fileType, String bizUserId) { + String picture = ImageUtil.encodeImageToBase64(imageUrl, fileType); + IdCardCollectDTO idCardCollectDTO = new IdCardCollectDTO(); + idCardCollectDTO.setPicture(picture); + idCardCollectDTO.setPicType(picType); + idCardCollectDTO.setBizUserId(bizUserId); + String backUrl = domainUrl + AllinpayNoticeUrl.ID_CARD_COLLECT; + IdCardCollectResp idCardCollectResp = allinpayCompanyService.idCardCollect(idCardCollectDTO, backUrl); + return ServerResponseEntity.success(idCardCollectResp); + } + + @Override + public ServerResponseEntity idCardCollectByFileUpload(String legalPicFaceToken, String legalPicEmblemToken, Integer picType, String token, String bizUserId) { + IdCardCollectByFileUpload idCardCollectByFileUpload = new IdCardCollectByFileUpload(); + idCardCollectByFileUpload.setBizUserId(bizUserId); + Long reqSerialNo = segmentManager.getDateFormatSegmentId(DistributedIdKey.MALL4CLOUD_FILE_UPLOAD, IdCardCollectByFileUpload.REQ_SERIAL_NO_LENGTH); + idCardCollectByFileUpload.setReqSerialNo(String.valueOf(reqSerialNo)); + idCardCollectByFileUpload.setOcrComparisonResultBackUrl(domainUrl + AllinpayNoticeUrl.ID_CARD_COLLECT); + if (StrUtil.isNotBlank(legalPicFaceToken)) { + legalPicFaceToken = allinpayConfig.uploadFile(legalPicFaceToken); + idCardCollectByFileUpload.setLegalPicFaceToken(legalPicFaceToken); + } + if (StrUtil.isNotBlank(legalPicEmblemToken)) { + if (StrUtil.isNotBlank(legalPicFaceToken)) { + // 避免请求过于频繁 + try { + Thread.sleep(500); + } catch (InterruptedException e) { + log.error("InterruptedException", e); + } + } + legalPicEmblemToken = allinpayConfig.uploadFile(legalPicEmblemToken); + idCardCollectByFileUpload.setLegalPicEmblemToken(legalPicEmblemToken); + } + if (Objects.equals(picType, PicType.BUSINESS_LICENSE.getCode()) && StrUtil.isNotBlank(token)) { + idCardCollectByFileUpload.setPicType(picType); + token = allinpayConfig.uploadFile(token); + idCardCollectByFileUpload.setToken(token); + } + IdCardCollectByFileUploadResp upload = allinpayCompanyService.idcardCollectByFileUpload(idCardCollectByFileUpload); + return ServerResponseEntity.success(upload); + } + + @Override + public ServerResponseEntity> listBindCard(String bizUserId, String cardNo) { + List bindCards = allinpayCompanyService.queryBankCard(bizUserId, cardNo); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + bindCards.forEach(card -> card.setAccountNo(companyInfo.getAccountNo())); + return ServerResponseEntity.success(bindCards); + } + + @Override + public ServerResponseEntity queryBalance(String bizUserId, Integer sysType) { + QueryBalanceResp queryBalanceResp = allinpayService.queryBalance(bizUserId, sysType); + return ServerResponseEntity.success(queryBalanceResp); + } + + @Override + public ServerResponseEntity resendPaySms(String bizOrderNo) { + ResendPaySmsResp resendPaySmsResp = allinpayOrderService.resendPaySms(new ResendPaySmsReq(bizOrderNo)); + log.info("订单号{}重发短信验证码至手机{}成功", resendPaySmsResp.getBizOrderNo(), resendPaySmsResp.getPhone()); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity withdrawApply(String bizUserId, Long amount, + String bankCardNo, Integer sysType) { + Integer source = Objects.equals(sysType, SysTypeEnum.ORDINARY.value()) ? VisitSourceType.MOBILE.value() : VisitSourceType.PC.value(); + List bindCards = allinpayCompanyService.queryBankCard(bizUserId, bankCardNo); + if (CollUtil.isEmpty(bindCards)) { + throw new LuckException("银行卡不存在"); + } + BindCard bindCard = bindCards.get(0); + if (!Objects.equals(bindCard.getBindState(), 1)) { + throw new LuckException("银行卡未绑定"); + } + Long payId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_WITHDRAW_CASH, 0L); + String backUrl = domainUrl + AllinpayNoticeUrl.WITHDRAW_APPLY; + + // validateType:交易验证方式 0无验证 1短信验证码 2支付密码 + Long validateType = 1L; + WithdrawApplyResp withdrawApplyResp = allinpayManager.withdrawApply(payId, bizUserId, amount, backUrl, bindCard, source, validateType); + return ServerResponseEntity.success(withdrawApplyResp); + } + + @Override + public ServerResponseEntity payByBackSms(String bizUserId, String bizOrderNo, String verificationCode) { + PayByBackSmsResp payByBackSmsResp = allinpayManager.payByBackSms(new PayByBackSmsReq(bizUserId, bizOrderNo, verificationCode)); + return ServerResponseEntity.success(payByBackSmsResp); + } + + @Override + public ServerResponseEntity rechargeApply(Long amount, Long shopId, Long walletLogId, String returnUrl) { + + Long payId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_PAY, shopId); + // 保存预支付信息 + String bizUserId = AllinpayConstant.SHOP + shopId; + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payId); + payInfo.setRefundId(0L); + payInfo.setPayScore(0L); + payInfo.setUserId(shopId); + payInfo.setPayAmount(amount); + payInfo.setPayStatus(PayStatus.UNPAY.value()); + payInfo.setSysType(SysTypeEnum.MULTISHOP.value()); + payInfo.setPayType(PayType.WECHATPAY_SWEEP_CODE.value()); + payInfo.setVersion(0); + payInfo.setOrderIds(walletLogId.toString()); + payInfo.setPayEntry(PayEntry.RECHARGE.value()); + payInfoMapper.save(payInfo); + + // 进行支付 + PayInfoBO payInfoBO = new PayInfoBO(); + payInfoBO.setSystemType(VisitSourceType.PC.value()); + payInfoBO.setValidateType(1L); + payInfoBO.setUserId(bizUserId); + payInfoBO.setBizUserId(bizUserId); + payInfoBO.setAllinpayUserId(bizUserId); + payInfoBO.setOrderIds(String.valueOf(payId)); + payInfoBO.setRecharge(true); + String backUrl = domainUrl + AllinpayNoticeUrl.RECHARGE_APPLY; + payInfoBO.setReturnUrl(returnUrl); + payInfoBO.setPayAmount(amount); + payInfoBO.setApiNoticeUrl(backUrl); + payInfoBO.setPayId(payId); + payInfoBO.setPayType(PayType.WECHATPAY_SWEEP_CODE.value()); + return allinpayManager.doAllinPay(payInfoBO); + } + + @Override + public ServerResponseEntity getIdCardStatus(String bizUserId) { + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + Integer status = allinpayCompanyService.getIdCardStatus(companyInfo.getOcrRegnumComparisonResult(), companyInfo.getOcrIdcardComparisonResult()); + return ServerResponseEntity.success(status); + } + + @Override + public void updateAllinpayMemberStatus(Long userId, Integer status) { + LockMemberDTO lockMemberDTO = new LockMemberDTO(userId); + if (status == 0) { + allinpayService.lockMember(lockMemberDTO); + } else { + allinpayService.unlockMember(lockMemberDTO); + } + } + + @Override + public void bindPayAcct(Long userId, String payAcct, Integer socialType) { + String bizUserId = userId.toString(); + ApplyBindAcctDTO applyBindAcctDTO = new ApplyBindAcctDTO(); + applyBindAcctDTO.setAcct(payAcct); + if (Objects.equals(socialType, SocialType.MA.value())) { + // 微信小程序 + applyBindAcctDTO.setAcctType(PayAcctType.WECHAT_MINI_PROGRAM.value()); + } else if (Objects.equals(socialType, SocialType.MP.value())) { + // 微信公众号 + applyBindAcctDTO.setAcctType(PayAcctType.WECHAT_PUBLIC.value()); + } + allinpayService.applyBindAcct(bizUserId, applyBindAcctDTO); + } + + @Override + public void batchBindPayAcct(List bindPayAcctDTOList) { + if (CollectionUtils.isEmpty(bindPayAcctDTOList)) { + return; + } + for (BindPayAcctDTO bindPayAcctDTO : bindPayAcctDTOList) { + try { + ApplyBindAcctDTO applyBindAcctDTO = new ApplyBindAcctDTO(); + applyBindAcctDTO.setAcct(bindPayAcctDTO.getAcct()); + if (Objects.equals(bindPayAcctDTO.getSocialType(), SocialType.MA.value())) { + // 微信小程序 + applyBindAcctDTO.setAcctType(PayAcctType.WECHAT_MINI_PROGRAM.value()); + } else if (Objects.equals(bindPayAcctDTO.getSocialType(), SocialType.MP.value())) { + // 微信公众号 + applyBindAcctDTO.setAcctType(PayAcctType.WECHAT_PUBLIC.value()); + } + allinpayService.applyBindAcct(bindPayAcctDTO.getBizUserId(), applyBindAcctDTO); + // 更新用户拓展信息为已绑定 + UserExtensionDTO userExtensionDTO = new UserExtensionDTO(); + userExtensionDTO.setUserId(Long.valueOf(bindPayAcctDTO.getBizUserId())); + userExtensionDTO.setAllinpayPayAcctBind(1); + userExtensionFeignClient.updateExtension(userExtensionDTO); + } catch (Exception e) { + log.error("用户[{}]通联支付用户标识[{}]绑定失败,原因为{}", bindPayAcctDTO.getBizUserId(), bindPayAcctDTO.getAcct(), e.getMessage()); + } + } + } + + @Override + public ServerResponseEntity isBindPayAcct(Long userId) { + QueryBindAcctResp queryBindAcctResp = allinpayService.queryBindAcct(userId.toString()); + if (queryBindAcctResp == null || CollectionUtils.isEmpty(queryBindAcctResp.getAcctInfoList())) { + return ServerResponseEntity.success(false); + } + return ServerResponseEntity.success(true); + } + + @Override + public ServerResponseEntity getAllinpayBalance(Long userId, Integer sysType) { + String bizUserId = userId.toString(); + QueryBalanceResp queryBalanceResp = allinpayService.queryBalance(bizUserId, sysType); + AllinpayBalanceDTO allinpayBalanceDTO = new AllinpayBalanceDTO(); + BeanUtils.copyProperties(queryBalanceResp, allinpayBalanceDTO); + return ServerResponseEntity.success(allinpayBalanceDTO); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/BalancePayConsumer.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/BalancePayConsumer.java new file mode 100644 index 0000000..0217cb4 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/BalancePayConsumer.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.listener; + +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.payment.bo.PayInfoResultBO; +import com.tmerclub.cloud.payment.constant.PayEntry; +import com.tmerclub.cloud.payment.manager.PayNoticeManager; +import com.tmerclub.cloud.payment.model.PayInfo; +import com.tmerclub.cloud.payment.service.PayInfoService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * 订单余额支付成功监听 + * + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.BALANCE_PAY_TOPIC, consumerGroup = RocketMqConstant.BALANCE_PAY_TOPIC) +public class BalancePayConsumer implements RocketMQListener { + + @Autowired + private PayInfoService payInfoService; + @Autowired + private PayNoticeManager payNoticeManager; + + /** + * 订单退款 支付服务,开始进行退款啦 + */ + @Override + public void onMessage(Long payId) { + PayInfo payInfo = payInfoService.getByPayId(payId); + PayInfoResultBO payInfoResultBO = new PayInfoResultBO(); + payInfoResultBO.setPaySuccess(true); + payInfoResultBO.setPayId(payId); + payInfoResultBO.setCallbackContent("余额支付成功"); + payInfoResultBO.setPayAmount(payInfo.getPayAmount()); + payInfoResultBO.setBizPayNo(payId.toString()); + // 只有商城余额才有用到,这里应该直接是0 + payInfoResultBO.setPaySysType(PaySysType.DEFAULT.value()); + + if (Objects.equals(payInfo.getPayEntry(), PayEntry.ORDER.value())) { + // 订单支付回调 + payNoticeManager.noticeOrder(payInfoResultBO, payInfo, PaySysType.DEFAULT.value()); + } else if (Objects.equals(payInfo.getPayEntry(), PayEntry.VIP.value())) { + // 购买会员回调 + payNoticeManager.noticeBuyVip(payInfoResultBO, payInfo); + } + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/OpenAllinpayOrderConsumer.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/OpenAllinpayOrderConsumer.java new file mode 100644 index 0000000..5f5c32d --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/OpenAllinpayOrderConsumer.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.listener; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.common.order.bo.OrderIdWithRefundIdBO; +import com.tmerclub.cloud.common.order.bo.PayRefundBO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.payment.model.PayInfo; +import com.tmerclub.cloud.payment.service.PayInfoService; +import com.tmerclub.cloud.payment.service.RefundInfoService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.OPEN_ALLINPAY_TOPIC,consumerGroup = RocketMqConstant.OPEN_ALLINPAY_ORDER_TOPIC) +public class OpenAllinpayOrderConsumer implements RocketMQListener { + private static final Logger LOGGER = LoggerFactory.getLogger(OpenAllinpayOrderConsumer.class); + @DubboReference + private OrderFeignClient orderFeignClient; + @Autowired + private PayInfoService payInfoService; + @Autowired + private RefundInfoService refundInfoService; + + /** + * 开启通联,将待采购订单和支付定金未支付尾款的订单变成已取消状态,并且进行退款 + */ + @Override + public void onMessage(Integer paySysType) { + // 发送退款服务进行退款的通知 + ServerResponseEntity> listServerResponseEntity = orderFeignClient.listWaitPurchaseAndUnPayBalanceOrderIds(paySysType); + if(!listServerResponseEntity.isSuccess()){ + LOGGER.error("通联开启发送消息失败"); + return; + } + List orderList = listServerResponseEntity.getData(); + List orderIds = orderList.stream().map(OrderIdWithRefundIdBO::getOrderId).collect(Collectors.toList()); + + List payInfos = payInfoService.listByOrderIds(orderIds); + if (CollectionUtil.isEmpty(payInfos)) { + return; + } + Map orderIdWithRefundIdMap = orderList.stream().collect(Collectors.toMap(OrderIdWithRefundIdBO::getOrderId, OrderIdWithRefundIdBO::getRefundId)); + for (PayInfo payInfo : payInfos) { + PayRefundBO payRefundBO = new PayRefundBO(); + payRefundBO.setRefundId(orderIdWithRefundIdMap.get(Long.valueOf(payInfo.getOrderIds()))); + payRefundBO.setRefundAmount(payInfo.getPayAmount()); + payRefundBO.setOrderId(Long.valueOf(payInfo.getOrderIds())); + payRefundBO.setPayId(payInfo.getPayId()); + payRefundBO.setUnSuccessGroupOrder(1); + refundInfoService.doRefund(payRefundBO); + } + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/OrderRefundPaymentConsumer.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/OrderRefundPaymentConsumer.java new file mode 100644 index 0000000..c48e7fa --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/OrderRefundPaymentConsumer.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.listener; + +import com.tmerclub.cloud.common.order.bo.PayRefundBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.payment.service.RefundInfoService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 退款的通知的监听 + * + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_REFUND_PAYMENT_TOPIC, consumerGroup = RocketMqConstant.ORDER_REFUND_PAYMENT_TOPIC) +public class OrderRefundPaymentConsumer implements RocketMQListener { + + private static final Logger logger = LoggerFactory.getLogger(OrderRefundPaymentConsumer.class); + + @Autowired + private RefundInfoService refundInfoService; + + /** + * 订单退款 支付服务,开始进行退款啦 + */ + @Override + public void onMessage(PayRefundBO payRefundBO) { + // 打印日志,防止消息丢失 + logger.info("订单退款 开始进行退款啦... OrderRefundPaymentConsumer: {}", payRefundBO); + refundInfoService.doRefund(payRefundBO); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/manager/AllinpayManager.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/manager/AllinpayManager.java new file mode 100644 index 0000000..6daf618 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/manager/AllinpayManager.java @@ -0,0 +1,454 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.manager; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.github.binarywang.wxpay.service.WxPayService; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.BindCard; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.DepositApplyResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.WithdrawApplyResp; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.bo.BalancePayBO; +import com.tmerclub.cloud.api.user.bo.BalanceRefundBO; +import com.tmerclub.cloud.api.user.feign.UserBalanceLogFeignClient; +import com.tmerclub.cloud.common.bean.Allinpay; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.payment.allinpay.OpenClient; +import com.tmerclub.cloud.payment.allinpay.constant.AllinpayPlatformAccountSet; +import com.tmerclub.cloud.payment.allinpay.member.constant.VisitSourceType; +import com.tmerclub.cloud.payment.allinpay.order.req.*; +import com.tmerclub.cloud.payment.allinpay.order.resp.*; +import com.tmerclub.cloud.payment.allinpay.order.req.*; +import com.tmerclub.cloud.payment.allinpay.order.resp.*; +import com.tmerclub.cloud.payment.allinpay.service.AllinpayOrderService; +import com.tmerclub.cloud.payment.bo.PayInfoBO; +import com.tmerclub.cloud.payment.bo.RefundInfoBO; +import com.tmerclub.cloud.payment.config.AllinpayConfig; +import com.tmerclub.cloud.payment.config.WxConfig; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.time.LocalTime; +import java.util.*; + +/** + * 统一支付工具 + * + * @author FrozenWatermelon + */ +@Service +public class AllinpayManager { + + @Autowired + private AllinpayOrderService allinpayOrderService; + @Autowired + private WxConfig wxConfig; + @DubboReference + private ConfigFeignClient configFeignClient; + @DubboReference + private UserBalanceLogFeignClient userBalanceLogFeignClient; + @Autowired + private AllinpayConfig allinpayConfig; + + private static final String WX_SUCCESS_XML = ""; + private static final String ALI_SUCCESS = "success"; + public static final String SUCCESS = "SUCCESS"; + private static final String TRADE_SUCCESS = "TRADE_SUCCESS"; + private static final String TRADE_STATUS_KEY = "trade_status"; + private static final String REFUND = "refund_fee"; + private static final String ALLINPAY = "allinpay"; + + + private static final Logger logger = LoggerFactory.getLogger(AllinpayManager.class); + + public ServerResponseEntity doAllinPay(PayInfoBO payInfo) { + if (payInfo.getPayAmount() > Constant.MAX_WECHA_TPAY_AMOUNT) { + throw new LuckException("已超出微信支付的最大金额,请选择其他付款方式"); + } + PayType payType = PayType.instance(payInfo.getPayType()); + if (Objects.isNull(payType)) { + throw new LuckException("选择的支付方式不存在,请重新选择"); + } + if (Objects.isNull(payInfo.getValidateType())) { + payInfo.setValidateType(0L); + if (Objects.equals(payType, PayType.BALANCE)) { + payInfo.setValidateType(2L); + } + } + // 充值申请 + if (payInfo.getRecharge() != null && payInfo.getRecharge()) { + DepositApplyResp resp = this.depositApply(payInfo); + return ServerResponseEntity.success(resp); + } + // 消费申请(平台会员购买) + if (payInfo.getIsVip() != null && payInfo.getIsVip()) { + ConsumeApplyResp resp = this.consumeApply(payInfo); + return ServerResponseEntity.success(resp); + } + ApplicationCollection applicationCollection = new ApplicationCollection(); + applicationCollection.setBizOrderNo(payInfo.getPayId().toString()); + applicationCollection.setPayerId(payInfo.getUserId()); + if (CollectionUtil.isNotEmpty(payInfo.getReceiveList())) { + List recieverList = BeanUtil.mapAsList(payInfo.getReceiveList(), ApplicationCollection.Reciever.class); + applicationCollection.setRecieverList(recieverList); + } + applicationCollection.setTradeCode("3001"); + applicationCollection.setAmount(payInfo.getPayAmount()); + applicationCollection.setFee(0L); + applicationCollection.setBackUrl(payInfo.getApiNoticeUrl()); + applicationCollection.setFrontUrl(payInfo.getReturnUrl()); + applicationCollection.setOrderExpireDatetime(DateUtil.offsetMinute(new Date(), Constant.CANCEL_ORDER).toString()); + applicationCollection.setIndustryCode("2522"); + applicationCollection.setIndustryName("其他"); + applicationCollection.setSource(Long.parseLong(payInfo.getSystemType().toString())); + applicationCollection.setExtendInfo(payInfo.getExtendInfo()); + applicationCollection.setValidateType(payInfo.getValidateType()); + return doPay(applicationCollection, payInfo); + } + + + private ServerResponseEntity doPay(ApplicationCollection applicationCollection, PayInfoBO payInfo) { + payInfo.setPaySysType(PaySysType.ALLINPAY.value()); + ServerResponseEntity configResp = configFeignClient.getConfig(Constant.ALLINPAY_CONFIG); + Allinpay allinpay = Json.parseObject(configResp.getData(), Allinpay.class); + applicationCollection.setPayMethod(buildPayMethod(payInfo, allinpay)); + ApplicationCollectionResp applicationCollectionResp = allinpayOrderService.agentCollectApply(applicationCollection); + // 防止响应数据中没有bizOrderNo,重新赋值下 + applicationCollection.setBizOrderNo(payInfo.getPayId().toString()); + // 扫码支付信息/ JS支付串信息(微信、支付宝、QQ钱包)/微信小程序/微信原生H5支付串信息/支付宝原生APP支付串信息 + // 微信小程序,公众号,扫码,h5,以及支付宝电脑,手机网站都是返回payInfo + return ServerResponseEntity.success(applicationCollectionResp); + } + + public boolean isWxPay(PayType payType) { + return (Objects.equals(payType, PayType.WECHATPAY) + || Objects.equals(payType, PayType.WECHATPAY_SWEEP_CODE) + || Objects.equals(payType, PayType.WECHATPAY_H5) + || Objects.equals(payType, PayType.WECHATPAY_MP) + || Objects.equals(payType, PayType.WECHATPAY_APP)); + } + + public boolean isAliPay(PayType payType) { + return (Objects.equals(payType, PayType.ALIPAY_H5) + || Objects.equals(payType, PayType.ALIPAY) + || Objects.equals(payType, PayType.ALIPAY_APP)); + } + + public void batchShareAccountToShop(BatchAgentPay batchAgentPay) { + try { + BatchAgentPayResp agentPayResp = allinpayOrderService.batchAgentPay(batchAgentPay); + } catch (Exception e) { + logger.error("异常:", e); + } + } + + + public boolean doRefund(RefundInfoBO refundInfo) { + if (Objects.equals(refundInfo.getRefundAmount(), 0L)) { + return true; + } + Refund refund = new Refund(); + refund.setBizOrderNo(refundInfo.getRefundId() + StrUtil.UNDERLINE + refundInfo.getRefundNumber()); + refund.setOriBizOrderNo(refundInfo.getPayId().toString()); + // 退款收款人,必须是原订单中的付款方 + refund.setBizUserId(refundInfo.getUserId().toString()); + refund.setRefundType("D0"); + refund.setBackUrl(refundInfo.getNotifyUrl()); + refund.setAmount(refundInfo.getRefundAmount()); + // bizUserId不为空时,需要退款账户集编号 + if (Objects.nonNull(refundInfo.getBizUserId())) { + // 托管代收订单中的收款人的退款金额,通常是商家 + List refundList = new ArrayList<>(1); + Refund.RefundAccountInfo refundAccountInfo = new Refund.RefundAccountInfo(); + refundAccountInfo.setBizUserId(AllinpayConstant.SHOP + refundInfo.getBizUserId()); + refundAccountInfo.setAmount(refundInfo.getRefundAmount()); + refundList.add(refundAccountInfo); + refund.setRefundList(refundList); + } + try { + RefundResp agentPayResp = allinpayOrderService.doRefund(refund); + // 如果是余额支付回退余额 + if (Objects.equals(refundInfo.getPayType(), PayType.BALANCE)) { + // 注意 只进行退款是不需要回调的 这个参数要传到余额支付那,不然会有问题 + // 退款金额 + BalanceRefundBO balanceRefundBO = new BalanceRefundBO(); + balanceRefundBO.setRefundId(refundInfo.getRefundId()); + balanceRefundBO.setPayId(refundInfo.getPayId()); + balanceRefundBO.setChangeBalance(refundInfo.getRefundAmount()); + balanceRefundBO.setUserId(refundInfo.getUserId()); + balanceRefundBO.setRefundNumber(refundInfo.getRefundNumber()); + balanceRefundBO.setPaySysType(PaySysType.ALLINPAY.value()); + ServerResponseEntity responseEntity = userBalanceLogFeignClient.doRefund(balanceRefundBO); + if (!responseEntity.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + } catch (Exception e) { + logger.error("退款失败,Mq会多次回调:{}", refundInfo.getRefundId().toString()); + // 因为这个退款是mq调用的,所以如果一次退款失败,就调用多次,做好幂等的操作 + throw new LuckException(ResponseEnum.EXCEPTION); + } + return false; + } + + public boolean execApplicationTransfer(Long payId, String bizUserId, Long payAmount) { + if (Objects.equals(payAmount, 0L)) { + return true; + } + ServerResponseEntity configResp = configFeignClient.getConfig(Constant.ALLINPAY_CONFIG); + if (!configResp.isSuccess()) { + logger.error("平台转账失败,配置不存在:{}", configResp.getMsg()); + return false; + } + Allinpay allinpay = Json.parseObject(configResp.getData(), Allinpay.class); + ApplicationTransfer applicationTransfer = new ApplicationTransfer(); + applicationTransfer.setBizTransferNo(payId.toString()); + // 标准余额账户集 + applicationTransfer.setSourceAccountSetNo(AllinpayPlatformAccountSet.STANDARD_BALANCE.value().toString()); + applicationTransfer.setTargetBizUserId(bizUserId); + applicationTransfer.setAmount(payAmount); + applicationTransfer.setTargetAccountSetNo(allinpay.getAccountSetNo()); + try { + ApplicationTransferResp applicationTransferResp = allinpayOrderService.applicationTransfer(applicationTransfer); + return true; + } catch (Exception e) { + logger.error("平台转账失败:{}", e.getMessage()); + logger.error("异常:", e); + } + return false; + } + + /** + * 提现申请 + * 通商云发送并验证短信验证码,有效期3分钟。 + */ + public WithdrawApplyResp withdrawApply(Long payId, String bizUserId, Long amount, String backUrl, BindCard bindCard, Integer source, Long validateType) { + ServerResponseEntity configResp = configFeignClient.getConfig(Constant.ALLINPAY_CONFIG); + if (!configResp.isSuccess()) { + throw new LuckException("提现失败,配置不存在:" + configResp.getMsg()); + } + Allinpay allinpay = Json.parseObject(configResp.getData(), Allinpay.class); + // 提现校验 + this.checkAllowWithdraw(amount); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.HOUR, 24); + Date date = calendar.getTime(); + String orderExpireDatetime = sdf.format(date); + OpenClient client = allinpayConfig.getClient(); + WithdrawApplyReq withdrawApplyReq = new WithdrawApplyReq(); + withdrawApplyReq.setBizOrderNo(payId.toString()); + withdrawApplyReq.setBizUserId(bizUserId); + withdrawApplyReq.setAccountSetNo(allinpay.getAccountSetNo()); + withdrawApplyReq.setAmount(amount); + withdrawApplyReq.setFee(0L); + withdrawApplyReq.setValidateType(validateType); + withdrawApplyReq.setBackUrl(backUrl); + withdrawApplyReq.setOrderExpireDatetime(orderExpireDatetime); + withdrawApplyReq.setBankCardNo(client.encrypt(bindCard.getBankCardNo())); + withdrawApplyReq.setBankCardPro(bindCard.getBankCardPro()); + withdrawApplyReq.setIndustryCode(AllinpayConstant.INDUSTRY_CODE); + withdrawApplyReq.setIndustryName(AllinpayConstant.INDUSTRY_NAME); + withdrawApplyReq.setSource(source); + WithdrawApplyResp withdrawApplyResp; + try { + withdrawApplyResp = allinpayOrderService.withdrawApply(withdrawApplyReq); + } catch (Exception e) { + throw new LuckException("提现失败:" + e.getMessage()); + } + return withdrawApplyResp; + } + + public PayByBackSmsResp payByBackSms(PayByBackSmsReq payByBackSmsReq) { + if (Objects.isNull(payByBackSmsReq.getVerificationCode())) { + throw new LuckException("短信验证码不能为空"); + } + payByBackSmsReq.setConsumerIp(IpHelper.getIpAddr()); + PayByBackSmsResp payByBackSmsResp; + try { + payByBackSmsResp = allinpayOrderService.payByBackSms(payByBackSmsReq); + } catch (Exception e) { + throw new LuckException("确认支付失败,{}", e.getMessage()); + } + return payByBackSmsResp; + } + + /** + * 构建支付方式 + * @param payInfo + * @return + */ + public Map buildPayMethod(PayInfoBO payInfo, Allinpay allinpay) { + PayType payType = PayType.instance(payInfo.getPayType()); + if (Objects.isNull(payType)) { + throw new LuckException("选择的支付方式不存在,请重新选择"); + } + // 补充基础支付方式参数 + PayMethod payMethod = new PayMethod(); + payMethod.setLimitPay("no_credit"); + payMethod.setAmount(payInfo.getPayAmount()); + payMethod.setVspCusid(allinpay.getVspCusId()); + // 微信APP支付 or 微信小程序支付 or 微信公众号支付 + if (Objects.equals(payType, PayType.WECHATPAY_APP) + || Objects.equals(payType, PayType.WECHATPAY) + || Objects.equals(payType, PayType.WECHATPAY_MP)) { + payMethod.setAcct(payInfo.getBizUserId()); + WxPayService wxPayService = wxConfig.getWxPayService(payType); + payMethod.setSubAppid(wxPayService.getConfig().getAppId()); + } + // 余额支付 + else if (Objects.equals(payType, PayType.BALANCE)) { + List balancePayList = new ArrayList<>(1); + PayMethod.BalancePay balancePay = new PayMethod.BalancePay(); + balancePay.setAmount(payInfo.getPayAmount()); + balancePay.setAccountSetNo(allinpay.getAccountSetNo()); + balancePayList.add(balancePay); + payMethod.setBalancePayList(balancePayList); + // 并创建余额支付记录 + this.addBalanceLog(payInfo); + } + // 数据封装返回(余额支付单独处理) + Map payMethodMap = new HashMap<>(1); + if (Objects.equals(payType, PayType.BALANCE)) { + payMethodMap.put(payType.getAllinpayCode(), payMethod.getBalancePayList()); + } else { + payMethodMap.put(payType.getAllinpayCode(), payMethod); + } + return payMethodMap; + } + + /** + * 充值申请 + * @param payInfo + * @return + */ + public DepositApplyResp depositApply(PayInfoBO payInfo) { + ServerResponseEntity configResp = configFeignClient.getConfig(Constant.ALLINPAY_CONFIG); + if (!configResp.isSuccess()) { + throw new LuckException("充值失败,配置不存在:" + configResp.getMsg()); + } + Allinpay allinpay = Json.parseObject(configResp.getData(), Allinpay.class); + // 参数准备 + Map payMethodMap = this.buildPayMethod(payInfo, allinpay); + // 构建参数(手续费暂定为0) + DepositApply depositApply = new DepositApply(); + depositApply.setBizUserId(payInfo.getAllinpayUserId()); + depositApply.setBizOrderNo(payInfo.getPayId().toString()); + depositApply.setAmount(payInfo.getPayAmount()); + depositApply.setFee(0L); + if (Objects.nonNull(payInfo.getValidateType())) { + depositApply.setValidateType(payInfo.getValidateType()); + } + depositApply.setSource(VisitSourceType.PC.value()); + depositApply.setPayMethod(JSON.toJSONString(payMethodMap)); + depositApply.setIndustryCode(AllinpayConstant.INDUSTRY_CODE); + depositApply.setIndustryName(AllinpayConstant.INDUSTRY_NAME); + depositApply.setFrontUrl(payInfo.getReturnUrl()); + depositApply.setBackUrl(payInfo.getApiNoticeUrl()); + depositApply.setAccountSetNo(allinpay.getAccountSetNo()); + // 发送请求,并返回结果 + return allinpayOrderService.depositApply(depositApply); + } + + /** + * 消费申请 + * @param payInfoBO + * @return + */ + public ConsumeApplyResp consumeApply(PayInfoBO payInfoBO) { + ServerResponseEntity configResp = configFeignClient.getConfig(Constant.ALLINPAY_CONFIG); + if (!configResp.isSuccess()) { + throw new LuckException("消费申请失败,配置不存在:" + configResp.getMsg()); + } + Allinpay allinpay = Json.parseObject(configResp.getData(), Allinpay.class); + ConsumeApply consumeApply = new ConsumeApply(); + Map payMethod = this.buildPayMethod(payInfoBO, allinpay); + consumeApply.setPayMethod(JSON.toJSONString(payMethod)); + consumeApply.setValidateType(payInfoBO.getValidateType()); + consumeApply.setAmount(payInfoBO.getPayAmount()); + consumeApply.setBizOrderNo(payInfoBO.getPayId().toString()); + consumeApply.setFee(0L); + consumeApply.setFrontUrl(payInfoBO.getReturnUrl()); + consumeApply.setBackUrl(payInfoBO.getApiNoticeUrl()); + consumeApply.setSource(Long.parseLong(payInfoBO.getSystemType().toString())); + consumeApply.setIndustryCode(AllinpayConstant.INDUSTRY_CODE); + consumeApply.setIndustryName(AllinpayConstant.INDUSTRY_NAME); + consumeApply.setPayerId(payInfoBO.getAllinpayUserId()); + // 若是购买会员,收款方为平台 + if (payInfoBO.getIsVip() != null && payInfoBO.getIsVip()) { + consumeApply.setRecieverId("#yunBizUserId_B2C#"); + } + return allinpayOrderService.consumeApply(consumeApply); + } + + /** + * 创建余额支付记录 + * @param payInfoBO + */ + private void addBalanceLog(PayInfoBO payInfoBO) { + BalancePayBO balancePayBO = new BalancePayBO(); + balancePayBO.setOrderIds(payInfoBO.getOrderIds()); + balancePayBO.setChangeBalance(payInfoBO.getPayAmount()); + balancePayBO.setPayId(payInfoBO.getPayId()); + balancePayBO.setPaySysType(payInfoBO.getPaySysType()); + if (Objects.nonNull(payInfoBO.getIsVip())) { + balancePayBO.setIsVip(payInfoBO.getIsVip()); + } else { + balancePayBO.setIsVip(false); + } + ServerResponseEntity resp = userBalanceLogFeignClient.insertBalancePayLog(balancePayBO); + if (!resp.isSuccess()) { + throw new LuckException("创建余额支付记录失败:" + resp.getMsg()); + } + } + + /** + * 检查是否允许提现 + * @param amount + */ + private void checkAllowWithdraw(Long amount) { + // 提现时间检查 + LocalTime now = LocalTime.now(); + boolean isOutOfTime = AllinpayConstant.ALLOW_WITHDRAW_START_TIME.isAfter(now) + || AllinpayConstant.ALLOW_WITHDRAW_END_TIME.isBefore(now); + if (isOutOfTime) { + throw new LuckException(String.format("允许提现的时间为:%s - %s", AllinpayConstant.ALLOW_WITHDRAW_START_TIME, AllinpayConstant.ALLOW_WITHDRAW_END_TIME)); + } + } + + /** + * 获取订单支付状态 + * @param payInfoBO + * @return + */ + public GetOrderStatusResp getOrderStatus(String bizOrderNo) { + GetOrderStatusReq getOrderStatus = new GetOrderStatusReq(); + getOrderStatus.setBizOrderNo(bizOrderNo); + return allinpayOrderService.getOrderStatus(getOrderStatus); + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/manager/PayManager.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/manager/PayManager.java new file mode 100644 index 0000000..67342f6 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/manager/PayManager.java @@ -0,0 +1,769 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayConstants; +import com.alipay.api.domain.*; +import com.alipay.api.internal.util.AlipaySignature; +import com.alipay.api.internal.util.codec.Base64; +import com.alipay.api.request.*; +import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse; +import com.alipay.api.response.AlipayTradeQueryResponse; +import com.alipay.api.response.AlipayTradeRefundResponse; +import com.github.binarywang.wxpay.bean.notify.*; +import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult; +import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; +import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult; +import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult; +import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest; +import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; +import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult; +import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryResult; +import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryV3Result; +import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.bo.BalancePayBO; +import com.tmerclub.cloud.api.user.bo.BalanceRefundBO; +import com.tmerclub.cloud.api.user.feign.UserBalanceLogFeignClient; +import com.tmerclub.cloud.common.bean.Alipay; +import com.tmerclub.cloud.common.bean.WxPay; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.payment.allinpay.bean.OpenRequest; +import com.tmerclub.cloud.payment.allinpay.member.resp.AllinpayResp; +import com.tmerclub.cloud.payment.allinpay.order.resp.GetOrderStatusResp; +import com.tmerclub.cloud.payment.bo.PayInfoBO; +import com.tmerclub.cloud.payment.bo.PayInfoResultBO; +import com.tmerclub.cloud.payment.bo.RefundInfoBO; +import com.tmerclub.cloud.payment.bo.RefundInfoResultBO; +import com.tmerclub.cloud.payment.config.AliPayConfig; +import com.tmerclub.cloud.payment.config.AllinpayConfig; +import com.tmerclub.cloud.payment.config.WxConfig; +import com.tmerclub.cloud.payment.model.PayInfo; +import com.tmerclub.cloud.payment.service.PayInfoService; +import com.tmerclub.cloud.payment.vo.PaySettlementConfigVO; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.constraints.NotNull; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.security.PublicKey; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.Date; +import java.util.Map; +import java.util.Objects; + +/** + * 统一支付工具 + * + * @author FrozenWatermelon + */ +@Service +public class PayManager { + + @Autowired + private AliPayConfig aliPayConfig; + + @Autowired + private FeignShopConfig feignShopConfig; + + @Autowired + private WxConfig wxConfig; + + @Autowired + private PayInfoService payInfoService; + + @Autowired + private PayNoticeManager payNoticeManager; + @DubboReference + private UserBalanceLogFeignClient userBalanceLogFeignClient; + @DubboReference + private ConfigFeignClient configFeignClient; + @Autowired + private AllinpayManager allinpayPayManager; + @Autowired + private AllinpayConfig allinpayConfig; + + private static final String WX_SUCCESS_XML = ""; + private static final String ALI_SUCCESS = "success"; + public static final String SUCCESS = "SUCCESS"; + private static final String TRADE_SUCCESS = "TRADE_SUCCESS"; + private static final String TRADE_CLOSED = "TRADE_CLOSED"; + private static final String ALLINPAY_SUCCESS = "OK"; + private static final String TRADE_STATUS_KEY = "trade_status"; + private static final String REFUND = "refund_fee"; + private static final String REFUND_SUCCESS = "REFUND_SUCCESS"; + private static final String GMT_CLOSE = "gmt_close"; + private static final Long ALLINPAY_ORDER_SUCCESS = 4L; + private static final Logger logger = LoggerFactory.getLogger(PayManager.class); + + public ServerResponseEntity doPay(PayInfoBO payInfo) throws WxPayException, AlipayApiException { + ServerResponseEntity configResponse = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG); + if (!configResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + PaySettlementConfigVO paySettlementConfigVO = Json.parseObject(configResponse.getData(), PaySettlementConfigVO.class); + PayType payType = PayType.instance(payInfo.getPayType()); + // 积分支付 + if (Objects.equals(payType, PayType.SCOREPAY)) { + PayInfoResultBO payInfoResultBO = new PayInfoResultBO(); + payInfoResultBO.setPaySuccess(true); + payInfoResultBO.setPayId(payInfo.getPayId()); + payInfoResultBO.setCallbackContent("余额支付成功"); + payInfoResultBO.setPayAmount(payInfo.getPayAmount()); + payInfoResultBO.setBizPayNo(payInfo.getPayId().toString()); + payNoticeManager.noticeOrder(payInfoResultBO, payInfoService.getByPayId(payInfo.getPayId()), paySettlementConfigVO.getPaySettlementType()); + return null; + } + if (Objects.equals(paySettlementConfigVO.getPaySettlementType(), 0)) { + return doOriginalPay(payInfo); + } + return allinpayPayManager.doAllinPay(payInfo); + } + + + private ServerResponseEntity doOriginalPay(PayInfoBO payInfo) throws WxPayException, AlipayApiException { + String notifyUrl = payInfo.getApiNoticeUrl(); + + PayType payType = PayType.instance(payInfo.getPayType()); + if (isWxPay(payType)) { + Integer wxPayVersion = feignShopConfig.getWxPay().getVersion(); + // v3需要的配置 + if (Objects.equals(WxPay.VERSION_3, wxPayVersion)) { + return doWxPayV3(payInfo, notifyUrl, payType); + } else { + return doWxPay(payInfo, notifyUrl, payType); + } + } else if (Objects.equals(payType, PayType.ALIPAY)) { + //创建API对应的request + AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); + + //在公共参数中设置回跳和通知地址 + alipayRequest.setNotifyUrl(notifyUrl); + alipayRequest.setReturnUrl(payInfo.getReturnUrl()); + AlipayTradePagePayModel alipayTradePagePayModel = new AlipayTradePagePayModel(); + alipayTradePagePayModel.setOutTradeNo(String.valueOf(payInfo.getPayId())); + alipayTradePagePayModel.setBody(payInfo.getBody()); + alipayTradePagePayModel.setSubject(payInfo.getBody()); + alipayTradePagePayModel.setTotalAmount(PriceUtil.toDecimalPrice(payInfo.getPayAmount()).toString()); + alipayTradePagePayModel.setProductCode("FAST_INSTANT_TRADE_PAY"); + alipayRequest.setBizModel(alipayTradePagePayModel); + + return ServerResponseEntity.success(aliPayConfig.getAlipayClient().pageExecute(alipayRequest).getBody()); + } else if (Objects.equals(payType, PayType.ALIPAY_H5)) { + + AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest(); + alipayRequest.setNotifyUrl(notifyUrl); + alipayRequest.setReturnUrl(payInfo.getReturnUrl()); + + AlipayTradeWapPayModel alipayTradeWapPayModel = new AlipayTradeWapPayModel(); + alipayTradeWapPayModel.setOutTradeNo(String.valueOf(payInfo.getPayId())); + alipayTradeWapPayModel.setSubject(payInfo.getBody()); + alipayTradeWapPayModel.setTotalAmount(PriceUtil.toDecimalPrice(payInfo.getPayAmount()).toString()); + alipayTradeWapPayModel.setProductCode("QUICK_WAP_PAY"); + alipayRequest.setBizModel(alipayTradeWapPayModel); + return ServerResponseEntity.success(aliPayConfig.getAlipayClient().pageExecute(alipayRequest).getBody()); + } + // 支付宝app支付 + else if (Objects.equals(payType, PayType.ALIPAY_APP)) { + + AlipayTradeAppPayRequest alipayRequest = new AlipayTradeAppPayRequest(); + alipayRequest.setNotifyUrl(notifyUrl); + AlipayTradeAppPayModel alipayTradeAppPayModel = new AlipayTradeAppPayModel(); + alipayTradeAppPayModel.setOutTradeNo(String.valueOf(payInfo.getPayId())); + alipayTradeAppPayModel.setSubject(payInfo.getBody()); + alipayTradeAppPayModel.setTotalAmount(PriceUtil.toDecimalPrice(payInfo.getPayAmount()).toString()); + alipayTradeAppPayModel.setProductCode("QUICK_MSECURITY_PAY"); + alipayRequest.setBizModel(alipayTradeAppPayModel); + + String body = aliPayConfig.getAlipayClient().sdkExecute(alipayRequest).getBody(); + return ServerResponseEntity.success(body); + } else if (Objects.equals(payType, PayType.BALANCE)) { + // 创建余额支付记录 + BalancePayBO balancePayBO = new BalancePayBO(); + balancePayBO.setOrderIds(payInfo.getOrderIds()); + balancePayBO.setChangeBalance(payInfo.getPayAmount()); + balancePayBO.setPayId(payInfo.getPayId()); + if (Objects.nonNull(payInfo.getIsVip())) { + balancePayBO.setIsVip(payInfo.getIsVip()); + } else { + balancePayBO.setIsVip(false); + } + balancePayBO.setPaySysType(PaySysType.DEFAULT.value()); + ServerResponseEntity insertServerResponseEntity = userBalanceLogFeignClient.insertBalancePayLog(balancePayBO); + if (!insertServerResponseEntity.isSuccess()) { + return ServerResponseEntity.transform(insertServerResponseEntity); + } + return ServerResponseEntity.success(payInfo.getPayId()); + } + return null; + } + + + private ServerResponseEntity doWxPay(PayInfoBO payInfo, String notifyUrl, PayType payType) throws WxPayException { + WxPayService wxPayService = wxConfig.getWxPayService(payType); + WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest(); + orderRequest.setBody(payInfo.getBody()); + orderRequest.setOutTradeNo(String.valueOf(payInfo.getPayId())); + orderRequest.setTotalFee((int) (long) payInfo.getPayAmount()); + orderRequest.setSpbillCreateIp(IpHelper.getIpAddr()); + orderRequest.setOpenid(payInfo.getBizUserId()); + + orderRequest.setNotifyUrl(notifyUrl); + + if (payInfo.getPayAmount() > Constant.MAX_WECHA_TPAY_AMOUNT) { + throw new LuckException("已超出微信支付的最大金额,请选择其他付款方式"); + } + + // 微信小程序支付 || 微信公众号支付 + if (Objects.equals(payType, PayType.WECHATPAY) || Objects.equals(payType, PayType.WECHATPAY_MP)) { + orderRequest.setTradeType(WxPayConstants.TradeType.JSAPI); + WxPayMpOrderResult wxPayMpOrderResult = wxPayService.createOrder(orderRequest); + return ServerResponseEntity.success(wxPayMpOrderResult); + } + // 微信网页支付 + else if (Objects.equals(payType, PayType.WECHATPAY_SWEEP_CODE)) { + orderRequest.setProductId(String.valueOf(payInfo.getPayId())); + // 生成微信二维码 + orderRequest.setTradeType(WxPayConstants.TradeType.NATIVE); + WxPayNativeOrderResult wxPayNativeOrderResult = wxPayService.createOrder(orderRequest); + + return ServerResponseEntity.success(wxPayNativeOrderResult.getCodeUrl()); + } + // 微信H5支付 + else if (Objects.equals(payType, PayType.WECHATPAY_H5)) { + // 生成微信二维码 + orderRequest.setTradeType(WxPayConstants.TradeType.MWEB); + String s = "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"\",\"wap_name\": \"\"}}"; + orderRequest.setSceneInfo(s); + WxPayMwebOrderResult wxPayMwebOrderResult = wxPayService.createOrder(orderRequest); + return ServerResponseEntity.success(wxPayMwebOrderResult.getMwebUrl()); + } + // 微信app支付 + else if (Objects.equals(payType, PayType.WECHATPAY_APP)) { + orderRequest.setTradeType(WxPayConstants.TradeType.APP); + WxPayAppOrderResult wxPayAppOrderResult = wxPayService.createOrder(orderRequest); + return ServerResponseEntity.success(wxPayAppOrderResult); + } + return null; + } + + private ServerResponseEntity doWxPayV3(PayInfoBO payInfo, String notifyUrl, PayType payType) throws WxPayException { + WxPayService wxPayService = wxConfig.getWxPayService(payType); + WxPayUnifiedOrderV3Request orderRequest = new WxPayUnifiedOrderV3Request(); + orderRequest.setDescription(payInfo.getBody()); + orderRequest.setOutTradeNo(payInfo.getPayId().toString()); + orderRequest.setNotifyUrl(notifyUrl); + orderRequest.setAmount(new WxPayUnifiedOrderV3Request.Amount().setTotal(Integer.parseInt(payInfo.getPayAmount().toString()))); + + // 微信小程序支付 || 微信公众号支付 + if (Objects.equals(payType, PayType.WECHATPAY) || Objects.equals(payType, PayType.WECHATPAY_MP)) { + orderRequest.setPayer(new WxPayUnifiedOrderV3Request.Payer().setOpenid(payInfo.getBizUserId())); + return ServerResponseEntity.success(wxPayService.createOrderV3(TradeTypeEnum.JSAPI, orderRequest)); + } + // 微信网页支付 + else if (Objects.equals(payType, PayType.WECHATPAY_SWEEP_CODE)) { + // 生成微信二维码 + return ServerResponseEntity.success(wxPayService.createOrderV3(TradeTypeEnum.NATIVE, orderRequest)); + } + // 微信H5支付 + else if (Objects.equals(payType, PayType.WECHATPAY_H5)) { + orderRequest.setSceneInfo(new WxPayUnifiedOrderV3Request.SceneInfo() + .setPayerClientIp(IpHelper.getIpAddr()) + .setH5Info(new WxPayUnifiedOrderV3Request.H5Info().setType("Wap"))); + // 生成h5支付地址 + return ServerResponseEntity.success(wxPayService.createOrderV3(TradeTypeEnum.H5, orderRequest)); + } + // 微信app支付 + else if (Objects.equals(payType, PayType.WECHATPAY_APP)) { + return ServerResponseEntity.success(wxPayService.createOrderV3(TradeTypeEnum.APP, orderRequest)); + } + return null; + } + + public PayInfoResultBO validateAndGetPayInfo(Integer paySysType, HttpServletRequest request, PayType payType, String data) throws UnsupportedEncodingException, WxPayException, AlipayApiException { + if (Objects.equals(paySysType, PaySysType.ALLINPAY.value())) { + logger.info("通联支付回调开始,回调内容为{}", request.getParameterMap().toString()); + // 通联回调校验 + return validateAllinpay(data, request); + } + + PayInfoResultBO payInfoBo = new PayInfoResultBO(); + // 微信支付 + if (isWxPay(payType)) { + WxPayService wxPayService = wxConfig.getWxPayService(payType); + Integer wxPayVersion = feignShopConfig.getWxPay().getVersion(); + // v3需要的配置 + if (Objects.equals(WxPay.VERSION_3, wxPayVersion)) { + WxPayNotifyV3Result wxPayOrderNotifyV3Result = wxPayService.parseOrderNotifyV3Result(data, getSignatureHeader(request)); + payInfoBo.setPayId(Long.valueOf(wxPayOrderNotifyV3Result.getResult().getOutTradeNo())); + payInfoBo.setBizPayNo(wxPayOrderNotifyV3Result.getResult().getTransactionId()); + payInfoBo.setPaySuccess(SUCCESS.equals(wxPayOrderNotifyV3Result.getResult().getTradeState())); + payInfoBo.setPayAmount(Long.valueOf(wxPayOrderNotifyV3Result.getResult().getAmount().getTotal())); + payInfoBo.setCallbackContent(data); + } else { + WxPayOrderNotifyResult parseOrderNotifyResult = wxPayService.parseOrderNotifyResult(data); + payInfoBo.setPayId(Long.valueOf(parseOrderNotifyResult.getOutTradeNo())); + payInfoBo.setBizPayNo(parseOrderNotifyResult.getTransactionId()); + payInfoBo.setPaySuccess(SUCCESS.equals(parseOrderNotifyResult.getResultCode())); + payInfoBo.setSuccessString(WX_SUCCESS_XML); + payInfoBo.setPayAmount(Long.valueOf(parseOrderNotifyResult.getTotalFee())); + payInfoBo.setCallbackContent(data); + } + } else if (isAliPay(payType)) { + //获取支付宝POST过来反馈信息 + Map params = parseAliNotifyAndGetResult(request); + //商户订单号,之前生成的带用户ID的订单号 + payInfoBo.setPayId(Long.valueOf(params.get("out_trade_no"))); + //支付宝交易号 + payInfoBo.setBizPayNo(params.get("trade_no")); + payInfoBo.setSuccessString(ALI_SUCCESS); + payInfoBo.setPayAmount(new BigDecimal(params.get("total_amount")).multiply(new BigDecimal(100)).longValue()); + // 这个不是支付宝退款的通知 + if (StrUtil.isBlank(params.get(REFUND))) { + payInfoBo.setPaySuccess(Objects.equals(params.get(TRADE_STATUS_KEY), TRADE_SUCCESS)); + } else { + // 支付宝退款回调 + boolean isAliAllRefund = Objects.equals(params.get(TRADE_STATUS_KEY), TRADE_CLOSED) && StrUtil.isNotBlank(params.get(GMT_CLOSE)); + if (Objects.equals(params.get(TRADE_STATUS_KEY), TRADE_SUCCESS) || isAliAllRefund) { + payInfoBo.setPaySuccess(true); + payInfoBo.setAliRefund(true); + payInfoBo.setRefundId(Long.valueOf(params.get("out_biz_no"))); + payInfoBo.setCallbackContent(Json.toJsonString(params)); + } else { + payInfoBo.setPaySuccess(false); + } + } + + payInfoBo.setCallbackContent(Json.toJsonString(params)); + } + + if (StrUtil.isNotBlank(payInfoBo.getCallbackContent())) { + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payInfoBo.getPayId()); + payInfo.setBizPayNo(payInfoBo.getBizPayNo()); + payInfo.setCallbackContent(payInfoBo.getCallbackContent()); + payInfo.setCallbackTime(new Date()); + payInfoService.update(payInfo); + } + return payInfoBo; + } + + private PayInfoResultBO validateAllinpay(String data, HttpServletRequest request) throws UnsupportedEncodingException { + // 验签 + OpenRequest openRequest = allinpayConfig.validateAllinpayAndReturn(data, request); + // 2.转换成bean + AllinpayResp allinpayResp = JSON.parseObject(openRequest.getBizContent(), AllinpayResp.class); + PayInfoResultBO payInfoResultBO = new PayInfoResultBO(); + payInfoResultBO.setPayId(Long.valueOf(allinpayResp.getBizOrderNo())); + payInfoResultBO.setBizPayNo(allinpayResp.getOrderNo()); + payInfoResultBO.setPaySuccess(Objects.equals(allinpayResp.getStatus(), ALLINPAY_SUCCESS)); + payInfoResultBO.setSuccessString(ALLINPAY_SUCCESS); + payInfoResultBO.setPayAmount(allinpayResp.getAmount()); + payInfoResultBO.setCallbackContent(openRequest.getBizContent()); + payInfoResultBO.setPaySysType(PaySysType.ALLINPAY.value()); + payInfoResultBO.setExtendInfo(allinpayResp.getExtendInfo()); + // 修改支付信息 + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payInfoResultBO.getPayId()); + payInfo.setBizPayNo(payInfoResultBO.getBizPayNo()); + payInfo.setCallbackContent(Json.toJsonString(openRequest.getBizContent())); + payInfo.setCallbackTime(new Date()); + payInfoService.update(payInfo); + return payInfoResultBO; + } + + private RefundInfoResultBO validateRefundAllinpay(String data, HttpServletRequest request) throws UnsupportedEncodingException { + RefundInfoResultBO refundInfoResultBo = new RefundInfoResultBO(); + //获取支付宝POST过来反馈信息 + Map params = allinpayConfig.getParams(request); + logger.info("data:{}", data); + + if (!allinpayConfig.signVerify(params)) { + // 验签失败 + refundInfoResultBo.setRefundSuccess(false); + return refundInfoResultBo; + } + String paramsStr = JSON.toJSONString(params); + OpenRequest openRequest = JSONObject.parseObject(paramsStr, OpenRequest.class); + // 2.转换成bean + AllinpayResp allinpayResp = JSON.parseObject(openRequest.getBizContent(), AllinpayResp.class); + + + refundInfoResultBo.setRefundSuccess(ALLINPAY_SUCCESS.equals(allinpayResp.getStatus())); + refundInfoResultBo.setSuccessString(WX_SUCCESS_XML); + // 处理下预售订单退款的退款号 + String[] bizOrderNumbers = allinpayResp.getBizOrderNo().split(StrUtil.UNDERLINE); + refundInfoResultBo.setRefundId(Long.valueOf(bizOrderNumbers[0])); + refundInfoResultBo.setBizRefundNo(allinpayResp.getOrderNo()); + refundInfoResultBo.setCallbackContent(data); + return refundInfoResultBo; + } + + @NotNull + private SignatureHeader getSignatureHeader(HttpServletRequest request) { + SignatureHeader signatureHeader = new SignatureHeader(); + signatureHeader.setSignature(request.getHeader("Wechatpay-Signature")); + signatureHeader.setNonce(request.getHeader("Wechatpay-Nonce")); + signatureHeader.setTimeStamp(request.getHeader("Wechatpay-TimeStamp")); + signatureHeader.setSerial(request.getHeader("Wechatpay-Serial")); + return signatureHeader; + } + + public boolean doRefund(RefundInfoBO refundInfo) { + PayType payType = refundInfo.getPayType(); + if (Objects.equals(refundInfo.getRefundAmount(), 0L)) { + return true; + } + // 提交提款操作 + try { + if (isWxPay(payType)) { + handleWxRefund(refundInfo, payType); + } else if (isAliPay(payType)) { + AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); + AlipayTradeRefundModel alipayTradeRefundModel = new AlipayTradeRefundModel(); + alipayTradeRefundModel.setOutTradeNo(refundInfo.getPayId().toString()); + alipayTradeRefundModel.setRefundAmount(PriceUtil.toDecimalPrice(refundInfo.getRefundAmount()).toString()); + alipayTradeRefundModel.setOutRequestNo(refundInfo.getRefundId().toString()); + request.setBizModel(alipayTradeRefundModel); + AlipayTradeRefundResponse response = aliPayConfig.getAlipayClient().certificateExecute(request); + // 支付宝使用回调验证退款,回调地址为支付的时候填的回调地址,支付宝电脑支付全额退款没有回调,通过定时任务updateAliPayRefundStatus处理 + if (!response.isSuccess()) { + logger.error("退款失败,Mq会多次回调:{}", Json.toJsonString(response)); + // 因为这个退款是mq调用的,所以如果一次退款失败,就调用多次,做好幂等的操作 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } else if (Objects.equals(payType, PayType.BALANCE)) { + // 注意 只进行退款是不需要回调的 这个参数要传到余额支付那,不然会有问题 + // 退款金额 + BalanceRefundBO balanceRefundBO = new BalanceRefundBO(); + balanceRefundBO.setRefundId(refundInfo.getRefundId()); + balanceRefundBO.setPayId(refundInfo.getPayId()); + balanceRefundBO.setChangeBalance(refundInfo.getRefundAmount()); + balanceRefundBO.setUserId(refundInfo.getUserId()); + balanceRefundBO.setRefundNumber(refundInfo.getRefundNumber()); + balanceRefundBO.setPaySysType(PaySysType.DEFAULT.value()); + ServerResponseEntity responseEntity = userBalanceLogFeignClient.doRefund(balanceRefundBO); + if (responseEntity.isSuccess()) { + return true; + } else { + logger.error("退款失败,Mq会多次回调:{}", Json.toJsonString(responseEntity)); + // 因为这个退款是mq调用的,所以如果一次退款失败,就调用多次,做好幂等的操作 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + } catch (WxPayException e) { + logger.error("异常", e); + throw new LuckException(e.getCustomErrorMsg(), e); + } catch (AlipayApiException e) { + logger.error("异常", e); + throw new LuckException(e.getErrMsg(), e); + } + return false; + } + + private void handleWxRefund(RefundInfoBO refundInfo, PayType payType) throws WxPayException { + // 订单金额 + int totalFee = Integer.parseInt(refundInfo.getPayAmount().toString()); + // 退款金额 + int refundFee = Integer.parseInt(refundInfo.getRefundAmount().toString()); + WxPayService wxPayService = wxConfig.getWxPayService(payType); + Integer wxPayVersion = feignShopConfig.getWxPay().getVersion(); + if (Objects.equals(WxPay.VERSION_3, wxPayVersion)) { + WxPayRefundV3Request wxPayRefundV3Request = new WxPayRefundV3Request(); + wxPayRefundV3Request.setOutTradeNo(refundInfo.getPayId().toString()); + wxPayRefundV3Request.setAmount(new WxPayRefundV3Request.Amount().setTotal(totalFee).setRefund(refundFee).setCurrency("CNY")); + wxPayRefundV3Request.setOutRefundNo(refundInfo.getRefundId().toString()); + // notifyUrl(通知结果) + if (!Objects.equals(refundInfo.getOnlyRefund(), 1)) { + // 只进行退款,不需要任何回调 + wxPayRefundV3Request.setNotifyUrl(refundInfo.getNotifyUrl()); + } + wxPayService.refundV3(wxPayRefundV3Request); + } else { + // 退款操作 + // 生成退款请求对象 + WxPayRefundRequest wxPayRefundRequest = new WxPayRefundRequest(); + // 商户订单号 + wxPayRefundRequest.setOutTradeNo(refundInfo.getPayId().toString()); + // 订单金额 + wxPayRefundRequest.setTotalFee(refundInfo.getPayAmount().intValue()); + // 退款金额 + wxPayRefundRequest.setRefundFee(refundInfo.getRefundAmount().intValue()); + // 退款编码 + wxPayRefundRequest.setOutRefundNo(refundInfo.getRefundId().toString()); + + // 只进行退款,不需要任何回调 + if (!Objects.equals(refundInfo.getOnlyRefund(), 1)) { + // notifyUrl(通知结果) + wxPayRefundRequest.setNotifyUrl(refundInfo.getNotifyUrl()); + } + wxPayService.refund(wxPayRefundRequest); + } + } + + public RefundInfoResultBO validateAndGetRefundInfo(HttpServletRequest request, Integer paySysType, PayType payType, String data) throws WxPayException, UnsupportedEncodingException { + if (Objects.equals(paySysType, PaySysType.ALLINPAY.value())) { + // 通联回调校验 + return validateRefundAllinpay(data, request); + } + RefundInfoResultBO refundInfoResultBo = new RefundInfoResultBO(); + refundInfoResultBo.setRefundSuccess(false); + + if (isWxPay(payType)) { + Integer wxPayVersion = feignShopConfig.getWxPay().getVersion(); + WxPayService wxPayService = wxConfig.getWxPayService(payType); + if (Objects.equals(WxPay.VERSION_3, wxPayVersion)) { + WxPayRefundNotifyV3Result wxPayRefundNotifyV3Result = wxPayService.parseRefundNotifyV3Result(data, getSignatureHeader(request)); + WxPayRefundNotifyV3Result.DecryptNotifyResult result = wxPayRefundNotifyV3Result.getResult(); + if (Constant.SUCCESS.equals(result.getRefundStatus())) { + refundInfoResultBo.setRefundSuccess(SUCCESS.equals(result.getRefundStatus())); + refundInfoResultBo.setSuccessString(WX_SUCCESS_XML); + refundInfoResultBo.setRefundId(Long.valueOf(result.getOutRefundNo())); + refundInfoResultBo.setBizRefundNo(result.getRefundId()); + refundInfoResultBo.setCallbackContent(data); + } + } else { + WxPayRefundNotifyResult wxPayRefundNotifyResult = wxConfig.getWxPayService(payType).parseRefundNotifyResult(data); + WxPayRefundNotifyResult.ReqInfo reqInfo = wxPayRefundNotifyResult.getReqInfo(); + if (Constant.SUCCESS.equals(reqInfo.getRefundStatus())) { + refundInfoResultBo.setRefundId(Long.valueOf(reqInfo.getOutRefundNo())); + refundInfoResultBo.setRefundSuccess(SUCCESS.equals(reqInfo.getRefundStatus())); + refundInfoResultBo.setSuccessString(WX_SUCCESS_XML); + refundInfoResultBo.setBizRefundNo(reqInfo.getRefundId()); + refundInfoResultBo.setCallbackContent(data); + } + } + } + return refundInfoResultBo; + } + + /** + * 获取支付宝POST过来反馈信息 + */ + private Map parseAliNotifyAndGetResult(HttpServletRequest request) throws UnsupportedEncodingException, AlipayApiException { + //乱码解决,这段代码在出现乱码时使用 + request.setCharacterEncoding("utf-8"); + //获取支付宝POST过来反馈信息 + Map params = allinpayConfig.getParams(request); + //调用SDK验证签名 + boolean signVerified; + Alipay alipay = feignShopConfig.getAlipay(); + if (StrUtil.isBlank(alipay.getAlipayCertContent())) { + signVerified = AlipaySignature.rsaCertCheckV1(params, alipay.getAlipayCertPath(), cn.hutool.core.util.CharsetUtil.UTF_8, AlipayConstants.SIGN_TYPE_RSA2); + } else { + String publicKey; + try { + publicKey = this.getPublicKeyByContent(alipay.getAlipayCertContent()); + } catch (Exception e) { + throw new RuntimeException(e); + } + signVerified = AlipaySignature.rsaCheckV1(params, publicKey, cn.hutool.core.util.CharsetUtil.UTF_8, AlipayConstants.SIGN_TYPE_RSA2); + } + if (!signVerified) { + // 验签失败 + throw new LuckException("验签失败"); + } + return params; + } + + + public boolean isWxPay(PayType payType) { + return (Objects.equals(payType, PayType.WECHATPAY) + || Objects.equals(payType, PayType.WECHATPAY_SWEEP_CODE) + || Objects.equals(payType, PayType.WECHATPAY_H5) + || Objects.equals(payType, PayType.WECHATPAY_MP) + || Objects.equals(payType, PayType.WECHATPAY_APP)); + } + + public boolean isAliPay(PayType payType) { + return (Objects.equals(payType, PayType.ALIPAY_H5) + || Objects.equals(payType, PayType.ALIPAY) + || Objects.equals(payType, PayType.ALIPAY_APP)); + } + + public PayInfoResultBO checkPaySuccess(PayInfo payInfo) { + PayInfoResultBO payInfoResultBO = new PayInfoResultBO(); + payInfoResultBO.setPayId(payInfo.getPayId()); + payInfoResultBO.setPayAmount(payInfo.getPayAmount()); + payInfoResultBO.setBizPayNo(payInfo.getBizPayNo()); + PayType payType = PayType.instance(payInfo.getPayType()); + String payId = String.valueOf(payInfo.getPayId()); + try { + if(Objects.equals(payInfo.getPaySysType(),PaySysType.ALLINPAY.value())){ + GetOrderStatusResp orderStatusResp = allinpayPayManager.getOrderStatus(payInfo.getPayId().toString()); + payInfoResultBO.setPaySuccess(Boolean.FALSE); + if(Objects.nonNull(orderStatusResp) && Objects.equals(orderStatusResp.getOrderStatus(),ALLINPAY_ORDER_SUCCESS)) { + payInfoResultBO.setBizPayNo(orderStatusResp.getOrderNo()); + payInfoResultBO.setPaySuccess(Boolean.TRUE); + } + return payInfoResultBO; + } + if (PayType.isWeChatPay(payInfo.getPayType())) { + WxPayService wxPayService = wxConfig.getWxPayService(payType); + WxPayOrderQueryResult wxPayOrderQueryResult = wxPayService.queryOrder(null, payId); + if (!Objects.isNull(wxPayOrderQueryResult) && Objects.equals(wxPayOrderQueryResult.getTradeState(), Constant.SUCCESS)) { + payInfoResultBO.setBizPayNo(wxPayOrderQueryResult.getTransactionId()); + payInfoResultBO.setPaySuccess(Boolean.TRUE); + } else { + payInfoResultBO.setPaySuccess(Boolean.FALSE); + } + } else if (PayType.isAliPay(payInfo.getPayType())) { + AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); + AlipayTradeQueryModel alipayTradeQueryModel = new AlipayTradeQueryModel(); + alipayTradeQueryModel.setOutTradeNo(payId); + + request.setBizModel(alipayTradeQueryModel); + AlipayTradeQueryResponse response = aliPayConfig.getAlipayClient().certificateExecute(request); + if (response.isSuccess() && Objects.equals(response.getTradeStatus(), TRADE_SUCCESS)) { + payInfoResultBO.setBizPayNo(response.getTradeNo()); + payInfoResultBO.setPaySuccess(Boolean.TRUE); + } else { + payInfoResultBO.setPaySuccess(Boolean.FALSE); + } + } else if (Objects.equals(payInfo.getPayType(), PayType.BALANCE.value())) { + // 如果是余额支付,且订单是待支付状态,直接返回false取消订单 + payInfoResultBO.setPaySuccess(Boolean.FALSE); + } + } catch (WxPayException | AlipayApiException e) { + logger.error("获取支付信息错误:", e); + } + return payInfoResultBO; + } + + public void cancelOrderQrCode(Long payId, Integer payType) throws WxPayException, AlipayApiException { + Integer wxPayVersion = feignShopConfig.getWxPay().getVersion(); + PayType type = PayType.instance(payType); + if (isWxPay(type)) { + WxPayService wxPayService = wxConfig.getWxPayService(type); + // v3需要的配置 + if (Objects.equals(WxPay.VERSION_3, wxPayVersion)) { + wxPayService.closeOrderV3(payId.toString()); + } else { + wxPayService.closeOrder(payId.toString()); + } + }else{ + AlipayTradeCloseRequest tradeCloseRequest = new AlipayTradeCloseRequest(); + AlipayTradeCloseModel tradeCloseModel = new AlipayTradeCloseModel(); + tradeCloseModel.setOutTradeNo(payId.toString()); + tradeCloseRequest.setBizModel(tradeCloseModel); + aliPayConfig.getAlipayClient().certificateExecute(tradeCloseRequest); + } + } + + private String getPublicKeyByContent(String content) throws Exception{ + InputStream inputStream = new ByteArrayInputStream(content.getBytes()); + CertificateFactory cf = CertificateFactory.getInstance("X.509", "BC"); + X509Certificate cert = (X509Certificate) cf.generateCertificate(inputStream); + PublicKey publicKey = cert.getPublicKey(); + return Base64.encodeBase64String(publicKey.getEncoded()); + } + + /** + * 获取退款信息 + */ + public RefundInfoResultBO getRefundInfo(Integer payType, Long payId, Integer paySysType, Long refundId) { + RefundInfoResultBO refundInfoBo = new RefundInfoResultBO(); + refundInfoBo.setRefundId(refundId); + if(Objects.equals(paySysType,PaySysType.ALLINPAY.value())){ + GetOrderStatusResp orderStatusResp = allinpayPayManager.getOrderStatus(refundId + StrUtil.UNDERLINE + 1); + refundInfoBo.setRefundSuccess(false); + if(Objects.nonNull(orderStatusResp) && Objects.equals(orderStatusResp.getOrderStatus(),ALLINPAY_ORDER_SUCCESS)) { + refundInfoBo.setBizRefundNo(orderStatusResp.getOrderNo()); + refundInfoBo.setRefundSuccess(true); + } + // 预售可能有两笔退款,两笔退款成功即可 + GetOrderStatusResp getOrderStatusResp = allinpayPayManager.getOrderStatus(refundId + StrUtil.UNDERLINE + 2); + // 不为空就是有退款,则判断是否成功 + if(Objects.nonNull(getOrderStatusResp)){ + refundInfoBo.setRefundSuccess(false); + if(Objects.equals(getOrderStatusResp.getOrderStatus(),ALLINPAY_ORDER_SUCCESS)) { + refundInfoBo.setRefundSuccess(true); + } + } + return refundInfoBo; + } + try { + if (PayType.isWeChatPay(payType)) { + Integer wxPayVersion = feignShopConfig.getWxPay().getVersion(); + PayType type = PayType.instance(payType); + WxPayService wxPayService = wxConfig.getWxPayService(type); + // v3需要的配置 + if (Objects.equals(WxPay.VERSION_3, wxPayVersion)) { + WxPayRefundQueryV3Result wxPayRefundQueryV3Result = wxPayService.refundQueryV3(refundId.toString()); + if (Objects.nonNull(wxPayRefundQueryV3Result) && Objects.equals(wxPayRefundQueryV3Result.getStatus(), Constant.SUCCESS)) { + refundInfoBo.setBizRefundNo(wxPayRefundQueryV3Result.getRefundId()); + refundInfoBo.setRefundSuccess(true); + } else { + refundInfoBo.setRefundSuccess(false); + } + } else { + WxPayRefundQueryResult wxPayRefundQueryResult = wxPayService.refundQuery(null, null, refundId.toString(), null); + if (Objects.isNull(wxPayRefundQueryResult) || CollUtil.isEmpty(wxPayRefundQueryResult.getRefundRecords())) { + refundInfoBo.setRefundSuccess(false); + } else { + WxPayRefundQueryResult.RefundRecord refundRecord = wxPayRefundQueryResult.getRefundRecords().get(0); + if (Objects.equals(refundRecord.getRefundStatus(), Constant.SUCCESS)) { + refundInfoBo.setBizRefundNo(refundRecord.getRefundId()); + refundInfoBo.setRefundSuccess(true); + } else { + refundInfoBo.setRefundSuccess(false); + } + } + } + } else if (PayType.isAliPay(payType)) { + AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest(); + AlipayTradeFastpayRefundQueryModel alipayTradeFastpayRefundQueryModel = new AlipayTradeFastpayRefundQueryModel(); + alipayTradeFastpayRefundQueryModel.setOutTradeNo(payId.toString()); + alipayTradeFastpayRefundQueryModel.setOutRequestNo(refundId.toString()); + request.setBizModel(alipayTradeFastpayRefundQueryModel); + AlipayTradeFastpayRefundQueryResponse response = aliPayConfig.getAlipayClient().certificateExecute(request); + if (response.isSuccess() && Objects.equals(response.getRefundStatus(), REFUND_SUCCESS)) { + refundInfoBo.setBizRefundNo(response.getTradeNo()); + refundInfoBo.setRefundSuccess(true); + } else { + refundInfoBo.setRefundSuccess(false); + } + } else { + refundInfoBo.setRefundSuccess(false); + } + } catch (WxPayException | AlipayApiException e) { + logger.error("获取退款信息错误:", e); + refundInfoBo.setRefundSuccess(false); + } + return refundInfoBo; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/manager/PayNoticeManager.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/manager/PayNoticeManager.java new file mode 100644 index 0000000..db7bed9 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/manager/PayNoticeManager.java @@ -0,0 +1,362 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.manager; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.api.flow.feign.FlowFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopWalletFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopWalletLogFeignClient; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderSettlementFeignClient; +import com.tmerclub.cloud.api.order.vo.OrderSettlementPayVO; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.api.user.feign.UserBalanceLogFeignClient; +import com.tmerclub.cloud.api.user.feign.UserLevelLogFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.order.bo.PayRefundBO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.payment.allinpay.order.resp.OrderResultNotice; +import com.tmerclub.cloud.payment.bo.PayInfoResultBO; +import com.tmerclub.cloud.payment.constant.DistributedIdKey; +import com.tmerclub.cloud.payment.constant.PayStatus; +import com.tmerclub.cloud.payment.model.PayInfo; +import com.tmerclub.cloud.payment.service.PayInfoService; +import com.tmerclub.cloud.payment.service.RefundInfoService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2021/5/11 + */ +@Component +public class PayNoticeManager { + + private static final Logger logger = LoggerFactory.getLogger(PayNoticeManager.class); + + @Autowired + private SegmentManager segmentManager; + @Autowired + private PayInfoService payInfoService; + @Autowired + private RefundInfoService refundInfoService; + @DubboReference + private OrderFeignClient orderFeignClient; + @DubboReference + private SeckillFeignClient seckillFeignClient; + @DubboReference + private UserBalanceLogFeignClient userBalanceLogFeignClient; + @DubboReference + private ShopWalletLogFeignClient shopWalletLogFeignClient; + @DubboReference + private UserLevelLogFeignClient userLevelLogFeignClient; + @DubboReference + private OrderSettlementFeignClient orderSettlementFeignClient; + @DubboReference + private SearchOrderFeignClient searchOrderFeignClient; + @DubboReference + private ShopWalletFeignClient shopWalletFeignClient; + @DubboReference + private FlowFeignClient flowFeignClient; + + /** + * 订单付款回调处理 + * 该方法中调用其他服务如果出现的异常,直接抛出,不要继续执行后续的步骤 + * + * @param payInfoResultBO + * @param payInfo + * @param paySysType + * @return + */ + public ResponseEntity noticeOrder(PayInfoResultBO payInfoResultBO, PayInfo payInfo, Integer paySysType) { + + // 获取订单之前是不是有进行过支付,如果有进行过支付,那么本次支付将直接退款 + String[] orderIdStrArr = payInfo.getOrderIds().split(StrUtil.COMMA); + List orderIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (String s : orderIdStrArr) { + orderIdList.add(Long.valueOf(s)); + } + + ServerResponseEntity> ordersStatusResponse = orderFeignClient.getOrdersStatus(orderIdList); + + if (!ordersStatusResponse.isSuccess()) { + throw new LuckException(ordersStatusResponse.getMsg()); + } + long actualTotal = 0L; + List orderStatusList = ordersStatusResponse.getData(); + + // 查询一下redis中是否有数据,有表示是秒杀订单,处理一下 + ShopCartOrderMergerVO shopCartOrderMergerVO = handleSeckillOrderPay(payInfo.getUserId(), orderIdList, orderStatusList); + + for (OrderStatusBO orderStatusBO : orderStatusList) { + // 如果是定金预售,用定金or尾款钱进行判断 + if (Objects.equals(orderStatusBO.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + long balanceAmount = orderStatusBO.getBalanceAmount() + orderStatusBO.getFreightAmount() - orderStatusBO.getPlatformFreeFreightAmount(); + long preSaleAmount = Objects.equals(orderStatusBO.getStatus(), OrderStatus.UNPAY.value()) ? orderStatusBO.getDepositAmount() : balanceAmount; + actualTotal = actualTotal + preSaleAmount; + } else { + actualTotal = actualTotal + orderStatusBO.getActualTotal(); + } + // 有其中一个订单已经支付过了 + if (!Objects.equals(orderStatusBO.getStatus(), OrderStatus.UNPAY.value()) && !Objects.equals(orderStatusBO.getStatus(), OrderStatus.WAIT_BALANCE.value()) + && !Objects.equals(orderStatusBO.getStatus(), OrderStatus.CLOSE.value())) { + ServerResponseEntity settlementResponse = orderSettlementFeignClient.getPayIdByOrderId(orderStatusBO.getOrderId()); + if (!settlementResponse.isSuccess()) { + throw new LuckException(settlementResponse.getMsg()); + } + OrderSettlementPayVO settlementPayVO = settlementResponse.getData(); + // 相同的支付单号就不判断了 + if (Objects.nonNull(settlementPayVO.getPayId()) && Objects.equals(settlementPayVO.getPayId(), payInfo.getPayId())) { + continue; + } + PayRefundBO payRefundBO = new PayRefundBO(); + payRefundBO.setRefundId(this.getOrderRefundId(payInfo.getUserId())); + payRefundBO.setRefundAmount(payInfo.getPayAmount()); + payRefundBO.setOrderId(orderStatusBO.getOrderId()); + payRefundBO.setShopId(orderStatusBO.getShopId()); + payRefundBO.setPayId(payInfo.getPayId()); + payRefundBO.setOnlyRefund(1); + refundInfoService.doRefund(payRefundBO); + // 标记为退款 + payInfoService.markerRefund(payInfo.getPayId()); + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + } + + // 如果订单实付金额和支付金额不一致,则退款 + if (actualTotal != payInfo.getPayAmount()) { + logger.info("用户支付金额不对,执行退款{}", payInfo); + logger.info("用户支付金额不对,订单当前还需要支付{}", actualTotal); + PayRefundBO payRefundBO = new PayRefundBO(); + payRefundBO.setRefundId(this.getOrderRefundId(payInfo.getUserId())); + payRefundBO.setRefundAmount(payInfo.getPayAmount()); + payRefundBO.setPayId(payInfo.getPayId()); + payRefundBO.setOnlyRefund(1); + payRefundBO.setShopId(orderStatusList.get(0).getShopId()); + refundInfoService.doRefundByAmountError(payInfo, payRefundBO); + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + logger.info("支付成功,执行下一步{}", payInfo); + // 真正的支付成功 + payInfoService.paySuccess(payInfoResultBO, payInfo, orderIdList, paySysType,shopCartOrderMergerVO); + // 记录支付成功日志 + flowFeignClient.paySuccessLog(payInfo.getSystemModel(), payInfo.getOrderIds(), payInfo.getUserId()); + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + + + public ResponseEntity noticeRecharge(PayInfoResultBO payInfoResultBO, PayInfo payInfo) { + + // 获取订单之前是不是有进行过支付,如果有进行过支付,那么本次支付将直接退款 + Long rechargeLogId = Long.valueOf(payInfo.getOrderIds()); + + boolean isShopUser = Objects.equals(payInfo.getSysType(), SysTypeEnum.MULTISHOP.value()); + ServerResponseEntity ordersStatusResponse; + if (isShopUser) { + ordersStatusResponse = shopWalletLogFeignClient.getIsPay(rechargeLogId); + } else { + ordersStatusResponse = userBalanceLogFeignClient.getIsPay(rechargeLogId); + } + + if (!ordersStatusResponse.isSuccess()) { + return ResponseEntity.ok(ResponseEnum.EXCEPTION.value()); + } + + Integer isPay = ordersStatusResponse.getData(); + // 有其中一个订单已经支付过了 + if (Objects.equals(isPay, 1)) { + PayRefundBO payRefundBO = new PayRefundBO(); + payRefundBO.setOrderId(rechargeLogId); + payRefundBO.setRefundId(this.getOrderRefundId(payInfo.getUserId())); + payRefundBO.setRefundAmount(payInfo.getPayAmount()); + payRefundBO.setPayId(payInfoResultBO.getPayId()); + payRefundBO.setOnlyRefund(1); + refundInfoService.doRefund(payRefundBO); + // 标记为退款 + payInfoService.markerRefund(payInfo.getPayId()); + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + + // 支付成功 + payInfoService.rechargeSuccess(payInfoResultBO, PayType.instance(payInfo.getPayType()), rechargeLogId, payInfo.getSysType()); + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + + public ResponseEntity noticeBuyVip(PayInfoResultBO payInfoResultBO, PayInfo payInfo) { + // 获取订单之前是不是有进行过支付,如果有进行过支付,那么本次支付将直接退款 + Long userLevelLogId = Long.valueOf(payInfo.getOrderIds()); + + ServerResponseEntity ordersStatusResponse = userLevelLogFeignClient.getIsPay(userLevelLogId); + + if (!ordersStatusResponse.isSuccess()) { + return ResponseEntity.ok(ResponseEnum.EXCEPTION.value()); + } + + Integer isPay = ordersStatusResponse.getData(); + + // 有其中一个订单已经支付过了 + if (Objects.equals(isPay, 1)) { + PayRefundBO payRefundBO = new PayRefundBO(); + payRefundBO.setRefundId(this.getOrderRefundId(payInfo.getUserId())); + payRefundBO.setRefundAmount(payInfo.getPayAmount()); + payRefundBO.setOrderId(userLevelLogId); + payRefundBO.setPayId(payInfoResultBO.getPayId()); + payRefundBO.setOnlyRefund(1); + refundInfoService.doRefund(payRefundBO); + // 标记为退款 + payInfoService.markerRefund(payInfo.getPayId()); + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + + // 支付成功 + payInfoService.buyVipSuccess(payInfoResultBO, PayType.instance(payInfo.getPayType()), userLevelLogId); + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + + public ResponseEntity noticeBalancePay(PayInfoResultBO payInfoResultBO, PayInfo payInfo) { + + // 获取订单之前是不是有进行过采购,如果有进行过采购,那么本次支付将直接退款 + Long orderIds = Long.valueOf(payInfo.getOrderIds()); + + ServerResponseEntity ordersStatusResponse = shopWalletLogFeignClient.getShopBalancePayIsPay(orderIds); + if (!ordersStatusResponse.isSuccess()) { + return ResponseEntity.ok(ResponseEnum.EXCEPTION.value()); + } + + Integer isPay = ordersStatusResponse.getData(); + // 有其中一个订单已经支付过了 + if (Objects.equals(isPay, 1)) { + PayRefundBO payRefundBO = new PayRefundBO(); + payRefundBO.setPayId(payInfoResultBO.getPayId()); + payRefundBO.setRefundId(this.getOrderRefundId(payInfo.getUserId())); + payRefundBO.setRefundAmount(payInfo.getPayAmount()); + payRefundBO.setOrderId(orderIds); + payRefundBO.setOnlyRefund(1); + refundInfoService.doRefund(payRefundBO); + // 标记为退款 + payInfoService.markerRefund(payInfo.getPayId()); + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + + // 支付成功 + payInfoService.payShopBalanceSuccess(payInfoResultBO, orderIds); + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + + public ResponseEntity noticeShopBalancePayRefundSpread(PayInfoResultBO payInfoResultBO, PayInfo payInfo) { + + // 获取订单之前是不是有进行过采购,如果有进行过自行处理费用,那么本次支付将直接退款 + Long orderIds = Long.valueOf(payInfo.getOrderIds()); + // TODO 如果管理员在操作自行处理退款的支付过程中,另一个管理员也进行了支付退款自行处理费用,需要退款这一笔 + ServerResponseEntity ordersStatusResponse = shopWalletLogFeignClient.getRefundShopBalancePayIsPay(orderIds); + if (!ordersStatusResponse.isSuccess()) { + return ResponseEntity.ok(ResponseEnum.EXCEPTION.value()); + } + + Integer isPay = ordersStatusResponse.getData(); + // 有其中一个订单已经支付过了 + if (Objects.equals(isPay, 1)) { + PayRefundBO payRefundBO = new PayRefundBO(); + payRefundBO.setOnlyRefund(1); + payRefundBO.setRefundId(this.getOrderRefundId(payInfo.getUserId())); + payRefundBO.setRefundAmount(payInfo.getPayAmount()); + payRefundBO.setOrderId(orderIds); + payRefundBO.setPayId(payInfoResultBO.getPayId()); + refundInfoService.doRefund(payRefundBO); + // 标记为退款 + payInfoService.markerRefund(payInfo.getPayId()); + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + payInfoResultBO.setRefundId(payInfo.getRefundId()); + payInfoService.noticeShopBalancePayRefundSpread(payInfoResultBO, orderIds); + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + + public ResponseEntity settlementOrderByAllinpay(PayInfoResultBO payInfoResultBO, PayInfo payInfo) { + payInfoService.noticeSettlementOrder(payInfoResultBO, payInfo); + return ResponseEntity.ok(payInfoResultBO.getSuccessString()); + } + + @Transactional(rollbackFor = Exception.class) + public void noticeAllinpayShopRecharge(OrderResultNotice orderResultNotice) { + + // 标记为支付成功状态 + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(Long.valueOf(orderResultNotice.getBizOrderNo())); + payInfo.setBizPayNo(orderResultNotice.getOrderNo()); + // 支付渠道交易单号 + payInfo.setCallbackContent(orderResultNotice.getChnltrxid()); + payInfo.setCallbackTime(new Date()); + payInfo.setPayStatus(PayStatus.PAYED.value()); + payInfoService.updateToSuccess(payInfo); + + // 充值订单只有支付成功才回调 + ServerResponseEntity response = shopWalletFeignClient.rechargeBack(orderResultNotice.getBizOrderNo(), orderResultNotice.getStatus(), orderResultNotice.getBuyerBizUserId()); + if (!response.isSuccess()) { + logger.error("充值回调失败,{}", response.getMsg()); + throw new LuckException("充值回调失败"); + } + } + + /** + * 处理一下秒杀订单支付 + * + * @param userId + * @param orderIdList + * @param orderStatusList + */ + private ShopCartOrderMergerVO handleSeckillOrderPay(Long userId, List orderIdList, List orderStatusList) { + Long orderId = orderIdList.get(0); + ServerResponseEntity shopCartOrderMergerResp = seckillFeignClient.getSeckillOrderByRedis(orderId, userId); + if (!shopCartOrderMergerResp.isSuccess()) { + throw new LuckException(shopCartOrderMergerResp.getMsg()); + } + ShopCartOrderMergerVO shopCartOrderMergerVO = shopCartOrderMergerResp.getData(); + if (Objects.isNull(shopCartOrderMergerVO)) { + return null; + } + if(CollectionUtil.isEmpty(orderStatusList)){ + // orderId,shopId,ActualTotal,status,preSaleType + OrderStatusBO orderStatusBO = new OrderStatusBO(); + orderStatusBO.setActualTotal(shopCartOrderMergerVO.getActualTotal()); + orderStatusBO.setOrderId(orderIdList.get(0)); + orderStatusBO.setStatus(shopCartOrderMergerVO.getStatus()); + orderStatusBO.setShopId(shopCartOrderMergerVO.getShopCartOrders().get(0).getShopId()); + orderStatusBO.setPreSaleType(shopCartOrderMergerVO.getPreSaleType()); + orderStatusList.add(orderStatusBO); + } + return shopCartOrderMergerVO; + } + + private Long getOrderRefundId(Long userId) { + return segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_REFUND, userId); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/mapper/RefundInfoMapper.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/mapper/RefundInfoMapper.java new file mode 100644 index 0000000..703f6c7 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/mapper/RefundInfoMapper.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.mapper; + +import com.tmerclub.cloud.payment.model.RefundInfo; +import com.tmerclub.cloud.payment.vo.RefundInfoVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 退款信息 + * + * @author FrozenWatermelon + * @date 2021-03-15 15:26:03 + */ +public interface RefundInfoMapper { + + /** + * 获取退款信息列表 + * @return 退款信息列表 + */ + List list(); + + /** + * 根据退款信息id获取退款信息 + * + * @param refundId 退款信息id + * @return 退款信息 + */ + List listByRefundIdAndWxPay(@Param("refundId") Long refundId); + + /** + * 根据退款信息id获取退款信息 + * + * @param refundId 退款信息id + * @return 退款信息 + */ + List listByRefundId(@Param("refundId") Long refundId); + + /** + * 保存退款信息 + * @param refundInfo 退款信息 + * @return + */ + int save(@Param("refundInfo") RefundInfo refundInfo); + + /** + * 更新退款信息 + * @param refundInfo 退款信息 + */ + void update(@Param("refundInfo") RefundInfo refundInfo); + + /** + * 根据退款信息id删除退款信息 + * @param refundId 退款单号 + */ + void deleteById(@Param("refundId") Long refundId); + + /** + * 计算执行退款单的数量 + * + * @param refundId 退款单号 + * @return 执行退款单的数量 + */ + int countByRefundId(@Param("refundId") Long refundId); + + /** + * 获取退款信息 + * + * @param payIds + * @return + */ + List listByPayIds(@Param("payIds") List payIds); + + /** + * 通过payId更新退款信息 + * + * @param refundInfo 退款信息 + */ + void updateByIdAndPayId(@Param("refundInfo") RefundInfo refundInfo); + + /** + * 获取退款详细信息 + * @param refundId + * @return + */ + RefundInfoVO getByRefundId(@Param("refundId") Long refundId); +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/model/PayInfo.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/model/PayInfo.java new file mode 100644 index 0000000..dcf9744 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/model/PayInfo.java @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单支付记录 + * + * @author FrozenWatermelon + * @date 2020-12-25 09:50:59 + */ +public class PayInfo extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 支付单号 + */ + private Long payId; + + /** + * 用户id + */ + private Long userId; + /** + * 外部订单流水号 + */ + private String bizPayNo; + + /** + * 本次支付关联的多个订单号 + */ + private String orderIds; + + /** + * 本次支付关联的退款号 + */ + private Long refundId; + + /** + * 系统类型 见SysTypeEnum + */ + private Integer sysType; + + /** + * 支付入口 + */ + private Integer payEntry; + + /** + * 支付方式 1 微信支付 2 支付宝 + */ + private Integer payType; + + /** + * 支付状态 + */ + private Integer payStatus; + + /** + * 支付积分 + */ + private Long payScore; + + /** + * 支付金额 + */ + private Long payAmount; + + /** + * 版本号 + */ + private Integer version; + + /** + * 回调内容 + */ + private String callbackContent; + + /** + * 回调时间 + */ + private Date callbackTime; + + /** + * 确认时间 + */ + private Date confirmTime; + + /** + * 支付给商城的用户id,通联支付独有 + */ + private String toUserId; + + /** + * TODO 暂时用不上系统支付类型 + */ + private Integer paySysType; + + /** + * 支付的系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios + */ + private Integer systemModel; + + /** + * 第三方系统id + */ + private String bizUserId; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public Integer getSystemModel() { + return systemModel; + } + + public void setSystemModel(Integer systemModel) { + this.systemModel = systemModel; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public String getToUserId() { + return toUserId; + } + + public void setToUserId(String toUserId) { + this.toUserId = toUserId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getBizPayNo() { + return bizPayNo; + } + + public void setBizPayNo(String bizPayNo) { + this.bizPayNo = bizPayNo; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getPayStatus() { + return payStatus; + } + + public void setPayStatus(Integer payStatus) { + this.payStatus = payStatus; + } + + public Long getPayScore() { + return payScore; + } + + public void setPayScore(Long payScore) { + this.payScore = payScore; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public String getCallbackContent() { + return callbackContent; + } + + public void setCallbackContent(String callbackContent) { + this.callbackContent = callbackContent; + } + + public Date getCallbackTime() { + return callbackTime; + } + + public void setCallbackTime(Date callbackTime) { + this.callbackTime = callbackTime; + } + + public Date getConfirmTime() { + return confirmTime; + } + + public void setConfirmTime(Date confirmTime) { + this.confirmTime = confirmTime; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public Integer getPayEntry() { + return payEntry; + } + + public void setPayEntry(Integer payEntry) { + this.payEntry = payEntry; + } + + @Override + public String toString() { + return "PayInfo{" + + "payId=" + payId + + ", userId=" + userId + + ", bizPayNo='" + bizPayNo + '\'' + + ", orderIds='" + orderIds + '\'' + + ", refundId=" + refundId + + ", sysType=" + sysType + + ", payEntry=" + payEntry + + ", payType=" + payType + + ", payStatus=" + payStatus + + ", payScore=" + payScore + + ", payAmount=" + payAmount + + ", version=" + version + + ", callbackContent='" + callbackContent + '\'' + + ", callbackTime=" + callbackTime + + ", confirmTime=" + confirmTime + + ", toUserId='" + toUserId + '\'' + + ", paySysType=" + paySysType + + ", systemModel" + systemModel + + ", bizUserId" + bizUserId + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/model/RefundInfo.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/model/RefundInfo.java new file mode 100644 index 0000000..7e48539 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/model/RefundInfo.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 退款信息 + * + * @author lhd + * @date 2021-08-22 15:26:03 + */ +public class RefundInfo extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 退款单号 + */ + private Long refundId; + + /** + * 关联的支付订单id + */ + private Long orderId; + + /** + * 关联的支付单id + */ + private Long payId; + + /** + * 用户id + */ + private Long userId; + + /** + * 退款状态-RefundStatus枚举 + */ + private Integer refundStatus; + + /** + * 退款金额 + */ + private Long refundAmount; + + /** + * 支付方式 + */ + private Integer payType; + + /** + * 回调内容 + */ + private String callbackContent; + + /** + * 回调时间 + */ + private Date callbackTime; + + /** + * 是否为未成团而退款的团购订单 + */ + private Integer unSuccessGroupOrder; + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public String getCallbackContent() { + return callbackContent; + } + + public void setCallbackContent(String callbackContent) { + this.callbackContent = callbackContent; + } + + public Date getCallbackTime() { + return callbackTime; + } + + public void setCallbackTime(Date callbackTime) { + this.callbackTime = callbackTime; + } + + public Integer getUnSuccessGroupOrder() { + return unSuccessGroupOrder; + } + + public void setUnSuccessGroupOrder(Integer unSuccessGroupOrder) { + this.unSuccessGroupOrder = unSuccessGroupOrder; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "RefundInfo{" + + "refundId=" + refundId + + ", orderId=" + orderId + + ", payId=" + payId + + ", userId=" + userId + + ", refundStatus=" + refundStatus + + ", refundAmount=" + refundAmount + + ", payType=" + payType + + ", callbackContent='" + callbackContent + '\'' + + ", callbackTime=" + callbackTime + + ", unSuccessGroupOrder=" + unSuccessGroupOrder + + "} " + super.toString(); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/AllinpayService.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/AllinpayService.java new file mode 100644 index 0000000..e23231c --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/AllinpayService.java @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.service; + +import com.tmerclub.cloud.api.payment.allinpay.member.resp.BindCard; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.QueryBalanceResp; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.payment.allinpay.member.resp.*; +import com.tmerclub.cloud.payment.allinpay.member.resp.*; +import com.tmerclub.cloud.payment.allinpay.order.resp.GetOrderStatusResp; +import com.tmerclub.cloud.payment.allinpay.order.resp.InExpDetail; +import com.tmerclub.cloud.payment.allinpay.order.resp.ResendPaySmsResp; +import com.tmerclub.cloud.payment.dto.*; +import com.tmerclub.cloud.payment.dto.*; + +import java.util.List; + +/** + * @author lanhai + */ +public interface AllinpayService { + + /** + * 注册会员 + * + * @param bizUserId + * @param sysType 系统类型 + */ + void createMember(String bizUserId, Integer sysType); + + /** + * 获取个人会员信息 + * @param bizUserId 商户userId + * @return + */ + UserInfo getUserInfo(String bizUserId); + + /** + * 发送短信验证码 + * @param userId 用户id + * @param verificationCodeDTO 短信验证码类 + */ + void sendVerificationCode(String userId, VerificationCodeDTO verificationCodeDTO); + + /** + * 绑定手机 + * @param userId 用户id + * @param verificationCodeDTO 短信验证码类 + */ + void bindPhone(String userId, VerificationCodeDTO verificationCodeDTO); + + /** + * 解绑手机 + * @param userId 用户id + * @param verificationCodeDTO 短信验证码类 + */ + void unbindPhone(String userId, VerificationCodeDTO verificationCodeDTO); + + /** + * 修改绑定手机(返回通联url形式)[仅限个人会员] + * @param bizUserId + * @param updatePhoneByPayPwdDTO + * @param backUrl + * @return + */ + String updatePhoneByPayPwd(String bizUserId, String backUrl, UpdatePhoneByPayPwdDTO updatePhoneByPayPwdDTO); + + /** + * 个人实名验证 + * @param userId 用户id + * @param setRealNameDTO 实名验证类 + */ + void setRealName(Long userId, SetRealNameDTO setRealNameDTO); + + /** + * 锁定会员 + * @param lockMemberDTO 锁定会员类 + */ + void lockMember(LockMemberDTO lockMemberDTO); + + /** + * 解锁会员 + * @param lockMemberDTO 锁定会员类 + */ + void unlockMember(LockMemberDTO lockMemberDTO); + + /** + * 查询卡bin + * @param cardNo 卡号 + * @return + */ + CardBinInfo getBankCardBin(String cardNo); + + /** + * 请求绑定银行卡 + * @param userId + * @param applyBankCardDTO + * @return + */ + ApplyBindBankCardResp applyBindBankCard(String userId, ApplyBankCardDTO applyBankCardDTO); + + /** + * 确认绑定银行卡 + * @param userId + * @param bindBankCardDTO + */ + void bindBankCard(String userId, BindBankCardDTO bindBankCardDTO); + + /** + * 解绑银行卡 + * @param userId + * @param unbindBankCardDTO + */ + void unbindBankCard(String userId, UnbindBankCardDTO unbindBankCardDTO); + + /** + * 查询银行卡 + * @param userId + * @param cardNo + * @return + */ + List queryBankCard(String userId, String cardNo); + + /** + * 会员绑定支付账户用户标识 + * @param bizUserId 商户用户id + * @param applyBindAcctDTO 绑定标识类 + */ + void applyBindAcct(String bizUserId, ApplyBindAcctDTO applyBindAcctDTO); + + /** + * 查询已绑定的支付账号用户标识 + * + * @param bizUserId + * @return + */ + QueryBindAcctResp queryBindAcct(String bizUserId); + + /** + * 设置支付密码 + * @param userId 用户id + * @param backUrl 通知回调地址 + * @param setPayPwdDTO 设置支付密码类 + * @return + */ + String setPayPwd(Long userId, String backUrl, SetPayPwdDTO setPayPwdDTO); + + /** + * 修改支付密码 + * @param userId 用户id + * @param backUrl 通知回调地址 + * @param setPayPwdDTO 设置支付密码类 + * @return + */ + String updatePayPwd(Long userId, String backUrl, SetPayPwdDTO setPayPwdDTO); + + /** + * 重置支付密码 + * @param userId 用户id + * @param backUrl 通知回调地址 + * @param setPayPwdDTO 设置支付密码类 + * @return + */ + String resetPayPwd(Long userId, String backUrl, SetPayPwdDTO setPayPwdDTO); + + /** + * 账户提现协议签约 + * @param bizUserId 商户系统用户id + * @param backUrl 通知地址 + * @param signAcctProtocolDTO 签约提现协议类 + * @return + */ + String signAcctProtocol(String bizUserId, String backUrl, SignAcctProtocolDTO signAcctProtocolDTO); + + /** + * 账户协议签约查询 + * @param bizUserId 商户系统用户id + * @param signAcctProtocolDTO 签约提现协议类 + * @return + */ + String signContractQuery(String bizUserId, SignAcctProtocolDTO signAcctProtocolDTO); + + /** + * 修改绑定手机(银行卡验证版) + * @param bizUserId + * @param bankCardChangeBindPhoneDTO + * @return + */ + BankCardChangeBindPhoneResp bankCardChangeBindPhone(String bizUserId, BankCardChangeBindPhoneDTO bankCardChangeBindPhoneDTO); + + /** + * 确认修改绑定手机(银行卡验证版) + * @param bizUserId + * @param verifyBankCardChangeBindPhoneDTO + */ + void verifyBankCardChangeBindPhone(String bizUserId, VerifyBankCardChangeBindPhoneDTO verifyBankCardChangeBindPhoneDTO); + + /** + * 查询账户余额 + * @param bizUserId 商户userId + * @param sysType 系统类型 + * @return + */ + QueryBalanceResp queryBalance(String bizUserId, Integer sysType); + + /** + * 查询账户收支明细接口 + * @param bizUserId 商户userId + * @param pageDTO 分页参数 + * @param queryInExpDetailDTO 查询参数 + * @return + */ + PageVO queryInExpDetail(String bizUserId, PageDTO pageDTO, QueryInExpDetailDTO queryInExpDetailDTO); + + /** + * 确认支付[前台+短信验证码] + * @param bizUserId + * @param payBySmsDTO + * @return + */ + String payBySms(String bizUserId, PayBySmsDTO payBySmsDTO); + + /** + * 确认支付[前台+支付密码] + * @param bizUserId + * @param payByPwdDTO + * @return + */ + String payByPwd(String bizUserId, PayByPwdDTO payByPwdDTO); + + /** + * 确认支付[后台+短信验证码] + * + * @param bizUserId + * @param payByBackSmsDTO + * @return + */ + PayByBackSmsResp payByBackSms(String bizUserId, PayByBackSmsDTO payByBackSmsDTO); + + /** + * 重复支付短信验证码 + * + * @param bizOrderNo + * @return + */ + ResendPaySmsResp resendPaySms(String bizOrderNo); + + /** + * 获取订单状态 + * @param bizUserId + * @param bizOrderNo + * @return + */ + GetOrderStatusResp getOrderStatus(String bizUserId, String bizOrderNo); +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/PayInfoService.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/PayInfoService.java new file mode 100644 index 0000000..bb2f836 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/PayInfoService.java @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.service; + +import com.tmerclub.cloud.api.payment.vo.AccountDetailVO; +import com.tmerclub.cloud.api.payment.vo.ShopAccountDetailVO; +import com.tmerclub.cloud.api.payment.vo.SplitRuleVO; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.payment.bo.PayInfoBO; +import com.tmerclub.cloud.payment.bo.PayInfoResultBO; +import com.tmerclub.cloud.payment.dto.AccountSearchDTO; +import com.tmerclub.cloud.payment.dto.BuyVipPayInfoDTO; +import com.tmerclub.cloud.payment.dto.PayInfoDTO; +import com.tmerclub.cloud.payment.dto.RechargePayInfoDTO; +import com.tmerclub.cloud.payment.model.PayInfo; +import com.tmerclub.cloud.payment.vo.PayInfoVO; +import jakarta.servlet.http.HttpServletResponse; + +import java.util.Date; +import java.util.List; + +/** + * 订单支付记录 + * + * @author FrozenWatermelon + * @date 2020-12-25 09:50:59 + */ +public interface PayInfoService { + + /** + * 调取微信 or 支付宝接口,创建支付订单,返回给前端,前端唤起应用进行支付 + * + * @param userId 用户id + * @param payParam 支付参数 + * @param bizUserId 第三方系统id + * @return 前端唤起支付需要的参数 + */ + PayInfoBO pay(Long userId, PayInfoDTO payParam, String bizUserId); + + + /** + * 根据订单支付记录id获取订单支付记录 + * + * @param payId 订单支付记录id + * @return 订单支付记录 + */ + PayInfo getByPayId(Long payId); + + /** + * 标记为支付成功 + * + * @param payInfoResult 支付信息 + * @param temp 支付信息 + * @param orderIds 订单ids + * @param paySysType + * @param shopCartOrderMergerVO + */ + void paySuccess(PayInfoResultBO payInfoResult, PayInfo temp, List orderIds, Integer paySysType, ShopCartOrderMergerVO shopCartOrderMergerVO); + + /** + * 根据支付订单号获取订单支付状态 + * + * @param orderIds 订单号ids + * @return 支付状态 + */ + Integer getPayStatusByOrderIds(String orderIds); + + /** + * 查询订单是否已经支付 + * + * @param orderIds 订单id + * @param userId 用户id + * @param payEntry 支付入口 见 com.tmerclub.cloud.payment.constant.PayEntry + * @param payAmountType + * @return 是否已经支付 + */ + Integer isPay(String orderIds, Long userId, Integer payEntry, Integer payAmountType); + + /** + * 标记为退款状态 + * + * @param payId 订单号 + */ + void markerRefund(Long payId); + + /** + * 更新支付信息 + * + * @param payInfo + */ + void update(PayInfo payInfo); + + /** + * 根据订单id,获取订单支付的信息 + * + * @param orderIds 订单ids + * @return 支付信息 + */ + List listByOrderIds(List orderIds); + + + /** + * 调取微信 or 支付宝接口,创建充值订单,返回给前端,前端唤起应用进行支付 + * + * @param userId 用户id + * @param payParam 支付参数 + * @return 前端唤起支付需要的参数 + */ + PayInfoBO recharge(Long userId, RechargePayInfoDTO payParam); + + /** + * 充值成功 + * + * @param payInfoResult 支付信息 + * @param payType 支付方式 + * @param rechargeLogId 充值记录id + * @param sysType 系统类型 + */ + void rechargeSuccess(PayInfoResultBO payInfoResult, PayType payType, Long rechargeLogId, Integer sysType); + + /** + * 商家余额支付成功 + * + * @param payInfoResult 支付信息 + * @param rechargeLogId 充值记录id + */ + void payShopBalanceSuccess(PayInfoResultBO payInfoResult, Long rechargeLogId); + + /** + * 进行vip购买,返回支付信息 + * + * @param userId 用户id + * @param payParam 支付参数 + * @return 支付信息 + */ + PayInfoBO vipBuy(Long userId, BuyVipPayInfoDTO payParam); + + /** + * 购买会员成功 + * + * @param payInfoResult 支付信息 + * @param payType 支付方式 + * @param userLevelLogId 会员购买记录 + */ + void buyVipSuccess(PayInfoResultBO payInfoResult, PayType payType, Long userLevelLogId); + + /** + * 根据时间参数获取收入账户详情 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param shopName 店铺名称 + * @return 收入账户详情 + */ + AccountDetailVO getIncomeAccountDetail(Date startTime, Date endTime, String shopName); + + /** + * 获取平台收入详情 + * + * @param startTime + * @param endTime + * @return + */ + AccountDetailVO getPlatformIncomeAccountDetail(Date startTime, Date endTime); + + /** + * 根据时间参数获取支付详情 + * + * @param pageDTO 分页参数 + * @param accountSearchDTO + * @return 支付详情 + */ + PageVO getPayInfoPage(PageDTO pageDTO, AccountSearchDTO accountSearchDTO); + + /** + * 导出收入明细列表 + * + * @param accountSearchDTO + * @param response + */ + void excelPayInfo(HttpServletResponse response, AccountSearchDTO accountSearchDTO); + + /** + * 支付预售订单尾款 + * + * @param userId + * @param payParam + * @return + */ + PayInfoBO payPreSaleBalance(Long userId, PayInfoDTO payParam); + + /** + * 根据时间参数分页获取收入账户详情 + * + * @param pageDTO + * @param accountSearchDTO + * @return + */ + PageVO pageIncomeAccountDetail(PageDTO pageDTO, AccountSearchDTO accountSearchDTO); + + /** + * 通知店铺已经使用余额支付退款自行处理的费用 + * + * @param payInfoResultBO + * @param orderIds + */ + void noticeShopBalancePayRefundSpread(PayInfoResultBO payInfoResultBO, Long orderIds); + + /** + * 通知店铺已经使用余额支付退款自行处理的费用 + * + * @param payInfoResultBO + * @param payInfo + */ + void noticeSettlementOrder(PayInfoResultBO payInfoResultBO, PayInfo payInfo); + + /** + * 平台转账,通联支付独有 + * + * @param splitRuleVO + */ + void platformTransfer(SplitRuleVO splitRuleVO); + + /** + * 根据用户id和订单id获取最新的支付成功记录的系统类型 + * @param orderId + * @param userId + * @return + */ + List getPaySystemTypeByUserIdAndOrderId(Long userId, Long orderId); + + /** + * 更新支付成功 + * @param payInfo + */ + void updateToSuccess(PayInfo payInfo); + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/AllinpayCompanyServiceImpl.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/AllinpayCompanyServiceImpl.java new file mode 100644 index 0000000..16481c6 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/AllinpayCompanyServiceImpl.java @@ -0,0 +1,393 @@ +package com.tmerclub.cloud.payment.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.multishop.feign.ShopBankCardFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopBankCardVO; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.*; +import com.tmerclub.cloud.api.payment.dto.BindCompanyAccountDTO; +import com.tmerclub.cloud.api.payment.dto.SetCompanyInfoDTO; +import com.tmerclub.cloud.api.payment.dto.UpdateCompanyInfoDTO; +import com.tmerclub.cloud.api.supplier.feign.SupplierBankCardFeignClient; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierBankCardVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.PaymentCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.IdCardCollectProcessStatus; +import com.tmerclub.cloud.common.constant.SignAcctType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.payment.allinpay.OpenClient; +import com.tmerclub.cloud.payment.allinpay.member.constant.*; +import com.tmerclub.cloud.payment.allinpay.member.req.*; +import com.tmerclub.cloud.payment.allinpay.member.constant.*; +import com.tmerclub.cloud.payment.allinpay.member.req.*; +import com.tmerclub.cloud.payment.allinpay.member.resp.ApplyBindBankCardResp; +import com.tmerclub.cloud.payment.allinpay.member.resp.CardBinInfo; +import com.tmerclub.cloud.payment.allinpay.member.resp.PhoneVerificationResp; +import com.tmerclub.cloud.payment.allinpay.service.AllinpayMemberService; +import com.tmerclub.cloud.payment.config.AllinpayConfig; +import com.tmerclub.cloud.payment.constant.DistributedIdKey; +import com.tmerclub.cloud.payment.dto.*; +import com.tmerclub.cloud.payment.dto.*; +import com.tmerclub.cloud.payment.service.AllinpayCompanyService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author TRACK + */ +@Service +public class AllinpayCompanyServiceImpl implements AllinpayCompanyService { + + @Autowired + private AllinpayMemberService allinpayMemberService; + @Autowired + private AllinpayConfig allinpayConfig; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private ShopBankCardFeignClient shopBankCardFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @DubboReference + private SupplierBankCardFeignClient supplierBankCardFeignClient; + + @Override + public void createCompanyMember(String bizUserId) { + CreateMember createMember = new CreateMember(bizUserId); + createMember.setMemberType(MemberType.ENTERPRISE.value()); + createMember.setSource(VisitSourceType.PC.value()); + allinpayMemberService.createMember(createMember); + } + + @Override + @Cacheable(cacheNames = PaymentCacheNames.COMPANY_INFO, key = "#tenantId") + public CompanyInfo getCompanyInfo(String tenantId) { + GetMemberInfo getMemberInfo = new GetMemberInfo(tenantId); + CompanyInfo companyInfo = allinpayMemberService.getCompanyInfo(getMemberInfo); + // 解密 + OpenClient client = allinpayConfig.getClient(); + companyInfo.setLegalIds(Objects.isNull(companyInfo.getLegalIds()) ? null : client.decrypt(companyInfo.getLegalIds())); + companyInfo.setAccountNo(Objects.isNull(companyInfo.getAccountNo()) ? null : client.encrypt(companyInfo.getAccountNo())); + return companyInfo; + } + + @Override + public void sendVerificationCode(String bizUserId, VerificationCodeDTO verificationCodeDTO) { + SendVerificationCode svc = new SendVerificationCode(bizUserId, verificationCodeDTO.getPhone()); + Integer type = verificationCodeDTO.getVerificationCodeType(); + if (type != null + && VerificationCodeType.instance(type) != null) { + svc.setVerificationCodeType(type); + } + allinpayMemberService.sendVerificationCode(svc); + } + + @Override + public void bindPhone(String bizUserId, VerificationCodeDTO verificationCodeDTO) { + BindPhone bindPhone = new BindPhone(bizUserId, verificationCodeDTO.getPhone(), verificationCodeDTO.getVerificationCode()); + allinpayMemberService.bindPhone(bindPhone); + // 更新绑定手机号码状态 + if (bizUserId.contains(AllinpayConstant.SHOP)) { + ServerResponseEntity response = shopDetailFeignClient.updateAllinpayBindPhoneStatus(bizUserId, 1); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } else if (bizUserId.contains(AllinpayConstant.SUPPLIER)) { + ServerResponseEntity response = supplierDetailFeignClient.updateAllinpayBindPhoneStatus(bizUserId, 1); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + } + + @Override + public void unbindPhone(String bizUserId, VerificationCodeDTO verificationCodeDTO) { + UnbindPhone unbindPhone = new UnbindPhone(bizUserId, verificationCodeDTO.getPhone(), verificationCodeDTO.getVerificationCode()); + PhoneVerificationResp phoneVerificationResp = allinpayMemberService.unbindPhone(unbindPhone); + if (Objects.equals(Constant.ERROR, phoneVerificationResp.getResult())) { + throw new LuckException("解绑手机失败"); + } + // 更新绑定手机号码状态 + if (bizUserId.contains(AllinpayConstant.SHOP)) { + ServerResponseEntity response = shopDetailFeignClient.updateAllinpayBindPhoneStatus(bizUserId, 0); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } else if (bizUserId.contains(AllinpayConstant.SUPPLIER)) { + ServerResponseEntity response = supplierDetailFeignClient.updateAllinpayBindPhoneStatus(bizUserId, 0); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + } + + @Override + public SetCompanyInfoResp setCompanyInfo(String tenantId, String backUrl, SetCompanyInfoDTO setCompanyInfoDTO) { + OpenClient client = allinpayConfig.getClient(); + CompanyBasicInfo companyBasicInfo = new CompanyBasicInfo(); + BeanUtils.copyProperties(setCompanyInfoDTO, companyBasicInfo); + companyBasicInfo.setLegalIds(client.encrypt(companyBasicInfo.getLegalIds())); + companyBasicInfo.setAccountNo(client.encrypt(companyBasicInfo.getAccountNo())); + companyBasicInfo.setAuthType(2); + companyBasicInfo.setIdentityType(1); + SetCompanyInfo setCompanyInfo = new SetCompanyInfo(tenantId, backUrl, companyBasicInfo); + return allinpayMemberService.setCompanyInfo(setCompanyInfo); + } + + @Override + public UpdateCompanyInfoResp updateCompanyInfo(String tenantId, String backUrl, UpdateCompanyInfoDTO updateCompanyInfoDTO) { + UpdateCompanyInfo updateCompanyInfo = new UpdateCompanyInfo(); + BeanUtils.copyProperties(updateCompanyInfoDTO, updateCompanyInfo); + Long reqSn = segmentManager.getDateFormatSegmentId(DistributedIdKey.MALL4CLOUD_ALLINPAY_UPDATE_COMPANY_SN); + updateCompanyInfo.setReqsn(String.valueOf(reqSn)); + updateCompanyInfo.setBackUrl(backUrl); + updateCompanyInfo.setBizUserId(tenantId); + updateCompanyInfo.setIdentityType(IdentityType.ID_CARD.value()); + if (Objects.nonNull(updateCompanyInfoDTO.getLegalIds()) && StrUtil.isNotBlank(updateCompanyInfoDTO.getLegalIds())) { + OpenClient client = allinpayConfig.getClient(); + updateCompanyInfo.setLegalIds(client.encrypt(updateCompanyInfoDTO.getLegalIds())); + } + return allinpayMemberService.updateCompanyInfo(updateCompanyInfo); + } + + @Override + public IdCardCollectResp idCardCollect(IdCardCollectDTO idCardCollectDTO, String backUrl) { + IdCardCollect idCardCollect = new IdCardCollect(); + BeanUtils.copyProperties(idCardCollectDTO, idCardCollect); + idCardCollect.setOcrComparisonResultBackUrl(backUrl); + return allinpayMemberService.idCardCollect(idCardCollect); + } + + @Override + public IdCardCollectByFileUploadResp idcardCollectByFileUpload(IdCardCollectByFileUpload idCardCollectByFileUpload) { + return allinpayMemberService.idcardCollectByFileUpload(idCardCollectByFileUpload); + } + + @Override + public CardBinInfo getBankCardBin(String cardNo) { + GetBankCardBin getBankCardBin = new GetBankCardBin(); + OpenClient client = allinpayConfig.getClient(); + getBankCardBin.setCardNo(client.encrypt(cardNo)); + return allinpayMemberService.getBankCardBin(getBankCardBin); + } + + @Override + public void applyBindBankCard(String tenantId, ApplyBankCardDTO applyBankCardDTO, String legalName) { + // 最多只能绑定一张法人账户 + checkLegalCard(tenantId); + OpenClient client = allinpayConfig.getClient(); + ApplyBindBankCard applyBindBankCard = new ApplyBindBankCard(); + BeanUtils.copyProperties(applyBankCardDTO, applyBindBankCard); + applyBindBankCard.setName(legalName); + applyBindBankCard.setBizUserId(tenantId); + applyBindBankCard.setCardCheck(8); + applyBindBankCard.setIdentityType(IdentityType.ID_CARD.value()); + applyBindBankCard.setIdentityNo(client.encrypt(applyBankCardDTO.getIdentityNo())); + applyBindBankCard.setCardNo(client.encrypt(applyBankCardDTO.getCardNo())); + ApplyBindBankCardResp applyBindBankCardResp = allinpayMemberService.applyBindBankCard(applyBindBankCard); + ShopBankCardVO shopBankCardVO = getShopBankCard(applyBindBankCardResp, legalName); + if (tenantId.contains(AllinpayConstant.SHOP)) { + shopBankCardFeignClient.saveBandCardByAllinpay(tenantId, shopBankCardVO); + } else if (tenantId.contains(AllinpayConstant.SUPPLIER)) { + SupplierBankCardVO supplierBankCardVO = new SupplierBankCardVO(); + BeanUtils.copyProperties(shopBankCardVO, supplierBankCardVO); + supplierBankCardFeignClient.saveBandCardByAllinpay(tenantId, supplierBankCardVO); + } + } + + private void checkLegalCard(String tenantId) { + List bindCards = queryBankCard(tenantId, null); + long bindCount = bindCards.stream().filter(card -> Objects.equals(card.getBankCardPro(), 0) && Objects.equals(card.getBindState(), 1)).count(); + if (bindCount == 1) { + throw new LuckException("当前已绑定一张法人银行卡,无法继续绑定"); + } + } + + @Override + public void bindBankCard(String tenantId, BindBankCardDTO bindBankCardDTO, String legalName) { + // 目前采用四要素绑卡,不需要调用这个方法 + // 最多只能绑定一张法人账户 + checkLegalCard(tenantId); + BindBankCard bindBankCard = new BindBankCard(); + BeanUtils.copyProperties(bindBankCardDTO, bindBankCard); + bindBankCard.setBizUserId(tenantId); + allinpayMemberService.bindBankCard(bindBankCard); + } + + private ShopBankCardVO getShopBankCard(ApplyBindBankCardResp bindBankCardResp, String legalName) { + List bindCardList = queryBankCard(bindBankCardResp.getBizUserId(), null); + List cardList = bindCardList.stream().filter(card -> Objects.equals(card.getBankCardPro(), 0) && Objects.equals(card.getBindState(), 1)).collect(Collectors.toList()); + BindCard bindCard = cardList.get(0); + ShopBankCardVO shopBankCardVO = new ShopBankCardVO(); + shopBankCardVO.setBankName(bindCard.getBankName()); + shopBankCardVO.setCardNo(bindCard.getBankCardNo()); + shopBankCardVO.setRecipientName(legalName); + shopBankCardVO.setOpeningBank(bindCard.getBankName()); + shopBankCardVO.setBranchName(bindCard.getBranchBankName()); + shopBankCardVO.setUnionBank(bindCard.getUnionBank()); + shopBankCardVO.setBankCardNo(bindCard.getBankCardNo()); + shopBankCardVO.setBankCardPro(0); + return shopBankCardVO; + } + + @Override + public void unbindBankCard(String tenantId, UnbindBankCardDTO unbindBankCardDTO) { + if (Objects.isNull(unbindBankCardDTO.getShopBankCardId())) { + throw new LuckException("shopBankCardId不能为空"); + } + List bindCards = queryBankCard(tenantId, unbindBankCardDTO.getCardNo()); + if (CollUtil.isEmpty(bindCards)) { + throw new LuckException("当前银行卡不存在或未绑定"); + } + if (!Objects.equals(bindCards.get(0).getBankCardPro(), 0)) { + throw new LuckException("只有法人银行卡才能解绑"); + } + if (tenantId.contains(AllinpayConstant.SHOP)) { + ServerResponseEntity response = shopBankCardFeignClient.deleteLegalBankCard(unbindBankCardDTO.getShopBankCardId()); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } else if (tenantId.contains(AllinpayConstant.SUPPLIER)) { + ServerResponseEntity response = supplierBankCardFeignClient.deleteLegalBankCard(unbindBankCardDTO.getShopBankCardId()); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + + OpenClient client = allinpayConfig.getClient(); + UnbindBankCard unbindBankCard = new UnbindBankCard(); + unbindBankCard.setBizUserId(tenantId); + unbindBankCard.setCardNo(client.encrypt(unbindBankCardDTO.getCardNo())); + allinpayMemberService.unbindBankCard(unbindBankCard); + } + + @Override + public List queryBankCard(String tenantId, String cardNo) { + QueryBankCard queryBankCard = new QueryBankCard(tenantId); + if (cardNo != null) { + OpenClient client = allinpayConfig.getClient(); + queryBankCard.setCardNo(client.encrypt(cardNo)); + } + return allinpayMemberService.queryBankCard(queryBankCard); + } + + @Override + public void bindCompanyAccount(String bizUserId, BindCompanyAccountDTO bindCompanyAccountDTO, String companyName) { + List bindCards = allinpayMemberService.queryBankCard(new QueryBankCard(bizUserId)); + if (CollUtil.isNotEmpty(bindCards)) { + long bindCount = bindCards.stream().filter(card -> Objects.equals(card.getBankCardPro(), 1) && Objects.equals(card.getBindState(), 1)).count(); + if (bindCount >= Constant.MAX_COMPANY_CARD_NUM) { + throw new LuckException("当前绑定对公户账户已超过10张,无法继续绑定"); + } + } + BindCompanyAccount bindCompanyAccount = new BindCompanyAccount(); + BeanUtils.copyProperties(bindCompanyAccountDTO, bindCompanyAccount); + OpenClient client = allinpayConfig.getClient(); + bindCompanyAccount.setAccountNo(client.encrypt(bindCompanyAccountDTO.getAccountNo())); + bindCompanyAccount.setBizUserId(bizUserId); + allinpayMemberService.bindCompanyAccount(bindCompanyAccount); + // 保存到数据库 + ShopBankCardVO shopBankCardVO = getShopBankCardVO(bindCompanyAccountDTO, companyName); + if (bizUserId.contains(AllinpayConstant.SHOP)) { + shopBankCardFeignClient.saveBandCardByAllinpay(bizUserId, shopBankCardVO); + } else if (bizUserId.contains(AllinpayConstant.SUPPLIER)) { + SupplierBankCardVO supplierBankCardVO = new SupplierBankCardVO(); + BeanUtils.copyProperties(shopBankCardVO, supplierBankCardVO); + supplierBankCardFeignClient.saveBandCardByAllinpay(bizUserId, supplierBankCardVO); + } + } + + private static ShopBankCardVO getShopBankCardVO(BindCompanyAccountDTO bindCompanyAccountDTO, String companyName) { + ShopBankCardVO shopBankCardVO = new ShopBankCardVO(); + shopBankCardVO.setBankName(bindCompanyAccountDTO.getParentBankName()); + shopBankCardVO.setRecipientName(companyName); + shopBankCardVO.setCardNo(bindCompanyAccountDTO.getAccountNo()); + shopBankCardVO.setOpeningBank(bindCompanyAccountDTO.getParentBankName()); + shopBankCardVO.setBranchName(bindCompanyAccountDTO.getBankName()); + shopBankCardVO.setUnionBank(bindCompanyAccountDTO.getUnionBank()); + shopBankCardVO.setBankCardNo(bindCompanyAccountDTO.getAccountNo()); + shopBankCardVO.setBankCardPro(1); + return shopBankCardVO; + } + + @Override + public void deleteCache(String tenantId) { + RedisUtil.del(PaymentCacheNames.COMPANY_INFO + CacheNames.UNION + tenantId); + } + + @Override + public String signAcctProtocol(String bizUserId, String backUrl, SignAcctProtocolDTO signAcctProtocolDTO) { + if (Objects.isNull(signAcctProtocolDTO.getJumpUrl()) || Objects.isNull(signAcctProtocolDTO.getNoContractUrl())) { + throw new LuckException("跳转地址不能为空"); + } + // 企业会员账户提现协议签约前须完成设置企业信息,且企业信息审核成功。 + CompanyInfo companyInfo = getCompanyInfo(bizUserId); + if (Objects.isNull(companyInfo) || !Objects.equals(companyInfo.getStatus(), AuditStatus.SUCCESS.getCode())) { + throw new LuckException("企业会员尚未通过审核,无法进行签约"); + } + if (Objects.isNull(companyInfo.getPhone())) { + throw new LuckException("尚未绑定手机号码,无法进行签约"); + } + if (Objects.equals(signAcctProtocolDTO.getSignAcctType(), SignAcctType.LEGAL_PERSON.getValue())) { + // 个人会员账户提现协议签约前须绑定银行卡成功。 + List bindCards = queryBankCard(bizUserId, null); + long bindCount = bindCards.stream().filter(card -> Objects.equals(card.getBankCardPro(), 0) && Objects.equals(card.getBindState(), 1)).count(); + if (bindCount < 1) { + throw new LuckException("当前未绑定法人银行卡,请进行绑定"); + } + } + SignAcctProtocol signAcctProtocol = new SignAcctProtocol(); + BeanUtils.copyProperties(signAcctProtocolDTO, signAcctProtocol); + signAcctProtocol.setSignAcctName(Objects.equals(signAcctProtocolDTO.getSignAcctType(), 2) ? companyInfo.getLegalName() : companyInfo.getCompanyName()); + signAcctProtocol.setBizUserId(bizUserId); + signAcctProtocol.setBackUrl(backUrl); + signAcctProtocol.setSource(VisitSourceType.PC.value()); + return allinpayMemberService.signAcctProtocol(signAcctProtocol); + } + + @Override + public String signContractQuery(String bizUserId, SignAcctProtocolDTO signAcctProtocolDTO) { + SignContractQuery signContractQuery = new SignContractQuery(); + BeanUtils.copyProperties(signAcctProtocolDTO, signContractQuery); + signContractQuery.setBizUserId(bizUserId); + signContractQuery.setSource(VisitSourceType.PC.value()); + return allinpayMemberService.signContractQuery(signContractQuery); + } + + @Override + public Integer getIdCardStatus(Integer ocrRegnumComparisonResult, Integer ocrIdcardComparisonResult) { + if (Objects.isNull(ocrRegnumComparisonResult) && Objects.isNull(ocrIdcardComparisonResult)) { + return IdCardCollectProcessStatus.UN_COMMITTED.value(); + } + boolean companySuccess = Objects.equals(ocrRegnumComparisonResult, 1); + boolean idCardSuccess = Objects.equals(ocrIdcardComparisonResult, 1); + Integer status; + if (companySuccess && idCardSuccess) { + status = IdCardCollectProcessStatus.ALL.value(); + } else if (!companySuccess && !idCardSuccess) { + status = IdCardCollectProcessStatus.WAIT_AUDIT.value(); + } else if (companySuccess) { + status = IdCardCollectProcessStatus.REG.value(); + } else { + status = IdCardCollectProcessStatus.ID_CARD.value(); + } + return status; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/PayInfoServiceImpl.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/PayInfoServiceImpl.java new file mode 100644 index 0000000..b2e5ee7 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/PayInfoServiceImpl.java @@ -0,0 +1,854 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopWalletFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopWalletLogFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.order.constant.FinanceType; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderRefundFeignClient; +import com.tmerclub.cloud.api.order.vo.*; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.vo.AccountDetailVO; +import com.tmerclub.cloud.api.payment.vo.ShopAccountDetailVO; +import com.tmerclub.cloud.api.payment.vo.SplitRuleVO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.bo.BuyVipNotifyBO; +import com.tmerclub.cloud.api.user.bo.RechargeNotifyBO; +import com.tmerclub.cloud.api.user.bo.UserScoreBO; +import com.tmerclub.cloud.api.user.feign.UserBalanceLogFeignClient; +import com.tmerclub.cloud.api.user.feign.UserLevelLogFeignClient; +import com.tmerclub.cloud.api.user.vo.UserPayInfoVO; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.payment.bo.PayInfoBO; +import com.tmerclub.cloud.payment.bo.PayInfoResultBO; +import com.tmerclub.cloud.payment.constant.DistributedIdKey; +import com.tmerclub.cloud.payment.constant.PayEntry; +import com.tmerclub.cloud.payment.constant.PayStatus; +import com.tmerclub.cloud.payment.dto.AccountSearchDTO; +import com.tmerclub.cloud.payment.dto.BuyVipPayInfoDTO; +import com.tmerclub.cloud.payment.dto.PayInfoDTO; +import com.tmerclub.cloud.payment.dto.RechargePayInfoDTO; +import com.tmerclub.cloud.payment.manager.AllinpayManager; +import com.tmerclub.cloud.payment.mapper.PayInfoMapper; +import com.tmerclub.cloud.payment.model.PayInfo; +import com.tmerclub.cloud.payment.service.PayInfoService; +import com.tmerclub.cloud.payment.vo.PayInfoExcelVO; +import com.tmerclub.cloud.payment.vo.PayInfoVO; +import io.seata.spring.annotation.GlobalTransactional; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.client.producer.TransactionSendResult; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单支付记录 + * + * @author FrozenWatermelon + * @date 2020-12-25 09:50:59 + */ +@Service +public class PayInfoServiceImpl implements PayInfoService { + private static final Logger log = LoggerFactory.getLogger(PayInfoServiceImpl.class); + + @Autowired + private PayInfoMapper payInfoMapper; + @Autowired + private SegmentManager segmentManager; + @Autowired + private AllinpayManager allinpayManager; + @Autowired + private RocketMQTemplate userScoreTemplate; + @Autowired + private RocketMQTemplate orderNotifyTemplate; + @Autowired + private RocketMQTemplate buyVipNotifyTemplate; + @Autowired + private RocketMQTemplate orderSettledShopTemplate; + @Autowired + private RocketMQTemplate userRechargeNotifyTemplate; + @Autowired + private RocketMQTemplate shopRechargeNotifyTemplate; + @Autowired + private RocketMQTemplate shopBalancePaySuccessTemplate; + @DubboReference + private OrderFeignClient orderFeignClient; + @DubboReference + private UserBalanceLogFeignClient userBalanceLogFeignClient; + @DubboReference + private ShopWalletLogFeignClient shopWalletLogFeignClient; + @DubboReference + private UserLevelLogFeignClient userLevelLogFeignClient; + @DubboReference + private OrderRefundFeignClient orderRefundFeignClient; + @DubboReference + private ShopWalletFeignClient shopWalletFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private ConfigFeignClient configFeignClient; + + + @Override + @Transactional(rollbackFor = Exception.class) + public PayInfoBO pay(Long userId, PayInfoDTO payParam, String bizUserId) { + List orderIds = payParam.getOrderIds(); + ServerResponseEntity ordersAmountAndIfNoCancelResponse = orderFeignClient.getOrdersAmountAndIfNoCancel(orderIds,userId); + // 如果订单已经关闭了,此时不能够支付了 + if (!ordersAmountAndIfNoCancelResponse.isSuccess()) { + throw new LuckException(ordersAmountAndIfNoCancelResponse.getMsg()); + } + OrderAmountVO orderAmount = ordersAmountAndIfNoCancelResponse.getData(); + // 支付单号 + Long payId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_PAY, userId); + + //如果金额小于0.01 支付积分大于0则为纯积分支付 + checkAmount(payParam, orderAmount); + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payId); + payInfo.setUserId(userId); + payInfo.setRefundId(0L); + payInfo.setPayStatus(PayStatus.UNPAY.value()); + payInfo.setPayAmount(orderAmount.getPayAmount()); + payInfo.setPayEntry(PayEntry.ORDER.value()); + payInfo.setPayScore(orderAmount.getPayScore()); + payInfo.setVersion(0); + payInfo.setPayType(payParam.getPayType()); + payInfo.setSysType(AuthUserContext.get().getSysType()); + payInfo.setPaySysType(configFeignClient.getPaySysType().getData()); + payInfo.setSystemModel(payParam.getSystemModel()); + // 保存多个支付订单号 + payInfo.setOrderIds(StrUtil.join(StrUtil.COMMA, orderIds)); + payInfo.setBizUserId(bizUserId); + // 保存预支付信息 + payInfoMapper.save(payInfo); + PayInfoBO payInfoBo = new PayInfoBO(); + payInfoBo.setBody("商城支付订单"); + payInfoBo.setPayAmount(orderAmount.getPayAmount()); + payInfoBo.setPayId(payId); + payInfoBo.setOrderIds(payInfo.getOrderIds()); + for (ShopAmountVO shopAmountVO : orderAmount.getShopAmountList()) { + shopAmountVO.setBizUserId(AllinpayConstant.SHOP + shopAmountVO.getBizUserId()); + } + payInfoBo.setReceiveList(orderAmount.getShopAmountList()); + return payInfoBo; + } + + private static void checkAmount(PayInfoDTO payParam, OrderAmountVO orderAmount) { + if (orderAmount.getPayAmount() < 1 && orderAmount.getPayScore() > 0 && !Objects.equals(PayType.SCOREPAY.value(), payParam.getPayType())) { + throw new LuckException("订单金额有误,无法进行支付"); + } + // 金额小于0.01且支付方式不为积分支付 + else if (orderAmount.getPayAmount() < 1 && !Objects.equals(PayType.SCOREPAY.value(), payParam.getPayType())) { + throw new LuckException("订单金额有误,无法进行支付"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public PayInfoBO payPreSaleBalance(Long userId, PayInfoDTO payParam) { + // 支付单号 + Long payId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_PAY, userId); + + List orderIds = payParam.getOrderIds(); + ServerResponseEntity ordersAmountAndIfNoCancelResponse = orderFeignClient.getOrdersAmountAndCheckOrderStatus(orderIds); + // 如果订单不是代付尾款状态,此时不能够支付了 + if (!ordersAmountAndIfNoCancelResponse.isSuccess()) { + throw new LuckException(ordersAmountAndIfNoCancelResponse.getMsg()); + } + OrderAmountVO orderAmount = ordersAmountAndIfNoCancelResponse.getData(); + //如果金额小于0.01 支付积分大于0则为纯积分支付 + checkAmount(payParam, orderAmount); + PayInfo payInfo = new PayInfo(); + payInfo.setUserId(userId); + payInfo.setRefundId(0L); + payInfo.setPayId(payId); + payInfo.setPayStatus(PayStatus.UNPAY.value()); + payInfo.setPayAmount(orderAmount.getPayAmount()); + payInfo.setPayScore(orderAmount.getPayScore()); + payInfo.setPayType(payParam.getPayType()); + payInfo.setSysType(AuthUserContext.get().getSysType()); + payInfo.setPayEntry(PayEntry.ORDER.value()); + payInfo.setVersion(0); + payInfo.setSystemModel(payParam.getSystemModel()); + // 保存多个支付订单号 + payInfo.setOrderIds(StrUtil.join(StrUtil.COMMA, orderIds)); + + // 保存预支付信息 + payInfoMapper.save(payInfo); + PayInfoBO payInfoBo = new PayInfoBO(); + payInfoBo.setBody("商城支付订单"); + payInfoBo.setPayAmount(orderAmount.getPayAmount()); + payInfoBo.setPayId(payId); + for (ShopAmountVO shopAmountVO : orderAmount.getShopAmountList()) { + shopAmountVO.setBizUserId(AllinpayConstant.SHOP + shopAmountVO.getBizUserId()); + } + payInfoBo.setReceiveList(orderAmount.getShopAmountList()); + return payInfoBo; + } + + @Override + public PayInfo getByPayId(Long payId) { + return payInfoMapper.getByPayId(payId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void paySuccess(PayInfoResultBO payInfoResult, PayInfo temp, List orderIds, Integer paySysType, ShopCartOrderMergerVO shopCartOrderMergerVO) { + // 标记为支付成功状态 + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payInfoResult.getPayId()); + payInfo.setBizPayNo(payInfoResult.getBizPayNo()); + payInfo.setCallbackTime(new Date()); + payInfo.setCallbackContent(payInfoResult.getCallbackContent()); + payInfo.setPayStatus(PayStatus.PAYED.value()); + payInfo.setPaySysType(paySysType); + int updateStatus = payInfoMapper.updateToSuccess(payInfo); + // 不能重复支付 + if (updateStatus == 0) { + throw new LuckException("支付状态错误,更新失败"); + } + // 发送消息,订单支付成功 + SendStatus sendStatus = orderNotifyTemplate.syncSend(RocketMqConstant.ORDER_NOTIFY_TOPIC, new GenericMessage<>(new PayNotifyBO(orderIds, Objects.requireNonNull(PayType.instance(temp.getPayType())).value(), payInfo.getPayId(), paySysType,shopCartOrderMergerVO))).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + UserScoreBO userScoreBo = new UserScoreBO(); + userScoreBo.setUserId(temp.getUserId()); + userScoreBo.setPayType(payInfo.getPayType()); + userScoreBo.setOrderIds(orderIds); + userScoreBo.setUnLock(true); + SendStatus userScoreSendStatus = userScoreTemplate.syncSend(RocketMqConstant.SCORE_UNLOCK_TOPIC, new GenericMessage<>(userScoreBo)).getSendStatus(); + if (!Objects.equals(userScoreSendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public Integer getPayStatusByOrderIds(String orderIds) { + return payInfoMapper.getPayStatusByOrderIds(orderIds); + } + + @Override + public Integer isPay(String orderIds, Long userId, Integer payEntry, Integer payAmountType) { + Integer sysType = AuthUserContext.get().getSysType(); + String[] orderIdList = orderIds.split(StrUtil.COMMA); + ServerResponseEntity orderResp = orderFeignClient.getEsOrder(Long.valueOf(orderIdList[0])); + if (!orderResp.isSuccess()) { + throw new LuckException(orderResp.getMsg()); + } + if (Objects.nonNull(orderResp.getData())) { + EsOrderBO esOrderBO = orderResp.getData(); + // 如果是定金支付,判断一下 + if (Objects.equals(esOrderBO.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + if (Objects.equals(esOrderBO.getStatus(), OrderStatus.WAIT_BALANCE.value()) && Objects.equals(payAmountType, 0)) { + return 1; + } + if (Objects.equals(esOrderBO.getStatus(), OrderStatus.PAYED.value()) && Objects.equals(payAmountType, 1)) { + return 1; + } + return 0; + } + } + return payInfoMapper.isPay(orderIds, userId, sysType, payEntry); + } + + @Override + public void markerRefund(Long payId) { + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payId); + payInfo.setPayStatus(PayStatus.REFUND.value()); + payInfoMapper.update(payInfo); + } + + @Override + public void update(PayInfo payInfo) { + payInfoMapper.update(payInfo); + } + + @Override + public List listByOrderIds(List orderIds) { + return payInfoMapper.listByOrderIds(orderIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public PayInfoBO recharge(Long userId, RechargePayInfoDTO payParam) { + + // 支付单号 + Long payId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_PAY, userId); + Long rechargeLogId; + + boolean isShopUser = false; + // 充值信息 + ServerResponseEntity payAmountResponse; + if (Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.MULTISHOP.value())) { + if (Objects.isNull(payParam.getShopWalletLogId())) { + throw new LuckException("请求参数错误"); + } + isShopUser = true; + rechargeLogId = payParam.getShopWalletLogId(); + payAmountResponse = shopWalletLogFeignClient.getPayAmount(rechargeLogId); + } else if (Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.ORDINARY.value())) { + if (Objects.isNull(payParam.getBalanceLogId())) { + throw new LuckException("请求参数错误"); + } + rechargeLogId = payParam.getBalanceLogId(); + payAmountResponse = userBalanceLogFeignClient.getPayAmount(rechargeLogId); + } else { + throw new LuckException("你没有权限进行此操作"); + } + + if (!payAmountResponse.isSuccess()) { + throw new LuckException(payAmountResponse.getMsg()); + } + Long payAmount = payAmountResponse.getData(); + if (payAmount == null || payAmount < 1) { + throw new LuckException("充值金额有误"); + } + + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payId); + payInfo.setUserId(userId); + payInfo.setRefundId(0L); + payInfo.setPayScore(0L); + payInfo.setPayAmount(payAmount); + payInfo.setPayStatus(PayStatus.UNPAY.value()); + payInfo.setSysType(AuthUserContext.get().getSysType()); + payInfo.setPayType(payParam.getPayType()); + payInfo.setPayEntry(PayEntry.RECHARGE.value()); + payInfo.setPaySysType(PaySysType.DEFAULT.value()); + payInfo.setVersion(0); + // 充值id + payInfo.setOrderIds(String.valueOf(rechargeLogId)); + + // 保存预支付信息 + payInfoMapper.save(payInfo); + + PayInfoBO payInfoDto = new PayInfoBO(); + payInfoDto.setPayId(payId); + payInfoDto.setPayAmount(payAmount); + payInfoDto.setBody(isShopUser ? "商家余额充值订单" : "商城余额充值订单"); + payInfoDto.setRecharge(true); + payInfoDto.setPaySysType(PaySysType.DEFAULT.value()); + payInfoDto.setOrderIds(String.valueOf(rechargeLogId)); + payInfoDto.setValidateType(payParam.getValidateType()); + return payInfoDto; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void rechargeSuccess(PayInfoResultBO payInfoResult, PayType payType, Long rechargeLogId, Integer sysType) { + // 标记为支付成功状态 + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payInfoResult.getPayId()); + payInfo.setBizPayNo(payInfoResult.getBizPayNo()); + payInfo.setCallbackTime(new Date()); + payInfo.setCallbackContent(payInfoResult.getCallbackContent()); + payInfo.setPayStatus(PayStatus.PAYED.value()); + int updateStatus = payInfoMapper.updateToSuccess(payInfo); + // 不能重复支付 + if (updateStatus == 0) { + throw new LuckException("支付状态错误,更新失败"); + } + SendStatus sendStatus; + // 发送消息,订单支付成功 + if (Objects.equals(sysType, SysTypeEnum.MULTISHOP.value())) { + sendStatus = shopRechargeNotifyTemplate.syncSend(RocketMqConstant.SHOP_RECHARGE_NOTIFY_TOPIC, new GenericMessage<>(new RechargeNotifyBO(rechargeLogId, payType.value(), payInfo.getPayId()))).getSendStatus(); + } else if (Objects.equals(sysType, SysTypeEnum.ORDINARY.value())) { + sendStatus = userRechargeNotifyTemplate.syncSend(RocketMqConstant.USER_RECHARGE_NOTIFY_TOPIC, new GenericMessage<>(new RechargeNotifyBO(rechargeLogId, payType.value(), payInfo.getPayId()))).getSendStatus(); + } else { + return; + } + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void payShopBalanceSuccess(PayInfoResultBO payInfoResult, Long orderId) { + // 标记为支付成功状态 + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payInfoResult.getPayId()); + payInfo.setPayStatus(PayStatus.PAYED.value()); + payInfo.setBizPayNo(payInfoResult.getBizPayNo()); + payInfo.setCallbackContent(payInfoResult.getCallbackContent()); + payInfo.setCallbackTime(new Date()); + int updateStatus = payInfoMapper.updateToSuccess(payInfo); + // 不能重复支付 + if (updateStatus == 0) { + throw new LuckException("支付状态错误,更新失败"); + } + // 发送消息,余额支付成功,通知修改订单为已采购状态及后续操作 + SendStatus sendStatus = shopBalancePaySuccessTemplate.syncSend(RocketMqConstant.SHOP_BALANCE_PAY_SUCCESS_TOPIC, new GenericMessage<>(orderId)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public PayInfoBO vipBuy(Long userId, BuyVipPayInfoDTO payParam) { + // 支付单号 + Long payId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_PAY, userId); + Long userLevelLogId = payParam.getUserLevelLogId(); + + // 充值信息 + ServerResponseEntity payAmountResponse = userLevelLogFeignClient.getPayAmount(userLevelLogId); + if (!payAmountResponse.isSuccess()) { + throw new LuckException(payAmountResponse.getMsg()); + } + Long payAmount = payAmountResponse.getData(); + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payId); + payInfo.setRefundId(0L); + payInfo.setUserId(userId); + payInfo.setPayScore(0L); + payInfo.setPayAmount(payAmount); + payInfo.setPayStatus(PayStatus.UNPAY.value()); + payInfo.setSysType(AuthUserContext.get().getSysType()); + payInfo.setPayType(payParam.getPayType()); + payInfo.setPaySysType(payParam.getPaySysType()); + payInfo.setPayEntry(PayEntry.VIP.value()); + payInfo.setVersion(0); + // 充值id + payInfo.setOrderIds(String.valueOf(userLevelLogId)); + + + // 保存预支付信息 + payInfoMapper.save(payInfo); + PayInfoBO payInfoDto = new PayInfoBO(); + BeanUtils.copyProperties(payInfo, payInfoDto); + payInfoDto.setBody("商城VIP订购订单"); + payInfoDto.setSystemType(payParam.getSystemType()); + payInfoDto.setValidateType(payParam.getValidateType()); + return payInfoDto; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void buyVipSuccess(PayInfoResultBO payInfoResult, PayType payType, Long userLevelLogId) { + // 标记为支付成功状态 + PayInfo payInfo = new PayInfo(); + payInfo.setBizPayNo(payInfoResult.getBizPayNo()); + payInfo.setCallbackTime(new Date()); + payInfo.setPayId(payInfoResult.getPayId()); + payInfo.setCallbackContent(payInfoResult.getCallbackContent()); + payInfo.setPayStatus(PayStatus.PAYED.value()); + int updateStatus = payInfoMapper.updateToSuccess(payInfo); + // 不能重复支付 + if (updateStatus == 0) { + throw new LuckException("支付状态错误,更新失败"); + } + // 通联余额支付,更新用户余额记录 + if (Objects.equals(PaySysType.ALLINPAY.value(), payInfoResult.getPaySysType()) + && payType.equals(PayType.BALANCE)) { + ServerResponseEntity response = userBalanceLogFeignClient.updateToOrderPaySuccess(payInfo.getPayId()); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + // 发送消息,订单支付成功 + SendStatus sendStatus = buyVipNotifyTemplate.syncSend(RocketMqConstant.BUY_VIP_NOTIFY_TOPIC, new GenericMessage<>(new BuyVipNotifyBO(userLevelLogId, payType.value(), payInfo.getPayId()))).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public AccountDetailVO getIncomeAccountDetail(Date startTime, Date endTime, String shopName) { + ServerResponseEntity orderResponse = orderFeignClient.getAccountOrderDetail(startTime, endTime, shopName, null); + if (!orderResponse.isSuccess()) { + throw new LuckException(orderResponse.getMsg()); + } + ServerResponseEntity userResponse = userBalanceLogFeignClient.getPlatformAccountDetail(startTime, endTime); + if (!userResponse.isSuccess()) { + throw new LuckException(userResponse.getMsg()); + } + ShopAccountDetailVO platformAccountInfo = userResponse.getData(); + AccountDetailVO accountDetailVO = BeanUtil.map(orderResponse.getData(), AccountDetailVO.class); + + if (Objects.isNull(accountDetailVO)) { + accountDetailVO = new AccountDetailVO(); + + } + accountDetailVO.setAlipayAmount((Objects.isNull(platformAccountInfo.getAlipayAmount()) ? 0L : platformAccountInfo.getAlipayAmount()) + (Objects.isNull(accountDetailVO.getAlipayAmount()) ? 0L : accountDetailVO.getAlipayAmount())); + + accountDetailVO.setBalanceAmount((Objects.isNull(platformAccountInfo.getBalanceAmount()) ? 0L : platformAccountInfo.getBalanceAmount()) + (Objects.isNull(accountDetailVO.getBalanceAmount()) ? 0L : accountDetailVO.getBalanceAmount())); + accountDetailVO.setWechatAmount((Objects.isNull(platformAccountInfo.getWechatAmount()) ? 0L : platformAccountInfo.getWechatAmount()) + (Objects.isNull(accountDetailVO.getWechatAmount()) ? 0L : accountDetailVO.getWechatAmount())); +// accountDetailVO.setAlipayAmount((Objects.isNull(platformAccountInfo.getAlipayAmount()) ? 0L : platformAccountInfo.getAlipayAmount()) + (Objects.isNull(accountDetailVO.getAlipayAmount()) ? 0L : accountDetailVO.getAlipayAmount())); + + accountDetailVO.setScoreCount((Objects.isNull(platformAccountInfo.getScoreCount()) ? 0L : platformAccountInfo.getScoreCount()) + (Objects.isNull(accountDetailVO.getScoreCount()) ? 0L : accountDetailVO.getScoreCount())); + + accountDetailVO.setWechatPercent(0.00); + accountDetailVO.setAlipayPercent(0.00); + accountDetailVO.setBalancePercent(0.00); + accountDetailVO.setTotal(0L); + getTotal(accountDetailVO); + return accountDetailVO; + } + + @Override + public AccountDetailVO getPlatformIncomeAccountDetail(Date startTime, Date endTime) { + // 获取平台信息 + ServerResponseEntity userResponse = userBalanceLogFeignClient.getPlatformAccountDetail(startTime, endTime); + if (!userResponse.isSuccess()) { + throw new LuckException(userResponse.getMsg()); + } + ShopAccountDetailVO platformAccountInfo = userResponse.getData(); + ServerResponseEntity platformOrderResponse = orderFeignClient.getAccountOrderDetail(startTime, endTime, "", Constant.PLATFORM_SHOP_ID); + if (!platformOrderResponse.isSuccess()) { + throw new LuckException(platformOrderResponse.getMsg()); + } + AccountOrderDetailVO accountOrderDetailVO = platformOrderResponse.getData(); + AccountDetailVO platformAccountDetail = new AccountDetailVO(); + platformAccountDetail.setAlipayAmount((Objects.isNull(platformAccountInfo.getAlipayAmount()) ? 0L : platformAccountInfo.getAlipayAmount()) + (Objects.isNull(accountOrderDetailVO.getAlipayAmount()) ? 0L : accountOrderDetailVO.getAlipayAmount())); + platformAccountDetail.setWechatAmount((Objects.isNull(platformAccountInfo.getWechatAmount()) ? 0L : platformAccountInfo.getWechatAmount()) + (Objects.isNull(accountOrderDetailVO.getWechatAmount()) ? 0L : accountOrderDetailVO.getWechatAmount())); + platformAccountDetail.setBalanceAmount((Objects.isNull(platformAccountInfo.getBalanceAmount()) ? 0L : platformAccountInfo.getBalanceAmount()) + (Objects.isNull(accountOrderDetailVO.getBalanceAmount()) ? 0L : accountOrderDetailVO.getBalanceAmount())); + platformAccountDetail.setScoreCount((Objects.isNull(platformAccountInfo.getScoreCount()) ? 0L : platformAccountInfo.getScoreCount()) + (Objects.isNull(accountOrderDetailVO.getScoreCount()) ? 0L : accountOrderDetailVO.getScoreCount())); + platformAccountDetail.setTotal(platformAccountDetail.getAlipayAmount() + platformAccountDetail.getBalanceAmount() + platformAccountDetail.getWechatAmount()); + return platformAccountDetail; + } + + private void getTotal(AccountDetailVO accountDetailVO) { + Long wechatAmount = Objects.isNull(accountDetailVO.getWechatAmount()) ? 0L : accountDetailVO.getWechatAmount(); + Long balanceAmount = Objects.isNull(accountDetailVO.getBalanceAmount()) ? 0L : accountDetailVO.getBalanceAmount(); + Long alipayAmount = Objects.isNull(accountDetailVO.getAlipayAmount()) ? 0L : accountDetailVO.getAlipayAmount(); + long total = wechatAmount + alipayAmount + balanceAmount; + accountDetailVO.setWechatPercent(Arith.div(wechatAmount.doubleValue(), total, 4)); + accountDetailVO.setAlipayPercent(Arith.div(alipayAmount.doubleValue(), total, 4)); + accountDetailVO.setBalancePercent(Arith.div(balanceAmount.doubleValue(), total, 4)); + accountDetailVO.setTotal(total); + } + + @Override + public PageVO getPayInfoPage(PageDTO pageDTO, AccountSearchDTO accountSearchDTO) { + PageVO pageVO = new PageVO<>(); + if (Objects.equals(accountSearchDTO.getFinanceType(), FinanceType.RECHARGE.value()) || Objects.equals(accountSearchDTO.getFinanceType(), FinanceType.LEVEL.value())) { + ServerResponseEntity> userResponse = userBalanceLogFeignClient.pageUserPayInfo(accountSearchDTO.getStartTime(), accountSearchDTO.getEndTime(), accountSearchDTO.getFinanceType(), pageDTO.getPageSize(), pageDTO.getPageNum()); + if (!userResponse.isSuccess()) { + throw new LuckException(userResponse.getMsg()); + } + PageVO userResponseData = userResponse.getData(); + pageVO.setPages(userResponseData.getPages()); + pageVO.setTotal(userResponseData.getTotal()); + pageVO.setList(BeanUtil.mapAsList(userResponseData.getList(), PayInfoVO.class)); + } else { + ServerResponseEntity orderResponse = orderFeignClient.listOrderPayInfo(accountSearchDTO.getStartTime(), accountSearchDTO.getEndTime(), accountSearchDTO.getShopId(), null, pageDTO.getPageSize(), pageDTO.getPageNum()); + if (!orderResponse.isSuccess()) { + throw new LuckException(orderResponse.getMsg()); + } + pageVO.setTotal(orderResponse.getData().getTotal()); + pageVO.setList(BeanUtil.mapAsList(orderResponse.getData().getPayInfoList(), PayInfoVO.class)); + pageVO.setPages(PageUtil.getPages(orderResponse.getData().getTotal(), pageDTO.getPageSize())); + } + if (CollectionUtils.isEmpty(pageVO.getList())) { + return pageVO; + } + // 查询店铺信息 + Set shopIds = pageVO.getList().stream().map(PayInfoVO::getShopId).collect(Collectors.toSet()); + List shops = shopDetailFeignClient.listByShopIds(new ArrayList<>(shopIds)).getData(); + Map shopNameMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(shops)) { + shopNameMap = shops.stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName)); + } + // 补充信息 + String shopName; + for (PayInfoVO payInfoVO : pageVO.getList()) { + if (!ObjectUtils.isEmpty(shopName = shopNameMap.get(payInfoVO.getShopId()))) { + payInfoVO.setShopName(shopName); + } + } + return pageVO; + } + + @Override + public void excelPayInfo(HttpServletResponse response, AccountSearchDTO accountSearchDTO) { + accountSearchDTO.setFinanceType(FinanceType.ORDER.value()); + ServerResponseEntity orderResponse = orderFeignClient.listOrderPayInfo(accountSearchDTO.getStartTime(), accountSearchDTO.getEndTime(), null, accountSearchDTO.getShopName(), null, null); + if (!orderResponse.isSuccess()) { + throw new LuckException(orderResponse.getMsg()); + } + List orderPayInfoList = BeanUtil.mapAsList(orderResponse.getData().getPayInfoList(), PayInfoVO.class); + accountSearchDTO.setFinanceType(FinanceType.RECHARGE.value()); + ServerResponseEntity> balanceResponse = userBalanceLogFeignClient.listUserPayInfo(accountSearchDTO.getStartTime(), accountSearchDTO.getEndTime(), accountSearchDTO.getFinanceType()); + if (!balanceResponse.isSuccess()) { + throw new LuckException(balanceResponse.getMsg()); + } + accountSearchDTO.setFinanceType(FinanceType.LEVEL.value()); + ServerResponseEntity> levelResponse = userBalanceLogFeignClient.listUserPayInfo(accountSearchDTO.getStartTime(), accountSearchDTO.getEndTime(), accountSearchDTO.getFinanceType()); + if (!levelResponse.isSuccess()) { + throw new LuckException(levelResponse.getMsg()); + } + List rechargePayInfoList = BeanUtil.mapAsList(balanceResponse.getData(), PayInfoVO.class); + List levelPayInfoList = BeanUtil.mapAsList(levelResponse.getData(), PayInfoVO.class); + + Map map = new HashMap<>(8); + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + ExcelWriterBuilder excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, PayInfoExcelVO.EXCEL_NAME, PayInfoExcelVO.MERGE_ROW_INDEX, PayInfoExcelVO.MERGE_COLUMN_INDEX); + excelWriter = ExcelUtil.getExcelModel(excelWriterMerge, map, Constant.START_ROW).build(); + // 业务代码 + writeExcel(orderPayInfoList, FinanceType.ORDER.str(), excelWriter, FinanceType.ORDER.value()); + // 余额充值 + writeExcel(rechargePayInfoList, FinanceType.RECHARGE.str(), excelWriter, FinanceType.RECHARGE.value()); + // 会员购买 + writeExcel(levelPayInfoList, FinanceType.LEVEL.str(), excelWriter, FinanceType.LEVEL.value()); + } catch (Exception e) { + log.error("导出财务对账收入报表出错", e); + } finally { + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + private Set getExcelColumn(Integer financeType) { + Set column = new HashSet<>(Constant.INITIAL_CAPACITY); + if (Objects.equals(financeType, FinanceType.RECHARGE.value())) { + // 余额充值没有支付积分和余额金额和店铺名称 + column.add("payScore"); + column.add("balanceAmount"); + column.add("shopName"); + } + if (Objects.equals(financeType, FinanceType.LEVEL.value())) { + // 会员购买没有支付积分和店铺名称 + column.add("payScore"); + column.add("shopName"); + } + return column; + } + + private void writeExcel(List payInfoList, String type, ExcelWriter excelWriter, Integer financeType) { + Set excelColumn = getExcelColumn(financeType); + List payInfoExcelList = getExcelList(payInfoList); + if (CollUtil.isNotEmpty(payInfoExcelList)) { + payInfoExcelList.add(new PayInfoExcelVO()); + } + WriteSheet sheetWriter = EasyExcel.writerSheet(type).sheetNo(financeType).head(PayInfoExcelVO.class).excludeColumnFieldNames(excelColumn).build(); + excelWriter.write(payInfoExcelList, sheetWriter); + } + + private List getExcelList(List payInfoList) { + List payInfoExcelList = new ArrayList<>(Constant.INITIAL_CAPACITY); + int index = 1; + for (PayInfoVO payInfoVO : payInfoList) { + PayInfoExcelVO payInfoExcelVO = new PayInfoExcelVO(); + payInfoExcelVO.setSeq(String.valueOf(index)); + payInfoExcelVO.setShopName(payInfoVO.getShopName()); + payInfoExcelVO.setPayId(payInfoVO.getPayId()); + payInfoExcelVO.setOrderIds(payInfoVO.getOrderIds()); + payInfoExcelVO.setPayEntry(PayEntry.getPayTypeName(payInfoVO.getPayEntry())); + payInfoExcelVO.setPayType(PayType.getPayTypeName(payInfoVO.getPayType())); + payInfoExcelVO.setPayScore(Objects.isNull(payInfoVO.getScoreCount()) ? "0" : payInfoVO.getScoreCount().toString()); + payInfoExcelVO.setAlipayAmount(PriceUtil.toDecimalPrice(payInfoVO.getAlipayAmount()).toString()); + payInfoExcelVO.setBalanceAmount(PriceUtil.toDecimalPrice(payInfoVO.getBalanceAmount()).toString()); + payInfoExcelVO.setWechatAmount(PriceUtil.toDecimalPrice(payInfoVO.getWechatAmount()).toString()); + payInfoExcelVO.setPayTime(payInfoVO.getPayTime()); + payInfoExcelList.add(payInfoExcelVO); + index++; + } + return payInfoExcelList; + } + + @Override + public PageVO pageIncomeAccountDetail(PageDTO pageDTO, AccountSearchDTO accountSearchDTO) { + // 获取店铺信息 + ServerResponseEntity orderResponse = orderFeignClient.listShopAccountDetail(accountSearchDTO.getStartTime(), accountSearchDTO.getEndTime(), accountSearchDTO.getShopName(), pageDTO.getPageSize(), pageDTO.getPageNum()); + if (!orderResponse.isSuccess()) { + throw new LuckException(orderResponse.getMsg()); + } + PageShopAccountOrderVO data = orderResponse.getData(); + List shopList = data.getShopList(); + List result = BeanUtil.mapAsList(shopList, ShopAccountDetailVO.class); + PageVO shopPage = new PageVO<>(); + shopPage.setTotal(data.getTotal()); + shopPage.setList(result); + shopPage.setPages(PageUtil.getPages(data.getTotal(), pageDTO.getPageSize())); + if (CollectionUtils.isEmpty(result)) { + return shopPage; + } + // 查询店铺信息 + List shopIds = result.stream().map(ShopAccountDetailVO::getShopId).toList(); + List shops = shopDetailFeignClient.listByShopIds(shopIds).getData(); + Map shopNameMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(shops)) { + shopNameMap = shops.stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName)); + } + // 补充信息 + String shopName; + for (ShopAccountDetailVO shopAccountDetailVO: result) { + if (!ObjectUtils.isEmpty(shopName = shopNameMap.get(shopAccountDetailVO.getShopId()))) { + shopAccountDetailVO.setShopName(shopName); + } + } + return shopPage; + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void noticeShopBalancePayRefundSpread(PayInfoResultBO payInfoResultBO, Long orderId) { + // 标记为支付成功状态 + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payInfoResultBO.getPayId()); + payInfo.setBizPayNo(payInfoResultBO.getBizPayNo()); + payInfo.setCallbackContent(payInfoResultBO.getCallbackContent()); + payInfo.setCallbackTime(new Date()); + payInfo.setPayStatus(PayStatus.PAYED.value()); + int updateStatus = payInfoMapper.updateToSuccess(payInfo); + // 不能重复支付 + if (updateStatus == 0) { + throw new LuckException("支付状态错误,更新失败"); + } + ServerResponseEntity orderRefundResp = orderRefundFeignClient.getOrderRefundByRefundId(payInfoResultBO.getRefundId()); + if (!orderRefundResp.isSuccess()) { + throw new LuckException(orderRefundResp.getMsg()); + } + OrderRefundVO orderRefundVO = orderRefundResp.getData(); + // 1.执行减少商家钱包余额,并添加日志 + OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO = new OrderChangeShopWalletAmountBO(); + orderChangeShopWalletAmountBO.setOrderId(orderId); + orderChangeShopWalletAmountBO.setRefundId(orderRefundVO.getRefundId()); + orderChangeShopWalletAmountBO.setShopId(orderRefundVO.getShopId()); + orderChangeShopWalletAmountBO.setPaySysType(PaySysType.ALLINPAY.value()); + orderChangeShopWalletAmountBO.setRefundAmount(orderRefundVO.getRefundAmount()); + orderChangeShopWalletAmountBO.setActualTotal(payInfoResultBO.getPayAmount()); + shopWalletFeignClient.subSettlementAmount(orderChangeShopWalletAmountBO); + // 2.执行商家同意退款 + orderRefundFeignClient.doRefund(payInfoResultBO.getExtendInfo()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void noticeSettlementOrder(PayInfoResultBO payInfoResultBO, PayInfo payInfo) { + // 判断下是否已经结算过 + if (Objects.equals(payInfo.getPayStatus(), 1)) { + return; + } + payInfo.setPayStatus(1); + // 标记为支付成功状态 + payInfo.setPayId(payInfoResultBO.getPayId()); + payInfo.setBizPayNo(payInfoResultBO.getBizPayNo()); + payInfo.setCallbackContent(payInfoResultBO.getCallbackContent()); + payInfo.setCallbackTime(new Date()); + payInfo.setPayStatus(PayStatus.PAYED.value()); + int updateStatus = payInfoMapper.updateToSuccess(payInfo); + // 不能重复支付 + if (updateStatus == 0) { + throw new LuckException("支付状态错误,更新失败"); + } + // 1.执行订单后续结算 + OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO = new OrderChangeShopWalletAmountBO(); + orderChangeShopWalletAmountBO.setOrderId(Long.valueOf(payInfo.getOrderIds())); + orderChangeShopWalletAmountBO.setPaySysType(PaySysType.ALLINPAY.value()); + // 开启事务消息,通知订单自己,开始往各个服务发送通知了 + TransactionSendResult transactionSendResult = orderSettledShopTemplate.sendMessageInTransaction(RocketMqConstant.ORDER_SETTLED_SHOP_TOPIC, new GenericMessage<>(Collections.singletonList(orderChangeShopWalletAmountBO)), null); + + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void platformTransfer(SplitRuleVO splitRuleVO) { + PayInfo payInfo = payInfoMapper.getByOrderIdAndEntryAndToUserId(splitRuleVO.getBizUserId(), splitRuleVO.getOrderId(), PayEntry.PLATFORM_TRANSFER.value()); + if (Objects.nonNull(payInfo)) { + return; + } + PayInfo platformPayInfo = new PayInfo(); + // 支付单号 + Long payId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_PAY, Constant.PLATFORM_SHOP_ID); + platformPayInfo.setPayId(payId); + platformPayInfo.setRefundId(0L); + platformPayInfo.setUserId(0L); + platformPayInfo.setPayAmount(splitRuleVO.getAmount()); + platformPayInfo.setPayScore(0L); + platformPayInfo.setPayStatus(PayStatus.PAYED.value()); + platformPayInfo.setSysType(AuthUserContext.get().getSysType()); + platformPayInfo.setPayType(PayType.PLATFORM_BALANCE.value()); + platformPayInfo.setVersion(0); + platformPayInfo.setToUserId(splitRuleVO.getBizUserId()); + // 保存多个支付订单号 + platformPayInfo.setOrderIds(splitRuleVO.getOrderId().toString()); + platformPayInfo.setPayEntry(PayEntry.PLATFORM_TRANSFER.value()); + // 保存预支付信息 + payInfoMapper.save(platformPayInfo); + boolean flag = allinpayManager.execApplicationTransfer(payId, splitRuleVO.getBizUserId(), platformPayInfo.getPayAmount()); + if (!flag) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public List getPaySystemTypeByUserIdAndOrderId(Long userId, Long orderId) { + return payInfoMapper.getPayInfoByUserIdAndOrderId(userId, orderId); + } + + @Override + public void updateToSuccess(PayInfo payInfo) { + int updateStatus = payInfoMapper.updateToSuccess(payInfo); + // 不能重复支付 + if (updateStatus == 0) { + throw new LuckException("支付状态错误,更新失败"); + } + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/RefundInfoServiceImpl.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/RefundInfoServiceImpl.java new file mode 100644 index 0000000..34c74bb --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/RefundInfoServiceImpl.java @@ -0,0 +1,440 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.tmerclub.cloud.api.order.constant.FinanceType; +import com.tmerclub.cloud.api.order.feign.OrderRefundFeignClient; +import com.tmerclub.cloud.api.order.vo.AccountOrderDetailVO; +import com.tmerclub.cloud.api.order.vo.PageShopAccountOrderVO; +import com.tmerclub.cloud.api.order.vo.ShopAccountOrderDetailVO; +import com.tmerclub.cloud.api.payment.vo.AccountDetailVO; +import com.tmerclub.cloud.api.payment.vo.ShopAccountDetailVO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.feign.UserLevelAndScoreOrderFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.bo.PayRefundBO; +import com.tmerclub.cloud.common.order.bo.RefundNotifyBO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.payment.bo.RefundInfoBO; +import com.tmerclub.cloud.payment.constant.PayEntry; +import com.tmerclub.cloud.payment.constant.PayStatus; +import com.tmerclub.cloud.payment.constant.RefundStatus; +import com.tmerclub.cloud.payment.dto.AccountSearchDTO; +import com.tmerclub.cloud.payment.manager.AllinpayManager; +import com.tmerclub.cloud.payment.manager.PayManager; +import com.tmerclub.cloud.payment.mapper.PayInfoMapper; +import com.tmerclub.cloud.payment.mapper.RefundInfoMapper; +import com.tmerclub.cloud.payment.model.PayInfo; +import com.tmerclub.cloud.payment.model.RefundInfo; +import com.tmerclub.cloud.payment.service.RefundInfoService; +import com.tmerclub.cloud.payment.vo.RefundInfoExcelVO; +import com.tmerclub.cloud.payment.vo.RefundInfoVO; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotNull; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 退款信息 + * + * @author FrozenWatermelon + * @date 2021-03-11 14:45:01 + */ +@Service +@RefreshScope +public class RefundInfoServiceImpl implements RefundInfoService { + + private static final Logger log = LoggerFactory.getLogger(RefundInfoServiceImpl.class); + + @Autowired + private RefundInfoMapper refundInfoMapper; + @Autowired + private PayInfoMapper payInfoMapper; + @Autowired + private PayManager payManager; + @Autowired + private AllinpayManager allinpayManager; + @Value("${application.domainUrl}") + private String domainUrl; + @Autowired + private RocketMQTemplate orderRefundSuccessTemplate; + @Autowired + private RocketMQTemplate allinPayBalanceOrderSuccessTemplate; + @DubboReference + private UserLevelAndScoreOrderFeignClient userLevelAndScoreOrderFeignClient; + @DubboReference + private OrderRefundFeignClient orderRefundFeignClient; + @DubboReference + private ConfigFeignClient configFeignClient; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> refundInfoMapper.list()); + } + + @Override + public RefundInfo getByRefundIdAndWxPay(Long refundId) { + return refundInfoMapper.listByRefundIdAndWxPay(refundId).get(0); + } + + @Override + public RefundInfo getByRefundId(Long refundId) { + List refundInfos = refundInfoMapper.listByRefundId(refundId); + if (CollUtil.isEmpty(refundInfos)) { + return null; + } + return refundInfos.get(0); + } + + @Override + public void save(RefundInfo refundInfo) { + refundInfoMapper.save(refundInfo); + } + + @Override + public void update(RefundInfo refundInfo) { + refundInfoMapper.update(refundInfo); + } + + @Override + public void deleteById(Long refundId) { + refundInfoMapper.deleteById(refundId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void doRefund(PayRefundBO payRefundBO) { + if (refundInfoMapper.countByRefundId(payRefundBO.getRefundId()) > 0) { + return; + } + List payInfoList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 预售订单可能有两笔 + if (StrUtil.isNotBlank(payRefundBO.getPayIds())) { + payInfoList = getPayInfoList(payRefundBO); + } else { + PayInfo payInfo = payInfoMapper.getByPayId(payRefundBO.getPayId()); + payInfoList.add(payInfo); + } + if (CollectionUtil.isEmpty(payInfoList)) { + return; + } + boolean refundSuccess = true; + RefundInfo successRefundInfo = new RefundInfo(); + Long refundAmount = payRefundBO.getRefundAmount(); + int payNumber = 1; + payInfoList.sort(Comparator.comparing(PayInfo::getPayAmount).reversed()); + // 获取订单之前是不是有进行过采购,如果有进行过采购,那么本次支付将直接退款 + boolean refundPurchaseAmount = Objects.nonNull(payRefundBO.getAllinpayRefundPurchaseAmount()) && payRefundBO.getAllinpayRefundPurchaseAmount() > 0; + if (refundPurchaseAmount) { + PayInfo payInfo = payInfoMapper.getByOrderIdsAndEntry(payRefundBO.getOrderId().toString(), PayEntry.SHOP_BALANCE_PAY_PURCHASE.value()).get(0); + payInfoList.add(payInfo); + } + for (int i = 0; i < payInfoList.size(); i++) { + PayInfo payInfo = payInfoList.get(i); + RefundInfo refundInfo = getRefundInfo(payRefundBO, payInfoList, refundAmount, refundPurchaseAmount, i, payInfo); + // 保存退款信息 refund_id是唯一(定金预售时不唯一)的,所以能确保只进行一次退款 + refundInfoMapper.save(refundInfo); + + RefundInfoBO refundInfoBO = new RefundInfoBO(); + refundInfoBO.setRefundId(refundInfo.getRefundId()); + refundInfoBO.setRefundAmount(refundInfo.getRefundAmount()); + refundInfoBO.setPayType(PayType.instance(payInfo.getPayType())); + refundInfoBO.setPayId(payInfo.getPayId()); + refundInfoBO.setBizUserId(payRefundBO.getShopId()); + refundInfoBO.setPayAmount(payInfo.getPayAmount()); + refundInfoBO.setNotifyUrl(domainUrl + "/ua/notice/refund/order/" + payInfo.getPaySysType() + "/" + payInfo.getPayType()); + + refundInfoBO.setUserId(payInfo.getUserId()); + refundInfoBO.setRefundNumber(payNumber++); + // 余额支付,直接退款都不需要回调的,只要有一个是需要回调则等回调 + if (Objects.equals(payInfo.getPaySysType(), 0)) { + log.info("开始进行普通退款{}",refundInfoBO); + refundSuccess = payManager.doRefund(refundInfoBO); + } else { + log.info("开始进行通联退款{}",refundInfoBO); + refundSuccess = allinpayManager.doRefund(refundInfoBO); + } + + if (!Objects.equals(payRefundBO.getOnlyRefund(), 1) && refundSuccess) { + refundInfo.setCallbackTime(new Date()); + refundInfo.setRefundStatus(RefundStatus.REFUNDED.value()); + refundInfoMapper.updateByIdAndPayId(refundInfo); + successRefundInfo = refundInfo; + } + refundAmount = refundAmount - payInfo.getPayAmount(); + if (refundAmount <= 0) { + break; + } + } + // 是否直接进行退款,不需要任何回调 + if (!Objects.equals(payRefundBO.getOnlyRefund(), 1) && refundSuccess) { + successRefundInfo.setRefundStatus(RefundStatus.UNREFUND.value()); + // 如果都不需要回调,则直接使用第一个 + refundSuccess(successRefundInfo); + } + } + + @NotNull + private static RefundInfo getRefundInfo(PayRefundBO payRefundBO, List payInfoList, Long refundAmount, boolean refundPurchaseAmount, int i, PayInfo payInfo) { + RefundInfo refundInfo = new RefundInfo(); + refundInfo.setRefundId(payRefundBO.getRefundId()); + refundInfo.setRefundAmount(Math.min(refundAmount, payInfo.getPayAmount())); + // 如果是最后一项,且采购需退款金额不为空,则进行商家采购金额退款 + if (refundPurchaseAmount && i >= payInfoList.size() - 1) { + refundInfo.setRefundAmount(Math.min(payRefundBO.getAllinpayRefundPurchaseAmount(), payInfo.getPayAmount())); + } + refundInfo.setOrderId(payRefundBO.getOrderId()); + refundInfo.setPayId(payInfo.getPayId()); + refundInfo.setPayType(payInfo.getPayType()); + refundInfo.setUnSuccessGroupOrder(payRefundBO.getUnSuccessGroupOrder()); + refundInfo.setUserId(payInfo.getUserId()); + refundInfo.setRefundStatus(RefundStatus.UNREFUND.value()); + return refundInfo; + } + + private List getPayInfoList(PayRefundBO payRefundBO) { + List payInfoList; + String[] payIds = payRefundBO.getPayIds().split(StrUtil.COMMA); + List payIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (String payId : payIds) { + try { + payIdList.add(Long.valueOf(payId)); + } catch (Exception e) { + log.error("支付idLong类型转换失败", e); + } + } + payInfoList = payInfoMapper.listByPayIds(payIdList); + return payInfoList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void refundSuccess(RefundInfo refundInfo) { + // 已经退款 + if (Objects.equals(refundInfo.getRefundStatus(), RefundStatus.REFUNDED.value())) { + return; + } + refundInfo.setCallbackTime(new Date()); + refundInfo.setRefundStatus(RefundStatus.REFUNDED.value()); + refundInfoMapper.update(refundInfo); + // TODO 如果是多条退款,需要判断最后一条才进行回调? + RefundNotifyBO refundNotifyBO = new RefundNotifyBO(); + refundNotifyBO.setRefundId(refundInfo.getRefundId()); + refundNotifyBO.setRefundAmount(refundInfo.getRefundAmount()); + refundNotifyBO.setOrderId(refundInfo.getOrderId()); + refundNotifyBO.setPayId(refundInfo.getPayId()); + refundNotifyBO.setUnSuccessGroupOrder(refundInfo.getUnSuccessGroupOrder()); + // 通知订单将订单的退款状态改变 + SendStatus sendOrderStatus = orderRefundSuccessTemplate.syncSend(RocketMqConstant.ORDER_REFUND_SUCCESS_TOPIC, new GenericMessage<>(refundNotifyBO)).getSendStatus(); + + + if (!Objects.equals(sendOrderStatus, SendStatus.SEND_OK)) { + // 这个回调方法会多次进行回调 + throw new LuckException(ResponseEnum.EXCEPTION); + } + + } + + @Override + public AccountDetailVO getRefundAccountDetail(Date startTime, Date endTime, String shopName) { + ServerResponseEntity refundResponse = orderRefundFeignClient.getAccountOrderDetail(startTime, endTime, shopName, null); + if (!refundResponse.isSuccess()) { + throw new LuckException(refundResponse.getMsg()); + } + AccountDetailVO accountDetailVO = BeanUtil.map(refundResponse.getData(), AccountDetailVO.class); + if (Objects.isNull(accountDetailVO)) { + AccountDetailVO accountDetail = new AccountDetailVO(); + accountDetail.setWechatAmount(0L); + accountDetail.setAlipayAmount(0L); + accountDetail.setBalanceAmount(0L); + accountDetail.setScoreCount(0L); + accountDetail.setWechatPercent(0.00); + accountDetail.setAlipayPercent(0.00); + accountDetail.setBalancePercent(0.00); + accountDetail.setTotal(0L); + return accountDetail; + } else { + getTotal(accountDetailVO); + return accountDetailVO; + } + } + + @Override + public AccountDetailVO getPlatformRefundAccountDetail(Date startTime, Date endTime) { + ServerResponseEntity platformOrderResponse = orderRefundFeignClient.getAccountOrderDetail(startTime, endTime, "", Constant.PLATFORM_SHOP_ID); + if (!platformOrderResponse.isSuccess()) { + throw new LuckException(platformOrderResponse.getMsg()); + } + AccountOrderDetailVO accountOrderDetailVO = platformOrderResponse.getData(); + AccountDetailVO accountDetailVO = new AccountDetailVO(); + accountDetailVO.setAlipayAmount(Objects.isNull(accountOrderDetailVO.getAlipayAmount()) ? 0L : accountOrderDetailVO.getAlipayAmount()); + accountDetailVO.setWechatAmount(Objects.isNull(accountOrderDetailVO.getWechatAmount()) ? 0L : accountOrderDetailVO.getWechatAmount()); + accountDetailVO.setBalanceAmount(Objects.isNull(accountOrderDetailVO.getBalanceAmount()) ? 0L : accountOrderDetailVO.getBalanceAmount()); + accountDetailVO.setScoreCount(Objects.isNull(accountOrderDetailVO.getScoreCount()) ? 0L : accountOrderDetailVO.getScoreCount()); + accountDetailVO.setTotal(accountDetailVO.getAlipayAmount() + accountDetailVO.getBalanceAmount() + accountDetailVO.getWechatAmount()); + return accountDetailVO; + } + + @Override + public PageVO getRefundInfoPage(PageDTO pageDTO, AccountSearchDTO accountSearchDTO) { + PageVO pageVO = new PageVO<>(); + ServerResponseEntity orderResponse = orderRefundFeignClient.listOrderRefundInfo(accountSearchDTO.getStartTime(), accountSearchDTO.getEndTime(), accountSearchDTO.getShopId(), null, pageDTO.getPageSize(), pageDTO.getPageNum()); + if (!orderResponse.isSuccess()) { + throw new LuckException(orderResponse.getMsg()); + } + pageVO.setTotal(orderResponse.getData().getTotal()); + pageVO.setList(BeanUtil.mapAsList(orderResponse.getData().getRefundInfoList(), RefundInfoVO.class)); + pageVO.setPages(PageUtil.getPages(orderResponse.getData().getTotal(), pageDTO.getPageSize())); + return pageVO; + } + + @Override + public void excelRefundInfo(HttpServletResponse response, AccountSearchDTO accountSearchDTO) { + accountSearchDTO.setFinanceType(FinanceType.ORDER.value()); + ServerResponseEntity orderRefundResponse = orderRefundFeignClient.listOrderRefundInfo(accountSearchDTO.getStartTime(), accountSearchDTO.getEndTime(), null, accountSearchDTO.getShopName(), null, null); + if (!orderRefundResponse.isSuccess()) { + throw new LuckException(orderRefundResponse.getMsg()); + } + List orderRefundInfoList = BeanUtil.mapAsList(orderRefundResponse.getData().getRefundInfoList(), RefundInfoVO.class); + + Map map = new HashMap<>(8); + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + ExcelWriterBuilder excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, RefundInfoExcelVO.EXCEL_NAME, RefundInfoExcelVO.MERGE_ROW_INDEX, RefundInfoExcelVO.MERGE_COLUMN_INDEX); + excelWriter = ExcelUtil.getExcelModel(excelWriterMerge, map, Constant.START_ROW).build(); + // 业务代码 + writeExcel(orderRefundInfoList, FinanceType.ORDER.str(), excelWriter); + } catch (Exception e) { + log.error("导出财务对账退款报表出错", e); + } finally { + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + private List getExcelList(List refundInfoList) { + List refundInfoExcelList = new ArrayList<>(Constant.INITIAL_CAPACITY); + int index = 1; + for (RefundInfoVO refundInfoVO : refundInfoList) { + RefundInfoExcelVO refundInfoExcelVO = new RefundInfoExcelVO(); + refundInfoExcelVO.setSeq(String.valueOf(index)); + refundInfoExcelVO.setShopName(refundInfoVO.getShopName()); + refundInfoExcelVO.setRefundId(refundInfoVO.getRefundId().toString()); + refundInfoExcelVO.setPayId(refundInfoVO.getPayId().toString()); + refundInfoExcelVO.setOrderId(refundInfoVO.getOrderId().toString()); + refundInfoExcelVO.setPayEntry(PayEntry.getPayTypeName(refundInfoVO.getPayEntry())); + refundInfoExcelVO.setPayType(PayType.getPayTypeName(refundInfoVO.getPayType())); + refundInfoExcelVO.setPayScore(Objects.isNull(refundInfoVO.getScoreCount()) ? "0" : refundInfoVO.getScoreCount().toString()); + refundInfoExcelVO.setAlipayAmount(PriceUtil.toDecimalPrice(refundInfoVO.getAlipayAmount()).toString()); + refundInfoExcelVO.setWechatAmount(PriceUtil.toDecimalPrice(refundInfoVO.getWechatAmount()).toString()); + refundInfoExcelVO.setBalanceAmount(PriceUtil.toDecimalPrice(refundInfoVO.getBalanceAmount()).toString()); + refundInfoExcelVO.setRefundTime(refundInfoVO.getRefundTime()); + refundInfoExcelList.add(refundInfoExcelVO); + index++; + } + return refundInfoExcelList; + } + + private void writeExcel(List refundInfoList, String type, ExcelWriter excelWriter) { + List refundInfoExcelList = getExcelList(refundInfoList); + if (CollUtil.isNotEmpty(refundInfoExcelList)) { + refundInfoExcelList.add(new RefundInfoExcelVO()); + } + WriteSheet sheetWriter = EasyExcel.writerSheet(type).head(RefundInfoExcelVO.class).build(); + excelWriter.write(refundInfoExcelList, sheetWriter); + } + + @Override + public PageVO pageRefundAccountDetail(PageDTO pageDTO, AccountSearchDTO accountSearchDTO) { + // 获取店铺信息 + ServerResponseEntity orderResponse = orderRefundFeignClient.listShopAccountDetail(accountSearchDTO.getStartTime(), accountSearchDTO.getEndTime(), accountSearchDTO.getShopName(), pageDTO.getPageSize(), pageDTO.getPageNum()); + if (!orderResponse.isSuccess()) { + throw new LuckException(orderResponse.getMsg()); + } + List shopList = orderResponse.getData().getShopList(); + List result = BeanUtil.mapAsList(shopList, ShopAccountDetailVO.class); + + PageVO shopPage = new PageVO<>(); + shopPage.setTotal(orderResponse.getData().getTotal()); + shopPage.setList(result); + shopPage.setPages(PageUtil.getPages(orderResponse.getData().getTotal(), pageDTO.getPageSize())); + return shopPage; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void doRefundByAmountError(PayInfo payInfo, PayRefundBO payRefundBO) { + doRefund(payRefundBO); + // 标记为退款 + PayInfo updatePayInfo = new PayInfo(); + updatePayInfo.setPayId(payInfo.getPayId()); + updatePayInfo.setPayStatus(PayStatus.REFUND.value()); + payInfoMapper.update(updatePayInfo); + + PayNotifyBO message = new PayNotifyBO(); + message.setPayId(payInfo.getPayId()); + message.setPayType(payInfo.getPayType()); + message.setPaySysType(payInfo.getPaySysType()); + // 发送消息,订单支付成功 + // 通知用户余额支付成功 + SendStatus sendBalanceStatus = allinPayBalanceOrderSuccessTemplate.syncSend(RocketMqConstant.ALLINPAY_BALANCE_ORDER_SUCCESS_TOPIC, new GenericMessage<>(message)).getSendStatus(); + if (!Objects.equals(sendBalanceStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public void updateByIdPayId(RefundInfo refundInfo) { + refundInfoMapper.updateByIdAndPayId(refundInfo); + } + + private void getTotal(AccountDetailVO accountDetailVO) { + Long wechatAmount = Objects.isNull(accountDetailVO.getWechatAmount()) ? 0L : accountDetailVO.getWechatAmount(); + Long alipayAmount = Objects.isNull(accountDetailVO.getAlipayAmount()) ? 0L : accountDetailVO.getAlipayAmount(); + Long balanceAmount = Objects.isNull(accountDetailVO.getBalanceAmount()) ? 0L : accountDetailVO.getBalanceAmount(); + long total = wechatAmount + alipayAmount + balanceAmount; + accountDetailVO.setTotal(total); + accountDetailVO.setWechatPercent(Arith.div(wechatAmount.doubleValue(), total, 4)); + accountDetailVO.setAlipayPercent(Arith.div(alipayAmount.doubleValue(), total, 4)); + accountDetailVO.setBalancePercent(Arith.div(balanceAmount.doubleValue(), total, 4)); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/PayInfoExcelVO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/PayInfoExcelVO.java new file mode 100644 index 0000000..be616e2 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/PayInfoExcelVO.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * spu信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class PayInfoExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "收入对账"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0}; + + @ExcelProperty(value = {"收入对账信息", "序号"}, index = 0) + private String seq; + + @ExcelProperty({"收入对账信息", "店铺名称"}) + private String shopName; + + @ExcelProperty({"收入对账信息", "支付单号"}) + private String payId; + + @ExcelProperty({"收入对账信息", "关联订单号"}) + private String orderIds; + + /** + * 支付入口[0订单 1充值 2开通会员] + */ + @ExcelProperty({"收入对账信息", "支付入口"}) + private String payEntry; + + /** + * 支付方式 [0积分支付 1微信小程序支付 2支付宝支付 3微信扫码支付 + * 4微信H5支付 5微信公众号支付 6支付宝H5支付 7支付宝APP支付 8微信APP支付 9余额支付] + */ + @ExcelProperty({"收入对账信息", "支付方式"}) + private String payType; + + @ExcelProperty({"收入对账信息", "支付积分"}) + private String payScore; + + @ExcelProperty({"收入对账信息", "支付宝金额"}) + private String alipayAmount; + + @ExcelProperty({"收入对账信息", "微信金额"}) + private String wechatAmount; + + @ExcelProperty({"收入对账信息", "余额金额"}) + private String balanceAmount; + + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") + @ExcelProperty({"收入对账信息", "支付时间"}) + private Date payTime; + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getPayId() { + return payId; + } + + public void setPayId(String payId) { + this.payId = payId; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public String getPayEntry() { + return payEntry; + } + + public void setPayEntry(String payEntry) { + this.payEntry = payEntry; + } + + public String getPayType() { + return payType; + } + + public void setPayType(String payType) { + this.payType = payType; + } + + public String getPayScore() { + return payScore; + } + + public void setPayScore(String payScore) { + this.payScore = payScore; + } + + public String getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(String alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public String getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(String wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public String getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(String balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + @Override + public String toString() { + return "PayInfoExcelVO{" + + "seq='" + seq + '\'' + + ", shopName='" + shopName + '\'' + + ", payId=" + payId + + ", orderIds='" + orderIds + '\'' + + ", payEntry='" + payEntry + '\'' + + ", payType='" + payType + '\'' + + ", payScore='" + payScore + '\'' + + ", alipayAmount=" + alipayAmount + + ", wechatAmount=" + wechatAmount + + ", balanceAmount=" + balanceAmount + + ", payTime=" + payTime + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/PayInfoVO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/PayInfoVO.java new file mode 100644 index 0000000..9c0677b --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/PayInfoVO.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author TRACK + */ +public class PayInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "支付时间") + private Date payTime; + + @Schema(description = "支付入口[0订单 1充值 2开通会员]") + private Integer payEntry; + + @Schema(description = "关联订单号") + private String orderIds; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "支付单号") + private String payId; + + @Schema(description = "支付积分") + private Long scoreCount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "合计") + private Long payAmount; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Integer getPayEntry() { + return payEntry; + } + + public void setPayEntry(Integer payEntry) { + this.payEntry = payEntry; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public String getPayId() { + return payId; + } + + public void setPayId(String payId) { + this.payId = payId; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + @Override + public String toString() { + return "PayInfoVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", payTime=" + payTime + + ", payEntry=" + payEntry + + ", orderIds='" + orderIds + '\'' + + ", payType=" + payType + + ", payId=" + payId + + ", scoreCount=" + scoreCount + + ", alipayAmount=" + alipayAmount + + ", wechatAmount=" + wechatAmount + + ", balanceAmount=" + balanceAmount + + ", payAmount=" + payAmount + + '}'; + } +} diff --git a/tmerclub-payment/src/main/resources/bootstrap.yml b/tmerclub-payment/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..818956e --- /dev/null +++ b/tmerclub-payment/src/main/resources/bootstrap.yml @@ -0,0 +1,28 @@ +server: + port: ${MALL4CLOUD_PORT:9113} +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} +logging: + tracer: + pattern: '%5p [${spring.application.name:},%X{X-B3-Parent-SpanName},%X{X-B3-TraceId},%X{X-B3-SpanId}]' + +# dubbo端口:默认为服务端口+2000 +dubbo: + protocol: + port: ${MALL4CLOUD_DUBBO_PORT:9513} diff --git a/tmerclub-payment/src/main/resources/logback.xml b/tmerclub-payment/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-payment/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-payment/src/main/resources/mapper/RefundInfoMapper.xml b/tmerclub-payment/src/main/resources/mapper/RefundInfoMapper.xml new file mode 100644 index 0000000..0cd4cf6 --- /dev/null +++ b/tmerclub-payment/src/main/resources/mapper/RefundInfoMapper.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + `refund_id`,`create_time`,`update_time`,`order_id`,`pay_id`,`refund_status`,`refund_amount`,`pay_type`,`callback_content`,`callback_time` + + + + + + insert into refund_info (`refund_id`,`order_id`,`pay_id`,`user_id`,`refund_status`,`refund_amount`,`pay_type`,`callback_content`,`callback_time`) + values (#{refundInfo.refundId},#{refundInfo.orderId},#{refundInfo.payId},#{refundInfo.userId},#{refundInfo.refundStatus},#{refundInfo.refundAmount},#{refundInfo.payType},#{refundInfo.callbackContent},#{refundInfo.callbackTime}); + + + update refund_info + + + `refund_status` = #{refundInfo.refundStatus}, + + + `refund_amount` = #{refundInfo.refundAmount}, + + + `pay_type` = #{refundInfo.payType}, + + + `callback_content` = #{refundInfo.callbackContent}, + + + `callback_time` = #{refundInfo.callbackTime}, + + + where refund_id = #{refundInfo.refundId} + + + update refund_info + + + `refund_status` = #{refundInfo.refundStatus}, + + + `refund_amount` = #{refundInfo.refundAmount}, + + + `pay_type` = #{refundInfo.payType}, + + + `callback_content` = #{refundInfo.callbackContent}, + + + `callback_time` = #{refundInfo.callbackTime}, + + + where refund_id = #{refundInfo.refundId} and pay_id = #{refundInfo.payId} + + + delete from refund_info where refund_id = #{refundId} + + + + + + + + diff --git a/tmerclub-product/Dockerfile b/tmerclub-product/Dockerfile new file mode 100644 index 0000000..da6f962 --- /dev/null +++ b/tmerclub-product/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms1024m", "-Xmx1024m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-product/pom.xml b/tmerclub-product/pom.xml new file mode 100644 index 0000000..8844d3a --- /dev/null +++ b/tmerclub-product/pom.xml @@ -0,0 +1,97 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-product + mall4cloud 商品服务 + jar + + + + com.moyuer.cloud + tmerclub-common-mongodb + ${project.version} + + + com.moyuer.cloud + tmerclub-common-security + ${project.version} + + + com.moyuer.cloud + tmerclub-common-leaf + ${project.version} + + + com.moyuer.cloud + tmerclub-common-rocketmq + ${project.version} + + + com.moyuer.cloud + tmerclub-api-product + ${project.version} + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.moyuer.cloud + tmerclub-api-order + ${project.version} + + + com.moyuer.cloud + tmerclub-api-marketing + ${project.version} + + + com.moyuer.cloud + tmerclub-api-search + ${project.version} + + + com.moyuer.cloud + tmerclub-api-user + ${project.version} + + + com.moyuer.cloud + tmerclub-api-group + ${project.version} + + + com.moyuer.cloud + tmerclub-api-seckill + ${project.version} + + + com.moyuer.cloud + tmerclub-api-flow + ${project.version} + + + com.xuxueli + xxl-job-core + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/ProductApplication.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/ProductApplication.java new file mode 100644 index 0000000..d6703fd --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/ProductApplication.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product; + +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.security.servlet.UserDetailsServiceAutoConfiguration; + +/** + * @author FrozenWatermelon + * @date 2020/09/22 + */ +@SpringBootApplication(scanBasePackages = "com.moyuer.cloud", exclude = UserDetailsServiceAutoConfiguration.class) +@EnableDubbo(scanBasePackages = "com.moyuer.cloud.**.feign") +public class ProductApplication { + public static void main(String[] args) { + SpringApplication.run(ProductApplication.class, args); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/CategoryRateBO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/CategoryRateBO.java new file mode 100644 index 0000000..bd59d42 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/CategoryRateBO.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 店铺分类佣金比例 + * @author FrozenWatermelon + * @date 2021/5/24 + */ +public class CategoryRateBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long categoryId; + + private Double rate; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + + @Override + public String toString() { + return "CategoryShopRateBO{" + + ", categoryId=" + categoryId + + ", rate=" + rate + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/CategoryShopRateBO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/CategoryShopRateBO.java new file mode 100644 index 0000000..b7c8bd3 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/CategoryShopRateBO.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 店铺分类佣金比例 + * @author FrozenWatermelon + * @date 2021/5/24 + */ +public class CategoryShopRateBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long shopId; + + private Long categoryId; + + private Double rate; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + + @Override + public String toString() { + return "CategoryShopRateBO{" + + "shopId=" + shopId + + ", categoryId=" + categoryId + + ", rate=" + rate + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/NeedZoneSkuInfoBO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/NeedZoneSkuInfoBO.java new file mode 100644 index 0000000..af66637 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/NeedZoneSkuInfoBO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 需要分片的sku信息 + * @author lanhai + */ +public class NeedZoneSkuInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * spuId + */ + private Long spuId; + + /** + * skuId + */ + private Long skuId; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + @Override + public String toString() { + return "NeedZoneSkuInfoBO{" + + "spuId=" + spuId + + ", skuId=" + skuId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/SkuWithStockBO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/SkuWithStockBO.java new file mode 100644 index 0000000..f325dc2 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/SkuWithStockBO.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + * @date 2020/12/30 + */ +public class SkuWithStockBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long id; + + private Long skuId; + + private Long spuId; + private Long shopSpuId; + + private Integer count; + + private Integer zoneNo; + + public Long getShopSpuId() { + return shopSpuId; + } + + public void setShopSpuId(Long shopSpuId) { + this.shopSpuId = shopSpuId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Integer getZoneNo() { + return zoneNo; + } + + public void setZoneNo(Integer zoneNo) { + this.zoneNo = zoneNo; + } + + @Override + public String toString() { + return "SkuWithStockBO{" + + "id=" + id + + ", skuId=" + skuId + + ", spuId=" + spuId + + ", shopSpuId=" + shopSpuId + + ", count=" + count + + ", zoneNo=" + zoneNo + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/SkuZoneInfoBO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/SkuZoneInfoBO.java new file mode 100644 index 0000000..cee7ba6 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/SkuZoneInfoBO.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * sku的分片信息 + * @author lanhai + */ +public class SkuZoneInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 是否有进行分片 + */ + private Integer hasZone; + + /** + * 还有库存的分片数量 + */ + private Integer limitZone; + + public SkuZoneInfoBO() { + } + + public SkuZoneInfoBO(Integer hasZone, Integer limitZone) { + this.hasZone = hasZone; + this.limitZone = limitZone; + } + + public Integer getHasZone() { + return hasZone; + } + + public void setHasZone(Integer hasZone) { + this.hasZone = hasZone; + } + + public Integer getLimitZone() { + return limitZone; + } + + public void setLimitZone(Integer limitZone) { + this.limitZone = limitZone; + } + + @Override + public String toString() { + return "SkuZoneInfoBO{" + + "hasZone=" + hasZone + + ", limitZone=" + limitZone + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoSpuBrowseLogBO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoSpuBrowseLogBO.java new file mode 100644 index 0000000..ba4aada --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoSpuBrowseLogBO.java @@ -0,0 +1,142 @@ +package com.tmerclub.cloud.product.bo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.annotation.Id; +import org.springframework.data.annotation.Transient; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 对应MongoDB中商品浏览记录表emp + * + * @author 菠萝凤梨 + */ +@Document("spu_browse_log") +@CompoundIndexes({ + @CompoundIndex(name = "userId_status_spuId_idx", def = "{'userId':1, 'status':1, 'spuId':1}"), + @CompoundIndex(name = "userId_spuType_spuId_time_idx", def = "{'userId':1, 'spuType':1, 'spuId':1, 'createTime':1}"), +}) +public class MongoSpuBrowseLogBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Id + @Schema(description = "商品浏览记录id") + private Long spuBrowseLogId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "1:正常 -1:删除") + private Integer status; + + @Schema(description = "商品类型") + private Integer spuType; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Transient + @Schema(description = "商品名称") + private String spuName; + + public Long getSpuBrowseLogId() { + return spuBrowseLogId; + } + + public void setSpuBrowseLogId(Long spuBrowseLogId) { + this.spuBrowseLogId = spuBrowseLogId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + @Override + public String toString() { + return "MongoSpuBrowseLogBO{" + + "spuBrowseLogId=" + spuBrowseLogId + + ", userId=" + userId + + ", spuId=" + spuId + + ", categoryId=" + categoryId + + ", status=" + status + + ", spuType=" + spuType + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", spuName='" + spuName + '\'' + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoStockBillLogBO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoStockBillLogBO.java new file mode 100644 index 0000000..9388028 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoStockBillLogBO.java @@ -0,0 +1,329 @@ +package com.tmerclub.cloud.product.bo.mongo; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 对应MongoDB存储出入库日志emp + * + * @author track + */ +@CompoundIndexes({ + @CompoundIndex(name = "shop_idx", def = "{'shopId':1}"), + @CompoundIndex(name = "source_order_no_idx", def = "{'sourceOrderNo':1}"), + @CompoundIndex(name = "id_order_no", def = "{'stockBillNo':1, 'type':1}") +}) +@Document("stock_bill_log") +public class MongoStockBillLogBO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Id + @Schema(description = "出入库明细id") + private Long stockBillLogId; + + @Schema(description = "出入库单号") + private String stockBillNo; + + @Schema(description = "关联订单号") + private String sourceOrderNo; + + @Schema(description = "单据类型") + private Integer stockBillType; + + @Schema(description = "出入库原因id") + private Long stockChangeReasonId; + + @Schema(description = "其他出/入库原因" ) + private String reason; + + @Schema(description = "操作员工id") + private Long employeeId; + + @Schema(description = "状态,0:已作废,1:已出/入库,2:待提交") + private Integer status; + + @Schema(description = "出入库时间") + private Date businessTime; + + @Schema(description = "总出入库数量") + private Integer totalCount; + + @Schema(description = "总出入库金额") + private Long totalAmount; + + @Schema(description = "出入库凭证") + private String qualifications; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "单位") + private String measureUnit; + + @Schema(description = "类型,1:出库 2:入库") + private Integer type; + + @Schema(description = "制单人手机号") + private String makerMobile; + + @Schema(description = "制单人姓名") + private String makerName; + + @Schema(description = "库存点id") + private Long stockPointId; + + @Schema(description = "库存点名称") + private String stockPointName; + + @Schema(description = "库存点类型(1:仓库 2:门店)") + private Integer stockPointType; + + @Schema(description = "出入库项列表") + List stockBillItemLogs; + + public MongoStockBillLogBO() { + } + + public MongoStockBillLogBO(Long shopId, Date businessTime, Integer stockBillLogType, Integer stockType, String stockBillNo, Integer status, String sourceOrderNo) { + Date now = new Date(); + this.setShopId(shopId); + this.setEmployeeId(null); + this.setCreateTime(now); + this.setUpdateTime(now); + this.setBusinessTime(businessTime); + this.setStockBillType(stockBillLogType); + this.setType(stockType); + this.setStockBillNo(stockBillNo); + this.setStatus(status); + this.setSourceOrderNo(sourceOrderNo); + } + + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public String getStockBillNo() { + return stockBillNo; + } + + public void setStockBillNo(String stockBillNo) { + this.stockBillNo = stockBillNo; + } + + public String getSourceOrderNo() { + return sourceOrderNo; + } + + public void setSourceOrderNo(String sourceOrderNo) { + this.sourceOrderNo = sourceOrderNo; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Date getBusinessTime() { + return businessTime; + } + + public void setBusinessTime(Date businessTime) { + this.businessTime = businessTime; + } + + public Integer getTotalCount() { + return totalCount; + } + + public void setTotalCount(Integer totalCount) { + this.totalCount = totalCount; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + public String getQualifications() { + return qualifications; + } + + public void setQualifications(String qualifications) { + this.qualifications = qualifications; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getMeasureUnit() { + return measureUnit; + } + + public void setMeasureUnit(String measureUnit) { + this.measureUnit = measureUnit; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public String getMakerName() { + return makerName; + } + + public void setMakerName(String makerName) { + this.makerName = makerName; + } + + public List getStockBillItemLogs() { + return stockBillItemLogs; + } + + public void setStockBillItemLogs(List stockBillItemLogs) { + this.stockBillItemLogs = stockBillItemLogs; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public String getStockPointName() { + return stockPointName; + } + + public void setStockPointName(String stockPointName) { + this.stockPointName = stockPointName; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + @Override + public String toString() { + return "MongoStockBillLogBO{" + + "stockBillLogId=" + stockBillLogId + + ", stockBillNo='" + stockBillNo + '\'' + + ", sourceOrderNo='" + sourceOrderNo + '\'' + + ", stockBillType=" + stockBillType + + ", stockChangeReasonId=" + stockChangeReasonId + + ", reason='" + reason + '\'' + + ", employeeId=" + employeeId + + ", status=" + status + + ", businessTime=" + businessTime + + ", totalCount=" + totalCount + + ", totalAmount=" + totalAmount + + ", qualifications='" + qualifications + '\'' + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", remark='" + remark + '\'' + + ", measureUnit='" + measureUnit + '\'' + + ", type=" + type + + ", makerMobile='" + makerMobile + '\'' + + ", makerName='" + makerName + '\'' + + ", stockPointId=" + stockPointId + + ", stockPointName='" + stockPointName + '\'' + + ", stockPointType=" + stockPointType + + ", stockBillItemLogs=" + stockBillItemLogs + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoStockBillLogItemBO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoStockBillLogItemBO.java new file mode 100644 index 0000000..4e15f76 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoStockBillLogItemBO.java @@ -0,0 +1,148 @@ +package com.tmerclub.cloud.product.bo.mongo; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 对应MongoDB存储出入库商品emp + * + * @author track + */ +public class MongoStockBillLogItemBO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品sku名称") + private String skuName; + + @Schema(description = "sku有图片使用sku图片,否则使用商品主图") + private String mainImgUrl; + + @Schema(description = "成本单价") + private Long unitPrice; + + @Schema(description = "实际出入库数量") + private Integer stockCount; + + @Schema(description = "商品库存剩余量") + private Integer afterStock; + + @Schema(description = "商品编码") + private String partyCode; + + /** + * 初始化后可以删掉此字段 + */ + @Schema(description = "出入库明细id") + private Long stockBillLogId; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Long getUnitPrice() { + return unitPrice; + } + + public void setUnitPrice(Long unitPrice) { + this.unitPrice = unitPrice; + } + + public Integer getStockCount() { + return stockCount; + } + + public void setStockCount(Integer stockCount) { + this.stockCount = stockCount; + } + + public Integer getAfterStock() { + return afterStock; + } + + public void setAfterStock(Integer afterStock) { + this.afterStock = afterStock; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + @Override + public String toString() { + return "MongoStockBillLogItemBO{" + + "spuId=" + spuId + + ", skuId=" + skuId + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", unitPrice=" + unitPrice + + ", stockCount=" + stockCount + + ", afterStock=" + afterStock + + ", partyCode='" + partyCode + '\'' + + ", stockBillLogId=" + stockBillLogId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/DistributedIdKey.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/DistributedIdKey.java new file mode 100644 index 0000000..243444a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/DistributedIdKey.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.constant; + +import com.tmerclub.cloud.common.leaf.constant.GlobalDistributedIdKey; + +/** + * 分布式id key + * + * @author FrozenWatermelon + * @date 2021/4/9 + */ +public interface DistributedIdKey { + + /** + * 商品id + */ + String MALL4CLOUD_SPU = "mall4cloud-spu"; + + /** + * sku编码 + */ + String MALL4CLOUD_PRODUCT_SKU_CODE = "mall4cloud-product-sku-code"; + + /** + * 商品评论 + */ + String MALL4CLOUD_PRODUCT_COMM = "mall4cloud-product-comm"; + + /** + * 商品浏览记录id + */ + String MALL4CLOUD_SPU_BROWSE_LOG = "mall4cloud-spu-browse-log"; + + /** + * 出库单号 + */ + String MALL4CLOUD_PRODUCT_STOCK_OUT = GlobalDistributedIdKey.MALL4CLOUD_PRODUCT_STOCK_OUT.value(); + + /** + * 入库单号 + */ + String MALL4CLOUD_PRODUCT_STOCK_IN = GlobalDistributedIdKey.MALL4CLOUD_PRODUCT_STOCK_IN.value(); + + /** + * 出入库日志id + */ + String MALL4CLOUD_STOCK_BILL_LOG = GlobalDistributedIdKey.MALL4CLOUD_STOCK_BILL_LOG.value(); + + /** + * 仓库库存点id + */ + String MALL4CLOUD_STOCK_POINT = GlobalDistributedIdKey.MALL4CLOUD_STOCK_POINT.value(); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/SkuZoneConstant.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/SkuZoneConstant.java new file mode 100644 index 0000000..060e731 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/SkuZoneConstant.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.constant; + +/** + * 因为订单会扣减库存,扣减库存的时候会有行锁,这里将一个行锁转变为多个行锁(MAX_ZONE_NUM), + * 进行分片,可以提高单商品下单的性能 + * @author FrozenWatermelon + */ +public interface SkuZoneConstant { + + /** + * 最大分片数量 + */ + int MAX_ZONE_NUM = 10; + + /** + * 每个分片库存(包括主分片)至少为100个库存,如果不能达到这些要求,则不会进行库存分片 + */ + int ZONE_MIN_STOCK = 100; + + /** + * 当库存超过这么多的时候会开始分片 + * 因为会有一个主分片 + 其他分片(MAX_ZONE_NUM), + * 如果商品库存量很小,说明了购买的人数也会很少,没必要进行分片,所有的库存都会留在主分片的库存 + * 目前系统配置分片数量至少为2个,因为如果只有1个分片的话对性能提升无帮助 + */ + int NEED_ZONE_NUM = ZONE_MIN_STOCK << 1; + + /** + * 需要重新分片的最低库存 分片库存低于30%的时候就开始重新分片 + */ + int NEED_REZONE_NUM = ZONE_MIN_STOCK * 30 / 100; + + /** + * 当sku库存每五秒小于10单时就取消分片 + */ + int UN_ZONE_NUM = 10; +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/WriteOfNumEnum.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/WriteOfNumEnum.java new file mode 100644 index 0000000..c99f6c2 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/WriteOfNumEnum.java @@ -0,0 +1,48 @@ +package com.tmerclub.cloud.product.constant; + +/** + * 虚拟商品核销次数枚举类 + * @author gaozijie + * @date 2023-07-20 + */ +public enum WriteOfNumEnum { + /** + * 多次核销 + */ + REPEATEDLY(-1, "多次核销"), + + /** + * 无需核销 + */ + WITHOUT(0, "无需核销"), + + /** + * 单次核销 + */ + SINGLE(1, "单次核销"); + + private final Integer num; + private final String name; + + WriteOfNumEnum(Integer num, String name) { + this.num = num; + this.name = name; + } + + public Integer getNum() { + return num; + } + + public String getName() { + return name; + } + + public static String getNameByNum(Integer num) { + for (WriteOfNumEnum writeOfNumEnum : values()) { + if (writeOfNumEnum.num.equals(num)) { + return writeOfNumEnum.name; + } + } + return null; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/SpuController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/SpuController.java new file mode 100644 index 0000000..057c8f3 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/SpuController.java @@ -0,0 +1,735 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.admin; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.TypeReference; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.combo.feign.ComboFeignClient; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopSubstituteSalesFeignClient; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.vo.DistributionConfigApiVO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.platform.vo.SysConfigApiVO; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.common.constant.AutoCheckEnum; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.*; +import com.tmerclub.cloud.common.product.dto.SkuComboDTO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.product.dto.SpuPageSearchDTO; +import com.tmerclub.cloud.product.handler.ProductCommentWriteHandler; +import com.tmerclub.cloud.product.listener.SpuExcelListener; +import com.tmerclub.cloud.product.model.SpuConsignmentChange; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.common.util.SheetUtil; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.vo.CategoryShopVO; +import com.tmerclub.cloud.product.vo.SpuExcelVO; +import com.tmerclub.cloud.product.vo.SupplierSpuExcelVO; +import com.tmerclub.cloud.product.vo.SupplierSpuVo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.apache.commons.collections.CollectionUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * spu信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@RestController("adminSpuController") +@RequestMapping("/mp/spu") +@Tag(name = "admin-spu信息") +public class SpuController { + + private static final Logger LOGGER = LoggerFactory.getLogger(SpuController.class); + + @Autowired + private SpuService spuService; + @Autowired + private SkuService skuService; + @Autowired + private SkuComboService skuComboService; + @Autowired + private BrandService brandService; + @Autowired + private ShopCartService shopCartService; + @Autowired + private GiveawayService giveawayService; + @Autowired + private SpuExcelService spuExcelService; + @Autowired + private CategoryService categoryService; + @Autowired + private GiveawaySpuService giveawaySpuService; + @Autowired + private SpuAttrValueService spuAttrValueService; + @Autowired + private CategoryShopService categoryShopService; + @Autowired + private SpuConsignmentChangeService spuConsignmentChangeService; + @DubboReference + private ComboFeignClient comboFeignClient; + @DubboReference + private ConfigFeignClient configFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private ShopSubstituteSalesFeignClient shopSubstituteSalesFeignClient; + + @GetMapping + @Operation(summary = "获取spu信息", description = "根据spuId获取spu信息") + public ServerResponseEntity getBySpuId(@RequestParam Long spuId) { + // 获取spu信息 + SpuVO spuVO = spuService.getBySpuId(spuId); + if (Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value()) && !Objects.isNull(spuVO.getSupplierSpuId())) { + //处理返回的代销商品信息 + disposeSpuMsg(spuVO); + //返回商家代销设置 + setSalesMsg(spuVO); + //供应商商品信息 + SpuVO supplierSpu = spuService.getBySpuId(spuVO.getSupplierSpuId()); + spuVO.setSupplierSpuStatus(supplierSpu.getStatus()); + spuVO.setSupplierSpuCode(supplierSpu.getSpuCode()); + if (Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()) && Objects.equals(supplierSpu.getStatus(), StatusEnum.DELETE.value())) { + spuVO.setSupplierDeliveryType(SupplierDeliveryType.SHOP_DELIVERY.value()); + } + } + Integer sysType = AuthUserContext.get().getSysType(); + if (!Objects.equals(sysType, SysTypeEnum.MULTISHOP.value()) && !Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.YES.value())) { + if (!Objects.equals(spuVO.getShopId(), AuthUserContext.get().getTenantId()) && !Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + } + List spuAttrsBySpuId = spuAttrValueService.getSpuAttrsBySpuId(spuId); + spuVO.setSpuAttrValues(spuAttrsBySpuId); + + // 物流模板 + SpuVO.DeliveryModeVO deliveryModeVO = Json.parseObject(spuVO.getDeliveryMode(), SpuVO.DeliveryModeVO.class); + spuVO.setDeliveryModeVO(deliveryModeVO); + // 品牌信息 + spuVO.setBrand(brandService.getByBrandId(spuVO.getBrandId())); + // sku信息 + if (Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value())) { + //代销商品 + spuVO.setSkus(skuService.listConsignmentSku(spuVO, false)); + } else { + //其他商品(商家商品,供应商商品) + spuVO.setSkus(skuService.listSkuAllInfoBySpuId(spuId, spuVO, false)); + } + + + + // 从sku中计算商品库存 + int totalStock = 0; + int saleNum = 0; + for (SkuVO sku : spuVO.getSkus()) { + totalStock += Objects.isNull(sku.getStock()) ? 0: sku.getStock(); + saleNum += Objects.isNull(sku.getSaleNum()) ? 0: sku.getSaleNum(); + } + spuVO.setTotalStock(totalStock); + spuVO.setSaleNum(saleNum); + spuService.loadSpuAttrs(spuVO); + // 平台分类、店铺分类信息 + spuVO.setCategory(categoryService.getInfo(spuVO.getCategoryId())); + ProductLangUtil.category(spuVO.getCategory()); + if (Objects.nonNull(spuVO.getShopCategoryId()) && !Objects.equals(spuVO.getShopCategoryId(), Constant.DEFAULT_ID)) { + spuVO.setShopCategory(categoryService.getInfo(spuVO.getShopCategoryId())); + if (!Objects.isNull(spuVO.getShopCategory())) { + ProductLangUtil.category(spuVO.getShopCategory()); + } + } + // 是否为套餐商品 + Boolean data = comboFeignClient.checkComboSpu(spuId, AuthUserContext.get().getTenantId()).getData(); + spuVO.setIsComboSpu(data); + return ServerResponseEntity.success(spuVO); + } + + private void setSalesMsg(SpuVO spuVO) { + if (Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.MULTISHOP.value())) { + Long shopId = AuthUserContext.get().getTenantId(); + //获取商家代销设置 + ServerResponseEntity shopSubstituteSales = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(shopId); + spuVO.setSalesType(shopSubstituteSales.getData().getSalesType()); + spuVO.setSalesPriceType(shopSubstituteSales.getData().getSalesPriceType()); +// if (Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + spuVO.setSalesPrice(shopSubstituteSales.getData().getSalesPrice()); +// } + } + } + + @PostMapping + @Operation(summary = "保存spu信息", description = "保存spu信息") + public ServerResponseEntity save(@Valid @RequestBody SpuDTO spuDTO) { + spuDTO.setStatus(StatusEnum.ENABLE.value()); + if (!Objects.equals(spuDTO.getSpuType(), SpuType.ACTIVE.value())) { + spuDTO.setSpuType(SpuType.NORMAL.value()); + } + spuService.save(spuDTO); + return ServerResponseEntity.success(spuDTO.getSpuId()); + } + + @PutMapping + @Operation(summary = "更新spu信息", description = "更新spu信息") + public ServerResponseEntity update(@Valid @RequestBody SpuDTO spuDTO) { + SpuVO spuDb = spuService.getBySpuId(spuDTO.getSpuId()); + if (!Objects.equals(spuDb.getShopId(), AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + spuService.update(spuDTO); + // 清除购物车数量缓存 + shopCartService.removeShopCartItemCache(Collections.singletonList(spuDTO.getSpuId())); + return ServerResponseEntity.success(); + } + + + @DeleteMapping + @Operation(summary = "删除spu信息", description = "根据spu信息id删除spu信息") + public ServerResponseEntity delete(@RequestParam Long spuId) { + SpuVO spuDb = spuService.getBySpuId(spuId); + Long shopId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(spuDb.getShopId(), shopId) && !Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + //判断是否包含赠品活动、判断商品是否为套餐活动(正在进行的)的主商品 + checkBeforeDeleteSpu(spuId, shopId); + + spuService.deleteById(spuId); + // 更新分销配置(移除分销指定商品) + this.updateDistributionAfterDeleteSpu(spuId); + // 清除购物车数量缓存 + shopCartService.removeShopCartItemCache(Collections.singletonList(spuId)); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_spu_data") + @Operation(summary = "修改spu(名称、价格、库存、序号)信息", description = "更新spu信息") + public ServerResponseEntity updateSpuData(@RequestBody SpuDTO spuDTO) { + SpuVO spuDb = spuService.getBySpuId(spuDTO.getSpuId()); + if (!Objects.equals(spuDb.getShopId(), AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + spuService.updateSpuOrSku(spuDTO); + // 清除购物车数量缓存 + shopCartService.removeShopCartItemCache(Collections.singletonList(spuDTO.getSpuId())); + return ServerResponseEntity.success(); + } + + + /** + * 更新商品状态 + */ + @PutMapping("/prod_status") + @Operation(summary = "商品上下架", description = "商品上下架") + public ServerResponseEntity spuChangeStatus(@RequestBody SpuPageSearchDTO spuDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + if (Objects.nonNull(spuDTO.getSpuId())) { + spuDTO.setSpuIds(Collections.singletonList(spuDTO.getSpuId())); + } + if (CollUtil.isEmpty(spuDTO.getSpuIds())) { + throw new LuckException("商品id不能为空"); + } + List spuList = spuService.listSpuBySpuIds(spuDTO.getSpuIds()); + + checkShop(spuDTO); + for (SpuVO spuVO : spuList) { + if (Objects.equals(spuDTO.getStatus(), StatusEnum.ENABLE.value())) { + checkInfo(spuVO); + } + //供应商商品 + if (SupplierSpuType.YES.value().equals(spuDTO.getSupplierSpuType())) { + SpuVO spuVo = spuService.getSpuByShopIdAndSupplierSpuId(shopId, spuDTO.getSpuId()); + if (!Objects.isNull(spuVo)) { + spuDTO.setSpuId(spuVo.getSpuId()); + spuDTO.setShopId(spuVo.getShopId()); + spuVO.setShopId(spuVo.getShopId()); + } + } + if (!Objects.equals(spuVO.getShopId(), shopId) && !Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + } + // 是否开启“商品发布时审核”,若开启,上架修改状态为“待审核”【平台端不用审核】 + ServerResponseEntity config = configFeignClient.getConfig(Constant.SPU_SWITCH_CONFIG); + String prodSwitchConfig = config.getData(); + boolean shouldChange = SpuStatus.PUT_SHELF.value().equals(spuDTO.getStatus()) + && !SysTypeEnum.PLATFORM.value().equals(AuthUserContext.get().getSysType()) + && !ObjectUtils.isEmpty(prodSwitchConfig); + if (shouldChange) { + Boolean spuAudit = JSON.parseObject(prodSwitchConfig, new TypeReference>() { + }) + .getOrDefault("spuAudit", false); + if (spuAudit) { + spuDTO.setStatus(SpuStatus.PUBLISH_WAIT_AUDIT.value()); + } + } + spuBatchUpdateStatus(spuDTO); + for (SpuVO spuVO : spuList) { + spuService.removeSpuCacheBySpuId(spuVO.getSpuId()); + } + // 清除购物车数量缓存 + shopCartService.removeShopCartItemCache(spuDTO.getSpuIds()); + return ServerResponseEntity.success(); + } + + @GetMapping("/sold_excel") + @Operation(summary = "导出excel", description = "导出商品excel") + public ServerResponseEntity spuSoldExcel(HttpServletResponse response, SpuPageSearchDTO spuDTO) { + List list = spuExcelService.excelSpuList(spuDTO); + ExcelUtil.soleExcelWithHandler(response, list, SpuExcelVO.EXCEL_NAME, SpuExcelVO.MERGE_ROW_INDEX, + SpuExcelVO.MERGE_COLUMN_INDEX, new ProductCommentWriteHandler(SysTypeEnum.MULTISHOP.value()), SpuExcelVO.class); + return ServerResponseEntity.success(); + } + + @GetMapping("/down_model") + @Operation(summary = "导出商品excel模板", description = "导出商品excel模板") + public ServerResponseEntity downloadModel(HttpServletResponse response) { + spuExcelService.downloadModel(response); + return ServerResponseEntity.success(); + } + + @Operation(summary = "导入文件") + @PostMapping("/export_excel") + public ServerResponseEntity exportExcel(@RequestParam("excelFile") MultipartFile file) { + if (file == null) { + throw new LuckException("网络繁忙,请稍后重试"); + } + // 判断execl文件是否为空 + if (SheetUtil.sheetIsNull(file)) { + return ServerResponseEntity.success("[导入文件为空]"); + } + String info; + try { + Map> errorMap = new HashMap<>(8); + EasyExcel.read(file.getInputStream(), SpuExcelVO.class, new SpuExcelListener(spuExcelService, errorMap)).sheet().doRead(); + info = spuExcelService.spuExportError(errorMap); + } catch (IOException e) { + throw new LuckException(e.getMessage()); + } + return ServerResponseEntity.success(info); + } + + + @PostMapping("/offline") + @Operation(summary = "下线商品", description = "下线商品") + public ServerResponseEntity offline(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + SpuVO spuVO = spuService.getBySpuId(offlineHandleEventDto.getHandleId()); + if (spuVO == null) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + spuService.offline(offlineHandleEventDto); + spuService.removeSpuCacheBySpuId(offlineHandleEventDto.getHandleId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/batch_offline") + @Operation(summary = "批量下线商品", description = "批量下线商品") + public ServerResponseEntity batchOffline(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (CollectionUtil.isEmpty(offlineHandleEventDto.getHandleIds())) { + throw new LuckException("下线的商品id列表不能为空"); + } + spuService.batchOffile(offlineHandleEventDto); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_offline_handle_event/{spuId}") + @Operation(summary = "获取最新下线的事件", description = "获取最新下线的事件") + public ServerResponseEntity getOfflineHandleEvent(@PathVariable Long spuId) { + SpuVO spuDb = spuService.getBySpuId(spuId); + if (!Objects.equals(spuDb.getShopId(), AuthUserContext.get().getTenantId()) && !Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + return ServerResponseEntity.success(spuService.getOfflineHandleEvent(spuId)); + } + + @PostMapping("/audit") + @Operation(summary = "审核商品", description = "审核商品") + public ServerResponseEntity audit(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + SpuVO spuVO = spuService.getBySpuId(offlineHandleEventDto.getHandleId()); + if (!Objects.equals(spuVO.getStatus(), SpuStatus.WAITAUDIT.value())) { + // 商品状态已改变,请刷新页面 + throw new LuckException("商品状态已改变,请刷新页面"); + } + spuService.audit(offlineHandleEventDto); + spuService.removeSpuCacheBySpuId(offlineHandleEventDto.getHandleId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/audit_apply") + @Operation(summary = "违规活动提交审核", description = "违规活动提交审核") + public ServerResponseEntity auditApply(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + SpuVO spuDb = spuService.getBySpuId(offlineHandleEventDto.getHandleId()); + if (!Objects.equals(spuDb.getShopId(), AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + spuService.auditApply(offlineHandleEventDto); + return ServerResponseEntity.success(); + } + + @GetMapping("/getSupplierInfoByspuId") + @Operation(summary = "商家编辑商品时获取供应商商品信息", description = "商家编辑商品时获取供应商商品信息") + public ServerResponseEntity getSupplierInfoBySpuId(Long supplierSpuId) { + Long shopId = AuthUserContext.get().getTenantId(); + //供应商商品信息 + SupplierSpuVo supplierInfo = spuService.getSupplierInfoBySpuId(supplierSpuId, shopId); + //属性 + supplierInfo.setSpuAttrValues(spuAttrValueService.getSpuAttrsBySpuId(supplierSpuId)); + // 平台分类、店铺分类信息 + supplierInfo.setCategory(categoryService.getInfo(supplierInfo.getCategoryId())); + // 品牌信息 + supplierInfo.setBrand(brandService.getByBrandId(supplierInfo.getBrandId())); + if (Objects.nonNull(supplierInfo.getShopCategoryId()) && !Objects.equals(supplierInfo.getShopCategoryId(), Constant.DEFAULT_ID)) { + supplierInfo.setShopCategory(categoryService.getInfo(supplierInfo.getShopCategoryId())); + } + //获取店铺 + return ServerResponseEntity.success(supplierInfo); + } + + + @PostMapping("/import_supplier_spu") + @Operation(summary = "商家单个/批量导入供应商商品", description = "商家单个/批量导入供应商商品") + public ServerResponseEntity> importSupplierSpu(@RequestBody List supplierSpuId) { + List spuIdList = spuService.importSupplierSpu(supplierSpuId); + return ServerResponseEntity.success(spuIdList); + } + + @GetMapping("/supplier_excel") + @Operation(summary = "代销商品导出excel", description = "导出商品excel") + public ServerResponseEntity supplierSpuSoldExcel(HttpServletResponse response, SpuPageSearchDTO spuDTO) { + List list = spuExcelService.excelSupplierSpuList(spuDTO); + ExcelUtil.soleExcelWithHandler(response, list, SupplierSpuExcelVO.EXCEL_NAME, SupplierSpuExcelVO.MERGE_ROW_INDEX, + SupplierSpuExcelVO.MERGE_COLUMN_INDEX, new ProductCommentWriteHandler(null), SupplierSpuExcelVO.class); + return ServerResponseEntity.success(); + } + + @GetMapping("/has_stock_by_sku_ids") + @Operation(summary = "当前关联商品列表是否有共同供货仓库", description = "当前关联商品列表是否有共同供货仓库") + public ServerResponseEntity hasStockBySkuIds(SkuComboDTO skuComboDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + Boolean hasStock = skuService.hasStockBySkuIds(skuComboDTO.getSkuIds(),shopId); + return ServerResponseEntity.success(hasStock); + } + + private void checkBeforeDeleteSpu(Long spuId, Long shopId) { + Boolean data = comboFeignClient.checkComboSpu(spuId, shopId).getData(); + if (data) { + throw new LuckException("参加以下活动的商品不能被删除:优惠套餐"); + } + GiveawayVO giveawayVO = giveawayService.getBySpuId(spuId); + List giveawaySpuVOList = giveawaySpuService.getBySpuId(spuId); + if (giveawayVO != null || CollectionUtils.isNotEmpty(giveawaySpuVOList)) { + //参加以下活动的商品不能被删除:赠品 + throw new LuckException("参加以下活动的商品不能被删除:赠品"); + } + } + + /** + * 处理代销商品信息 + * + * @param spuVO + * @return + */ + private void disposeSpuMsg(SpuVO spuVO) { + Long spuId = spuVO.getSpuId(); + //获取代销商品基本信息是否改变 + SpuConsignmentChange spuConsignmentChange = spuConsignmentChangeService.consignmentChange(spuId); + if (Objects.isNull(spuConsignmentChange)) { + return; + } + //获取供应商信息 + SpuVO supplierSpu = spuService.getBySpuId(spuVO.getSupplierSpuId()); + List spuLangList = spuVO.getSpuLangList(); + List supplierSpuLangList = supplierSpu.getSpuLangList(); + Map supplierSpuLangMap = supplierSpuLangList.stream().collect(Collectors.toMap(SpuLangVO::getLang, e -> e)); + if (Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + //名称 + if (Objects.equals(spuConsignmentChange.getNameChange(), 0)) { + for (SpuLangVO spuLangVO : spuLangList) { + SpuLangVO langVO = supplierSpuLangMap.get(spuLangVO.getLang()); + if (Objects.isNull(langVO)) { + continue; + } + spuLangVO.setSpuName(langVO.getSpuName()); + } + } + //图片 + if (Objects.equals(spuConsignmentChange.getImageChange(), 0)) { + spuVO.setImgUrls(supplierSpu.getImgUrls()); + spuVO.setMainImgUrl(supplierSpu.getMainImgUrl()); + } + //视频 + if (Objects.equals(spuConsignmentChange.getVideoChange(), 0)) { + spuVO.setVideo(supplierSpu.getVideo()); + } + //卖点 + if (Objects.equals(spuConsignmentChange.getSellingPointChange(), 0)) { + for (SpuLangVO spuLangVO : spuLangList) { + SpuLangVO langVO = supplierSpuLangMap.get(spuLangVO.getLang()); + if (Objects.isNull(langVO)) { + continue; + } + spuLangVO.setSellingPoint(langVO.getSellingPoint()); + } + } + //计量单位 + if (Objects.equals(spuConsignmentChange.getMeasureUnitChange(), 0)) { + spuVO.setMeasureUnit(supplierSpu.getMeasureUnit()); + } + //spuCod + if (Objects.equals(spuConsignmentChange.getSpuCodeChange(), 0)) { + spuVO.setSpuCode(supplierSpu.getSpuCode()); + } + //详情描述 + if (Objects.equals(spuConsignmentChange.getDetailChange(), 0)) { + spuVO.setDetail(supplierSpu.getDetail()); + } + //品牌 + if (Objects.equals(spuConsignmentChange.getBrandChange(), 0)) { + // 品牌信息 + spuVO.setBrand(brandService.getByBrandId(supplierSpu.getBrandId())); + } + //序号 + spuVO.setSeq(supplierSpu.getSeq()); + } + + } + + private void checkInfo(SpuVO spuVO) { + if (!Objects.equals(spuVO.getSpuType(), SpuType.SCORE.value())) { + CategoryVO category = categoryService.getInfo(spuVO.getCategoryId()); + if (category == null || Objects.equals(category.getStatus(), StatusEnum.DISABLE.value())) { + // 平台分类处于下线中,商品不能上架,请联系管理员后再进行操作 + throw new LuckException("商品【" + spuVO.getName() + "】的平台分类处于下线中,商品不能上架,请联系管理员后再进行操作"); + } + boolean write = Objects.equals(spuVO.getSpuMold(), 1) && !Objects.equals(0, spuVO.getWriteOffNum()) && + Objects.equals(spuVO.getWriteOffTime(), 0) && Objects.nonNull(spuVO.getWriteOffEnd()) && new Date().after(spuVO.getWriteOffEnd()); + if (write) { + //商品已过核销有效期 + throw new LuckException("该商品已过核销有效期"); + } + if (!Objects.equals(spuVO.getSpuType(), SpuType.SCORE.value())) { + CategoryVO shopCategory = categoryService.getById(spuVO.getShopCategoryId()); + if (shopCategory == null || Objects.equals(shopCategory.getStatus(), StatusEnum.DISABLE.value())) { + // 本店分类处于下线中,商品不能上架 + throw new LuckException("商品【" + spuVO.getName() + "】的本店分类处于下线中,商品不能上架"); + } + } + // 商家代销的供应商商品上架,如果是仓库发货,需要检验是否存在物流模板id了 + if (Objects.equals(spuVO.getSupplierSpuType(), SupplierDeliveryType.SHOP_DELIVERY.value()) && Objects.isNull(spuVO.getDeliveryTemplateId())) { + // 请先设置商品的物流模板 + throw new LuckException("请先设置商品的物流模板: 商品名称【" + spuVO.getName() + "】"); + } + } + // 如果商品正在下架,但又是活动商品,代表这个商品所属的活动被平台下架了 + if (Objects.equals(spuVO.getSpuType(), SpuType.SECKILL.value())) { + throw new LuckException("商品【" + spuVO.getName() + "】所属的秒杀活动处于违规下线中,商品不能上架"); + } + if (Objects.equals(spuVO.getSpuType(), SpuType.GROUP.value())) { + throw new LuckException("商品【" + spuVO.getName() + "】所属的团购活动处于违规下线中,商品不能上架"); + } + if(Objects.equals(spuVO.getSpuMold(),SpuMold.COMBO.value())){ + checkEnableComboSpu(spuVO); + } + } + + /** + * 组合商品上架条件: + * 1.关联商品 > 0 + * 2.关联商品不为(预售,供应商发货(商家的组合商品))类型 + * 3.关联的商品(sku)都为上架状态 + * @param spuVO + */ + private void checkEnableComboSpu(SpuVO spuVO) { + List skuList = skuService.listSkuWithAttrBySpuId(spuVO.getSpuId()); + List combSpus = skuComboService.getCombSpusBySpuIds(Collections.singletonList(spuVO.getSpuId())); + Map> skuComboMap = combSpus.stream().collect(Collectors.groupingBy(SkuComboVO::getSkuId)); + for (SkuVO skuVO : skuList) { + if(!skuComboMap.containsKey(skuVO.getSkuId())){ + throw new LuckException("组合商品的每个规格至少关联一个商品"); + } + } + Set spuIds = combSpus.stream().map(SkuComboVO::getComboSpuId).collect(Collectors.toSet()); + Set skuIds = combSpus.stream().map(SkuComboVO::getComboSkuId).collect(Collectors.toSet()); + int count = spuService.countNormalSpuBySpuIds(spuIds); + int skuCount = skuService.countNormalSkuBySkuIds(skuIds); + if(count > 0 || skuCount > 0){ + throw new LuckException("当前组合商品关联的商品状态异常或者类型不对不能进行上架"); + } + } + + private void checkShop(SpuPageSearchDTO spuDTO) { + if (Objects.equals(spuDTO.getStatus(), StatusEnum.ENABLE.value()) && !Objects.equals(AuthUserContext.get().getTenantId(), Constant.PLATFORM_SHOP_ID)) { + // 上架商品时,需要根据店铺状态判断是否可以上架商品 + ServerResponseEntity shopRequest = shopDetailFeignClient.getShopByShopId(AuthUserContext.get().getTenantId()); + EsShopDetailBO shopDetail = shopRequest.getData(); + if (!Objects.equals(shopDetail.getShopStatus(), ShopStatus.OPEN.value())) { + // 合同到期 + if (shopDetail.getContractEndTime() != null && shopDetail.getContractEndTime().compareTo(new Date()) < 0) { + throw new LuckException("店铺有效期已过,不能进行此操作,请联系管理员后重试"); + } + throw new LuckException("店铺处于违规下线状态,不能上架商品"); + } + } + } + + + /** + * spu批量上下架 + * + * @param spuDTO + */ + private void spuBatchUpdateStatus(SpuPageSearchDTO spuDTO) { + List spuIds = spuDTO.getSpuIds(); + Integer status = spuDTO.getStatus(); + spuDTO.setStatus(null); + List spuList; + if (Objects.equals(spuDTO.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value())) { + spuList = spuService.supplierSpuList(spuDTO); + } else { + spuList = spuService.list(spuDTO); + } + if (CollUtil.isEmpty(spuList)) { + throw new LuckException("获取不到该商品信息,请刷新后重试"); + } + checkUpdateStatusData(spuList, status); + if (CollUtil.isEmpty(spuIds)) { + throw new LuckException("您所选择的商品中没有符合操作条件的商品"); + } + spuService.batchChangeSpuStatus(spuIds, status); + } + + /** + * 校验spu上下架信息 + * + * @param list 商品列表 + * @param status 更新的状态 + * @return + */ + private void checkUpdateStatusData(List list, Integer status) { + ProductLangUtil.spuList(list); + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + ServerResponseEntity shopRequest = shopDetailFeignClient.getShopByShopId(shopId); + EsShopDetailBO shopDetail = shopRequest.getData(); + if (Objects.equals(shopDetail.getShopStatus(), ShopStatus.OFFLINE.value()) || Objects.equals(shopDetail.getShopStatus(), ShopStatus.OFFLINE_AWAIT_AUDIT.value())) { + throw new LuckException("店铺处于违规下线中,不能修改商品"); + } + for (SpuVO spu : list) { + if (!Objects.equals(spu.getShopId(), shopId) && !Objects.equals(AuthUserContext.get().getTenantId(), Constant.PLATFORM_SHOP_ID)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + // 商品状态不为启用或未启用状态 + if (!Objects.equals(spu.getStatus(), StatusEnum.ENABLE.value()) + && !Objects.equals(spu.getStatus(), StatusEnum.DISABLE.value())) { + throw new LuckException("商品(" + spu.getName() + ")不能进行上下架操作"); + } + if (Objects.equals(status, StatusEnum.ENABLE.value()) && !Objects.equals(spu.getSpuType(), SpuType.SCORE.value())) { + CategoryVO category = categoryService.getById(spu.getCategoryId()); + if (!Objects.equals(category.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException("商品(" + spu.getName() + ")所属的平台分类处于下线中,商品不能进行上架操作,请联系管理员后再进行操作"); + } + CategoryVO shopCategory = categoryService.getById(spu.getShopCategoryId()); + if (!Objects.equals(shopCategory.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException("商品(" + spu.getName() + ")所属的店铺分类处于下线中,商品不能进行上架操作"); + } + CategoryShopVO categoryShopVO = categoryShopService.getByShopIdAndCategoryId(spu.getShopId(), spu.getCategoryId(), sysType); + if (Objects.isNull(categoryShopVO)) { + throw new LuckException("商品(" + spu.getName() + ")所属的平台分类与店铺的签约关系已失效,商品不能进行上架操作"); + } + // 如果是组合商品,判断一下所有组合的商品是否状态正常,状态正常才可以上线 + if(Objects.equals(spu.getSpuMold(), SpuMold.COMBO.value())){ + Integer count = skuComboService.countDisableComboSpuBySpuId(spu.getSpuId()); + if(count > 0){ + throw new LuckException("请在关联商品状态均为上架时进行操作"); + } + } + } + } + } + + /** + * 更新分销配置信息 + * @param spuId 商品id + */ + private void updateDistributionAfterDeleteSpu(Long spuId) { + if (Objects.isNull(spuId)) { + return; + } + // 获取系统分销配置 + String configStr = configFeignClient.getConfig(Constant.DISTRIBUTION_CONFIG).getData(); + if (ObjectUtils.isEmpty(configStr)) { + return; + } + DistributionConfigApiVO distributionConfig = Json.parseObject(configStr, DistributionConfigApiVO.class); + if (Objects.isNull(distributionConfig) + || !Objects.equals(distributionConfig.getAutoCheck(), AutoCheckEnum.SYSTEM.value())) { + return; + } + // 没有指定购买商品 或 删除商品不在指定购买商品内,无需处理 + List spuIds = distributionConfig.getSpuIdList(); + if (CollectionUtil.isEmpty(spuIds) + || !spuIds.contains(spuId)) { + return; + } + LOGGER.info("商品[{}]删除,更新分销配置", spuId); + spuIds.remove(spuId); + // '系统判定'的申请条件全为空,自动切换成'人工判定' + if (ObjectUtil.isEmpty(spuIds) + && Objects.isNull(distributionConfig.getExpenseNumber()) + && Objects.isNull(distributionConfig.getExpenseAmount())) { + distributionConfig.setAutoCheck(AutoCheckEnum.ARTIFICIAL.value()); + } + // 更新配置 + SysConfigApiVO sysConfig = new SysConfigApiVO(); + sysConfig .setParamKey(Constant.DISTRIBUTION_CONFIG); + sysConfig .setParamValue(Json.toJsonString(distributionConfig)); + configFeignClient.saveOrUpdateSysConfig(sysConfig ); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/StockChangeReasonController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/StockChangeReasonController.java new file mode 100644 index 0000000..f56b355 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/StockChangeReasonController.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.admin; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.StockChangeReasonDTO; +import com.tmerclub.cloud.product.model.StockChangeReason; +import com.tmerclub.cloud.product.model.StockChangeReasonLang; +import com.tmerclub.cloud.product.service.StockChangeReasonLangService; +import com.tmerclub.cloud.product.service.StockChangeReasonService; +import com.tmerclub.cloud.product.vo.StockChangeReasonVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 出入库原因 + * + * @author lhd + * @date 2022-06-22 17:14:22 + */ +@RestController("adminStockChangeReasonController") +@RequestMapping("/mp/stock_change_reason") +@Tag(name = "出入库原因") +public class StockChangeReasonController { + + @Autowired + private StockChangeReasonService stockChangeReasonService; + + + @Autowired + private StockChangeReasonLangService stockChangeReasonLangService; + + @GetMapping("/page") + @Operation(summary = "分页获取出入库原因列表", description = "分页获取出入库原因列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, StockChangeReasonDTO stockChangeReasonDTO) { + stockChangeReasonDTO.setShopId(AuthUserContext.get().getTenantId()); + stockChangeReasonDTO.setSysType(AuthUserContext.get().getSysType()); + PageVO stockChangeReasonPage = stockChangeReasonService.page(pageDTO, stockChangeReasonDTO); + return ServerResponseEntity.success(stockChangeReasonPage); + } + + @GetMapping("/list") + @Operation(summary = "获取店铺所有的出入库原因", description = "获取店铺所有的出入库原因") + public ServerResponseEntity> list(StockChangeReasonDTO stockChangeReasonDTO) { + stockChangeReasonDTO.setShopId(AuthUserContext.get().getTenantId()); + stockChangeReasonDTO.setSysType(AuthUserContext.get().getSysType()); + List stockChangeReasonPage = stockChangeReasonService.list(stockChangeReasonDTO); + return ServerResponseEntity.success(stockChangeReasonPage); + } + + @GetMapping + @Operation(summary = "获取出入库原因", description = "根据stockChangeReasonId获取出入库原因") + public ServerResponseEntity getByStockChangeReasonId(@RequestParam Long stockChangeReasonId) { + return ServerResponseEntity.success(stockChangeReasonService.getByStockChangeReasonId(stockChangeReasonId)); + } + + @PostMapping + @Operation(summary = "保存出入库原因", description = "保存出入库原因") + public ServerResponseEntity save(@Valid @RequestBody StockChangeReasonDTO stockChangeReasonDTO) { + stockChangeReasonService.save(stockChangeReasonDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新出入库原因", description = "更新出入库原因") + public ServerResponseEntity update(@Valid @RequestBody StockChangeReasonDTO stockChangeReasonDTO) { + stockChangeReasonDTO.setShopId(AuthUserContext.get().getTenantId()); + stockChangeReasonDTO.setSysType(AuthUserContext.get().getSysType()); + StockChangeReason stockChangeReason = BeanUtil.map(stockChangeReasonDTO, StockChangeReason.class); + stockChangeReasonService.update(stockChangeReason); + //更新出入库原因和备注信息 + stockChangeReasonLangService.update(BeanUtil.map(stockChangeReasonDTO, StockChangeReasonLang.class)); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除出入库原因", description = "根据出入库原因id删除出入库原因") + public ServerResponseEntity delete(@RequestParam Long stockChangeReasonId) { + stockChangeReasonService.deleteById(stockChangeReasonId); + return ServerResponseEntity.success(); + } + + @PutMapping("/change_status") + @Schema(description = "修改出入库原因状态") + public ServerResponseEntity changeStatus(@RequestParam("stockChangeReasonId") Long stockChangeReasonId, @RequestParam("status") Integer status) { + Long shopId = AuthUserContext.get().getTenantId(); + stockChangeReasonService.changeStatus(shopId, stockChangeReasonId, status); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuBrowseLogController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuBrowseLogController.java new file mode 100644 index 0000000..d965ea0 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuBrowseLogController.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.app; + +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.bo.mongo.MongoSpuBrowseLogBO; +import com.tmerclub.cloud.product.dto.SpuBrowseLogDTO; +import com.tmerclub.cloud.product.model.SpuBrowseLog; +import com.tmerclub.cloud.product.service.CategoryService; +import com.tmerclub.cloud.product.service.SpuBrowseLogService; +import com.tmerclub.cloud.product.vo.SpuBrowseLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 商品浏览记录表 + * + * @author YXF + * @date 2021-03-19 14:28:14 + */ +@RestController("appSpuBrowseLogController") +@RequestMapping("/spu_browse_log") +@Tag(name = "商品浏览记录表") +public class SpuBrowseLogController { + + @Autowired + private SpuBrowseLogService spuBrowseLogService; + @Autowired + private CategoryService categoryService; + + @GetMapping("/page") + @Operation(summary = "获取商品浏览记录表列表", description = "分页获取商品浏览记录表列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO spuBrowseLogPage = spuBrowseLogService.page(pageDTO); + return ServerResponseEntity.success(spuBrowseLogPage); + } + + @PostMapping + @Operation(summary = "保存商品浏览记录表", description = "保存商品浏览记录表") + public ServerResponseEntity save(@RequestBody SpuBrowseLogDTO spuBrowseLogDTO) { + if (Objects.isNull(spuBrowseLogDTO.getSpuId())) { + throw new LuckException("商品id不能为空"); + } + if (Objects.isNull(spuBrowseLogDTO.getCategoryId())) { + throw new LuckException("分类id不能为空"); + } + if (Objects.isNull(spuBrowseLogDTO.getSpuType())) { + spuBrowseLogDTO.setSpuType(SpuType.NORMAL.value()); + } + Long userId = AuthUserContext.get().getUserId(); + spuBrowseLogDTO.setUserId(userId); + SpuBrowseLog spuBrowseLog = spuBrowseLogService.getCurrentLogBySpuIdAndUserId(spuBrowseLogDTO); + // 商品记录已存在,则更新商品记录 + if (Objects.nonNull(spuBrowseLog) && Objects.equals(spuBrowseLog.getSpuType(), spuBrowseLogDTO.getSpuType())) { + MongoSpuBrowseLogBO mongoSpuBrowseLogBO = BeanUtil.map(spuBrowseLog, MongoSpuBrowseLogBO.class); + mongoSpuBrowseLogBO.setStatus(StatusEnum.ENABLE.value()); + spuBrowseLogService.updateStatus(mongoSpuBrowseLogBO); + return ServerResponseEntity.success(); + } + MongoSpuBrowseLogBO spuBrowse = BeanUtil.map(spuBrowseLogDTO, MongoSpuBrowseLogBO.class); + if (!Objects.equals(spuBrowseLogDTO.getSpuType(), SpuType.SCORE.value())) { + CategoryVO category = categoryService.getById(spuBrowse.getCategoryId()); + spuBrowse.setCategoryId(category.getPrimaryCategoryId()); + } else { + spuBrowse.setCategoryId(0L); + } + spuBrowse.setUserId(userId); + spuBrowseLogService.save(spuBrowse); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "删除商品浏览记录表(单个删除传id,批量删除传数组)", description = "根据商品浏览记录表id删除商品浏览记录表") + public ServerResponseEntity delete(@RequestBody SpuBrowseLogDTO spuBrowseLogDTO) { + spuBrowseLogService.delete(spuBrowseLogDTO); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuCommController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuCommController.java new file mode 100644 index 0000000..381fb80 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuCommController.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.app; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.dto.SpuCommDTO; +import com.tmerclub.cloud.product.service.SpuCommService; +import com.tmerclub.cloud.product.vo.SpuCommStatisticsStarVO; +import com.tmerclub.cloud.product.vo.SpuCommStatisticsVO; +import com.tmerclub.cloud.product.vo.SpuCommVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 商品评论 + * + * @author YXF + * @date 2021-01-11 13:47:33 + */ +@RestController("appSpuCommController") +@RequestMapping("/spu_comm") +@Tag(name = "商品评论") +public class SpuCommController { + + @Autowired + private SpuCommService spuCommService; + + @GetMapping("/ua/page") + @Operation(summary = "获取商品评论列表(商品)", description = "分页获取商品评论列表") + @Parameters({ + @Parameter(name = "spuId", description = "商品id", required = true), + @Parameter(name = "evaluate", description = "评论类型 null/0 全部,1好评 2中评 3差评 4有图") + }) + public ServerResponseEntity> page(@Valid PageDTO pageDTO, @RequestParam("spuId") Long spuId, @RequestParam("evaluate") Integer evaluate) { + PageVO spuCommPage = spuCommService.spuCommPage(pageDTO, spuId, evaluate); + return ServerResponseEntity.success(spuCommPage); + } + + @GetMapping("/ua/prod_comm_data") + @Operation(summary = "返回商品评论数据(好评率 好评数量 中评数 差评数)(商品)", description = "根据商品id获取") + @Parameter(name = "spuId", description = "商品id", required = true) + public ServerResponseEntity getProdCommData(Long spuId) { + return ServerResponseEntity.success(spuCommService.getProdCommDataBySpuId(spuId)); + } + + @GetMapping("/ua/prod_comm_data_by_star") + @Operation(summary = "返回商品评论数据(按星数划分数量)(商品)", description = "根据商品id获取") + @Parameter(name = "spuId", description = "商品id", required = true) + public ServerResponseEntity getProdCommDataByStar(Long spuId) { + return ServerResponseEntity.success(spuCommService.getProdCommDataByStar(spuId)); + } + + @GetMapping("/prod_comm_page_by_user") + @Operation(summary = "根据用户返回评论分页数据(该用户发表的评论特殊显示)", description = "传入页码") + public ServerResponseEntity> getProdCommPageByUser(@Valid PageDTO pageDTO) { + return ServerResponseEntity.success(spuCommService.spuCommPageByUserId(pageDTO, AuthUserContext.get().getUserId())); + } + + @GetMapping("/ua/prod_comm_pag") + @Operation(summary = "返回评论分页数据(未登陆时请求)", description = "传入页码") + public ServerResponseEntity> getProdCommPage(@Valid PageDTO pageDTO) { + return ServerResponseEntity.success(spuCommService.spuCommPageByUserId(pageDTO, null)); + } + + @PostMapping("/comment") + @Operation(summary = "添加评论") + public ServerResponseEntity saveProdCommPage(@Valid @RequestBody SpuCommDTO spuCommDTO) { + spuCommService.comm(spuCommDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/comments") + @Operation(summary = "批量添加评论") + public ServerResponseEntity saveBatchComm(@RequestBody List spuCommDTOList) { + spuCommService.comms(spuCommDTOList); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_prod_comment") + @Operation(summary = "根据itemIds获取评论", description = "根据itemIds获取评论") + public ServerResponseEntity> getProdComment(@RequestParam("orderItemIds") List orderItemIds) { + return ServerResponseEntity.success(spuCommService.getSpuCommByOrderItemId(orderItemIds, AuthUserContext.get().getUserId())); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/CategoryController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/CategoryController.java new file mode 100644 index 0000000..041b73f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/CategoryController.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.product.dto.CategoryShopDTO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.model.CategoryShop; +import com.tmerclub.cloud.product.service.CategoryService; +import com.tmerclub.cloud.product.service.CategoryShopService; +import com.tmerclub.cloud.product.vo.CategoryShopVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author lth + */ +@RestController("multishopCategoryController") +@RequestMapping("/m/apply_shop/category") +@Tag(name = "multishop-分类信息") +public class CategoryController { + + @Autowired + private CategoryShopService categoryShopService; + + @Autowired + private CategoryService categoryService; + + @PostMapping("/signing") + @Operation(summary = "签约分类", description = "签约分类") + public ServerResponseEntity signingCategory(@Valid @RequestBody List categoryShopDTOList) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + categoryShopService.signingCategory(categoryShopDTOList, shopId, sysType); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_by_shop") + @Operation(summary = "获取签约的分类列表(返回所有)", description = "获取签约的分类列表(返回所有)") + public ServerResponseEntity> listByShopId() { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + List categoryShopVOList = categoryShopService.listByShopId(shopId, sysType, I18nMessage.getLang()); + return ServerResponseEntity.success(categoryShopVOList); + } + + @GetMapping("/platform_categories") + @Operation(summary = "获取平台所有的分类信息", description = "获取所有的分类列表信息") + public ServerResponseEntity> platformCategories() { + return ServerResponseEntity.success(categoryService.platformCategories()); + } + + @GetMapping("/list_signing_category") + @Schema(description = "获取签约的可用分类列表(发布商品时使用,包含对应的上级分类)") + @Parameter(name = "status", description = "签约分类状态 1:enable, 0:disable, -1:deleted") + public ServerResponseEntity> listSigningCategory(@RequestParam(value = "status", required = false) Integer status) { + Long shopId = AuthUserContext.get().getTenantId(); + List categoryList = categoryService.listSigningCategory(shopId, AuthUserContext.get().getSysType(), I18nMessage.getLang()); + if (Objects.nonNull(status)) { + categoryList = categoryList.stream().filter(categoryAppVO -> Objects.equals(categoryAppVO.getStatus(), status)).collect(Collectors.toList()); + } + return ServerResponseEntity.success(categoryList); + } + + @DeleteMapping("/delete_signing_category") + @Operation(summary = "根据签约分类id删除签约信息", description = "根据签约分类id删除签约信息") + public ServerResponseEntity deleteSigningCategory(@RequestParam("categoryShopId") Long categoryShopId) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + CategoryShop categoryShop = categoryShopService.getById(categoryShopId); + if (Objects.isNull(categoryShop)) { + throw new LuckException("找不到当前签约分类,请刷新后重试"); + } + if (!Objects.equals(shopId, categoryShop.getShopId()) && !Objects.equals(sysType, SysTypeEnum.MULTISHOP.value())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + categoryShopService.deleteSigningCategory(categoryShop); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_apply_signing_category") + @Operation(summary = "获取可以签约的平台分类列表(已经签约的平台分类不会返回)", description = "获取可以签约的平台分类列表(已经签约的平台分类不会返回)") + public ServerResponseEntity> listApplySigningCategory() { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + return ServerResponseEntity.success(categoryService.listApplySigningCategory(shopId, sysType)); + } + + @PostMapping("/add_signing_category") + @Operation(summary = "新增签约分类", description = "新增签约分类") + public ServerResponseEntity applyCategory(@Valid @RequestBody List categoryShopDTOList) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + categoryShopService.addSigningCategory(categoryShopDTOList, shopId, sysType); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/GiveawayController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/GiveawayController.java new file mode 100644 index 0000000..c1b41ab --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/GiveawayController.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.dto.GiveawayDTO; +import com.tmerclub.cloud.product.service.GiveawayService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 赠品表 + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:58 + */ +@RestController("multishopGiveawayController") +@RequestMapping("/m/giveaway") +@Tag(name = "赠品表") +public class GiveawayController { + + @Autowired + private GiveawayService giveawayService; + + @GetMapping("/page") + @Operation(summary = "获取赠品表列表", description = "分页获取赠品表列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, GiveawayDTO giveawayDTO) { + giveawayDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO giveawayPage = giveawayService.listByShopId(pageDTO, giveawayDTO); + return ServerResponseEntity.success(giveawayPage); + } + + @GetMapping + @Operation(summary = "获取赠品表", description = "根据giveawayId获取赠品表") + public ServerResponseEntity getByGiveawayId(@RequestParam Long giveawayId) { + Long shopId = AuthUserContext.get().getTenantId(); + GiveawayVO giveawayVO = giveawayService.getByGiveawayId(giveawayId); + if (!Objects.equals(shopId, giveawayVO.getShopId())) { + throw new LuckException("该赠品信息不属于你的店铺"); + } + return ServerResponseEntity.success(giveawayVO); + } + + @PostMapping + @Operation(summary = "保存赠品表", description = "保存赠品表") + public ServerResponseEntity save(@Valid @RequestBody GiveawayDTO giveawayDTO) { + giveawayDTO.setShopId(AuthUserContext.get().getTenantId()); + giveawayDTO.setGiveawayId(null); + giveawayService.save(giveawayDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新赠品表", description = "更新赠品表") + public ServerResponseEntity update(@Valid @RequestBody GiveawayDTO giveawayDTO) { + giveawayDTO.setShopId(AuthUserContext.get().getTenantId()); + giveawayService.update(giveawayDTO); + return ServerResponseEntity.success(); + } + + + @PutMapping("/change_status") + @Operation(summary = "修改赠品状态", description = "修改赠品状态") + public ServerResponseEntity changeStatus(@RequestParam("status") Integer status, @RequestParam("giveawayId") Long giveawayId) { + giveawayService.changeStatus(giveawayId, status); + return ServerResponseEntity.success(); + } + + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/GiveawaySpuController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/GiveawaySpuController.java new file mode 100644 index 0000000..647687d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/GiveawaySpuController.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.GiveawaySpuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.dto.GiveawaySpuDTO; +import com.tmerclub.cloud.product.service.GiveawaySpuService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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; + +/** + * 赠品套装商品项 + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:59 + */ +@RestController("multishopGiveawaySpuController") +@RequestMapping("/m/giveaway_spu") +@Tag(name = "赠品套装商品项") +public class GiveawaySpuController { + + @Autowired + private GiveawaySpuService giveawaySpuService; + + @GetMapping("/page") + @Operation(summary = "获取赠品套装商品项列表", description = "分页获取赠品套装商品项列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO giveawaySpuPage = giveawaySpuService.page(pageDTO); + return ServerResponseEntity.success(giveawaySpuPage); + } + + @GetMapping("/main_spu_page") + @Operation(summary = "分页获取主赠送商品", description = "分页获取赠品信息") + public ServerResponseEntity> getByGiveawaySpuId(@Valid PageDTO pageDTO, GiveawaySpuDTO giveawaySpuDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + giveawaySpuDTO.setShopId(shopId); + giveawaySpuDTO.setSpuName(giveawaySpuDTO.getName()); + PageVO mainSpuPage = giveawaySpuService.getMainSpuPage(pageDTO, giveawaySpuDTO); + return ServerResponseEntity.success(mainSpuPage); + } + + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockChangeReasonLangController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockChangeReasonLangController.java new file mode 100644 index 0000000..1de8fe1 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockChangeReasonLangController.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.StockChangeReasonLangDTO; +import com.tmerclub.cloud.product.model.StockChangeReasonLang; +import com.tmerclub.cloud.product.service.StockChangeReasonLangService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 出入库原因-国际化 + * + * @author lhd + * @date 2022-06-22 17:14:22 + */ +@RestController("multishopStockChangeReasonLangController") +@RequestMapping("/m/stock_change_reason_lang") +@Tag(name = "出入库原因-国际化") +public class StockChangeReasonLangController { + + @Autowired + private StockChangeReasonLangService stockChangeReasonLangService; + + + @GetMapping("/page") + @Operation(summary = "获取出入库原因-国际化列表", description = "分页获取出入库原因-国际化列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO stockChangeReasonLangPage = stockChangeReasonLangService.page(pageDTO); + return ServerResponseEntity.success(stockChangeReasonLangPage); + } + + @GetMapping + @Operation(summary = "获取出入库原因-国际化", description = "根据stockChangeReasonId获取出入库原因-国际化") + public ServerResponseEntity getByStockChangeReasonId(@RequestParam Long stockChangeReasonId) { + return ServerResponseEntity.success(stockChangeReasonLangService.getByStockChangeReasonId(stockChangeReasonId)); + } + + @PostMapping + @Operation(summary = "保存出入库原因-国际化", description = "保存出入库原因-国际化") + public ServerResponseEntity save(@Valid @RequestBody StockChangeReasonLangDTO stockChangeReasonLangDTO) { + StockChangeReasonLang stockChangeReasonLang = BeanUtil.map(stockChangeReasonLangDTO, StockChangeReasonLang.class); + stockChangeReasonLang.setStockChangeReasonId(null); + stockChangeReasonLangService.save(stockChangeReasonLang); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新出入库原因-国际化", description = "更新出入库原因-国际化") + public ServerResponseEntity update(@Valid @RequestBody StockChangeReasonLangDTO stockChangeReasonLangDTO) { + StockChangeReasonLang stockChangeReasonLang = BeanUtil.map(stockChangeReasonLangDTO, StockChangeReasonLang.class); + stockChangeReasonLangService.update(stockChangeReasonLang); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除出入库原因-国际化", description = "根据出入库原因-国际化id删除出入库原因-国际化") + public ServerResponseEntity delete(@RequestParam Long stockChangeReasonId) { + stockChangeReasonLangService.deleteById(stockChangeReasonId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockPointSkuController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockPointSkuController.java new file mode 100644 index 0000000..3ed58de --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockPointSkuController.java @@ -0,0 +1,96 @@ +package com.tmerclub.cloud.product.controller.multishop; + + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.delivery.feign.StationFeignClient; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.constant.StockModeEnum; +import com.tmerclub.cloud.common.product.dto.SkuStockPointSearchDTO; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.StockPointVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.service.SkuService; +import com.tmerclub.cloud.product.service.SpuService; +import com.tmerclub.cloud.product.service.StockPointSkuService; +import com.tmerclub.cloud.product.service.WarehouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +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.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author lanhai + */ +@RestController("multishopStockPointController") +@RequestMapping("/m/stock_point_sku") +@Tag(name = "商家端库存点关联商品") +public class StockPointSkuController { + @Autowired + private WarehouseService warehouseService; + @Autowired + private StockPointSkuService stockPointSkuService; + @Autowired + private SpuService spuService; + @Autowired + private SkuService skuService; + @DubboReference + private StationFeignClient stationFeignClient; + + @GetMapping("/page") + @Operation(summary = "分页查询库存点商品信息", description = "分页查询库存点商品信息") + public ServerResponseEntity> pageStockPointSpuSku(PageDTO pageDTO, StockPointSkuDTO spuDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + spuDTO.setShopId(shopId); + // 判断是否默认仓库或是共享库存模式的门店,是就获取全部商品 + if (Objects.equals(spuDTO.getType(), 0) || Objects.equals(spuDTO.getStockMode(), StockModeEnum.ALL_STOCK.value())) { + Long warehouseId = warehouseService.getDefaultWarehouseByShopId(shopId, AuthUserContext.get().getSysType()).getWarehouseId(); + spuDTO.setStockPointId(warehouseId); + } + PageVO pageVO = spuService.pageStockPointSpu(pageDTO, spuDTO); + if (CollectionUtil.isEmpty(pageVO.getList())) { + return ServerResponseEntity.success(pageVO); + } + List skuVOList = skuService.listSkuAndStockByStockPointId(spuDTO.getStockPointId(), spuDTO.getInStockPointId()); + Map> skuMap = skuVOList.stream().collect(Collectors.groupingBy(SkuVO::getSpuId)); + for (SpuVO spuVO : pageVO.getList()) { + // TODO stock + spuVO.setSkus(skuMap.get(spuVO.getSpuId())); + } + return ServerResponseEntity.success(pageVO); + } + + @GetMapping("/page_supplier_stock_point_spu") + @Operation(summary = "分页查询供应商库存点商品") + public ServerResponseEntity> pageSupplierStockPointSpu(@Valid PageDTO pageDTO, + SkuStockPointSearchDTO searchDTO) { + searchDTO.setShopId(AuthUserContext.get().getTenantId()); + searchDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + PageVO pageVO = spuService.pageSupplierStockPointSpu(pageDTO, searchDTO); + return ServerResponseEntity.success(pageVO); + } + + @GetMapping("/stock_point") + @Operation(summary = "获取店铺库存点数据") + public ServerResponseEntity pointList() { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + StockPointVO stockPointVO = warehouseService.getWarehousePoint(shopId, sysType); + Integer stationSize = stationFeignClient.getStationSize(shopId); + stockPointVO.setStationSize(stationSize); + return ServerResponseEntity.success(stockPointVO); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/TakeStockController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/TakeStockController.java new file mode 100644 index 0000000..5282914 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/TakeStockController.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.Snowflake; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.TakeStockBillStatus; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.dto.TakeStockDTO; +import com.tmerclub.cloud.product.model.TakeStock; +import com.tmerclub.cloud.product.service.TakeStockService; +import com.tmerclub.cloud.product.vo.TakeStockVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author lhd + * @date 2022-06-22 17:14:22 + */ +@RestController("multishopTakeStockController") +@RequestMapping("/m/take_stock") +@Tag(name = "实物盘点接口") +public class TakeStockController { + + @Autowired + private TakeStockService takeStockService; + @DubboReference + private AccountFeignClient accountFeignClient; + + @GetMapping("/page") + @Operation(summary = "分页查询库存盘点信息", description = "分页查询库存盘点信息") + public ServerResponseEntity> getTakeStockPage(PageDTO pageDTO, TakeStockDTO takeStockDTO) { + takeStockDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO tackStockPage = takeStockService.pageByParam(pageDTO, takeStockDTO); + return ServerResponseEntity.success(tackStockPage); + } + + @GetMapping("/info/{takeStockId}") + @Operation(summary = "根据id查询库存盘点信息", description = "根据id查询库存盘点信息") + public ServerResponseEntity getById(@PathVariable("takeStockId") Long takeStockId) { + return ServerResponseEntity.success(takeStockService.getByTakeStockId(takeStockId)); + } + + @PostMapping + @Operation(summary = "新增盘点", description = "新增盘点") + public ServerResponseEntity save(@RequestBody @Valid TakeStock takeStock) { + if (Objects.isNull(takeStock.getCreateTime())) { + throw new LuckException("盘点开始时间不能为空"); + } + UidInfoBO userInfo = AuthUserContext.get(); + AuthAccountVO accountVO = accountFeignClient.getAccountInfoByTenantId(userInfo.getTenantId(), userInfo.getSysType()).getData(); + takeStock.setTakeStockNo(StringUtils.join("TSC", String.valueOf(new Snowflake().nextId()))); + takeStock.setShopId(userInfo.getTenantId()); + takeStock.setBillStatus(TakeStockBillStatus.TAKING.value()); + takeStock.setMaker(accountVO.getUserId()); + takeStock.setMakerMobile(accountVO.getPhone()); + takeStockService.save(takeStock); + return ServerResponseEntity.success(takeStock.getTakeStockId()); + } + + @PutMapping + @Operation(summary = "保存草稿", description = "保存草稿") + public ServerResponseEntity updateById(@RequestBody @Valid TakeStockDTO takeStockDTO) { + takeStockDTO.setShopId(AuthUserContext.get().getTenantId()); + if (CollectionUtil.isEmpty(takeStockDTO.getTakeStockSpuList())) { + throw new LuckException("盘点商品不能为空"); + } + takeStockService.updateTakeStock(takeStockDTO); + return ServerResponseEntity.success(Boolean.TRUE); + } + + @PutMapping("/finish_inventory") + @Operation(summary = "完成盘点", description = "完成盘点") + public ServerResponseEntity finishInventory(@RequestBody @Valid TakeStockDTO takeStockDTO) { + UidInfoBO userInfo = AuthUserContext.get(); + AuthAccountVO accountVO = accountFeignClient.getAccountInfoByTenantId(userInfo.getTenantId(), userInfo.getSysType()).getData(); + takeStockDTO.setShopId(userInfo.getTenantId()); + takeStockDTO.setMaker(accountVO.getUserId()); + takeStockDTO.setMakerMobile(accountVO.getPhone()); + if (CollectionUtil.isEmpty(takeStockDTO.getTakeStockSpuList())) { + throw new LuckException("盘点商品不能为空"); + } + takeStockService.finishTakeStock(takeStockDTO); + return ServerResponseEntity.success(Boolean.TRUE); + } + + @PutMapping("/voided_inventory/{takeStockId}") + @Operation(summary = "作废盘点", description = "作废盘点") + public ServerResponseEntity voidedInventory(@PathVariable("takeStockId") Long takeStockId) { + TakeStockVO takeStockVO = takeStockService.getByTakeStockId(takeStockId); + if (!Objects.equals(takeStockVO.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException("无权限作废"); + } + TakeStock takeStock = new TakeStock(); + takeStock.setTakeStockId(takeStockId); + takeStock.setBillStatus(TakeStockBillStatus.VOIDED.value()); + takeStockService.update(takeStock); + return ServerResponseEntity.success(true); + } + + @GetMapping("/export_take_stock") + @Operation(summary = "实物盘点Excel导出", description = "实物盘点Excel导出") + public void exportTakeStock(TakeStockDTO takeStockDTO, HttpServletResponse response) { + takeStockDTO.setShopId(AuthUserContext.get().getTenantId()); + takeStockService.exportExcel(takeStockDTO, response); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/TakeStockSpuController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/TakeStockSpuController.java new file mode 100644 index 0000000..e230440 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/TakeStockSpuController.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import com.alibaba.excel.EasyExcel; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.TakeStockSpuDTO; +import com.tmerclub.cloud.product.listener.TakeStockSpuExcelListener; +import com.tmerclub.cloud.product.model.TakeStock; +import com.tmerclub.cloud.product.model.TakeStockSpu; +import com.tmerclub.cloud.product.service.TakeStockService; +import com.tmerclub.cloud.product.service.TakeStockSpuService; +import com.tmerclub.cloud.product.vo.TakeStockSpuExcelVO; +import com.tmerclub.cloud.product.vo.TakeStockSpuImportVO; +import com.tmerclub.cloud.product.vo.TakeStockSpuVO; +import com.tmerclub.cloud.product.vo.TakeStockVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 盘点商品列表 + * + * @author lhd + * @date 2022-06-22 17:14:22 + */ +@RestController("multishopTakeStockSpuController") +@RequestMapping("/m/take_stock_spu") +@Tag(name = "盘点商品列表") +public class TakeStockSpuController { + + @Autowired + private TakeStockService takeStockService; + + @Autowired + private TakeStockSpuService takeStockSpuService; + + + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('shop:takeStockSpu:page')") + @Operation(summary = "获取盘点商品列表列表", description = "分页获取盘点商品列表列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO takeStockSpuPage = takeStockSpuService.page(pageDTO); + return ServerResponseEntity.success(takeStockSpuPage); + } + + @GetMapping("/list_by_take_stock_id") + @Operation(summary = "通过takeStockId获取盘点商品列表", description = "通过takeStockId获取盘点商品列表") + public ServerResponseEntity> listByTakeStockId(Long takeStockId) { + List takeStockSpuVOList = takeStockSpuService.listByTakeStockId(takeStockId); + return ServerResponseEntity.success(takeStockSpuVOList); + } + + @GetMapping + @Operation(summary = "获取盘点商品信息", description = "根据takeStockSpuId获取盘点商品信息") + public ServerResponseEntity getByTakeStockSpuId(@RequestParam Long takeStockSpuId) { + return ServerResponseEntity.success(takeStockSpuService.getByTakeStockSpuId(takeStockSpuId)); + } + + @PostMapping + @PreAuthorize("@pms.hasPermission('shop:takeStockSpu:save')") + @Operation(summary = "保存盘点商品列表", description = "保存盘点商品列表") + public ServerResponseEntity save(@Valid @RequestBody TakeStockSpuDTO takeStockSpuDTO) { + TakeStockSpu takeStockSpu = BeanUtil.map(takeStockSpuDTO, TakeStockSpu.class); + takeStockSpu.setTakeStockSpuId(null); + takeStockSpuService.save(takeStockSpu); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新盘点商品列表", description = "更新盘点商品列表") + public ServerResponseEntity update(@Valid @RequestBody TakeStockSpuDTO takeStockSpuDTO) { + TakeStockSpu takeStockSpu = BeanUtil.map(takeStockSpuDTO, TakeStockSpu.class); + takeStockSpuService.update(takeStockSpu); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除盘点商品列表", description = "根据盘点商品列表id删除盘点商品列表") + public ServerResponseEntity delete(@RequestParam Long takeStockSpuId) { + takeStockSpuService.deleteById(takeStockSpuId); + return ServerResponseEntity.success(); + } + + @GetMapping("/download_model") + @Operation(summary = "实物盘点商品Excel模板下载", description = "实物盘点商品Excel模板下载") + public void downLoadModel(HttpServletResponse response) { + takeStockSpuService.downloadModel(response); + } + + @Operation(summary = "导入盘点商品", description = "导入盘点商品") + @PostMapping("/import_excel") + public ServerResponseEntity importExcel(@RequestParam("excelFile") MultipartFile excelFile, + @RequestParam("takeStockId") Long takeStockId) { + if (Objects.isNull(excelFile)) { + throw new LuckException("yami.network.busy"); + } + if (Objects.isNull(takeStockId)) { + throw new LuckException("yami.supplier.not.null"); + } + TakeStockSpuImportVO takeStockSpuImportVO = new TakeStockSpuImportVO(); + try { + // 错误信息集合 + List errorList = new ArrayList<>(Constant.INITIAL_CAPACITY); + EasyExcel.read(excelFile.getInputStream(), TakeStockSpuExcelVO.class, new TakeStockSpuExcelListener(takeStockSpuService, errorList, takeStockId, takeStockSpuImportVO)).sheet().doRead(); + } catch (IOException e) { + throw new LuckException(e.getMessage()); + } + return ServerResponseEntity.success(takeStockSpuImportVO); + } + + @GetMapping("/export_take_stock_spu") + @Operation(summary = "实物盘点商品Excel导出", description = "实物盘点Excel导出") + public void exportTakeStock(Long takeStockId, HttpServletResponse response) { + if (takeStockId == null) { + throw new LuckException("盘点id不能为空"); + } + TakeStockVO takeStock = takeStockService.getByTakeStockId(takeStockId); + if (takeStock == null) { + throw new LuckException("实物盘点不存在"); + } + takeStockSpuService.exportExcel(takeStockId, response); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/BrandController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/BrandController.java new file mode 100644 index 0000000..6a132fd --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/BrandController.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.platform; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.vo.BrandVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.dto.BrandDTO; +import com.tmerclub.cloud.product.dto.BrandSigningDTO; +import com.tmerclub.cloud.product.service.BrandService; +import com.tmerclub.cloud.product.service.BrandShopService; +import com.tmerclub.cloud.product.service.CategoryBrandService; +import com.tmerclub.cloud.product.service.CategoryService; +import com.tmerclub.cloud.product.vo.BrandSigningVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 品牌信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@RestController("platformBrandController") +@RequestMapping("/p/brand") +@Tag(name = "platform-品牌信息") +public class BrandController { + + @Autowired + private BrandService brandService; + + @Autowired + private CategoryService categoryService; + + @Autowired + private CategoryBrandService categoryBrandService; + + @Autowired + private BrandShopService brandShopService; + + @GetMapping("/page") + @Operation(summary = "获取品牌信息列表", description = "分页获取品牌信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, BrandDTO brandDTO) { + brandDTO.setShopId(Constant.PLATFORM_SHOP_ID); + PageVO brandPage = brandService.page(pageDTO, brandDTO); + return ServerResponseEntity.success(brandPage); + } + + @GetMapping + @Operation(summary = "获取品牌信息", description = "根据brandId获取品牌信息") + public ServerResponseEntity getByBrandId(@RequestParam Long brandId) { + BrandVO brand = brandService.getInfo(brandId); + categoryService.getPathNames(brand.getCategories()); + return ServerResponseEntity.success(brand); + } + + @PostMapping + @Operation(summary = "保存品牌信息", description = "保存品牌信息") + public ServerResponseEntity save(@Valid @RequestBody BrandDTO brandDTO) { + brandDTO.setShopId(Constant.PLATFORM_SHOP_ID); + brandService.save(brandDTO); + // 清除缓存 + // 获取当前节点所有父节点的分类ids,以及当前分类节点的父级节点的父级几点的分类ids + List categoryIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List parentCategoryIds = categoryService.getParentIdsByCategoryId(brandDTO.getCategoryIds()); + if (CollUtil.isNotEmpty(parentCategoryIds)) { + categoryIds = parentCategoryIds; + } + if (CollUtil.isNotEmpty(brandDTO.getCategoryIds())) { + categoryIds.addAll(brandDTO.getCategoryIds()); + } + brandService.removeCache(categoryIds); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新品牌信息", description = "更新品牌信息") + public ServerResponseEntity update(@Valid @RequestBody BrandDTO brandDTO) { + // 找出所有关联分类的进行清除 + List categoryIds = categoryBrandService.getCategoryIdBrandId(brandDTO.getBrandId()); + brandService.update(brandDTO); + if (CollUtil.isNotEmpty(brandDTO.getCategoryIds())) { + categoryIds.addAll(brandDTO.getCategoryIds()); + } + // 找出分类的第一级进行清除缓存 + // 获取当前节点所有父节点的分类ids,以及当前分类节点的父级节点的父级几点的分类ids + List parentCategoryIds = categoryService.getParentIdsByCategoryId(categoryIds); + if (CollUtil.isNotEmpty(parentCategoryIds)) { + categoryIds.addAll(parentCategoryIds); + } + + // 清除缓存 + brandService.removeCache(categoryIds); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除品牌信息", description = "根据品牌信息id删除品牌信息") + public ServerResponseEntity delete(@RequestParam Long brandId) { + List categoryIds = categoryBrandService.getCategoryIdBrandId(brandId); + brandService.deleteById(brandId); + // 清除缓存 + // 获取当前节点所有父节点的分类ids,以及当前分类节点的父级节点的父级几点的分类ids + List parentCategoryIds = categoryService.getParentIdsByCategoryId(categoryIds); + if (CollUtil.isNotEmpty(parentCategoryIds)) { + categoryIds.addAll(parentCategoryIds); + } + brandService.removeCache(categoryIds); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_brand_status") + @Operation(summary = "更新品牌状态(启用或禁用)", description = "更新品牌状态(启用或禁用)") + public ServerResponseEntity updateBrandStatus(@RequestBody BrandDTO brandDTO) { + if (Objects.isNull(brandDTO.getStatus())) { + throw new LuckException("状态不能为空"); + } + if (Objects.isNull(brandDTO.getBrandId())) { + throw new LuckException("品牌id不能为空"); + } + brandService.updateBrandStatus(brandDTO); + // 清楚缓存 + List categoryIds = categoryBrandService.getCategoryIdBrandId(brandDTO.getBrandId()); + // 获取当前节点所有父节点的分类ids,以及当前分类节点的父级节点的父级几点的分类ids + List parentCategoryIds = categoryService.getParentIdsByCategoryId(categoryIds); + if (CollUtil.isNotEmpty(parentCategoryIds)) { + categoryIds.addAll(parentCategoryIds); + } + brandService.removeCache(CollUtil.isNotEmpty(categoryIds) ? categoryIds : new ArrayList<>(0)); + return ServerResponseEntity.success(); + } + + @GetMapping("/signing_info_by_shop_id") + @Operation(summary = "根据店铺id获取签约的品牌列表", description = "根据店铺id获取签约的品牌列表") + @Parameter(name = "sysType", description = "系统类型 0.普通用户系统 1.商家端 2.平台端 3.供应商端") + public ServerResponseEntity signingInfoByShopId(@RequestParam Long shopId, @RequestParam("sysType") Integer sysType) { + sysType = Objects.isNull(sysType) ? AuthUserContext.get().getSysType() : sysType; + BrandSigningVO brandSigningVO = brandShopService.listSigningByShopId(shopId, sysType); + return ServerResponseEntity.success(brandSigningVO); + } + + @PutMapping("/signing") + @Operation(summary = "根据店铺id更新店铺下的签约品牌", description = "根据店铺id更新店铺下的签约品牌") + public ServerResponseEntity signingBrands(@RequestBody BrandSigningDTO brandSigningDTO, @RequestParam("shopId") Long shopId, @RequestParam("sysType") Integer sysType) { + brandShopService.signingBrands(brandSigningDTO, shopId, sysType); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuController.java new file mode 100644 index 0000000..b3b6aac --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuController.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.platform; + +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.constant.SupplierSpuType; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.product.service.SpuExcelService; +import com.tmerclub.cloud.product.service.SpuService; +import com.tmerclub.cloud.product.vo.PlatformSpuExcelVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/7/19 16:42 + */ +@RestController("platformSpuController") +@RequestMapping("/p/spu") +@Tag(name = "platform-spu信息") +public class SpuController { + + @Autowired + private SpuService spuService; + @Autowired + private SpuExcelService spuExcelService; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + + @PutMapping("/to_top") + @Operation(summary = "通过商品id设置是否置顶", description = "通过商品id设置是否置顶") + public ServerResponseEntity toTopBySpuId(@RequestParam("spuId") Long spuId) { + SpuVO spuVO = spuService.getBySpuId(spuId); + if (!Objects.equals(spuVO.getStatus(), StatusEnum.ENABLE.value()) && Objects.equals(spuVO.getIsTop(), StatusEnum.DISABLE.value())) { + throw new LuckException("只能置顶已上架的商品"); + } + spuService.toTopBySpuId(spuId); + return ServerResponseEntity.success(); + } + + @PostMapping("/score_save") + @Operation(summary = "保存积分spu信息", description = "保存积分spu信息") + public ServerResponseEntity save(@Valid @RequestBody SpuDTO spuDTO) { + // 发布商品时,需要根据店铺状态判断是否可以发布商品 + ServerResponseEntity shopRequest = shopDetailFeignClient.getShopByShopId(AuthUserContext.get().getTenantId()); + EsShopDetailBO shopDetail = shopRequest.getData(); + if (Objects.equals(shopDetail.getShopStatus(), ShopStatus.OFFLINE.value())) { + throw new LuckException("店铺处于违规下线状态,不能发布新商品"); + } + spuDTO.setShopCategoryId(Constant.DEFAULT_ID); + spuDTO.setSpuType(SpuType.SCORE.value()); + spuDTO.setStatus(StatusEnum.ENABLE.value()); + spuDTO.setSupplierSpuType(SupplierSpuType.NO.value()); + spuDTO.setShopId(0L); + spuService.save(spuDTO); + return ServerResponseEntity.success(spuDTO.getSpuId()); + } + + @PutMapping("/auditSpu") + @Operation(summary = "商品审核", description = "商品审核") + public ServerResponseEntity auditSpu(@RequestBody OfflineHandleEventDTO eventDTO) { + eventDTO.setHandlerId(AuthUserContext.get().getUserId()); + spuService.auditSpu(eventDTO); + // 移除缓存 + spuService.removeSpuCacheBySpuId(eventDTO.getHandleId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/sold_excel") + @Operation(summary = "导出excel", description = " 导出商品excel") + public ServerResponseEntity spuSoldExcel(HttpServletResponse response, @RequestBody ProductSearchDTO productSearchDTO) { + List list = spuExcelService.excelPlatformSpuList(productSearchDTO); + ExcelUtil.soleExcel(response, list, PlatformSpuExcelVO.EXCEL_NAME, PlatformSpuExcelVO.MERGE_ROW_INDEX, PlatformSpuExcelVO.MERGE_COLUMN_INDEX, PlatformSpuExcelVO.class); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuTagController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuTagController.java new file mode 100644 index 0000000..8825d5d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuTagController.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.platform; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.SpuTagDTO; +import com.tmerclub.cloud.product.model.SpuTag; +import com.tmerclub.cloud.product.service.SpuService; +import com.tmerclub.cloud.product.service.SpuTagReferenceService; +import com.tmerclub.cloud.product.service.SpuTagService; +import com.tmerclub.cloud.product.vo.SpuTagVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 商品分组表 + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +@RestController("platformSpuTagController") +@RequestMapping("/p/spu_tag") +@Tag(name = "platform-商品分组表") +public class SpuTagController { + + @Autowired + private SpuTagService spuTagService; + + @Autowired + private SpuTagReferenceService spuTagReferenceService; + + + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + + @Autowired + private SpuService spuService; + + @GetMapping("/page") + @Operation(summary = "获取商品分组表列表", description = "分页获取商品分组表列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, SpuTagDTO spuTagDTO) { + spuTagDTO.setShopId(Constant.PLATFORM_SHOP_ID); + PageVO spuTagPage = spuTagService.pageByTitle(pageDTO, spuTagDTO); + return ServerResponseEntity.success(spuTagPage); + } + + @GetMapping("/info/{id}") + @Operation(summary = "获取商品分组", description = "根据id获取商品分组") + public ServerResponseEntity getById(@PathVariable("id") Long id) { + return ServerResponseEntity.success(spuTagService.getById(id)); + } + + @PostMapping + @Operation(summary = "保存商品分组表", description = "保存商品分组表") + public ServerResponseEntity save(@Valid @RequestBody SpuTagDTO spuTagDTO) { + spuTagDTO.setShopId(Constant.PLATFORM_SHOP_ID); + // 查看是否相同的标签 + List list = spuTagService.listByTitle(spuTagDTO); + if (CollectionUtil.isNotEmpty(list)) { + // 分组名称已存在,不能添加相同的分组 + throw new LuckException("分组名称已存在,不能添加相同的分组"); + } + SpuTag spuTag = BeanUtil.map(spuTagDTO, SpuTag.class); + spuTag.setId(null); + spuTag.setProdCount(0L); + spuTagService.save(spuTag); + spuTagService.removeCacheByShopId(AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新商品分组表", description = "更新商品分组表") + public ServerResponseEntity update(@Valid @RequestBody SpuTagDTO spuTagDTO) { + SpuTag spuTag = BeanUtil.map(spuTagDTO, SpuTag.class); + spuTagDTO.setShopId(Constant.PLATFORM_SHOP_ID); + // 查看是否相同的标签 + List list = spuTagService.listByTitle(spuTagDTO); + if (CollectionUtil.isNotEmpty(list)) { + // 分组名称已存在,不能添加相同的分组 + throw new LuckException("分组名称已存在,不能添加相同的分组"); + } + spuTagService.update(spuTag); + spuTagService.removeCacheByShopId(AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除商品分组表", description = "根据商品分组表id删除商品分组表") + public ServerResponseEntity delete(@RequestParam Long id) { + SpuTagVO spuTagVO = spuTagService.getById(id); + if (spuTagVO.getIsDefault() != 0) { + // 默认标签不能删除 + throw new LuckException("默认标签不能删除"); + } + // 校验分组是否已经使用过 + int count = spuTagReferenceService.countByStatusAndTagId(StatusEnum.ENABLE.value(), id); + if (count > 0) { + throw new LuckException("该分组还存在商品,无法进行删除操作"); + } + spuTagService.deleteById(id); + spuTagService.removeCacheByShopId(AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + /** + * 获取没有参与当前分组的商品 + */ + @GetMapping("/get_not_tag_prod_page") + @Operation(summary = "获取非本分组的商品列表", description = "根据tagId,获取非本分组的商品列表") + public ServerResponseEntity> getNotTagProdPage(@Valid PageDTO pageDTO, ProductSearchDTO productSearchDTO) { + List spuIds = spuTagReferenceService.spuIdsByTagId(productSearchDTO.getTagId()); + ServerResponseEntity> response = shopDetailFeignClient.getShopIdsByShopStatus(ShopStatus.STOP.value()); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + List shopIds = response.getData(); + if (CollUtil.isNotEmpty(shopIds)) { + List enableSpuIds = spuService.listSpuIdsByShopIds(shopIds); + if (CollUtil.isNotEmpty(enableSpuIds)) { + spuIds.addAll(enableSpuIds); + } + } + if (CollUtil.isNotEmpty(spuIds)) { + productSearchDTO.setSpuIdsExclude(spuIds); + } + productSearchDTO.setSpuStatus(StatusEnum.ENABLE.value()); + productSearchDTO.setSpuType(SpuType.NORMAL.value()); + //过滤掉供应商商品 + productSearchDTO.setIsSupplierType(1); + productSearchDTO.setTagId(null); + ServerResponseEntity> responseEntity = searchSpuFeignClient.adminPage(productSearchDTO); + return ServerResponseEntity.success(responseEntity.getData()); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/BrandController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/BrandController.java new file mode 100644 index 0000000..b1a460f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/BrandController.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.supplier; + +import com.tmerclub.cloud.common.constant.IsPassShopEnum; +import com.tmerclub.cloud.common.product.vo.BrandVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.dto.BrandDTO; +import com.tmerclub.cloud.product.dto.BrandSigningDTO; +import com.tmerclub.cloud.product.service.BrandService; +import com.tmerclub.cloud.product.service.BrandShopService; +import com.tmerclub.cloud.product.vo.BrandSigningVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/4/30 13:26 + */ +@RestController("supplierBrandController") +@RequestMapping("/s/apply_supplier/brand") +@Tag(name = "supplier-品牌信息") +public class BrandController { + + @Autowired + private BrandShopService brandShopService; + + @Autowired + private BrandService brandService; + + @PostMapping("/signing") + @Operation(summary = "签约品牌", description = "签约品牌") + public ServerResponseEntity signingBrands(@Valid @RequestBody BrandSigningDTO brandSigningDTO) { + Long supplierId = AuthUserContext.getSupplierId(); + Integer sysType = AuthUserContext.get().getSysType(); + if (Objects.equals(AuthUserContext.get().getIsPassShop(), IsPassShopEnum.YES.value())) { + brandSigningDTO.setCustomizeBrandList(new ArrayList<>(0)); + } + brandShopService.signingBrands(brandSigningDTO, supplierId, sysType); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_signing") + @Operation(summary = "获取店铺下已签约的品牌列表", description = "获取店铺下已签约的品牌列表") + public ServerResponseEntity listSigning() { + Long supplierId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + BrandSigningVO brandSigningVO = brandShopService.listSigningByShopId(supplierId, sysType); + return ServerResponseEntity.success(brandSigningVO); + } + + @GetMapping("/list_available_by_category_and_name") + @Parameters({ + @Parameter(name = "categoryId", description = "分类id"), + @Parameter(name = "brandName", description = "品牌名称") + }) + @Operation(summary = "根据分类id与品牌名称获取分类下的品牌与店铺签约的品牌", description = "根据分类id与品牌名称获取分类下的品牌与店铺签约的品牌") + public ServerResponseEntity> listAvailableBrandByCategoryIdAndBrandName(@RequestParam Long categoryId, @RequestParam(defaultValue = "") String brandName) { + Long supplierId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + return ServerResponseEntity.success(brandService.listAvailableBrandByCategoryIdAndBrandNameAndShopId(categoryId, brandName, supplierId, sysType)); + } + + @DeleteMapping("/delete_signing_brand") + @Operation(summary = "根据签约信息Id删除签约品牌", description = "根据签约信息Id删除签约品牌") + public ServerResponseEntity deleteSigningCategory(@RequestParam("brandShopId") Long brandShopId) { + brandShopService.deleteSigningBrand(brandShopId); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_apply_signing_brand") + @Operation(summary = "获取可以签约的品牌列表(已经签约的品牌不会返回)", description = "获取可以签约的品牌列表(已经签约的品牌不会返回)") + public ServerResponseEntity> listApplySigningBrand(BrandDTO brandDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + return ServerResponseEntity.success(brandService.listApplySigningBrand(brandDTO, shopId, sysType)); + } + + @PostMapping("/add_signing_brand") + @Operation(summary = "新增签约品牌", description = "新增签约品牌") + public ServerResponseEntity addSigningBrand(@Valid @RequestBody BrandSigningDTO brandSigningDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + brandShopService.addSigningBrand(brandSigningDTO, shopId, sysType); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuCommController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuCommController.java new file mode 100644 index 0000000..3fba643 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuCommController.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.supplier; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.dto.SpuCommDTO; +import com.tmerclub.cloud.product.service.SpuCommService; +import com.tmerclub.cloud.product.vo.SpuCommVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 商品评论 + * + * @author YXF + * @date 2021-01-11 13:47:33 + */ +@RestController("supplierSpuCommController") +@RequestMapping("/s/spu_comm") +@Tag(name = "商品评论") +public class SpuCommController { + + @Autowired + private SpuCommService spuCommService; + + + @GetMapping("/page") + @Operation(summary = "获取商品评论列表", description = "分页获取商品评论列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, SpuCommDTO spuCommDTO) { + spuCommDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO spuCommPage = spuCommService.page(pageDTO, spuCommDTO); + return ServerResponseEntity.success(spuCommPage); + } + + @GetMapping + @Operation(summary = "获取商品评论", description = "根据spuCommId获取商品评论") + public ServerResponseEntity getBySpuCommId(@RequestParam Long spuCommId) { + return ServerResponseEntity.success(spuCommService.getBySpuCommId(spuCommId)); + } + + @PutMapping + @Operation(summary = "更新商品评论", description = "更新商品评论") + public ServerResponseEntity update(@Valid @RequestBody SpuCommDTO spuComm) { + spuCommService.update(spuComm); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuController.java new file mode 100644 index 0000000..7765513 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuController.java @@ -0,0 +1,470 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.supplier; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.TypeReference; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.api.supplier.bo.SupplierDetailBO; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.IsSynUpdate; +import com.tmerclub.cloud.common.product.constant.SpuStatus; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.constant.SupplierSpuType; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuAttrValueVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.product.dto.SpuPageSearchDTO; +import com.tmerclub.cloud.product.listener.SupplierProdExcelListener; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.common.util.SheetUtil; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.vo.CategoryShopVO; +import com.tmerclub.cloud.product.vo.SpuExcelVO; +import com.tmerclub.cloud.product.vo.SupplierProdExcelVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * spu信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@RestController("supplierSpuController") +@RequestMapping("/s/spu") +@Tag(name = "supplier-spu信息") +public class SpuController { + + @Autowired + private SpuService spuService; + @Autowired + private SkuComboService skuComboService; + @Autowired + private SpuExcelService spuExcelService; + @Autowired + private SkuService skuService; + @Autowired + private CategoryService categoryService; + @Autowired + private AttrService attrService; + @Autowired + private BrandService brandService; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @Autowired + private SpuAttrValueService spuAttrValueService; + @Autowired + private CategoryShopService categoryShopService; + @Autowired + private SpuSupplierChangeLogService spuSupplierChangeLogService; + @DubboReference + private ConfigFeignClient configFeignClient; + @Autowired + private ShopCartService shopCartService; + + + @GetMapping + @Operation(summary = "获取spu信息", description = "根据spuId获取spu信息") + public ServerResponseEntity getBySpuId(@RequestParam Long spuId) { + // 获取spu信息 + SpuVO spuVO = spuService.getBySpuId(spuId); + if (!Objects.equals(spuVO.getSupplierId(), AuthUserContext.get().getTenantId()) && !Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + ProductLangUtil.spu(spuVO); + ProductLangUtil.spuDetail(spuVO); + List spuAttrsBySpuId = spuAttrValueService.getSpuAttrsBySpuId(spuId); + spuVO.setSpuAttrValues(spuAttrsBySpuId); + // 物流模板 + SpuVO.DeliveryModeVO deliveryModeVO = Json.parseObject(spuVO.getDeliveryMode(), SpuVO.DeliveryModeVO.class); + spuVO.setDeliveryModeVO(deliveryModeVO); + // 品牌信息 + spuVO.setBrand(brandService.getByBrandId(spuVO.getBrandId())); + // sku信息 + spuVO.setSkus(skuService.listSkuAllInfoBySpuId(spuId, spuVO, false)); + spuService.loadSpuAttrs(spuVO); + + // 插入商品库存和销量 + int totalStock = 0; + int saleNum = 0; + for (SkuVO skus : spuVO.getSkus()) { + totalStock += Objects.isNull(skus.getStock()) ? 0 : skus.getStock(); + saleNum += Objects.isNull(skus.getSaleNum()) ? 0 : skus.getSaleNum(); + } + spuVO.setTotalStock(totalStock); + spuVO.setSaleNum(saleNum); + // 平台分类、供应商分类信息 + spuVO.setCategory(categoryService.getInfo(spuVO.getCategoryId())); + ProductLangUtil.category(spuVO.getCategory()); + if (Objects.nonNull(spuVO.getSupplierCategoryId()) && !Objects.equals(spuVO.getSupplierCategoryId(), Constant.DEFAULT_ID)) { + spuVO.setSupplierCategory(categoryService.getInfo(spuVO.getSupplierCategoryId())); + ProductLangUtil.category(spuVO.getSupplierCategory()); + } + return ServerResponseEntity.success(spuVO); + } + + + @PostMapping + @Operation(summary = "保存spu信息", description = "保存spu信息") + public ServerResponseEntity save(@Valid @RequestBody SpuDTO spuDTO) { + spuDTO.setStatus(StatusEnum.ENABLE.value()); + spuDTO.setSpuType(SpuType.NORMAL.value()); + spuDTO.setSupplierSpuType(SupplierSpuType.YES.value()); +// spuDTO.setSpuMold(0); + spuService.save(spuDTO); + return ServerResponseEntity.success(spuDTO.getSpuId()); + } + + @PutMapping + @Operation(summary = "更新spu信息", description = "更新spu信息") + public ServerResponseEntity update(@Valid @RequestBody SpuDTO spuDTO) { + SpuVO spuDb = spuService.getBySpuId(spuDTO.getSpuId()); + if (!Objects.equals(spuDb.getSupplierId(), AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } +// spuDTO.setSpuMold(0); + spuService.update(spuDTO); + // 清除购物车数量缓存 + shopCartService.removeShopCartItemCacheBySupplierSpuIds(Collections.singletonList(spuDTO.getSpuId())); + return ServerResponseEntity.success(); + } + + + @DeleteMapping + @Operation(summary = "删除spu信息", description = "根据spu信息id删除spu信息") + public ServerResponseEntity delete(@RequestParam Long spuId) { + SpuVO spuDb = spuService.getBySpuId(spuId); + Long supplierId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(spuDb.getSupplierId(), supplierId) && !Objects.equals(supplierId, Constant.PLATFORM_SHOP_ID)) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + spuService.deleteById(spuId); + // 清除购物车数量缓存 + shopCartService.removeShopCartItemCacheBySupplierSpuIds(Collections.singletonList(spuId)); + return ServerResponseEntity.success(); + } + + @DeleteMapping("/batch") + @Operation(summary = "批量删除spu信息", description = "根据spu信息id删除spu信息") + public ServerResponseEntity delete(@RequestParam List spuIds) { + Long supplierId = AuthUserContext.get().getTenantId(); + if (CollUtil.isEmpty(spuIds)) { + throw new LuckException("商品id不能为空"); + } + for (Long spuId : spuIds) { + SpuVO spuDb = spuService.getBySpuId(spuId); + if (!Objects.equals(spuDb.getSupplierId(), supplierId) && !Objects.equals(supplierId, Constant.PLATFORM_SHOP_ID)) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + spuService.deleteById(spuId); + } + // 清除购物车数量缓存 + shopCartService.removeShopCartItemCacheBySupplierSpuIds(spuIds); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_spu_data") + @Operation(summary = "修改spu(名称、价格、库存、序号)信息", description = "更新spu信息") + public ServerResponseEntity updateSpuData(@RequestBody SpuDTO spuDTO) { + SpuVO spuDb = spuService.getBySpuId(spuDTO.getSpuId()); + if (!Objects.equals(spuDb.getSupplierId(), AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + spuService.updateSpuOrSku(spuDTO); + // 清除购物车数量缓存 + shopCartService.removeShopCartItemCacheBySupplierSpuIds(Collections.singletonList(spuDTO.getSpuId())); + return ServerResponseEntity.success(); + } + + + /** + * 更新商品状态 + */ + @PutMapping("/prod_status") + @Operation(summary = "商品上下架", description = "商品上下架") + public ServerResponseEntity spuChangeStatus(@RequestBody SpuPageSearchDTO spuDTO) { + if (Objects.nonNull(spuDTO.getSpuId())) { + spuDTO.setSpuIds(Collections.singletonList(spuDTO.getSpuId())); + } + if (CollUtil.isEmpty(spuDTO.getSpuIds())) { + throw new LuckException("商品id不能为空"); + } + Long shopId = AuthUserContext.get().getTenantId(); + List spuList = spuService.listSpuBySpuIds(spuDTO.getSpuIds()); + + if (Objects.equals(spuDTO.getStatus(), StatusEnum.ENABLE.value())) { + // 上架商品时,需要根据供应商状态判断是否可以上架商品 + ServerResponseEntity supplierRequest = supplierDetailFeignClient.getSupplierBySupplierId(shopId); + SupplierDetailBO supplierDetailBO = supplierRequest.getData(); + if (!Objects.equals(supplierDetailBO.getSupplierStatus(), ShopStatus.OPEN.value())) { + // 合同到期 + if (supplierDetailBO.getContractEndTime() != null && supplierDetailBO.getContractEndTime().compareTo(new Date()) < 0) { + throw new LuckException("店铺有效期已过,不能进行此操作,请联系管理员后重试"); + } + throw new LuckException("供应商处于违规下线状态,不能上架商品"); + } + } + for (SpuVO spuVO : spuList) { + if (Objects.equals(spuDTO.getStatus(), StatusEnum.ENABLE.value())) { + CategoryVO category = categoryService.getInfo(spuVO.getCategoryId()); + if (category == null || Objects.equals(category.getStatus(), StatusEnum.DISABLE.value())) { + // 平台分类处于下线中,商品不能上架,请联系管理员后再进行操作 + throw new LuckException("商品【" + spuVO.getName() + "】的平台分类处于下线中,商品不能上架,请联系管理员后再进行操作"); + } + //供应商没有店铺分类 + if (!Objects.equals(spuVO.getSpuType(), SpuType.SCORE.value()) && !Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.SUPPLIER.value())) { + CategoryVO shopCategory = categoryService.getById(spuVO.getShopCategoryId()); + if (shopCategory == null || Objects.equals(shopCategory.getStatus(), StatusEnum.DISABLE.value())) { + // 本店分类处于下线中,商品不能上架 + throw new LuckException("商品【" + spuVO.getName() + "】的本店分类处于下线中,商品不能上架"); + } + } + // 如果商品正在下架,但又是活动商品,代表这个商品所属的活动被平台下架了 + if (Objects.equals(spuVO.getSpuType(), SpuType.SECKILL.value())) { + throw new LuckException("商品【" + spuVO.getName() + "】所属的秒杀活动处于违规下线中,商品不能上架"); + } + if (Objects.equals(spuVO.getSpuType(), SpuType.GROUP.value())) { + throw new LuckException("商品【" + spuVO.getName() + "】所属的团购活动处于违规下线中,商品不能上架"); + } + } + if (!Objects.equals(spuVO.getSupplierId(), shopId) && !Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + } + // 是否开启“商品发布时审核”,若开启,上架修改状态为“待审核”【平台端不用审核】 + String prodSwitchConfig = configFeignClient.getConfig(Constant.SPU_SWITCH_CONFIG).getData(); + if (SpuStatus.PUT_SHELF.value().equals(spuDTO.getStatus()) + && !SysTypeEnum.PLATFORM.value().equals(AuthUserContext.get().getSysType()) + && !ObjectUtils.isEmpty(prodSwitchConfig)) { + Boolean spuAudit = JSON.parseObject(prodSwitchConfig, new TypeReference>() { + }) + .getOrDefault("spuAudit", false); + if (spuAudit) { + spuDTO.setStatus(SpuStatus.PUBLISH_WAIT_AUDIT.value()); + } + } + spuBatchUpdateStatus(spuDTO); + for (SpuVO spuVO : spuList) { + spuService.removeSpuCacheBySpuId(spuVO.getSpuId()); + } + // 清除购物车数量缓存 + shopCartService.removeShopCartItemCacheBySupplierSpuIds(spuDTO.getSpuIds()); + return ServerResponseEntity.success(); + } + + @GetMapping("/sold_excel") + @Operation(summary = "导出excel", description = "导出商品excel") + public ServerResponseEntity spuSoldExcel(HttpServletResponse response, SpuPageSearchDTO spuDTO) { + List list = spuExcelService.excelSpuList(spuDTO); + List supplierProdExcelVOList = list.stream().map(spu -> { + SupplierProdExcelVO supplierProdExcelVO = new SupplierProdExcelVO(); + BeanUtils.copyProperties(spu, supplierProdExcelVO); + return supplierProdExcelVO; + + }).collect(Collectors.toList()); + ExcelUtil.soleExcel(response, supplierProdExcelVOList, SupplierProdExcelVO.EXCEL_NAME, SupplierProdExcelVO.MERGE_ROW_INDEX, SupplierProdExcelVO.MERGE_COLUMN_INDEX, SupplierProdExcelVO.class); + return ServerResponseEntity.success(); + } + + @GetMapping("/down_model") + @Operation(summary = "导出商品excel模板", description = "导出商品excel模板") + public ServerResponseEntity downloadModel(HttpServletResponse response) { + spuExcelService.downloadModel(response); + return ServerResponseEntity.success(); + } + + @Operation(summary = "导入文件") + @PostMapping("/export_excel") + public ServerResponseEntity exportExcel(@RequestParam("excelFile") MultipartFile file) { + if (file == null) { + throw new LuckException("网络繁忙,请稍后重试"); + } + // 判断execl文件是否为空 + if (SheetUtil.sheetIsNull(file)) { + return ServerResponseEntity.success("[导入文件为空]"); + } + String info; + try { + Map> errorMap = new HashMap<>(8); + EasyExcel.read(file.getInputStream(), SupplierProdExcelVO.class, new SupplierProdExcelListener(spuExcelService, errorMap)).sheet().doRead(); + info = spuExcelService.spuExportError(errorMap); + } catch (IOException e) { + throw new LuckException(e.getMessage()); + } + return ServerResponseEntity.success(info); + } + + /** + * spu批量上下架 + * + * @param spuDTO + */ + private void spuBatchUpdateStatus(SpuPageSearchDTO spuDTO) { + List spuIds = spuDTO.getSpuIds(); + Integer status = spuDTO.getStatus(); + spuDTO.setStatus(null); + List spuList = spuService.list(spuDTO); + if (CollUtil.isEmpty(spuList)) { + throw new LuckException("获取不到该商品信息,请刷新后重试"); + } + checkUpdateStatusData(spuList, status); + if (CollUtil.isEmpty(spuIds)) { + throw new LuckException("您所选择的商品中没有符合操作条件的商品"); + } + spuService.batchChangeSpuStatus(spuIds, status); + spuSupplierChangeLogService.insertBatchChangeStatus(spuIds, status); + //给代销商品增加供应商是商品更新标识 + List spuIdList = spuService.getSupIdListBySupplierId(spuDTO.getSpuId()); + if (CollUtil.isNotEmpty(spuIdList)) { + spuService.batchChangeSynUpdate(spuIdList, IsSynUpdate.NO_CHANGE.value()); + } + } + + /** + * 校验spu上下架信息 + * + * @param list 商品列表 + * @param status 更新的状态 + * @return + */ + private void checkUpdateStatusData(List list, Integer status) { + ProductLangUtil.spuList(list); + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + ServerResponseEntity shopRequest = shopDetailFeignClient.getShopByShopId(shopId); + EsShopDetailBO shopDetail = shopRequest.getData(); + if (Objects.equals(shopDetail.getShopStatus(), ShopStatus.OFFLINE.value()) || Objects.equals(shopDetail.getShopStatus(), ShopStatus.OFFLINE_AWAIT_AUDIT.value())) { + throw new LuckException("供应商处于违规下线中,不能修改商品"); + } + for (SpuVO spu : list) { + if (!Objects.equals(spu.getSupplierId(), shopId) && !Objects.equals(AuthUserContext.get().getTenantId(), Constant.PLATFORM_SHOP_ID)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + // 商品状态不为启用或未启用状态 + if (!Objects.equals(spu.getStatus(), StatusEnum.ENABLE.value()) + && !Objects.equals(spu.getStatus(), StatusEnum.DISABLE.value())) { + throw new LuckException("商品(" + spu.getName() + ")不能进行上下架操作"); + } + if (Objects.equals(status, StatusEnum.ENABLE.value()) && !Objects.equals(spu.getSpuType(), SpuType.SCORE.value())) { + CategoryVO category = categoryService.getById(spu.getCategoryId()); + if (!Objects.equals(category.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException("商品(" + spu.getName() + ")所属的平台分类处于下线中,商品不能进行上架操作,请联系管理员后再进行操作"); + } + //供应商没有店铺分类 + if (!Objects.equals(spu.getSpuType(), SpuType.SCORE.value())) { + if (!Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + CategoryVO shopCategory = categoryService.getById(spu.getShopCategoryId()); + if (!Objects.equals(shopCategory.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException("商品(" + spu.getName() + ")所属的店铺分类处于下线中,商品不能进行上架操作"); + } + } + CategoryShopVO categoryShopVO = categoryShopService.getByShopIdAndCategoryId(Objects.equals(sysType, SysTypeEnum.SUPPLIER.value()) ? spu.getSupplierId() : spu.getShopId(), spu.getCategoryId(), sysType); + if (Objects.isNull(categoryShopVO)) { + throw new LuckException("商品(" + spu.getName() + ")所属的平台分类与店铺的签约关系已失效,商品不能进行上架操作"); + } + } + } + } + } + + @PostMapping("/offline") + @Operation(summary = "下线商品", description = "下线商品") + public ServerResponseEntity offline(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + SpuVO spuVO = spuService.getBySpuId(offlineHandleEventDto.getHandleId()); + if (Objects.isNull(spuVO)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + spuService.offline(offlineHandleEventDto); + spuService.removeSpuCacheBySpuId(offlineHandleEventDto.getHandleId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/batch_offline") + @Operation(summary = "批量下线商品", description = "批量下线商品") + public ServerResponseEntity batchOffline(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (CollUtil.isEmpty(offlineHandleEventDto.getHandleIds())) { + throw new LuckException("下线的商品id列表不能为空"); + } + spuService.batchOffile(offlineHandleEventDto); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_offline_handle_event/{spuId}") + @Operation(summary = "获取最新下线的事件", description = "获取最新下线的事件") + public ServerResponseEntity getOfflineHandleEvent(@PathVariable Long spuId) { + SpuVO spuDb = spuService.getBySpuId(spuId); + if (!Objects.equals(spuDb.getSupplierId(), AuthUserContext.get().getTenantId()) && !Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + return ServerResponseEntity.success(spuService.getOfflineHandleEvent(spuId)); + } + + @PostMapping("/audit") + @Operation(summary = "审核商品", description = "审核商品") + public ServerResponseEntity audit(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + spuService.audit(offlineHandleEventDto); + spuService.removeSpuCacheBySpuId(offlineHandleEventDto.getHandleId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/audit_apply") + @Operation(summary = "违规活动提交审核", description = "违规活动提交审核") + public ServerResponseEntity auditApply(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + SpuVO spuDb = spuService.getBySpuId(offlineHandleEventDto.getHandleId()); + if (!Objects.equals(spuDb.getSupplierId(), AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + spuService.auditApply(offlineHandleEventDto); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuPriceLogController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuPriceLogController.java new file mode 100644 index 0000000..aee66ac --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuPriceLogController.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.supplier; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.SpuPriceLogDTO; +import com.tmerclub.cloud.product.model.SpuPriceLog; +import com.tmerclub.cloud.product.service.SpuPriceLogService; +import com.tmerclub.cloud.product.vo.SpuPriceLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 商品调价记录 + * + * @author lhd + * @date 2022-06-29 17:48:25 + */ +@RestController("supplierSpuPriceLogController") +@RequestMapping("/s/spu_price_log") +@Tag(name = "supplier商品调价记录") +public class SpuPriceLogController { + + @Autowired + private SpuPriceLogService spuPriceLogService; + + + @GetMapping("/page") + @Operation(summary = "获取商品调价记录列表", description = "分页获取商品调价记录列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, SpuPriceLogDTO spuPriceLogDTO) { + spuPriceLogDTO.setSupplierId(AuthUserContext.get().getTenantId()); + PageVO spuPriceLogPage = spuPriceLogService.page(pageDTO, spuPriceLogDTO); + return ServerResponseEntity.success(spuPriceLogPage); + } + + @GetMapping + @Operation(summary = "获取商品调价记录", description = "根据id获取商品调价记录") + public ServerResponseEntity getById(@RequestParam Long id) { + return ServerResponseEntity.success(spuPriceLogService.getById(id)); + } + + @PostMapping + @Operation(summary = "保存商品调价记录", description = "保存商品调价记录") + public ServerResponseEntity save(@Valid @RequestBody SpuPriceLogDTO spuPriceLogDTO) { + SpuPriceLog spuPriceLog = BeanUtil.map(spuPriceLogDTO, SpuPriceLog.class); + spuPriceLog.setId(null); + spuPriceLogService.save(spuPriceLog); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新商品调价记录", description = "更新商品调价记录") + public ServerResponseEntity update(@Valid @RequestBody SpuPriceLogDTO spuPriceLogDTO) { + SpuPriceLog spuPriceLog = BeanUtil.map(spuPriceLogDTO, SpuPriceLog.class); + spuPriceLogService.update(spuPriceLog); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除商品调价记录", description = "根据商品调价记录id删除商品调价记录") + public ServerResponseEntity delete(@RequestParam Long id) { + spuPriceLogService.deleteById(id); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuStatisticsController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuStatisticsController.java new file mode 100644 index 0000000..f25e2ab --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/SpuStatisticsController.java @@ -0,0 +1,33 @@ +package com.tmerclub.cloud.product.controller.supplier; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.service.SpuService; +import com.tmerclub.cloud.product.vo.SpuCountVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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; + +/** + * @author chiley + * @date 2022/6/29 17:11 + */ +@RestController("SpuStatisticsController") +@RequestMapping("/s/spu_statistics") +@Tag(name = "supplier-商品数据统计接口") +public class SpuStatisticsController { + + @Autowired + private SpuService spuService; + + @GetMapping("/spu_count") + @Operation(summary = "查询店铺各状态商品数量", description = "根据商品状态统计商品数量") + public ServerResponseEntity getSpuCount() { + SpuCountVO spuCountVO = spuService.getSpuCountBySupplierId(AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(spuCountVO); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/AttrCategoryDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/AttrCategoryDTO.java new file mode 100644 index 0000000..d2b72ba --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/AttrCategoryDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 属性与属性分组关联信息DTO + * + * @author YXF + * @date 2020-11-23 16:20:01 + */ +public class AttrCategoryDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "属性与分类关联id") + private Long attrCategoryId; + + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "属性id") + private Long attrId; + + public Long getAttrCategoryId() { + return attrCategoryId; + } + + public void setAttrCategoryId(Long attrCategoryId) { + this.attrCategoryId = attrCategoryId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + @Override + public String toString() { + return "AttrCategoryDTO{" + + "attrCategoryId=" + attrCategoryId + + ",categoryId=" + categoryId + + ",attrId=" + attrId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/BrandLangDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/BrandLangDTO.java new file mode 100644 index 0000000..08d9589 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/BrandLangDTO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 品牌-国际化表DTO + * + * @author YXF + * @date 2021-04-26 15:17:37 + */ +public class BrandLangDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "品牌id") + private Long brandId; + + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "品牌名称") + private String name; + + @Schema(description = "品牌描述") + private String desc; + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + @Override + public String toString() { + return "BrandLangDTO{" + + "brandId=" + brandId + + ",lang=" + lang + + ",name=" + name + + ",desc=" + desc + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/CategoryLangDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/CategoryLangDTO.java new file mode 100644 index 0000000..cb12d11 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/CategoryLangDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分类-国际化表DTO + * + * @author YXF + * @date 2021-04-22 17:48:16 + */ +public class CategoryLangDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "分类名称") + private String name; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "CategoryLangDTO{" + + "categoryId=" + categoryId + + ",lang=" + lang + + ",name=" + name + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/GiveawayDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/GiveawayDTO.java new file mode 100644 index 0000000..97aa8b0 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/GiveawayDTO.java @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 赠品表DTO + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:58 + */ +public class GiveawayDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "赠品id") + private Long giveawayId; + + @Schema(description = "赠品名称") + @Length(max = 20, message = "赠品名称长度不能超过20") + private String name; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "活动开始时间") + private Date startTime; + + @Schema(description = "活动结束时间") + private Date endTime; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "主商品id") + private Long spuId; + + @Schema(description = "商品价格") + private Double price; + + @Schema(description = "主商品图片") + private String mainImgUrl; + + @Schema(description = "主商品名称") + private String spuName; + + @Schema(description = "主商品名称") + private String giveawaySpuName; + + @Schema(description = "购买数量(购买了多少件才赠送赠品)") + private Integer buyNum; + + @Schema(description = "状态 -1:已删除 0:关闭 1:开启") + private Integer status; + + @Schema(description = "赠送商品列表") + @Valid + private List giveawaySpus; + + public Long getGiveawayId() { + return giveawayId; + } + + public void setGiveawayId(Long giveawayId) { + this.giveawayId = giveawayId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getGiveawaySpuName() { + return giveawaySpuName; + } + + public void setGiveawaySpuName(String giveawaySpuName) { + this.giveawaySpuName = giveawaySpuName; + } + + public Integer getBuyNum() { + return buyNum; + } + + public void setBuyNum(Integer buyNum) { + this.buyNum = buyNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public List getGiveawaySpus() { + return giveawaySpus; + } + + public void setGiveawaySpuDTOs(List giveawaySpus) { + this.giveawaySpus = giveawaySpus; + } + + @Override + public String toString() { + return "GiveawayDTO{" + + "giveawayId=" + giveawayId + + ", name='" + name + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", shopId=" + shopId + + ", spuId=" + spuId + + ", price=" + price + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", spuName='" + spuName + '\'' + + ", giveawaySpuName='" + giveawaySpuName + '\'' + + ", buyNum=" + buyNum + + ", status=" + status + + ", giveawaySpus=" + giveawaySpus + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/GiveawaySpuDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/GiveawaySpuDTO.java new file mode 100644 index 0000000..783a58f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/GiveawaySpuDTO.java @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 赠品套装商品项DTO + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:59 + */ +public class GiveawaySpuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "赠品商品项id") + private Long giveawaySpuId; + + @Schema(description = "赠品id") + private Long giveawayId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "赠送数量") + private Integer giveawayNum; + + @Schema(description = "退货价") + private Long refundPrice; + + @Schema(description = "状态 1:正常 0:失效 -1:删除") + private Integer status; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品图片") + private String mainImgUrl; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "商品现价") + private Long priceFee; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺分类id") + private Long shopCategoryId; + + @Schema(description = "查询名称") + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getGiveawaySpuId() { + return giveawaySpuId; + } + + public void setGiveawaySpuId(Long giveawaySpuId) { + this.giveawaySpuId = giveawaySpuId; + } + + public Long getGiveawayId() { + return giveawayId; + } + + public void setGiveawayId(Long giveawayId) { + this.giveawayId = giveawayId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getGiveawayNum() { + return giveawayNum; + } + + public void setGiveawayNum(Integer giveawayNum) { + this.giveawayNum = giveawayNum; + } + + public Long getRefundPrice() { + return refundPrice; + } + + public void setRefundPrice(Long refundPrice) { + this.refundPrice = refundPrice; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getShopCategoryId() { + return shopCategoryId; + } + + public void setShopCategoryId(Long shopCategoryId) { + this.shopCategoryId = shopCategoryId; + } + + @Override + public String toString() { + return "GiveawaySpuDTO{" + + "giveawaySpuId=" + giveawaySpuId + + ", giveawayId=" + giveawayId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", giveawayNum=" + giveawayNum + + ", refundPrice=" + refundPrice + + ", status=" + status + + ", spuName='" + spuName + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", skuName='" + skuName + '\'' + + ", priceFee=" + priceFee + + ", shopId=" + shopId + + ", shopCategoryId=" + shopCategoryId + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuBrowseLogDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuBrowseLogDTO.java new file mode 100644 index 0000000..8da55d7 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuBrowseLogDTO.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 商品浏览记录表DTO + * + * @author YXF + * @date 2021-03-19 14:28:14 + */ +public class SpuBrowseLogDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品浏览记录id") + private Long spuBrowseLogId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "商品类型") + private Integer spuType; + + @Schema(description = "商品浏览记录id列表(用于批量删除)") + private List spuBrowseLogIds; + + + public Long getSpuBrowseLogId() { + return spuBrowseLogId; + } + + public void setSpuBrowseLogId(Long spuBrowseLogId) { + this.spuBrowseLogId = spuBrowseLogId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public List getSpuBrowseLogIds() { + return spuBrowseLogIds; + } + + public void setSpuBrowseLogIds(List spuBrowseLogIds) { + this.spuBrowseLogIds = spuBrowseLogIds; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + @Override + public String toString() { + return "SpuBrowseLogDTO{" + + "spuBrowseLogId=" + spuBrowseLogId + + ", userId=" + userId + + ", spuId=" + spuId + + ", categoryId=" + categoryId + + ", spuBrowseLogIds=" + spuBrowseLogIds + + ", spuType=" + spuType + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuDetailDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuDetailDTO.java new file mode 100644 index 0000000..ab99dfc --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuDetailDTO.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品详情信息DTO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SpuDetailDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品详情") + private String detail; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + @Override + public String toString() { + return "SpuDetailDTO{" + + "spuId=" + spuId + + ",detail=" + detail + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuExtensionDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuExtensionDTO.java new file mode 100644 index 0000000..f648f51 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuExtensionDTO.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * DTO + * + * @author FrozenWatermelon + * @date 2020-11-11 13:49:06 + */ +public class SpuExtensionDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品扩展信息表id") + private Long spuExtendId; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "评论数量") + private Integer commentNum; + + @Schema(description = "销量") + private Integer saleNum; + + @Schema(description = "实际库存") + private Integer actualStock; + + @Schema(description = "锁定库存") + private Integer lockStock; + + @Schema(description = "可售卖库存") + private Integer stock; + + public Long getSpuExtendId() { + return spuExtendId; + } + + public void setSpuExtendId(Long spuExtendId) { + this.spuExtendId = spuExtendId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getCommentNum() { + return commentNum; + } + + public void setCommentNum(Integer commentNum) { + this.commentNum = commentNum; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Integer getActualStock() { + return actualStock; + } + + public void setActualStock(Integer actualStock) { + this.actualStock = actualStock; + } + + public Integer getLockStock() { + return lockStock; + } + + public void setLockStock(Integer lockStock) { + this.lockStock = lockStock; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + @Override + public String toString() { + return "SpuExtensionVO{" + + "spuExtendId=" + spuExtendId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",spuId=" + spuId + + ",commentNum=" + commentNum + + ",saleNum=" + saleNum + + ",actualStock=" + actualStock + + ",lockStock=" + lockStock + + ",stock=" + stock + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuTagDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuTagDTO.java new file mode 100644 index 0000000..b5fe761 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuTagDTO.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 商品分组表DTO + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +public class SpuTagDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分组标签id") + private Long id; + + @Schema(description = "分组标题") + private String title; + + @Schema(description = "店铺Id") + private Long shopId; + + @Schema(description = "状态(1为正常,-1 为删除)") + private Integer status; + + @Schema(description = "默认类型(0:商家自定义,1:系统默认)") + private Integer isDefault; + + @Schema(description = "商品数量") + private Long prodCount; + + @Schema(description = "列表样式(0:一列一个,1:一列两个,2:一列三个)") + private Integer style; + + @Schema(description = "排序") + private Integer seq; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "修改时间") + private Date updateTime; + + @Schema(description = "删除时间") + private Date deleteTime; + + @Schema(description = "商品信息") + private List spuList; + + @Schema(description = "商品关联ids") + private List spuIds; + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public List getSpuList() { + return spuList; + } + + public void setSpuList(List spuList) { + this.spuList = spuList; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public Long getProdCount() { + return prodCount; + } + + public void setProdCount(Long prodCount) { + this.prodCount = prodCount; + } + + public Integer getStyle() { + return style; + } + + public void setStyle(Integer style) { + this.style = style; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getDeleteTime() { + return deleteTime; + } + + public void setDeleteTime(Date deleteTime) { + this.deleteTime = deleteTime; + } + + @Override + public String toString() { + return "SpuTagDTO{" + + "id=" + id + + ", title='" + title + '\'' + + ", shopId=" + shopId + + ", status=" + status + + ", isDefault=" + isDefault + + ", prodCount=" + prodCount + + ", style=" + style + + ", seq=" + seq + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", deleteTime=" + deleteTime + + ", spuList=" + spuList + + ", spuIds=" + spuIds + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockBillLogDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockBillLogDTO.java new file mode 100644 index 0000000..b41341d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockBillLogDTO.java @@ -0,0 +1,377 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import com.tmerclub.cloud.product.model.StockBillLogItem; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 出入库明细DTO + * + * @author lhd + * @date 2022-06-22 16:57:26 + */ +public class StockBillLogDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "出入库明细id") + private Long stockBillLogId; + + @Schema(description = "出入库单号") + private String stockBillNo; + + @Schema(description = "关联订单号") + private String sourceOrderNo; + + @Schema(description = "单据类型") + private Integer stockBillType; + + @Schema(description = "出入库原因id") + private Long stockChangeReasonId; + + @Schema(description = "操作员工id") + private Long employeeId; + + @Schema(description = "状态,0:已作废,1:已出/入库,2:待提交") + private Integer status; + + @Schema(description = "出入库时间") + private Date businessTime; + + @Schema(description = "总出入库数量") + private Integer totalCount; + + @Schema(description = "总出入库金额") + private Long totalAmount; + + @Schema(description = "出入库凭证") + private String qualifications; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "类型,1:出库 2:入库") + private Integer type; + + @Schema(description = "制单人手机号") + private String makerMobile; + + @Schema(description = "出入库开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date businessStartTime; + + @Schema(description = "出入库结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date businessEndTime; + + @Schema(description = "1:商品名称 2:商品编码") + private Integer prodKeyType; + + @Schema(description = "搜索商品关键词(0:商品名称 1:商品编码)") + private String prodKey; + + @Schema(description = "制单开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createStartTime; + + @Schema(description = "制单结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createEndTime; + + @Schema(description = "出入库商品项列表") + private List stockBillLogItems; + + @Schema(description = "出入库商品项列表(导出库存流水:批量操作时,用此参数)(批量处理参数)") + private List stockBillLogItemIds; + + @Schema(description = "出入库明细id(导出出入库明细:批量操作时,用此参数)(批量处理参数)") + private List stockBillLogIds; + + @Schema(description = "库存点名称") + private String stockPointName; + + @Schema(description = "库存点id") + private Long stockPointId; + + @Schema(description = "库存点类型 1仓库 2门店 ") + private Integer stockPointType; + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public List getStockBillLogIds() { + return stockBillLogIds; + } + + public void setStockBillLogIds(List stockBillLogIds) { + this.stockBillLogIds = stockBillLogIds; + } + + public Date getBusinessStartTime() { + return businessStartTime; + } + + public void setBusinessStartTime(Date businessStartTime) { + this.businessStartTime = businessStartTime; + } + + public Date getBusinessEndTime() { + return businessEndTime; + } + + public void setBusinessEndTime(Date businessEndTime) { + this.businessEndTime = businessEndTime; + } + + public Integer getProdKeyType() { + return prodKeyType; + } + + public void setProdKeyType(Integer prodKeyType) { + this.prodKeyType = prodKeyType; + } + + public String getProdKey() { + return prodKey; + } + + public void setProdKey(String prodKey) { + this.prodKey = prodKey; + } + + public Date getCreateStartTime() { + return createStartTime; + } + + public void setCreateStartTime(Date createStartTime) { + this.createStartTime = createStartTime; + } + + public Date getCreateEndTime() { + return createEndTime; + } + + public void setCreateEndTime(Date createEndTime) { + this.createEndTime = createEndTime; + } + + + public List getStockBillLogItems() { + return stockBillLogItems; + } + + public void setStockBillLogItems(List stockBillLogItems) { + this.stockBillLogItems = stockBillLogItems; + } + + + public List getStockBillLogItemIds() { + return stockBillLogItemIds; + } + + public void setStockBillLogItemIds(List stockBillLogItemIds) { + this.stockBillLogItemIds = stockBillLogItemIds; + } + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public String getStockBillNo() { + return stockBillNo; + } + + public void setStockBillNo(String stockBillNo) { + this.stockBillNo = stockBillNo; + } + + public String getSourceOrderNo() { + return sourceOrderNo; + } + + public void setSourceOrderNo(String sourceOrderNo) { + this.sourceOrderNo = sourceOrderNo; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Date getBusinessTime() { + return businessTime; + } + + public void setBusinessTime(Date businessTime) { + this.businessTime = businessTime; + } + + public Integer getTotalCount() { + return totalCount; + } + + public void setTotalCount(Integer totalCount) { + this.totalCount = totalCount; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + public String getQualifications() { + return qualifications; + } + + public void setQualifications(String qualifications) { + this.qualifications = qualifications; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public String getStockPointName() { + return stockPointName; + } + + public void setStockPointName(String stockPointName) { + this.stockPointName = stockPointName; + } + + @Override + public String toString() { + return "StockBillLogDTO{" + + "stockBillLogId=" + stockBillLogId + + ", stockBillNo='" + stockBillNo + '\'' + + ", sourceOrderNo='" + sourceOrderNo + '\'' + + ", stockBillType=" + stockBillType + + ", stockChangeReasonId=" + stockChangeReasonId + + ", employeeId=" + employeeId + + ", status=" + status + + ", businessTime=" + businessTime + + ", totalCount=" + totalCount + + ", totalAmount=" + totalAmount + + ", qualifications='" + qualifications + '\'' + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", remark='" + remark + '\'' + + ", type=" + type + + ", makerMobile='" + makerMobile + '\'' + + ", businessStartTime=" + businessStartTime + + ", businessEndTime=" + businessEndTime + + ", prodKeyType=" + prodKeyType + + ", prodKey='" + prodKey + '\'' + + ", createStartTime=" + createStartTime + + ", createEndTime=" + createEndTime + + ", stockBillLogItems=" + stockBillLogItems + + ", stockBillLogItemIds=" + stockBillLogItemIds + + ", stockBillLogIds=" + stockBillLogIds + + ", stockPointName='" + stockPointName + '\'' + + ", stockPointId=" + stockPointId + + ", stockPointType=" + stockPointType + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockChangeReasonStatusDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockChangeReasonStatusDTO.java new file mode 100644 index 0000000..e343489 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockChangeReasonStatusDTO.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 出入库原因状态DTO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class StockChangeReasonStatusDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long stockChangeReasonStatusId; + + @Schema(description = "关联的系统出入库原因id") + private Long stockChangeReasonId; + + @Schema(description = "状态,1:启用 0:禁用 -1:删除") + private Integer status; + + @Schema(description = "店铺id") + private Long shopId; + + public Long getStockChangeReasonStatusId() { + return stockChangeReasonStatusId; + } + + public void setStockChangeReasonStatusId(Long stockChangeReasonStatusId) { + this.stockChangeReasonStatusId = stockChangeReasonStatusId; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "StockChangeReasonStatusDTO{" + + "stockChangeReasonStatusId=" + stockChangeReasonStatusId + + ",stockChangeReasonId=" + stockChangeReasonId + + ",status=" + status + + ",shopId=" + shopId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/TakeStockDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/TakeStockDTO.java new file mode 100644 index 0000000..1948e3e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/TakeStockDTO.java @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import com.tmerclub.cloud.product.model.TakeStockSpu; +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * DTO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class TakeStockDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "盘点id") + private Long takeStockId; + + @Schema(description = "盘点单号") + private String takeStockNo; + + @Schema(description = "盘点状态 0已作废 1盘点中 2已完成") + private Integer billStatus; + + @Schema(description = "制单人") + private Long maker; + + @Schema(description = "盘点区域名称") + private String stockRegionName; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "制单人手机号") + private String makerMobile; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建盘点开始时间") + private LocalDateTime createStartTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建盘点结束时间") + private LocalDateTime createEndTime; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "盘点商品列表") + private List takeStockSpuList; + + @Hidden + @Schema(description = "仓库id") + private Long warehouseId; + + public Long getTakeStockId() { + return takeStockId; + } + + public void setTakeStockId(Long takeStockId) { + this.takeStockId = takeStockId; + } + + public String getTakeStockNo() { + return takeStockNo; + } + + public void setTakeStockNo(String takeStockNo) { + this.takeStockNo = takeStockNo; + } + + public Integer getBillStatus() { + return billStatus; + } + + public void setBillStatus(Integer billStatus) { + this.billStatus = billStatus; + } + + public Long getMaker() { + return maker; + } + + public void setMaker(Long maker) { + this.maker = maker; + } + + public String getStockRegionName() { + return stockRegionName; + } + + public void setStockRegionName(String stockRegionName) { + this.stockRegionName = stockRegionName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public LocalDateTime getCreateStartTime() { + return createStartTime; + } + + public void setCreateStartTime(LocalDateTime createStartTime) { + this.createStartTime = createStartTime; + } + + public LocalDateTime getCreateEndTime() { + return createEndTime; + } + + public void setCreateEndTime(LocalDateTime createEndTime) { + this.createEndTime = createEndTime; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public List getTakeStockSpuList() { + return takeStockSpuList; + } + + public void setTakeStockSpuList(List takeStockSpuList) { + this.takeStockSpuList = takeStockSpuList; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + @Override + public String toString() { + return "TakeStockDTO{" + + "takeStockId=" + takeStockId + + ", takeStockNo='" + takeStockNo + '\'' + + ", billStatus=" + billStatus + + ", maker=" + maker + + ", stockRegionName='" + stockRegionName + '\'' + + ", remark='" + remark + '\'' + + ", shopId=" + shopId + + ", makerMobile='" + makerMobile + '\'' + + ", createStartTime=" + createStartTime + + ", createEndTime=" + createEndTime + + ", spuName='" + spuName + '\'' + + ", partyCode='" + partyCode + '\'' + + ", takeStockSpuList=" + takeStockSpuList + + ", warehouseId=" + warehouseId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/AddShopCartItemsDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/AddShopCartItemsDTO.java new file mode 100644 index 0000000..ea5956d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/AddShopCartItemsDTO.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto.shopcart; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lhd + * @date 2021-07-01 10:47:32 + */ +public class AddShopCartItemsDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "需要添加的购物车信息集合", requiredMode = Schema.RequiredMode.REQUIRED) + private List shopCartItemList; + + public List getShopCartItemList() { + return shopCartItemList; + } + + public void setShopCartItemList(List shopCartItemList) { + this.shopCartItemList = shopCartItemList; + } + + @Override + public String toString() { + return "BatchAddShopCartItemDTO{" + + "shopCartItemList=" + shopCartItemList + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/CheckShopCartItemDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/CheckShopCartItemDTO.java new file mode 100644 index 0000000..20afc73 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/CheckShopCartItemDTO.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto.shopcart; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2021-02-03 15:47:32 + */ +public class CheckShopCartItemDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull + @Schema(description = "购物车ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopCartItemId; + + @NotNull + @Schema(description = "商品是否勾选 1:勾选 0:未勾选") + private Integer isChecked; + + public Long getShopCartItemId() { + return shopCartItemId; + } + + public void setShopCartItemId(Long shopCartItemId) { + this.shopCartItemId = shopCartItemId; + } + + public Integer getIsChecked() { + return isChecked; + } + + public void setIsChecked(Integer isChecked) { + this.isChecked = isChecked; + } + + @Override + public String toString() { + return "CheckShopCartItemDTO{" + + "shopCartItemId=" + shopCartItemId + + ", isChecked=" + isChecked + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/BrandFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/BrandFeignController.java new file mode 100644 index 0000000..da4f0b2 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/BrandFeignController.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.feign; + +import com.tmerclub.cloud.api.product.feign.BrandFeignClient; +import com.tmerclub.cloud.common.product.vo.BrandVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.service.BrandService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + + +/** + * @author lhd + * @date 2020/12/23 + */ +@DubboService +public class BrandFeignController implements BrandFeignClient { + + @Autowired + private BrandService brandService; + + @Override + public ServerResponseEntity getInfo(Long brandId) { + return ServerResponseEntity.success(brandService.getInfo(brandId)); + } + + @Override + public void updateCustomBrandToPlatformBrandByShopId(Long shopId, Integer sysType) { + brandService.updateCustomBrandToPlatformBrandByShopId(shopId, sysType); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/BrandShopFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/BrandShopFeignController.java new file mode 100644 index 0000000..0084bba --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/BrandShopFeignController.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.feign; + +import com.tmerclub.cloud.api.product.dto.BrandShopDTO; +import com.tmerclub.cloud.api.product.feign.BrandShopFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.service.BrandShopService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @Author lth + * @Date 2021/7/12 9:15 + */ +@DubboService +public class BrandShopFeignController implements BrandShopFeignClient { + + @Autowired + private BrandShopService brandShopService; + + @Override + public ServerResponseEntity insertBatchByShopId(List brandShopDTOList, Long shopId, Integer sysType) { + brandShopService.insertBatchByShopId(brandShopDTOList, shopId, sysType); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/CategoryShopFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/CategoryShopFeignController.java new file mode 100644 index 0000000..76a26c2 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/CategoryShopFeignController.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.feign; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.product.bo.PlatformCommissionItemBO; +import com.tmerclub.cloud.api.product.bo.PlatformCommissionOrderItemBO; +import com.tmerclub.cloud.api.product.dto.CategoryShopDTO; +import com.tmerclub.cloud.api.product.feign.CategoryShopFeignClient; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.bo.CategoryRateBO; +import com.tmerclub.cloud.product.mapper.CategoryMapper; +import com.tmerclub.cloud.product.service.CategoryService; +import com.tmerclub.cloud.product.service.CategoryShopService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2021/5/24 + */ +@DubboService +public class CategoryShopFeignController implements CategoryShopFeignClient { + + @Autowired + private CategoryShopService categoryShopService; + + @Autowired + private CategoryService categoryService; + + @Autowired + private CategoryMapper categoryMapper; + + @Override + public ServerResponseEntity> calculatePlatformCommission(List platformCommissionOrderItems) { + + // 如果为空表示为从店铺改价过来,需要先获取分类ids + if (Objects.isNull(platformCommissionOrderItems.get(0).getCategoryId())) { + List rateOrderItemList = categoryService.listBySkuIds(platformCommissionOrderItems); + Map rateMap = rateOrderItemList.stream().collect(Collectors.toMap(PlatformCommissionOrderItemBO::getSkuId, PlatformCommissionOrderItemBO::getCategoryId)); + for (PlatformCommissionOrderItemBO platformCommissionOrderItem : platformCommissionOrderItems) { + platformCommissionOrderItem.setCategoryId(rateMap.get(platformCommissionOrderItem.getSkuId())); + } + } + + for (PlatformCommissionOrderItemBO platformCommissionOrderItem : platformCommissionOrderItems) { + + // 处理商家端的分类关联,获取店铺各个分类的费率 + PlatformCommissionItemBO shopItem = platformCommissionOrderItem.getShopItem(); + List shopCategoryRates = categoryShopService.listRateByShopId(shopItem.getShopId(), SysTypeEnum.MULTISHOP.value()); + if (CollectionUtil.isEmpty(shopCategoryRates)) { + continue; + } + for (CategoryRateBO shopCategoryRate : shopCategoryRates) { + if (Objects.equals(platformCommissionOrderItem.getCategoryId(), shopCategoryRate.getCategoryId()) && shopCategoryRate.getRate() != null) { + platformCommissionOrderItem.setRate(shopCategoryRate.getRate()); + } + } + + if (Objects.isNull(platformCommissionOrderItem.getSupplierItem())) { + continue; + } + + // 处理供应商端的分类关联 + // 获取供应商各个分类的费率 + PlatformCommissionItemBO supplierItem = platformCommissionOrderItem.getSupplierItem(); + List supplierCategoryRates = categoryShopService.listRateByShopId(supplierItem.getShopId(), SysTypeEnum.SUPPLIER.value()); + if (CollectionUtil.isEmpty(supplierCategoryRates)) { + continue; + } + for (CategoryRateBO supplierCategoryRate : supplierCategoryRates) { + // 分类id相同,用平台的佣金 + if (Objects.equals(platformCommissionOrderItem.getCategoryId(), supplierCategoryRate.getCategoryId()) && supplierCategoryRate.getRate() != null) { + platformCommissionOrderItem.setSupplierRate(supplierCategoryRate.getRate()); + } + } + } + return ServerResponseEntity.success(platformCommissionOrderItems); + } + + @Override + public ServerResponseEntity> getSupplierIdsByShopId(Long shopId) { + return ServerResponseEntity.success(categoryShopService.getSupplierIdsByShopId(shopId)); + } + + @Override + public ServerResponseEntity> getCategoryIdsByShopId(Long shopId, Integer sysType) { + return ServerResponseEntity.success(categoryShopService.getCategoryIdsByShopId(shopId, sysType)); + } + + @Override + public ServerResponseEntity insertBatchByShopId(List categoryShopDTOList, Long shopId, Integer sysType) { + categoryShopService.insertBatchByShopId(categoryShopDTOList, shopId, sysType); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> getOneCategoryIdByShopId(Long shopId, Integer sysType, Integer lang) { + List threeCategoryList = categoryMapper.listSigningCategoryByShopIdAndStatus(shopId, sysType, null); + if (Objects.isNull(threeCategoryList) || threeCategoryList.size() == 0) { + // 签约分类为空时 + return ServerResponseEntity.success(null); + } + return ServerResponseEntity.success(threeCategoryList.stream().map(CategoryVO::getCategoryId).collect(Collectors.toList())); + } + + @Override + public ServerResponseEntity> getSupplyIdByCategoryIds(List categoryIds) { + return ServerResponseEntity.success(categoryShopService.getSupplyIdByCategoryIds(categoryIds)); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/GiveawayFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/GiveawayFeignController.java new file mode 100644 index 0000000..94df2ae --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/GiveawayFeignController.java @@ -0,0 +1,38 @@ +package com.tmerclub.cloud.product.feign; + +import com.tmerclub.cloud.api.product.feign.GiveawayFeignClient; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.product.service.GiveawayService; +import com.tmerclub.cloud.product.service.GiveawaySpuService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Objects; +/** + * @author lanhai + */ +@DubboService +public class GiveawayFeignController implements GiveawayFeignClient { + @Autowired + private GiveawayService giveawayService; + @Autowired + private GiveawaySpuService giveawaySpuService; + + @Override + public void changeGiveawayStatus(Long spuId) { + GiveawayVO giveawayVO = giveawayService.getBySpuId(spuId); + if (Objects.nonNull(giveawayVO)) { + giveawayService.changeStatus(giveawayVO.getGiveawayId(), StatusEnum.DISABLE.value()); + } + } + + @Override + public void changeGiveawaySpuStatus(Long spuId) { + //赠送商品则清除缓存 + List spuIds = giveawayService.listMainSpuIdByGiveawaySpuId(spuId); + giveawaySpuService.removeGiveawayCacheBatch(spuIds); + + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SkuFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SkuFeignController.java new file mode 100644 index 0000000..0bc9865 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SkuFeignController.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.feign; + +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.common.cache.constant.ProductCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.vo.SkuAddrVO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.app.SkuAppVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.service.SkuService; +import com.tmerclub.cloud.product.service.SpuService; +import com.tmerclub.cloud.product.service.SupplierSpuUpdateLaterOperateService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/12/8 + */ +@DubboService +public class SkuFeignController implements SkuFeignClient { + + @Autowired + private SkuService skuService; + + @Autowired + private SpuService spuService; + + @Autowired + private SupplierSpuUpdateLaterOperateService supplierSpuUpdateLaterOperateService; + + + @Override + public ServerResponseEntity getById(Long skuId) { + return ServerResponseEntity.success(skuService.getSkuBySkuId(skuId)); + } + + @Override + public ServerResponseEntity> listBySpuId(Long spuId) { + + SpuVO spuDb = spuService.getBySpuId(spuId); + SpuVO spuVO = BeanUtil.map(spuDb, SpuVO.class); + List skuList = skuService.getSpuDetailSkuInfo(spuVO); + return ServerResponseEntity.success(skuList); + } + + @Override + public List listBySpuIds(List spuIds) { + return skuService.listBySpuIds(spuIds); + } + + @Override + public ServerResponseEntity> listSupplierBySpuIds(List spuIds, Long shopId) { + return ServerResponseEntity.success(skuService.listSupplierBySpuIds(spuIds, shopId)); + } + + @Override + public ServerResponseEntity> listSpuDetailByIds(List skuIds) { + return ServerResponseEntity.success(skuService.listSpuDetailByIds(skuIds)); + } + + @Override + public ServerResponseEntity getMinPriceFeeByIds(List skuIds) { + return ServerResponseEntity.success(skuService.getMinPriceFeeByIds(skuIds)); + } + + + @Override + public ServerResponseEntity> getByIds(List skuIds) { + return ServerResponseEntity.success(skuService.getByIds(skuIds)); + } + + @Override + public ServerResponseEntity> setSpuSku(List spuAdminVOList) { + return ServerResponseEntity.success(skuService.setSpuSku(spuAdminVOList)); + } + + @Override + public void processSkuUpdate(SkuVO beforeData, SkuVO afterData) { + //判断是否修改sku售价,当供应商修改sku售价时,商家代代销设置了手动(当供货价高于售价时自动下架商品sku)时, + if (!Objects.isNull(afterData.getPriceFee()) && Objects.isNull(beforeData.getStatus())) { + //当代销商品sku售价低于供货价时下架代销商品 + spuService.soldOutSpu(afterData.getSkuId(), afterData.getPriceFee()); + } + //供应商体积或重量发生变化,供应商商品是商家发货,下架商家商品 + if (!Objects.isNull(beforeData.getWeight()) || !Objects.isNull(beforeData.getVolume())) { + supplierSpuUpdateLaterOperateService.skuWeightOrVolumeUpdateOperate(afterData.getSpuId()); + } + //供应商市场价变更后同步变更代销商品市场价 + if (!Objects.isNull(afterData.getMarketPriceFee())) { + supplierSpuUpdateLaterOperateService.synMarketPrice(afterData.getSkuId(), afterData.getMarketPriceFee()); + } +// if (Objects.nonNull(beforeData.getStatus())) { +// //sku启用 +// RedisUtil.set(ProductCacheNames.SKU_STATUS_ENABLE + afterData.getSpuId(), 1, -1); +// supplierSpuUpdateLaterOperateService.changeSynUpdate(afterData.getSpuId()); +// } + if (Objects.nonNull(beforeData.getStatus())) { + SpuVO spuVO = spuService.getBySpuId(afterData.getSpuId()); + if (Objects.equals(afterData.getStatus(), 1)) { + //sku启用 + RedisUtil.set(ProductCacheNames.SKU_STATUS_ENABLE + afterData.getSpuId(), 1, 3600); + supplierSpuUpdateLaterOperateService.changeSynUpdate(afterData.getSpuId()); + } else if (Objects.equals(beforeData.getStatus(), 1)) { + //sku禁用 + RedisUtil.set(ProductCacheNames.SKU_STATUS_DISABLE + afterData.getSpuId(), 1, 3600); + supplierSpuUpdateLaterOperateService.changeSynUpdate(afterData.getSpuId()); + } + skuService.changeSkuStockStatusBySkuId(afterData.getSkuId(), spuVO.getStatus(), afterData.getStatus()); + } + } + + @Override + public SkuVO getSkuAndNameById(long skuId) { + SkuVO sku = skuService.getSkuBySkuId(skuId); + ProductLangUtil.sku(sku); + return sku; + } + + @Override + public List listBySkuIds(List skuIds) { + return skuService.getByIds(skuIds); + } + + @Override + public List listByPartyCodes(List partyCodes) { + SkuDTO skuDTO = new SkuDTO(); + skuDTO.setPartyCodes(partyCodes); + return skuService.listSku(skuDTO); + } + + @Override + public List listShopSaleSku(List supplierSkuIds, Long shopId) { + SkuDTO skuDTO = new SkuDTO(); + skuDTO.setSupplierSkuIds(supplierSkuIds); + skuDTO.setShopId(shopId); + return skuService.listSku(skuDTO); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SpuBrowseLogLogFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SpuBrowseLogLogFeignController.java new file mode 100644 index 0000000..5b48bee --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SpuBrowseLogLogFeignController.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.feign; + +import com.tmerclub.cloud.api.product.feign.SpuBrowseLogFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.service.SpuBrowseLogService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/8 + */ +@DubboService +public class SpuBrowseLogLogFeignController implements SpuBrowseLogFeignClient { + + @Autowired + private SpuBrowseLogService spuBrowseLogService; + + @Override + public ServerResponseEntity> recentBrowse(Long userId, Long shopId) { + return ServerResponseEntity.success(spuBrowseLogService.recentBrowse(userId, shopId)); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SpuCommFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SpuCommFeignController.java new file mode 100644 index 0000000..977d88b --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SpuCommFeignController.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.feign; + +import com.tmerclub.cloud.api.product.feign.SpuCommFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.service.SpuCommService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/27 + */ +@DubboService +public class SpuCommFeignController implements SpuCommFeignClient { + + @Autowired + private SpuCommService spuCommService; + + @Override + public ServerResponseEntity> getCommNumRankSpuIdsByShopIdAndTime(String key, Long shopId, Integer time, Integer expireTime, Integer esRenovationSpuSort, Long primaryCategoryId) { + List spuIds = spuCommService.getCommNumRankShopIdAndTime(key, shopId, time, expireTime, esRenovationSpuSort, primaryCategoryId); + return ServerResponseEntity.success(spuIds); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/TakeStockFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/TakeStockFeignController.java new file mode 100644 index 0000000..1f1733e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/TakeStockFeignController.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.product.feign; + +import com.tmerclub.cloud.api.product.feign.TakeStockFeignClient; +import com.tmerclub.cloud.product.service.TakeStockService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author gaozijie + * @since 2023-12-20 + */ +@DubboService +public class TakeStockFeignController implements TakeStockFeignClient { + + @Autowired + private TakeStockService takeStockService; + + @Override + public Long countUnFinish(Long warehouseId) { + return takeStockService.countUnFinish(warehouseId); + } + + @Override + public void nullifyByWarehouseId(Long warehouseId) { + takeStockService.nullifyByWarehouseId(warehouseId); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/WarehouseFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/WarehouseFeignController.java new file mode 100644 index 0000000..db3b527 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/WarehouseFeignController.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.feign; + +import com.tmerclub.cloud.api.product.dto.WarehouseSearchDTO; +import com.tmerclub.cloud.api.product.feign.WarehouseFeignClient; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.api.product.dto.WarehouseDTO; +import com.tmerclub.cloud.product.service.WarehouseService; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/12/14 + */ +@DubboService +public class WarehouseFeignController implements WarehouseFeignClient { + private static final Logger logger = LoggerFactory.getLogger(WarehouseFeignController.class); + + @Autowired + private WarehouseService warehouseService; + + + @Override + public ServerResponseEntity createWarehouseByShopId(Long shopId, Integer sysType, String phone, String name) { + warehouseService.createWarehouseByShopId(shopId, sysType, phone, name); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity getDefaultIdByShopId(Long shopId,Integer sysType) { + WarehouseVO warehouseVO = warehouseService.getDefaultWarehouseByShopId(shopId,sysType); + return ServerResponseEntity.success(warehouseVO.getWarehouseId()); + } + + @Override + public ServerResponseEntity isDefaultWarehouse(Long warehouseId) { + WarehouseVO warehouseVO = warehouseService.getByWarehouseId(warehouseId); + return ServerResponseEntity.success(Objects.equals(warehouseVO.getType(), 0)); + } + + @Override + public WarehouseVO getWarehouseById(Long warehouseId) { + return warehouseService.getByWarehouseId(warehouseId); + } + + @Override + public List listWarehouse(WarehouseSearchDTO warehouseSearchDTO) { + WarehouseDTO warehouseDTO = new WarehouseDTO(); + BeanUtils.copyProperties(warehouseSearchDTO, warehouseDTO); + return warehouseService.listWarehouse(warehouseDTO); + } + + @Override + public List listCanDeliveryWarehouse(WarehouseSearchDTO warehouseSearchDTO) { + WarehouseDTO warehouseDTO = new WarehouseDTO(); + BeanUtils.copyProperties(warehouseSearchDTO, warehouseDTO); + return warehouseService.listCanDeliveryWarehouse(warehouseDTO); + } + + @Override + public List listWarehouseByShopId(Long shopId, Integer systype) { + List warehouseList = warehouseService.listWarehouseByShopId(shopId, systype); + return warehouseList; + } + + @Override + public ServerResponseEntity insertWarehouseAndArea(WarehouseDTO warehouseDTO) { + warehouseService.insertWarehouseAndArea(warehouseDTO); + // 清除缓存 + warehouseService.removeWarehouseCache(warehouseDTO.getWarehouseId(), warehouseDTO.getShopId(), warehouseDTO.getSysType()); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity updateWarehouseAndArea(WarehouseDTO warehouseDTO) { + warehouseService.updateWarehouseAndArea(warehouseDTO); + // 清除缓存 + warehouseService.removeWarehouseCache(warehouseDTO.getWarehouseId(), warehouseDTO.getShopId(), warehouseDTO.getSysType()); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity deleteWarehouseAndArea(Long warehouseId) { + WarehouseVO warehouseVO = warehouseService.deleteWarehouseAndArea(warehouseId); + warehouseService.removeWarehouseCache(warehouseVO.getWarehouseId(), warehouseVO.getShopId(), warehouseVO.getSysType()); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/OrderNotifyStockConsumer.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/OrderNotifyStockConsumer.java new file mode 100644 index 0000000..ea8be30 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/OrderNotifyStockConsumer.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.listener; + +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.product.service.SkuStockLockService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * 解锁库存的监听 + * + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_NOTIFY_SERVICE_TOPIC, consumerGroup = RocketMqConstant.ORDER_NOTIFY_STOCK_GROUP) +public class OrderNotifyStockConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(OrderNotifyStockConsumer.class); + + @Autowired + private SkuStockLockService skuStockLockService; + + /** + * 订单支付成功锁定库存 + */ + @Override + public void onMessage(PayNotifyBO message) { + // 非秒杀订单,共用的库存 + if (Objects.equals(message.getOrderType(), OrderType.SECKILL.value())) { + return; + } + LOG.info("订单支付成功锁定库存... message: {}", Json.toJsonString(message)); + skuStockLockService.markerStockUse(message.getOrderIds()); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/SpuExcelListener.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/SpuExcelListener.java new file mode 100644 index 0000000..3c5eb74 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/SpuExcelListener.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.listener; + +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.product.constant.SpuExportError; +import com.tmerclub.cloud.product.service.SpuExcelService; +import com.tmerclub.cloud.product.vo.SpuExcelVO; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 商品excel导入监听 + * 有个很重要的点 SpuExcelListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去 + * + * @author YXF + * @date 2021/3/11 + */ + +public class SpuExcelListener extends AnalysisEventListener { + + private SpuExcelService spuExcelService; + private Map> errorMap; + private List list; + private SpuExcelVO spuExcel; + + /** + * 每隔1000条数据存储数据库,然后清理map ,方便内存回收 + */ + private static final int BATCH_COUNT = 3000; + private static String seq; + + public SpuExcelListener() { + } + + public SpuExcelListener(SpuExcelService spuExcelService, Map> errorMap) { + this.spuExcelService = spuExcelService; + this.errorMap = errorMap; + this.list = new ArrayList<>(Constant.INITIAL_CAPACITY); + } + + /** + * 这个每一条数据解析都会来调用 + */ + + @Override + public void invoke(SpuExcelVO spuExcelVO, AnalysisContext analysisContext) { + + boolean isSave = list.size() > BATCH_COUNT; + if (isSave) { + saveData(); + } + + list.add(spuExcelVO); + } + + /** + * 所有数据解析完成了 都会来调用 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + //确保所有数据都能入库 + saveData(); + } + + /** + * 加上存储数据库 + */ + private void saveData() { + try { + spuExcelService.exportExcel(list, errorMap); + } catch (Exception e) { + List list = errorMap.get(SpuExportError.OTHER.value()); + if (CollectionUtil.isEmpty(list)) { + list = new ArrayList<>(0); + errorMap.put(SpuExportError.OTHER.value(), list); + } + list.add(e.getMessage()); + } + list.clear(); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockBillLogConsumer.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockBillLogConsumer.java new file mode 100644 index 0000000..01781be --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockBillLogConsumer.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.product.service.StockBillLogService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 出入库操作监听 + * + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.STOCK_BILL_LOG_TOPIC, consumerGroup = RocketMqConstant.STOCK_BILL_LOG_TOPIC) +public class StockBillLogConsumer implements RocketMQListener> { + + @Autowired + private StockBillLogService stockBillLogService; + + /** + * 入库操作 + */ + @Override + public void onMessage(List message) { + if (CollUtil.isEmpty(message)) { + return; + } + stockBillLogService.generateStockLogOfOrderList(message); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockUnlockConsumer.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockUnlockConsumer.java new file mode 100644 index 0000000..db262db --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockUnlockConsumer.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.product.service.SkuStockLockService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 取消订单解锁库存的监听 + * + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.STOCK_UNLOCK_TOPIC_BY_ORDER_ID, consumerGroup = RocketMqConstant.STOCK_UNLOCK_TOPIC_BY_ORDER_ID) +public class StockUnlockConsumer implements RocketMQListener> { + + @Autowired + private SkuStockLockService skuStockLockService; + + /** + * 取消订单,直接解锁库存 + */ + @Override + public void onMessage(List orderIds) { + skuStockLockService.unlockStockByCancel(orderIds); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/SupplierSpuUpdateNotifyConsumer.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/SupplierSpuUpdateNotifyConsumer.java new file mode 100644 index 0000000..989ee4a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/SupplierSpuUpdateNotifyConsumer.java @@ -0,0 +1,73 @@ +package com.tmerclub.cloud.product.listener;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +import com.tmerclub.cloud.api.multishop.feign.ShopSubstituteSalesFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.product.constant.IsSynUpdate; +import com.tmerclub.cloud.common.product.constant.SalesType; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.product.service.SpuService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author xxw + * @date 2022/11/3 9:12 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SUPPLIER_PRODUCT_UPDATE, consumerGroup = RocketMqConstant.SUPPLIER_PRODUCT_UPDATE) +public class SupplierSpuUpdateNotifyConsumer implements RocketMQListener { + + @Autowired + private SpuService spuService; + + @DubboReference + private ShopSubstituteSalesFeignClient shopSubstituteSalesFeignClient; + + /** + * 供应商品基本信息更新后给供应商返发货的且是手动设价的代销商品添加提示 + * + * @param supplierSpuId + */ + @Override + public void onMessage(Long supplierSpuId) { + List commissionSpuList = spuService.getCommissionSpuList(supplierSpuId); + List shopIdList = commissionSpuList.stream().map(SpuVO::getShopId).collect(Collectors.toList()); + if (shopIdList.size() == 0) { + return; + } + List shopSubstituteSalesVOList = shopSubstituteSalesFeignClient.shopSubstituteSalesList(shopIdList).getData(); + //满足条件的商家id + List shopIdS = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ShopSubstituteSalesVO salesVO : shopSubstituteSalesVOList) { + if (Objects.equals(salesVO.getSalesType(), SalesType.MANUAL_OPERATION_PRICE.value())) { + shopIdS.add(salesVO.getShopId()); + } + } + //满足条件的代销商品id + List spuIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuVO spuVO : commissionSpuList) { + if (shopIdS.contains(spuVO.getShopId())) { + spuIdList.add(spuVO.getSpuId()); + } + } + spuService.batchChangeSynUpdate(spuIdList, IsSynUpdate.NO_CHANGE.value()); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/TakeStockSpuExcelListener.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/TakeStockSpuExcelListener.java new file mode 100644 index 0000000..0454d61 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/TakeStockSpuExcelListener.java @@ -0,0 +1,92 @@ +package com.tmerclub.cloud.product.listener; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.exception.ExcelDataConvertException; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.product.service.TakeStockSpuService; +import com.tmerclub.cloud.product.vo.TakeStockSpuExcelVO; +import com.tmerclub.cloud.product.vo.TakeStockSpuImportVO; +import org.springframework.util.ObjectUtils; + +import java.util.*; + +/** + * @author lanhai + */ +public class TakeStockSpuExcelListener extends AnalysisEventListener { + + private TakeStockSpuService takeStockSpuService; + /** + * 错误信息集合 + */ + private List errorList; + private List list; + private TakeStockSpuImportVO takeStockSpuImportVO; + private Long takeStockId; + Set partyCodes; + + /** + * 每隔1000条数据存储数据库,然后清理map ,方便内存回收 + */ + private static final int BATCH_COUNT = 1000; + + public TakeStockSpuExcelListener() { + partyCodes = new HashSet<>(Constant.INITIAL_CAPACITY); + } + + public TakeStockSpuExcelListener(TakeStockSpuService takeStockSpuService, List errorList, Long takeStockId, TakeStockSpuImportVO takeStockSpuImportVO) { + this.takeStockSpuService = takeStockSpuService; + this.errorList = new ArrayList<>(Constant.INITIAL_CAPACITY); + this.list = new ArrayList<>(BATCH_COUNT); + this.takeStockSpuImportVO = takeStockSpuImportVO; + this.takeStockId = takeStockId; + partyCodes = new HashSet<>(Constant.INITIAL_CAPACITY); + } + + /** + * 这个每一条数据解析都会来调用 + */ + @Override + public void invoke(TakeStockSpuExcelVO takeStockSpuExcelVO, AnalysisContext analysisContext) { + if (Objects.isNull(takeStockSpuExcelVO)) { + return; + } + if (ObjectUtils.isEmpty(takeStockSpuExcelVO.getPartyCode()) + || !partyCodes.add(takeStockSpuExcelVO.getPartyCode())) { + return; + } + if (Objects.isNull(takeStockSpuExcelVO.getChangeStock())) { + takeStockSpuExcelVO.setChangeStock(0); + } + if (list.size() >= BATCH_COUNT) { + saveData(); + } + list.add(takeStockSpuExcelVO); + } + + /** + * 加上存储数据库 + */ + private void saveData() { + takeStockSpuService.importExcel(list, errorList, partyCodes, takeStockId, takeStockSpuImportVO); + list.clear(); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + //确保所有数据都能入库 + saveData(); + } + + @Override + public void onException(Exception exception, AnalysisContext context) { + int row, column; + if (exception instanceof ExcelDataConvertException) { + ExcelDataConvertException convertException = (ExcelDataConvertException) exception; + row = convertException.getRowIndex() + 1; + column = convertException.getColumnIndex() + 1; + errorList.add(" 第" + row + "行,第 " + column + "列数据不符合要求,请检验后重新导入!"); + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrCategoryMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrCategoryMapper.java new file mode 100644 index 0000000..6c387b3 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrCategoryMapper.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 属性与属性分组关联信息 + * + * @author YXF + * @date 2020-11-23 16:20:01 + */ +public interface AttrCategoryMapper { + + /** + * 根据属性id,获取属性关联的分类id列表 + * + * @param attrId 属性id + * @return 分类id列表 + */ + List getCategoryIdsByAttrId(@Param("attrId") Long attrId); + + /** + * 批量保存属性与属性分组关联信息 + * + * @param attrId 属性id + * @param categoryIds 分类id列表 + */ + void saveBatch(@Param("attrId") Long attrId, @Param("categoryIds") List categoryIds); + + /** + * 批量删除属性与分类关联信息 + * + * @param attrId 属性与分类关联id列表 + * @param categoryIds 属性与分类关联id列表 + */ + void deleteBatch(@Param("attrId") Long attrId, @Param("categoryIds") List categoryIds); + + /** + * 据属性Id,获取属性关联的分类列表信息 + * + * @param attrId + * @param lang + * @return + */ + List listByAttrId(@Param("attrId") Long attrId, @Param("lang") Integer lang); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/BrandShopMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/BrandShopMapper.java new file mode 100644 index 0000000..fd6b077 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/BrandShopMapper.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.api.product.dto.BrandShopDTO; +import com.tmerclub.cloud.product.model.BrandShop; +import com.tmerclub.cloud.product.vo.BrandShopVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 品牌店铺关联信息 + * + * @author FrozenWatermelon + * @date 2021-05-08 11:27:23 + */ +public interface BrandShopMapper { + + /** + * 获取品牌店铺关联信息列表 + * + * @return 品牌店铺关联信息列表 + */ + List list(); + + /** + * 根据品牌店铺关联信息id获取品牌店铺关联信息 + * + * @param brandShopId 品牌店铺关联信息id + * @return 品牌店铺关联信息 + */ + BrandShop getByBrandShopId(@Param("brandShopId") Long brandShopId); + + /** + * 保存品牌店铺关联信息 + * + * @param brandShop 品牌店铺关联信息 + */ + void save(@Param("brandShop") BrandShop brandShop); + + /** + * 更新品牌店铺关联信息 + * + * @param brandShop 品牌店铺关联信息 + */ + void update(@Param("brandShop") BrandShop brandShop); + + /** + * 根据品牌店铺关联信息id删除品牌店铺关联信息 + * + * @param brandShopId + */ + void deleteById(@Param("brandShopId") Long brandShopId); + + /** + * 根据店铺id删除品牌店铺关联信息 + * + * @param shopId + * @param sysType + */ + void deleteBatchByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 根据品牌类型批量插入品牌店铺关联信息 + * + * @param shopId 店铺id + * @param brandShopDTOList 品牌信息列表 + * @param type 签约类型 + * @param sysType + */ + void insertBatch(@Param("shopId") Long shopId, @Param("brandShopList") List brandShopDTOList, + @Param("type") Integer type, @Param("sysType") Integer sysType); + + /** + * 根据店铺id获取该店铺已签约的品牌信息 + * + * @param shopId 店铺id + * @param type 品牌类型 + * @param lang 当前语言 + * @param sysType + * @return 品牌信息列表 + */ + List listByShopIdAndType(@Param("shopId") Long shopId, @Param("type") Integer type, + @Param("lang") Integer lang, @Param("sysType") Integer sysType); + + /** + * 根据店铺id获取该店铺已签约的品牌Id + * + * @param shopId 店铺id + * @param sysType + * @return 品牌Id + */ + List listBrandIdByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 根据店铺id更新品牌签约类型 + * + * @param shopId + * @param type + * @param sysType + */ + void updateTypeByShopId(@Param("shopId") Long shopId, @Param("type") Integer type, @Param("sysType") Integer sysType); + + /** + * 根据品牌id删除店铺品牌关联关系 + * + * @param brandId + */ + void deleteByBrandId(@Param("brandId") Long brandId); + + /** + * 根据店铺id与品牌id查询签约数量 + * @param shopId + * @param brandId + * @param sysType + * @return + */ + int countByShopIdAndBrandId(@Param("shopId") Long shopId, @Param("brandId") Long brandId, @Param("sysType") Integer sysType); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/CategoryShopMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/CategoryShopMapper.java new file mode 100644 index 0000000..2721d2d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/CategoryShopMapper.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.api.product.dto.CategoryShopDTO; +import com.tmerclub.cloud.product.bo.CategoryRateBO; +import com.tmerclub.cloud.product.model.CategoryShop; +import com.tmerclub.cloud.product.vo.CategoryShopVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 店铺签约分类关联信息 + * + * @Author lth + * @Date 2021/4/25 14:37 + */ +public interface CategoryShopMapper { + /** + * 根据店铺id删除所有以签约的信息 + * + * @param shopId + * @param sysType + */ + void deleteByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 批量保存分类签约信息 + * + * @param categoryShopDTOList + * @param shopId + * @param sysType + */ + void saveBatch(@Param("categoryShopList") List categoryShopDTOList, @Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 根据店铺id获取签约分类信息列表 + * + * @param shopId + * @param lang + * @param sysType + * @return + */ + List listByShopId(@Param("shopId") Long shopId, @Param("lang") Integer lang, @Param("sysType") Integer sysType); + + /** + * 根据店铺分类关联信息id获取店铺分类关联信息 + * + * @param categoryShopId 店铺分类关联信息id + * @return 店铺分类关联信息 + */ + CategoryShop getByCategoryShopId(@Param("categoryShopId") Long categoryShopId); + + /** + * 根据店铺分类关联信息id删除店铺分类关联信息 + * + * @param categoryShopId + */ + void deleteById(@Param("categoryShopId") Long categoryShopId); + + /** + * 获取店铺签约的平台三级分类佣金 + * + * @param shopId 店铺id + * @param sysType + * @return 平台佣金 + */ + List listRateByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 根据分类id删除店铺分类关联关系 + * + * @param categoryId + */ + void deleteByCategoryId(@Param("categoryId") Long categoryId); + + /** + * 根据分类id获取签约了该分类的店铺id列表 + * + * @param categoryId + * @return + */ + List listShopIdByCategoryId(@Param("categoryId") Long categoryId); + + /** + * 根据分类id列表获取店铺id列表 + * + * @param categoryIds + * @return + */ + List listShopIdByCategoryIds(@Param("categoryIds") List categoryIds); + + /** + * 根据店铺id与分类id查询签约关系 + * + * @param shopId + * @param categoryId + * @param sysType + * @return + */ + CategoryShopVO getByShopIdAndCategoryId(@Param("shopId") Long shopId, @Param("categoryId") Long categoryId, @Param("sysType") Integer sysType); + + /** + * 根据店铺id与分类id统计签约数量 + * + * @param shopId + * @param categoryId + * @param sysType + * @return + */ + int countByShopIdAndCategoryId(@Param("shopId") Long shopId, @Param("categoryId") Long categoryId, @Param("sysType") Integer sysType); + + /** + * 根据店铺id获取有相同分类的供应商 + * + * @param shopId 店铺id + * @return 供应商ids + */ + List getSupplierIdsByShopId(@Param("shopId") Long shopId); + + + /** + * 根据店铺id获取所有分类ids + * + * @param shopId 店铺id + * @param sysType + * @return 所有分类ids + */ + List getCategoryIdsByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 根据分类id获取绑定的供应商id + * + * @param categoryIds + * @return + */ + List getSupplyIdByCategoryIds(@Param("categoryIds") List categoryIds); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/GiveawayMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/GiveawayMapper.java new file mode 100644 index 0000000..e06ac88 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/GiveawayMapper.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.product.dto.GiveawayDTO; +import com.tmerclub.cloud.product.model.Giveaway; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 赠品表 + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:58 + */ +public interface GiveawayMapper { + + /** + * 获取赠品表列表 + * + * @return 赠品表列表 + */ + List list(); + + /** + * 根据商品id获取赠品 + * + * @param spuId 商品id + * @return 赠品 + */ + GiveawayVO getBySpuId(@Param("spuId") Long spuId); + + /** + * 根据店铺id获取赠品表 + * + * @param giveawayDTO + * @param lang + * @return + */ + List listByShopId(@Param("giveawayDTO") GiveawayDTO giveawayDTO, @Param("lang") Integer lang); + + /** + * 根据赠品表id获取赠品表 + * + * @param giveawayId 赠品表id + * @param lang + * @return 赠品表 + */ + GiveawayVO getByGiveawayId(@Param("giveawayId") Long giveawayId, @Param("lang") Integer lang); + + /** + * 保存赠品表 + * + * @param giveaway 赠品表 + */ + void save(@Param("giveaway") Giveaway giveaway); + + /** + * 更新赠品表 + * + * @param giveaway 赠品表 + * @param status + * @param isUpdate 是否更新,0更新,1改变状态 + * @return + */ + boolean update(@Param("giveaway") Giveaway giveaway, @Param("status") Integer status, @Param("isUpdate") Integer isUpdate); + + + /** + * 根据主商品id查询数量 + * + * @param spuId + * @param giveawayId + * @return + */ + Integer count(@Param("spuId") Long spuId, @Param("giveawayId") Long giveawayId); + + /** + * 根据主商品id查询赠品表 + * + * @param spuId + * @param giveawayId + * @param status + * @return + */ + List countList(@Param("spuId") Long spuId, @Param("giveawayId") Long giveawayId, @Param("status") Integer status); + + + /** + * 获取应该结束但是没有结束的赠品列表 + * + * @return 应该结束但是没有结束的赠品列表 + */ + List listUnEndButNeedEndActivity(); + + /** + * 获取未启动的赠品活动 + * + * @return + */ + List listUnStartButNeedStartActivity(); + + /** + * 启动未开启的赠品活动 + */ + void startGiveawayActivity(); + + /** + * 更新赠品活动状态 + * + * @param giveawayList + */ + void changeGiveawayActivityStatusByGiveawayIdList(@Param("giveawayList") List giveawayList); + + /** + * 根据赠送商品id,获取主商品id列表 + * + * @param spuId + * @return + */ + List listMainSpuIdByGiveawaySpuId(@Param("spuId") Long spuId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/ShopCartItemMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/ShopCartItemMapper.java new file mode 100644 index 0000000..1bc29a4 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/ShopCartItemMapper.java @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.product.dto.shopcart.CheckShopCartItemDTO; +import com.tmerclub.cloud.product.model.ShopCartItem; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 购物车 + * + * @author FrozenWatermelon + * @date 2020-11-21 10:01:23 + */ +public interface ShopCartItemMapper { + + /** + * 根据购物车id获取购物车 + * + * @param cartItemId 购物车id + * @return 购物车 + */ + ShopCartItemVO getByCartId(@Param("cartItemId") Long cartItemId); + + /** + * 保存购物车 + * + * @param shopCartItem 购物车 + */ + void save(@Param("shopCartItem") ShopCartItem shopCartItem); + + /** + * 更新购物车 + * + * @param shopCartItem 购物车 + */ + void update(@Param("shopCartItem") ShopCartItem shopCartItem); + + /** + * 根据用户id获取用户的购物车信息 + * + * @param userId 用户id + * @param isExpiry 是否已过期 + * @param isChecked 是否被选中 + * @param lang 语言 + * @return 购物车项 + */ + List getShopCartItems(@Param("userId") Long userId, @Param("isExpiry") Boolean isExpiry, @Param("isChecked") Boolean isChecked, @Param("lang") Integer lang); + + + /** + * 获取用户选中的购物车信息 + * + * @param userId 用户id + * @return 购物车项 + */ + List getUserShopCartItems(Long userId); + + /** + * 根据购物车项id删除购物车 + * + * @param userId 用户id + * @param shopCartItemIds 购物车项id + */ + void deleteShopCartItemsByShopCartItemIds(@Param("userId") Long userId, @Param("shopCartItemIds") List shopCartItemIds); + + /** + * 清空用户购物车 + * + * @param userId 用户id + */ + void deleteAllShopCartItems(@Param("userId") Long userId); + + /** + * 根据商品id,获取用户id,用于清空购物车商品数量的缓存 + * + * @param spuIds 商品ids + * @return 用户id列表 + */ + List listUserIdBySpuIds(@Param("spuIds") List spuIds); + + /** + * 根据供应商商品id,获取用户id,用于清空购物车商品数量的缓存 + * + * @param supplierSpuIds + * @return + */ + List listUserIdBySupplierSpuIds(@Param("supplierSpuIds") List supplierSpuIds); + + /** + * 根据套餐id,获取用户id,用于清空购物车商品数量的缓存 + * + * @param comboIds + * @return + */ + List listUserIdByComboIds(@Param("comboIds") List comboIds); + + /** + * 根据商品id,获取用户id,用于清空购物车商品数量的缓存 + * + * @param skuIds 商品SKUids + * @return 用户id列表 + */ + List listUserIdBySkuIds(@Param("skuIds") List skuIds); + + /** + * 购物项数量,有缓存 + * + * @param userId 用户id + * @return 购物项数量 + */ + Integer getShopCartItemCount(@Param("userId") Long userId); + + /** + * 勾选购车车状态 + * + * @param userId 用户id + * @param checkShopCartItems 参数 + */ + void checkShopCartItems(@Param("userId") Long userId, @Param("checkShopCartItems") List checkShopCartItems); + + /** + * 根据店铺id列表更新店铺是否停业状态 + * + * @param shopIds + * @param isClosed + */ + void updateIsCloseByShopIds(@Param("shopIds") List shopIds, @Param("isClosed") Integer isClosed); + + /** + * 更新购物车 + * + * @param shopCartItemList 购物车 + */ + void updateShopCartItemBatch(@Param("shopCartItemList") List shopCartItemList); + + /** + * 根据商品id、套餐id、用户id获取购物车信息 + * + * @param spuId + * @param comboId + * @param userId + * @param skuId + * @return + */ + ShopCartItemVO getCartItemBySpuIdAndComboId(@Param("spuId") Long spuId, @Param("comboId") Long comboId, @Param("userId") Long userId, @Param("skuId") Long skuId); + + /** + * 套餐发生变化时移除用户购物车项 + * + * @param comboIdList + * @param spuId + * @param skuId + * @return + */ + void deleteCartByComboUpdate(@Param("comboIdList") List comboIdList, @Param("spuId") Long spuId, @Param("skuId") Long skuId); + + /** + * 根据套餐id和套餐商品id集合移除用户购物车项 + * + * @param comboId + * @param spuIdList + */ + void deleteCartByComboIdAndSpuIdS(@Param("comboId") Long comboId, @Param("spuIdList") List spuIdList); + + /** + * 根据套餐id和套餐商品id集合移除用户购物车项 + * + * @param comboId + * @param spuIdList + */ + void deleteCartByComboIdAndSkuIdS(@Param("comboId") Long comboId, @Param("skuIdList") List spuIdList); + + /** + * 修改用户购物车中的套餐商品价格 + * + * @param comboId + * @param skuId + * @param price + */ + void updateCartSpuPriceByComboIdAndSkuId(@Param("comboId") Long comboId, @Param("skuId") Long skuId, @Param("price") Long price); + + /** + * 根据套餐id和套餐主商品id获取套餐搭配商品skuID + * + * @param comboId + * @param skuId + * @param userId + * @return + */ + List getMatchSkuIdList(@Param("comboId") Long comboId, @Param("skuId") Long skuId, @Param("userId") Long userId); + + /** + * 获取购物车主商品信息 + * + * @param comboId + * @param skuId + * @param userId + * @return + */ + ShopCartItemVO getComboMainSpu(@Param("comboId") Long comboId, @Param("skuId") Long skuId, @Param("userId") Long userId); + + /** + * 根据套餐id和套餐主商品id获取套餐搭配商品skuID + * + * @param parentShopCartId + * @return + */ + List getMatchSpuList(@Param("parentShopCartId") Long parentShopCartId); + + /** + * 根据套餐主商品skuId获取搭配商品id + * + * @param skuIdList + * @return + */ + List skuIdListByComboMainSkuId(@Param("skuIdList") List skuIdList); + + /** + * 根据套餐id和商品id获取购物信息 + * + * @param comboId + * @param spuId + * @return + */ + List listShopCartItemByComboIdAndSpuId(@Param("comboId") Long comboId, @Param("spuId") Long spuId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SkuComboMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SkuComboMapper.java new file mode 100644 index 0000000..1adc514 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SkuComboMapper.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.product.dto.SkuComboDTO; +import com.tmerclub.cloud.common.product.vo.SkuComboVO; +import com.tmerclub.cloud.product.model.SkuCombo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * + * + * @author lhd + * @date 2023-11-06 15:52:12 + */ +public interface SkuComboMapper { + + /** + * 获取列表 + * @return 列表 + */ + List list(); + + + /** + * 更新 + * @param skuCombo + */ + void update(@Param("skuCombo") SkuCombo skuCombo); + + /** + * 根据id删除 + * @param skuIds + */ + void deleteBySkuIds(@Param("skuIds") List skuIds); + + /** + * 根据id删除 + * @param skuIds + */ + void deleteByComboSpuIds(@Param("spuIds") List spuIds); + + /** + * 通过关联skuId删除关联信息 + * @param skuIds + */ + void deleteByComboSkuIds(@Param("skuIds") List skuIds); + + /** + * 批量保存 + * + * @param skuComboList + */ + void saveBatch(@Param("skuComboList") List skuComboList); + + /** + * 根据skuId获取所有组合商品信息 + * + * @param skuIds + * @param lang + * @return + */ + List getCombSpusBySkuIds(@Param("skuIds") List skuIds, @Param("lang") Integer lang); + + /** + * 根据skuId获取所有组合商品信息 + * + * @param spuIds + * @return + */ + List getCombSpusBySpuIds(@Param("spuIds") List spuIds); + + /** + * 获取组合商品购物项信息 + * + * @param skuIds + * @param lang + * @return + */ + List getCombShopItemsAndBySkuId(@Param("skuIds") List skuIds, @Param("lang") Integer lang); + + /** + * 根据组合关联的skuId获取所有组合商品信息 + * + * @param spuIds + * @param skuIds + * @return + */ + List getCombSpusByComboSpuIdsOrSkuIds(@Param("spuIds") List spuIds, @Param("skuIds") List skuIds); + + + /** + * 获取组合的商品中没有启用的商品数量 + * + * @param spuId + * @return + */ + Integer countDisableComboSpuBySpuId(@Param("spuId") Long spuId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SkuLangMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SkuLangMapper.java new file mode 100644 index 0000000..dab3396 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SkuLangMapper.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.common.product.vo.SkuLangVO; +import com.tmerclub.cloud.product.model.SkuLang; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * sku-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public interface SkuLangMapper { + + /** + * 获取sku-国际化表列表 + * + * @return sku-国际化表列表 + */ + List list(); + + /** + * 根据sku-国际化表id获取sku-国际化表 + * + * @param skuId sku-国际化表id + * @return sku-国际化表 + */ + List getBySkuId(@Param("skuId") Long skuId); + + /** + * 保存sku-国际化表 + * + * @param skuLang sku-国际化表 + */ + void save(@Param("skuLang") SkuLang skuLang); + + /** + * 更新sku-国际化表 + * + * @param skuLang sku-国际化表 + */ + void update(@Param("skuLang") SkuLang skuLang); + + /** + * 根据sku-国际化表id删除sku-国际化表 + * + * @param skuId + */ + void deleteById(@Param("skuId") Long skuId); + + /** + * 批量保存sku国际化信息 + * + * @param skuLangList + */ + void batchSave(@Param("skuLangList") List skuLangList); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SkuMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SkuMapper.java new file mode 100644 index 0000000..ebe2486 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SkuMapper.java @@ -0,0 +1,338 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.vo.SkuAddrVO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.product.model.Sku; +import com.tmerclub.cloud.product.model.SkuStock; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Set; + +/** + * sku信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SkuMapper { + + /** + * 获取skuVO集合 + * @param skuDTO skuDTO + * @return skuVO集合 + */ + List listSku(@Param("skuDTO") SkuDTO skuDTO); + + /** + * 更新sku信息 + * + * @param sku sku信息 + */ + void update(@Param("sku") Sku sku); + + /** + * 根据sku信息id删除sku信息 + * + * @param skuId + */ + void deleteById(@Param("skuId") Long skuId); + + /** + * 根据spuId获取sku信息 + * + * @param spuId id + * @return 返回sku信息 + */ + List listSkuWithAttrBySpuId(@Param("spuId") Long spuId); + + /** + * 批量保存 + * + * @param skuList + */ + void saveBatch(@Param("skuList") List skuList); + + /** + * 根据spuId删除sku信息 + * + * @param spuId spuId + */ + void updateBySpuId(Long spuId); + + /** + * 批量修改 + * + * @param skus 修改后的信息 + */ + void updateBatch(@Param("skus") List skus); + + + /** + * 根据skuid获取sku信息 + * + * @param skuId + * @return + */ + SkuVO getSkuBySkuId(@Param("skuId") Long skuId); + + /** + * 获取导出的sku + * + * @param product + * @return + */ + List listExportSku(@Param("product") ProductSearchDTO product); + + /** + * 获取excel导出sku数据列表 + * + * @param spuIds + * @return + */ + List excelSkuList(@Param("spuIds") List spuIds); + + + /** + * 获取excel导出sku数据列表(过滤掉下架和删除的sku) + * + * @param spuIds + * @return + */ + List listSkuBySpuIds(@Param("spuIds") List spuIds); + + /** + * 获取指定sku的价格 + * + * @param skuIds + * @return + */ + List listSkuPriceByIds(@Param("skuIds") List skuIds); + + + /** + * 根据skuId列表获取商品订单修改地址所需信息 + * + * @param skuIds skuId列表 + * @return sku列表 + */ + List listSpuDetailByIds(@Param("skuIds") List skuIds); + + /** + * 根据skuId列表获取售价最低的商品的售价 + * + * @param skuIds + * @return + */ + Long getMinPriceFeeByIds(@Param("skuIds") List skuIds); + + /** + * 根据商品id和供应商skuId获取代销sku售价 + * + * @param skuId + * @param supplierSkuId + * @return + */ + Long getPriceFeeBySpuIdAndSupplierSkuId(@Param("spuId") Long skuId, @Param("supplierSkuId") Long supplierSkuId); + + + /** + * 根据供应商品skuId和spuId获取代销商品skuId + * + * @param supplierSkuId + * @param spuId + * @return + */ + Long getSkuIdBySupplierSkuId(@Param("supplierSkuId") Long supplierSkuId, @Param("spuId") Long spuId); + + /** + * 根据skuid获取sku信息 + * + * @param skuIdList + * @return + */ + List listSkuBySkuIds(@Param("skuIdList") List skuIdList); + + /** + * 根据商品编码获取商品规格列表 + * + * @param partyCodeList 商品编码 + * @return 商品信息 + */ + List listByPartyCodeList(@Param("partyCodeList") List partyCodeList); + + /** + * 根据商品编码和店铺id获取 + * + * @param partyCode + * @param shopId + * @param sysType + * @return + */ + StockBillLogItemDTO getSkuByPartyCodeAndShopId(@Param("partyCode") String partyCode, @Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 根据spuId获取sku + * + * @param spuId + * @return + */ + List getBySpuId(@Param("spuId") Long spuId); + + /** + * 获取当前商家的所有sku编码 + * + * @param shopId + * @param sysType + * @param spuId + * @return + */ + List listSkuPartyCodesByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType, @Param("spuId") Long spuId); + + /** + * 根据spuId和供应商skuId获取skuId + * + * @param spuId + * @param supplierSkuId + * @return + */ + Long getSkuIdBySpuIdAndSupplierSkuId(@Param("spuId") Long spuId, @Param("supplierSkuId") Long supplierSkuId); + + + /** + * 获取商品库存预警数量 + * + * @param product 商品筛选 + * @return + */ + Integer getStockWarningNum(@Param("product") ProductSearchDTO product); + + /** + * 根据供应商skuId获取代销skuId列表 + * + * @param supplierSkuId + * @return + */ + List getSkuIdsBySupplierSkuId(@Param("supplierSkuId") Long supplierSkuId); + + /** + * 根据供应商skuId,获取代销skuId + * + * @param shopId 指定查询的店铺 + * @param skuIds + * @return + */ + List listShopSkuPriceBySupplierSkuIds(@Param("shopId") Long shopId, @Param("skuIds") List skuIds); + + /** + * 根据店铺id和商品编码获取skuId列表 + * + * @param partyCode 商品编码 + * @param shopId 店铺id + * @param supplierId 供应商id + * @return skuId列表 + */ + List listSkuByPartyCodeAndShopId(@Param("partyCode") String partyCode, + @Param("shopId") Long shopId, + @Param("supplierId") Long supplierId); + + + /** + * 库存查询 + * + * @param product + * @return + */ + List pageSku(@Param("product") ProductSearchDTO product); + + /** + * 获取商品的skuId列表 + * + * @param spuId + * @return + */ + List listSkuIdBySpuId(@Param("spuId") Long spuId); + + /** + * 获取商品的skuId列表 + * + * @param spuIds + * @return + */ + List listSimpleSkuBySpuIds(@Param("spuIds") List spuIds); + + /** + * 获取商品的供应商skuId列表 + * + * @param spuIds + * @param shopId + * @return + */ + List listSupplierSkuIdBySpuId(@Param("spuIds") List spuIds, @Param("shopId") Long shopId); + + /** + * 初始化商品库存的分页查询 + * + * @param skuIds + * @return + */ + List listSkuStock(@Param("skuIds") List skuIds); + + /** + * 根据商品编码和店铺id获取skuId列表 + * + * @param partyCodes + * @param shopId + * @return + */ + List listSkuIdByPartyCodesAndShopId(@Param("partyCodes") List partyCodes, @Param("shopId") Long shopId); + + /** + * 获取指定商品的sku列表 + * + * @param spuIds + * @return + */ + List listBySpuIds(@Param("spuIds") List spuIds); + + /** + * 批量更新库存预警状态 + * + * @param skuList + */ + void batchUpdateSkuWarning(@Param("skuList") List skuList); + + /** + * 获取所有的sku数据 + * @return + */ + List listAll(); + + /** + * 获取指定商品的skuId列表和组合商品的sku组合列表 + * @param spuId + * @return + */ + List listSimpleSkuAndComboBySpuId(@Param("spuId") Long spuId); + + + /** + * 获取状态正常的规格数量 + * + * @param skuIds + * @return + */ + int countNormalSkuBySkuIds(@Param("skuIds") Set skuIds); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuAttrValueLangMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuAttrValueLangMapper.java new file mode 100644 index 0000000..57c1120 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuAttrValueLangMapper.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.model.SpuAttrValueLang; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 属性值-国际化表 + * + * @author YXF + * @date 2021-04-15 16:47:33 + */ +public interface SpuAttrValueLangMapper { + + /** + * 获取属性值-国际化表列表 + * @return 属性值-国际化表列表 + */ + List list(); + + /** + * 根据属性值-国际化表id获取属性值-国际化表 + * + * @param spuAttrValueId 属性值-国际化表id + * @return 属性值-国际化表 + */ + SpuAttrValueLang getBySpuAttrValueId(@Param("spuAttrValueId") Long spuAttrValueId); + + /** + * 保存属性值-国际化表 + * @param spuAttrValueLang 属性值-国际化表 + */ + void save(@Param("spuAttrValueLang") SpuAttrValueLang spuAttrValueLang); + + /** + * 更新属性值-国际化表 + * @param spuAttrValueLang 属性值-国际化表 + */ + void update(@Param("spuAttrValueLang") SpuAttrValueLang spuAttrValueLang); + + /** + * 根据属性值-国际化表id删除属性值-国际化表 + * @param spuAttrValueId + */ + void deleteById(@Param("spuAttrValueId") Long spuAttrValueId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuConsignmentChangeMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuConsignmentChangeMapper.java new file mode 100644 index 0000000..4109f78 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuConsignmentChangeMapper.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.model.SpuConsignmentChange; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商家代销商品基本信息相对于供应商品是否改变 + * + * @author FrozenWatermelon + * @date 2022-08-11 22:21:10 + */ +public interface SpuConsignmentChangeMapper { + + /** + * 获取商家代销商品基本信息相对于供应商品是否改变列表 + * @return 商家代销商品基本信息相对于供应商品是否改变列表 + */ + List list(); + + /** + * 根据商家代销商品基本信息相对于供应商品是否改变id获取商家代销商品基本信息相对于供应商品是否改变 + * + * @param consignmentChangeId 商家代销商品基本信息相对于供应商品是否改变id + * @return 商家代销商品基本信息相对于供应商品是否改变 + */ + SpuConsignmentChange getByConsignmentChangeId(@Param("consignmentChangeId") Long consignmentChangeId); + + /** + * 保存商家代销商品基本信息相对于供应商品是否改变 + * @param spuConsignmentChange 商家代销商品基本信息相对于供应商品是否改变 + */ + void save(@Param("spuConsignmentChange") SpuConsignmentChange spuConsignmentChange); + + /** + * 更新商家代销商品基本信息相对于供应商品是否改变 + * @param spuConsignmentChange 商家代销商品基本信息相对于供应商品是否改变 + */ + void update(@Param("spuConsignmentChange") SpuConsignmentChange spuConsignmentChange); + + /** + * 根据商家代销商品基本信息相对于供应商品是否改变id删除商家代销商品基本信息相对于供应商品是否改变 + * @param consignmentChangeId + */ + void deleteById(@Param("consignmentChangeId") Long consignmentChangeId); + + /** + * 根据代销商品Id更新商家代销商品基本信息相对于供应商品是否改变 + * @param spuConsignmentChange 商家代销商品基本信息相对于供应商品是否改变 + */ + void updateBySpuId(@Param("spuConsignmentChange") SpuConsignmentChange spuConsignmentChange); + + /** + * 根据商品id获取商家代销商品基本信息相对于供应商品是否改变 + * + * @param spuId 商品id + * @return 商家代销商品基本信息相对于供应商品是否改变 + */ + SpuConsignmentChange getBySpuId(@Param("spuId") Long spuId); + + /** + * 根据商品id批量获取商家代销商品基本信息相对于供应商品是否改变 + * @param spuIdList + * @return + */ + List batchGetBySpuIdList(@Param("spuIdList") List spuIdList); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuMapper.java new file mode 100644 index 0000000..281046e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuMapper.java @@ -0,0 +1,652 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.api.product.bo.SpuSimpleBO; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.product.dto.SpuPageSearchDTO; +import com.tmerclub.cloud.product.model.Spu; +import com.tmerclub.cloud.product.vo.PlatformSpuExcelVO; +import com.tmerclub.cloud.product.vo.SpuCountVO; +import com.tmerclub.cloud.product.vo.SpuExcelVO; +import com.tmerclub.cloud.product.vo.SupplierSpuExcelVO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; +import java.util.Set; + +/** + * spu信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SpuMapper { + + /** + * 获取spu信息列表 + * + * @param spu + * @return spu信息列表 + */ + List list(@Param("spu") SpuPageSearchDTO spu); + + /** + * 获取商品sku列表 + * + * @param spuDTO + * @param lang + * @return + */ + List pageSpuSku(@Param("spuDTO") SpuDTO spuDTO, @Param("lang") Integer lang); + + /** + * 根据spu信息id获取spu信息 + * + * @param spuId spu信息id + * @return spu信息 + */ + SpuVO getBySpuId(@Param("spuId") Long spuId); + + /** + * 根据spu信息id获取spu信息 + * + * @param spuId spu信息id + * @return spu信息 + */ + SpuVO getSpuInfoBySpuId(@Param("spuId") Long spuId); + + /** + * 保存spu信息 + * + * @param spu spu信息 + */ + void save(@Param("spu") Spu spu); + + /** + * 更新spu信息 + * + * @param spu spu信息 + */ + void update(@Param("spu") Spu spu); + + /** + * 根据商品id修改商品状态 + * + * @param spuId 商品id + */ + void updateStatusBySpuId(@Param("spuId") Long spuId); + + /** + * 根据spuId获取商品信息(搜索) + * + * @param spuId + * @return 商品信息 + */ + EsProductBO loadEsProductBO(@Param("spuId") Long spuId); + + /** + * 获取 spuId列表 + * + * @param shopCategoryIds 店铺分类id列表 + * @param categoryIds 平台分类Id列表 + * @param brandId 品牌id + * @param shopId 店铺id + * @return spuId列表 + */ + List getSpuIdsBySpuUpdateDTO(@Param("shopCategoryIds") List shopCategoryIds, @Param("categoryIds") List categoryIds + , @Param("brandId") Long brandId, @Param("shopId") Long shopId); + + /** + * 批量改变商品状态(上下架) + * + * @param spuIds + * @param status + */ + void batchChangeSpuStatus(@Param("spuIds") List spuIds, @Param("status") Integer status); + + /** + * 更新spu表(canal监听后,会发送更新的消息,更新es中的数据) + * + * @param spuIds + * @param categoryIds + * @param shopIds + * @param sysType + */ + void updateSpuUpdateTime(@Param("spuIds") List spuIds, @Param("categoryIds") List categoryIds, @Param("shopIds") List shopIds, @Param("sysType") Integer sysType); + + /** + * 下线店铺中的商品 + * + * @param shopId + */ + void offlineSpuByShopId(@Param("shopId") Long shopId); + + /** + * 下线店铺中的商品 + * + * @param supplierId + */ + void offlineSpuBySupplierId(@Param("supplierId") Long supplierId); + + /** + * 获取spu信息列表(excel导出) + * + * @param spuDTO + * @return + */ + List excelSpuList(@Param("spuSearch") SpuPageSearchDTO spuDTO); + + /** + * 根据spuId或者为空直接获取可以参与秒杀活动的商品列表 + * + * @param pageAdapter 分页数据 + * @param spuDTO 店铺id + * @param lang 语言 + * @return 商品信息 + */ + List listCanSeckillProd(@Param("page") PageAdapter pageAdapter, @Param("spuDTO") SpuDTO spuDTO, @Param("lang") Integer lang); + + /** + * 根据运费id获取商品数量 + * + * @param transportId + * @return + */ + Integer countByTransportId(@Param("transportId") Long transportId); + + /** + * 变为普通商品 + * + * @param spuIds + */ + void changeToNormalSpu(@Param("spuIds") List spuIds); + + /** + * 根据分类id与店铺id查询使用该分类的商品数量 + * + * @param categoryId + * @param shopId + * @param sysType + * @return + */ + int countByCategoryAndShopId(@Param("categoryId") Long categoryId, @Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 根据用户id查询商品收藏数量 + * + * @param userId 用户id + * @return 商品收藏数量 + */ + Integer countByUserId(@Param("userId") Long userId); + + /** + * 获取商品id列表, 商品的店铺id列表, + * + * @param spuIds 商品的店铺id列表 + * @return 商品id列表 + */ + List spuShopIdsBySpuIds(@Param("spuIds") List spuIds); + + /** + * 批量修改 + * + * @param spuList 修改后的商品信息 + */ + void updateBatch(@Param("spuList") List spuList); + + /** + * 根据分类id列表与店铺id获取商品id列表 + * + * @param cidList + * @param shopId + * @param sysType + * @return + */ + List listIdByCidAndShopId(@Param("cidList") List cidList, @Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 根据分类id列表与店铺id或者商品id获取活动商品列表 + * + * @param type 下线商品和活动类型,1.直接通过商品ids,2.通过shopId判断为平台还是店铺分类ids进行下架,3.下线店铺通过shopId + * @param spuIds 商品ids + * @param shopId 店铺id + * @param categoryIds 分类id + * @param status 修改后的商品状态,为空 默认查询条件status是1 + * @param shopIds + * @return 商品信息 + */ + List getActivitySpuInfoByCategoryIdsAndShopId(@Param("type") Integer type, @Param("spuIds") List spuIds, + @Param("shopId") Long shopId, @Param("categoryIds") List categoryIds, + @Param("status") Integer status, @Param("shopIds") List shopIds); + + /** + * 获取商品信息列表 + * + * @param spuIds 商品ids + * @return + */ + List listSpuBySpuIds(@Param("spuIds") List spuIds); + + /** + * 获取商品详细信息列表 + * + * @param spuIds 商品ids + * @return + */ + List listSpuDetailBySpuIds(@Param("spuIds") List spuIds); + + /** + * 获取未删除商品数量 + * + * @param time + * @return 商品数量 + */ + Long getAllSpuNum(@Param("time") Date time); + + /** + * 根据商品更新时间,获取商品id列表 + * + * @param time + * @return + */ + List listAllSpu(@Param("time") Date time); + + /** + * 根据店铺id列表与商品状态获取商品id列表 + * + * @param sysType + * @param shopIds + * @param status + * @param disStatus + * @return + */ + List listSpuIdByShopIdsAndStatus(@Param("sysType") Integer sysType, @Param("shopIds") List shopIds, @Param("status") Integer status, @Param("disStatus") Integer disStatus); + + + /** + * 根据商品id设置商品是否置顶 + * + * @param spuId + */ + void toTopBySpuId(@Param("spuId") Long spuId); + + /** + * 批量更新商品,允许设置字段为空 + * + * @param spuList 商品集合 + * @return + */ + Integer updateBatchFieldSetNull(@Param("spuList") List spuList); + + /** + * 根据基本信息获取商品列表 + * + * @param spuSimpleBO + * @return + */ + List listSimple(@Param("spuSimpleBO") SpuSimpleBO spuSimpleBO); + + /** + * 根据基本信息获取商品列表(包含删除商品 + * + * @param spuSimpleBO + * @return + */ + List listSimples(@Param("spuSimpleBO") SpuSimpleBO spuSimpleBO); + + /** + * 根据商品id列表获取商品名称列表 + * + * @param spuIds 商品id列表 + * @return 商品列表 + */ + List listSpuNameBySpuIds(@Param("spuIds") List spuIds); + + /** + * 根据店铺id列表获取商品id列表 + * + * @param shopIds + * @return + */ + List getSpuIdsByShopIds(@Param("shopIds") List shopIds); + + /** + * 移除商品中指定的品牌信息 + * + * @param brandId + */ + void removeBrandOfSpu(@Param("brandId") Long brandId); + + /** + * 根据spuIds获取spu状态列表 + * + * @param spuIds + * @return + */ + List listSpuStatusByIds(@Param("spuIds") List spuIds); + + /** + * 根据供应商Id查询不同状态下商品数量 + * + * @param supplierId + * @return + */ + SpuCountVO getSpuCountBySupplierId(@Param("supplierId") Long supplierId); + + + /** + * 根据店铺id和供应商商品id判断店铺是否代销了 + * + * @param shopId + * @param supplierSpuId + * @return + */ + Integer isCommissionByShopIdAndSpuId(@Param("shopId") Long shopId, @Param("supplierSpuId") Long supplierSpuId); + + /** + * 根据供应商商品skuId获取代销商品id集合 + * + * @param skuId + * @return + */ + List getSupplierSupIdBySkuId(@Param("skuId") Long skuId); + + /** + * 根据店铺id获取供应商商品id列表 + * + * @param shopId + * @return + */ + List getSupplierSpuId(@Param("shopId") Long shopId); + + /** + * 获取代销spu信息列表(excel导出) + * + * @param spuDTO + * @return + */ + List excelSupplierSpuList(@Param("spuSearch") SpuPageSearchDTO spuDTO); + + /** + * 根据店铺id和供应商商品id获取代销商品信息 + * + * @param shopId + * @param supplierSpuId + * @return + */ + SpuVO getSpuByShopIdAndSupplierSpuId(@Param("shopId") Long shopId, @Param("supplierSpuID") Long supplierSpuId); + + /** + * 根据店铺id和供应商品id列表获取代销商品id列表 + * + * @param shopId + * @param supplierSpuId + * @return + */ + List getSpuIdByShopIdAndSupplierSpuId(@Param("shopId") Long shopId, @Param("supplierSpuId") List supplierSpuId); + + /** + * 获取代销商品spu信息列表 + * + * @param spu + * @return spu信息列表 + */ + List supplierSpuList(@Param("spu") SpuPageSearchDTO spu); + + /** + * 根据店铺id和供应商商品id列表批量获取代销商品信息 + * + * @param shopId + * @param supplierSpuIds + * @return + */ + List listSpuByShopIdAndSupplierSpuId(@Param("shopId") Long shopId, @Param("supplierSpuIds") List supplierSpuIds); + + /** + * 批量设置供应商商品更新后代销商品是否已同步更新值 + * + * @param spuIds + * @param isSynUpdate + */ + void batchChangeSynUpdate(@Param("spuIds") List spuIds, @Param("isSynUpdate") Integer isSynUpdate); + + /** + * 供应商商品更新后代销商品是否已同步更新值 + * + * @param spuId + * @param isSynUpdate + */ + void changeSynUpdate(@Param("spuId") Long spuId, @Param("isSynUpdate") Integer isSynUpdate); + + /** + * 根据供应商商品id获取代销商品id集合 + * + * @param supplierId + * @return + */ + List getSupIdListBySupplierId(@Param("supplierId") Long supplierId); + + /** + * 根据供应商商品id列表获取代销商品id集合 + * + * @param supplierIds + * @return + */ + List batchSupIdListBySupplierId(@Param("supplierIds") List supplierIds); + + /** + * 根据供应商商品id列表获取代销商品id集合 + * + * @param supplierIds + * @return + */ + List batchSupListBySupplierId(@Param("supplierIds") List supplierIds); + + /** + * 根据供应商id和商品类型批量获取商品信息 + * + * @param supplierId + * @param createTime + * @param supplierSpuType + * @return + */ + List getSpuIdsBySupplierIdAndSupplierSpuType(@Param("supplierId") Long supplierId, @Param("createTime") Date createTime, @Param("supplierSpuType") Integer supplierSpuType); + + /** + * 根据供应商id批量获取商家代销商品信息 + * + * @param supplierId + * @return + */ + List listMerchantSpuIdsBySupplierId(@Param("supplierId") Long supplierId); + + /** + * 根据供应商商品id获取发货方式为供应商的代销商品信息 + * + * @param supplierSpuId + * @return + */ + List listSpuBySupplierSpuId(@Param("supplierSpuId") Long supplierSpuId); + + /** + * 根据spuCode查询商品数量 + * + * @param spuCode + * @param spuId + * @param supplierSpuId + * @return + */ + Integer getCountBySpuCode(@Param("spuCode") String spuCode, @Param("spuId") Long spuId, @Param("supplierSpuId") Long supplierSpuId); + + /** + * 根据供应商品id获取代销商品Id集合 + * + * @param supplierSpuId + * @param deliveryType + * @return + */ + List getCommissionSpuIdList(@Param("supplierSpuIds") Long supplierSpuId, @Param("deliveryType") Integer deliveryType); + + /** + * 根据供应商品id获取发货方式为供应商发货代销商品Id集合 + * + * @param supplierSpuId + * @return + */ + List getCommissionSpuListBySupplierDeliver(@Param("supplierSpuId") Long supplierSpuId); + + /** + * 获取代销商品的 供应商商品更新后代销商品是否已同步更新 值 + * + * @param spuIds + * @return + */ + List getSpuIsSynUpdate(@Param("spuIds") List spuIds); + + /** + * 批量修改代销商品发货方式 + * + * @param spuIds + * @param deliverType + */ + void batchUpdateCommissionSpuDeliverType(@Param("spuIds") List spuIds, @Param("deliverType") Integer deliverType); + + /** + * 根据供应商品id获取代销商品集合 + * + * @param supplierSpuId + * @return + */ + List getCommissionSpuList(@Param("supplierSpuId") Long supplierSpuId); + + /** + * 获取商家端的代销商品 + * + * @param shopId + * @return + */ + List getCommissionSpuListByShopId(@Param("shopId") Long shopId); + + /** + * 更新商品的品牌信息(删除签约品牌时,同步更改相关的商品品牌信息) + * + * @param brandIdList + * @param shopId + * @param sysType + */ + void updateSpuByBrandIdAndShopId(@Param("brandIdList") List brandIdList, @Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 根据供应商id和商品状态获取供应商品 + * + * @param supplierId + * @param status + * @return + */ + List getSupplierSpuBySupplierId(@Param("supplierId") Long supplierId, @Param("status") Integer status); + + /** + * 根据spuIds获取多个spu信息 + * + * @param spuIds + * @return + */ + List getBySpuIds(@Param("spuIds") List spuIds); + + /** + * 获取除当前状态以外的商品id + * + * @param status + * @return + */ + List listSpuIdsByExcludeStatus(@Param("status") Integer status); + + /** + * 获取平台商品导出列表 + * + * @param spuIds + * @return + */ + List listPlatformSpuExcel(@Param("spuIds") List spuIds); + + /** + * 获取供应商库存预警数量 + * + * @param supplierId + * @return + */ + Long stockWarningCount(@Param("supplierId") Long supplierId); + + /** + * 获取列表 + * + * @return + */ + List getVirtualSpuList(); + + /** + * 根据店铺id更新商品 + * + * @param shopId 店铺id + * @param sysType 系统类型 + */ + void updateSpuByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 获取店铺中指定供应商商品的代销商品列表 + * + * @param shopId + * @param supplierSpuIds + * @return + */ + List listShopSpuBySupplierSpuIds(@Param("shopId") Long shopId, @Param("supplierSpuIds") List supplierSpuIds); + + /** + * 获取库存点spu信息列表 + * + * @param spuDTO + * @return spu信息列表 + */ + List listPointSpu(@Param("spuDTO") StockPointSkuDTO spuDTO); + + /** + * 获取库存点spu和sku信息列表 + * @param spuDTO spuDTO + * @return spu信息列表 + */ + List listStockPointSpuAndSku(@Param("spuDTO") StockPointSkuDTO spuDTO); + + + /** + * 获取状态正常的商品数量 + * + * @param spuIds + * @param skuIds + * @return + */ + int countNormalSpuBySpuIds(@Param("spuIds") Set spuIds); + + /** + * 获取店铺/供应商spu编码集合 + * @param tenantId 租户id + * @param sysType 系统类 + * @param spuId 商品spuId + * @return spu编码集合 + */ + List listSpuCodes(@Param("tenantId") Long tenantId, + @Param("sysType") Integer sysType, + @Param("spuId") Long spuId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuPriceLogMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuPriceLogMapper.java new file mode 100644 index 0000000..88405ea --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuPriceLogMapper.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.dto.SpuPriceLogDTO; +import com.tmerclub.cloud.product.model.SpuPriceLog; +import com.tmerclub.cloud.product.vo.SpuPriceLogVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商品调价记录 + * + * @author lhd + * @date 2022-06-29 17:48:25 + */ +public interface SpuPriceLogMapper { + + /** + * 根据商品调价记录id获取商品调价记录 + * + * @param id 商品调价记录id + * @return 商品调价记录 + */ + SpuPriceLog getById(@Param("id") Long id); + + /** + * 保存商品调价记录 + * + * @param spuPriceLog 商品调价记录 + */ + void save(@Param("spuPriceLog") SpuPriceLog spuPriceLog); + + /** + * 更新商品调价记录 + * + * @param spuPriceLog 商品调价记录 + */ + void update(@Param("spuPriceLog") SpuPriceLog spuPriceLog); + + /** + * 根据商品调价记录id删除商品调价记录 + * + * @param id + */ + void deleteById(@Param("id") Long id); + + /** + * 批量插入商品调价记录 + * + * @param spuPriceLogList + */ + void insertBatch(@Param("spuPriceLogList") List spuPriceLogList); + + /** + * 根据搜索条件获取 + * + * @param spuPriceLogDTO + * @return + */ + List pageByParam(@Param("spuPriceLogDTO") SpuPriceLogDTO spuPriceLogDTO); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuSkuAttrValueLangMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuSkuAttrValueLangMapper.java new file mode 100644 index 0000000..3c3cf0c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuSkuAttrValueLangMapper.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.model.SpuSkuAttrValueLang; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商品sku销售属性关联信息-国际化 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public interface SpuSkuAttrValueLangMapper { + + /** + * 获取商品sku销售属性关联信息-国际化列表 + * + * @return 商品sku销售属性关联信息-国际化列表 + */ + List list(); + + /** + * 根据商品sku销售属性关联信息-国际化id获取商品sku销售属性关联信息-国际化 + * + * @param spuSkuAttrId 商品sku销售属性关联信息-国际化id + * @return 商品sku销售属性关联信息-国际化 + */ + SpuSkuAttrValueLang getBySpuSkuAttrId(@Param("spuSkuAttrId") Long spuSkuAttrId); + + /** + * 保存商品sku销售属性关联信息-国际化 + * + * @param spuSkuAttrValueLang 商品sku销售属性关联信息-国际化 + */ + void save(@Param("spuSkuAttrValueLang") SpuSkuAttrValueLang spuSkuAttrValueLang); + + /** + * 更新商品sku销售属性关联信息-国际化 + * + * @param spuSkuAttrValueLang 商品sku销售属性关联信息-国际化 + */ + void update(@Param("spuSkuAttrValueLang") SpuSkuAttrValueLang spuSkuAttrValueLang); + + /** + * 根据商品sku销售属性关联信息-国际化id删除商品sku销售属性关联信息-国际化 + * + * @param spuSkuAttrId + */ + void deleteById(@Param("spuSkuAttrId") Long spuSkuAttrId); + + /** + * 批量保存 + * + * @param spuSkuAttrValueLangList + */ + void batchSave(@Param("spuSkuAttrValueLangList") List spuSkuAttrValueLangList); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuSupplierChangeLogMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuSupplierChangeLogMapper.java new file mode 100644 index 0000000..1d61b07 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuSupplierChangeLogMapper.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.model.SpuSupplierChangeLog; +import com.tmerclub.cloud.product.vo.SpuSupplierChangeLogVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商品供应商变更记录 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public interface SpuSupplierChangeLogMapper { + + /** + * 根据商品供应商变更记录id获取商品供应商变更记录 + * + * @param spuChangeId 商品供应商变更记录id + * @return 商品供应商变更记录 + */ + SpuSupplierChangeLog getBySpuChangeId(@Param("spuChangeId") Long spuChangeId); + + /** + * 保存商品供应商变更记录 + * + * @param spuSupplierChangeLog 商品供应商变更记录 + */ + void save(@Param("spuSupplierChangeLog") SpuSupplierChangeLog spuSupplierChangeLog); + + /** + * 更新商品供应商变更记录 + * + * @param spuSupplierChangeLog 商品供应商变更记录 + */ + void update(@Param("spuSupplierChangeLog") SpuSupplierChangeLog spuSupplierChangeLog); + + /** + * 根据商品供应商变更记录id删除商品供应商变更记录 + * + * @param spuChangeId + */ + void deleteById(@Param("spuChangeId") Long spuChangeId); + + /** + * 根据商品id获取商品变更信息 + * + * @param spuIds + * @return + */ + List listBySpuIds(@Param("spuIds") List spuIds); + + /** + * 批量上下架变更记录 + * + * @param spuIds + * @param changeType + */ + void insertBatch(@Param("spuIds") List spuIds, @Param("changeType") Integer changeType); + + /** + * 批量插入变更记录 + * + * @param spuSupplierChangeLogs + */ + void saveBatch(@Param("spuSupplierChangeLogs") List spuSupplierChangeLogs); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuTagMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuTagMapper.java new file mode 100644 index 0000000..c86c1ce --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuTagMapper.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.dto.SpuTagDTO; +import com.tmerclub.cloud.product.model.SpuTag; +import com.tmerclub.cloud.product.vo.SpuTagVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商品分组表 + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +public interface SpuTagMapper { + + /** + * 根据标签名称分页获取商品分组表列表 + * + * @param spuTagDTO 筛选参数 + * @return 商品分组表列表分页数据 + */ + List list(@Param("spuTag") SpuTagDTO spuTagDTO); + + /** + * 根据商品分组表id获取商品分组表 + * + * @param id 商品分组表id + * @return 商品分组表 + */ + SpuTagVO getById(@Param("id") Long id); + + /** + * 保存商品分组表 + * + * @param spuTag 商品分组表 + */ + void save(@Param("spuTag") SpuTag spuTag); + + /** + * 更新商品分组表 + * + * @param spuTag 商品分组表 + */ + void update(@Param("spuTag") SpuTag spuTag); + + /** + * 根据商品分组表id删除商品分组表 + * + * @param id + */ + void deleteById(@Param("id") Long id); + + /** + * 修改标签商品数量 + * + * @param id 标签信息 + */ + void updateProdCountById(@Param("id") Long id); + + /** + * 批量修改标签商品数量 + * + * @param ids 标签信息 + */ + void batchUpdateProdCountById(@Param("ids") List ids); + + /** + * 根据店铺id获取分组信息 + * + * @param shopId 店铺id + * @return 分组信息 + */ + List listByShopId(@Param("shopId") Long shopId); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockBillLogMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockBillLogMapper.java new file mode 100644 index 0000000..a278758 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockBillLogMapper.java @@ -0,0 +1,15 @@ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.model.StockBillLog; +/** + * @author lanhai + */ +public interface StockBillLogMapper { + + /** + * 保存 + * + * @param stockBillLog + */ + void save(StockBillLog stockBillLog); +} \ No newline at end of file diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockChangeReasonLangMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockChangeReasonLangMapper.java new file mode 100644 index 0000000..ed4359a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockChangeReasonLangMapper.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.dto.StockChangeReasonDTO; +import com.tmerclub.cloud.product.model.StockChangeReasonLang; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 出入库原因-国际化 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public interface StockChangeReasonLangMapper { + + /** + * 获取出入库原因-国际化列表 + * + * @return 出入库原因-国际化列表 + */ + List list(); + + /** + * 根据出入库原因-国际化id获取出入库原因-国际化 + * + * @param stockChangeReasonId 出入库原因-国际化id + * @return 出入库原因-国际化 + */ + List getByStockChangeReasonId(@Param("stockChangeReasonId") Long stockChangeReasonId); + + /** + * 保存出入库原因-国际化 + * + * @param stockChangeReasonLang 出入库原因-国际化 + */ + void save(@Param("stockChangeReasonLang") StockChangeReasonLang stockChangeReasonLang); + + /** + * 更新出入库原因-国际化 + * + * @param stockChangeReasonLang 出入库原因-国际化 + */ + void update(@Param("stockChangeReasonLang") StockChangeReasonLang stockChangeReasonLang); + + /** + * 根据出入库原因-国际化id删除出入库原因-国际化 + * + * @param stockChangeReasonId + */ + void deleteById(@Param("stockChangeReasonId") Long stockChangeReasonId); + + /** + * 根据出入库原因获取个数 + * + * @param stockChangeReasonDTO + * @return + */ + Integer countReason(@Param("stockChangeReasonDTO") StockChangeReasonDTO stockChangeReasonDTO); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockPointSkuMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockPointSkuMapper.java new file mode 100644 index 0000000..8d259e1 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockPointSkuMapper.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import com.tmerclub.cloud.product.model.StockPointSku; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-09 18:00:43 + */ +public interface StockPointSkuMapper { + + /** + * 获取列表 + * @return 列表 + */ + List list(); + + /** + * 获取库存点skuVO集合 + * @param stockPointSkuDTO 库存点skuDTO + * @return 库存点skuVO集合 + */ + List listStockPointSku(@Param("stockPointSkuDTO") StockPointSkuDTO stockPointSkuDTO); + + /** + * 根据id获取 + * + * @param stockPointSkuId id + * @return + */ + StockPointSku getByStockPointSkuId(@Param("stockPointSkuId") Long stockPointSkuId); + + /** + * 保存 + * @param stockPointSku + */ + void save(@Param("stockPointSku") StockPointSku stockPointSku); + + /** + * 更新 + * @param stockPointSku + */ + void update(@Param("stockPointSku") StockPointSku stockPointSku); + + /** + * 根据id删除 + * @param stockPointSkuId + */ + void deleteById(@Param("stockPointSkuId") Long stockPointSkuId); + + /** + * 根据id集合删除 + * @param stockPointSkuIds 关联id集合 + */ + void deleteByIds(@Param("stockPointSkuIds") List stockPointSkuIds); + + /** + * 根据商品id删除 + * @param spuId + */ + void deleteBySpuId(@Param("spuId") Long spuId); + + /** + * 批量保存 + * @param stockPointSkuList + */ + void batchSave(@Param("stockPointSkuList") List stockPointSkuList); + + /** + * 批量删除 + * @param stockPointSkuIdList + */ + void batchDeleteByStockPointSkuIdList(@Param("stockPointSkuIdList") List stockPointSkuIdList); + + /** + * 根据skuid获取所有的库存点关联仓库信息 + * @param skuIds + * @return + */ + List listBySkuIds(@Param("skuIds") List skuIds); + + /** + * 获取库存关联点数量 + * @param stockPointId + * @return + */ + List listByPointId(@Param("stockPointId") Long stockPointId); + + /** + * 根据skuid和库存点id删除数据 + * @param skuId + * @param stockPointId + */ + void removeBySkuIdAndPointId(@Param("skuId") Long skuId, @Param("stockPointId") Long stockPointId); + + /** + * 获取指定sku的仓库列表 + * @param skuIds + * @return + */ + List listPointBySkuIds(@Param("skuIds") List skuIds); + + /** + * 根据库存点id修改库存模式 + * @param stockPointId + * @param stockMode + */ + void updateStockMode(@Param("stockPointId")Long stockPointId, @Param("stockMode")Integer stockMode); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/TakeStockMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/TakeStockMapper.java new file mode 100644 index 0000000..79f1809 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/TakeStockMapper.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.dto.TakeStockDTO; +import com.tmerclub.cloud.product.model.TakeStock; +import com.tmerclub.cloud.product.vo.TakeStockExcelVO; +import com.tmerclub.cloud.product.vo.TakeStockVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public interface TakeStockMapper { + + /** + * 获取列表 + * + * @return 列表 + */ + List list(@Param("takeStockDTO") TakeStockDTO takeStockDTO); + + /** + * 根据id获取 + * + * @param takeStockId id + * @return + */ + TakeStock getByTakeStockId(@Param("takeStockId") Long takeStockId); + + /** + * 保存 + * + * @param takeStock + */ + void save(@Param("takeStock") TakeStock takeStock); + + /** + * 更新 + * + * @param takeStock + */ + void update(@Param("takeStock") TakeStock takeStock); + + /** + * 根据id删除 + * + * @param takeStockId + */ + void deleteById(@Param("takeStockId") Long takeStockId); + + /** + * 通过参数分页查找 + * + * @param lang + * @param takeStockDTO + * @return + */ + List pageByParam(@Param("lang") Integer lang, @Param("takeStockDTO") TakeStockDTO takeStockDTO); + + /** + * 获取实物盘点导出数据 + * + * @param takeStockDTO + * @param lang + * @return + */ + List listTakeStockExportData(@Param("takeStockDTO") TakeStockDTO takeStockDTO, @Param("lang") Integer lang); + + /** + * 统计未完成的实物盘点数 + * @param warehouseId 仓库id + * @return 未完成数 + */ + Long countUnFinish(@Param("warehouseId") Long warehouseId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/WarehouseAreaMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/WarehouseAreaMapper.java new file mode 100644 index 0000000..79d0a56 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/WarehouseAreaMapper.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.dto.WarehouseAreaDTO; +import com.tmerclub.cloud.product.model.WarehouseArea; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 仓库项和供货城市关联信息 + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +public interface WarehouseAreaMapper { + + /** + * 获取仓库项和供货城市关联信息列表 + * @return 仓库项和供货城市关联信息列表 + */ + List list(); + + /** + * 根据仓库项和供货城市关联信息id获取仓库项和供货城市关联信息 + * + * @param warehouseAreaId 仓库项和供货城市关联信息id + * @return 仓库项和供货城市关联信息 + */ + WarehouseArea getByWarehouseAreaId(@Param("warehouseAreaId") Long warehouseAreaId); + + /** + * 保存仓库项和供货城市关联信息 + * @param warehouseArea 仓库项和供货城市关联信息 + */ + void save(@Param("warehouseArea") WarehouseArea warehouseArea); + + /** + * 更新仓库项和供货城市关联信息 + * @param warehouseArea 仓库项和供货城市关联信息 + */ + void update(@Param("warehouseArea") WarehouseArea warehouseArea); + + /** + * 根据仓库项和供货城市关联信息id删除仓库项和供货城市关联信息 + * @param warehouseAreaId + */ + void deleteById(@Param("warehouseAreaId") Long warehouseAreaId); + + /*** + * 批量插入关联信息 + * @param warehouseAreaList + */ + void batchSave(@Param("warehouseAreaList")List warehouseAreaList); + + /** + * 批量删除关联信息 + * @param warehouseId + */ + void deleteByWarehouseId(@Param("warehouseId") Long warehouseId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/WarehouseMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/WarehouseMapper.java new file mode 100644 index 0000000..b13e846 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/WarehouseMapper.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.api.product.dto.WarehouseDTO; +import com.tmerclub.cloud.product.model.Warehouse; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +public interface WarehouseMapper { + + /** + * 获取列表 + * @param warehouse 仓库参数 + * @return 列表 + */ + List list(@Param("warehouse") WarehouseDTO warehouse); + + /** + * 获取可配送仓库列表 + * @param warehouseDTO 仓库dto + * @return 仓库列表 + */ + List listCanDeliveryWarehouse(@Param("warehouseDTO")WarehouseDTO warehouseDTO); + + /** + * 根据id获取 + * + * @param warehouseId id + * @return + */ + WarehouseVO getByWarehouseId(@Param("warehouseId") Long warehouseId); + + /** + * 保存 + * @param warehouse + */ + void save(@Param("warehouse") Warehouse warehouse); + + /** + * 更新 + * @param warehouse + */ + void update(@Param("warehouse") Warehouse warehouse); + + /** + * 根据id删除 + * @param warehouseId + */ + void deleteById(@Param("warehouseId") Long warehouseId); + + /** + * 根据仓库id获取对应供货城市 + * + * @param warehouseId 仓库id + * @return + */ + List getWarehouseAreaByWarehouseId(@Param("warehouseId") Long warehouseId); + + /** + * 统计该仓库名称使用的数量 + * + * @param shopId 店铺id + * @param warehouseName 仓库名称 + * @param sysType 系统类型 + * @param warehouseId 运费模板id + * @return 使用的数量 + */ + int countByWarehouseName(@Param("shopId") Long shopId, @Param("warehouseName") String warehouseName, @Param("sysType") Integer sysType, @Param("warehouseId") Long warehouseId); + + + /** + * 统计之前保存的供应城市id + * @param shopId + * @param sysType + * @param warehouseId + * @return + */ + List listareaByShopIdAndSysType(@Param("shopId") Long shopId, @Param("sysType") Integer sysType, @Param("warehouseId") Long warehouseId); + + /** + * 获取商家的默认仓库 + * + * @param shopId + * @param sysType + * @return + */ + WarehouseVO getDefaultWarehouseIdByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 获取店铺的所有仓库列表 + * @param shopId + * @param sysType + * @return + */ + List listWarehouseByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 批量保存 + * @param warehouseList + */ + void batchSave(@Param("warehouseList") List warehouseList); + + /** + * 获取默认仓库集合 + * @return + */ + List listDefaultWarehouses(); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/AttrValueLang.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/AttrValueLang.java new file mode 100644 index 0000000..519613e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/AttrValueLang.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 属性值-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class AttrValueLang extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 属性值id + */ + private Long attrValueId; + + /** + * 语言 0.通用 1.中文 2.英文 + */ + private Integer lang; + + /** + * 属性值 + */ + private String value; + + public Long getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Long attrValueId) { + this.attrValueId = attrValueId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "AttrValueLang{" + + "attrValueId=" + attrValueId + + ",lang=" + lang + + ",value=" + value + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Brand.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Brand.java new file mode 100644 index 0000000..52f0e61 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Brand.java @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 品牌信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class Brand extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * brand_id + */ + private Long brandId; + + /** + * 品牌名称 + */ + private String name; + + /** + * 品牌描述 + */ + private String desc; + + /** + * 品牌logo图片 + */ + private String imgUrl; + + /** + * 检索首字母 + */ + private String firstLetter; + + /** + * 排序 + */ + private Integer seq; + + /** + * 状态 1:enable, 0:disable, -1:deleted + */ + private Integer status; + + /** + * 是否置顶 0:不置顶 1:置顶 + */ + private Integer isTop; + + /** + * 品牌下的商品数量 + */ + private Integer spuCount; + + /** + * 店铺id + */ + private Long shopId; + /** + * 关联系统类型 1.店铺 2.平台端 3.供应商 + */ + private Long sysType; + + public Long getSysType() { + return sysType; + } + + public void setSysType(Long sysType) { + this.sysType = sysType; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getFirstLetter() { + return firstLetter; + } + + public void setFirstLetter(String firstLetter) { + this.firstLetter = firstLetter; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public Integer getSpuCount() { + return spuCount; + } + + public void setSpuCount(Integer spuCount) { + this.spuCount = spuCount; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "Brand{" + + "brandId=" + brandId + + ", name='" + name + '\'' + + ", desc='" + desc + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", firstLetter='" + firstLetter + '\'' + + ", seq=" + seq + + ", status=" + status + + ", isTop=" + isTop + + ", spuCount=" + spuCount + + ", shopId=" + shopId + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Category.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Category.java new file mode 100644 index 0000000..007eb23 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Category.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 分类信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class Category extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分类id + */ + private Long categoryId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 父ID + */ + private Long parentId; + + /** + * 分类名称 + */ + private String name; + + /** + * 分类描述 + */ + private String desc; + + /** + * 分类地址{parent_id}-{child_id},... + */ + private String path; + + /** + * 状态 1:enable, 0:disable, -1:deleted + */ + private Integer status; + + /** + * 分类图标 + */ + private String icon; + + /** + * 分类的显示图片 + */ + private String imgUrl; + + /** + * 分类层级 从0开始 + */ + private Integer level; + + /** + * 分类扣率 + */ + private Double deductionRate; + + /** + * 排序 + */ + private Integer seq; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Double getDeductionRate() { + return deductionRate; + } + + public void setDeductionRate(Double deductionRate) { + this.deductionRate = deductionRate; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "Category{" + + "categoryId=" + categoryId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",shopId=" + shopId + + ",parentId=" + parentId + + ",name=" + name + + ",desc=" + desc + + ",path=" + path + + ",status=" + status + + ",icon=" + icon + + ",imgUrl=" + imgUrl + + ",level=" + level + + ",deductionRate=" + deductionRate + + ",seq=" + seq + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/CategoryBrand.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/CategoryBrand.java new file mode 100644 index 0000000..0169749 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/CategoryBrand.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 品牌分类关联信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class CategoryBrand extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long id; + + /** + * 品牌id + */ + private Long brandId; + + /** + * 分类id + */ + private Long categoryId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + @Override + public String toString() { + return "CategoryBrand{" + + "id=" + id + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",brandId=" + brandId + + ",categoryId=" + categoryId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/CategoryShop.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/CategoryShop.java new file mode 100644 index 0000000..80bb036 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/CategoryShop.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 品牌分类关联信息 + * + * @author FrozenWatermelon + * @date 2021-04-27 16:40:44 + */ +public class CategoryShop extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long categoryShopId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 分类id + */ + private Long categoryId; + + /** + * 扣率: 为空代表采用平台扣率 + */ + private Double rate; + + /** + * 经营资质图片,以,分割 + */ + private String qualifications; + /** + * 关联系统类型 1.店铺 2.平台端 3.供应商 + */ + private Integer sysType; + + + public Long getCategoryShopId() { + return categoryShopId; + } + + public void setCategoryShopId(Long categoryShopId) { + this.categoryShopId = categoryShopId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + + public String getQualifications() { + return qualifications; + } + + public void setQualifications(String qualifications) { + this.qualifications = qualifications; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + @Override + public String toString() { + return "CategoryShop{" + + "categoryShopId=" + categoryShopId + + ", shopId=" + shopId + + ", categoryId=" + categoryId + + ", rate=" + rate + + ", qualifications='" + qualifications + '\'' + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Giveaway.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Giveaway.java new file mode 100644 index 0000000..84e4dec --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Giveaway.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 赠品表 + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:58 + */ +public class Giveaway extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 赠品id + */ + private Long giveawayId; + + /** + * 赠品名称 + */ + private String name; + + /** + * 活动开始时间 + */ + private Date startTime; + + /** + * 活动结束时间 + */ + private Date endTime; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 购买数量(购买了多少件才赠送赠品) + */ + private Integer buyNum; + + /** + * 主商品id + */ + private Long spuId; + + /** + * 状态 -1:已删除 0:关闭 1:开启 2:未开启 + */ + private Integer status; + + public Long getGiveawayId() { + return giveawayId; + } + + public void setGiveawayId(Long giveawayId) { + this.giveawayId = giveawayId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getBuyNum() { + return buyNum; + } + + public void setBuyNum(Integer buyNum) { + this.buyNum = buyNum; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "Giveaway{" + + "giveawayId=" + giveawayId + + ",name=" + name + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",startTime=" + startTime + + ",endTime=" + endTime + + ",shopId=" + shopId + + ",buyNum=" + buyNum + + ",spuId=" + spuId + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/GiveawaySpu.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/GiveawaySpu.java new file mode 100644 index 0000000..7f81098 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/GiveawaySpu.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 赠品套装商品项 + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:59 + */ +public class GiveawaySpu extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 赠品商品项id + */ + private Long giveawaySpuId; + + /** + * 赠品id + */ + private Long giveawayId; + + /** + * 商品id + */ + private Long spuId; + + /** + * skuId + */ + private Long skuId; + + /** + * 赠送数量 + */ + private Integer giveawayNum; + + /** + * 退货价 + */ + private Long refundPrice; + + /** + * 状态 1:正常 0:失效 -1:删除 + */ + private Integer status; + + public Long getGiveawaySpuId() { + return giveawaySpuId; + } + + public void setGiveawaySpuId(Long giveawaySpuId) { + this.giveawaySpuId = giveawaySpuId; + } + + public Long getGiveawayId() { + return giveawayId; + } + + public void setGiveawayId(Long giveawayId) { + this.giveawayId = giveawayId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getGiveawayNum() { + return giveawayNum; + } + + public void setGiveawayNum(Integer giveawayNum) { + this.giveawayNum = giveawayNum; + } + + public Long getRefundPrice() { + return refundPrice; + } + + public void setRefundPrice(Long refundPrice) { + this.refundPrice = refundPrice; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "GiveawaySpu{" + + "giveawaySpuId=" + giveawaySpuId + + ",giveawayId=" + giveawayId + + ",spuId=" + spuId + + ",skuId=" + skuId + + ",giveawayNum=" + giveawayNum + + ",refundPrice=" + refundPrice + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuCombo.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuCombo.java new file mode 100644 index 0000000..296a941 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuCombo.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serializable; +/** + * 规格组合商品管理表 + * + * @author lhd + * @date 2023-11-06 11:00:41 + */ +public class SkuCombo extends BaseModel implements Serializable{ + private static final long serialVersionUID = 1L; + + /** + * 规格id + */ + private Long skuId; + + /** + * 组合的skuid + */ + private Long comboSkuId; + /** + * 组合的spuid + */ + private Long comboSpuId; + + /** + * 组合数量 + */ + private Long comboCount; + + public Long getComboCount() { + return comboCount; + } + + public void setComboCount(Long comboCount) { + this.comboCount = comboCount; + } + + public Long getComboSpuId() { + return comboSpuId; + } + + public void setComboSpuId(Long comboSpuId) { + this.comboSpuId = comboSpuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getComboSkuId() { + return comboSkuId; + } + + public void setComboSkuId(Long comboSkuId) { + this.comboSkuId = comboSkuId; + } + + + @Override + public String toString() { + return "SkuCombo{" + + "skuId=" + skuId + + ", comboSkuId=" + comboSkuId + + ", comboSpuId=" + comboSpuId + + ", comboCount=" + comboCount + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuStockLock.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuStockLock.java new file mode 100644 index 0000000..a224372 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuStockLock.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 库存锁定信息 + * + * @author FrozenWatermelon + * @date 2020-12-22 16:12:10 + */ +public class SkuStockLock extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long id; + + /** + * 商品id + */ + private Long spuId; + /** + * 商家商品id + */ + private Long shopSpuId; + + /** + * sku id + */ + private Long skuId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 锁定库存数量 + */ + private Integer count; + + /** + * 状态-1已解锁 0待确定 1已锁定 + */ + private Integer status; + + /** + * 库存分片序号 + * 记录扣除分片的id,回调解锁的时候找到这个分片去扣锁定库存 + */ + private Integer zoneNo; + + public Long getShopSpuId() { + return shopSpuId; + } + + public void setShopSpuId(Long shopSpuId) { + this.shopSpuId = shopSpuId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getZoneNo() { + return zoneNo; + } + + public void setZoneNo(Integer zoneNo) { + this.zoneNo = zoneNo; + } + + @Override + public String toString() { + return "SkuStockLock{" + + "id=" + id + + ", spuId=" + spuId + + ", shopSpuId=" + shopSpuId + + ", skuId=" + skuId + + ", orderId=" + orderId + + ", count=" + count + + ", status=" + status + + ", zoneNo=" + zoneNo + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuStockZone.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuStockZone.java new file mode 100644 index 0000000..d7a8f6d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuStockZone.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author FrozenWatermelon + * @date 2022-08-17 09:12:37 + */ +public class SkuStockZone extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分片id + */ + private Long zoneId; + + /** + * SKU ID + */ + private Long skuId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 分片序号 + */ + private Integer zoneNo; + + /** + * 库存 + */ + private Integer stock; + + /** + * 锁定库存 + */ + private Integer lockStock; + + public Long getZoneId() { + return zoneId; + } + + public void setZoneId(Long zoneId) { + this.zoneId = zoneId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getZoneNo() { + return zoneNo; + } + + public void setZoneNo(Integer zoneNo) { + this.zoneNo = zoneNo; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Integer getLockStock() { + return lockStock; + } + + public void setLockStock(Integer lockStock) { + this.lockStock = lockStock; + } + + @Override + public String toString() { + return "SkuStockZone{" + + "zoneId=" + zoneId + + ", skuId=" + skuId + + ", spuId=" + spuId + + ", zoneNo=" + zoneNo + + ", stock=" + stock + + ", lockStock=" + lockStock + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuAttrValueLang.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuAttrValueLang.java new file mode 100644 index 0000000..8026137 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuAttrValueLang.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 属性值-国际化表 + * + * @author YXF + * @date 2021-04-15 16:47:33 + */ +public class SpuAttrValueLang extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 属性值id + */ + private Long spuAttrValueId; + + /** + * 语言 0.通用 1.中文 2.英文 + */ + private Integer lang; + + /** + * 属性名称 + */ + private String attrName; + + /** + * 属性值 + */ + private String attrValueName; + + /** + * 属性值 + */ + private String attrDesc; + + public Long getSpuAttrValueId() { + return spuAttrValueId; + } + + public void setSpuAttrValueId(Long spuAttrValueId) { + this.spuAttrValueId = spuAttrValueId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + public String getAttrDesc() { + return attrDesc; + } + + public void setAttrDesc(String attrDesc) { + this.attrDesc = attrDesc; + } + + @Override + public String toString() { + return "SpuAttrValueLang{" + + "spuAttrValueId=" + spuAttrValueId + + ",lang=" + lang + + ",attrName=" + attrName + + ",attrValueName=" + attrValueName + + ",attrDesc=" + attrDesc + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuBrowseLog.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuBrowseLog.java new file mode 100644 index 0000000..ef84014 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuBrowseLog.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品浏览记录表 + * + * @author YXF + * @date 2021-03-19 14:28:14 + */ +public class SpuBrowseLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品浏览记录id + */ + private Long spuBrowseLogId; + + /** + * 用户id + */ + private Long userId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 分类id + */ + private Long categoryId; + + /** + * 1:正常 -1:删除 + */ + private Integer status; + + /** + * 商品类型 + */ + private Integer spuType; + + public Long getSpuBrowseLogId() { + return spuBrowseLogId; + } + + public void setSpuBrowseLogId(Long spuBrowseLogId) { + this.spuBrowseLogId = spuBrowseLogId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + @Override + public String toString() { + return "SpuBrowseLog{" + + "spuBrowseLogId=" + spuBrowseLogId + + ", userId=" + userId + + ", spuId=" + spuId + + ", categoryId=" + categoryId + + ", status=" + status + + ", spuType=" + spuType + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuCollection.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuCollection.java new file mode 100644 index 0000000..b76893c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuCollection.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品收藏信息 + * + * @author FrozenWatermelon + * @date 2020-11-21 14:43:16 + */ +public class SpuCollection extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 收藏表 + */ + private Long id; + + /** + * 商品id + */ + private Long spuId; + + /** + * 用户id + */ + private Long userId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "SpuCollection{" + + "id=" + id + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",spuId=" + spuId + + ",userId=" + userId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuComm.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuComm.java new file mode 100644 index 0000000..28e380e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuComm.java @@ -0,0 +1,289 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商品评论 + * + * @author YXF + * @date 2021-01-11 13:47:33 + */ +public class SpuComm extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 匿名 + */ + public static final Integer ANONYMOUS = 1; + + /** + * ID + */ + private Long spuCommId; + + /** + * 商品ID + */ + private Long spuId; + + /** + * 店铺ID + */ + private Long shopId; + + /** + * 订单项ID + */ + private Long orderItemId; + + /** + * 评论用户ID + */ + private Long userId; + + /** + * 评论内容 + */ + private String content; + + /** + * 掌柜回复 + */ + private String replyContent; + + /** + * 回复时间 + */ + private Date replyTime; + + /** + * 是否回复 0:未回复 1:已回复 + */ + private Integer replySts; + + /** + * IP来源 + */ + private String postip; + + /** + * 商品得分,1-5分 + */ + private Integer score; + + /** + * 店铺评分 1-5分 + */ + private Integer storeScore; + + /** + * 物流评分 1-5分 + */ + private Integer logisticsScore; + + /** + * 有用的计数 + */ + private Integer usefulCounts; + + /** + * 晒图的json字符串 + */ + private String pics; + + /** + * 是否匿名(1:是 0:否) + */ + private Integer isAnonymous; + + /** + * 是否显示 -1:删除 0:不显示 1:显示 2 审核不通过 3.待审核 + */ + private Integer status; + + /** + * 评价(0好评 1中评 2差评) + */ + private Integer evaluate; + + public Long getSpuCommId() { + return spuCommId; + } + + public void setSpuCommId(Long spuCommId) { + this.spuCommId = spuCommId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getReplyContent() { + return replyContent; + } + + public void setReplyContent(String replyContent) { + this.replyContent = replyContent; + } + + public Date getReplyTime() { + return replyTime; + } + + public void setReplyTime(Date replyTime) { + this.replyTime = replyTime; + } + + public Integer getReplySts() { + return replySts; + } + + public void setReplySts(Integer replySts) { + this.replySts = replySts; + } + + public String getPostip() { + return postip; + } + + public void setPostip(String postip) { + this.postip = postip; + } + + public Integer getScore() { + return score; + } + + public void setScore(Integer score) { + this.score = score; + } + + public Integer getStoreScore() { + return storeScore; + } + + public void setStoreScore(Integer storeScore) { + this.storeScore = storeScore; + } + + public Integer getLogisticsScore() { + return logisticsScore; + } + + public void setLogisticsScore(Integer logisticsScore) { + this.logisticsScore = logisticsScore; + } + + public Integer getUsefulCounts() { + return usefulCounts; + } + + public void setUsefulCounts(Integer usefulCounts) { + this.usefulCounts = usefulCounts; + } + + public String getPics() { + return pics; + } + + public void setPics(String pics) { + this.pics = pics; + } + + public Integer getIsAnonymous() { + return isAnonymous; + } + + public void setIsAnonymous(Integer isAnonymous) { + this.isAnonymous = isAnonymous; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getEvaluate() { + return evaluate; + } + + public void setEvaluate(Integer evaluate) { + this.evaluate = evaluate; + } + + @Override + public String toString() { + return "SpuComm{" + + "spuCommId=" + spuCommId + + ", spuId=" + spuId + + ", shopId=" + shopId + + ", orderItemId=" + orderItemId + + ", userId=" + userId + + ", content='" + content + '\'' + + ", replyContent='" + replyContent + '\'' + + ", replyTime=" + replyTime + + ", replySts=" + replySts + + ", postip='" + postip + '\'' + + ", score=" + score + + ", storeScore=" + storeScore + + ", logisticsScore=" + logisticsScore + + ", usefulCounts=" + usefulCounts + + ", pics='" + pics + '\'' + + ", isAnonymous=" + isAnonymous + + ", status=" + status + + ", evaluate=" + evaluate + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuDetail.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuDetail.java new file mode 100644 index 0000000..1256cb9 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuDetail.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品详情信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SpuDetail extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品id + */ + private Long spuId; + + /** + * 语言 0.通用 1.中文 2.英文 + */ + private Integer lang; + + /** + * 商品详情 + */ + private String detail; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + @Override + public String toString() { + return "SpuDetail{" + + "spuId=" + spuId + + "lang=" + lang + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",detail=" + detail + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuSkuAttrValue.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuSkuAttrValue.java new file mode 100644 index 0000000..d9d69bc --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuSkuAttrValue.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品sku销售属性关联信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SpuSkuAttrValue extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品sku销售属性关联信息id + */ + private Long spuSkuAttrId; + + /** + * SPU ID + */ + private Long spuId; + + /** + * SKU ID + */ + private Long skuId; + + /** + * 语言 0.通用 1.中文 2.英文 + */ + private Integer lang; + + /** + * 销售属性ID + */ + private Long attrId; + + /** + * 销售属性名称 + */ + private String attrName; + + /** + * 销售属性值ID + */ + private Long attrValueId; + + /** + * 销售属性值 + */ + private String attrValueName; + + /** + * 状态 1:enable, 0:disable, -1:deleted + */ + private Integer status; + + public Long getSpuSkuAttrId() { + return spuSkuAttrId; + } + + public void setSpuSkuAttrId(Long spuSkuAttrId) { + this.spuSkuAttrId = spuSkuAttrId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public Long getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Long attrValueId) { + this.attrValueId = attrValueId; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "SpuSkuAttrValue{" + + "spuSkuAttrId=" + spuSkuAttrId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",spuId=" + spuId + + ",skuId=" + skuId + + ",lang=" + lang + + ",attrId=" + attrId + + ",attrName=" + attrName + + ",attrValueId=" + attrValueId + + ",attrValueName=" + attrValueName + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuSupplierChangeLog.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuSupplierChangeLog.java new file mode 100644 index 0000000..99af6cc --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuSupplierChangeLog.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品供应商变更记录 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class SpuSupplierChangeLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品供应商变更记录id + */ + private Long spuChangeId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 变更类型 1.商品上架 2.商品下架 3.代销sku信息变更 4.新增sku + */ + private Integer changeType; + + /** + * 备注 + */ + private String remarks; + + public Long getSpuChangeId() { + return spuChangeId; + } + + public void setSpuChangeId(Long spuChangeId) { + this.spuChangeId = spuChangeId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getChangeType() { + return changeType; + } + + public void setChangeType(Integer changeType) { + this.changeType = changeType; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "SpuSupplierChangeLog{" + + "spuChangeId=" + spuChangeId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",spuId=" + spuId + + ",changeType=" + changeType + + ",remarks=" + remarks + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockChangeReasonStatus.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockChangeReasonStatus.java new file mode 100644 index 0000000..71680a1 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockChangeReasonStatus.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 出入库原因状态 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class StockChangeReasonStatus extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long stockChangeReasonStatusId; + + /** + * 关联的系统出入库原因id + */ + private Long stockChangeReasonId; + + /** + * 状态,1:启用 0:禁用 -1:删除 + */ + private Integer status; + + /** + * 店铺id + */ + private Long shopId; + + public Long getStockChangeReasonStatusId() { + return stockChangeReasonStatusId; + } + + public void setStockChangeReasonStatusId(Long stockChangeReasonStatusId) { + this.stockChangeReasonStatusId = stockChangeReasonStatusId; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "StockChangeReasonStatus{" + + "stockChangeReasonStatusId=" + stockChangeReasonStatusId + + ",stockChangeReasonId=" + stockChangeReasonId + + ",status=" + status + + ",shopId=" + shopId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/TakeStock.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/TakeStock.java new file mode 100644 index 0000000..9af2b37 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/TakeStock.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class TakeStock extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 盘点id + */ + private Long takeStockId; + + /** + * 盘点单号 + */ + private String takeStockNo; + + /** + * 盘点状态 0已作废 1盘点中 2已完成 + */ + private Integer billStatus; + + /** + * 制单人 + */ + private Long maker; + + /** + * 盘点区域名称 + */ + private String stockRegionName; + + /** + * 备注 + */ + private String remark; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 制单人手机号 + */ + private String makerMobile; + + /** + * 仓库id + */ + private Long warehouseId; + + /** + * 库存点类型 + */ + private Integer stockPointType; + + public Long getTakeStockId() { + return takeStockId; + } + + public void setTakeStockId(Long takeStockId) { + this.takeStockId = takeStockId; + } + + public String getTakeStockNo() { + return takeStockNo; + } + + public void setTakeStockNo(String takeStockNo) { + this.takeStockNo = takeStockNo; + } + + public Integer getBillStatus() { + return billStatus; + } + + public void setBillStatus(Integer billStatus) { + this.billStatus = billStatus; + } + + public Long getMaker() { + return maker; + } + + public void setMaker(Long maker) { + this.maker = maker; + } + + public String getStockRegionName() { + return stockRegionName; + } + + public void setStockRegionName(String stockRegionName) { + this.stockRegionName = stockRegionName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + @Override + public String toString() { + return "TakeStock{" + + "takeStockId=" + takeStockId + + ", takeStockNo='" + takeStockNo + '\'' + + ", billStatus=" + billStatus + + ", maker=" + maker + + ", stockRegionName='" + stockRegionName + '\'' + + ", remark='" + remark + '\'' + + ", shopId=" + shopId + + ", makerMobile='" + makerMobile + '\'' + + ", warehouseId=" + warehouseId + + ", stockPointType=" + stockPointType + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrCategoryService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrCategoryService.java new file mode 100644 index 0000000..08194fc --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrCategoryService.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.product.vo.CategoryVO; + +import java.util.List; + +/** + * 属性与属性分组关联信息 + * + * @author YXF + * @date 2020-11-23 16:20:01 + */ +public interface AttrCategoryService { + + /** + * 保存属性与属性分组关联信息 + * @param attrId 属性id + * @param categoryId 分类id列表 + */ + void save(Long attrId, List categoryId); + + /** + * 更新属性与属性分组关联信息 + * @param attrId + * @param categoryId + * @return + */ + List update(Long attrId, List categoryId); + + /** + * 根据属性Id,获取属性关联的分类列表信息 + * @param attrId + * @return + */ + List listByAttrId(Long attrId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrService.java new file mode 100644 index 0000000..2ebeb02 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrService.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.AttrVO; +import com.tmerclub.cloud.product.dto.AttrDTO; + +import java.util.List; + +/** + * 属性信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:23 + */ +public interface AttrService { + + /** + * 分页获取属性信息列表 + * + * @param pageDTO 分页参数 + * @param attrDTO + * @return 属性信息列表分页数据 + */ + PageVO page(PageDTO pageDTO, AttrDTO attrDTO); + + /** + * 根据属性信息id获取属性信息 + * + * @param attrId 属性信息id + * @return 属性信息 + */ + AttrVO getByAttrId(Long attrId); + + /** + * 保存属性信息 + * + * @param attrDTO 属性信息 + */ + void save(AttrDTO attrDTO); + + /** + * 更新属性信息 + * + * @param attrDTO 属性信息 + */ + void update(AttrDTO attrDTO); + + /** + * 根据属性信息id删除属性信息 + * + * @param attrId + */ + void deleteById(Long attrId); + + /** + * 根据分类和属性类型,获取对应的属性列表 + * + * @param categoryId + * @return + */ + List getAttrsByCategoryIdAndAttrType(Long categoryId); + + /** + * 根据属性id获取属性下的分类id列表 + * + * @param attrId + * @return + */ + List getAttrOfCategoryIdByAttrId(Long attrId); + + /** + * 清除属性关联的分类列表中属性列表的缓存 + * + * @param categoryIds 属性关联的分类列表 + */ + void removeAttrByCategoryId(List categoryIds); + + /** + * 获取店铺中的销售属性 + * + * @param shopId + * @param sysType + * @return + */ + List getShopAttrs(Long shopId, Integer sysType); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrValueLangService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrValueLangService.java new file mode 100644 index 0000000..7b18792 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrValueLangService.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.model.AttrValueLang; + +import java.util.List; + +/** + * 属性值-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public interface AttrValueLangService { + + /** + * 分页获取属性值-国际化表列表 + * @param pageDTO 分页参数 + * @return 属性值-国际化表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据属性值-国际化表id获取属性值-国际化表 + * + * @param attrValueId 属性值-国际化表id + * @return 属性值-国际化表 + */ + AttrValueLang getByAttrValueId(Long attrValueId); + + /** + * 保存属性值-国际化表 + * @param attrValueLangList 属性值-国际化表 + * @param attrValueId 属性值id + */ + void save(List attrValueLangList, Long attrValueId); + + /** + * 更新属性值-国际化表 + * @param attrValueLangList 属性值-国际化表 + */ + void update(List attrValueLangList); + + /** + * 根据属性值-国际化表id删除属性值-国际化表 + * @param attrValueId 属性值-国际化表id + */ + void deleteById(Long attrValueId); + + /** + * 批量删除 + * @param attrValueIds + */ + void deleteBatch(List attrValueIds); + + /** + * 根据属性值id列表,删除属性值语言信息 + * @param attrValueIds + */ + void deleteByAttrValueIds(List attrValueIds); + + /** + * 批量保存 + * @param mapAsList + */ + void saveBatch(List mapAsList); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/BrandLangService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/BrandLangService.java new file mode 100644 index 0000000..c63a32e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/BrandLangService.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.model.BrandLang; + +import java.util.List; +import java.util.Set; + +/** + * 品牌-国际化表 + * + * @author YXF + * @date 2021-04-26 15:17:37 + */ +public interface BrandLangService { + + /** + * 分页获取品牌-国际化表列表 + * @param pageDTO 分页参数 + * @return 品牌-国际化表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据品牌-国际化表id获取品牌-国际化表 + * + * @param brandId 品牌-国际化表id + * @return 品牌-国际化表 + */ + BrandLang getByBrandId(Long brandId); + + /** + * 保存品牌-国际化表 + * @param brandLangList 品牌-国际化表 + * @param brandId 品牌id + */ + void save(List brandLangList, Long brandId); + + /** + * 更新品牌-国际化表 + * @param brandLangList 品牌-国际化表 + * @param brandId 品牌id + */ + void update(List brandLangList, Long brandId); + + /** + * 根据品牌-国际化表id删除品牌-国际化表 + * @param brandId 品牌-国际化表id + */ + void deleteById(Long brandId); + + /** + * 根据品牌名,获取品牌列表 + * + * @param brandNames 品牌名 + * @param shopId 店铺id + * @return 品牌列表 + */ + List listByBrandNames(Set brandNames, Long shopId); + + /** + * 根据中英品牌名,获取品牌列表 + * @param cn + * @param en + * @return + */ + List listByBrandNamesCnOrEn(String cn, String en); + + /** + * 根据中英品牌名和品牌id,获取品牌列表 + * @param cn + * @param en + * @param brandId 品牌id + * @return + */ + List listByBrandNamesCnOrEnAndBrandId(String cn, String en, Long brandId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryBrandService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryBrandService.java new file mode 100644 index 0000000..92263ab --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryBrandService.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.product.vo.BrandVO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.product.model.CategoryBrand; +import com.tmerclub.cloud.product.vo.BrandShopVO; + +import java.util.List; + +/** + * 品牌分类关联信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface CategoryBrandService { + + /** + * 根据品牌id删除品牌分类关联信息 + * @param brandIdList + */ + void deleteByBrandIdList(List brandIdList); + + /** + * 保存品牌信息 + * @param brandId + * @param categoryIds + */ + void saveByCategoryIds(Long brandId, List categoryIds); + + /** + * 更新品牌信息 + * @param brandId + * @param categoryIds + */ + void updateByCategoryIds(Long brandId, List categoryIds); + + /** + * 根据品牌id或者关联的分类列表 + * @param brandId + * @return + */ + List getCategoryIdBrandId(Long brandId); + + /** + * 获取品牌绑定的分类信息 + * @param brandId 品牌id + * @return 分类列表 + */ + List getCategoryByBrandId(Long brandId); + + /** + * 根据品牌id与分类id统计数量 + * @param brandId + * @param categoryId + * @return + */ + int countByBrandIdAndCategoryId(Long brandId, Long categoryId); + + /** + * 获取品牌绑定的分类信息 + * @param brandList + */ + void loadCategoryToBrandVO(List brandList); + + /** + * 获取品牌绑定的分类信息 + * @param platformBrandList + */ + void loadCategoryToBrandSigningVO(List platformBrandList); + + /** + * 批量保存 + * @param categoryBrands + */ + void saveBatch(List categoryBrands); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryLangService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryLangService.java new file mode 100644 index 0000000..6447ec6 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryLangService.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.product.dto.CategoryDTO; +import com.tmerclub.cloud.product.dto.CategoryLangDTO; +import com.tmerclub.cloud.product.model.CategoryLang; + +import java.util.List; + +/** + * 分类-国际化表 + * + * @author YXF + * @date 2021-04-22 17:48:16 + */ +public interface CategoryLangService { + + /** + * 分页获取分类-国际化表列表 + * @param pageDTO 分页参数 + * @return 分类-国际化表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据分类-国际化表id获取分类-国际化表 + * + * @param categoryId 分类-国际化表id + * @return 分类-国际化表 + */ + CategoryLang getByCategoryId(Long categoryId); + + /** + * 保存分类-国际化表 + * @param categoryLangList 分类-国际化表 + * @param categoryId 分类-国际化表 + */ + void save(List categoryLangList, Long categoryId); + + /** + * 更新分类-国际化表 + * @param categoryLangList 分类-国际化表 + * @param categoryDb + */ + void update(List categoryLangList, CategoryVO categoryDb); + + /** + * 根据分类-国际化表id删除分类-国际化表 + * @param categoryId 分类-国际化表id + */ + void deleteById(Long categoryId); + + /** + * 批量保存 + * @param list 保存的分类数据列表 + */ + void batchSave(List list); + + /** + * 分类名是否已存在 + * @param categoryDTO + */ + void existCategoryName(CategoryDTO categoryDTO); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/GiveawayService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/GiveawayService.java new file mode 100644 index 0000000..1a2da35 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/GiveawayService.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.product.dto.GiveawayDTO; +import com.tmerclub.cloud.product.model.Giveaway; + +import java.util.List; + +/** + * 赠品表 + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:58 + */ +public interface GiveawayService { + + /** + * 分页获取赠品表列表 + * + * @param pageDTO 分页参数 + * @return 赠品表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据商品id获取赠品 + * + * @param spuId 商品id + * @return 赠品 + */ + GiveawayVO getBySpuId(Long spuId); + + /** + * 根据店铺id获取赠品表列表 + * + * @param pageDTO + * @param giveawayDTO + * @return + */ + PageVO listByShopId(PageDTO pageDTO, GiveawayDTO giveawayDTO); + + /** + * 根据商品id获取所有赠品商品信息 + * + * @param spuId + * @return + */ + GiveawayVO getGiveawayBySpuId(Long spuId); + + /** + * 根据商品id获取所有赠品商品信息 + * + * @param spuId + * @return + */ + GiveawayVO getGiveawaySpuBySpuId(Long spuId); + + /** + * 根据赠品表id获取赠品表 + * + * @param giveawayId 赠品表id + * @return 赠品表 + */ + GiveawayVO getByGiveawayId(Long giveawayId); + + /** + * 保存赠品表 + * + * @param giveawayDTO 赠品表 + */ + void save(GiveawayDTO giveawayDTO); + + /** + * 更新赠品表 + * + * @param giveawayDTO 赠品表 + */ + void update(GiveawayDTO giveawayDTO); + + + /** + * 修改赠品状态 + * + * @param giveawayId + * @param status + */ + void changeStatus(Long giveawayId, Integer status); + + + + /** + * 获取应该结束但是没有结束的赠品列表 + * + * @return 应该结束但是没有结束的赠品列表 + */ + List listUnEndButNeedEndActivity(); + + /** + * 启动未开启的赠品活动 + */ + void startGiveawayActivity(); + + /** + * 改变商品类型,结束正在进行的赠品信息 + * + * @param giveawayList 赠品活动列表 + */ + void changeSpuTypeByGiveawayActivityIdList(List giveawayList); + + /** + * 判断修改的商品售价会不会影响赠品活动 + * + * @param spuDTO + */ + void checkGiveawaySpuPrice(SpuDTO spuDTO); + + /** + * 根据赠送商品id,获取主商品id列表 + * + * @param spuId + * @return + */ + List listMainSpuIdByGiveawaySpuId(Long spuId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/GiveawaySpuService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/GiveawaySpuService.java new file mode 100644 index 0000000..b68ef5b --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/GiveawaySpuService.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.GiveawaySpuVO; +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.product.dto.GiveawaySpuDTO; +import com.tmerclub.cloud.product.model.GiveawaySpu; + +import java.util.List; + +/** + * 赠品套装商品项 + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:59 + */ +public interface GiveawaySpuService { + + /** + * 分页获取赠品套装商品项列表 + * @param pageDTO 分页参数 + * @return 赠品套装商品项列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据商品id获取赠品套装商品项 + * + * @param spuId 商品id + * @return 赠品套装商品项 + */ + List getBySpuId(Long spuId); + + + /** + * 分页获取主商品 + * @param pageDTO + * @param giveawaySpuDTO + * @return + */ + PageVO getMainSpuPage(PageDTO pageDTO, GiveawaySpuDTO giveawaySpuDTO); + + + /** + * 根据赠品主商品id获取赠品套装商品项 + * @param giveawayId + * @return + */ + List getByGiveawayId(Long giveawayId); + + /** + * 根据商品id获取赠品信息[有缓存] + * @param spuId + * @return + */ + GiveawayVO getGiveawayBySpuId(Long spuId); + + /** + * 保存赠品套装商品项 + * @param giveawaySpu 赠品套装商品项 + */ + void save(GiveawaySpu giveawaySpu); + + /** + * 批量更新赠品套装商品项 + * @param giveawayId + * @param status + * @return + */ + boolean updateStatus(Long giveawayId, Integer status); + + /** + * 根据赠品套装商品项id删除赠品套装商品项 + * @param giveawaySpuId 赠品套装商品项id + */ + void deleteById(Long giveawaySpuId); + + /** + * 批量保存赠品商品项信息 + * @param giveawaySpuList + */ + void insertBatch(List giveawaySpuList); + + /** + * 批量删除赠品套餐商品项 + * @param giveawaySpuIds + */ + void batchDeleteByIds(List giveawaySpuIds); + + /** + * 失效赠送商品项状态 + * + * @param giveawayIdList + */ + void changeGiveawayActivityStatusByGiveawayIdList(List giveawayIdList); + + /** + * 根据商品id删除缓存 + * @param spuId + */ + void removeGiveawayCacheBySupId(Long spuId); + + /** + * 根据商品id集合删除缓存 + * @param spuIds + */ + void removeGiveawayCacheBatch(List spuIds); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuComboService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuComboService.java new file mode 100644 index 0000000..ced769c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuComboService.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.product.dto.SkuComboDTO; +import com.tmerclub.cloud.common.product.vo.SkuComboVO; +import com.tmerclub.cloud.product.model.SkuCombo; + +import java.util.List; + +/** + * + * @author lhd + * @date 2023-11-06 15:52:12 + */ +public interface SkuComboService { + + + /** + * 批量保存 + * @param skuComboList + */ + void saveBatch(List skuComboList); + + /** + * 根据ids删除 + * @param skuIds ids + */ + void deleteBySkuIds(List skuIds); + + + /** + * 根据skuId获取所有组合商品信息 + * @param skuIds + * @return + */ + List getCombSpusBySkuIds(List skuIds); + + + /** + * 根据主spuIds获取所有组合商品信息 + * @param spuIds + * @return + */ + List getCombSpusBySpuIds(List spuIds); + + /** + * 根据skuId获取所有组合商品信息 + * @param skuIds + * @return + */ + List getCombShopItemsAndBySkuIds(List skuIds); + + /** + * 根据组合关联的spuId获取所有组合商品ids + * @param spuIds + * @param skuIds + * @return + */ + List getCombSpusByComboSpuIds(List spuIds,List skuIds); + + /** + * 删除关联信息 + * @param spuIds + */ + void deleteByComboSpuIds(List spuIds); + + /** + * 通过关联skuId删除关联信息 + * @param skuIds + */ + void deleteByComboSkuIds(List skuIds); + + /** + * 获取组合的商品中没有启用的商品数量 + * @param spuId + * @return + */ + Integer countDisableComboSpuBySpuId(Long spuId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuLangService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuLangService.java new file mode 100644 index 0000000..21c4251 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuLangService.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.SkuLangVO; +import com.tmerclub.cloud.product.model.SkuLang; + +import java.util.List; + +/** + * sku-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public interface SkuLangService { + + /** + * 分页获取sku-国际化表列表 + * @param pageDTO 分页参数 + * @return sku-国际化表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据sku-国际化表id获取sku-国际化表 + * + * @param skuId sku-国际化表id + * @return sku-国际化表 + */ + List getBySkuId(Long skuId); + + /** + * 保存sku-国际化表 + * @param skuLang sku-国际化表 + */ + void save(SkuLang skuLang); + + /** + * 更新sku-国际化表 + * @param skuLang sku-国际化表 + */ + void update(SkuLang skuLang); + + /** + * 根据sku-国际化表id删除sku-国际化表 + * @param skuId sku-国际化表id + */ + void deleteById(Long skuId); + + /** + * 批量保存sku国际化信息 + * @param skuLangList + */ + void batchSave(List skuLangList); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuService.java new file mode 100644 index 0000000..46d01c5 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuService.java @@ -0,0 +1,381 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.SkuAddrVO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuSkuAttrValueVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.app.SkuAppVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.product.vo.SkuExcelVO; +import com.tmerclub.cloud.product.vo.SpuExcelVO; +import com.tmerclub.cloud.product.vo.SupplierSpuExcelVO; + +import java.util.List; +import java.util.Set; + +/** + * sku信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SkuService { + + /** + * 获取skuVO集合 + * @param skuDTO skuDTO + * @return skuVO集合 + */ + List listSku(SkuDTO skuDTO); + + /** + * 保存sku信息 + * @param spuId + * @param spuStatus 商品状态 + * @param skuList + * @param sysType + * @param userId + * @param shopId + * @param spuMold + */ + List save(Long spuId, Integer spuStatus, List skuList, Integer sysType, Long userId, Long shopId,Integer spuMold); + + /** + * 保存sku信息 + * + * @param spuMold + * @param spuId + * @param spuStatus 商品状态 + * @param skuList + * @param sysType + * @param userId + * @param shopId + */ + void saveSkuAndStock(Integer spuMold, Long spuId, Integer spuStatus, List skuList, Integer sysType, Long userId, Long shopId); + + /** + * 更新sku信息 + * + * @param spu spu信息 + * @param skuList sku列表信息 + */ + void update(SpuDTO spu, List skuList); + + /** + * 根据sku信息id删除sku信息 + * + * @param skuId + */ + void deleteById(Long skuId); + + /** + * 根据商品id获取商品中的sku列表(将会被缓存起来) + * + * @param spuId id + * @return 返回sku信息 + */ + List listSkuWithAttrBySpuId(Long spuId); + + /** + * 根据spuId删除sku信息 + * + * @param spuDTO 商品id + */ + void deleteBySpuId(SpuDTO spuDTO); + + /** + * 根据skuId获取sku信息 + * + * @param skuId skuId + * @return sku信息 + */ + SkuVO getSkuBySkuId(Long skuId); + + /** + * 更新sku金额或者库存信息 + * + * @param spuDTO + */ + void updateAmountOrStock(SpuDTO spuDTO); + + /** + * 获取商品详情需要的的sku列表(包括sku库存信息等)(仅获取启用状态) + * + * @param spuVO + * @return + */ + List getSpuDetailSkuInfo(SpuVO spuVO); + + /** + * 获取商品详情需要的的sku列表(包括sku库存信息等)(仅获取启用状态) + * + * @param spuIds + * @return + */ + List listBySpuIds(List spuIds); + + /** + * 获取供应商sku信息(包含供应商库存和商家库存) + * + * @param spuIds + * @param shopId + * @return + */ + List listSupplierBySpuIds(List spuIds, Long shopId); + + /** + * 拼接sku属性信息 + * + * @param spuSkuAttrValueList + * @return + */ + String spliceProperties(List spuSkuAttrValueList); + + /** + * 从缓存中获取sku的所有信息,包括attr,和库存 + * + * @param spuId 商品id + * @param spu + * @param enable 是否是启用状态的sku + * @return + */ + List listSkuAllInfoBySpuId(Long spuId, SpuVO spu, boolean enable); + + /** + * 获取excel导出sku数据列表 + * + * @param spuIds + * @return + */ + List excelSkuList(List spuIds); + + /** + * 获取指定sku的价格 + * + * @param skuIds + * @return + */ + List listSkuPriceByIds(List skuIds); + + + /** + * 根据skuId列表获取商品订单修改地址所需信息 + * + * @param skuIds skuId列表 + * @return sku列表 + */ + List listSpuDetailByIds(List skuIds); + + + /** + * 根据skuId列表获取售价最低的商品的售价 + * + * @param skuIds + * @return + */ + Long getMinPriceFeeByIds(List skuIds); + + /** + * 获取excel导出代销商品sku数据列表 + * + * @param spuIds + * @return + */ + List excelSupplierSkuList(List spuIds); + + /** + * 导出sku信息 + * + * @param product + * @return + */ + List exportSkuList(ProductSearchDTO product); + + /** + * 根据商品编码获取商品规格列表 + * + * @param partyCodeList 商品编码 + * @return 商品信息 + */ + List listByPartyCodeList(List partyCodeList); + + /** + * 获取代销商品sku + * + * @param spu + * @param enable + * @return + */ + List listConsignmentSku(SpuVO spu, boolean enable); + + /** + * 根据商品编码和店铺Id获取sku信息 + * + * @param partyCode + * @param shopId + * @param sysType + * @return + */ + StockBillLogItemDTO getSkuByPartyCodeAndShopId(String partyCode, Long shopId, Integer sysType); + + /** + * 获取当前商家的所有sku编码 + * + * @param shopId + * @param sysType + * @param spuId + * @return + */ + List listSkuPartyCodesByShopId(Long shopId, Integer sysType, Long spuId); + + /** + * 获取商品库存预警数量 + * + * @param product 商品筛选 + * @return + */ + Integer getStockWarningNum(ProductSearchDTO product); + + /** + * 异步新增代销商品sku + * + * @param spuVO 商品信息 + * @param skuList + * @param sysType + */ + void commissionSave(SpuVO spuVO, List skuList, Integer sysType); + + /** + * 根据skuId列表获取sku信息列表 + * + * @param skuIds + * @return + */ + List getByIds(List skuIds); + + /** + * 获取商品sku保存到商品列表 + * + * @param spuAdminVOList + * @return + */ + List setSpuSku(List spuAdminVOList); + + + /** + * 分页获取sku + * + * @param pageDTO + * @param product + * @return + */ + PageVO pageSku(PageDTO pageDTO, ProductSearchDTO product); + + /** + * 通过skuIds获取sku信息和sku库存信息列表 + * + * @param skuIds + * @return + */ + List listSkuAndStockBySkuIds(List skuIds); + + /** + * 插入sku库存 + * @param skus + * @return + */ + void setSkuStock(List skus); + + /** + * 插入es的sku库存 + * @param skus + */ + void setEsSkuStock(List skus); + + /** + * 改变sku库存的状态 + * @param spuId + * @param changeStatus + */ + void changeSkuStockStatusBySpuId(Long spuId, Integer changeStatus); + + /** + * 改变sku库存的状态 + * @param skuId + * @param spuStatus 商品的状态 + * @param skuStatus sku的状态 + */ + void changeSkuStockStatusBySkuId(Long skuId, Integer spuStatus, Integer skuStatus); + + + /** + * 通过库存点id获取sku信息和sku库存信息列表 + * + * @param stockPointId 库存点id + * @param inStockPointId 入库库存点id + * @return + */ + List listSkuAndStockByStockPointId(Long stockPointId, + Long inStockPointId); + + /** + * 组合商品获取所有组合的商品信息并组装,然后计算出对应库存 + * @param skus + * @param spu + */ + void assembleComboSpuListAndStock(List skus,SpuVO spu); + + /** + * 当前关联商品列表是否有共同供货仓库 + * + * @param skuIds + * @param shopId + * @return + */ + Boolean hasStockBySkuIds(List skuIds, Long shopId); + + /** + * 门店切换库存模式 + * @param stockPointId + * @param stockMode + * @param type + */ + void updateStockMode(Long stockPointId, Integer stockMode, Integer type); + + /** + * 生成补充入库记录 + * @param spuId + * @param filtePointList + */ + void loadSeckillStockBillLogItems(Long spuId, List filtePointList); + + /** + * 获取状态正常的规格数量 + * @param skuIds + * @return + */ + int countNormalSkuBySkuIds(Set skuIds); + + /** + * 清理spu缓存 + * @param spuIdList + */ + void removeCacheSkuWithAttrBySpuId(List spuIdList); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuStockLockService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuStockLockService.java new file mode 100644 index 0000000..05a2736 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuStockLockService.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.api.product.dto.SkuStockLockDTO; +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * 库存锁定信息 + * + * @author FrozenWatermelon + * @date 2020-12-22 16:12:10 + */ +public interface SkuStockLockService { + + /** + * 锁定库存 + * @param skuStockLocksParam 参数 + * @return 是否成功 + */ + ServerResponseEntity lock(List skuStockLocksParam); + + /** + * 采购订单锁定库存 + * @param skuStockLocks 参数 + * @return 正常返回 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存,... + * 异常返回 skuId + */ + String lockPurchaseOrder(List skuStockLocks); + + /** + * 减少锁定库存 + * @param skuStockLocks 参数 + * @return 正常返回 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存,... + * 异常返回 skuId + */ + String purchaseOrderReduceLockStock(List skuStockLocks); + + /** + * 调拨订单锁定库存 + * @param skuStockLocks 库存锁定参数 + * @return 操作后的redis库存信息 + */ + String lockAllotOrder(List skuStockLocks); + + /** + * 调拨订单减少锁定库存 + * @param skuStockLocks 库存锁定参数 + * @return 操作后的redis库存信息 + */ + String reduceLockAllotOrder(List skuStockLocks); + + /** + * 改变库存 + * @param skuStockLocks 参数 + * @return 正常返回 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存,... + * 异常返回 skuId + */ + String changeStock(List skuStockLocks); + + /** + * 根据订单号进行库存解锁 + * @param orderIds 订单ids + */ + void unlockStockByCancel(List orderIds); + + /** + * 根据解锁的订单记录进行库存解锁,并且删除库存的出入库日志 + * @param skuStockList 订单项记录 + */ + void unlockStockByException(List skuStockList); + + /** + * 正式锁定库存,标记为使用状态 + * @param orderIds 订单ids + */ + void markerStockUse(List orderIds); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuStockService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuStockService.java new file mode 100644 index 0000000..8a2ba5c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SkuStockService.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.cache.constant.LuaOperateEnum; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import com.tmerclub.cloud.product.model.SkuStock; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 库存信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SkuStockService { + + /** + * 批量保存库存信息 + * @param skuStocks 库存信息 + * @param spuStatus 商品状态 + */ + void batchSave(List skuStocks, Integer spuStatus); + + /** + * 批量更新sku库存信息 + * @param skuList + */ + void updateBatch(List skuList); + + /** + * 根据商品id获取库存信息 + * + * @param spuId + * @return + */ + Map listStockBySpuId(@Param("spuId") Long spuId); + + /** + * 通过供应商的spuId,获取商家对应的sku库存 + * @param spuIds + * @param shopId + * @return + */ + List listSkuStockBySupplierSpuIds(List spuIds, Long shopId); + + /** + * 获取指定sku的库存 + * + * @param skuId + * @param spuMold + * @return + */ + SkuStock getBySkuId(Long skuId, Integer spuMold); + + + /** + * 批量指定商品总库存,不包括被禁用的sku的库存 + * @param spuIds + * @return + */ + Map spuStockMapBySpuIds(List spuIds); + + /** + * 通过商品编码,获取商家对应的库存 + * @param partyCodes + * @param shopId + * @return + */ + List listShopStockByPartyCodesAndShopId(List partyCodes, Long shopId); + + /** + * 获取指定的sku库存列表 + * @param stockPointIdList + * @return + */ + List listSkuStockBySkuIds(List stockPointIdList); + + /** + * 获取指定的sku总库存 + * @param skuIds + * @return + */ + Map mapSkuTotalStockBySkuIds(List skuIds); + + /** + * 获取指定的sku区域库存 + * @param stockPointSkuVOList + * @return + */ + Map mapSkuPointStockByStockPoints(List stockPointSkuVOList); + + /** + * 获取指定的sku总库存和区域库存 + * @param stockPointSkuVOList + * @return + */ + Map mapSkuTotalStockAndPointStock(List stockPointSkuVOList); + + /** + * 获取指定的sku库存信息列表 + * @param skuIds + * @return + */ + Map skuStockMapBySkuIds(List skuIds); + + /** + * 定时任务处理sku库存的变化 + */ + void handleSkuStockChange(); + + /** + * 版本升级后初始化sku库存 + */ + void initSkuStock(); + + /** + * 版本升级后初始化sku区域库存, 需要先执行initSkuStock() + */ + void initPointStock(); + + /** + * 改变sku状态 + * @param skuStockList + */ + void changeSkuStatus(List skuStockList); + + /** + * 处理库存点关联数据 + * @param spuId + * @param skuStockList + * @param luaOperateEnum + * @param hasUserPickUp 是否自提 + */ + void handSkuStock(Long spuId, List skuStockList, LuaOperateEnum luaOperateEnum, Boolean hasUserPickUp); + + /** + * 修改sku库存 + * @param skuStockVOList sku库存VO集合 + */ + void changeSkuStock(List skuStockVOList); + + /** + * 补充商品库存 + * @param spuId + * @param stockPointSkuVOList + */ + void addStockPointBySpuId(Long spuId, List stockPointSkuVOList); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuBrowseLogService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuBrowseLogService.java new file mode 100644 index 0000000..8fcb8a6 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuBrowseLogService.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.bo.mongo.MongoSpuBrowseLogBO; +import com.tmerclub.cloud.product.dto.SpuBrowseLogDTO; +import com.tmerclub.cloud.product.model.SpuBrowseLog; +import com.tmerclub.cloud.product.vo.SpuBrowseLogVO; + +import java.util.List; + +/** + * 商品浏览记录表 + * + * @author YXF + * @date 2021-03-19 14:28:14 + */ +public interface SpuBrowseLogService { + + /** + * 分页获取商品浏览记录表列表 + * @param pageDTO 分页参数 + * @return 商品浏览记录表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 保存商品浏览记录表 + * @param spuBrowseLog 商品浏览记录表 + */ + void save(MongoSpuBrowseLogBO spuBrowseLog); + + /** + * 更新商品浏览记录表 + * @param spuBrowseLog 商品浏览记录表 + */ + void updateStatus(MongoSpuBrowseLogBO spuBrowseLog); + + /** + * 单间、批量删除商品浏览记录 + * @param spuBrowseLogDTO + */ + void delete(SpuBrowseLogDTO spuBrowseLogDTO); + + /** + * 获取用户浏览的分类 + * @param spuType + * @return + */ + Long recommendCategoryId(Integer spuType); + + /** + * 获取用户该商品当天的浏览记录 + * @param spuBrowseLogDTO + * @return + */ + SpuBrowseLog getCurrentLogBySpuIdAndUserId(SpuBrowseLogDTO spuBrowseLogDTO); + + /** + * 获取用户最近的三条浏览记录 + * @param userId 用户id + * @param shopId + * @return 返回最近的三条记录 + */ + List recentBrowse(Long userId, Long shopId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuCollectionService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuCollectionService.java new file mode 100644 index 0000000..530f582 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuCollectionService.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.app.SpuAppVO; +import com.tmerclub.cloud.product.model.SpuCollection; +import com.tmerclub.cloud.product.vo.SpuCollectionVO; + +import java.util.List; + +/** + * 商品收藏信息 + * + * @author FrozenWatermelon + * @date 2020-11-21 14:43:16 + */ +public interface SpuCollectionService { + + /** + * 分页获取商品收藏信息列表 + * @param pageDTO 分页参数 + * @return 商品收藏信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据商品收藏信息id获取商品收藏信息 + * + * @param id 商品收藏信息id + * @return 商品收藏信息 + */ + SpuCollectionVO getById(Long id); + + /** + * 保存商品收藏信息 + * @param spuCollection 商品收藏信息 + */ + void save(SpuCollection spuCollection); + + /** + * 更新商品收藏信息 + * @param spuCollection 商品收藏信息 + */ + void update(SpuCollection spuCollection); + + /** + * 根据商品收藏信息id删除商品收藏信息 + * @param id + */ + void deleteById(Long id); + + /** + * 获取用户的商品收藏数量 + * + * @param spuId + * @param userId + * @return + */ + int userCollectionCount(Long spuId, Long userId); + + /** + * 分页返回收藏数据 + * + * @param userId 用户id + * @param spuName 筛选名称 + * @param pageDTO 分页信息 + * @param prodType 收藏失效状态,2为失效,0为正常 + * @return 收藏数据 + */ + PageVO getUserCollectionDtoPageByUserId(PageDTO pageDTO, Long userId, String spuName, Integer prodType); + + /** + * 删除商品收藏 + * @param spuId + * @param userId + */ + void deleteBySpuIdAndUserId(Long spuId, Long userId); + + /** + * 商品批量收藏 + * @param spuIdList + */ + void spuBatchCollection(List spuIdList); + + /** + * 批量删除商品收藏 + * + * @param spuIds 商品ids + * @param userId 用户id + */ + void deleteBatchBySpuIdsAndUserId(List spuIds, Long userId); + + /** + * 根据商品id删除关联收藏信息 + * @param spuId 商品id + */ + void deleteBySpuId(Long spuId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuCommService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuCommService.java new file mode 100644 index 0000000..ee8b00a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuCommService.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.bo.mongo.MongoSpuCommBO; +import com.tmerclub.cloud.product.dto.SpuCommDTO; +import com.tmerclub.cloud.product.vo.SpuCommStatisticsStarVO; +import com.tmerclub.cloud.product.vo.SpuCommStatisticsVO; +import com.tmerclub.cloud.product.vo.SpuCommVO; + +import java.util.List; + +/** + * 商品评论 + * + * @author YXF + * @date 2021-01-11 13:47:33 + */ +public interface SpuCommService { + + /** + * 分页获取商品评论列表 + * + * @param pageDTO 分页参数 + * @param spuCommDTO 搜索条件 + * @return 商品评论列表分页数据 + */ + PageVO page(PageDTO pageDTO, SpuCommDTO spuCommDTO); + + /** + * 根据商品评论id获取商品评论 + * + * @param spuCommId 商品评论id + * @return 商品评论 + */ + SpuCommVO getBySpuCommId(Long spuCommId); + + /** + * 更新商品评论 + * + * @param mongoSpuCommBO 商品评论 + */ + void save(MongoSpuCommBO mongoSpuCommBO); + + /** + * 更新商品评论 + * + * @param spuComm 商品评论 + */ + void update(SpuCommDTO spuComm); + + /** + * 根据商品评论id删除商品评论 + * + * @param spuCommId + */ + void deleteById(Long spuCommId); + + /** + * 根据商品,获取商品评论分页 + * + * @param pageDTO + * @param spuId 商品id + * @param evaluate 评论类型 null/0 全部,1好评 2中评 3差评 4有图 + * @return + */ + PageVO spuCommPage(PageDTO pageDTO, Long spuId, Integer evaluate); + + /** + * 返回商品评论统计数据(好评率 好评数量 中评数 差评数 有图) + * + * @param spuId + * @return + */ + SpuCommStatisticsVO getProdCommDataBySpuId(Long spuId); + + /** + * 根据用户,获取商品评论分页 + * + * @param pageDTO + * @param userId + * @return + */ + PageVO spuCommPageByUserId(PageDTO pageDTO, Long userId); + + /** + * 根据orderItemId和userId, 获取商品评论信息 + * + * @param orderItemIds + * @param userId + * @return + */ + List getSpuCommByOrderItemId(List orderItemIds, Long userId); + + /** + * 添加商品评论 + * + * @param spuCommDTO + */ + void comm(SpuCommDTO spuCommDTO); + + /** + * @param spuCommDTOList + */ + void comms(List spuCommDTOList); + + /** + * 统计商品好评数量 + * + * @param spuId + * @return + */ + Integer countGoodReview(Long spuId); + + /** + * 返回商品评论数据(按星数划分数量)(商品) + * @param spuId + * @return + */ + SpuCommStatisticsStarVO getProdCommDataByStar(Long spuId); + + /** + * 获取时间范围内的销量排序,放入redis并返回当前分页的商品信息 + * + * @param key + * @param shopId 店铺id + * @param time 时间范围内 + * @param expireTime + * @param esRenovationSpuSort + * @param primaryCategoryId + * @return + */ + List getCommNumRankShopIdAndTime(String key, Long shopId, Integer time, Integer expireTime, Integer esRenovationSpuSort, Long primaryCategoryId); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuExcelService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuExcelService.java new file mode 100644 index 0000000..0128b3a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuExcelService.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.product.dto.SpuPageSearchDTO; +import com.tmerclub.cloud.product.vo.PlatformSpuExcelVO; +import com.tmerclub.cloud.product.vo.SpuExcelVO; +import com.tmerclub.cloud.product.vo.SupplierSpuExcelVO; +import jakarta.servlet.http.HttpServletResponse; + +import java.util.List; +import java.util.Map; + +/** + * spu信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SpuExcelService { + + /** + * 获取spu信息列表(excel导出) + * @param spuDTO + * @return + */ + List excelSpuList(SpuPageSearchDTO spuDTO); + + /** + * 导入商品 + * @param spuList + * @param errorMap + */ + void exportExcel(List spuList, Map> errorMap); + + /** + * 商品导入的错误信息 + * @param errorMap + * @return + */ + String spuExportError(Map> errorMap); + + /** + * 导出模板 + * @param response + */ + void downloadModel(HttpServletResponse response); + + /** + * 获取代销spu信息列表(excel导出) + * @param spuDTO + * @return + */ + List excelSupplierSpuList(SpuPageSearchDTO spuDTO); + + /** + * 平台商品导出 + * @param productSearchDTO + * @return + */ + List excelPlatformSpuList(ProductSearchDTO productSearchDTO); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuLangService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuLangService.java new file mode 100644 index 0000000..a18e0c1 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuLangService.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.model.SpuLang; + +import java.util.List; + +/** + * 商品-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public interface SpuLangService { + + /** + * 分页获取商品-国际化表列表 + * @param pageDTO 分页参数 + * @return 商品-国际化表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据商品-国际化表id获取商品-国际化表 + * + * @param spuId 商品-国际化表id + * @return 商品-国际化表 + */ + SpuLang getBySpuId(Long spuId); + + /** + * 批量保存商品-国际化表 + * @param spuLangList 商品-国际化表 + */ + void batchSave(List spuLangList); + + /** + * 批量更新商品-国际化表 + * @param spuLangList 商品-国际化表 + */ + void batchUpdate(List spuLangList); + + /** + * 根据商品-国际化表id删除商品-国际化表 + * @param spuId 商品-国际化表id + */ + void deleteById(Long spuId); + + /** + * 更新 + * @param spuLangList 商品国际化信息 + * @param spuId 商品id + */ + void update(List spuLangList, Long spuId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuOfflineService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuOfflineService.java new file mode 100644 index 0000000..a493f2f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuOfflineService.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import java.util.List; + +/** + * spu信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SpuOfflineService { + + /** + * 批量下线商品及关联的活动 + * + * @param type 下线商品和活动类型,1.直接通过商品ids,2.通过shopId判断为平台还是店铺分类ids进行下架,3.下线店铺通过shopId + * @param spuIds 商品ids + * @param shopId 店铺id + * @param categoryIds 分类id + * @param status 修改后的商品状态,为空 默认查询条件status是1 + * @param shopIds 店铺ids + */ + void offlineSpuStatusAndActivity(Integer type, List spuIds, Long shopId, List categoryIds, Integer status, List shopIds); + + /** + * 下线品牌相关商品和活动 + * + * @param spuIds 商品ids + * @param brandId 品牌id + */ + void offlineSpuStatusAndActivityByBrandId(List spuIds, Long brandId); + + /** + * 异步下架品牌相关代销商品和活动 + * + * @param type + * @param spuIds + * @param shopId + * @param categoryIds + * @param status + * @param sysType + */ + void offlineCommissionSpuStatusAndActivity(Integer type, List spuIds, Long shopId, List categoryIds, Integer status, Integer sysType); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuPriceLogService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuPriceLogService.java new file mode 100644 index 0000000..2d19a11 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuPriceLogService.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.dto.SpuPriceLogDTO; +import com.tmerclub.cloud.product.model.SpuPriceLog; +import com.tmerclub.cloud.product.vo.SpuPriceLogVO; + +/** + * 供应商商品调价记录 + * + * @author lhd + * @date 2022-06-29 17:55:56 + */ +public interface SpuPriceLogService { + + /** + * 分页获取供应商商品调价记录列表 + * @param pageDTO 分页参数 + * @param spuPriceLogDTO + * @return 供应商商品调价记录列表分页数据 + */ + PageVO page(PageDTO pageDTO, SpuPriceLogDTO spuPriceLogDTO); + + /** + * 根据供应商商品调价记录id获取供应商商品调价记录 + * + * @param id 供应商商品调价记录id + * @return 供应商商品调价记录 + */ + SpuPriceLog getById(Long id); + + /** + * 保存供应商商品调价记录 + * @param spuPriceLog 供应商商品调价记录 + */ + void save(SpuPriceLog spuPriceLog); + + /** + * 更新供应商商品调价记录 + * @param spuPriceLog 供应商商品调价记录 + */ + void update(SpuPriceLog spuPriceLog); + + /** + * 根据供应商商品调价记录id删除供应商商品调价记录 + * @param id 供应商商品调价记录id + */ + void deleteById(Long id); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuSkuAttrValueLangService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuSkuAttrValueLangService.java new file mode 100644 index 0000000..fbb351c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuSkuAttrValueLangService.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.model.SpuSkuAttrValueLang; + +/** + * 商品sku销售属性关联信息-国际化 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public interface SpuSkuAttrValueLangService { + + /** + * 分页获取商品sku销售属性关联信息-国际化列表 + * @param pageDTO 分页参数 + * @return 商品sku销售属性关联信息-国际化列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据商品sku销售属性关联信息-国际化id获取商品sku销售属性关联信息-国际化 + * + * @param spuSkuAttrId 商品sku销售属性关联信息-国际化id + * @return 商品sku销售属性关联信息-国际化 + */ + SpuSkuAttrValueLang getBySpuSkuAttrId(Long spuSkuAttrId); + + /** + * 保存商品sku销售属性关联信息-国际化 + * @param spuSkuAttrValueLang 商品sku销售属性关联信息-国际化 + */ + void save(SpuSkuAttrValueLang spuSkuAttrValueLang); + + /** + * 更新商品sku销售属性关联信息-国际化 + * @param spuSkuAttrValueLang 商品sku销售属性关联信息-国际化 + */ + void update(SpuSkuAttrValueLang spuSkuAttrValueLang); + + /** + * 根据商品sku销售属性关联信息-国际化id删除商品sku销售属性关联信息-国际化 + * @param spuSkuAttrId 商品sku销售属性关联信息-国际化id + */ + void deleteById(Long spuSkuAttrId); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuStockService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuStockService.java new file mode 100644 index 0000000..6b8d51a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuStockService.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.product.vo.SpuVO; + +import java.util.List; + +/** + * 库存信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SpuStockService { + + /** + * 插入商品库存 + * @param spuList 商品列表 + */ + void setSpuStock(List spuList); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockBillLogItemService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockBillLogItemService.java new file mode 100644 index 0000000..bb32c17 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockBillLogItemService.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.dto.StockBillLogDTO; +import com.tmerclub.cloud.product.vo.StockBillLogItemExcelVO; +import com.tmerclub.cloud.product.vo.StockBillLogItemImportExcelVO; +import com.tmerclub.cloud.product.vo.StockBillLogItemImportVO; +import com.tmerclub.cloud.product.vo.mongo.MongoStockBillLogItemVO; +import jakarta.servlet.http.HttpServletResponse; + +import java.util.List; + +/** + * 出入库商品项 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public interface StockBillLogItemService { + + /** + * 分页获取出入库商品项列表 + * @param pageDTO 分页参数 + * @param stockBillLogDTO + * @return 出入库商品项列表分页数据 + */ + PageVO page(PageDTO pageDTO, StockBillLogDTO stockBillLogDTO); + + /** + * 获取导出库存流水 + * @param stockBillLogDTO + * @param response + * @return + */ + List exportFlow(StockBillLogDTO stockBillLogDTO, HttpServletResponse response); + + /** + * 下载导入 出入库商品项模板 + * @param response + * @param type + */ + void downloadModel(HttpServletResponse response, Integer type); + + /** + * 导入出入库商品项 + * @param list + * @param errorList + * @param stockType + * @param stockBillLogItemImportVO + */ + void importExcel(List list, List errorList, Integer stockType, StockBillLogItemImportVO stockBillLogItemImportVO); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockPointSkuService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockPointSkuService.java new file mode 100644 index 0000000..2a75cdd --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockPointSkuService.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import com.tmerclub.cloud.product.model.StockPointSku; + +import java.util.List; + +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-09 18:00:43 + */ +public interface StockPointSkuService { + + /** + * 分页获取列表 + * @param pageDTO 分页参数 + * @return 列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据id获取 + * + * @param stockPointSkuId id + * @return + */ + StockPointSku getByStockPointSkuId(Long stockPointSkuId); + + /** + * 保存 + * @param stockPointSku + */ + void save(StockPointSku stockPointSku); + + /** + * 更新 + * @param stockPointSku + */ + void update(StockPointSku stockPointSku); + + /** + * 根据id删除 + * @param stockPointSkuId id + */ + void deleteById(Long stockPointSkuId); + + /** + * 根据id集合删除 + * @param stockPointSkuIds 关联id集合 + */ + void deleteByIds(List stockPointSkuIds); + + /** + * 根据商品id删除 + * @param spuId id + */ + void deleteBySpuId(Long spuId); + + /** + * 根据关联库存数据id批量删除 + * @param stockPointSkuIdList + */ + void batchDeleteByStockPointSkuIdList(List stockPointSkuIdList); + + + /** + * 批量保存库存点和商品关联 + * @param stockPointDTOList + */ + void batchSave(List stockPointDTOList); + + /** + * 根据skuid批量获取关联数据 + * @param skuIds + * @return + */ + List listBySkuIds(List skuIds); + + /** + * 根据skuid批量获取关联数据 + * @param skuIds + * @return + */ + List listPointIdsBySkuIds(List skuIds); + + /** + * 修改库存商品关联 + * @param stockPointDTOList + * @param isUpdate true修改 false新增 + */ + void changeStockPoint(List stockPointDTOList, boolean isUpdate); + + /** + * 根据库存点id获取关联数据 + * @param stockPointId + * @return + */ + List listByPointId(Long stockPointId); + + /** + * 根据skuid和库存点id删除数据 + * @param skuId + * @param stockPointId + */ + void removeBySkuIdAndPointId(Long skuId, Long stockPointId); + + /** + * 获取指定sku的仓库列表 + * @param skuIds + * @return + */ + List listPointBySkuIds(List skuIds); + + /*** + * 根据库存点id修改库存模式 + * @param stockPointId + * @param stockMode + */ + void updateStockMode(Long stockPointId, Integer stockMode); + + /** + * 过滤被删除的库存和门店,以及被修改为共享模式的门店 + * @param stockPointSkuVOList + * @return + */ + List filtePoint(List stockPointSkuVOList); + + /** + * 获取库存点skuVO集合 + * @param stockPointSkuDTO 库存点skuDTO + * @return 库存点sku集合 + */ + List listStockPointSku(StockPointSkuDTO stockPointSkuDTO); + + /** + * 检查库存点集合是否含有该sku集合 + * @param stockPointIds 库存点id集合 + * @param skuIds skuId集合 + * @return 包含的skuId集合 + */ + List checkStockPointContainSku(List stockPointIds, List skuIds); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SupplierSpuUpdateLaterOperateService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SupplierSpuUpdateLaterOperateService.java new file mode 100644 index 0000000..7c85f9b --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SupplierSpuUpdateLaterOperateService.java @@ -0,0 +1,124 @@ +package com.tmerclub.cloud.product.service;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.product.model.SpuConsignmentChange; + +import java.util.List; +import java.util.Map; + +/** + * @author xxw + * @date 2022/8/5 17:49 + * 供应商品变更后的操作 + */ +public interface SupplierSpuUpdateLaterOperateService { + /** + * 供货价发生变化、sku种类增加,商家是手动设价,下架商家的商品 + * + * @param supplierSpuId + */ + void skuUpdateLaterOperate(Long supplierSpuId); + + /** + * 如果重量体积发生变化,商品是商家发货,下架商家商品 + * + * @param supplierSpuId + */ + void skuWeightOrVolumeUpdateOperate(Long supplierSpuId); + + /** + * sku增加,代销商品sku增加 + * + * @param supplierSpuId + */ + void skuAddOperate(Long supplierSpuId); + + /** + * 验证 当商家设置了手动设价--供货价高于售价自动下架商品 发布的商品售价是否低于供货价 低于就下架代销商品 + * + * @param esProductBO + * @return + */ + void feePriceUnderSupplyPrice(EsProductBO esProductBO); + + /** + * 批量改变商品状态(上下架) + * + * @param spuIds + * @param status + * @param sysType + */ + void batchChangeSpuStatus(List spuIds, Integer status, Integer sysType); + + /** + * 供应商品市场价变更后同步代销商品市场价 + * + * @param skuId + * @param price + */ + void synMarketPrice(Long skuId, Long price); + + /** + * 供应商变更了商品信息,下架手动设价的代销商品 + * + * @param supplierSpuId + * @param type + * @param isFiltration + */ + void soldOutManualPriceCommissionSpu(Long supplierSpuId, Integer type, Integer isFiltration); + + /** + * 供应商品sku增加或者删除处理代销商品sku + * + * @param supplierSpuId + * @param skuId + */ + void supplierSkuAddOrDeleteLaterOperate(Long supplierSpuId, Long skuId); + + /** + * 供应商商品更新后代销商品同步更新 + * + * @param supplierSpuId + */ + void changeSynUpdate(Long supplierSpuId); + + /** + * 获取商品信息列表时 检查代销商品基本信息是否改变,如果改变了显示商家自己商品信息,没有改变则显示供应商信息 + * + * @param spuAdminList + * @param supplierSpuMap + * @return + */ + List disposeSpuMsg(List spuAdminList, Map> supplierSpuMap); + + /** + * 用户端获取商品信息列表时 检查代销商品基本信息是否改变,如果改变了显示商家自己商品信息,没有改变则显示供应商信息 + * + * @param spuSearchVOList + * @param spuConsignmentChangeMap + * @param supplierSpuMap + * @return + */ + List usDisposeSpuMsg(List spuSearchVOList, Map> spuConsignmentChangeMap, Map> supplierSpuMap); + + /** + * 供应商商品变更后对应下架不同类型的代销商品 + * + * @param supplierSpuId + * @param commissionSpuOffType + */ + void supplierSpuUpdateLaterOffSpu(Long supplierSpuId, Integer commissionSpuOffType); + + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/TakeStockService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/TakeStockService.java new file mode 100644 index 0000000..e8650f9 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/TakeStockService.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.dto.TakeStockDTO; +import com.tmerclub.cloud.product.model.TakeStock; +import com.tmerclub.cloud.product.vo.TakeStockVO; +import jakarta.servlet.http.HttpServletResponse; + +/** + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public interface TakeStockService { + + /** + * 分页获取列表 + * + * @param pageDTO 分页参数 + * @return 列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据id获取 + * + * @param takeStockId id + * @return + */ + TakeStockVO getByTakeStockId(Long takeStockId); + + /** + * 保存 + * + * @param takeStock + */ + void save(TakeStock takeStock); + + /** + * 更新 + * + * @param takeStock + */ + void update(TakeStock takeStock); + + /** + * 根据id删除 + * + * @param takeStockId id + */ + void deleteById(Long takeStockId); + + /** + * 分页查询实物盘点数据 + * + * @param pageDTO + * @param takeStockDTO + * @return + */ + PageVO pageByParam(PageDTO pageDTO, TakeStockDTO takeStockDTO); + + /** + * 更新实物盘点 + * + * @param takeStockDTO + */ + void updateTakeStock(TakeStockDTO takeStockDTO); + + /** + * 完成实物盘点 + * + * @param takeStockDTO + */ + void finishTakeStock(TakeStockDTO takeStockDTO); + + /** + * 作废实物盘点(通过仓库id) + * @param warehouseId 仓库id + */ + void nullifyByWarehouseId(Long warehouseId); + + /** + * excel导出 + * + * @param takeStockDTO + * @param response + */ + void exportExcel(TakeStockDTO takeStockDTO, HttpServletResponse response); + + /** + * 统计未完成的实物盘点数 + * @param warehouseId 仓库id + * @return 未完成数 + */ + Long countUnFinish(Long warehouseId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/TakeStockSpuService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/TakeStockSpuService.java new file mode 100644 index 0000000..f2c10d6 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/TakeStockSpuService.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.dto.TakeStockDTO; +import com.tmerclub.cloud.product.model.TakeStockSpu; +import com.tmerclub.cloud.product.vo.TakeStockSpuExcelVO; +import com.tmerclub.cloud.product.vo.TakeStockSpuImportVO; +import com.tmerclub.cloud.product.vo.TakeStockSpuVO; +import jakarta.servlet.http.HttpServletResponse; + +import java.util.List; +import java.util.Set; + +/** + * 盘点商品列表 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public interface TakeStockSpuService { + + /** + * 分页获取盘点商品列表列表 + * @param pageDTO 分页参数 + * @return 盘点商品列表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据盘点商品列表id获取盘点商品列表 + * + * @param takeStockSpuId 盘点商品列表id + * @return 盘点商品列表 + */ + TakeStockSpu getByTakeStockSpuId(Long takeStockSpuId); + + /** + * 保存盘点商品列表 + * @param takeStockSpu 盘点商品列表 + */ + void save(TakeStockSpu takeStockSpu); + + /** + * 更新盘点商品列表 + * @param takeStockSpu 盘点商品列表 + */ + void update(TakeStockSpu takeStockSpu); + + /** + * 根据盘点商品列表id删除盘点商品列表 + * @param takeStockSpuId 盘点商品列表id + */ + void deleteById(Long takeStockSpuId); + + /** + * 根据takeStockDTO更新实物盘点商品 + * @param takeStockDTO + */ + void updateByTakeStockDTO(TakeStockDTO takeStockDTO); + + /** + * 通过实物盘点id获取实物盘点商品信息 + * @param takeStockId + * @return + */ + List listByTakeStockId(Long takeStockId); + + /** + * 下载实物盘点商品excel导入模板 + * @param response + */ + void downloadModel(HttpServletResponse response); + + /** + * 导入实物盘点商品excel + * + * @param list + * @param errorList + * @param partyCodes + * @param takeStockId + * @param takeStockSpuImportVO + */ + void importExcel(List list, List errorList, Set partyCodes, Long takeStockId, TakeStockSpuImportVO takeStockSpuImportVO); + + /** + * 导出实物盘点商品excel + * @param takeStockId + * @param response + */ + void exportExcel(Long takeStockId, HttpServletResponse response); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/WarehouseService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/WarehouseService.java new file mode 100644 index 0000000..31a097e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/WarehouseService.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.api.product.dto.WarehouseDTO; +import com.tmerclub.cloud.common.product.vo.StockPointVO; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +public interface WarehouseService { + + /** + * 分页获取列表 + * + * @param pageDTO 分页参数 + * @param warehouseDTO 查询参数 + * @return 列表分页数据 + */ + PageVO page(PageDTO pageDTO, WarehouseDTO warehouseDTO); + + /** + * 根据id获取 + * + * @param warehouseId id + * @return + */ + WarehouseVO getByWarehouseId(Long warehouseId); + + /** + * 保存 + * + * @param warehouse + */ + void insertWarehouseAndArea(WarehouseDTO warehouse); + + /** + * 更新 + * + * @param warehouse + */ + void updateWarehouseAndArea(WarehouseDTO warehouse); + + /** + * 根据id删除 + * + * @param warehouseId id + * @return + */ + WarehouseVO deleteWarehouseAndArea(Long warehouseId); + + /** + * 根据id清除缓存 + * + * @param warehouseId 仓库id + * @param shopId 店铺id + * @param sysType 系统类型 + */ + void removeWarehouseCache(Long warehouseId, Long shopId, Integer sysType); + + /** + * 根据shopId创建默认仓库 + * + * @param shopId + * @param sysType + * @param phone + * @param name + */ + void createWarehouseByShopId(Long shopId, Integer sysType, String phone, String name); + + /** + * 根据店铺id获取所有的供货城市id + * + * @param shopId + * @param sysType + * @param warehouseId + * @return + */ + List listWarehouseAreaByShopId(Long shopId, Integer sysType, Long warehouseId); + + /** + * 获取仓库集合 + * + * @param warehouseDTO 仓库dto + * @return 仓库集合 + */ + List listWarehouse(WarehouseDTO warehouseDTO); + + /** + * 获取可配送仓库集合 + * @param warehouseDTO 仓库dto + * @return 仓库集合 + */ + List listCanDeliveryWarehouse(WarehouseDTO warehouseDTO); + + /** + * 获取商家的默认仓库id + * + * @param shopId + * @param sysType + * @return + */ + WarehouseVO getDefaultWarehouseByShopId(Long shopId, Integer sysType); + + /** + * 获取店铺的所有仓库列表 + * + * @param shopId + * @param sysType + * @return + */ + List listWarehouseByShopId(Long shopId, Integer sysType); + + /** + * 初始化默认仓库 + */ + void intiWarehouse(); + + /** + * 获取默认仓库集合 + * @return 仓库集合 + */ + List listDefaultWarehouses(); + + /** + * 根据店铺id和类型获取库存点数据 + * @param shopId + * @param sysType + * @return + */ + StockPointVO getWarehousePoint(Long shopId, Integer sysType); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrLangServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrLangServiceImpl.java new file mode 100644 index 0000000..135d782 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrLangServiceImpl.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.AttrLangVO; +import com.tmerclub.cloud.common.product.vo.AttrVO; +import com.tmerclub.cloud.product.mapper.AttrLangMapper; +import com.tmerclub.cloud.product.mapper.AttrValueLangMapper; +import com.tmerclub.cloud.product.model.AttrLang; +import com.tmerclub.cloud.product.service.AttrLangService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 属性-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +@Service +public class AttrLangServiceImpl implements AttrLangService { + + @Autowired + private AttrLangMapper attrLangMapper; + @Autowired + private AttrValueLangMapper attrValueLangMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> attrLangMapper.list()); + } + + @Override + public AttrLang getByAttrId(Long attrId) { + return attrLangMapper.getByAttrId(attrId); + } + + @Override + public void save(List attrLangList, Long attrId) { + for (AttrLang attrLang : attrLangList) { + attrLang.setAttrId(attrId); + } + attrLangMapper.batchSave(attrLangList); + } + + @Override + public void update(List attrLangList, AttrVO attrVO) { + Long attrId = attrVO.getAttrId(); + Map attrLangMap = attrVO.getAttrLangList().stream().collect(Collectors.toMap(AttrLangVO::getLang, a -> a)); + List saveList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List updateList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (AttrLang attrLang : attrLangList) { + if (!attrLangMap.containsKey(attrLang.getLang())) { + attrLang.setAttrId(attrId); + saveList.add(attrLang); + } else { + updateList.add(attrLang); + attrLangMap.remove(attrLang.getLang()); + } + } + if (CollUtil.isNotEmpty(saveList)) { + attrLangMapper.batchSave(saveList); + } + if (CollUtil.isNotEmpty(updateList)) { + attrLangMapper.batchUpdate(updateList); + } + Set keySet = attrLangMap.keySet(); + // 获取要删除的语言信息(默认语言不能删) + if (CollUtil.isNotEmpty(keySet)) { + attrLangMapper.batchDelete(keySet, attrId); + attrValueLangMapper.deleteByAttrIdAndLangs(attrId, keySet); + } + } + + @Override + public void deleteById(Long attrId) { + attrLangMapper.deleteById(attrId); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrValueServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrValueServiceImpl.java new file mode 100644 index 0000000..7fa137c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrValueServiceImpl.java @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.AttrType; +import com.tmerclub.cloud.common.product.dto.AttrLangDTO; +import com.tmerclub.cloud.common.product.dto.AttrValueLangDTO; +import com.tmerclub.cloud.common.product.vo.AttrLangVO; +import com.tmerclub.cloud.common.product.vo.AttrVO; +import com.tmerclub.cloud.common.product.vo.AttrValueLangVO; +import com.tmerclub.cloud.common.product.vo.AttrValueVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.AttrDTO; +import com.tmerclub.cloud.product.dto.AttrValueDTO; +import com.tmerclub.cloud.product.mapper.AttrMapper; +import com.tmerclub.cloud.product.mapper.AttrValueMapper; +import com.tmerclub.cloud.product.model.AttrValue; +import com.tmerclub.cloud.product.model.AttrValueLang; +import com.tmerclub.cloud.product.model.SpuAttrValue; +import com.tmerclub.cloud.product.service.AttrValueLangService; +import com.tmerclub.cloud.product.service.AttrValueService; +import com.tmerclub.cloud.product.service.SpuAttrValueService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 属性值信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@Service +public class AttrValueServiceImpl implements AttrValueService { + + @Autowired + private AttrValueMapper attrValueMapper; + @Autowired + private AttrValueLangService attrValueLangService; + @Autowired + private SpuAttrValueService spuAttrValueService; + @Autowired + private AttrMapper attrMapper; + + @Override + public void save(List attrValueList, Long attrId) { + if (CollUtil.isEmpty(attrValueList)) { + return; + } + for (AttrValueDTO attrValueDTO : attrValueList) { + attrValueDTO.setAttrId(attrId); + checkAttrValueLangData(attrValueDTO.getValues()); + AttrValue attrValue = BeanUtil.map(attrValueDTO, AttrValue.class); + attrValueMapper.save(attrValue); + attrValueLangService.save(BeanUtil.mapAsList(attrValueDTO.getValues(), AttrValueLang.class), attrValue.getAttrValueId()); + } + } + + private void checkAttrValueLangData(List attrValueLangList) { + if (CollUtil.isEmpty(attrValueLangList)) { + return; + } + Iterator iterator = attrValueLangList.iterator(); + boolean correct = false; + while (iterator.hasNext()) { + AttrValueLangDTO attrValueLangDTO = iterator.next(); + if (StrUtil.isBlank(attrValueLangDTO.getValue())) { + iterator.remove(); + continue; + } + if (Objects.equals(attrValueLangDTO.getLang(), Constant.DEFAULT_LANG)) { + correct = true; + } + } + if (CollUtil.isEmpty(attrValueLangList) || !correct) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(AttrDTO attrDTO, AttrVO dbAttr) { + List addAttrValue = new ArrayList<>(Constant.INITIAL_CAPACITY); + List deleteAttrValue = dbAttr.getAttrValues().stream().map(AttrValueVO::getAttrValueId).collect(Collectors.toList()); + deleteAttrValue = new ArrayList<>(deleteAttrValue); + // 过滤掉不需要更新的数据,并更新属性值语言信息 + handleAttrData(attrDTO, addAttrValue, deleteAttrValue, dbAttr); + // 删除属性值数据 + if (CollUtil.isNotEmpty(deleteAttrValue)) { + if (Objects.equals(attrDTO.getAttrType(), AttrType.BASIC.value())) { + spuAttrValueService.deleteUnionDataByAttId(attrDTO.getAttrId(), deleteAttrValue); + } + attrValueMapper.deleteBatch(deleteAttrValue); + attrValueLangService.deleteBatch(deleteAttrValue); + } + // 新增属性值数据 + save(addAttrValue, dbAttr.getAttrId()); + // 销售属性的更新到此已结束,下面是基本数量关联信息(商品)的更新 + // 基本属性-更新关联的商品属性 + if (Objects.equals(attrDTO.getAttrType(), AttrType.BASIC.value())) { + updateAttrAndAttrValueOfSpuOrSku(attrDTO, dbAttr); + } + } + + /** + * 处理属性值语言信息-新增、更新(处理属性时,已删除掉多余的属性值语言信息) + * + * @param attrDTO 属性信息 + * @param addAttrValue 需要新增的属性值 + * @param deleteAttrValue 属性值删除列表 + * @param dbAttr 旧的属性信息 + */ + private void handleAttrData(AttrDTO attrDTO, List addAttrValue, List deleteAttrValue, AttrVO dbAttr) { + List updateAttrValueLang = new ArrayList<>(Constant.INITIAL_CAPACITY); + List saveAttrValueLang = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map> attrValueLangMap = new HashMap<>(dbAttr.getAttrValues().size()); + for (AttrValueVO attrValue : dbAttr.getAttrValues()) { + List langList = attrValue.getValues().stream().map(AttrValueLangVO::getLang).collect(Collectors.toList()); + attrValueLangMap.put(attrValue.getAttrValueId(), langList); + } + // 分别筛选出增删改的数据 + Iterator attrValueIterator = attrDTO.getAttrValues().iterator(); + while (attrValueIterator.hasNext()) { + // 新增的属性值 + AttrValueDTO attrValue = attrValueIterator.next(); + if (Objects.isNull(attrValue.getAttrValueId())) { + addAttrValue.add(attrValue); + attrValueIterator.remove(); + continue; + } + for (AttrValueLangDTO attrValueLang : attrValue.getValues()) { + List langList = attrValueLangMap.get(attrValue.getAttrValueId()); + // 新增 + if (CollUtil.isEmpty(langList) || !langList.contains(attrValueLang.getLang())) { + attrValueLang.setAttrValueId(attrValue.getAttrValueId()); + saveAttrValueLang.add(attrValueLang); + continue; + } + attrValueLang.setAttrValueId(attrValue.getAttrValueId()); + updateAttrValueLang.add(attrValueLang); + } + deleteAttrValue.remove(attrValue.getAttrValueId()); + if (CollUtil.isEmpty(attrValue.getValues())) { + attrValueIterator.remove(); + } + } + + // 保存属性值数据 + attrValueLangService.saveBatch(BeanUtil.mapAsList(saveAttrValueLang, AttrValueLang.class)); + // 更新属性值数据 + if (CollUtil.isNotEmpty(updateAttrValueLang)) { + attrValueLangService.update(BeanUtil.mapAsList(updateAttrValueLang, AttrValueLang.class)); + } + + } + + /** + * 更新属性数据时,更新商品中的属性数据 + * 若不需要同步更新商品中的属性数据,在更新属性数据时,不调用该方法即可,不影响其他流程 + * + * @param attrDTO 属性信息 + * @param dbAttr 属性信息 + */ + private void updateAttrAndAttrValueOfSpuOrSku(AttrDTO attrDTO, AttrVO dbAttr) { + if (CollUtil.isEmpty(attrDTO.getAttrLangList()) && CollUtil.isEmpty(attrDTO.getAttrValues())) { + return; + } + + Map attrLangMap = attrDTO.getAttrLangList().stream().collect(Collectors.toMap(AttrLangDTO::getLang, a -> a)); + // 检验属性名是否改变 + boolean isChange = true; + if (Objects.equals(dbAttr.getAttrLangList().size(), attrDTO.getAttrLangList().size())) { + for (AttrLangVO attrLangVO : dbAttr.getAttrLangList()) { + if (!attrLangMap.containsKey(attrLangVO.getLang())) { + isChange = true; + break; + } + AttrLangDTO attrLangDb = attrLangMap.get(attrLangVO.getLang()); + // 属性名与属性描述没有改变 + if (Objects.equals(attrLangVO.getName(), attrLangDb.getName()) && Objects.equals(attrLangVO.getDesc(), attrLangDb.getDesc())) { + isChange = false; + continue; + } + isChange = true; + break; + } + } + List spuAttrValueList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map attrValueMap = attrDTO.getAttrValues().stream() + .filter(attrValueDTO -> Objects.nonNull(attrValueDTO.getAttrValueId())) + .collect(Collectors.toMap(AttrValueDTO::getAttrValueId, a -> a)); + // 筛选需要更新的商品属性值 + Set attrValueIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (AttrValueVO attrValueDb : dbAttr.getAttrValues()) { + // 属性值已删除 + if (!attrValueMap.containsKey(attrValueDb.getAttrValueId())) { + continue; + } + AttrValueDTO attrValueDTO = attrValueMap.get(attrValueDb.getAttrValueId()); + Map valueLangMap = attrValueDTO.getValues().stream().collect(Collectors.toMap(AttrValueLangDTO::getLang, a -> a)); + for (AttrValueLangVO valueDb : attrValueDb.getValues()) { + // 新增的语言信息,不要更新 + if (!valueLangMap.containsKey(valueDb.getLang())) { + attrValueIds.add(attrValueDb.getAttrValueId()); + continue; + } + // 更新-属性名或属性值发生改变 + AttrValueLangDTO attrValueLangDTO = valueLangMap.get(valueDb.getLang()); + if (isChange || !Objects.equals(attrValueLangDTO.getValue(), valueDb.getValue())) { + attrValueIds.add(attrValueDb.getAttrValueId()); + + SpuAttrValue spuAttrValue = new SpuAttrValue(); + spuAttrValue.setAttrId(attrDTO.getAttrId()); + spuAttrValue.setLang(valueDb.getLang()); + AttrLangDTO attrLangDTO = attrLangMap.get(valueDb.getLang()); + spuAttrValue.setAttrName(attrLangDTO.getName()); + spuAttrValue.setAttrDesc(attrLangDTO.getDesc()); + spuAttrValue.setAttrValueId(attrValueDb.getAttrValueId()); + spuAttrValue.setAttrValueName(attrValueLangDTO.getValue()); + spuAttrValueList.add(spuAttrValue); + } + + } + } + // 更新es中商品的属性信息及清除商品属性缓存 + if (isChange) { + attrValueIds = attrValueMap.keySet(); + } + spuAttrValueService.updateSpuByAttrValueIds(spuAttrValueList, attrValueIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByAttrId(Long attrId) { + List attrValueIds = attrValueMapper.getAttrValueIdsByAttrId(attrId); + attrValueMapper.deleteByAttrId(attrId); + attrValueLangService.deleteByAttrValueIds(attrValueIds); + AttrVO attrVO = attrMapper.getByAttrId(attrId); + if (Objects.isNull(attrVO)) { + throw new LuckException("属性不存在或已删除"); + } + // 清除商品属性关联数据 + if (Objects.equals(attrVO.getAttrType(), AttrType.BASIC.value())) { + spuAttrValueService.deleteUnionDataByAttId(attrId, attrValueIds); + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/BrandLangServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/BrandLangServiceImpl.java new file mode 100644 index 0000000..6dfd56e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/BrandLangServiceImpl.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.product.mapper.BrandLangMapper; +import com.tmerclub.cloud.product.model.BrandLang; +import com.tmerclub.cloud.product.service.BrandLangService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 品牌-国际化表 + * + * @author YXF + * @date 2021-04-26 15:17:37 + */ +@Service +public class BrandLangServiceImpl implements BrandLangService { + + @Autowired + private BrandLangMapper brandLangMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> brandLangMapper.list()); + } + + @Override + public BrandLang getByBrandId(Long brandId) { + return brandLangMapper.getByBrandId(brandId); + } + + @Override + public void save(List brandLangList, Long brandId) { + if (CollUtil.isEmpty(brandLangList)) { + return; + } + saveOrUpdate(brandLangList, brandId, null); + } + + @Override + public void update(List brandLangList, Long brandId) { + List langIds = brandLangMapper.langIdsByBrandId(brandId); + saveOrUpdate(brandLangList, brandId, langIds); + } + + /** + * 处理品牌语言列表的保存或更新信息 + * @param brandLangList 语言信息列表 + * @param brandId 品牌id + * @param langIds 语言id列表 + */ + private void saveOrUpdate(List brandLangList, Long brandId, List langIds) { + // 没有默认语言-数据异常 + long count = brandLangList.stream().filter(brandLang -> Objects.equals(brandLang.getLang(), Constant.DEFAULT_LANG)).count(); + if (count == 0) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + // 空指针处理 + if (Objects.isNull(langIds)) { + langIds = new ArrayList<>(0); + } + List saveList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Iterator iterator = brandLangList.iterator(); + while (iterator.hasNext()) { + BrandLang brandLang = iterator.next(); + if (Objects.equals(brandLang.getLang(), Constant.DEFAULT_LANG)) { + if (StrUtil.isBlank(brandLang.getName())) { + throw new LuckException("品牌中文名称不能为为空"); + } + } + brandLang.setBrandId(brandId); + // 删除-名称与描述都为空 + if (StrUtil.isBlank(brandLang.getName()) && StrUtil.isBlank(brandLang.getDesc())) { + iterator.remove(); + continue; + } + // 修改-已有语言信息,但品牌名称未null + else if (langIds.contains(brandLang.getLang())) { + langIds.remove(brandLang.getLang()); + continue; + } + // 新增-不存在语言信息 + saveList.add(brandLang); + } + if (CollUtil.isNotEmpty(brandLangList)) { + brandLangMapper.batchUpdate(brandLangList); + } + if (CollUtil.isNotEmpty(saveList)) { + brandLangMapper.batchSave(saveList); + } + if (CollUtil.isNotEmpty(langIds)) { + brandLangMapper.batchDelete(langIds, brandId); + } + } + + @Override + public void deleteById(Long brandId) { + brandLangMapper.deleteById(brandId); + } + + @Override + public List listByBrandNames(Set brandNames, Long shopId) { + return brandLangMapper.listByBrandNames(brandNames, shopId); + } + + @Override + public List listByBrandNamesCnOrEn(String cn, String en) { + return brandLangMapper.selectByBrandNamesCnOrEn(cn, en); + } + + @Override + public List listByBrandNamesCnOrEnAndBrandId(String cn, String en, Long brandId) { + return brandLangMapper.selectByBrandNamesCnOrEnAndBrandId(cn, en, brandId); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/BrandShopServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/BrandShopServiceImpl.java new file mode 100644 index 0000000..7502cda --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/BrandShopServiceImpl.java @@ -0,0 +1,282 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.product.dto.BrandShopDTO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.product.constant.BrandType; +import com.tmerclub.cloud.common.product.vo.BrandVO; +import com.tmerclub.cloud.product.dto.BrandDTO; +import com.tmerclub.cloud.product.dto.BrandSigningDTO; +import com.tmerclub.cloud.product.mapper.BrandLangMapper; +import com.tmerclub.cloud.product.mapper.BrandMapper; +import com.tmerclub.cloud.product.mapper.BrandShopMapper; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.model.BrandLang; +import com.tmerclub.cloud.product.model.BrandShop; +import com.tmerclub.cloud.product.model.CategoryBrand; +import com.tmerclub.cloud.product.service.BrandShopService; +import com.tmerclub.cloud.product.service.CategoryBrandService; +import com.tmerclub.cloud.product.vo.BrandShopVO; +import com.tmerclub.cloud.product.vo.BrandSigningVO; +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 java.util.*; +import java.util.stream.Collectors; + +/** + * 品牌店铺关联信息 + * + * @author FrozenWatermelon + * @date 2021-04-30 13:21:10 + */ +@Service +public class BrandShopServiceImpl implements BrandShopService { + + @Autowired + private BrandShopMapper brandShopMapper; + + @Autowired + private BrandMapper brandMapper; + + @Autowired + private BrandLangMapper brandLangMapper; + @Autowired + private CategoryBrandService categoryBrandService; + @Autowired + private SpuMapper spuMapper; + + private static final Logger log = LoggerFactory.getLogger(BrandShopServiceImpl.class); + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> brandShopMapper.list()); + } + + @Override + public BrandShop getByBrandShopId(Long brandShopId) { + return brandShopMapper.getByBrandShopId(brandShopId); + } + + @Override + public void save(BrandShop brandShop) { + brandShopMapper.save(brandShop); + } + + @Override + public void update(BrandShop brandShop) { + brandShopMapper.update(brandShop); + } + + @Override + public void deleteById(Long brandShopId) { + brandShopMapper.deleteById(brandShopId); + } + + @Override + public BrandSigningVO listSigningByShopId(Long shopId, Integer sysType) { + // 查询平台品牌签约列表 + List platformBrandList = brandShopMapper.listByShopIdAndType(shopId, BrandType.PLATFORM.value(), I18nMessage.getLang(), sysType); + // 查询店铺自定义品牌签约列表 + List customizeBrandList = brandShopMapper.listByShopIdAndType(shopId, BrandType.CUSTOMIZE.value(), I18nMessage.getLang(), sysType); + categoryBrandService.loadCategoryToBrandSigningVO(platformBrandList); + categoryBrandService.loadCategoryToBrandSigningVO(customizeBrandList); + BrandSigningVO brandSigningVO = new BrandSigningVO(); + brandSigningVO.setCustomizeBrandList(customizeBrandList); + brandSigningVO.setPlatformBrandList(platformBrandList); + return brandSigningVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void signingBrands(BrandSigningDTO brandSigningDTO, Long shopId, Integer sysType) { + if (Objects.equals(Constant.PLATFORM_SHOP_ID, shopId)) { + // 防止误删平台品牌 + return; + } + List platformBrandList = brandSigningDTO.getPlatformBrandList(); + List customizeBrandList = brandSigningDTO.getCustomizeBrandList(); + if (platformBrandList.size() + customizeBrandList.size() > Constant.SIGNING_BRAND_LIMIT_NUM) { + throw new LuckException("签约的品牌数量不能超过" + Constant.SIGNING_BRAND_LIMIT_NUM); + } + // 删除已签约的信息 + brandShopMapper.deleteBatchByShopId(shopId, sysType); + // 处理签约的平台品牌 + if (Objects.nonNull(brandSigningDTO.getPlatformBrandList()) && brandSigningDTO.getPlatformBrandList().size() != 0) { + List brandVOList = brandMapper.listByIds(platformBrandList.stream().map(BrandShopDTO::getBrandId).collect(Collectors.toList())); + if (brandVOList.size() != platformBrandList.size()) { + throw new LuckException("平台品牌签约信息错误"); + } + // 插入品牌签约关联信息 + brandShopMapper.insertBatch(shopId, platformBrandList, BrandType.PLATFORM.value(), sysType); + } + // 处理新增的自定义品牌 + // 查询之前新增的自定义品牌列表 + List oldBrandVOList = brandMapper.listByShopId(shopId, sysType); + if (oldBrandVOList.size() != 0) { + // 删除店铺自定义的品牌信息 + brandMapper.deleteBatchByShopId(shopId, sysType); + brandLangMapper.deleteBatchByBrandIds(oldBrandVOList.stream().map(BrandVO::getBrandId).collect(Collectors.toList())); + } + if (Objects.nonNull(brandSigningDTO.getCustomizeBrandList()) && brandSigningDTO.getCustomizeBrandList().size() != 0) { + // 重新新增店铺自定义的品牌信息列表 + + customizeBrandList.forEach(item -> { + List brandLangList = brandLangMapper.selectByBrandNamesCnOrEn(item.getName(), item.getName()); + //判断品牌名称是否重复 + if (!brandLangList.isEmpty()) { + log.info("品牌名重复了"); + throw new LuckException("品牌名不能重复"); + } + item.setShopId(shopId); + item.setSysType(sysType); + item.setBrandId(null); + item.setIsTop(0); + item.setSeq(0); + item.setStatus(StatusEnum.WAIT_AUDIT.value()); + }); + brandMapper.insertBatchByBrandShopList(customizeBrandList); + brandLangMapper.insertBatch(customizeBrandList, LanguageEnum.LANGUAGE_ZH_CN.getLang()); + brandLangMapper.insertBatch(customizeBrandList, LanguageEnum.LANGUAGE_EN.getLang()); + brandShopMapper.insertBatch(shopId, customizeBrandList, BrandType.CUSTOMIZE.value(), sysType); + batchCategoryBrand(customizeBrandList); + } + } + + @Override + public void updateTypeByShopId(Long shopId, Integer type, Integer sysType) { + brandShopMapper.updateTypeByShopId(shopId, type, sysType); + } + + @Override + public void deleteByBrandId(Long brandId) { + brandShopMapper.deleteByBrandId(brandId); + } + + @Override + public void insertBatchByShopId(List brandShopDTOList, Long shopId, Integer sysType) { + if (CollUtil.isEmpty(brandShopDTOList)) { + return; + } + int signedCount = brandShopMapper.countByShopIdAndBrandId(shopId, null, sysType); + if (signedCount + brandShopDTOList.size() > Constant.SIGNING_BRAND_LIMIT_NUM) { + throw new LuckException("签约的品牌数量不能超过" + Constant.SIGNING_BRAND_LIMIT_NUM); + } + brandShopMapper.insertBatch(shopId, brandShopDTOList, BrandType.PLATFORM.value(), sysType); + } + + @Override + public int countByShopIdAndBrandId(Long shopId, Long brandId, Integer sysType) { + return brandShopMapper.countByShopIdAndBrandId(shopId, brandId, sysType); + } + + private void batchCategoryBrand(List customizeBrandList) { + List categoryBrands = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (BrandShopDTO brandShopDTO : customizeBrandList) { + CategoryBrand categoryBrand = new CategoryBrand(); + categoryBrand.setBrandId(brandShopDTO.getBrandId()); + categoryBrand.setCategoryId(brandShopDTO.getCategoryId()); + categoryBrands.add(categoryBrand); + } + categoryBrandService.saveBatch(categoryBrands); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteSigningBrand(Long brandShopId) { + BrandShop brandShop = brandShopMapper.getByBrandShopId(brandShopId); + if (Objects.isNull(brandShop)) { + throw new LuckException("找不到当前签约品牌,请刷新后重试"); + } + Long brandId = brandShop.getBrandId(); + Long shopId = brandShop.getShopId(); + Integer sysType = brandShop.getSysType(); + spuMapper.updateSpuByBrandIdAndShopId(Collections.singletonList(brandId), shopId, sysType); + brandMapper.batchUpdateSpuCount(Collections.singletonList(brandId)); + brandShopMapper.deleteById(brandShopId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addSigningBrand(BrandSigningDTO brandSigningDTO, Long shopId, Integer sysType) { + List platformBrandList = brandSigningDTO.getPlatformBrandList(); + List customizeBrandList = brandSigningDTO.getCustomizeBrandList(); + + Map applySigningBrandMap = platformBrandList.stream().collect(Collectors.toMap(BrandShopDTO::getBrandId, brandShopDTO -> brandShopDTO)); + + List signedBrandIdList = brandShopMapper.listBrandIdByShopId(shopId, sysType); + signedBrandIdList.forEach(applySigningBrandMap::remove); + // 查询已有的平台品牌 + BrandDTO brandDTO = new BrandDTO(); + brandDTO.setShopId(Constant.PLATFORM_SHOP_ID); + brandDTO.setStatus(StatusEnum.ENABLE.value()); + List brandVOList = brandMapper.listByParams(brandDTO); + Set platformBrandSet = brandVOList.stream().map(BrandVO::getBrandId).collect(Collectors.toSet()); + // 删除新增品牌中所含有的但平台不存在的品牌 + for (Map.Entry brandShopEntry : applySigningBrandMap.entrySet()) { + Long brandId = brandShopEntry.getKey(); + if (!platformBrandSet.contains(brandId)) { + applySigningBrandMap.remove(brandId); + } + } + platformBrandList = new ArrayList<>(applySigningBrandMap.values()); + if (platformBrandList.size() + customizeBrandList.size() > Constant.SIGNING_BRAND_LIMIT_NUM) { + throw new LuckException("签约的品牌数量不能超过" + Constant.SIGNING_BRAND_LIMIT_NUM); + } + + // 插入品牌签约关联信息 + if (CollUtil.isNotEmpty(platformBrandList)) { + brandShopMapper.insertBatch(shopId, platformBrandList, BrandType.PLATFORM.value(), sysType); + } + + // 处理新增的自定义品牌 + // todo 处理方式暂不明确(1、直接把店铺自定义品牌转成平台品牌 2、审核通过后再进行转换) + if (CollUtil.isEmpty(customizeBrandList)) { + return; + } + // 查询之前新增的自定义品牌列表 + List oldBrandVOList = brandMapper.listByShopId(shopId, sysType); + if (CollUtil.isNotEmpty(oldBrandVOList)) { + // 删除店铺自定义的品牌信息 + List brandIdList = oldBrandVOList.stream().map(BrandVO::getBrandId).collect(Collectors.toList()); + brandMapper.deleteBatchByShopId(shopId, sysType); + brandLangMapper.deleteBatchByBrandIds(brandIdList); + categoryBrandService.deleteByBrandIdList(brandIdList); + } + if (CollUtil.isNotEmpty(customizeBrandList)) { + // 重新新增店铺自定义的品牌信息列表 + customizeBrandList.forEach(item -> { + item.setShopId(shopId); + item.setSysType(sysType); + item.setBrandId(null); + item.setIsTop(0); + item.setSeq(0); + item.setStatus(StatusEnum.ENABLE.value()); + }); + brandMapper.insertBatchByBrandShopList(customizeBrandList); + brandLangMapper.insertBatch(customizeBrandList, LanguageEnum.LANGUAGE_ZH_CN.getLang()); + brandLangMapper.insertBatch(customizeBrandList, LanguageEnum.LANGUAGE_EN.getLang()); + brandShopMapper.insertBatch(shopId, customizeBrandList, BrandType.CUSTOMIZE.value(), sysType); + batchCategoryBrand(customizeBrandList); + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/CategoryBrandServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/CategoryBrandServiceImpl.java new file mode 100644 index 0000000..dc56523 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/CategoryBrandServiceImpl.java @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.vo.BrandVO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.product.vo.ParentCategoryVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.mapper.CategoryBrandMapper; +import com.tmerclub.cloud.product.mapper.CategoryMapper; +import com.tmerclub.cloud.product.model.CategoryBrand; +import com.tmerclub.cloud.product.service.CategoryBrandService; +import com.tmerclub.cloud.product.vo.BrandShopVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 品牌分类关联信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@Service +public class CategoryBrandServiceImpl implements CategoryBrandService { + + @Autowired + private CategoryBrandMapper categoryBrandMapper; + + @Autowired + private CategoryMapper categoryMapper; + + + @Override + public void deleteByBrandIdList(List brandIdList) { + categoryBrandMapper.deleteByBrandId(brandIdList); + } + + @Override + public void saveByCategoryIds(Long brandId, List categoryIds) { + List categoryBrandList = new ArrayList<>(Constant.INITIAL_CAPACITY); + categoryIds.forEach(categoryId -> { + CategoryBrand categoryBrand = new CategoryBrand(); + categoryBrand.setBrandId(brandId); + categoryBrand.setCategoryId(categoryId); + categoryBrandList.add(categoryBrand); + }); + categoryBrandMapper.saveBatch(categoryBrandList); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateByCategoryIds(Long brandId, List categoryIds) { + List categoryIdDb = getCategoryIdBrandId(brandId); + // 删除分类或者没有绑定分类 + if (CollUtil.isEmpty(categoryIds)) { + if (CollUtil.isNotEmpty(categoryIdDb)) { + categoryBrandMapper.deleteByBrandIdAndCategoryIds(brandId, categoryIdDb); + } + return; + } + // 新增绑定分类或者更新 + List addList = new ArrayList<>(Constant.INITIAL_CAPACITY); + categoryIds.forEach(categoryId -> { + if (!categoryIdDb.contains(categoryId)) { + addList.add(categoryId); + } + }); + if (CollUtil.isNotEmpty(addList)) { + saveByCategoryIds(brandId, addList); + } + categoryIdDb.removeAll(categoryIds); + if (CollUtil.isNotEmpty(categoryIdDb)) { + categoryBrandMapper.deleteByBrandIdAndCategoryIds(brandId, categoryIdDb); + } + } + + @Override + public List getCategoryIdBrandId(Long brandId) { + return categoryBrandMapper.getCategoryIdsByBrandId(brandId); + } + + @Override + public List getCategoryByBrandId(Long brandId) { + List categoryVO = categoryBrandMapper.getCategoryByBrandId(brandId, I18nMessage.getLang()); + ProductLangUtil.categoryList(categoryVO); + return categoryVO; + } + + @Override + public int countByBrandIdAndCategoryId(Long brandId, Long categoryId) { + return categoryBrandMapper.countByBrandIdAndCategoryId(brandId, categoryId); + } + + @Override + public void loadCategoryToBrandVO(List brandList) { + if (CollUtil.isEmpty(brandList)) { + return; + } + + Set categoryIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (BrandVO brandVO : brandList) { + if (CollUtil.isNotEmpty(brandVO.getCategoryIds())) { + categoryIds.addAll(brandVO.getCategoryIds()); + } + } + + Map categoryMap = getCategoryAndParentMap(categoryIds); + for (BrandVO brandVO : brandList) { + brandVO.setCategories(loadBrandCategoryList(brandVO.getCategoryIds(), categoryMap)); + brandVO.setCategoryIds(null); + } + } + + @Override + public void loadCategoryToBrandSigningVO(List brandList) { + if (CollUtil.isEmpty(brandList)) { + return; + } + + Set categoryIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (BrandShopVO brandVO : brandList) { + if (CollUtil.isNotEmpty(brandVO.getCategoryIds())) { + categoryIds.addAll(brandVO.getCategoryIds()); + } + } + + Map categoryMap = getCategoryAndParentMap(categoryIds); + for (BrandShopVO brandVO : brandList) { + brandVO.setCategories(loadBrandCategoryList(brandVO.getCategoryIds(), categoryMap)); + brandVO.setCategoryIds(null); + } + } + + private Map getCategoryAndParentMap(Set categoryIds) { + Map categoryMap = new HashMap<>(Constant.INITIAL_CAPACITY); + List categoryVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isNotEmpty(categoryIds)) { + categoryVOList = categoryMapper.listCategoryAndParentInfo(categoryIds); + } + if (CollUtil.isEmpty(categoryVOList)) { + return categoryMap; + } + ProductLangUtil.categoryList(categoryVOList); + categoryMap = categoryVOList.stream().collect(Collectors.toMap(CategoryVO::getCategoryId, c -> c)); + return categoryMap; + } + + @Override + public void saveBatch(List categoryBrands) { + if (CollUtil.isEmpty(categoryBrands)) { + return; + } + categoryBrandMapper.saveBatch(categoryBrands); + } + + private List loadBrandCategoryList(List categoryIds, Map categoryMap) { + if (CollUtil.isEmpty(categoryIds)) { + return null; + } + List categoryList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long categoryId : categoryIds) { + if (!categoryMap.containsKey(categoryId)) { + continue; + } + CategoryVO category = categoryMap.get(categoryId); + category.setCategories(new ArrayList<>(0)); + String[] parentIds = category.getPath().split(Constant.CATEGORY_INTERVAL); + if (ArrayUtil.isEmpty(parentIds)) { + continue; + } + for (String parentId : parentIds) { + Long parentCategoryId = Long.valueOf(parentId); + if (!categoryMap.containsKey(parentCategoryId)) { + continue; + } + CategoryVO parentCategory = categoryMap.get(parentCategoryId); + category.getCategories().add(BeanUtil.map(parentCategory, ParentCategoryVO.class)); + } + categoryList.add(category); + } + return categoryList; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ImportSupplierSpuServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ImportSupplierSpuServiceImpl.java new file mode 100644 index 0000000..ef82247 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ImportSupplierSpuServiceImpl.java @@ -0,0 +1,311 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.product.feign.WarehouseFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopSubstituteSalesFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.product.constant.*; +import com.tmerclub.cloud.common.product.dto.*; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuAttrValueVO; +import com.tmerclub.cloud.common.product.vo.SpuDetailVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.product.constant.DistributedIdKey; +import com.tmerclub.cloud.product.mapper.BrandMapper; +import com.tmerclub.cloud.product.mapper.SkuMapper; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.model.*; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.model.*; +import com.tmerclub.cloud.product.service.*; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author xxw + * @date 2022/8/2 14:09 + */ +@Lazy +@Service +public class ImportSupplierSpuServiceImpl implements ImportSupplierSpuService { + @Autowired + private SpuMapper spuMapper; + @Autowired + private SpuAttrValueService spuAttrValueService; + @Autowired + private SpuExtensionService spuExtensionService; + @Autowired + private SkuMapper skuMapper; + @Autowired + private BrandMapper brandMapper; + @Autowired + private SkuService skuService; + @Autowired + private SpuLangService spuLangService; + @Autowired + private SpuDetailService spuDetailService; + @Autowired + private SpuConsignmentChangeService spuConsignmentChangeService; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private ShopSubstituteSalesFeignClient shopSubstituteSalesFeignClient; + @Autowired + private WarehouseFeignClient warehouseFeignClient; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long importSpu(Long supplierSpuId, Long shopId, Integer sysType, Long userId, Boolean isPurchaseOrder) { + if (Objects.isNull(supplierSpuId)) { + shopId = AuthUserContext.get().getTenantId(); + } + //查看是否已导入 + SpuVO commissionSup = spuMapper.getSpuByShopIdAndSupplierSpuId(shopId, supplierSpuId); + if (!Objects.isNull(commissionSup)) { + return commissionSup.getSpuId(); + } + //查找供应商spu信息 + SpuVO spuVo = spuMapper.getBySpuId(supplierSpuId); + SpuDTO spuDTO = BeanUtil.map(spuVo, SpuDTO.class); + //商品状态默认为下架 + spuDTO.setStatus(SpuStatus.OFF_SHELF.value()); + //供应商商品类型:商家代销 + spuDTO.setSupplierSpuType(SupplierSpuType.CONSIGNMENT.value()); + //发货方式:供应商发货 + if (Objects.equals(spuVo.getStatus(), StatusEnum.DISABLE.value())) { + spuDTO.setSupplierDeliveryType(SupplierDeliveryType.SHOP_DELIVERY.value()); + } else { + spuDTO.setSupplierDeliveryType(SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + } + // 如果是采购订单时导入商品发货方式需要变成商家发货 + if (isPurchaseOrder) { + spuDTO.setSupplierDeliveryType(SupplierDeliveryType.SHOP_DELIVERY.value()); + } + //关联商品商品id + spuDTO.setSupplierSpuId(spuVo.getSpuId()); + //代销商品规格选择状态:全选 + spuDTO.setSkuChoiceStatus(SkuChoiceStatus.ALL_CHOICE.value()); + //供应商id + spuDTO.setSupplierId(spuVo.getSupplierId()); + spuDTO.setShopId(shopId); + //代销商品无需模板id + spuDTO.setDeliveryTemplateId(null); + //获取商家代销设置 + ServerResponseEntity salesType = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(shopId); + ShopSubstituteSalesVO shopSubstituteSalesVO = salesType.getData(); + if (Objects.isNull(shopSubstituteSalesVO)) { + // 保存店铺代销设置默认值 + shopSubstituteSalesFeignClient.saveDefault(shopId); + shopSubstituteSalesVO = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(shopId).getData(); + } + spuDTO.setPriceFee(computeSpuPrice(spuDTO, shopSubstituteSalesVO)); + spuDTO.setScoreFee(Objects.isNull(spuDTO.getScoreFee()) ? Constant.ZERO_LONG : spuDTO.getScoreFee()); + //保存商品信息 + Spu spu = BeanUtil.map(spuDTO, Spu.class); + spu.setSpuId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SPU)); + spuMapper.save(spu); + //保存 商家代销商品基本信息相对于供应商品是否改变 + SpuConsignmentChange spuConsignmentChange = new SpuConsignmentChange(); + spuConsignmentChange.setSpuId(spu.getSpuId()); + spuConsignmentChangeService.save(spuConsignmentChange); + //查询供应商商品属性 + List spuAttrs = spuAttrValueService.getSpuAttrsBySpuId(supplierSpuId); + List spuAttrValueList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuAttrValueVO spuAttr : spuAttrs) { + SpuAttrValueDTO spuAttrValueDTO = new SpuAttrValueDTO(); + spuAttr.setSpuId(spu.getSpuId()); + spuAttrValueDTO.setAttrId(spuAttr.getAttrId()); + spuAttrValueDTO.setAttrName(spuAttr.getSpuAttrValueLangList().get(0).getAttrName()); + spuAttrValueDTO.setAttrValueName(spuAttr.getSpuAttrValueLangList().get(0).getAttrValueName()); + if (!Objects.isNull(spuAttr.getAttrValueId())) { + spuAttrValueDTO.setAttrValueId(spuAttr.getAttrValueId()); + } + spuAttrValueList.add(spuAttrValueDTO); + } + // 2.保存商品属性信息 + spuAttrValueService.save(spu.getSpuId(), spu.getCategoryId(), spuAttrValueList, sysType); + // 3.国际化信息、商品详情 + spuDTO.setSpuId(spu.getSpuId()); + loadSpuLangInfo(spuDTO); + //保存商品扩展信息 + SpuExtension spuExtension = new SpuExtension(); + spuExtension.setSpuId(spu.getSpuId()); + spuExtensionService.save(spuExtension); + //sku信息 + List skuVOList = skuMapper.listSkuWithAttrBySpuId(supplierSpuId); + List skuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 目前只有一个中文,后面国际化就要重新改造了 + String spuName = spuDTO.getSpuLangList().get(0).getSpuName(); + for (SkuVO skuVO : skuVOList) { + skuVO.setPriceFee(computeSkuPrice(skuVO, shopSubstituteSalesVO)); + SkuDTO skuDTO = BeanUtil.map(skuVO, SkuDTO.class); + skuDTO.setSupplierSkuId(skuDTO.getSkuId()); + skuDTO.setSpuId(null); + skuDTO.setStock(0); + skuDTO.setSpuName(spuName); + skuDTO.setSpuMainImgUrl(spu.getMainImgUrl()); + if (Objects.isNull(skuDTO.getStockPointList())) { + skuDTO.setStockPointList(new ArrayList<>()); + } + // 添加一条总库存数据 + Long warehouseId = warehouseFeignClient.getDefaultIdByShopId(shopId, sysType).getData(); + StockPointSkuDTO stockPointSkuDTO = new StockPointSkuDTO(warehouseId, StockPointType.WAREHOUSE.getValue(), null, skuDTO.getSkuId(), skuDTO.getStatus(), 0, null); + stockPointSkuDTO.setStock(0); + skuDTO.setStockPointList(Collections.singletonList(stockPointSkuDTO)); + skuList.add(skuDTO); + } + // 更新品牌信息 + brandMapper.batchUpdateSpuCount(Collections.singleton(spu.getBrandId())); + //保存sku信息 + skuService.saveSkuAndStock(spuDTO.getSpuMold(),spuDTO.getSpuId(), spuDTO.getStatus(), skuList, sysType, userId, shopId); + return spu.getSpuId(); + } + + private void loadSpuLangInfo(SpuDTO spuDTO) { + List spuDetailList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List spuLangList = new ArrayList<>(Constant.INITIAL_CAPACITY); + boolean dataCorrect = false; + for (SpuLangDTO spuLangDTO : spuDTO.getSpuLangList()) { + SpuLang spuLang = BeanUtil.map(spuLangDTO, SpuLang.class); + spuLang.setSpuId(spuDTO.getSpuId()); + boolean isBlank = StrUtil.isBlank(spuLang.getSpuName()) && StrUtil.isBlank(spuLang.getSellingPoint()); + if (!isBlank) { + spuLangList.add(spuLang); + } + List detailList = spuDTO.getDetailList(); + if (CollUtil.isNotEmpty(detailList)) { + spuDetailList = detailList.stream().map(spuDetailVO -> { + SpuDetail detail = new SpuDetail(); + detail.setSpuId(spuDTO.getSpuId()); + detail.setDetail(spuDetailVO.getDetail()); + detail.setLang(spuDetailVO.getLang()); + return detail; + }).collect(Collectors.toList()); + } else { + if (StrUtil.isNotBlank(spuLangDTO.getDetail())) { + SpuDetail spuDetail = new SpuDetail(); + spuDetail.setSpuId(spuDTO.getSpuId()); + spuDetail.setLang(spuLangDTO.getLang()); + spuDetail.setDetail(spuLangDTO.getDetail()); + spuDetailList.add(spuDetail); + } + } + if (!isBlank && Objects.equals(spuLang.getLang(), Constant.DEFAULT_LANG)) { + dataCorrect = true; + } + + } + + // 商品名称、卖点,商品详情,是否包含默认语言信息 + if (CollUtil.isEmpty(spuLangList) || !dataCorrect) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + if (spuDetailList.size() != 0) { + spuDetailService.batchSave(spuDetailList); + } + if (spuLangList.size() != 0) { + spuLangService.batchSave(spuLangList); + } + } + + /** + * 根据代销设置计算代销商品Spu售价 + * + * @param spuDTO + * @param shopSubstituteSalesVO + * @return + */ + private Long computeSpuPrice(SpuDTO spuDTO, ShopSubstituteSalesVO shopSubstituteSalesVO) { + Long spuPriceFee = 0L; + + if (Objects.equals(shopSubstituteSalesVO.getSalesType(), SalesType.SMART_PRICE.value())) { + //智能设价计算售价 + if (Objects.equals(shopSubstituteSalesVO.getSalesPriceType(), SalesPriceType.PROPORTION_PRICE.value())) { + //按比例加价 + spuPriceFee = PriceUtil.divideByBankerRounding(spuDTO.getPriceFee() * shopSubstituteSalesVO.getSalesPrice(), 10000) + spuDTO.getPriceFee(); + } + if (Objects.equals(shopSubstituteSalesVO.getSalesPriceType(), SalesPriceType.FIXED_NUMBER_PRICE.value())) { + //按固定数值加价 + spuPriceFee = spuDTO.getPriceFee() + shopSubstituteSalesVO.getSalesPrice(); + } + } + if (Objects.equals(shopSubstituteSalesVO.getSalesType(), SalesType.MANUAL_OPERATION_PRICE.value())) { + //手动设价 + spuPriceFee = spuDTO.getPriceFee(); + } + return spuPriceFee; + } + + /** + * 根据代销设置计算代销商品sku售价 + * + * @param skuVO + * @param shopSubstituteSalesVO + * @return + */ + private Long computeSkuPrice(SkuVO skuVO, ShopSubstituteSalesVO shopSubstituteSalesVO) { + Long skuPriceFee = 0L; + if (Objects.equals(shopSubstituteSalesVO.getSalesType(), SalesType.SMART_PRICE.value())) { + //智能设价计算售价 + if (Objects.equals(shopSubstituteSalesVO.getSalesPriceType(), SalesPriceType.PROPORTION_PRICE.value())) { + //按比例加价 + skuPriceFee = priceRound(skuVO, shopSubstituteSalesVO); + } + if (Objects.equals(shopSubstituteSalesVO.getSalesPriceType(), SalesPriceType.FIXED_NUMBER_PRICE.value())) { + //按固定数值加价 + skuPriceFee = skuVO.getPriceFee() + shopSubstituteSalesVO.getSalesPrice(); + } + } + + if (Objects.equals(shopSubstituteSalesVO.getSalesType(), SalesType.MANUAL_OPERATION_PRICE.value())) { + //手动设价 + skuPriceFee = skuVO.getPriceFee(); + } + return skuPriceFee; + } + + private Long priceRound(SkuVO skuVO, ShopSubstituteSalesVO shopSubstituteSalesVO) { + Long priceFee = skuVO.getPriceFee(); + double priceFeeD = Double.parseDouble(priceFee.toString()); + Long salesPrice = shopSubstituteSalesVO.getSalesPrice(); + double salesPriceD = Double.parseDouble(salesPrice.toString()); + double addPrice = (priceFeeD * salesPriceD) / 10000; + + BigDecimal bigDecimal = new BigDecimal(addPrice); + addPrice = bigDecimal.setScale(0, RoundingMode.HALF_UP).doubleValue(); + + return Double.valueOf(priceFee + addPrice).longValue(); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ShopCartServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ShopCartServiceImpl.java new file mode 100644 index 0000000..353c935 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ShopCartServiceImpl.java @@ -0,0 +1,352 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.delivery.feign.DeliveryFeignClient; +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.product.manager.ShopCartItemAdapter; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.CacheManagerUtil; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.order.util.OrderLangUtil; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuAndSkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.dto.shopcart.ChangeShopCartItemDTO; +import com.tmerclub.cloud.product.dto.shopcart.CheckShopCartItemDTO; +import com.tmerclub.cloud.product.mapper.ShopCartItemMapper; +import com.tmerclub.cloud.product.model.ShopCartItem; +import com.tmerclub.cloud.product.service.ShopCartItemService; +import com.tmerclub.cloud.product.service.ShopCartService; +import com.tmerclub.cloud.product.service.SkuComboService; +import com.tmerclub.cloud.product.service.SpuService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 购物车 + * + * @author FrozenWatermelon + * @date 2020-11-20 15:47:32 + */ +@Service +public class ShopCartServiceImpl implements ShopCartService { + + @Autowired + private ShopCartItemMapper shopCartItemMapper; + @Autowired + private ShopCartItemService shopCartItemService; + @Autowired + private CacheManagerUtil cacheManagerUtil; + @Autowired + private SpuService spuService; + @Autowired + private SkuComboService skuComboService; + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private SkuFeignClient skuFeignClient; + @DubboReference + private DeliveryFeignClient deliveryFeignClient; + private final Logger LOGGER = LoggerFactory.getLogger(ShopCartItemAdapter.class); + + @Override + @CacheEvict(cacheNames = CacheNames.SHOP_CART_ITEM_COUNT, key = "#userId") + public void deleteShopCartItemsByShopCartItemIds(Long userId, List shopCartItemIds) { + if (CollectionUtil.isEmpty(shopCartItemIds)) { + return; + } + shopCartItemMapper.deleteShopCartItemsByShopCartItemIds(userId, shopCartItemIds); + } + + @Override + @CacheEvict(cacheNames = CacheNames.SHOP_CART_ITEM_COUNT, key = "#userId") + public void addShopCartItem(Long userId, ChangeShopCartItemDTO param, Long priceFee, Long categoryId) { + ShopCartItem shopCartItem = new ShopCartItem(); + shopCartItem.setCount(param.getCount()); + shopCartItem.setSpuId(param.getSpuId()); + shopCartItem.setShopId(param.getShopId()); + shopCartItem.setUserId(userId); + shopCartItem.setSkuId(param.getSkuId()); + shopCartItem.setCategoryId(categoryId); + shopCartItem.setDistributionUserId(param.getDistributionUserId()); + shopCartItem.setDiscountId(0L); + shopCartItem.setIsChecked(1); + shopCartItem.setPriceFee(priceFee); + shopCartItem.setComboId(param.getComboId()); + shopCartItem.setComboCount(param.getComboCount()); + shopCartItem.setParentCartItemId(param.getParentCartItemId()); + shopCartItemMapper.save(shopCartItem); + } + + @Override + @CacheEvict(cacheNames = CacheNames.SHOP_CART_ITEM_COUNT, key = "#userId") + public void updateShopCartItem(Long userId, ShopCartItem shopCartItem) { + shopCartItemMapper.update(shopCartItem); + } + + @Override + @CacheEvict(cacheNames = CacheNames.SHOP_CART_ITEM_COUNT, key = "#userId") + public void deleteAllShopCartItems(Long userId) { + shopCartItemMapper.deleteAllShopCartItems(userId); + } + + @Override + public List getShopCartItems() { + Long userId = AuthUserContext.get().getUserId(); + List shopCartItems = shopCartItemMapper.getShopCartItems(userId, false, null, I18nMessage.getLang()); + for (ShopCartItemVO shopCartItem : shopCartItems) { + shopCartItem.setTotalAmount(shopCartItem.getCount() * shopCartItem.getSkuPriceFee()); + shopCartItem.setActualTotal(shopCartItem.getTotalAmount()); + shopCartItem.setShareReduce(0L); + OrderLangUtil.shopCartItemLang(shopCartItem); + shopCartItem.setSpuLangList(null); + shopCartItem.setSkuLangList(null); + // 判断下是否为供应商商品,如果是商家代销供应商商品且为供应商发货设置供应商信息 + if (!Objects.equals(shopCartItem.getSupplierId(), 0L) && Objects.equals(shopCartItem.getSupplierDeliveryType(), 1)) { + ServerResponseEntity spuAndSkuResponse = spuFeignClient.getSpuAndSkuAndRateById(shopCartItem.getSpuId(), shopCartItem.getSkuId(), true); + if (!spuAndSkuResponse.isSuccess()) { + throw new LuckException(spuAndSkuResponse.getMsg()); + } + SkuVO sku = spuAndSkuResponse.getData().getSku(); + SpuVO spu = spuAndSkuResponse.getData().getSpu(); + shopCartItem.setSupplierId(spu.getSupplierId()); + shopCartItem.setDeliveryTemplateId(spu.getDeliveryTemplateId()); + shopCartItem.setDeliveryAmount(spu.getDeliveryAmount()); + shopCartItem.setSupplierPriceFee(sku.getSupplyPriceFee()); + shopCartItem.setSpuName(spu.getName()); + } else { + shopCartItem.setSupplierId(0L); + } + //判断用户的默认地址是否在配送范围内 + SpuVO spuVo = spuFeignClient.getById(shopCartItem.getSpuId()).getData(); + if (Objects.equals(spuVo.getSpuType(), SpuType.ACTIVE.value()) || Objects.equals(shopCartItem.getMold(), 1) || Objects.equals(userId, null)) { + shopCartItem.setIsDelivery(true); + } else { + shopCartItem.setIsDelivery(deliveryFeignClient.checkAddr(shopCartItem.getDeliveryTemplateId(), userId, 0L).getData()); + } + // 判断一下是否为组合商品,是的话处理一下 + if(Objects.equals(shopCartItem.getMold(), SpuMold.COMBO.value())){ + List comboShopItems = skuComboService.getCombShopItemsAndBySkuIds(Collections.singletonList(shopCartItem.getSkuId())); + // 放入组合的所有商品信息 + Map> skuComboMap = comboShopItems.stream().collect(Collectors.groupingBy(ShopCartItemVO::getMainComboSkuId)); + List shopCartItemList = skuComboMap.get(shopCartItem.getSkuId()); + for (ShopCartItemVO shopCartItemVO : shopCartItemList) { + shopCartItemVO.setMainComboSpuId(shopCartItem.getSpuId()); + shopCartItemVO.setComboCount(shopCartItem.getCount()); + } + shopCartItemService.assembleShopCartItem(shopCartItemList, shopCartItem, null); + shopCartItem.setComboShopCartItems(comboShopItems); + } + } + // 赠品信息处理 + shopCartItemService.assembleShopCartItem(shopCartItems, null, null); + // 组装赠品信息 + shopCartItemService.buildItemGiveawayInfo(shopCartItems); + return shopCartItems; + } + + + + @Override + public List getShopCartExpiryItems() { + Long userId = AuthUserContext.get().getUserId(); + List shopCartItems = shopCartItemMapper.getShopCartItems(userId, true, null, I18nMessage.getLang()); + List itemVOList = shopCartItems.stream().filter(shopCartItemVO -> + Objects.equals(shopCartItemVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()) + ).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(itemVOList)) { + List supplierSpuIds = itemVOList.stream().map(ShopCartItemVO::getSupplierSpuId).collect(Collectors.toList()); + List supplierSpuVOList = spuService.listSpuBySpuIds(supplierSpuIds); + Map supplierSpuMap = supplierSpuVOList.stream().collect(Collectors.toMap(SpuVO::getSpuId, spuVO -> spuVO)); + for (ShopCartItemVO shopCartItemVO : shopCartItems) { + if (Objects.equals(shopCartItemVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + shopCartItemVO.setSpuName(supplierSpuMap.get(shopCartItemVO.getSupplierSpuId()).getName()); + } + } + } + + ProductLangUtil.shopCartItemList(shopCartItems); + for (ShopCartItemVO shopCartItem : shopCartItems) { + shopCartItem.setTotalAmount(shopCartItem.getCount() * shopCartItem.getSkuPriceFee()); + shopCartItem.setActualTotal(shopCartItem.getTotalAmount()); + } + return shopCartItems; + } + + @Override + @Cacheable(cacheNames = CacheNames.SHOP_CART_ITEM_COUNT, key = "#userId") + public Integer getShopCartItemCount(Long userId) { + return shopCartItemMapper.getShopCartItemCount(userId); + } + + @Override + public List getCheckedShopCartItems() { + Long userId = AuthUserContext.get().getUserId(); + return shopCartItemMapper.getShopCartItems(userId, false, true, I18nMessage.getLang()); + } + + @Override + public List getUserShopCartItems() { + Long userId = AuthUserContext.get().getUserId(); + return shopCartItemMapper.getUserShopCartItems(userId); + } + + @Override + public void removeShopCartItemCache(List spuIds) { + List userIds = shopCartItemMapper.listUserIdBySpuIds(spuIds); + if (CollectionUtil.isEmpty(userIds)) { + return; + } + for (String userId : userIds) { + cacheManagerUtil.evictCache(CacheNames.SHOP_CART_ITEM_COUNT, userId); + } + } + + @Override + public void removeShopCartItemCacheBySupplierSpuIds(List supplierSpuIds) { + if (CollUtil.isEmpty(supplierSpuIds)) { + return; + } + List userIds = shopCartItemMapper.listUserIdBySupplierSpuIds(supplierSpuIds); + if (CollectionUtil.isEmpty(userIds)) { + return; + } + for (String userId : userIds) { + cacheManagerUtil.evictCache(CacheNames.SHOP_CART_ITEM_COUNT, userId); + } + } + + @Override + public void checkShopCartItems(Long userId, List params) { + shopCartItemMapper.checkShopCartItems(userId, params); + } + + @Override + public void updateIsClosedByShopIds(List shopIds, Integer isClosed) { + if (shopIds == null || shopIds.size() == 0) { + return; + } + shopCartItemMapper.updateIsCloseByShopIds(shopIds, isClosed); + } + + @Override + public void updateShopCartItemBatch(Long userId, List shopCartItem) { + shopCartItemMapper.updateShopCartItemBatch(shopCartItem); + } + + @Override + public Long getCartItemBySpuIdAndComboId(Long spuId, Long comboId, Long userId, Long skuId) { + ShopCartItemVO cartItemBySpuIdAndComboId = shopCartItemMapper.getCartItemBySpuIdAndComboId(spuId, comboId, userId, skuId); + if (Objects.isNull(cartItemBySpuIdAndComboId)) { + return null; + } else { + return cartItemBySpuIdAndComboId.getCartItemId(); + } + } + + @Override + public void deleteCartByComboUpdate(List comboIdList, Long spuId, Long skuId) { + // 清除购物车商品数量缓存 + removeShopCartItemCacheByComboId(comboIdList); + shopCartItemMapper.deleteCartByComboUpdate(comboIdList, spuId, skuId); + } + + public void removeShopCartItemCacheByComboId(List comboId) { + List userIds = shopCartItemMapper.listUserIdByComboIds(comboId); + if (CollectionUtil.isEmpty(userIds)) { + return; + } + for (String userId : userIds) { + cacheManagerUtil.evictCache(CacheNames.SHOP_CART_ITEM_COUNT, userId); + } + } + + @Override + public void deleteCartByComboIdAndSpuIdS(Long comboId, List spuIdList) { + removeShopCartItemCache(spuIdList); + shopCartItemMapper.deleteCartByComboIdAndSpuIdS(comboId, spuIdList); + } + + @Override + public void deleteCartByComboIdAndSkuIdS(Long comboId, List skuIdList) { + removeShopCartItemCacheBySkuIds(skuIdList); + shopCartItemMapper.deleteCartByComboIdAndSkuIdS(comboId, skuIdList); + + } + + public void removeShopCartItemCacheBySkuIds(List skuIds) { + List userIds = shopCartItemMapper.listUserIdBySkuIds(skuIds); + if (CollectionUtil.isEmpty(userIds)) { + return; + } + for (String userId : userIds) { + cacheManagerUtil.evictCache(CacheNames.SHOP_CART_ITEM_COUNT, userId); + cacheManagerUtil.evictCache(CacheNames.SHOP_CART_ITEM_COUNT, userId); + RedisUtil.del(CacheNames.SHOP_CART_ITEM_COUNT + userId); + } + } + + + @Override + public void updateCartSpuPriceByComboIdAndSkuId(Long comboId, Long skuId, Long price) { + shopCartItemMapper.updateCartSpuPriceByComboIdAndSkuId(comboId, skuId, price); + } + + @Override + public List skuIdListByComboMainSkuId(List skuId) { + return shopCartItemMapper.skuIdListByComboMainSkuId(skuId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCartComboCount(Long comboId, Long spuId, Integer count) { + List shopCartItemVOList = shopCartItemMapper.listShopCartItemByComboIdAndSpuId(comboId, spuId); + if (shopCartItemVOList.size() == 0) { + return; + } + List shopCartItemList = new ArrayList<>(Constant.INITIAL_CAPACITY); + ShopCartItem shopCartItem; + for (ShopCartItemVO shopCartItemVO : shopCartItemVOList) { + shopCartItem = new ShopCartItem(); + shopCartItem.setCartItemId(shopCartItemVO.getCartItemId()); + shopCartItem.setCount(count * shopCartItemVO.getComboCount()); + shopCartItem.setUserId(shopCartItemVO.getUserId()); + shopCartItemList.add(shopCartItem); + // 移除用户购物车数量缓存 + cacheManagerUtil.evictCache(CacheNames.SHOP_CART_ITEM_COUNT, String.valueOf(shopCartItemVO.getUserId())); + } + shopCartItemMapper.updateShopCartItemBatch(shopCartItemList); + + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuComboServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuComboServiceImpl.java new file mode 100644 index 0000000..b557cde --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuComboServiceImpl.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.product.dto.SkuComboDTO; +import com.tmerclub.cloud.common.product.vo.SkuComboVO; +import com.tmerclub.cloud.product.mapper.SkuComboMapper; +import com.tmerclub.cloud.product.model.SkuCombo; +import com.tmerclub.cloud.product.service.SkuComboService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * + * + * @author lhd + * @date 2023-11-06 15:52:12 + */ +@Service +public class SkuComboServiceImpl implements SkuComboService { + + @Autowired + private SkuComboMapper skuComboMapper; + + @Override + public void saveBatch(List skuComboList) { + skuComboMapper.saveBatch(skuComboList); + } + + + @Override + public void deleteBySkuIds(List skuIds) { + skuComboMapper.deleteBySkuIds(skuIds); + } + + @Override + public List getCombSpusBySkuIds(List skuIds) { + return skuComboMapper.getCombSpusBySkuIds(skuIds, I18nMessage.getLang()); + } + + @Override + public List getCombSpusBySpuIds(List spuIds) { + return skuComboMapper.getCombSpusBySpuIds(spuIds); + } + + @Override + public List getCombShopItemsAndBySkuIds(List skuIds) { + return skuComboMapper.getCombShopItemsAndBySkuId(skuIds, I18nMessage.getLang()); + } + + @Override + public List getCombSpusByComboSpuIds(List spuIds,List skuIds) { + return skuComboMapper.getCombSpusByComboSpuIdsOrSkuIds(spuIds,skuIds); + } + + @Override + public void deleteByComboSpuIds(List spuIds) { + skuComboMapper.deleteByComboSpuIds(spuIds); + } + + @Override + public void deleteByComboSkuIds(List skuIds) { + skuComboMapper.deleteByComboSkuIds(skuIds); + } + + @Override + public Integer countDisableComboSpuBySpuId(Long spuId) { + return skuComboMapper.countDisableComboSpuBySpuId(spuId); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuServiceImpl.java new file mode 100644 index 0000000..f691353 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuServiceImpl.java @@ -0,0 +1,1609 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.multishop.feign.ShopSubstituteSalesFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopUserFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopUserVO; +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.api.product.dto.SupplierSpuUpdateDTO; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.api.supplier.feign.SupplierUserFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiUserVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.LuaOperateEnum; +import com.tmerclub.cloud.common.cache.constant.ProductCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.product.constant.*; +import com.tmerclub.cloud.common.product.dto.*; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.product.vo.app.SkuAppVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.AnalysisUtil; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.product.constant.DistributedIdKey; +import com.tmerclub.cloud.product.manager.StockManager; +import com.tmerclub.cloud.product.mapper.SkuMapper; +import com.tmerclub.cloud.product.mapper.SpuPriceLogMapper; +import com.tmerclub.cloud.product.mapper.StockPointSkuMapper; +import com.tmerclub.cloud.product.model.Sku; +import com.tmerclub.cloud.product.model.SkuLang; +import com.tmerclub.cloud.product.model.SpuPriceLog; +import com.tmerclub.cloud.product.model.SpuSupplierChangeLog; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.util.StockUtil; +import com.tmerclub.cloud.product.vo.SkuExcelVO; +import com.tmerclub.cloud.product.vo.SpuExcelVO; +import com.tmerclub.cloud.product.vo.SupplierSpuExcelVO; +import org.apache.commons.compress.utils.Lists; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.context.annotation.Lazy; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * sku信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@Service +public class SkuServiceImpl implements SkuService { + + @Autowired + private SkuMapper skuMapper; + @Autowired + private SpuSkuAttrValueService spuSkuAttrValueService; + @Autowired + private SkuStockService skuStockService; + @Autowired + private SkuLangService skuLangService; + @Autowired + private SkuComboService skuComboService; + @Autowired + private StockManager stockManager; + @Autowired + private SegmentManager segmentManager; + @Autowired + private SpuPriceLogMapper spuPriceLogMapper; + @Autowired + private RocketMQTemplate stockBillLogTemplate; + @Autowired + @Lazy + private SpuSupplierChangeLogService spuSupplierChangeLogService; + @DubboReference + private ShopSubstituteSalesFeignClient shopSubstituteSalesFeignClient; + @DubboReference + private ShopUserFeignClient shopUserFeignClient; + @Autowired + private StockPointSkuService stockPointSkuService; + @Autowired + private WarehouseService warehouseService; + @Autowired + private StockPointSkuMapper stockPointSkuMapper; + @DubboReference + private SupplierUserFeignClient supplierUserFeignClient; + + private final Logger logger = LoggerFactory.getLogger(SkuServiceImpl.class); + + + @Override + public List listSku(SkuDTO skuDTO) { + return skuMapper.listSku(skuDTO); + } + + @Override + public List save(Long spuId, Integer spuStatus, List skuList, Integer sysType, Long userId, Long shopId,Integer spuMold) { + batchSaveSku(spuId, skuList); + List skuDbList = skuMapper.getBySpuId(spuId); + List skuLangList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List skuComboList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List skuStocks = new ArrayList<>(Constant.INITIAL_CAPACITY); + List spuSkuAttrValues = new ArrayList<>(Constant.INITIAL_CAPACITY); + List stockPointS = new ArrayList<>(Constant.INITIAL_CAPACITY); + WarehouseVO warehouse = warehouseService.getDefaultWarehouseByShopId(shopId, sysType); + if(Objects.isNull(warehouse)) { + throw new LuckException("找不到该店铺的默认仓库"); + } + for (SkuDTO skuDTO : skuList) { + // 添加库存 + addStockPoint(spuMold, stockPointS, spuId, spuStatus, skuStocks, skuDTO, warehouse.getWarehouseId()); + if(Objects.equals(spuMold,SpuMold.COMBO.value())){ + addCombo(skuComboList, skuDTO); + } + if (CollUtil.isEmpty(skuDTO.getSpuSkuAttrValues())) { + continue; + } + addAttr(spuId, spuSkuAttrValues, skuDTO); + addLang(skuLangList, skuDTO); + } + skuLangService.batchSave(BeanUtil.mapAsList(skuLangList, SkuLang.class)); + spuSkuAttrValueService.save(spuSkuAttrValues, sysType); + stockPointSkuService.batchSave(stockPointS); + saveSupplierLog(skuList.size() > skuDbList.size(), spuId, SupplierSpuChangeType.ADD_SKU.value()); + for (SkuDTO skuDTO : skuList) { + skuDTO.setChangeStock(skuDTO.getStock()); + } +// List stockBillLogItemVOList = loadStockBillLogItems(spuId, skuList); +// StockBillLogVO stockBillLogVO = loadStockBillLog(StockType.WAREHOUSING.value(), StockBillType.INITIALIZE.value(), stockBillLogItemVOList, userId, shopId); +// //发送事件进行添加商品库存初始化记录 +// SendStatus sendStockStatus = stockBillLogTemplate.syncSend(RocketMqConstant.OUT_STOCK_LOG_TOPIC, new GenericMessage<>(stockBillLogVO)).getSendStatus(); + // 平台发布的积分商品,没有出入库详情 + if (shopId != Constant.PLATFORM_SHOP_ID) { + List stockBillLogItemDTOList = new ArrayList<>(); + stockBillLogItemDTOList.addAll(addBillLogList(StockBillType.INITIALIZE.value(), StockType.WAREHOUSING.value(), BeanUtil.mapAsList(stockPointS, StockPointSkuVO.class), BeanUtil.mapAsList(skuList, SkuVO.class), shopId, null)); + // 入库初始化库存 + SendStatus sendStockStatus = stockBillLogTemplate.syncSend(RocketMqConstant.STOCK_BILL_LOG_TOPIC, new GenericMessage<>(stockBillLogItemDTOList)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + // 保存修改一下组合商品关联 + if(CollectionUtil.isNotEmpty(skuComboList)){ + skuComboService.saveBatch(skuComboList); + } + return skuStocks; + } + + @Override + public void saveSkuAndStock(Integer spuMold, Long spuId, Integer spuStatus, List skuList, Integer sysType, Long userId, Long shopId) { + List skuStocks = this.save(spuId, spuStatus, skuList, sysType, userId, shopId,spuMold); + // 数据存储在redis中,所以最后再执行库存插入 + stockManager.skuStock(skuStocks, LuaOperateEnum.SKU_INSERT); + } + + private void saveSupplierLog(boolean skuList, Long spuId, Integer changeType) { + //供应商新增sku时,生成对应的变更记录 + if (skuList) { + SpuSupplierChangeLog spuSupplierChangeLog = new SpuSupplierChangeLog(); + spuSupplierChangeLog.setSpuId(spuId); + spuSupplierChangeLog.setChangeType(changeType); + spuSupplierChangeLogService.save(spuSupplierChangeLog); + } + } + + private static void addLang(List skuLangList, SkuDTO skuDTO) { + for (SkuLangDTO skuLangDTO : skuDTO.getSkuLangList()) { + skuLangDTO.setSkuId(skuDTO.getSkuId()); + skuLangList.add(skuLangDTO); + } + } + + private static void addCombo(List skuComboList, SkuDTO skuDTO) { + // 供应商商品代销时为空直接跳过 + if(CollUtil.isEmpty(skuDTO.getSkuComboList())){ + return; + } + for (SkuComboDTO skuComboDTO : skuDTO.getSkuComboList()) { + skuComboDTO.setSkuId(skuDTO.getSkuId()); + } + skuComboList.addAll(skuDTO.getSkuComboList()); + } + + private static void addAttr(Long spuId, List spuSkuAttrValues, SkuDTO skuDTO) { + for (SpuSkuAttrValueDTO spuSkuAttrValue : skuDTO.getSpuSkuAttrValues()) { + spuSkuAttrValue.setSpuId(spuId); + spuSkuAttrValue.setSkuId(skuDTO.getSkuId()); + spuSkuAttrValue.setStatus(StatusEnum.ENABLE.value()); + spuSkuAttrValues.add(spuSkuAttrValue); + } + } + + private static void addStockPoint(Integer spuMold, List stockPointS, Long spuId, Integer spuStatus, List skuStocks, SkuDTO skuDTO,Long defaultWarehouseId) { + Integer stockCount = 0; + Integer status = StatusEnum.DISABLE.value(); + if (Objects.equals(spuStatus, SpuStatus.PUT_SHELF.value()) && Objects.equals(skuDTO.getStatus(), StatusEnum.ENABLE.value())) { + status = StatusEnum.ENABLE.value(); + } + // 如果是组合商品,添加一条默认仓库库存为0的数据 + if(Objects.equals(spuMold,SpuMold.COMBO.value())){ + SkuStockVO skuStock = new SkuStockVO(skuDTO.getSkuId(), skuDTO.getStock(), defaultWarehouseId, StockPointType.WAREHOUSE.getValue()); + skuStock.setSpuId(spuId); + skuStock.setLockStock(0); + skuStock.setStatus(status); + skuStocks.add(skuStock); + }else { + for (StockPointSkuDTO stockPointSkuDTO : skuDTO.getStockPointList()) { + stockPointSkuDTO.setSkuId(skuDTO.getSkuId()); + stockPointSkuDTO.setStatus(skuDTO.getStatus()); + stockPointSkuDTO.setSpuId(spuId); + stockPointS.add(stockPointSkuDTO); + SkuStockVO skuStock = new SkuStockVO(stockPointSkuDTO.getSkuId(), stockPointSkuDTO.getStock(), stockPointSkuDTO.getStockPointId(), stockPointSkuDTO.getStockPointType()); + stockCount += stockPointSkuDTO.getStock(); + skuStock.setSpuId(spuId); + skuStock.setLockStock(0); + skuStock.setStatus(status); + skuStocks.add(skuStock); + } + } + } + + private void batchSaveSku(Long spuId, List skuList) { + skuList.forEach(sku -> { + sku.setSpuId(spuId); + if (Objects.isNull(sku.getStatus())) { + sku.setStatus(StatusEnum.ENABLE.value()); + } + if (StrUtil.isBlank(sku.getImgUrl())) { + sku.setImgUrl(null); + } + if (Objects.isNull(sku.getScoreFee())) { + sku.setScoreFee(Constant.ZERO_LONG); + } + if (Objects.isNull(sku.getStockWarning())) { + sku.setStockWarning(0L); + } + }); + // 处理数据,保存库存、属性 + skuMapper.saveBatch(skuList); + } + + + @Override + public void update(SpuDTO spu, List skuList) { + Integer sysType = AuthUserContext.get().getSysType(); + boolean priceUpdate = false; + boolean skuUpdate = false; + // 从获取旧的sku的数据 + List skuListDb = listSkuWithAttrBySpuId(spu.getSpuId()); + Map skuMap = skuListDb.stream().collect(Collectors.toMap(SkuVO::getSkuId, x -> x)); + // skuId + List skuIdsDb = new ArrayList<>(skuMap.keySet()); + List skuIds = new ArrayList<>(skuList.size()); + List updateSkus = new ArrayList<>(skuList.size()); + List insertSkus = new ArrayList<>(skuList.size()); + List skuComboList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 原有sku增加库存的sku列表(不包含新增的sku) + List addStockSkuList = new ArrayList<>(skuList.size()); + // 原有sku减少库存的sku列表(不包含新增的sku) + List reduceStockSkuList = new ArrayList<>(skuList.size()); + String spuName = spu.getSpuLangList().get(0).getSpuName(); + for (SkuDTO sku : skuList) { + sku.setSpuId(spu.getSpuId()); + sku.setSpuName(spuName); + sku.setSpuMainImgUrl(spu.getMainImgUrl()); + SkuDTO addSkuDTO = new SkuDTO(); + SkuDTO reduceSkuDTO = new SkuDTO(); + if (skuIdsDb.contains(sku.getSkuId())) { + List addStockPointList = new ArrayList<>(); + List reduceStockPointList = new ArrayList<>(); + for (StockPointSkuDTO pointSkuDTO : sku.getStockPointList()) { + if ((Objects.isNull(pointSkuDTO.getChangeStock()) && Objects.isNull(pointSkuDTO.getStockPointSkuId())) + || (Objects.nonNull(pointSkuDTO.getChangeStock()) && pointSkuDTO.getChangeStock() > 0)) { + // 库存增加 + addStockPointList.add(pointSkuDTO); + } + if (Objects.nonNull(pointSkuDTO.getChangeStock()) && pointSkuDTO.getChangeStock() < 0) { + // 库存减少 + reduceStockPointList.add(pointSkuDTO); + } + } + if (!addStockPointList.isEmpty()) { + addSkuDTO = BeanUtil.map(sku, SkuDTO.class); + addSkuDTO.setStockPointList(addStockPointList); + addStockSkuList.add(addSkuDTO); + } + if (!reduceStockPointList.isEmpty()) { + reduceSkuDTO = BeanUtil.map(sku, SkuDTO.class); + reduceSkuDTO.setStockPointList(reduceStockPointList); + reduceStockSkuList.add(reduceSkuDTO); + } + updateSkus.add(sku); + skuIds.add(sku.getSkuId()); + if(Objects.equals(spu.getSpuMold(),SpuMold.COMBO.value())){ + addCombo(skuComboList, sku); + } + } else if (Objects.isNull(sku.getSkuId())) { + insertSkus.add(sku); + } + + } + List skuStockList = new ArrayList<>(skuList.size()); + // 新增的sku--保存 + if (CollUtil.isNotEmpty(insertSkus)) { + skuStockList.addAll(this.save(spu.getSpuId(), spu.getStatus(), insertSkus, AuthUserContext.get().getSysType(), + AuthUserContext.get().getUserId(), AuthUserContext.get().getTenantId(),spu.getSpuMold())); + skuUpdate = true; + } + // 已有的sku--更新 + if (CollUtil.isNotEmpty(updateSkus)) { + priceUpdate = getPriceUpdateAndupdateSku(spu, sysType, priceUpdate, updateSkus, skuStockList); + } + // 不存在的sku--删除 + skuIdsDb.removeAll(skuIds); + if (CollUtil.isNotEmpty(skuIdsDb)) { + deleteSkuBatch(skuIdsDb); + skuUpdate = true; + } + // 更新供应商商品变更状态 + if (Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + SupplierSpuUpdateDTO spuUpdateDTO = RedisUtil.get(ProductCacheNames.SUPPLIER_SPU_UPDATE_STATUS + spu.getSpuId()); + spuUpdateDTO.setPriceUpdate(priceUpdate); + spuUpdateDTO.setSkuUpdate(skuUpdate); + RedisUtil.set(ProductCacheNames.SUPPLIER_SPU_UPDATE_STATUS + spu.getSpuId(), spuUpdateDTO, 0); + // 检查供应商sku信息变更 + SupplierSpuChangeType changeType = null; + if (!CollectionUtils.isEmpty(insertSkus)) { + changeType = SupplierSpuChangeType.ADD_SKU; + } else if (!CollectionUtil.isEmpty(skuIdsDb)) { + changeType = SupplierSpuChangeType.SKU_MSG_CHANGE; + } else { + for (SkuDTO skuDTO : skuList) { + if (this.checkSupplierSkuMsgChange(skuDTO, skuMap.get(skuDTO.getSkuId()))) { + changeType = SupplierSpuChangeType.SKU_MSG_CHANGE; + break; + } + } + } + // 生成供应商信息变更日志 + if (!Objects.isNull(changeType)) { + SpuSupplierChangeLog changeLog = new SpuSupplierChangeLog(); + changeLog.setSpuId(spu.getSpuId()); + changeLog.setChangeType(changeType.value()); + spuSupplierChangeLogService.save(changeLog); + } + } + //生成库存出入库记录 + if (!Objects.equals(spu.getSpuMold(), SpuMold.COMBO.value())) { + stockBillLogChange(spu.getSpuId(), null, addStockSkuList, reduceStockSkuList); + } + if (CollUtil.isEmpty(skuStockList)) { + return; + } + SpuVO.DeliveryModeVO deliveryModeVO = Json.parseObject(spu.getDeliveryMode(), SpuVO.DeliveryModeVO.class); + // 判断处理库存 + skuStockService.handSkuStock(spu.getSpuId(), skuStockList, LuaOperateEnum.SKU_REPLACE, deliveryModeVO.getHasUserPickUp()); + // 如果是组合商品关联的sku信息集合不为空,处理一下 + if(CollectionUtil.isNotEmpty(skuComboList)){ + handleComboSku(skuComboList); + } + } + + @Override + public void deleteById(Long skuId) { + skuMapper.deleteById(skuId); + } + + @Override + @Cacheable(cacheNames = CacheNames.SKU_WITH_ATTR_LIST_KEY, key = "#spuId", sync = true) + public List listSkuWithAttrBySpuId(Long spuId) { + List skuList = skuMapper.listSkuWithAttrBySpuId(spuId); + for (SkuVO skuVO : skuList) { + if (StrUtil.isNotBlank(skuVO.getImgUrl())) { + skuVO.setMainImgUrl(skuVO.getImgUrl()); + } + } + List skuIds = skuList.stream().map(SkuVO::getSkuId).toList(); + // 添加sku区域列表 + List stockPointSkuVOList = stockPointSkuMapper.listBySkuIds(skuIds); + Map> stockPointSkuMap = stockPointSkuVOList.stream().collect(Collectors.groupingBy(StockPointSkuVO::getSkuId)); + for (SkuVO skuVO : skuList) { + skuVO.setStockPointList(stockPointSkuMap.get(skuVO.getSkuId())); + } + return skuList; + } + + @Override + public void deleteBySpuId(SpuDTO spuDTO) { + //生成编辑出库记录s + List skuVOList = skuMapper.getBySpuId(spuDTO.getSpuId()); + List skuIds = skuVOList.stream().map(SkuVO::getSkuId).collect(Collectors.toList()); + List stockPointList = stockPointSkuService.listPointIdsBySkuIds(skuIds); + // 删除的sku库存 + // 获取sku库存 + List skuStockVOList = stockManager.convertSkuStock(stockPointList); +// if(CollectionUtil.isEmpty(stockPointList)){ +// skuMapper.updateBySpuId(spuDTO.getSpuId()); +// return; +// } + for (StockPointSkuVO stockPointSkuVO : stockPointList) { + for (SkuStockVO skuStockVO : skuStockVOList) { + if (stockPointSkuVO.getStockPointId().equals(skuStockVO.getStockPointId()) + && stockPointSkuVO.getSkuId().equals(skuStockVO.getSkuId())) { + stockPointSkuVO.setStock(skuStockVO.getStock()); + } + } + } + Map> stockPointMap = stockPointList.stream().collect(Collectors.groupingBy(StockPointSkuVO::getSkuId)); + Map skuStockMap = skuStockVOList.stream().filter(skuStockVO -> skuStockVO.getStockPointId().equals(StockManager.WAREHOUSE_ID)).collect(Collectors.toMap(SkuStockVO::getSkuId, SkuStockVO::getStock)); + List reduceStockSkuList = skuVOList.stream().map(skuVO -> { + SkuDTO skuDTO = new SkuDTO(); + skuDTO.setSkuId(skuVO.getSkuId()); + skuDTO.setSpuName(spuDTO.getName()); + skuDTO.setSpuMainImgUrl(spuDTO.getMainImgUrl()); + skuDTO.setPriceFee(skuVO.getPriceFee()); + skuDTO.setChangeStock(skuStockMap.get(skuVO.getSkuId())); + skuDTO.setMarketPriceFee(skuVO.getMarketPriceFee()); + skuDTO.setSpuId(skuVO.getSpuId()); + skuDTO.setPartyCode(skuVO.getPartyCode()); + skuDTO.setStockPointList(BeanUtil.mapAsList(stockPointMap.get(skuVO.getSkuId()), StockPointSkuDTO.class)); + return skuDTO; + }).collect(Collectors.toList()); + + // 记录库存编辑减少记录 + if (!Objects.equals(spuDTO.getSpuMold(), SpuMold.COMBO.value())) { + handleReduceStockSkuList(reduceStockSkuList, spuDTO.getSpuId(), StockType.OUT_OF_STOCK, StockBillType.EDIT_OUTBOUND); + } + skuMapper.updateBySpuId(spuDTO.getSpuId()); + // 删除该商品所有的sku库存 + stockManager.skuStock(skuStockVOList, LuaOperateEnum.SKU_SUB); + List pointIdList = stockPointList.stream().map(StockPointSkuVO::getStockPointSkuId).collect(Collectors.toList()); + stockPointSkuService.batchDeleteByStockPointSkuIdList(pointIdList); + } + + @Override + @Cacheable(cacheNames = CacheNames.SKU_KEY, key = "#skuId") + public SkuVO getSkuBySkuId(Long skuId) { + SkuVO sku = skuMapper.getSkuBySkuId(skuId); + List stockPointSkuList = stockPointSkuService.listPointBySkuIds(Collections.singletonList(sku.getSkuId())); + stockPointSkuList.sort(Comparator.comparing(StockPointSkuVO::getType)); + sku.setStockPointList(stockPointSkuList); + return sku; + } + + @Override + public void updateAmountOrStock(SpuDTO spuDTO) { + List skuList = spuDTO.getSkuList(); + List skuDbList = skuMapper.getBySpuId(spuDTO.getSpuId()); + List skus = new ArrayList<>(Constant.INITIAL_CAPACITY); + boolean isUpdateStock = false; + List spuPriceLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List addStockSkuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List reduceStockSkuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + + for (SkuDTO skuDTO : skuList) { + skuDTO.setSpuId(spuDTO.getSpuId()); + skuDTO.setSpuName(spuDTO.getName()); + skuDTO.setSpuMainImgUrl(spuDTO.getMainImgUrl()); + SkuDTO addSkuDTO = new SkuDTO(); + SkuDTO reduceSkuDTO = new SkuDTO(); + if (Objects.nonNull(skuDTO.getChangeStock())) { + isUpdateStock = true; + SkuVO skuDb = skuDbList.stream().filter(sku -> Objects.equals(skuDTO.getSkuId(), sku.getSkuId())).findFirst().get(); + skuDTO.setMarketPriceFee(skuDb.getMarketPriceFee()); + skuDTO.setPriceFee(skuDb.getPriceFee()); + skuDTO.setPartyCode(skuDb.getPartyCode()); + skuDTO.setImgUrl(skuDb.getImgUrl()); + skuDTO.setSpuMainImgUrl(spuDTO.getMainImgUrl()); + skuDTO.setStatus(skuDb.getStatus()); + +// if (Objects.nonNull(skuDTO.getChangeStock()) && skuDTO.getChangeStock() > 0) { +// addStockSkuList.add(skuDTO); +// } else { +// reduceStockSkuList.add(skuDTO); +// } + List addStockPointList = new ArrayList<>(); + List reduceStockPointList = new ArrayList<>(); + for (StockPointSkuDTO pointSkuDTO : skuDTO.getStockPointList()) { + if ((Objects.isNull(pointSkuDTO.getChangeStock()) && Objects.isNull(pointSkuDTO.getStockPointSkuId())) + || Objects.nonNull(pointSkuDTO.getChangeStock()) && pointSkuDTO.getChangeStock() > 0) { + // 库存增加 + addStockPointList.add(pointSkuDTO); + } + if (Objects.nonNull(pointSkuDTO.getChangeStock()) && pointSkuDTO.getChangeStock() < 0) { + // 库存减少 + reduceStockPointList.add(pointSkuDTO); + } + } + if (!addStockPointList.isEmpty()) { + addSkuDTO = BeanUtil.map(skuDTO, SkuDTO.class); + addSkuDTO.setStockPointList(addStockPointList); + addStockSkuList.add(addSkuDTO); + } + if (!reduceStockPointList.isEmpty()) { + reduceSkuDTO = BeanUtil.map(skuDTO, SkuDTO.class); + reduceSkuDTO.setStockPointList(reduceStockPointList); + reduceStockSkuList.add(reduceSkuDTO); + } + } else if (Objects.nonNull(skuDTO.getPriceFee())) { + //供应商修改商品价格,生成对应的调价记录 + List skuDb = skuDbList.stream().filter(item -> item.getSkuId().equals(skuDTO.getSkuId())).collect(Collectors.toList()); + if (Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.SUPPLIER.value()) && CollUtil.isNotEmpty(skuDb) && (!skuDb.get(0).getPriceFee().equals(skuDTO.getPriceFee()))) { + SpuPriceLog spuPriceLog = new SpuPriceLog(); + spuPriceLog.setSpuId(spuDTO.getSpuId()); + spuPriceLog.setSkuId(skuDTO.getSkuId()); + spuPriceLog.setBeforePrice(skuDb.get(0).getPriceFee()); + spuPriceLog.setAfterPrice(skuDTO.getPriceFee()); + spuPriceLog.setPrice((long) Arith.sub(spuPriceLog.getAfterPrice(), spuPriceLog.getBeforePrice())); + spuPriceLogList.add(spuPriceLog); + } + Sku sku = new Sku(); + sku.setSkuId(skuDTO.getSkuId()); + sku.setPriceFee(skuDTO.getPriceFee()); + skus.add(sku); + } + } + if (isUpdateStock) { + skuStockService.updateBatch(skuList); + //生成库存出入库记录 + stockBillLogChange(spuDTO.getSpuId(), null, addStockSkuList, reduceStockSkuList); + } + if (CollUtil.isNotEmpty(skus)) { + skuMapper.updateBatch(skus); + } + saveSupplierLog(!Objects.equals(spuDTO.getSupplierId(), -1L) && (isUpdateStock || CollUtil.isNotEmpty(skus)), spuDTO.getSpuId(), SupplierSpuChangeType.SKU_MSG_CHANGE.value()); + if (CollUtil.isNotEmpty(spuPriceLogList)) { + spuPriceLogMapper.insertBatch(spuPriceLogList); + } + + } + + @Override + public List getSpuDetailSkuInfo(SpuVO spu) { + // 从缓存获取sku的数据 + List skuData; + // 供应商的sku列表 + if (Objects.nonNull(spu.getSupplierSpuType()) && Objects.equals(spu.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + skuData = listConsignmentSku(spu, true); + } + // 普通商品的sku列表 + else { + skuData = listSkuAllInfoBySpuId(spu.getSpuId(), spu, true); + } + List skuAppList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SkuVO sku : skuData) { + SkuAppVO skuAppVO = BeanUtil.map(sku, SkuAppVO.class); + if (Objects.nonNull(sku.getSupplierStock())) { + skuAppVO.setStock(sku.getSupplierStock()); + } + skuAppVO.setProperties(spliceProperties(sku.getSpuSkuAttrValues())); + skuAppList.add(skuAppVO); + } + return skuAppList; + } + + @Override + public List listBySpuIds(List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return Collections.emptyList(); + } + // 批量获取sku的数据 + List skuList = skuMapper.listBySpuIds(spuIds); + // sku国际化处理 + ProductLangUtil.skuList(skuList); + // 从缓存获取sku的数据 + setSkuStock(skuList); + return skuList; + } + + private static List getSkuVOList(Long spuId) { + SkuServiceImpl skuService = (SkuServiceImpl) AopContext.currentProxy(); + + // 从缓存获取sku的数据 + List skus = skuService.listSkuWithAttrBySpuId(spuId); + // 启用的sku,app查询到的商品是启用sku的商品 + skus = skus.stream().filter(skuVO -> Objects.equals(skuVO.getStatus(), 1)).collect(Collectors.toList()); + return skus; + } + + @Override + public List listSupplierBySpuIds(List spuIds, Long shopId) { + // 批量获取供应商商品的sku和spu的信息 + List supplierSkuList = this.listBySpuIds(spuIds); + // 获取指定的店铺代销商品的库存 + List skuList = skuStockService.listSkuStockBySupplierSpuIds(spuIds, shopId); + this.setSkuStock(skuList); + Map skuStockMap = skuList.stream().collect(Collectors.toMap(SkuVO::getSupplierSkuId, SkuVO::getStock)); + for (SkuVO skuVO : supplierSkuList) { + skuVO.setSupplierStock(skuVO.getStock()); + skuVO.setStock(skuStockMap.getOrDefault(skuVO.getSkuId(), 0)); + } + return supplierSkuList; + } + + + @Override + public String spliceProperties(List spuSkuAttrValueList) { + StringBuilder properties = new StringBuilder(Constant.INITIAL_CAPACITY); + for (SpuSkuAttrValueVO spuSkuAttrValue : spuSkuAttrValueList) { + if (CollUtil.isEmpty(spuSkuAttrValue.getSpuSkuAttrValueLangList())) { + continue; + } + properties.append(spuSkuAttrValue.getAttrName()).append(Constant.COLON).append(spuSkuAttrValue.getAttrValueName()).append(Constant.SEMICOLON); + } + if (StrUtil.isBlank(properties.toString())) { + return properties.toString(); + } + return properties.substring(0, properties.length() - 1); + } + + + private void deleteSkuBatch(List skuIds) { + List skus = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long skuId : skuIds) { + Sku sku = new Sku(); + sku.setSkuId(skuId); + sku.setStatus(StatusEnum.DELETE.value()); + skus.add(sku); + } + skuMapper.updateBatch(skus); + spuSkuAttrValueService.changeStatusBySkuId(skuIds, StatusEnum.DELETE.value()); + // 删除关联数据和库存 + List pointSkuVOS = stockPointSkuService.listBySkuIds(skuIds); + List stockPointIds = pointSkuVOS.stream().map(StockPointSkuVO::getStockPointSkuId).collect(Collectors.toList()); + List skuStockVOList = BeanUtil.mapAsList(pointSkuVOS, SkuStockVO.class); + skuStockVOList.forEach(s-> s.setStock(0)); + stockPointSkuService.deleteByIds(stockPointIds); + stockManager.skuStock(skuStockVOList, LuaOperateEnum.SKU_REPLACE); + } + + + @Override + public List listSkuAllInfoBySpuId(Long spuId, SpuVO spu, boolean enable) { + SkuServiceImpl skuService = (SkuServiceImpl) AopContext.currentProxy(); + // 从缓存获取sku的数据 + List skus = skuService.listSkuWithAttrBySpuId(spuId); + + if (enable) { + // 启用的sku,app查询到的商品是启用sku的商品 + skus = skus.stream().filter(skuVO -> Objects.equals(skuVO.getStatus(), 1)).collect(Collectors.toList()); + } + + setSkuStock(skus); + ProductLangUtil.skuList(skus); + // 如果是组合商品获取所有组合的商品信息并组装,然后计算出对应库存 + if(Objects.equals(spu.getSpuMold(), SpuMold.COMBO.value())){ + assembleComboSpuListAndStock(skus,spu); + } + return skus; + } + + + @Override + public List excelSkuList(List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return new ArrayList<>(0); + } + List spuExcelList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List skuList = skuMapper.excelSkuList(spuIds); + setSkuStock(skuList); + for (SkuVO skuVO : skuList) { + SpuExcelVO spuExcelVO = BeanUtil.map(skuVO, SpuExcelVO.class); + spuExcelVO.setPriceFee(skuVO.getPriceFee().toString()); + spuExcelVO.setMarketPriceFee(skuVO.getMarketPriceFee().toString()); + spuExcelVO.setImgs(skuVO.getImgUrl()); + for (SkuLangVO skuLangVO : skuVO.getSkuLangList()) { + if (Objects.equals(skuLangVO.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + ProductLangUtil.spuSkuAttrValueList(skuVO.getSpuSkuAttrValues(), skuLangVO.getLang()); + spuExcelVO.setPropertiesZh(spliceProperties(skuVO.getSpuSkuAttrValues())); + spuExcelVO.setSkuNameZh(skuLangVO.getSkuName()); + } else if (Objects.equals(skuLangVO.getLang(), LanguageEnum.LANGUAGE_EN.getLang())) { + ProductLangUtil.spuSkuAttrValueList(skuVO.getSpuSkuAttrValues(), skuLangVO.getLang()); + } + } + spuExcelList.add(spuExcelVO); + } + return spuExcelList; + } + + @Override + public List listSkuPriceByIds(List skuIds) { + if (CollUtil.isEmpty(skuIds)) { + return new ArrayList<>(0); + } + return skuMapper.listSkuPriceByIds(skuIds); + } + + @Override + public List listSpuDetailByIds(List skuIds) { + return skuMapper.listSpuDetailByIds(skuIds); + } + + @Override + public Long getMinPriceFeeByIds(List skuIds) { + return skuMapper.getMinPriceFeeByIds(skuIds); + } + + @Override + public List excelSupplierSkuList(List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return new ArrayList<>(0); + } + List spuExcelList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List skuList = skuMapper.excelSkuList(spuIds); + setSkuStock(skuList); + List supplierSkuIds = skuList.stream().map(SkuVO::getSupplierSkuId).collect(Collectors.toList()); + //根据供应商品sku获取供货价 + List skuVoList = skuMapper.listSkuPriceByIds(supplierSkuIds); + Map collect = skuVoList.stream().collect(Collectors.toMap(SkuVO::getSkuId, SkuVO::getPriceFee)); + for (SkuVO skuVO : skuList) { + SupplierSpuExcelVO spuExcelVO = BeanUtil.map(skuVO, SupplierSpuExcelVO.class); + spuExcelVO.setPriceFee(skuVO.getPriceFee().toString()); + spuExcelVO.setMarketPriceFee(skuVO.getMarketPriceFee().toString()); + //设置供货价 + String supplierPrice = collect.get(skuVO.getSupplierSkuId()).toString(); + spuExcelVO.setSupplyPrice(supplierPrice); + for (SkuLangVO skuLangVO : skuVO.getSkuLangList()) { + if (Objects.equals(skuLangVO.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + ProductLangUtil.spuSkuAttrValueList(skuVO.getSpuSkuAttrValues(), skuLangVO.getLang()); + spuExcelVO.setPropertiesZh(spliceProperties(skuVO.getSpuSkuAttrValues())); + spuExcelVO.setSkuNameZh(skuLangVO.getSkuName()); + } + } + spuExcelList.add(spuExcelVO); + } + return spuExcelList; + } + + @Override + public List listByPartyCodeList(List partyCodeList) { + return skuMapper.listByPartyCodeList(partyCodeList); + } + + @Override + public List listConsignmentSku(SpuVO spu, boolean enable) { + SkuServiceImpl skuService = (SkuServiceImpl) AopContext.currentProxy(); + //获取供应商品sku + List supplierSkuList = skuService.listSkuWithAttrBySpuId(spu.getSupplierSpuId()); + Map supplierSkuMap = supplierSkuList.stream().collect(Collectors.toMap(SkuVO::getSkuId, s -> s)); + //代销商品SKU + List skuVoList = skuService.listSkuWithAttrBySpuId(spu.getSpuId()); + //获取商家和供应商的sku库存 + List skuIds = skuVoList.stream().map(SkuVO::getSkuId).collect(Collectors.toList()); + //添加供应商skuId + skuIds.addAll(supplierSkuMap.keySet()); + //获取商家的库存点关联数据 + List stockPointS = stockPointSkuMapper.listBySkuIds(skuIds); + Map skuStockMap = skuStockService.mapSkuTotalStockAndPointStock(stockPointS); + List deletedsupplierSkuVoList = new ArrayList<>(Constant.INITIAL_CAPACITY); +// if(Objects.equals(spu.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()) && Objects.equals(spu.getSpuMold(), SpuMold.COMBO.value())){ + for (SkuVO skuVO : skuVoList) { + SkuStockVO skuTotalStock = skuStockMap.get(skuVO.getSkuId().toString()); + if(Objects.nonNull(skuTotalStock)) { + skuVO.setStock(skuTotalStock.getStock()); + skuVO.setSaleNum(skuTotalStock.getSale()); + } + if(CollUtil.isNotEmpty(skuVO.getStockPointList())) { + for (StockPointSkuVO stockPointSkuVO : skuVO.getStockPointList()) { + SkuStockVO skuPointStock = skuStockMap.get(StockUtil.skuPointKey(skuVO.getSkuId(), stockPointSkuVO.getStockPointId())); + stockPointSkuVO.setStock(skuPointStock.getStock()); + } + } + + //供应商商品信息 + SkuVO supplierSkuVO = supplierSkuMap.get(skuVO.getSupplierSkuId()); + if (Objects.isNull(supplierSkuVO)) { + deletedsupplierSkuVoList.add(skuVO); + continue; + } + if (Objects.equals(spu.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + logger.info("供应商发货代销商品,代销商品sku状态为供应商商品sku状态"); + skuVO.setStatus(supplierSkuVO.getStatus()); + } + skuVO.setWeight(supplierSkuVO.getWeight()); + skuVO.setVolume(supplierSkuVO.getVolume()); + skuVO.setSupplyPriceFee(supplierSkuVO.getPriceFee()); + skuVO.setSupplierSkuCode(supplierSkuVO.getPartyCode()); + skuVO.setSupplierSkuStatus(supplierSkuVO.getStatus()); + if (supplierSkuVO.getStatus() >= 0) { + skuVO.setIsSell(supplierSkuVO.getStatus()); + } + // 供应商只有总库存数据 + SkuStockVO supplierSkuStockVO = skuStockMap.get(skuVO.getSupplierSkuId().toString()); + skuVO.setSupplierStock(Objects.isNull(supplierSkuStockVO) ? 0 : supplierSkuStockVO.getStock()); + } + //移除供应商已删除的sku + skuVoList.removeAll(deletedsupplierSkuVoList); + if (enable) { + // 启用的sku,app查询到的商品是启用sku的商品 + skuVoList = skuVoList.stream().filter(skuVO -> Objects.equals(skuVO.getSupplierSkuStatus(), 1)).collect(Collectors.toList()); + } + ProductLangUtil.skuList(skuVoList); + // 如果是组合商品获取所有组合的商品信息并组装,然后计算出对应库存 + if(Objects.equals(spu.getSpuMold(), SpuMold.COMBO.value())){ + assembleComboSpuListAndStock(skuVoList,spu); + } + return skuVoList; + } + + @Override + public StockBillLogItemDTO getSkuByPartyCodeAndShopId(String partyCode, Long shopId, Integer sysType) { + return skuMapper.getSkuByPartyCodeAndShopId(partyCode, shopId, sysType); + } + + @Override + public List listSkuPartyCodesByShopId(Long shopId, Integer sysType, Long spuId) { + + return skuMapper.listSkuPartyCodesByShopId(shopId, sysType, spuId); + } + + + @Override + public List exportSkuList(ProductSearchDTO product) { + List skuList = skuMapper.listExportSku(product); + // 插入sku库存 + setSkuStock(skuList); + List skuExcelList; + skuExcelList = skuList.stream().map(skuVO -> { + SkuExcelVO skuExcelVO = new SkuExcelVO(); + skuExcelVO.setSkuId(skuVO.getSkuId()); + skuExcelVO.setSkuName(skuVO.getSkuName()); + skuExcelVO.setSpuName(skuVO.getSpuName()); + skuExcelVO.setPartyCode(skuVO.getPartyCode()); + skuExcelVO.setStock(skuVO.getStock()); + skuExcelVO.setPriceFee(AnalysisUtil.conversionPrices(skuVO.getPriceFee().toString())); + return skuExcelVO; + }).collect(Collectors.toList()); + return skuExcelList; + } + + @Override + public Integer getStockWarningNum(ProductSearchDTO product) { + // TODO stock + return skuMapper.getStockWarningNum(product); + } + + @Override + public void commissionSave(SpuVO spuVO, List skuList, Integer sysType) { + Long spuId = spuVO.getSpuId(); + Integer spuStatus = spuVO.getStatus(); + batchSaveSku(spuId, skuList); + List skuDbList = skuMapper.getBySpuId(spuId); + List skuStocks = new ArrayList<>(Constant.INITIAL_CAPACITY); + List skuLangList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List stockPointS = new ArrayList<>(Constant.INITIAL_CAPACITY); + List spuSkuAttrValues = new ArrayList<>(Constant.INITIAL_CAPACITY); + WarehouseVO warehouse = warehouseService.getDefaultWarehouseByShopId(spuVO.getShopId(), sysType); + if(Objects.isNull(warehouse)) { + throw new LuckException("找不到该店铺的默认仓库"); + } + for (SkuDTO skuDTO : skuList) { + addStockPoint(spuVO.getSpuMold(), stockPointS, spuId, spuStatus, skuStocks, skuDTO, warehouse.getWarehouseId()); + if (CollUtil.isEmpty(skuDTO.getSpuSkuAttrValues())) { + continue; + } + addLang(skuLangList, skuDTO); + addAttr(spuId, spuSkuAttrValues, skuDTO); + } + skuLangService.batchSave(BeanUtil.mapAsList(skuLangList, SkuLang.class)); + spuSkuAttrValueService.commissionSave(spuSkuAttrValues, sysType); + stockPointSkuService.batchSave(stockPointS); + //供应商新增sku时,生成对应的变更记录 + saveSupplierLog(skuList.size() > skuDbList.size(), spuId, SupplierSpuChangeType.ADD_SKU.value()); + // 数据存储在redis中,所以最后再执行库存插入 + skuStockService.batchSave(skuStocks, spuStatus); + } + + @Override + public List getByIds(List skuIds) { + return skuMapper.listSkuBySkuIds(skuIds); + } + + @Override + public List setSpuSku(List spuAdminVOList) { + List spuIdList = spuAdminVOList.stream().map(SpuAdminVO::getSpuId).collect(Collectors.toList()); + if (spuIdList.size() == 0) { + return spuAdminVOList; + } + List skuList = skuMapper.listSkuBySpuIds(spuIdList); + Map> skuVoBySpuId = skuList.stream().collect(Collectors.groupingBy(SkuVO::getSpuId)); + skuList.clear(); + List spuIdsOfSupplierDelivery = new ArrayList<>(spuAdminVOList.size()); + for (SpuAdminVO spuAdminVO : spuAdminVOList) { + List skuVoList = skuVoBySpuId.get(spuAdminVO.getSpuId()); + if (Objects.equals(spuAdminVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + logger.info("供应商自发货商品"); + List supplierSkuIdList = skuVoList.stream().map(SkuVO::getSupplierSkuId).collect(Collectors.toList()); + List supplierSkuList = skuMapper.listSkuBySkuIds(supplierSkuIdList); + Map supplierSkuStatusMap = supplierSkuList.stream().collect(Collectors.toMap(SkuVO::getSkuId, SkuVO::getStatus)); + Iterator iterator = skuVoList.iterator(); + while (iterator.hasNext()) { + SkuVO skuVO = iterator.next(); + if (Objects.equals(supplierSkuStatusMap.get(skuVO.getSupplierSkuId()), StatusEnum.DISABLE.value())) { + logger.info("供应商自发货商品,过滤掉不是正常状态的sku,skuId:{}", skuVO.getSkuId()); + iterator.remove(); + } + } + } + if (Objects.equals(spuAdminVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + spuIdsOfSupplierDelivery.add(spuAdminVO.getSpuId()); + } + // 插入sku列表 + spuAdminVO.setSkuList(skuVoList); + skuList.addAll(skuVoList); + } + // sku国际化处理 + ProductLangUtil.skuList(skuList); + // 获取库存信息 + setSkuAndSupplierSkuStock(skuList, spuIdsOfSupplierDelivery); + + return spuAdminVOList; + } + + @Override + public PageVO pageSku(PageDTO pageDTO, ProductSearchDTO product) { + PageVO skuPage = PageUtil.doPage(pageDTO, () -> skuMapper.pageSku(product)); + // 插入库存 + setSkuStock(skuPage.getList()); + return skuPage; + } + + @Override + public List listSkuAndStockBySkuIds(List skuIds) { + if (CollectionUtils.isEmpty(skuIds)) { + return Collections.emptyList(); + } + // 获取sku信息列表 + List skuList = skuMapper.listSkuBySkuIds(skuIds); + // 获取sku总库存信息集合 + Map stockMap = skuStockService.mapSkuTotalStockBySkuIds(skuIds); + // 设置sku库存 + for (SkuVO skuVO : skuList) { + SkuStockVO skuStockVO = stockMap.get(skuVO.getSkuId()); + skuVO.setStock(skuStockVO.getStock()); + } + return skuList; + } + + @Override + public void setSkuStock(List skus) { + if (CollectionUtil.isEmpty(skus)) { + return; + } + List skuIds = skus.stream().map(SkuVO::getSkuId).collect(Collectors.toList()); + List stockPoints = stockPointSkuMapper.listBySkuIds(skuIds); + List comboSkuList = Lists.newArrayList(); + for (SkuVO skuVO : skus) { + if(Objects.equals(skuVO.getSpuMold(), SpuMold.COMBO.value())) { + comboSkuList.add(skuVO.getSkuId()); + } + } + if(CollUtil.isEmpty(stockPoints)){ + return; + } + // 因为库存的缓存是经常变的,而规格信息的缓存是几乎不变的,所以库存的缓存要独立拿出来 + Map skuStockMap = skuStockService.mapSkuTotalStockAndPointStock(stockPoints); + Map> stockPointMap = stockPoints.stream().collect(Collectors.groupingBy(StockPointSkuVO::getSkuId)); + for (SkuVO skuVO : skus) { + if (!skuStockMap.containsKey(skuVO.getSkuId().toString())) { + continue; + } + if (!stockPointMap.containsKey(skuVO.getSkuId())) { + continue; + } + List stockPointSkuVOList = stockPointMap.get(skuVO.getSkuId()); + for (StockPointSkuVO pointSkuVO : stockPointSkuVOList) { + SkuStockVO skuStockVO = skuStockMap.get(StockUtil.skuPointKey(skuVO.getSkuId(), pointSkuVO.getStockPointId())); + pointSkuVO.setStock(skuStockVO.getStock()); + } + skuVO.setStockPointList(stockPointSkuVOList.stream().filter(stockPointSkuVO -> Objects.nonNull(stockPointSkuVO.getStockPointSkuId()) && stockPointSkuVO.getStockPointId() != 0).collect(Collectors.toList())); + + SkuStockVO skuStockVO = skuStockMap.get(skuVO.getSkuId().toString()); + skuVO.setStock(skuStockVO.getStock()); + skuVO.setSaleNum(skuStockVO.getSale()); + } + // 如果是组合商品,需要重新计算一下库存 + if (CollUtil.isNotEmpty(comboSkuList)) { + Map comSkuStockMap = skuStockService.mapSkuTotalStockBySkuIds(comboSkuList); + for (SkuVO skuVO : skus) { + if(!comSkuStockMap.containsKey(skuVO.getSkuId())){ + continue; + } + skuVO.setStock(comSkuStockMap.get(skuVO.getSkuId()).getStock()); + } + } + } + + @Override + public void setEsSkuStock(List skus) { + List skuIds = skus.stream().map(SkuVO::getSkuId).collect(Collectors.toList()); + // 获取sku总库存 - 因为库存的缓存是经常变的,而规格信息的缓存是几乎不变的,所以库存的缓存要独立拿出来 + Map skuStockMap = skuStockService.mapSkuTotalStockBySkuIds(skuIds); + for (SkuVO skuVO : skus) { + SkuStockVO skuStockVO = skuStockMap.get(skuVO.getSkuId()); + skuVO.setStock(skuStockVO.getStock()); + skuVO.setSaleNum(skuStockVO.getSale()); + } + } + + @Override + public void changeSkuStockStatusBySpuId(Long spuId, Integer changeStatus) { + List skuList = skuMapper.listSimpleSkuBySpuIds(Collections.singletonList(spuId)); + if (CollUtil.isEmpty(skuList)) { + return; + } + List skuStockList = new ArrayList<>(skuList.size()); + for (SkuVO skuVO : skuList) { + SkuStockVO skuStock = new SkuStockVO(skuVO.getSkuId()); + if (Objects.equals(changeStatus, SpuStatus.PUT_SHELF.value()) && Objects.equals(skuVO.getStatus(), StatusEnum.ENABLE.value())) { + skuStock.setStatus(StatusEnum.ENABLE.value()); + } else { + skuStock.setStatus(StatusEnum.DISABLE.value()); + } + skuStockList.add(skuStock); + } + skuStockService.changeSkuStatus(skuStockList); + } + + @Override + public void changeSkuStockStatusBySkuId(Long skuId, Integer spuStatus, Integer skuStatus) { + SkuStockVO skuStockVO = new SkuStockVO(skuId); + if (Objects.equals(skuStatus, SpuStatus.PUT_SHELF.value()) && Objects.equals(skuStatus, StatusEnum.ENABLE.value())) { + skuStockVO.setStatus(StatusEnum.ENABLE.value()); + } else { + skuStockVO.setStatus(StatusEnum.DISABLE.value()); + } + skuStockService.changeSkuStatus(Collections.singletonList(skuStockVO)); + } + + + @Override + public List listSkuAndStockByStockPointId(Long stockPointId, Long inStockPointId) { + List pointSkuList = stockPointSkuService.listByPointId(stockPointId); + List skuIds = pointSkuList.stream().map(StockPointSkuVO::getSkuId).collect(Collectors.toList()); + // 获取sku信息列表 + List skuList = skuMapper.listSkuBySkuIds(skuIds); + // 获取库存信息集合 + boolean isAllotQuery = !Objects.isNull(inStockPointId); + if (isAllotQuery) { + for (Long skuId : skuIds) { + pointSkuList.add(new StockPointSkuVO(skuId, inStockPointId)); + } + } + Map skuStockVOMap = skuStockService.mapSkuTotalStockAndPointStock(pointSkuList); + // 设置sku库存 + List allotSkuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SkuVO skuVO : skuList) { + SkuStockVO skuStockVO = skuStockVOMap.get(StockUtil.skuPointKey(skuVO.getSkuId(), stockPointId)); + skuVO.setStock(skuStockVO.getStock()); + if (isAllotQuery) { + if (Objects.equals(skuVO.getStock() ,0)) { + continue; + } + allotSkuList.add(skuVO); + // 补充入库点该sku库存 + SkuStockVO skuPointStockVO = skuStockVOMap.get(StockUtil.skuPointKey(skuVO.getSkuId(), inStockPointId)); + skuVO.setInStockPointStock(Objects.isNull(skuPointStockVO) ? 0 : skuPointStockVO.getStock()); + } + } + return isAllotQuery ? allotSkuList : skuList; + } + + private boolean getPriceUpdateAndupdateSku(SpuDTO spu, Integer sysType, boolean priceUpdate, List updateSkus, List skuStockList) { + List skus = BeanUtil.mapAsList(updateSkus, Sku.class); + List skuDbPriceList = skuMapper.listSkuBySkuIds(updateSkus.stream().map(SkuDTO::getSkuId).collect(Collectors.toList())); + List spuPriceLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List updateStockPointS = new ArrayList<>(Constant.INITIAL_CAPACITY); + WarehouseVO warehouse = warehouseService.getDefaultWarehouseByShopId(spu.getShopId() == null ? spu.getSupplierId() : spu.getShopId(), sysType); + if(Objects.isNull(warehouse)) { + throw new LuckException("找不到该店铺的默认仓库"); + } + for (SkuVO skuVO : skuDbPriceList) { + List skuGetById = updateSkus.stream().filter(item -> item.getSkuId().equals(skuVO.getSkuId())).collect(Collectors.toList()); + if (Objects.equals(sysType, SysTypeEnum.SUPPLIER.value()) + && CollUtil.isNotEmpty(skuGetById)) { + SkuDTO skudto = skuGetById.get(0); + //供应商修改商品价格时,生成调价记录 + if (!Objects.equals(skudto.getPriceFee(), skuVO.getPriceFee())) { + SpuPriceLog spuPriceLog = new SpuPriceLog(); + spuPriceLog.setSpuId(skuVO.getSpuId()); + spuPriceLog.setSkuId(skuVO.getSkuId()); + spuPriceLog.setBeforePrice(skuVO.getPriceFee()); + spuPriceLog.setAfterPrice(skuGetById.get(0).getPriceFee()); + spuPriceLog.setPrice((long) Arith.sub(spuPriceLog.getAfterPrice(), spuPriceLog.getBeforePrice())); + spuPriceLogList.add(spuPriceLog); + // 记录供应商商品售价变化 + priceUpdate = true; + } + if (!Objects.equals(skudto.getMarketPriceFee(), skuVO.getMarketPriceFee())) { + priceUpdate = true; + } + } + } + skuMapper.updateBatch(skus); + for (SkuDTO sku : updateSkus) { + addStockPoint(spu.getSpuMold(), updateStockPointS, spu.getSpuId(), spu.getStatus(), skuStockList, sku, warehouse.getWarehouseId()); + } + if (CollUtil.isNotEmpty(updateStockPointS)) { + stockPointSkuService.changeStockPoint(updateStockPointS, false); + } + if (CollUtil.isNotEmpty(spuPriceLogList)) { + spuPriceLogMapper.insertBatch(spuPriceLogList); + } + return priceUpdate; + } + + private void stockBillLogChange(Long spuId, List insertSkus, List addStockSkuList, List reduceStockSkuList) { + // 记录新增的sku库存初始化 + if (CollUtil.isNotEmpty(insertSkus) && AuthUserContext.get().getTenantId() != Constant.PLATFORM_SHOP_ID) { +// //获取入库单号 +// ServerResponseEntity inStockResponse = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_PRODUCT_STOCK_IN); +// if (!inStockResponse.isSuccess()) { +// throw new LuckException(inStockResponse.getMsg()); +// } +// List stockBillLogItemVOList = loadStockBillLogItems(spuId, insertSkus); +// StockBillLogVO stockBillLogVO = loadStockBillLog(StockType.WAREHOUSING.value(), StockBillType.INITIALIZE.value(), stockBillLogItemVOList, +// AuthUserContext.get().getUserId(), AuthUserContext.get().getTenantId()); +// //发送事件进行添加商品库存初始化记录 +// SendStatus sendStockStatus = stockBillLogTemplate.syncSend(RocketMqConstant.STOCK_BILL_LOG_TOPIC, new GenericMessage<>(stockBillLogVO)).getSendStatus(); + List stockBillLogItemDTOList = loadStockBillLogItems(StockType.WAREHOUSING.value(), StockBillType.INITIALIZE.value(), spuId, insertSkus); + // 发送事件进行添加商品出入库记录 + SendStatus sendStockStatus = stockBillLogTemplate.syncSend(RocketMqConstant.STOCK_BILL_LOG_TOPIC, new GenericMessage<>(stockBillLogItemDTOList)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + // 记录库存编辑增加记录 + handleReduceStockSkuList(addStockSkuList, spuId, StockType.WAREHOUSING, StockBillType.EDIT_STORAGE); + // 记录库存编辑减少记录 + handleReduceStockSkuList(reduceStockSkuList, spuId, StockType.OUT_OF_STOCK, StockBillType.EDIT_OUTBOUND); + } + + private void handleReduceStockSkuList(List reduceStockSkuList, Long spuId, StockType outOfStock, StockBillType editOutbound) { + if (CollUtil.isNotEmpty(reduceStockSkuList) && AuthUserContext.get().getTenantId() != Constant.PLATFORM_SHOP_ID) { +// List stockBillLogItemVOList = loadStockBillLogItems(spuId, reduceStockSkuList); +// StockBillLogVO stockBillLogVO = loadStockBillLog(outOfStock.value(), editOutbound.value(), stockBillLogItemVOList, +// AuthUserContext.get().getUserId(), AuthUserContext.get().getTenantId()); +// //发送事件进行添加商品库存初始化记录 +// SendStatus sendStockStatus = stockBillLogTemplate.syncSend(RocketMqConstant.STOCK_BILL_LOG_TOPIC, new GenericMessage<>(stockBillLogVO)).getSendStatus(); + + List stockBillLogItemDTOList = loadStockBillLogItems(outOfStock.value(), editOutbound.value() ,spuId, reduceStockSkuList); + // 发送事件进行添加商品出入库记录 + SendStatus sendStockStatus = stockBillLogTemplate.syncSend(RocketMqConstant.STOCK_BILL_LOG_TOPIC, new GenericMessage<>(stockBillLogItemDTOList)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + } + + private StockBillLogVO loadStockBillLog(Integer type, Integer stockBillType, List stockBillLogItems, Long userId, Long shopId) { + String key = Objects.equals(type, StockType.WAREHOUSING.value()) ? DistributedIdKey.MALL4CLOUD_PRODUCT_STOCK_IN : DistributedIdKey.MALL4CLOUD_PRODUCT_STOCK_OUT; + //获取入库单号 + String stockBillNo = segmentManager.getSegmentCode(key); + + ServerResponseEntity userResponse = shopUserFeignClient.getByUserId(userId); + if (!userResponse.isSuccess() || userResponse.getData() == null) { + throw new LuckException("无法获取制单人手机号"); + } + StockBillLogVO stockBillLog = new StockBillLogVO(); + stockBillLog.setType(type); + stockBillLog.setStockBillNo(stockBillNo); + stockBillLog.setMakerMobile(userResponse.getData().getPhoneNum()); + stockBillLog.setStockBillType(stockBillType); + stockBillLog.setShopId(shopId); + stockBillLog.setEmployeeId(userId); + stockBillLog.setStatus(StockBillStatus.SUCCESS.value()); + stockBillLog.setBusinessTime(new Date()); + long totalAmount = 0L; + int totalCount = 0; + for (StockBillLogItemVO stockBillLogItem : stockBillLogItems) { + totalAmount = totalAmount + stockBillLogItem.getUnitPrice() * stockBillLogItem.getStockCount(); + totalCount += stockBillLogItem.getStockCount(); + } + stockBillLog.setTotalAmount(totalAmount); + stockBillLog.setTotalCount(totalCount); + stockBillLog.setStockBillLogItems(stockBillLogItems); + stockBillLog.setStockBillLogItems(stockBillLogItems); + return stockBillLog; + } + + private List loadStockBillLogItems(Integer type, Integer stockBillType, Long spuId, List insertSkus) { + List stockBillLogItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + Long userId = AuthUserContext.get().getUserId(); + Integer sysType = AuthUserContext.get().getSysType(); + String userPhone; + if (sysType.equals(SysTypeEnum.MULTISHOP.value())) { + ServerResponseEntity userResponse = shopUserFeignClient.getByUserId(userId); + if (!userResponse.isSuccess() || userResponse.getData() == null) { + throw new LuckException("无法获取制单人手机号"); + } + userPhone = userResponse.getData().getPhone(); + } else { + ServerResponseEntity supplierResponse = supplierUserFeignClient.getByUserId(userId); + if (!supplierResponse.isSuccess() || supplierResponse.getData() == null) { + throw new LuckException("无法获取制单人手机号"); + } + userPhone = supplierResponse.getData().getPhone(); + } + Long shopId = AuthUserContext.get().getTenantId(); + for (SkuDTO skuDTO : insertSkus) { + List stockPointList = skuDTO.getStockPointList(); + for (StockPointSkuDTO stockPointSkuDTO : stockPointList) { + StockBillLogItemDTO stockBillLogItem = new StockBillLogItemDTO(); + stockBillLogItem.setSpuId(spuId); + stockBillLogItem.setShopId(shopId); + stockBillLogItem.setSkuId(skuDTO.getSkuId()); + stockBillLogItem.setSpuName(skuDTO.getSpuName()); + stockBillLogItem.setSkuName(skuDTO.getSkuName()); + stockBillLogItem.setMainImgUrl(Objects.nonNull(skuDTO.getImgUrl()) ? skuDTO.getImgUrl() : skuDTO.getSpuMainImgUrl()); + stockBillLogItem.setUnitPrice(skuDTO.getPriceFee()); + stockBillLogItem.setStockCount(Objects.isNull(stockPointSkuDTO.getChangeStock()) ? stockPointSkuDTO.getStock() : Math.abs(stockPointSkuDTO.getChangeStock())); + stockBillLogItem.setPartyCode(skuDTO.getPartyCode()); + stockBillLogItem.setAfterStock(skuDTO.getChangeStock()); + stockBillLogItem.setUnitPrice(skuDTO.getMarketPriceFee()); + stockBillLogItem.setStockPointId(stockPointSkuDTO.getStockPointId()); + stockBillLogItem.setStockPointType(stockPointSkuDTO.getStockPointType()); + stockBillLogItem.setStocktype(type); + stockBillLogItem.setStockBillType(stockBillType); + stockBillLogItem.setMakerMobile(userPhone); + if (sysType.equals(SysTypeEnum.SUPPLIER.value())) { + stockBillLogItem.setSupplierId(shopId); + stockBillLogItem.setShopId(-1L); + } + stockBillLogItems.add(stockBillLogItem); + } + } + return stockBillLogItems; + } + + private void handleComboSku(List skuComboList) { + List skuIds = skuComboList.stream().map(SkuComboDTO::getSkuId).toList(); + skuComboService.deleteBySkuIds(skuIds); + skuComboService.saveBatch(skuComboList); + } + + /** + * 设置sku和供应商sku库存 + * 供应商发货的商品,sku库存为供应商商品sku的库存 + * @param skus sku列表 + * @param spuIds 供应商发货的spuId列表 + */ + private void setSkuAndSupplierSkuStock(List skus, List spuIds) { + // 供应商发货的商品,获取供应商sku的库存; 商家发货的商品,获取商品sku的库存 + List skuIds = skus.stream() + .map(skuVO -> spuIds.contains(skuVO.getSpuId()) ? skuVO.getSupplierSkuId() : skuVO.getSkuId()) + .collect(Collectors.toList()); + // 因为库存的缓存是经常变的,而规格信息的缓存是几乎不变的,所以库存的缓存要独立拿出来 + Map skuStockMap = skuStockService.skuStockMapBySkuIds(skuIds); + for (SkuVO skuVO : skus) { + long skuId = spuIds.contains(skuVO.getSpuId()) ? skuVO.getSupplierSkuId() : skuVO.getSkuId(); + if (!skuStockMap.containsKey(skuId)) { + continue; + } + SkuStockVO skuStockVO = skuStockMap.get(skuId); + skuVO.setStock(skuStockVO.getStock()); + skuVO.setSaleNum(skuStockVO.getSale()); + } + } + + @Override + public void assembleComboSpuListAndStock(List skus,SpuVO spu) { + Long shopId = spu.getShopId(); + List skuIds = skus.stream().map(SkuVO::getSkuId).toList(); + if (Objects.nonNull(spu.getSupplierDeliveryType()) && Objects.equals(spu.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + skuIds = skus.stream().map(SkuVO::getSupplierSkuId).toList(); + } + boolean isSupplierSpu = Objects.nonNull(spu.getSupplierDeliveryType()) && Objects.equals(spu.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + List totalSkuComboList = skuComboService.getCombSpusBySkuIds(skuIds); + // 获取所有组合的商品库存 + List comboSkuIds = totalSkuComboList.stream().map(SkuComboVO::getComboSkuId).toList(); + if(CollectionUtil.isEmpty(comboSkuIds)){ + return; + } + List stockPointList = stockPointSkuService.listPointIdsBySkuIds(comboSkuIds); + // 获取sku区域库存 + Map stockVOMap = skuStockService.mapSkuTotalStockAndPointStock(stockPointList); +// // 只需要计算仓库的库存 + // 设置一下组合的商品库存 + Map> skuComboMap = totalSkuComboList.stream().collect(Collectors.groupingBy(SkuComboVO::getSkuId)); + Map> skuPoinStockMap = stockPointList.stream().collect(Collectors.groupingBy(StockPointSkuVO::getStockPointId)); + // 根据主组合商品的skuId组成map + for (SkuVO sku : skus) { + sku.setStock(0); + long skuId = sku.getSkuId(); + if (isSupplierSpu) { + skuId = sku.getSupplierSkuId(); + } + // 当前sku关联的组合单品列表 + Map pointStockMap = new HashMap<>(skuPoinStockMap.size()); + List skuComboList = skuComboMap.get(skuId); + // 获取每个区域单品的最小组合库存数量 + for (Map.Entry> entry : skuPoinStockMap.entrySet()) { + // 跳过总库存 + if (entry.getKey() == 0) { + continue; + } + List stockPointSkus = entry.getValue(); + // 如果当前仓库的所有sku库存为空,或者小于需要查询的sku的数量,表示这些关联的sku没有共同库存跳过即可 + if(CollUtil.isEmpty(stockPointSkus) || stockPointSkus.size() < skuComboList.size()){ + continue; + } + Map comboSkuPoinStockMap = stockPointSkus.stream().collect(Collectors.toMap(StockPointSkuVO::getSkuId, Function.identity())); + // 计算区域中的单品的最小库存数量 + for (SkuComboVO skuComboVO : skuComboList) { + StockPointSkuVO stockPointSkuVO = comboSkuPoinStockMap.get(skuComboVO.getComboSkuId()); + if(Objects.isNull(stockPointSkuVO)){ + continue; + } + // 计算sku中每个单品的库存数量 + // 获取单品的区域库存信息 + SkuStockVO skuStockVO = stockVOMap.get(StockUtil.skuPointKey(skuComboVO.getComboSkuId(), stockPointSkuVO.getStockPointId())); + // 组合sku中单品实际库存数量 = 单品库存数量 / 单品组合数量 + // 除以组合数量向下取整得出 当前的组合商品-当前仓库 可用库存 + int pointStock = Math.floorDiv(skuStockVO.getStock(), skuComboVO.getComboCount()); + // 如果是0就是总库存,直接跳过 + if (Objects.equals(stockPointSkuVO.getStockPointId(), StockManager.WAREHOUSE_ID)) { + continue; + } + // 组合商品的库存取最小值,比如都是默认仓库的情况下,取最小值 + if (!pointStockMap.containsKey(stockPointSkuVO.getStockPointId()) || pointStockMap.get(stockPointSkuVO.getStockPointId()) > pointStock) { + pointStockMap.put(stockPointSkuVO.getStockPointId(), pointStock); + } + } + } + // 单品的总库存 + for (SkuComboVO skuComboVO : skuComboList) { + skuComboVO.setStock(stockVOMap.get(skuComboVO.getComboSkuId().toString()).getStock()); + } + // 累加上sku的所有组合商品的所有仓库的库存最小值,就是当前sku可用的最小库存 + int totalStock = 0; + boolean isSupplierQuery = Objects.equals(spu.getShopId(), -1L) + && !Objects.equals(spu.getSupplierId(), -1L); + if (isSupplierQuery) { + int comboStock; + for (int i=0; i skuList = skuComboList.stream().map(SkuComboVO::getComboSkuId).collect(Collectors.toList()); + if (!hasStockBySkuIds(skuList, shopId)) { + sku.setStock(0);; + } + } + } + + @Override + public Boolean hasStockBySkuIds(List comboSkuIds, Long shopId) { + int totalStock = 0; + // 当前组合sku拥有的仓库ids + List stockPointList = stockPointSkuService.listPointIdsBySkuIds(comboSkuIds); + List skuList = listSpuDetailByIds(comboSkuIds); + List virtualSkuList = skuList.stream().filter(skuAddrVO -> Objects.equals(skuAddrVO.getSpuMold(), SpuMold.VIRTUAL.value())).toList(); + WarehouseVO warehouse = warehouseService.getDefaultWarehouseByShopId(shopId,SysTypeEnum.MULTISHOP.value()); + Map skuMoldMap = virtualSkuList.stream().collect(Collectors.toMap(SkuAddrVO::getSkuId, SkuAddrVO::getSpuMold)); + long count = virtualSkuList.size(); + // 获取组合sku的区域库存 + Map skuStockMap = skuStockService.mapSkuPointStockByStockPoints(stockPointList); + Map pointStockMap = new HashMap<>(stockPointList.size()); + Map> stockPointMap = stockPointList.stream().collect(Collectors.groupingBy(StockPointSkuVO::getStockPointId)); + // 根据仓库id循环判断 + for (Map.Entry> entry : stockPointMap.entrySet()) { + // 当前区域的sku库存信息列表 + List skuStockPointList = entry.getValue(); + // 如果当前仓库的所有sku库存为空,或者小于需要查询的sku的数量,表示这些关联的sku没有共同库存跳过即可 + if(skuStockPointList.size() + count < comboSkuIds.size()){ + continue; + } + for (StockPointSkuVO stockPointSkuVO : skuStockPointList) { +// // 如果不是默认仓库且为虚拟商品,直接跳过 +// if(!Objects.equals(warehouse.getWarehouseId(),stockPointSkuVO.getStockPointId()) && skuMoldMap.containsKey(stockPointSkuVO.getSkuId())){ +// continue; +// } + SkuStockVO skuStockVO = skuStockMap.get(StockUtil.skuPointKey(stockPointSkuVO.getSkuId(), stockPointSkuVO.getStockPointId())); + int pointStock = skuStockVO.getStock(); + // 组合商品的库存取最小值,比如都是默认仓库的情况下,取最小值 + if(!pointStockMap.containsKey(skuStockVO.getStockPointId()) || pointStockMap.get(skuStockVO.getStockPointId()) > pointStock) { + pointStockMap.put(skuStockVO.getStockPointId(), pointStock); + } + } + } + // 累加上sku的所有组合商品的所有仓库的库存最小值,就是当前sku可用的最小库存 + for (Long pointId : pointStockMap.keySet()) { + totalStock += pointStockMap.get(pointId); + } + return totalStock > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateStockMode(Long stockPointId, Integer stockMode, Integer type) { + // 获取门店所有的sku + List pointSkuList = stockPointSkuService.listByPointId(stockPointId); + UidInfoBO uidInfoBO = AuthUserContext.get(); + if (Objects.nonNull(type)) { + List skuIds = pointSkuList.stream().map(StockPointSkuVO::getSkuId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(skuIds)) { + return; + } + // 获取原来的sku库存 + List stockDbList = skuStockService.listSkuStockBySkuIds(pointSkuList); + Map stockMap = stockDbList.stream().filter(skuStockVO -> skuStockVO.getStockPointId() != 0).collect(Collectors.toMap(SkuStockVO::getSkuId, SkuStockVO::getStock)); + pointSkuList.forEach(s-> s.setStock(stockMap.get(s.getSkuId()))); + List deleteList = new ArrayList<>(pointSkuList.size()); + for (StockPointSkuVO skuVO : pointSkuList) { + SkuStockVO skuStockVO = new SkuStockVO(skuVO.getSkuId(), stockMap.get(skuVO.getSkuId()), skuVO.getStockPointId(), null); + deleteList.add(skuStockVO); + } + if (type == 1) { + // 添加默认仓库库存 + List updateList = new ArrayList<>(skuIds.size()); + // 获取sku对应的默认仓库 + List pointList = stockPointSkuService.listPointBySkuIds(skuIds).stream().filter(stockPointSkuVO -> stockPointSkuVO.getType() == 0).toList(); + // 获取原来的sku库存 + // Map skuStockMap = skuStockService.mapSkuPointStockByStockPoints(pointList); + // 将门店库存添加到默认仓库 + for (StockPointSkuVO pointSkuVO : pointList) { + // SkuStockVO skuStock = skuStockMap.get(pointSkuVO.getSkuId() + Constant.UNDERLINE + pointSkuVO.getStockPointId()); + SkuStockVO skuStockVO = new SkuStockVO(pointSkuVO.getSkuId(), stockMap.get(pointSkuVO.getSkuId()), pointSkuVO.getStockPointId(), null); + updateList.add(skuStockVO); + } + stockManager.skuStock(updateList, LuaOperateEnum.SKU_ADD); + } + stockManager.skuStock(deleteList, LuaOperateEnum.SKU_SUB); + List stockBillLogItemDTOList = new ArrayList<>(); + Long shopId = uidInfoBO.getTenantId(); + List skuVOS = skuMapper.listSkuBySkuIds(skuIds); + stockBillLogItemDTOList.addAll(addBillLogList(StockBillType.SWITCH_STATION.value(), StockType.OUT_OF_STOCK.value(), pointSkuList, skuVOS, shopId, null)); + if (type == 1) { + // 获取默认仓库 + WarehouseVO warehouse = warehouseService.getDefaultWarehouseByShopId(shopId, uidInfoBO.getSysType()); + if (Objects.isNull(warehouse)) { + throw new LuckException("找不到该店铺的默认仓库"); + } + stockBillLogItemDTOList.addAll(addBillLogList(StockBillType.SWITCH_WAREHOUSE.value(), StockType.WAREHOUSING.value(), pointSkuList, skuVOS, shopId, warehouse.getWarehouseId())); + } + //发送事件进行添加商品库存模式转换出入库记录 + SendStatus sendStockStatus = stockBillLogTemplate.syncSend(RocketMqConstant.STOCK_BILL_LOG_TOPIC, new GenericMessage<>(stockBillLogItemDTOList)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + List stockPointSkuIds = pointSkuList.stream().map(StockPointSkuVO::getStockPointSkuId).collect(Collectors.toList()); + stockPointSkuService.batchDeleteByStockPointSkuIdList(stockPointSkuIds); + List spuIds = pointSkuList.stream().map(StockPointSkuVO::getSpuId).collect(Collectors.toList()); + removeCacheSkuWithAttrBySpuId(spuIds); + warehouseService.removeWarehouseCache(stockPointId, uidInfoBO.getTenantId(), uidInfoBO.getSysType()); + } + + @Override + public void loadSeckillStockBillLogItems(Long spuId, List filtePointList) { + List skuIds = filtePointList.stream().map(StockPointSkuDTO::getSkuId).collect(Collectors.toList()); + List skuDTOS = BeanUtil.mapAsList(listSkuAndStockBySkuIds(skuIds), SkuDTO.class); + Map> skuStockMap = filtePointList.stream().collect(Collectors.groupingBy(StockPointSkuDTO::getSkuId)); + + skuDTOS.forEach(s-> s.setStockPointList(skuStockMap.get(s.getSkuId()))); + List stockBillLogItemDTOList = loadStockBillLogItems(StockType.WAREHOUSING.value(), StockBillType.SECKILL_STOCK.value(), spuId, skuDTOS); + // 发送事件进行添加商品入库记录 + SendStatus sendStockStatus = stockBillLogTemplate.syncSend(RocketMqConstant.STOCK_BILL_LOG_TOPIC, new GenericMessage<>(stockBillLogItemDTOList)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public int countNormalSkuBySkuIds(Set skuIds) { + return skuMapper.countNormalSkuBySkuIds(skuIds); + } + + @Override + public void removeCacheSkuWithAttrBySpuId(List spuIdList) { + if (CollUtil.isEmpty(spuIdList)) { + return; + } + for (Long spuId : spuIdList) { + RedisUtil.del(CacheNames.SKU_WITH_ATTR_LIST_KEY + CacheNames.UNION + spuId); + } + } + + List addBillLogList(int stockBillType, int stockType, List stockPointSkuVOList, List skuVOS, Long shopId, Long stockPointId) { + List stockBillLogItems = new ArrayList<>(stockPointSkuVOList.size()); + Map skuMap = skuVOS.stream().collect(Collectors.toMap(SkuVO::getSkuId, s -> s)); + Long userId = AuthUserContext.get().getUserId(); + Integer sysType = AuthUserContext.get().getSysType(); + String userPhone; + if (sysType.equals(SysTypeEnum.MULTISHOP.value())) { + ServerResponseEntity userResponse = shopUserFeignClient.getByUserId(userId); + if (!userResponse.isSuccess() || userResponse.getData() == null) { + throw new LuckException("无法获取制单人手机号"); + } + userPhone = userResponse.getData().getPhone(); + } else { + ServerResponseEntity supplierResponse = supplierUserFeignClient.getByUserId(userId); + if (!supplierResponse.isSuccess() || supplierResponse.getData() == null) { + throw new LuckException("无法获取制单人手机号"); + } + userPhone = supplierResponse.getData().getPhone(); + } + stockPointSkuVOList.forEach(s -> { + SkuVO sku = skuMap.get(s.getSkuId()); + StockBillLogItemDTO stockBillLogItem = new StockBillLogItemDTO( + s.getSpuId(), + s.getSkuId(), + shopId, + null, + sku.getSpuName(), + sku.getSkuName(), + s.getStock(), + sku.getPriceFee(), + sku.getPartyCode(), + sku.getMainImgUrl() + ); + stockBillLogItem.setAfterStock(0); + stockBillLogItem.setSupplierDeliveryType(SupplierDeliveryType.SHOP_DELIVERY.value()); + stockBillLogItem.setSupplierId(null); + stockBillLogItem.setCreateTime(new Date()); + stockBillLogItem.setUpdateTime(new Date()); + stockBillLogItem.setStockBillType(stockBillType); + stockBillLogItem.setStocktype(stockType); + stockBillLogItem.setStockPointId(stockPointId == null ? s.getStockPointId() : stockPointId); + stockBillLogItem.setStockPointType(stockPointId == null ? s.getStockPointType() : StockPointType.WAREHOUSE.getValue()); + stockBillLogItem.setMakerMobile(userPhone); + if (sysType.equals(SysTypeEnum.SUPPLIER.value())) { + stockBillLogItem.setSupplierId(shopId); + stockBillLogItem.setShopId(-1L); + } + stockBillLogItems.add(stockBillLogItem); + }); + return stockBillLogItems; + } + + /** + * 检查供应商sku信息是否变更 + * @param sku 新sku + * @param dbSku 原sku + * @return 是否变更 + */ + private boolean checkSupplierSkuMsgChange(SkuDTO sku, SkuVO dbSku) { + // 检验'供货价'变化 + boolean isChange = !(Objects.isNull(sku.getPriceFee()) || Objects.equals(sku.getPriceFee(), dbSku.getPriceFee())); + // 检验'市场价'变化 + isChange = isChange + || !(Objects.isNull(sku.getMarketPriceFee()) || Objects.equals(sku.getMarketPriceFee(), dbSku.getMarketPriceFee())); + // 检验'体积'变化 + isChange = isChange + || !(Objects.isNull(sku.getVolume()) || Objects.equals(sku.getVolume(), dbSku.getVolume().doubleValue())); + // 校验'重量'变化 + isChange = isChange + || !(Objects.isNull(sku.getWeight()) || Objects.equals(sku.getWeight(), dbSku.getWeight().doubleValue())); + // 检验'sku编码'变化 + isChange = isChange + || !(Objects.isNull(sku.getPartyCode()) || Objects.equals(sku.getPartyCode(), dbSku.getPartyCode())); + return isChange; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuStockServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuStockServiceImpl.java new file mode 100644 index 0000000..7c45af9 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuStockServiceImpl.java @@ -0,0 +1,807 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.order.constant.StockModeEnum; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.order.feign.PurchaseOrderFeignClient; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.LuaOperateEnum; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.*; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.api.product.dto.WarehouseDTO; +import com.tmerclub.cloud.product.manager.StockManager; +import com.tmerclub.cloud.product.mapper.SkuMapper; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.model.SkuStock; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.util.StockUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 库存信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@Service +public class SkuStockServiceImpl implements SkuStockService { + + private static final Logger log = LoggerFactory.getLogger(SkuStockServiceImpl.class); + + + @Autowired + private SpuMapper spuMapper; + + @Autowired + private SkuMapper skuMapper; + + @Autowired + private StockManager stockManager; + + @Autowired + private StockBillLogService stockBillLogService; + + @Autowired + private SearchSpuFeignClient searchSpuFeignClient; + + @DubboReference + private PurchaseOrderFeignClient purchaseOrderFeignClient; + @Autowired + private WarehouseService warehouseService; + + @Autowired + private StockPointSkuService stockPointSkuService; + + @Autowired + private SkuComboService skuComboService; + + @Override + public void batchSave(List skuStocks, Integer spuStatus) { + // 拼接sku库存集合 + Map skuStockMap = new HashMap<>(skuStocks.size()); + // mset 批量插入sku库存数据 + for (SkuStockVO skuStock : skuStocks) { + String stockInfo = skuStock.getStock() + Constant.UNDERLINE + skuStock.getLockStock() + Constant.UNDERLINE + skuStock.getSale(); + skuStockMap.put(StockUtil.getSkuStockKey(skuStock.getSkuId(), skuStock.getStockPointId(), skuStock.getStockPointType()), stockInfo); + // dev +// String stockInfo = skuStock.getStock() + Constant.UNDERLINE + skuStock.getLockStock() + Constant.UNDERLINE + skuStock.getSale() + Constant.UNDERLINE + spuStatus; +// skuStockMap.put(StockUtil.getSkuStockKey(skuStock.getSkuId()), stockInfo); + + } + stockManager.mSet(skuStockMap); + } + + @Override + public void updateBatch(List skuList) { + if (CollUtil.isEmpty(skuList)) { + return; + } + List stockPointSkuDTOS = new ArrayList<>(Constant.INITIAL_CAPACITY); + List skuStockVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SkuDTO sku : skuList) { + if (Objects.nonNull(sku.getChangeStock())) { + sku.getStockPointList().forEach(s-> { + s.setSkuId(sku.getSkuId()); + s.setSpuId(sku.getSpuId()); + s.setStatus(sku.getStatus()); + }); + stockPointSkuDTOS.addAll(sku.getStockPointList()); + for (StockPointSkuDTO stockPointSkuDTO : sku.getStockPointList()) { +// if (stockPointSkuDTO.getStock() == 0 ) { +// list.add(CacheNames.SKU_SOCK + stockPointSkuDTO.getSkuId() + StrUtil.C_UNDERLINE + stockPointSkuDTO.getStockPointId()); +// continue; +// } + SkuStockVO stockVO = new SkuStockVO(stockPointSkuDTO.getSkuId(), stockPointSkuDTO.getStock(), stockPointSkuDTO.getStockPointId(), stockPointSkuDTO.getStockPointType()); + stockVO.setStatus(sku.getStatus()); + stockVO.setSpuId(sku.getSpuId()); + skuStockVOList.add(stockVO); + } +// list.add(StockUtil.loadQueryArray( +// sku.getSkuId(), +// StockManager.WAREHOUSE_ID, +// sku.getChangeStock(), +// sku.getChangeStock() > 0 ? StockUtil.ADD : StockUtil.SUBTRACT) +// ); + } + } +// if (true) { + if (CollUtil.isEmpty(skuStockVOList)) { + return; + } + // 修改关联数据 + stockPointSkuService.changeStockPoint(stockPointSkuDTOS, true); + Long spuId = skuStockVOList.get(0).getSpuId(); + handSkuStock(spuId, skuStockVOList, LuaOperateEnum.SKU_REPLACE, true); + // 更新库存 + // String stock = stockManager.skuStock(skuStockVOList, LuaOperateEnum.SKU_REPLACE); + // 返回skuId代表库存改变失败 +// if (!stock.contains(Constant.UNDERLINE)) { +// throw new LuckException("sku库存发生改变,请刷新后重试"); +// } + //stockManager.mDel(list); + } + + @Override + public Map listStockBySpuId(Long spuId) { + List skuIds = skuMapper.listSkuIdBySpuId(spuId); + List stockPointList = stockPointSkuService.listPointIdsBySkuIds(skuIds); + return this.mapSkuPointStockByStockPoints(stockPointList); + } + + @Override + public List listSkuStockBySupplierSpuIds(List spuIds, Long shopId) { + List skuList = skuMapper.listSupplierSkuIdBySpuId(spuIds, shopId); + return skuList; + } + + @Override + public SkuStock getBySkuId(Long skuId, Integer spuMold) { + // 获取sku总库存 + SkuStockVO skuStockVO = stockManager.getSkuTotalStock(skuId); + int stock = skuStockVO.getStock(); + if(Objects.equals(spuMold, SpuMold.COMBO.value())){ + List comboStocks = getComboSpuStockBySkuIds(Collections.singletonList(skuId)); + stock = CollectionUtil.isEmpty(comboStocks) ? 0: comboStocks.get(0).getStock(); + } + return new SkuStock(skuId, stock, skuStockVO.getLockStock()); + } + @Override + public Map spuStockMapBySpuIds(List spuIds) { + List skuList = skuMapper.listSimpleSkuBySpuIds(spuIds); + if (CollUtil.isEmpty(skuList)) { + return Collections.emptyMap(); + } + List skuIds = skuList.stream().map(SkuVO::getSkuId).collect(Collectors.toList()); + Map stockVOMap = this.mapSkuTotalStockBySkuIds(skuIds); + Map> spuMap = skuList.stream().collect(Collectors.groupingBy(SkuVO::getSpuId)); + Map spuStockMap = new HashMap<>(spuMap.size()); + for (Map.Entry> entry : spuMap.entrySet()) { + int stock = 0; + for (SkuVO skuVO : entry.getValue()) { + SkuStockVO skuStockVO = stockVOMap.get(skuVO.getSkuId()); + stock += skuStockVO.getStock(); + } + spuStockMap.put(entry.getKey(), stock); + } + return spuStockMap; + } + + @Override + public List listShopStockByPartyCodesAndShopId(List partyCodes, Long shopId) { + if (CollectionUtils.isEmpty(partyCodes)) { + return new ArrayList<>(0); + } + // 根据商品编码获取skuId列表 + List skuList = skuMapper.listSkuIdByPartyCodesAndShopId(partyCodes, shopId); + if (CollUtil.isEmpty(skuList)) { + return Collections.emptyList(); + } + List skuIds = skuList.stream().map(SkuVO::getSkuId).collect(Collectors.toList()); + Map skuStockMap = this.mapSkuTotalStockBySkuIds(skuIds); + for (SkuVO skuVO : skuList) { + if (!skuStockMap.containsKey(skuVO.getSkuId())) { + continue; + } + skuVO.setStock(skuStockMap.get(skuVO.getSkuId()).getStock()); + } + return skuList; + } + + @Override + public List listSkuStockBySkuIds(List stockPointIdList) { + return stockManager.convertSkuStock(stockPointIdList); + } + + @Override + public Map mapSkuTotalStockBySkuIds(List skuIds) { + return stockManager.mapSkuTotalStock(skuIds); + } + + @Override + public Map mapSkuPointStockByStockPoints(List stockPointSkuList) { + return stockManager.skuStockMap(stockPointSkuList); + } + + @Override + public Map mapSkuTotalStockAndPointStock(List stockPointSkuList) { + Set skuIdSet = stockPointSkuList.stream().map(StockPointSkuVO::getSkuId).collect(Collectors.toSet()); + for (Long skuId : skuIdSet) { + StockPointSkuVO stockPointSkuVO = new StockPointSkuVO(); + stockPointSkuVO.setSkuId(skuId); + stockPointSkuVO.setStockPointId(Constant.ZERO_LONG); + stockPointSkuList.add(stockPointSkuVO); + } + return stockManager.skuStockMap(stockPointSkuList); + } + + @Override + public Map skuStockMapBySkuIds(List skuIds) { + List stockPointList = stockPointSkuService.listPointIdsBySkuIds(skuIds); + return stockManager.skuStockMap(stockPointList); + } + + @Override + public void handleSkuStockChange() { + // 从redis中获取上次执行的时间,如果没有则默认为统计所有数据 + Date data = RedisUtil.get(CacheNames.SKU_CHANGE_STATISTICS_TIME); + // 当前时间 + Date currentTime = new Date(); + // 查询出入库记录,返回发生过库存变化的商品id + if (Objects.nonNull(data)) { + data = DateUtil.offsetSecond(data, -10); + } + List stockSpuIds = stockBillLogService.listSpuIdOfStockChange(data, currentTime); + // 采购订单记录 + ServerResponseEntity> purchaseResponse = purchaseOrderFeignClient.listSpuIdOfStockChange(data, currentTime); + if (!purchaseResponse.isSuccess()) { + throw new LuckException(purchaseResponse.getMsg()); + } + List purchaseSpuIds = purchaseResponse.getData(); + if (CollUtil.isEmpty(stockSpuIds) && CollUtil.isEmpty(purchaseSpuIds)) { + return; + } + Set spuIdsSet = new HashSet<>(Constant.INITIAL_CAPACITY); + spuIdsSet.addAll(stockSpuIds); + spuIdsSet.addAll(purchaseSpuIds); + List spuIds = new ArrayList<>(spuIdsSet); + List spuDbList = spuMapper.listSpuDetailBySpuIds(spuIds); + List supplierSpuIds = new ArrayList<>(); + for (SpuVO spuVO : spuDbList) { + if (Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.YES.value())) { + // 供应商商品id + supplierSpuIds.add(spuVO.getSpuId()); + } + } + + // 通过商品id查询商品下的skuId列表 + List skuList = skuMapper.listSimpleSkuBySpuIds(spuIds); + List skuIds = skuList.stream().map(SkuVO::getSkuId).collect(Collectors.toList()); + Map> spuMap = skuList.stream().collect(Collectors.groupingBy(SkuVO::getSpuId)); + // 获取sku总库存 + Map skuStockMap = this.mapSkuTotalStockBySkuIds(skuIds); + List spuList = new ArrayList<>(spuIds.size()); + Map supplierSpuMap = new HashMap<>(); + // 根据spuId获取商品sku的总库存和总销量 + for (SpuVO spuDb : spuDbList) { + List skuVOList; + if (Objects.equals(spuDb.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value()) && + Objects.equals(spuDb.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + skuVOList = spuMap.get(spuDb.getSupplierSpuId()); + } else { + skuVOList = spuMap.get(spuDb.getSpuId()); + } + if (CollUtil.isEmpty(skuVOList)) { + continue; + } + SpuVO spuVO = new SpuVO(); + spuVO.setStockWarning(0); + int saleNum = 0; + int stock = 0; + for (SkuVO skuVO : skuVOList) { + if (!skuStockMap.containsKey(skuVO.getSkuId())) { + continue; + } + SkuStockVO skuStockVO = skuStockMap.get(skuVO.getSkuId()); + // 统计es商品的总销量和总库存 + saleNum += skuStockVO.getSale(); + stock += skuStockVO.getStock(); + // 用于库存预警 + skuVO.setStock(skuStockVO.getStock()); + if (skuVO.getStockWarning() >= skuStockVO.getStock() && Objects.equals(spuVO.getStockWarning(), Constant.ZERO_INTEGER)) { + spuVO.setStockWarning(1); + } + } + + spuVO.setSpuId(spuDb.getSpuId()); + spuVO.setSaleNum(saleNum); + spuVO.setTotalStock(stock); + if (supplierSpuIds.contains(spuVO.getSpuId())) { + supplierSpuMap.put(spuVO.getSpuId(), spuVO); + } + spuList.add(spuVO); + } + // 代销商品同步供应商商品库存 + if (CollUtil.isNotEmpty(supplierSpuIds)) { + List spuIdList = spuMapper.batchSupListBySupplierId(supplierSpuIds); + for (SpuVO spuVO : spuIdList) { + if (!Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()) || !supplierSpuMap.containsKey(spuVO.getSupplierSpuId())) { + continue; + } + SpuVO supplierSpu = supplierSpuMap.get(spuVO.getSupplierSpuId()); + SpuVO spu = BeanUtil.map(supplierSpu, SpuVO.class); + spu.setSpuId(spuVO.getSpuId()); + spuList.add(spu); + } + } + + // 更新es中的商品库存、销量数据 + searchSpuFeignClient.batchUpdateStockAndSaleNum(spuList); + + // 查询sku预警数量,并更新sku预警信息 + skuMapper.batchUpdateSkuWarning(skuList); + // 更新redis中的最后一次执行时间 + RedisUtil.set(CacheNames.SKU_CHANGE_STATISTICS_TIME, currentTime, Constant.DAY_SECOND); + } + + @Override + public void initSkuStock() { + int index = 0; + // mset数量定为50, 数量太大redis性能衰减 + int size = 100; + boolean hasNext = true; + + List skuList = skuMapper.listAll(); + Map skuMap = skuList.stream().collect(Collectors.toMap(SkuVO::getSkuId, SkuVO::getStatus)); + + + while (index < skuList.size()) { + int toIndex = size + index; + if (toIndex > skuList.size()) { + toIndex = skuList.size(); + } + List skus = skuList.subList(index, toIndex); + List skuIds = skus.stream().map(SkuVO::getSkuId).toList(); + + Map stockDbMap = new HashMap<>(0); + try { + // 查询sku库存 + List skuStocks = skuMapper.listSkuStock(skuIds); + stockDbMap = skuStocks.stream().collect(Collectors.toMap(SkuStock::getSkuId, SkuStock::getStock)); + } catch (Exception e) { + log.error("获取sku库存异常", e); + } + + Map skuStockMap = stockManager.mapSkuTotalStock(skuIds); + Map map = new HashMap<>(135); + // 拼接key和value + for (SkuVO skuVO : skus) { + String stock = "0"; + SkuStockVO skuStockVO = new SkuStockVO(skuVO.getSkuId(), 0, 0, 0, 0L); + skuStockVO.setZoneNo(Constant.ZERO_INTEGER); + SkuStockVO skuStock = skuStockMap.get(skuVO.getSkuId()); + if (Objects.nonNull(skuStock)) { + skuStockVO.setStock(skuStock.getStock()); + if (Objects.nonNull(skuStockVO.getLockStock())) { + skuStockVO.setLockStock(skuStock.getLockStock()); + } + if (Objects.nonNull(skuStockVO.getSale())) { + skuStockVO.setSale(skuStock.getSale()); + } + } else if (stockDbMap.containsKey(skuVO.getSkuId())) { + skuStockVO.setStock(stockDbMap.get(skuVO.getSkuId())); + } + + Integer status = 0; + if (Objects.equals(skuMap.get(skuVO.getSkuId()), StatusEnum.ENABLE.value())) { + status = StatusEnum.ENABLE.value(); + } + String key = CacheNames.SKU_SOCK + StockManager.WAREHOUSE_ID + StrUtil.C_UNDERLINE + skuVO.getSkuId(); + String value = skuStockVO.getStock().toString() + + StrUtil.C_UNDERLINE + + skuStockVO.getLockStock() + + StrUtil.C_UNDERLINE + + skuStockVO.getSale() + + StrUtil.C_UNDERLINE + status; + map.put(key, value); + } + // 批量插入 mset + stockManager.mSet(map); + index += size; + } + } + + @Override + public void initPointStock() { + int index = 0; + // mset数量定为50, 数量太大redis性能衰减 + int size = 100; + + List skuList = skuMapper.listAll(); + + while (index < skuList.size()) { + int toIndex = size + index; + if (toIndex > skuList.size()) { + toIndex = skuList.size(); + } + List skus = skuList.subList(index, toIndex); + List skuIds = skus.stream().map(SkuVO::getSkuId).toList(); + + List stockPointSkuList = stockPointSkuService.listBySkuIds(skuIds); + Map> pointMap = stockPointSkuList.stream().collect(Collectors.groupingBy(StockPointSkuVO::getSkuId)); + List skuStockList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List stockPointSkus = new ArrayList<>(); + for (Map.Entry> entry : pointMap.entrySet()) { + stockPointSkus.addAll(entry.getValue()); + } + + // 查询旧的库存格式 + Map oldStockMap = stockManager.scan(CacheNames.SKU_SOCK + Constant.ZERO_INTEGER + Constant.UNDERLINE); + + Map skuStockMap = this.mapSkuTotalStockAndPointStock(stockPointSkus); + Map map = new HashMap<>(135); + // 拼接key和value + for (SkuVO skuVO : skus) { + // 已删除的sku不用初始化库存 + if (Objects.equals(skuVO.getStatus(), StatusEnum.DELETE.value())) { + continue; + } + // 总库存 + SkuStockVO skuStock = skuStockMap.get(skuVO.getSkuId().toString()); + int stock = 0; + int lockStock = 0; + int sale = 0; + int status = 0; + if (Objects.equals(skuVO.getStatus(), StatusEnum.ENABLE.value())) { + status = StatusEnum.ENABLE.value(); + } + + if (!pointMap.containsKey(skuVO.getSkuId())) { + continue; + } + + List stockPointSkuVOList = pointMap.get(skuVO.getSkuId()); + for (StockPointSkuVO stockPointSkuVO : stockPointSkuVOList) { + if (stockPointSkuVO.getStatus() == -1) { + continue; + } + int pointStatus = status; + SkuStockVO skuPointStock = new SkuStockVO(skuVO.getSkuId(), 0, 0, 0, stockPointSkuVO.getStockPointId()); + + // 默认仓库、库存未初始化 + if (Objects.equals(stockPointSkuVO.getType(), 0) && oldStockMap.containsKey(CacheNames.SKU_SOCK + Constant.ZERO_INTEGER + Constant.UNDERLINE + skuVO.getSkuId())) { + String stockStr = oldStockMap.get(CacheNames.SKU_SOCK + Constant.ZERO_INTEGER + Constant.UNDERLINE + skuVO.getSkuId()); + String[] split = stockStr.split(Constant.UNDERLINE); + for (int i = 0; i < split.length; i++) { + Integer num = 0; + if (StrUtil.isNotBlank(split[i]) && !StrUtil.equals(split[i], "null")) { + num = Integer.parseInt(split[i]); + } + switch (i) { + case 0 -> skuPointStock.setStock(num); + case 1 -> skuPointStock.setLockStock(num); + case 2 -> skuPointStock.setSale(num); + default -> {} + } + } + skuStockList.add(skuPointStock); + } else { + SkuStockVO skuStockPoint = skuStockMap.get(StockUtil.skuPointKey(skuVO.getSkuId(), stockPointSkuVO.getStockPointId())); + if (Objects.nonNull(skuStockPoint) && !Objects.equals(skuStock.getStatus(), StatusEnum.DELETE.value())) { + if (status > 0 && Objects.equals(stockPointSkuVO.getStockMode(), StockModeEnum.ALL_STOCK.value())) { + pointStatus = 0; + } + skuPointStock.setStock(skuStockPoint.getStock()); + if (Objects.nonNull(skuStockPoint.getLockStock())) { + skuPointStock.setLockStock(skuStockPoint.getLockStock()); + } + if (Objects.nonNull(skuStockPoint.getSale())) { + skuPointStock.setSale(skuStockPoint.getSale()); + } + } + if (Objects.isNull(skuStockPoint.getStatus()) || Objects.equals(skuStockPoint.getStatus(), StatusEnum.DELETE.value())) { + skuStockList.add(skuPointStock); + } + } + skuPointStock.setStatus(pointStatus); + lockStock += skuPointStock.getLockStock(); + sale += skuPointStock.getSale(); + stock = stock + skuPointStock.getStock(); + } + + skuStock = new SkuStockVO(skuVO.getSkuId(), stock, lockStock, sale, 0L); + skuStock.setStatus(status); + skuStockList.add(skuStock); + } + for (SkuStockVO skuStockVO : skuStockList) { + String key = CacheNames.SKU_SOCK + skuStockVO.getSkuId(); + if (skuStockVO.getStockPointId() > 0) { + key = key + StrUtil.C_UNDERLINE + skuStockVO.getStockPointId(); + } + String value = skuStockVO.getStock().toString() + + StrUtil.C_UNDERLINE + + skuStockVO.getLockStock() + + StrUtil.C_UNDERLINE + + skuStockVO.getSale() + + StrUtil.C_UNDERLINE + skuStockVO.getStatus(); + map.put(key, value); + } + if (MapUtil.isNotEmpty(map)) { + // 批量插入 mset + stockManager.mSet(map); + } + List deleteKeys = new ArrayList<>(skuIds.size()); + for (Long skuId : skuIds) { + deleteKeys.add(CacheNames.SKU_SOCK + Constant.ZERO_INTEGER + Constant.UNDERLINE + skuId); + } + stockManager.mDel(deleteKeys); + + index += size; + } + } + + + @Override + public void changeSkuStatus(List skuStockList) { + stockManager.changeSkuStatus(skuStockList); + + } + + /** + * 处理一下库存关联商品数据,分别计算新增,修改,删除 + * @param skuStockList + * @param spuId + * @param luaOperateEnum 区分修改的添加还是替换 + */ + @Override + public void handSkuStock(Long spuId, List skuStockList, LuaOperateEnum luaOperateEnum, Boolean hasUserPickUp) { + // 获取之前的关联数据 + List skuIds = skuMapper.listSkuIdBySpuId(spuId); + List stockPointList = stockPointSkuService.listPointIdsBySkuIds(skuIds); + Map skuStockMap = this.mapSkuPointStockByStockPoints(stockPointList); + + Long deafultId = warehouseService.getDefaultWarehouseByShopId(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()).getWarehouseId(); + List updateList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List deleteKey = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 需要删除的关联库存点 + List deleteSkuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SkuStockVO skuStockVO : skuStockList) { + String key = StockUtil.skuPointKey(skuStockVO.getSkuId(), skuStockVO.getStockPointId()); + SkuStockVO skuStockRb = skuStockMap.remove(key); + if (skuStockVO.getStockPointId() == 0) { + // 总库存不需要修改 + continue; + } + // 获取数据的时候将sku中包含的库存删掉,剩下不包含在列表中的库存就是要删除的 + if (!skuStockVO.getStockPointId().equals(deafultId) && (skuStockVO.getStock() == 0 || skuStockVO.getStock() == null)) { + //deleteKey.add(StockUtil.skuPointKey(skuStockVO.getSkuId(), skuStockVO.getStockPointId())); + deleteKey.add(new SkuStockVO(skuStockVO.getSkuId(), 0, skuStockVO.getStockPointId(), null)); + continue; + } + if (Objects.isNull(skuStockRb) || Objects.equals(skuStockRb.getStatus(), StatusEnum.DELETE.value())) { + // 插入 + skuStockVO.setStatus(StatusEnum.ENABLE.value()); + skuStockVO.setOperateType(LuaOperateEnum.SKU_INSERT.value()); + updateList.add(skuStockVO); + } else { + // 更新 + skuStockVO.setOperateType(luaOperateEnum.value()); + updateList.add(skuStockVO); + } + } + // 此处都是sku库存列表中没有包含的区域库存信息,全部删除 - 不要用stockManager.mDel()去删,用lua脚本,不然sku总库存数量不会同步更改 + for (Map.Entry entry : skuStockMap.entrySet()) { + SkuStockVO skuStockVO = entry.getValue(); + // deleteKey.add(StockUtil.skuPointKey(skuStockVO.getSkuId(), skuStockVO.getStockPointId())); + SkuStockVO stockVO = new SkuStockVO(skuStockVO.getSkuId(), skuStockVO.getStock(), skuStockVO.getStockPointId(), null); + for (StockPointSkuVO pointSkuVO : stockPointList) { + if (pointSkuVO.getSkuId().equals(skuStockVO.getSkuId()) && pointSkuVO.getStockPointId().equals(skuStockVO.getStockPointId())) { + deleteSkuIds.add(pointSkuVO.getStockPointSkuId()); + stockVO.setStock(0); + } + } + deleteKey.add(stockVO); + } + if (CollectionUtil.isNotEmpty(updateList)) { + String updateStock = stockManager.skuStock(updateList, null); + if (!updateStock.contains(Constant.UNDERLINE)) { + throw new LuckException("sku库存发生改变,请刷新后重试"); + } + } + if (luaOperateEnum == LuaOperateEnum.SKU_REPLACE) { + // 如果是新增的话,就不需要删除之前的 + stockManager.skuStock(deleteKey, LuaOperateEnum.SKU_REPLACE); + stockPointSkuService.batchDeleteByStockPointSkuIdList(deleteSkuIds); + } + List statusList = skuStockList.stream().filter(skuStockVO -> + Objects.nonNull(skuStockVO.getStockPointType()) && skuStockVO.getStockPointType() == StockPointType.STATION.getValue()).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(statusList)) { + return; + } + if (hasUserPickUp) { + statusList.forEach(s-> s.setStatus(1)); + } else { + // 如果没开启自提,门店库存下架 + statusList.forEach(s-> s.setStatus(0)); + } + // 门店库存更新一下状态 + String updateStock = stockManager.skuStock(statusList, LuaOperateEnum.SKU_POINT_STATUS); + if (!updateStock.contains(Constant.UNDERLINE)) { + throw new LuckException("sku库存发生改变,请刷新后重试"); + } + } + + @Override + public void changeSkuStock(List skuStockVOList) { + if (CollectionUtils.isEmpty(skuStockVOList)) { + return; + } + Set stockPointIds = new HashSet<>(Constant.INITIAL_CAPACITY); + Set skuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (SkuStockVO skuStockVO : skuStockVOList) { + stockPointIds.add(skuStockVO.getStockPointId()); + skuIds.add(skuStockVO.getSkuId()); + } + // 查询仓库 + WarehouseDTO warehouseDTO = new WarehouseDTO(); + warehouseDTO.setWarehouseIds(new ArrayList<>(stockPointIds)); + List warehouses = warehouseService.listWarehouse(warehouseDTO); + if (CollectionUtils.isEmpty(warehouses)) { + throw new LuckException("仓库不存在"); + } + Map warehouseMap = warehouses.stream().collect(Collectors.toMap(WarehouseVO::getWarehouseId, x -> x)); + // 查询商品sku + SkuDTO skuDTO = new SkuDTO(); + skuDTO.setSkuIds(new ArrayList<>(skuIds)); + List skus = skuMapper.listSku(skuDTO); + if (CollectionUtils.isEmpty(skus)) { + return; + } + Map skuMap = skus.stream().collect(Collectors.toMap(SkuVO::getSkuId, x -> x)); + // 查询redis区域库存 + Map skuStockMap = stockManager.mapSkuStockBySkuStocks(skuStockVOList); + // 查询仓库与商品关联(转成Map,key格式为:skuId_stockPointId) + StockPointSkuDTO stockPointSkuDTO = new StockPointSkuDTO(); + stockPointSkuDTO.setSkuIds(new ArrayList<>(skuIds)); + stockPointSkuDTO.setStockPointIds(new ArrayList<>(stockPointIds)); + List stockPointSkus = stockPointSkuService.listStockPointSku(stockPointSkuDTO); + Map stockPointSkuMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(stockPointSkus)) { + stockPointSkuMap = stockPointSkus.stream().collect(Collectors.toMap(k -> StockUtil.skuPointKey(k.getSkuId(), k.getStockPointId()), v -> v)); + } + // 找出新增or删除的数据 + List insertData = new ArrayList<>(Constant.INITIAL_CAPACITY); + List deleteData = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SkuStockVO skuStockVO : skuStockVOList) { + WarehouseVO warehouseVO = warehouseMap.get(skuStockVO.getStockPointId()); + if (Objects.isNull(warehouseVO)) { + throw new LuckException(String.format("仓库[%s]不存在", skuStockVO.getStockPointId())); + } + SkuVO skuVO = skuMap.get(skuStockVO.getSkuId()); + if (Objects.isNull(skuVO)) { + continue; + } + String key = StockUtil.skuPointKey(skuStockVO.getSkuId(), skuStockVO.getStockPointId()); + SkuStockVO skuStock = skuStockMap.get(key); + StockPointSkuVO stockPointSku = stockPointSkuMap.get(key); + if (Objects.equals(skuStockVO.getOperateType(), LuaOperateEnum.SKU_ADD.value())) { + // 增加库存 --- 库存不存在,插入redis库存;关联不存在,新增仓库商品关联 + if (Objects.isNull(skuStock) + || Objects.equals(skuStock.getStatus(), -1)) { + skuStockVO.setOperateType(LuaOperateEnum.SKU_INSERT.value()); + skuStockVO.setStatus(skuVO.getStatus()); + } + if (Objects.isNull(stockPointSku)) { + stockPointSkuDTO = new StockPointSkuDTO(); + BeanUtils.copyProperties(skuStockVO, stockPointSkuDTO); + stockPointSkuDTO.setStatus(skuVO.getStatus()); + stockPointSkuDTO.setType(warehouseVO.getType()); + stockPointSkuDTO.setStockPointType(Objects.equals(warehouseVO.getSysType(), SysTypeEnum.STATION.value()) ? StockPointType.STATION.getValue() : StockPointType.WAREHOUSE.getValue()); + insertData.add(stockPointSkuDTO); + } + } else if (Objects.equals(skuStockVO.getOperateType(), LuaOperateEnum.SKU_SUB.value())){ + // 减少库存 --- 判断库存是否充足;若扣减后库存为0,非默认仓库需要删除仓库商品关联 + if (Objects.isNull(skuStock) + || skuStock.getStock() < skuStockVO.getStock()) { + throw new LuckException(String.format("仓库[%s]中skuId[%s]库存不足", skuStockVO.getStockPointId(), skuStockVO.getSkuId())); + } + if (Objects.equals(skuStock.getStock(), skuStockVO.getStock()) + && !Objects.equals(warehouseVO.getType(), 0) + && !Objects.isNull(stockPointSku)) { + deleteData.add(stockPointSku.getStockPointSkuId()); + } + } + } + // 新增仓库商品关联数据 + if (!CollectionUtils.isEmpty(insertData)) { + log.info("新增仓库商品关联数据"); + stockPointSkuService.batchSave(insertData); + } + // 删除仓库商品关联数据 + if (!CollectionUtils.isEmpty(deleteData)) { + log.info("删除仓库商品关联数据"); + stockPointSkuService.deleteByIds(deleteData); + } + // 修改redis库存 + stockManager.skuStock(skuStockVOList, null); + } + + @Override + public void addStockPointBySpuId(Long spuId, List stockPointSkuVOList) { + // 过滤一下已经被删除的仓库和门店或改为共享模式的门店 + List filtePointList = stockPointSkuService.filtePoint(stockPointSkuVOList); + // 处理关联数据 + stockPointSkuService.changeStockPoint(filtePointList, false); + // 修改redis缓存 + List skuStockList = new ArrayList<>(filtePointList.size()); + for (StockPointSkuDTO stockPointSku : filtePointList) { + skuStockList.add(new SkuStockVO(stockPointSku.getSkuId(), stockPointSku.getStock(), null, null, stockPointSku.getStockPointId())); + } + handSkuStock(spuId, skuStockList, LuaOperateEnum.SKU_ADD, true); + } + + public List getComboSpuStockBySkuIds(List skuIds) { + List returnStockList = new ArrayList<>(); + List skuComboList = skuComboService.getCombSpusBySkuIds(skuIds); + if(CollectionUtils.isEmpty(skuComboList)){ + return new ArrayList<>(); + } + // 获取所有组合的商品库存 + List comboSkuIds = skuComboList.stream().map(SkuComboVO::getComboSkuId).toList(); + List stockPointList = stockPointSkuService.listPointIdsBySkuIds(comboSkuIds); + // 获取库存 + List skuStockList = listSkuStockBySkuIds(stockPointList); + Map> skuStockMap = skuStockList.stream().collect(Collectors.groupingBy(SkuStockVO::getSkuId)); + Map> skuComboMap = skuComboList.stream().collect(Collectors.groupingBy(SkuComboVO::getSkuId)); + + for (Long skuId : skuIds) { + if(!skuComboMap.containsKey(skuId)){ + continue; + } + Map pointStockMap = new HashMap<>(stockPointList.size()); + List comboSpuList = skuComboMap.get(skuId); + // 当前sku的组合商品列表 + for (SkuComboVO skuComboVO : comboSpuList) { + if(!skuStockMap.containsKey(skuComboVO.getComboSkuId())){ + continue; + } + // 当前组合商品的所有仓库库存列表 + List stockList = skuStockMap.get(skuComboVO.getComboSkuId()); + for (SkuStockVO skuStockVO : stockList) { + // 如果是0就是总库存 + if(Objects.equals(skuStockVO.getStockPointId(),StockManager.WAREHOUSE_ID)){ + skuComboVO.setStock(skuStockVO.getStock()); + continue; + } + // 除以组合数量向下取整得出 当前的组合商品-当前仓库 可用库存 + int pointStock = Math.floorDiv(skuStockVO.getStock() , skuComboVO.getComboCount()); + // 组合商品的库存取最小值,比如都是默认仓库的情况下,取最小值 + if(!pointStockMap.containsKey(skuStockVO.getStockPointId()) || pointStockMap.get(skuStockVO.getStockPointId()) > pointStock) { + pointStockMap.put(skuStockVO.getStockPointId(), pointStock); + } + } + } + // 累加上sku的所有组合商品的所有仓库的库存最小值,就是当前sku可用的最小库存 + int totalStock = 0; + for (Long pointId : pointStockMap.keySet()) { + totalStock += pointStockMap.get(pointId); + } + returnStockList.add(new SkuStockVO(skuId,totalStock)); + } + return returnStockList; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuCommServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuCommServiceImpl.java new file mode 100644 index 0000000..695476e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuCommServiceImpl.java @@ -0,0 +1,745 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.constant.EsRenovationProductSortEnum; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderCommFeignClient; +import com.tmerclub.cloud.api.product.bo.SpuSimpleBO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.mongodb.util.MongoPageUtil; +import com.tmerclub.cloud.common.order.vo.OrderItemLangVO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.product.bo.mongo.MongoSpuCommBO; +import com.tmerclub.cloud.product.constant.DistributedIdKey; +import com.tmerclub.cloud.product.dto.SpuCommDTO; +import com.tmerclub.cloud.product.model.SpuComm; +import com.tmerclub.cloud.product.service.SpuCommService; +import com.tmerclub.cloud.product.service.SpuExtensionService; +import com.tmerclub.cloud.product.service.SpuService; +import com.tmerclub.cloud.product.vo.SpuCommStatisticsStarVO; +import com.tmerclub.cloud.product.vo.SpuCommStatisticsVO; +import com.tmerclub.cloud.product.vo.SpuCommVO; +import com.tmerclub.cloud.product.vo.mongo.MongoSpuCommStatisticsVO; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.dubbo.config.annotation.DubboReference; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * 商品评论 + * + * @author YXF + * @date 2021-01-11 13:47:33 + */ +@Service +public class SpuCommServiceImpl implements SpuCommService { + + private static final Logger logger = LoggerFactory.getLogger(SpuCommServiceImpl.class); + + + @Autowired + private SpuService spuService; + + + @Autowired + private SpuExtensionService spuExtensionService; + + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private SegmentManager segmentManager; + @Autowired + private MongoPageUtil mongoPageUtil; + @Autowired + private RedissonClient redissonClient; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @DubboReference + private UserFeignClient userFeignClient; + @DubboReference + private OrderCommFeignClient orderCommFeignClient; + + @Override + public PageVO page(PageDTO pageDTO, SpuCommDTO spuCommDTO) { + PageVO result = shopPage(pageDTO, spuCommDTO); + if (CollUtil.isEmpty(result.getList())) { + return result; + } + List spuIds = result.getList().stream().map(SpuCommVO::getSpuId).collect(Collectors.toList()); + List userIds = result.getList().stream().map(SpuCommVO::getUserId).collect(Collectors.toList()); + List spus = spuService.listSpuBySpuIds(spuIds); + Map spuNameMap = spus.stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getName)); + Map spuImgMap = spus.stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getMainImgUrl)); + ServerResponseEntity> userResponse = userFeignClient.getUserByUserIds(userIds); + Map nickNameMap = userResponse.getData().stream().collect(Collectors.toMap(UserApiVO::getUserId, UserApiVO::getNickName)); + for (SpuCommVO spuCommVO : result.getList()) { + spuCommVO.setSpuName(spuNameMap.get(spuCommVO.getSpuId())); + spuCommVO.setNickName(Objects.equals(spuCommVO.getIsAnonymous(), 1) ? null : nickNameMap.get(spuCommVO.getUserId())); + spuCommVO.setSpuImg(spuImgMap.get(spuCommVO.getSpuId())); + } + return result; + } + + @Override + public SpuCommVO getBySpuCommId(Long spuCommId) { + Criteria criteria = Criteria.where("_id").is(spuCommId); + + return getOne(criteria); + } + + @Override + public void save(MongoSpuCommBO mongoSpuCommBO) { + // 设置id + // 获取订单id列表 + if (StrUtil.isBlank(mongoSpuCommBO.getPics())) { + mongoSpuCommBO.setPics(null); + } + mongoSpuCommBO.setSpuCommId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_PRODUCT_COMM)); + mongoTemplate.save(mongoSpuCommBO); + } + + @Override + public void update(SpuCommDTO spuComm) { + spuComm.setStatus(1); + spuComm.setReplyTime(new Date()); + MongoSpuCommBO mongoSpuCommBO = BeanUtil.map(spuComm, MongoSpuCommBO.class); + mongoTemplate.save(mongoSpuCommBO); + } + + @Override + public void deleteById(Long spuCommId) { + Criteria criteria = Criteria.where("_id").is(spuCommId); + mongoTemplate.remove(new Query(criteria), MongoSpuCommBO.class); + } + + @Override + public PageVO spuCommPage(PageDTO pageDTO, Long spuId, Integer evaluate) { + PageVO spuCommPage = spuPage(pageDTO, spuId, evaluate); + if (CollectionUtil.isEmpty(spuCommPage.getList())) { + return spuCommPage; + } + // + Set userIds = new HashSet<>(Constant.INITIAL_CAPACITY); + Set orderItemIds = new HashSet<>(Constant.INITIAL_CAPACITY); + spuCommPage.getList().forEach(spuComm -> { + orderItemIds.add(spuComm.getOrderItemId()); + // 非匿名评价 + if (!Objects.equals(spuComm.getIsAnonymous(), SpuComm.ANONYMOUS)) { + userIds.add(spuComm.getUserId()); + } + }); + ServerResponseEntity> orderItemRes = orderCommFeignClient.listOrderItemLangByIds(new ArrayList<>(orderItemIds)); + ServerResponseEntity> userResponse = userFeignClient.getUserByUserIds(new ArrayList<>(userIds)); + Map userMap = userResponse.getData().stream().collect(Collectors.toMap(UserApiVO::getUserId, u -> u)); + Map> orderItemLangMap; + Integer lang = I18nMessage.getLang(); + if (CollUtil.isNotEmpty(orderItemRes.getData())) { + orderItemLangMap = orderItemRes.getData().stream().collect(Collectors.groupingBy(OrderItemLangVO::getOrderItemId)); + } else { + orderItemLangMap = new HashMap<>(Constant.INITIAL_CAPACITY); + } + spuCommPage.getList().forEach(spuComm -> { + // 获取sku名称 + if(orderItemLangMap.containsKey(spuComm.getOrderItemId())) { + List orderItemLangList = orderItemLangMap.get(spuComm.getOrderItemId()); + Map itemLangMap = orderItemLangList.stream().collect(Collectors.toMap(OrderItemLangVO::getLang, o -> o)); + // 如果不存在当前语言,直接默认用中文 + if (itemLangMap.containsKey(lang)) { + spuComm.setSkuName(itemLangMap.get(lang).getSkuName()); + } else if (itemLangMap.containsKey(LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + spuComm.setSkuName(itemLangMap.get(LanguageEnum.LANGUAGE_ZH_CN.getLang()).getSkuName()); + } + } + if (!Objects.equals(spuComm.getIsAnonymous(), SpuComm.ANONYMOUS)) { + UserApiVO userVO = userMap.get(spuComm.getUserId()); + if (Objects.nonNull(userVO)) { + spuComm.setNickName(userVO.getNickName()); + spuComm.setUserPic(userVO.getPic()); + } else { + // 没有用户信息说明用户已注销 + spuComm.setIsWriteOff(true); + } + } + }); + return spuCommPage; + } + + @Override + public SpuCommStatisticsVO getProdCommDataBySpuId(Long spuId) { + MatchOperation matchOperation = Aggregation.match(Criteria.where("spuId").is(spuId).and("status").is(1)); + + ProjectionOperation projectionOperation = Aggregation.project() + .and(ConditionalOperators.when(Criteria.where("evaluate").in(1)).then(1).otherwise(0)).as("praiseNumber") + .and(ConditionalOperators.when(Criteria.where("evaluate").in(2)).then(1).otherwise(0)).as("secondaryNumber") + .and(ConditionalOperators.when(Criteria.where("evaluate").in(3)).then(1).otherwise(0)).as("negativeNumber") + .and(ConditionalOperators.ifNull("pics").then(1)).as("picNumber"); + + + GroupOperation groupOperation = Aggregation.group() + .count().as("number") + .sum("praiseNumber").as("praiseNumber") + .sum("secondaryNumber").as("secondaryNumber") + .sum("negativeNumber").as("negativeNumber") + .sum(ConditionalOperators.when(Criteria.where("picNumber").ne(1)).then(1).otherwise(0)).as("picNumber"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoSpuCommStatisticsVO.class, + matchOperation, + projectionOperation, + groupOperation + ); + logger.info("构建getProdCommDataBySpuId()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoSpuCommStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + SpuCommStatisticsVO spuCommStatistics; + if (CollUtil.isEmpty(list)) { + spuCommStatistics = new SpuCommStatisticsVO(); + } else { + spuCommStatistics = BeanUtil.map(list.get(0), SpuCommStatisticsVO.class); + } + if (Objects.isNull(spuCommStatistics.getNumber())) { + spuCommStatistics.setNumber(0); + } + if (Objects.isNull(spuCommStatistics.getPraiseNumber())) { + spuCommStatistics.setPraiseNumber(0); + } + if (Objects.isNull(spuCommStatistics.getSecondaryNumber())) { + spuCommStatistics.setSecondaryNumber(0); + } + if (Objects.isNull(spuCommStatistics.getNegativeNumber())) { + spuCommStatistics.setNegativeNumber(0); + } + if (Objects.isNull(spuCommStatistics.getPositiveRating())) { + spuCommStatistics.setPositiveRating(0.0D); + } + if (Objects.isNull(spuCommStatistics.getPicNumber())) { + spuCommStatistics.setPicNumber(0); + } + + //计算出好评率 + if (spuCommStatistics.getPraiseNumber() == 0 || spuCommStatistics.getNumber() == 0) { + spuCommStatistics.setPositiveRating(0.0); + return spuCommStatistics; + } + spuCommStatistics.setPositiveRating(Arith.div(Arith.mul(spuCommStatistics.getPraiseNumber(), 100), spuCommStatistics.getNumber(), 2)); + return spuCommStatistics; + } + + @Override + public SpuCommStatisticsStarVO getProdCommDataByStar(Long spuId) { + + MatchOperation matchOperation = Aggregation.match(Criteria.where("spuId").is(spuId).and("status").is(1)); + + ProjectionOperation projectionOperation = Aggregation.project("actualTotal", "platformAmount", "refundStatus") + .and(ConditionalOperators.when(Criteria.where("score").in(5)).then(1).otherwise(0)).as("fiveStarsNumber") + .and(ConditionalOperators.when(Criteria.where("score").in(4)).then(1).otherwise(0)).as("fourStarsNumber") + .and(ConditionalOperators.when(Criteria.where("score").in(3)).then(1).otherwise(0)).as("threeStarsNumber") + .and(ConditionalOperators.when(Criteria.where("score").in(2)).then(1).otherwise(0)).as("twoStarsNumber") + .and(ConditionalOperators.when(Criteria.where("score").in(1)).then(1).otherwise(0)).as("oneStarsNumber"); + + GroupOperation groupOperation = Aggregation.group() + .sum("fiveStarsNumber").as("fiveStarsNumber") + .sum("fourStarsNumber").as("fourStarsNumber") + .sum("threeStarsNumber").as("threeStarsNumber") + .sum("twoStarsNumber").as("twoStarsNumber") + .sum("oneStarsNumber").as("oneStarsNumber"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoSpuCommStatisticsVO.class, + matchOperation, + projectionOperation, + groupOperation + ); + logger.info("构建getProdCommDataByStar()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoSpuCommStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + SpuCommStatisticsStarVO spuCommStatisticsStarVO; + if (CollUtil.isEmpty(list)) { + spuCommStatisticsStarVO = new SpuCommStatisticsStarVO(); + } else { + spuCommStatisticsStarVO = BeanUtil.map(list.get(0), SpuCommStatisticsStarVO.class); + } + if (Objects.isNull(spuCommStatisticsStarVO.getFiveStarsNumber())) { + spuCommStatisticsStarVO.setFiveStarsNumber(0); + } + if (Objects.isNull(spuCommStatisticsStarVO.getTwoStarsNumber())) { + spuCommStatisticsStarVO.setTwoStarsNumber(0); + } + if (Objects.isNull(spuCommStatisticsStarVO.getThreeStarsNumber())) { + spuCommStatisticsStarVO.setThreeStarsNumber(0); + } + if (Objects.isNull(spuCommStatisticsStarVO.getFourStarsNumber())) { + spuCommStatisticsStarVO.setFourStarsNumber(0); + } + if (Objects.isNull(spuCommStatisticsStarVO.getOneStarsNumber())) { + spuCommStatisticsStarVO.setOneStarsNumber(0); + } + return spuCommStatisticsStarVO; + } + + @SuppressWarnings("unchecked") + @Override + public List getCommNumRankShopIdAndTime(String key, Long shopId, Integer dayNum, Integer expireTime, Integer esRenovationSpuSort, Long primaryCategoryId) { + List spuIds = RedisUtil.getListRange(key, 0L, 10L); + + if (CollectionUtil.isNotEmpty(spuIds)) { + return spuIds; + } + // 加锁,防止缓存击穿 + RLock rLock = redissonClient.getLock("redisson_lock:comm_num_rank:" + key); + try { + int lockWait = 30; + if (rLock.tryLock(lockWait, lockWait, TimeUnit.SECONDS)) { + spuIds = RedisUtil.getListRange(key, 0L, 10L); + if (CollectionUtil.isEmpty(spuIds)) { + List list = listMongoSpuCommStatistics(shopId, dayNum, esRenovationSpuSort); + spuIds = list.stream().map(MongoSpuCommStatisticsVO::getSpuId).collect(Collectors.toList()); + if (CollUtil.isEmpty(spuIds) || Objects.isNull(primaryCategoryId)) { + return spuIds; + } + handleCategoryId(primaryCategoryId, spuIds); + } + } else { + throw new LuckException("网络繁忙,请稍后再试"); + } + } catch (InterruptedException e) { + logger.error("InterruptedException:", e); + } finally { + try { + if (rLock.isLocked()) { + rLock.unlock(); + } + } catch (Exception e) { + logger.error("Exception:", e); + } + } + return spuIds; + } + + private void handleCategoryId(Long primaryCategoryId, List spuIds) { + ProductSearchDTO productSearchDTO = new ProductSearchDTO(); + productSearchDTO.setPageSize(PageDTO.MAX_PAGE_SIZE); + productSearchDTO.setPageNum(PageDTO.DEFAULT_PAGE_NUM); + productSearchDTO.setSpuIds(spuIds); + ServerResponseEntity> searchResponse = searchSpuFeignClient.adminPage(productSearchDTO); + if (!searchResponse.isSuccess()) { + throw new LuckException(searchResponse.getMsg()); + } + List spuList = searchResponse.getData().getList(); + if (CollUtil.isNotEmpty(spuList)) { + Map categoryMap = spuList.stream().collect(Collectors.toMap(SpuAdminVO::getSpuId, SpuAdminVO::getPrimaryCategoryId)); + Iterator iterator = spuIds.iterator(); + while (iterator.hasNext()) { + Long spuId = iterator.next(); + Long categoryId = categoryMap.get(spuId); + if (!Objects.equals(categoryId, primaryCategoryId)) { + iterator.remove(); + } + } + } + } + + private List listMongoSpuCommStatistics(Long shopId, Integer dayNum, Integer esRenovationSpuSort) { + Date time = null; + if (dayNum != 0) { + time = DateUtil.offsetDay(new DateTime(), -dayNum); + } + // 过滤 + Criteria criteria = null; + if (Objects.nonNull(time)) { + if (Objects.isNull(shopId) || Objects.equals(shopId, 0L)) { + criteria = Criteria.where("createTime").gt(time); + } else { + criteria = Criteria.where("createTime").gt(time).and("shopId").is(shopId); + } + } else { + if (Objects.nonNull(shopId) && !Objects.equals(shopId, 0L)) { + criteria = Criteria.where("shopId").is(shopId); + } + } + // 分组 + GroupOperation spuIdGroupOperation = Aggregation.group("spuId").count().as("number"); + ProjectionOperation projectionOperation = Aggregation.project("number") + .and("_id").as("spuId"); + Sort.Direction sort; + if (Objects.equals(esRenovationSpuSort, EsRenovationProductSortEnum.COMMENT_NUM_DESC.value())) { + sort = Sort.Direction.DESC; + } else { + sort = Sort.Direction.ASC; + } + SortOperation sortOperation = Aggregation.sort(sort, "number"); + TypedAggregation typedAggregation; + if (Objects.nonNull(criteria)) { + // 按顺序组合每一个聚合步骤 + typedAggregation = + Aggregation.newAggregation( + MongoSpuCommStatisticsVO.class, + Aggregation.match(criteria), + spuIdGroupOperation, + projectionOperation, + sortOperation, + Aggregation.limit(1000) + ); + } else { + // 按顺序组合每一个聚合步骤 + typedAggregation = + Aggregation.newAggregation( + MongoSpuCommStatisticsVO.class, + spuIdGroupOperation, + sortOperation, + projectionOperation, + Aggregation.limit(1000) + ); + } + logger.info("getTradeRetained()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoSpuCommStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + return CollectionUtil.isEmpty(list) ? new ArrayList<>(0) : list; + } + + @Override + public PageVO spuCommPageByUserId(PageDTO pageDTO, Long userId) { + PageVO page = userPage(pageDTO, userId); + ServerResponseEntity userResponse = userFeignClient.getUserData(userId); + UserApiVO userApiVO = userResponse.getData(); + for (SpuCommVO spuCommVO : page.getList()) { + spuCommVO.setNickName(userApiVO.getNickName()); + spuCommVO.setPics(userApiVO.getPic()); + } + return page; + } + + @Override + public List getSpuCommByOrderItemId(List orderItemIds, Long userId) { + Criteria criteria = Criteria.where("userId").is(userId).and("orderItemId").in(orderItemIds); + List spuCommVOList = getList(criteria); + logger.info("语言lang{}:" + I18nMessage.getLang().toString()); + ServerResponseEntity> orderItemVOList = orderCommFeignClient.getListByOrderItemId(orderItemIds, I18nMessage.getLang()); + if (!orderItemVOList.isSuccess()) { + throw new LuckException("获取订单信息出错"); + } + Map itemMap = orderItemVOList.getData().stream().collect(Collectors.toMap(OrderItemVO::getOrderItemId, s -> s)); + List spuIds = spuCommVOList.stream().map(SpuCommVO::getSpuId).collect(Collectors.toList()); + List spuVOList = spuService.listSpuDetailBySpuIds(spuIds); + Map spuMap = spuVOList.stream().distinct().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getMainImgUrl)); + for (SpuCommVO spuCommVO : spuCommVOList) { + spuCommVO.setSpuImg(spuMap.get(spuCommVO.getSpuId())); + spuCommVO.setTransactionTime(itemMap.get(spuCommVO.getOrderItemId()).getCreateTime()); + if (!itemMap.containsKey(spuCommVO.getOrderItemId())){ + continue; + } + spuCommVO.setSkuName(itemMap.get(spuCommVO.getOrderItemId()).getSkuName()); + } + return spuCommVOList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void comm(SpuCommDTO spuCommDTO) { + OrderItemVO orderItemVO = this.checkAndSetComm(spuCommDTO); + orderCommFeignClient.updateOrderItemComm(orderItemVO); + } + + @Override + public void comms(List spuCommDTOList) { + if (CollectionUtils.isEmpty(spuCommDTOList)) { + return; + } + List orderItemVOList = spuCommDTOList.stream() + .map(this::checkAndSetComm) + .collect(Collectors.toList()); + orderCommFeignClient.updateOrderItemComms(orderItemVOList); + } + + /** + * 校验并设置评论 + * @param spuCommDTO + * @return + */ + private OrderItemVO checkAndSetComm(SpuCommDTO spuCommDTO) { + ServerResponseEntity orderItemResponse = orderCommFeignClient.getByOrderItemId(spuCommDTO.getOrderItemId()); + if (!orderItemResponse.isSuccess()) { + throw new LuckException(orderItemResponse.getMsg()); + } + OrderItemVO orderItemVO = orderItemResponse.getData(); + int refundStatus = 4; + if (Objects.nonNull(orderItemVO.getRefundStatus()) && !Objects.equals(refundStatus, orderItemVO.getRefundStatus())) { + throw new LuckException("[" + orderItemVO.getSpuName() + "]" + "该商品正在进行售后处理,不能进行评价!"); + } + Long spuId = getSpuIdByOrderItemId(spuCommDTO.getOrderItemId()); + // 保存商品评论 + MongoSpuCommBO spuComm = saveSpuComm(spuId, spuCommDTO); + // 更新商品扩展信息表商品评价数量 + spuExtensionService.changeCommentNum(spuId, 1); + + // 更新订单项评论状态 + orderItemVO.setUpdateTime(spuComm.getCreateTime()); + orderItemVO.setCommTime(spuComm.getCreateTime()); + orderItemVO.setIsComm(Constant.IS_COMM); + orderItemVO.setUpdateTime(new Date()); + return orderItemVO; + } + + @Override + public Integer countGoodReview(Long spuId) { + // 过滤 + Criteria criteria = Criteria.where("spuId").is(spuId).and("evaluate").is(1).and("status").is(1); + MatchOperation matchOperation = Aggregation.match(criteria); + // 分组计算数量 + GroupOperation groupOperation = Aggregation.group() + .count().as("number"); + + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoSpuCommStatisticsVO.class, + matchOperation, + groupOperation + ); + logger.info("构建countGoodReview()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoSpuCommStatisticsVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return 0; + } + Integer number = list.get(0).getNumber(); + if (Objects.isNull(number)) { + number = 0; + } + return number; + } + + /** + * 获取评论的spuId,同时校验评论的 + * + * @param orderItemId + * @return + */ + private Long getSpuIdByOrderItemId(Long orderItemId) { + ServerResponseEntity orderResponse = orderCommFeignClient.getSpuIdByOrderItemId(orderItemId); + if (!orderResponse.isSuccess()) { + throw new LuckException(orderResponse.getMsg()); + } + long spuId; + try { + spuId = Long.parseLong(orderResponse.getData().toString()); + } catch (Exception e) { + throw new LuckException("评论的商品数据有误,请刷新后重试"); + } + return spuId; + } + + /** + * 保存商品评论信息 + * + * @param spuId + * @param spuCommDTO + */ + private MongoSpuCommBO saveSpuComm(Long spuId, SpuCommDTO spuCommDTO) { + if (StrUtil.length(spuCommDTO.getContent()) > Constant.MAX_FIELD_LIMIT) { + // 截取字符串 + spuCommDTO.setContent(StrUtil.subWithLength(spuCommDTO.getContent(), 0, 500)); + } + if (StrUtil.isBlank(spuCommDTO.getPics())) { + spuCommDTO.setPics(null); + } + //查询是否已经评论 + ServerResponseEntity byOrderItemId = orderCommFeignClient.getByOrderItemId(spuCommDTO.getOrderItemId()); + if (Objects.nonNull(byOrderItemId.getData())) { + OrderItemVO data = byOrderItemId.getData(); + Criteria criteria = Criteria.where("userId").is(data.getUserId()).and("orderItemId").is(spuCommDTO.getOrderItemId()).and("status").is(1); + SpuCommVO spuCommVO = getOne(criteria); + if (Objects.nonNull(spuCommVO)) { + throw new LuckException("该商品已评论"); + } + } + + SpuVO spuVO = spuService.getBySpuId(spuId); + // 插入评论 + MongoSpuCommBO spuComm = new MongoSpuCommBO(); + spuComm.setShopId(spuVO.getShopId()); + spuComm.setSpuId(spuId); + spuComm.setOrderItemId(spuCommDTO.getOrderItemId()); + spuComm.setUserId(AuthUserContext.get().getUserId()); + spuComm.setScore(spuCommDTO.getScore()); + spuComm.setContent(spuCommDTO.getContent()); + spuComm.setPics(spuCommDTO.getPics()); + spuComm.setIsAnonymous(spuCommDTO.getIsAnonymous()); + spuComm.setCreateTime(new Date()); + // 平台不需要控评 + spuComm.setStatus(StatusEnum.ENABLE.value()); + spuComm.setPostip(IpHelper.getIpAddr()); + if (Objects.nonNull(spuComm.getScore()) && spuComm.getScore() > Constant.MEDIUM_RATING) { + spuComm.setEvaluate(1); + } else if (Objects.nonNull(spuComm.getScore()) && spuComm.getScore().equals(Constant.MEDIUM_RATING)) { + spuComm.setEvaluate(2); + } else if (Objects.nonNull(spuComm.getScore()) && spuComm.getScore() < Constant.MEDIUM_RATING) { + spuComm.setEvaluate(3); + } + save(spuComm); + return spuComm; + } + + private PageVO spuPage(PageDTO pageDTO, Long spuId, Integer evaluate) { + Criteria criteria = Criteria.where("spuId").is(spuId).and("status").is(1); + boolean writtenComm = Objects.nonNull(evaluate) && !Objects.equals(evaluate, 0) && !Objects.equals(evaluate, 4); + // 文字评论 + if (writtenComm) { + criteria.and("evaluate").is(evaluate); + } + // 图片评论 + else if (Objects.equals(evaluate, Constant.FOUR)) { + criteria.and("pics").exists(true); + } + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + return page(pageDTO, query); + } + + private PageVO shopPage(PageDTO pageDTO, SpuCommDTO spuCommDTO) { + + Criteria criteria = Criteria.where("shopId").is(spuCommDTO.getShopId()).and("status").is(1); + + //根据商品名称搜索 + if (StrUtil.isNotBlank(spuCommDTO.getSpuName())) { + SpuSimpleBO spuSimpleBO = new SpuSimpleBO(); + spuSimpleBO.setLang(I18nMessage.getLang()); + spuSimpleBO.setShopId(AuthUserContext.get().getTenantId()); + spuSimpleBO.setSpuName(spuCommDTO.getSpuName()); + List spuList = spuService.listSimple(spuSimpleBO); + List spuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isNotEmpty(spuList)) { + spuIds = spuList.stream().map(SpuSimpleBO::getSpuId).collect(Collectors.toList()); + } + criteria.and("spuId").in(spuIds); + } + + //根据用户昵称搜索 + if (StrUtil.isNotBlank(spuCommDTO.getNickName())) { + UserApiVO userApiVO = new UserApiVO(); + userApiVO.setNickName(spuCommDTO.getNickName()); + ServerResponseEntity> userResponse = userFeignClient.getUserByParam(userApiVO); + List users = userResponse.getData(); + List userIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isNotEmpty(users)) { + userIds = users.stream().map(UserApiVO::getUserId).collect(Collectors.toList()); + } + criteria.and("userId").in(userIds) + .and("isAnonymous").is(0); + } + + + if (Objects.nonNull(spuCommDTO.getCreateStartTime())) { + criteria.and("createTime").gt(spuCommDTO.getCreateStartTime()).lt(spuCommDTO.getCreateEndTime()); + } + if (Objects.nonNull(spuCommDTO.getReplyStartTime())) { + criteria.and("replyTime").gt(spuCommDTO.getReplyStartTime()).lt(spuCommDTO.getReplyEndTime()); + } + + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + return page(pageDTO, query); + } + + private PageVO userPage(PageDTO pageDTO, Long userId) { + Criteria criteria = Criteria.where("userId").is(userId); + return page(pageDTO, new Query(criteria)); + } + + private PageVO page(PageDTO pageDTO, Query query) { + PageVO mongoSpuCommPageVO = mongoPageUtil.doPage(MongoSpuCommBO.class, pageDTO, query); + PageVO pageVO = new PageVO<>(); + pageVO.setPages(mongoSpuCommPageVO.getPages()); + pageVO.setTotal(mongoSpuCommPageVO.getTotal()); + pageVO.setList(BeanUtil.mapAsList(mongoSpuCommPageVO.getList(), SpuCommVO.class)); + return pageVO; + } + + private SpuCommVO getOne(Criteria criteria) { + List list = mongoTemplate.find(new Query(criteria), MongoSpuCommBO.class); + if (CollUtil.isEmpty(list)) { + return null; + } + return BeanUtil.map(list.get(0), SpuCommVO.class); + } + + private List getList(Criteria criteria) { + List list = mongoTemplate.find(new Query(criteria), MongoSpuCommBO.class); + if (CollUtil.isEmpty(list)) { + return null; + } + List spuCommVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (MongoSpuCommBO mongoSpuCommBO : list) { + SpuCommVO spuCommVO = BeanUtil.map(mongoSpuCommBO, SpuCommVO.class); + spuCommVOList.add(spuCommVO); + } + return spuCommVOList; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuConsignmentChangeServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuConsignmentChangeServiceImpl.java new file mode 100644 index 0000000..f1669f1 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuConsignmentChangeServiceImpl.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.mapper.SpuConsignmentChangeMapper; +import com.tmerclub.cloud.product.model.SpuConsignmentChange; +import com.tmerclub.cloud.product.service.SpuConsignmentChangeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 商家代销商品基本信息相对于供应商品是否改变 + * + * @author FrozenWatermelon + * @date 2022-08-11 22:21:10 + */ +@Service +public class SpuConsignmentChangeServiceImpl implements SpuConsignmentChangeService { + + @Autowired + private SpuConsignmentChangeMapper spuConsignmentChangeMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> spuConsignmentChangeMapper.list()); + } + + @Override + public SpuConsignmentChange getByConsignmentChangeId(Long consignmentChangeId) { + return spuConsignmentChangeMapper.getByConsignmentChangeId(consignmentChangeId); + } + + @Override + public void save(SpuConsignmentChange spuConsignmentChange) { + spuConsignmentChangeMapper.save(spuConsignmentChange); + } + + @Override + public void update(SpuConsignmentChange spuConsignmentChange) { + spuConsignmentChangeMapper.update(spuConsignmentChange); + } + + @Override + public void deleteById(Long consignmentChangeId) { + spuConsignmentChangeMapper.deleteById(consignmentChangeId); + } + + @Override + @Cacheable(cacheNames = CacheNames.SPU_SUPPLIER_CHANGE_LOG, key = "#spuId", sync = true) + public SpuConsignmentChange getBySpuId(Long spuId) { + return spuConsignmentChangeMapper.getBySpuId(spuId); + } + + @Override + public List batchGetBySpuIdList(List spuIdList) { + if (spuIdList.size() == 0) { + return null; + } + return spuConsignmentChangeMapper.batchGetBySpuIdList(spuIdList); + } + + @Override + public SpuConsignmentChange consignmentChange(Long spuId) { + return spuConsignmentChangeMapper.getBySpuId(spuId); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuDetailServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuDetailServiceImpl.java new file mode 100644 index 0000000..788783c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuDetailServiceImpl.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.product.vo.SpuDetailVO; +import com.tmerclub.cloud.product.mapper.SpuDetailMapper; +import com.tmerclub.cloud.product.model.SpuDetail; +import com.tmerclub.cloud.product.service.SpuDetailService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 商品详情信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@Service +public class SpuDetailServiceImpl implements SpuDetailService { + + @Autowired + private SpuDetailMapper spuDetailMapper; + + @Override + public void batchSave(List spuDetailList) { + spuDetailMapper.batchSave(spuDetailList); + } + + @Override + public void batchUpdate(List spuDetailList) { + spuDetailMapper.batchUpdate(spuDetailList); + } + + @Override + public void deleteById(Long spuId) { + spuDetailMapper.deleteById(spuId); + } + + @Override + public void update(List spuDetailList, List detailListDb, Long spuId) { + if (CollUtil.isEmpty(spuDetailList) && CollUtil.isEmpty(detailListDb)) { + return; + } + if (CollUtil.isEmpty(detailListDb)) { + spuDetailMapper.batchSave(spuDetailList); + return; + } + List langList = detailListDb.stream().map(SpuDetailVO::getLang).collect(Collectors.toList()); + if (CollUtil.isEmpty(spuDetailList)) { + spuDetailMapper.deleteBatchBySpuIdAndLang(spuId, langList); + return; + } + Iterator iterator = spuDetailList.iterator(); + List saveList = new ArrayList<>(Constant.INITIAL_CAPACITY); + while (iterator.hasNext()) { + SpuDetail spuDetail = iterator.next(); + if (langList.contains(spuDetail.getLang())) { + langList.remove(spuDetail.getLang()); + continue; + } + saveList.add(spuDetail); + iterator.remove(); + } + if (CollUtil.isNotEmpty(saveList)) { + spuDetailMapper.batchSave(saveList); + } + if (CollUtil.isNotEmpty(spuDetailList)) { + spuDetailMapper.batchUpdate(spuDetailList); + } + if (CollUtil.isNotEmpty(langList)) { + spuDetailMapper.deleteBatchBySpuIdAndLang(spuId, langList); + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuExcelServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuExcelServiceImpl.java new file mode 100644 index 0000000..8c2eac5 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuExcelServiceImpl.java @@ -0,0 +1,1283 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.delivery.feign.DeliveryFeignClient; +import com.tmerclub.cloud.api.product.feign.WarehouseFeignClient; +import com.tmerclub.cloud.api.delivery.vo.ShopTransportVO; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.api.product.constant.CategoryLevel; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.ExcelConstant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.constant.StockPointType; +import com.tmerclub.cloud.common.product.constant.SupplierSpuType; +import com.tmerclub.cloud.common.product.dto.*; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.*; +import com.tmerclub.cloud.product.constant.SpuExportError; +import com.tmerclub.cloud.product.constant.WriteOfNumEnum; +import com.tmerclub.cloud.product.dto.SpuPageSearchDTO; +import com.tmerclub.cloud.product.handler.ProductCommentWriteHandler; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.model.BrandLang; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.vo.*; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.vo.*; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.http.MediaTypeFactory; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.DecimalFormat; +import java.util.*; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * spu信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@Service +public class SpuExcelServiceImpl implements SpuExcelService { + + @Autowired + private SpuMapper spuMapper; + @Autowired + private SpuService spuService; + @Autowired + private SkuService skuService; + @Autowired + private CategoryService categoryService; + @Autowired + private CategoryShopService categoryShopService; + @Autowired + private BrandService brandService; + @Autowired + private BrandShopService brandShopService; + @DubboReference + private DeliveryFeignClient deliveryFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @Autowired + private FeignShopConfig feignShopConfig; + @Autowired + private WarehouseFeignClient warehouseFeignClient; + + /** + * 商品显示信息 + */ + public static final String ENABLE = "上架"; + public static final String DISABLE = "下架"; + public static final String OFFLINE = "违规下架"; + public static final String WAIT_AUDIT = "等待审核"; + public static final String PORTION_ENABLE = "部分上架"; + public static final String PORTION_DISABLE = "部分下架"; + public static final String[] DELIVERY_MODE = { + DeliveryType.STATION.description(), + DeliveryType.SAME_CITY.description(), + StrUtil.concat(Boolean.TRUE, DeliveryType.STATION.description(), "且", DeliveryType.SAME_CITY.description()) + }; + public static final String[] SUPPLIER_DELIVERY_MODE = { + DeliveryType.DELIVERY.description() + }; + public static final String[] STATUS_MODE = {ENABLE, DISABLE}; + + /** + * 运费模板 + */ + public static final String DELIVERY_FREE = "包邮"; + public static final Long DELIVERY_FREE_ID = 0L; + public static final String DELIVERY_FIXED = "固定运费"; + public static final Long DELIVERY_FIXED_ID = -1L; + /** + * 发货方式 + */ + public static final String SUPPLIER_SHIPMENTS = "供应商发货"; + public static final String WAREHOUSE_SHIPMENTS = "仓库发货"; + /** + * 商品类别 0.实物商品 1. 虚拟商品 2.组合商品 + */ + public static final String PHYSICAL_SPU = "实物商品"; + public static final String VIRTUAL_SPU = "虚拟商品"; + public static final String COMBO_SPU = "组合商品"; + public static final String YES = "是"; + public static final String NO = "否"; + public static final String REPEATEDLY = "多次核销"; + public static final String WITHOUT = "无需核销"; + public static final String SINGLE = "单次核销"; + public static final String UNLIMITED = "无限次"; + public static final String CUSTOMIZATION = "自定义"; + public static final String LONG_TERM = "长期有效"; + public static final String[] MULTISHOP_LMOLD_MODE = {PHYSICAL_SPU, VIRTUAL_SPU}; + public static final String[] MOLD_MODE = {PHYSICAL_SPU, VIRTUAL_SPU,COMBO_SPU}; + public static final String[] WRITE_MODE = {REPEATEDLY, WITHOUT, SINGLE}; + public static final String[] IS_REFUND_MODE = {NO, YES}; + private static final Pattern DAY = Pattern.compile("天", Pattern.LITERAL); + private static final String DAY_STR = "天"; + private static final String WITHOUT_STR = "0"; + private static final String REPEATEDLY_STR = "1"; + private static final String SINGLE_STR = "1"; + private static final String UNLIMITED_STR = "-1"; + public static final int INT = 1024; + /** + * 品牌 + */ + public static final int BRAND_INDEX = 7; + /** + * 平台分类 + */ + public static final int CATEGORY_INDEX = 8; + /** + * 店铺分类 + */ + public static final int SHOP_CATEGORY_INDEX = 9; + /** + * 配送方式 + */ + public static final int DELIVERY_MODE_INDEX = 10; + /** + * 运费模板 + */ + public static final int DELIVERY_TEMPLATE_INDEX = 11; + /** + * 状态 + */ + public static final int STATUS_INDEX = 13; + /** + * 商品类别 + */ + public static final int MOLD_INDEX = 14; + + /** + * 核销次数 + */ + public static final int WRITE_INDEX = 15; + + /** + * 是否可以退款 + */ + public static final int IS_REFUND_INDEX = 20; + + private static final Logger log = LoggerFactory.getLogger(SpuExcelServiceImpl.class); + + private static final Pattern IMG_URL = Pattern + .compile(".*?(image/gif|image/jpeg|image/png|image/jpg|image/bmp)"); + private static final Pattern IMG_URL_SUFFIX = Pattern + .compile(".*?(gif|jpeg|png|jpg|bmp)"); + + @Override + public List excelSpuList(SpuPageSearchDTO spuDTO) { + Integer sysType = AuthUserContext.get().getSysType(); + if (Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + spuDTO.setSupplierId(AuthUserContext.get().getTenantId()); + spuDTO.setSupplierSpuType(SupplierSpuType.YES.value()); + spuDTO.setShopId(-1L); + } else { + spuDTO.setShopId(AuthUserContext.get().getTenantId()); + } + List list = spuMapper.excelSpuList(spuDTO); + if (CollUtil.isEmpty(list)) { + return list; + } + Set categoryIds = new HashSet<>(Constant.INITIAL_CAPACITY); + List spuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuExcelVO spuExcelVO : list) { + spuIds.add(spuExcelVO.getSpuId()); + categoryIds.add(spuExcelVO.getCategoryId()); + categoryIds.add(spuExcelVO.getShopCategoryId()); + } + // 获取分类列表 + List categoryList = categoryService.listByCategoryIds(categoryIds); + ProductLangUtil.categoryList(categoryList); + Map categoryMap = categoryList.stream().collect(Collectors.toMap(CategoryVO::getCategoryId, c -> c)); + // 获取sku信息列表 + List skuList = skuService.excelSkuList(spuIds); + Map> skuMap = skuList.stream().collect(Collectors.groupingBy(SpuExcelVO::getSpuId)); + List spuExcelList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 店铺运费模板 + Map transportMap = new HashMap<>(); + transportMap.put(DELIVERY_FIXED_ID, DELIVERY_FIXED); + transportMap.put(DELIVERY_FREE_ID, DELIVERY_FREE); + ServerResponseEntity> response = deliveryFeignClient.listTransportByShopId(Objects.equals(sysType, SysTypeEnum.SUPPLIER.value()) ? spuDTO.getSupplierId() : spuDTO.getShopId()); + if (!Objects.equals(response.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(response.getMsg()); + } + transportMap.putAll(response.getData().stream().collect(Collectors.toMap(ShopTransportVO::getTransportId, ShopTransportVO::getTransName))); + int index = 1; + for (SpuExcelVO spuExcelVO : list) { + List skuData = skuMap.get(spuExcelVO.getSpuId()); + if (CollUtil.isEmpty(skuData)) { + continue; + } + spuExcelVO.setSeq(String.valueOf(index)); + spuExcelVO.setDeliveryTemplate(transportMap.get(spuExcelVO.getDeliveryTemplateId())); + spuExcelVO.setDeliveryAmount(spuExcelVO.getDeliveryAmount() != null && spuExcelVO.getDeliveryTemplate() != null ? AnalysisUtil.conversionPrices(spuExcelVO.getDeliveryAmount()) : ""); + // 状态 + spuExcelVO.setStatus(getStatus(spuExcelVO.getStatus())); + setVirtualInfo(spuExcelVO); + // 配送方式 + SpuVO.DeliveryModeVO deliveryModeVO = Json.parseObject(spuExcelVO.getDeliveryMode(), SpuVO.DeliveryModeVO.class); + if (Objects.equals(spuExcelVO.getSpuMold(), VIRTUAL_SPU) || Objects.equals(spuExcelVO.getSpuType(), SpuType.ACTIVE.value())) { + spuExcelVO.setDeliveryMode(DeliveryType.NOT_DELIVERY.description() + Constant.COMMA); + } else { + String delivery = getDelivery(deliveryModeVO); + spuExcelVO.setDeliveryMode(delivery); + } + handleSpuExcelInfo(categoryMap, skuData, spuExcelList, spuExcelVO); + index++; + } + return spuExcelList; + } + + private static void setVirtualInfo(SpuExcelVO spuExcelVO) { + // 虚拟商品信息 + spuExcelVO.setSpuMold(MOLD_MODE[Integer.valueOf(spuExcelVO.getSpuMold())]); + String isRefundStr = spuExcelVO.getIsRefund() == null ? "" : (StrUtil.equals(spuExcelVO.getIsRefund(), SINGLE_STR) ? YES : NO); + spuExcelVO.setIsRefund(isRefundStr); + //虚拟商品的核销信息 + if (StrUtil.equals(spuExcelVO.getSpuMold(), VIRTUAL_SPU)) { + spuExcelVO.setWriteOffNum(WriteOfNumEnum.getNameByNum(Integer.parseInt(spuExcelVO.getWriteOffNum()))); + spuExcelVO.setWriteOffMultipleCount(StrUtil.equals(spuExcelVO.getWriteOffMultipleCount(), UNLIMITED_STR) ? "" : spuExcelVO.getWriteOffMultipleCount()); + if (StrUtil.equals(spuExcelVO.getWriteOffTime(), UNLIMITED_STR)) { + spuExcelVO.setWriteOffTime(LONG_TERM); + spuExcelVO.setWriteOffStart(null); + spuExcelVO.setWriteOffEnd(null); + } else { + spuExcelVO.setWriteOffTime(StrUtil.equals(spuExcelVO.getWriteOffTime(), null) ? "" : spuExcelVO.getWriteOffTime() + "天"); + } + } else { + spuExcelVO.setWriteOffNum(""); + } + } + + private static String getStatus(String status) { + if (Objects.equals(status, StatusEnum.ENABLE.value().toString())) { + return ENABLE; + } else if (Objects.equals(status, StatusEnum.DISABLE.value().toString())) { + return DISABLE; + } else if (Objects.equals(status, StatusEnum.OFFLINE.value().toString())) { + return OFFLINE; + } else if (Objects.equals(status, StatusEnum.WAIT_AUDIT.value().toString())) { + return WAIT_AUDIT; + } + return ""; + } + + private void handleSpuExcelInfo(Map categoryMap, List skuData, List spuExcelList, SpuExcelVO spuExcelVO) { + + // 名称、卖点 + for (SpuLangVO spuLangVO : spuExcelVO.getSpuLangList()) { + if (Objects.equals(spuLangVO.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + spuExcelVO.setNameZh(spuLangVO.getSpuName()); + spuExcelVO.setSellingPointZh(spuLangVO.getSellingPoint()); + } + } + // 商品详情 + for (SpuDetailVO spuDetailVO : spuExcelVO.getSpuDetailList()) { + if (Objects.equals(spuDetailVO.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + spuExcelVO.setDetailZh(spuDetailVO.getDetail()); + } + } + String brandName = null; + if (CollUtil.isNotEmpty(spuExcelVO.getBrandLangList())) { + BrandLangVO brandLang = ProductLangUtil.handelBrandLang(spuExcelVO.getBrandLangList()); + brandName = brandLang.getName(); + } + String shopCategoryName = null; + // 店铺分类 + CategoryVO shopCategoryVO = categoryMap.get(spuExcelVO.getShopCategoryId()); + if (Objects.nonNull(shopCategoryVO)) { + shopCategoryName = shopCategoryVO.getName(); + } + String categoryName = null; + // 平台分类 + CategoryVO categoryVO = categoryMap.get(spuExcelVO.getCategoryId()); + if (Objects.nonNull(categoryVO)) { + categoryName = categoryVO.getName(); + } + String delivery = spuExcelVO.getDeliveryMode(); + delivery = delivery.substring(0, delivery.length() - 1); + String resourceUrl = feignShopConfig.getUploadFile().getResourceUrl(); + for (SpuExcelVO spuExcel : skuData) { + spuExcel.setPriceFee(AnalysisUtil.conversionPrices(spuExcel.getPriceFee())); + spuExcel.setMarketPriceFee(AnalysisUtil.conversionPrices(spuExcel.getMarketPriceFee())); + spuExcel.setSeq(spuExcelVO.getSeq()); + spuExcel.setDeliveryTemplate(spuExcelVO.getDeliveryTemplate()); + spuExcel.setDeliveryAmount(spuExcelVO.getDeliveryAmount()); + spuExcel.setBrandName(brandName); + spuExcel.setStatus(spuExcelVO.getStatus()); + spuExcel.setNameZh(spuExcelVO.getNameZh()); + spuExcel.setSellingPointZh(spuExcelVO.getSellingPointZh()); + spuExcel.setDetailZh(spuExcelVO.getDetailZh()); + spuExcel.setCategoryName(categoryName); + spuExcel.setShopCategoryName(shopCategoryName); + spuExcel.setDeliveryMode(delivery); + spuExcel.setSpuMold(spuExcelVO.getSpuMold()); + spuExcel.setWriteOffTime(spuExcelVO.getWriteOffTime()); + spuExcel.setWriteOffNum(spuExcelVO.getWriteOffNum()); + spuExcel.setWriteOffMultipleCount(spuExcelVO.getWriteOffMultipleCount()); + spuExcel.setWriteOffEnd(spuExcelVO.getWriteOffEnd()); + spuExcel.setWriteOffStart(spuExcelVO.getWriteOffStart()); + spuExcel.setIsRefund(spuExcelVO.getIsRefund()); + spuExcel.setVirtualRemark(spuExcelVO.getVirtualRemark()); + spuExcel.setImgs(spuExcelVO.getImgs()); + spuExcel.setVideo(spuExcelVO.getVideo()); + // 补充图片,视频资源域名地址 + if (!ObjectUtils.isEmpty(spuExcel.getImgs())) { + String[] imgArr = spuExcel.getImgs().split(ExcelConstant.COMMA_SPLIT); + StringBuilder sb = new StringBuilder(Constant.INITIAL_CAPACITY); + for (int i = 0; i < imgArr.length; i++) { + if (!imgArr[i].startsWith(ExcelConstant.URL_PREFIX)) { + imgArr[i] = resourceUrl + imgArr[i]; + } + sb.append(imgArr[i]).append(ExcelConstant.COMMA_SPLIT); + } + spuExcel.setImgs(sb.substring(0, sb.toString().length() - 1)); + } + if (!ObjectUtils.isEmpty(spuExcel.getVideo()) + && !spuExcel.getVideo().startsWith(ExcelConstant.URL_PREFIX)) { + spuExcel.setVideo(resourceUrl + spuExcelVO.getVideo()); + } + spuExcelList.add(spuExcel); + } + } + + @Override + public void exportExcel(List spuList, Map> errorMap) { + if (CollUtil.isEmpty(spuList)) { + addSpuExcelError(errorMap, SpuExportError.OTHER, "导入文件为空"); + return; + } + for (SpuExcelVO spuExcelVO : spuList) { + if (Objects.isNull(spuExcelVO.getSeq())) { + addSpuExcelError(errorMap, SpuExportError.OTHER, "编号不能为空"); + return; + } + if (StrUtil.isNotBlank(spuExcelVO.getImgs())) { + String[] split = spuExcelVO.getImgs().split(","); + if (!checkPic(split, errorMap)) { + return; + } + } + if (StrUtil.isNotBlank(spuExcelVO.getVideo())) { + if (!checkVideo(spuExcelVO.getVideo(), errorMap)) { + return; + } + } + } + + Integer sysType = AuthUserContext.get().getSysType(); + Long shopId = AuthUserContext.get().getTenantId(); + Set brandIds = new HashSet<>(Constant.INITIAL_CAPACITY); + // 平台分类 + Map categoryMap = getCategoryList(Constant.PLATFORM_SHOP_ID); + // 店铺分类 + Map shopCategoryMap = getCategoryList(shopId); + //供应商没有店铺分类 + if (!Objects.equals(sysType, SysTypeEnum.SUPPLIER.value()) && MapUtil.isEmpty(shopCategoryMap)) { + addSpuExcelError(errorMap, SpuExportError.OTHER, "请先创建店铺分类"); + return; + } + // 运费模板 + Map transportMap = new HashMap<>(); + transportMap.put(DELIVERY_FIXED, DELIVERY_FIXED_ID); + transportMap.put(DELIVERY_FREE, DELIVERY_FREE_ID); + ServerResponseEntity> response = deliveryFeignClient.listTransportByShopId(shopId); + transportMap.putAll(response.getData().stream().collect(Collectors.toMap(ShopTransportVO::getTransName, ShopTransportVO::getTransportId))); + if (MapUtil.isEmpty(transportMap)) { + addSpuExcelError(errorMap, SpuExportError.OTHER, "请先创建运费模板"); + return; + } + // 品牌 + Set brandNames = new HashSet<>(Constant.INITIAL_CAPACITY); + for (SpuExcelVO spuExcel : spuList) { + brandNames.add(spuExcel.getBrandName()); + } + List brandList = brandService.listBrandLangByBrandNames(brandNames, shopId); + Map> brandMap = brandList.stream().collect(Collectors.groupingBy(BrandLang::getName)); + Map> spuMap = spuList.stream().collect(Collectors.groupingBy(SpuExcelVO::getSeq)); + for (String seq : spuMap.keySet()) { + List spuExcelList = spuMap.get(seq); + SpuDTO spu = new SpuDTO(); + spu.setShopId(shopId); + try { + loadSpuData(spuExcelList, spu, categoryMap, shopCategoryMap, transportMap, brandMap, errorMap); + } catch (Exception e) { + addSpuExcelError(errorMap, SpuExportError.PRODUCT_DATA, e.getMessage()); + continue; + } + if (Objects.nonNull(spu.getBrandId())) { + brandIds.add(spu.getBrandId()); + } + } + brandService.updateSpuCountByBrandIds(brandIds); + } + + private boolean checkVideo(String video, Map> errorMap) { + try { + URL url = new URL(video); + String videoName = "video/mp4"; + String map4 = ".map4"; + String contentType = MediaTypeFactory.getMediaType(video).orElse(MediaType.APPLICATION_OCTET_STREAM).toString(); + if (Objects.equals(contentType, MediaType.APPLICATION_OCTET_STREAM.toString())) { + contentType = url.openConnection().getHeaderField(Constant.CONTENT_TYPE); + } + if (!Objects.equals(contentType, videoName) || video.endsWith(map4)) { + addSpuExcelError(errorMap, SpuExportError.OTHER, "上传视频格式错误"); + return false; + } + } catch (IOException e) { + log.error("视频格式判断出错:{}", e.getMessage()); + } + int length = getFileLength(video); + //定义MB的计算常量 + int mb = 1024 << 10; + DecimalFormat df = new DecimalFormat("0.00"); + float lengthByMb = Float.parseFloat(df.format(length / (float) mb)); + if (lengthByMb > Constant.FIFTY) { + addSpuExcelError(errorMap, SpuExportError.OTHER, "上传视频大小超出限制"); + return false; + } + return true; + } + + private int getFileLength(String url1) { + int length = 0; + URL url; + try { + url = new URL(url1); + HttpURLConnection urlcon = (HttpURLConnection) url.openConnection(); + //根据响应获取文件大小 + length = urlcon.getContentLength(); + urlcon.disconnect(); + } catch (MalformedURLException e) { + log.error("视频格式判断出错:{}", e.getMessage()); + } catch (IOException e) { + log.error("IO异常:{}", e.getMessage()); + } + return length; + } + + private boolean checkPic(String[] split, Map> errorMap) { + if (split.length > Constant.NINE) { + addSpuExcelError(errorMap, SpuExportError.OTHER, "最多上传9张图片"); + return false; + } + for (String s : split) { + if (!isImgUrl(s)) { + addSpuExcelError(errorMap, SpuExportError.OTHER, "上传图片格式错误"); + return false; + } + } + return true; + } + + private boolean isImgUrl(String url) { + if (url == null || url.trim().length() == 0 || !url.contains(".")) { + return false; + } + String suffix = url.substring(url.lastIndexOf('.')); + try { + return IMG_URL_SUFFIX.matcher(suffix).matches() || IMG_URL.matcher(new URL(url).openConnection().getHeaderField("content-type")).matches(); + } catch (IOException e) { + log.error("图片格式判断出错:{}", e.getMessage()); + } + return false; + } + + private void addSpuExcelError(Map> errorMap, SpuExportError spuExportError, String error) { + List list = errorMap.get(spuExportError.value()); + if (CollUtil.isEmpty(list)) { + list = new ArrayList<>(0); + errorMap.put(spuExportError.value(), list); + } + list.add(error); + } + + private Map getCategoryList(Long shopId) { + List categoryList; + if (Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + categoryList = categoryService.getShopSigningCategoryAndLangInfo(AuthUserContext.get().getTenantId()); + } else { + categoryList = categoryService.listAndLangInfoByShopId(shopId); + } + categoryList.sort(Comparator.comparing(CategoryVO::getSeq).reversed().thenComparing(CategoryVO::getCategoryId)); + Map categoryNameMap = new HashMap<>(categoryList.size()); + Map categoryNameEnMap = new HashMap<>(categoryList.size()); + for (CategoryVO categoryVO : categoryList) { + boolean isParentCategory = Objects.equals(categoryVO.getLevel(), CategoryLevel.First.value()) || + (Objects.equals(shopId, Constant.PLATFORM_SHOP_ID) && Objects.equals(categoryVO.getLevel(), CategoryLevel.SECOND.value())); + if (isParentCategory) { + continue; + } + for (CategoryLangVO categoryLangVO : categoryVO.getCategoryLangList()) { + String name = categoryLangVO.getName(); + if (Objects.equals(categoryLangVO.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang()) && !categoryNameMap.containsKey(name)) { + categoryNameMap.put(name, categoryVO.getCategoryId()); + } else if (Objects.equals(categoryLangVO.getLang(), LanguageEnum.LANGUAGE_EN.getLang()) && !categoryNameMap.containsKey(name)) { + categoryNameEnMap.put(name, categoryVO.getCategoryId()); + } + } + } + for (String key : categoryNameEnMap.keySet()) { + if (!categoryNameMap.containsKey(key)) { + categoryNameMap.put(key, categoryNameEnMap.get(key)); + } + } + return categoryNameMap; + } + + @Override + public String spuExportError(Map> errorMap) { + StringBuilder info = new StringBuilder(Constant.INITIAL_CAPACITY); + for (Integer key : errorMap.keySet()) { + List list = errorMap.get(key); + SpuExportError spuExportError = SpuExportError.instance(key); + if (Objects.equals(spuExportError, SpuExportError.OTHER)) { + info.append(list.toString()).append("\n"); + continue; + } + info.append(Objects.requireNonNull(spuExportError).errorInfo()).append(list.toString()).append("\n"); + } + return info.toString(); + } + + @Override + public void downloadModel(HttpServletResponse response) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + Long shopId = uidInfoBO.getTenantId(); + Integer sysType = uidInfoBO.getSysType(); + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + list.add(new SpuExcelVO()); + Map map = new HashMap<>(8); + if (Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + map.put(DELIVERY_MODE_INDEX - 1, SUPPLIER_DELIVERY_MODE); + map.put(STATUS_INDEX - 1, STATUS_MODE); + } else { + map.put(DELIVERY_MODE_INDEX, DELIVERY_MODE); + map.put(STATUS_INDEX, STATUS_MODE); + map.put(MOLD_INDEX, MULTISHOP_LMOLD_MODE); + map.put(WRITE_INDEX, WRITE_MODE); + map.put(IS_REFUND_INDEX, IS_REFUND_MODE); + } + + ServerResponseEntity> responseEntity = deliveryFeignClient.listTransportByShopId(shopId); + List data = responseEntity.getData(); + String[] transNames = new String[data.size() + 2]; + for (int i = 0; i < data.size(); i++) { + ShopTransportVO transport = data.get(i); + transNames[i] = transport.getTransName(); + } + transNames[transNames.length - 2] = DELIVERY_FREE; + transNames[transNames.length - 1] = DELIVERY_FIXED; + if (Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + map.put(DELIVERY_TEMPLATE_INDEX - 1, transNames); + } else { + map.put(DELIVERY_TEMPLATE_INDEX, transNames); + } + + // 平台分类 + List categoryShopList = categoryShopService.listByShopId(shopId, AuthUserContext.get().getSysType(), I18nMessage.getLang()); + map.put(CATEGORY_INDEX, categoryShopList.stream().filter(category -> Objects.equals(category.getCategoryStatus(), StatusEnum.ENABLE.value())) + .map(CategoryShopVO::getName).toArray(String[]::new)); + //店铺分类 + List shopCategoryList = categoryService.listEnable(shopId); + //判断店铺分类是否为空 + if (!Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + if (shopCategoryList.size() != 0) { + ProductLangUtil.categoryList(shopCategoryList); + map.put(SHOP_CATEGORY_INDEX, shopCategoryList.stream().map(CategoryVO::getName).toArray(String[]::new)); + } + } + // 品牌(下拉数据) + BrandSigningVO brandSigningVO = brandShopService.listSigningByShopId(shopId, sysType); + List brandNames = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.nonNull(brandSigningVO)) { + if (!CollectionUtils.isEmpty(brandSigningVO.getPlatformBrandList())) { + brandNames = brandSigningVO.getPlatformBrandList().stream().map(BrandShopVO::getName).collect(Collectors.toList()); + } + if (!CollectionUtils.isEmpty(brandSigningVO.getCustomizeBrandList())) { + brandNames.addAll(brandSigningVO.getCustomizeBrandList().stream().map(BrandShopVO::getName).toList()); + } + } + if (!CollectionUtils.isEmpty(brandNames)) { + String[] brandNameArr = new String[brandNames.size()]; + brandNames.toArray(brandNameArr); + map.put(BRAND_INDEX, brandNameArr); + } + // 构建excel + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + ExcelWriterBuilder excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, SpuExcelVO.EXCEL_NAME, SpuExcelVO.MERGE_ROW_INDEX, SpuExcelVO.MERGE_COLUMN_INDEX); + excelWriter = ExcelUtil.getExcelModel(excelWriterMerge, map, Constant.START_ROW).build(); + + // 业务代码 + if (CollUtil.isNotEmpty(list)) { + // 进行写入操作 + WriteSheet sheetWriter; + if (Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.SUPPLIER.value())) { + sheetWriter = EasyExcel.writerSheet(SupplierProdExcelVO.SHEET_NAME).head(SupplierProdExcelVO.class) + .registerWriteHandler(new ProductCommentWriteHandler(SysTypeEnum.SUPPLIER.value())).build(); + } else { + sheetWriter = EasyExcel.writerSheet(SpuExcelVO.SHEET_NAME).head(SpuExcelVO.class) + .registerWriteHandler(new ProductCommentWriteHandler(SysTypeEnum.MULTISHOP.value())).build(); + } + excelWriter.write(list, sheetWriter); + } + } catch (Exception e) { + log.error("导出excel失败", e); + } finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + @Override + public List excelSupplierSpuList(SpuPageSearchDTO spuDTO) { + spuDTO.setShopId(AuthUserContext.get().getTenantId()); + List list = spuMapper.excelSupplierSpuList(spuDTO); + if (CollUtil.isEmpty(list)) { + return list; + } + Set categoryIds = new HashSet<>(Constant.INITIAL_CAPACITY); + List spuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SupplierSpuExcelVO supplierSpuExcelVO : list) { + spuIds.add(supplierSpuExcelVO.getSpuId()); + categoryIds.add(supplierSpuExcelVO.getCategoryId()); + categoryIds.add(supplierSpuExcelVO.getShopCategoryId()); + } + // 获取分类列表 + List categoryList = categoryService.listByCategoryIds(categoryIds); + ProductLangUtil.categoryList(categoryList); + Map categoryMap = categoryList.stream().collect(Collectors.toMap(CategoryVO::getCategoryId, c -> c)); + // 获取sku信息列表 + List skuList = skuService.excelSupplierSkuList(spuIds); + Map> skuMap = skuList.stream().collect(Collectors.groupingBy(SupplierSpuExcelVO::getSpuId)); + List spuExcelList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 店铺运费模板 + ServerResponseEntity> response = deliveryFeignClient.listTransportByShopId(spuDTO.getShopId()); + if (!Objects.equals(response.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(response.getMsg()); + } + Map transportMap = response.getData().stream().collect(Collectors.toMap(ShopTransportVO::getTransportId, ShopTransportVO::getTransName)); + + //供应商名称 + List supplierIds = list.stream().map(SupplierSpuExcelVO::getSupplierId).collect(Collectors.toList()); + ServerResponseEntity> listServerResponseEntity = supplierDetailFeignClient.listBySupplierIds(supplierIds); + Map supplierName = listServerResponseEntity.getData().stream().collect(Collectors.toMap(SupplierApiDetailVO::getSupplierId, SupplierApiDetailVO::getSupplierName)); + int index = 1; + for (SupplierSpuExcelVO supplierSpuExcelVO : list) { + List skuData = skuMap.get(supplierSpuExcelVO.getSpuId()); + if (CollUtil.isEmpty(skuData)) { + continue; + } + //供应商名称 + supplierSpuExcelVO.setSupplierName(supplierName.get(supplierSpuExcelVO.getSupplierId())); + //发货方式 + Integer supplierDeliveryType = supplierSpuExcelVO.getSupplierDeliveryType(); + supplierSpuExcelVO.setSupplierDelivery(supplierDeliveryType == 1 ? SUPPLIER_SHIPMENTS : WAREHOUSE_SHIPMENTS); + //代销商品状态 + int status = Integer.parseInt(supplierSpuExcelVO.getStatus()); + Integer skuChoiceStatus = supplierSpuExcelVO.getSkuChoiceStatus(); + if (status == 1) { + supplierSpuExcelVO.setCommissionSpuStatus(skuChoiceStatus == 1 ? ENABLE : PORTION_ENABLE); + } + if (status == 0) { + supplierSpuExcelVO.setCommissionSpuStatus(skuChoiceStatus == 1 ? DISABLE : PORTION_DISABLE); + } + supplierSpuExcelVO.setSeq(String.valueOf(index)); + supplierSpuExcelVO.setDeliveryTemplate(transportMap.get(supplierSpuExcelVO.getDeliveryTemplateId())); + // 状态 + supplierSpuExcelVO.setStatus(getStatus(supplierSpuExcelVO.getStatus())); + // 配送方式 + SpuVO.DeliveryModeVO deliveryModeVO = Json.parseObject(supplierSpuExcelVO.getDeliveryMode(), SpuVO.DeliveryModeVO.class); + String delivery = getDelivery(deliveryModeVO); + supplierSpuExcelVO.setDeliveryMode(delivery); + handleSupplierSpuExcelInfo(categoryMap, skuData, spuExcelList, supplierSpuExcelVO); + index++; + } + return spuExcelList; + } + + @Override + public List excelPlatformSpuList(ProductSearchDTO productSearchDTO) { + productSearchDTO.setLang(I18nMessage.getLang()); + ServerResponseEntity> responseEntity = searchSpuFeignClient.listExcelPlatformSpu(productSearchDTO); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + List spuEsList = responseEntity.getData(); + if (CollUtil.isEmpty(spuEsList)) { + return new ArrayList<>(0); + } + List spuIds = spuEsList.stream().map(SpuSearchVO::getSpuId).collect(Collectors.toList()); + Map esSpuMap = spuEsList.stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, c -> c)); + List platformSpuExcelVOList = spuMapper.listPlatformSpuExcel(spuIds); + Set categoryIds = new HashSet<>(Constant.INITIAL_CAPACITY); + Set deliveryTemplateIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (PlatformSpuExcelVO spuExcelVO : platformSpuExcelVOList) { + categoryIds.add(spuExcelVO.getCategoryId()); + categoryIds.add(spuExcelVO.getShopCategoryId()); + deliveryTemplateIds.add(spuExcelVO.getDeliveryTemplateId()); + } + // 获取分类列表 + List categoryList = categoryService.listByCategoryIds(categoryIds); + ProductLangUtil.categoryList(categoryList); + Map categoryMap = categoryList.stream().collect(Collectors.toMap(CategoryVO::getCategoryId, c -> c)); + + List skuExcelList = BeanUtil.mapAsList(skuService.excelSkuList(spuIds), PlatformSpuExcelVO.class); + Map> skuMap = skuExcelList.stream().collect(Collectors.groupingBy(PlatformSpuExcelVO::getSpuId)); + List spuExcelList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 店铺运费模板 + ServerResponseEntity> response = deliveryFeignClient.listTransportByIds(new ArrayList<>(deliveryTemplateIds)); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + Map transportMap = response.getData().stream().collect(Collectors.toMap(ShopTransportVO::getTransportId, ShopTransportVO::getTransName)); + + int index = 1; + for (PlatformSpuExcelVO spuExcelVO : platformSpuExcelVOList) { + List skuData = skuMap.get(spuExcelVO.getSpuId()); + SpuSearchVO spuSearchVO = esSpuMap.get(spuExcelVO.getSpuId()); + if (CollUtil.isEmpty(skuData)) { + continue; + } + spuExcelVO.setSeq(String.valueOf(index)); + spuExcelVO.setShopName(Objects.isNull(spuSearchVO.getShopName()) ? spuSearchVO.getSupplierName() : spuSearchVO.getShopName()); + spuExcelVO.setDeliveryTemplate(transportMap.get(spuExcelVO.getDeliveryTemplateId())); + spuExcelVO.setSpuTypeName(SpuType.getSpuTypeName(spuSearchVO.getSpuType())); + // 状态 + if (Objects.equals(spuSearchVO.getSpuStatus(), StatusEnum.ENABLE.value())) { + spuExcelVO.setStatus(ENABLE); + } else if (Objects.equals(spuSearchVO.getSpuStatus(), StatusEnum.DISABLE.value())) { + spuExcelVO.setStatus(DISABLE); + } else if (Objects.equals(spuSearchVO.getSpuStatus(), StatusEnum.OFFLINE.value())) { + spuExcelVO.setStatus(OFFLINE); + } else if (Objects.equals(spuSearchVO.getSpuStatus(), StatusEnum.WAIT_AUDIT.value())) { + spuExcelVO.setStatus(WAIT_AUDIT); + } + setPlatformVirtualInfo(spuExcelVO, spuSearchVO); + // 配送方式 + SpuVO.DeliveryModeVO deliveryModeVO = Json.parseObject(spuExcelVO.getDeliveryMode(), SpuVO.DeliveryModeVO.class); + String delivery = getDelivery(deliveryModeVO); + if (Objects.equals(spuExcelVO.getSpuMold(), VIRTUAL_SPU) || Objects.equals(spuExcelVO.getSpuType(), SpuType.ACTIVE.value())) { + spuExcelVO.setDeliveryMode(DeliveryType.NOT_DELIVERY.description() + Constant.COMMA); + } else { + spuExcelVO.setDeliveryMode(delivery); + } + handlePlatformSpuExcelInfo(categoryMap, skuData, spuExcelList, spuExcelVO); + index++; + } + return spuExcelList; + } + + private static void setPlatformVirtualInfo(PlatformSpuExcelVO spuExcelVO, SpuSearchVO spuSearchVO) { + // 虚拟商品信息 + spuExcelVO.setSpuMold(MOLD_MODE[spuSearchVO.getSpuMold()]); +// spuExcelVO.setSpuMold(Objects.equals(spuSearchVO.getSpuMold(), 1) ? VIRTUAL_SPU : PHYSICAL_SPU); + //虚拟商品的核销信息 + if (StrUtil.equals(spuExcelVO.getSpuMold(), VIRTUAL_SPU)) { + if (StrUtil.equals(spuExcelVO.getWriteOffNum(), WITHOUT_STR)) { + spuExcelVO.setWriteOffNum(WITHOUT); + } else if (Objects.equals(spuExcelVO.getWriteOffNum(), REPEATEDLY_STR)) { + spuExcelVO.setWriteOffNum(REPEATEDLY); + } else if (Objects.equals(spuExcelVO.getWriteOffNum(), SINGLE_STR)) { + spuExcelVO.setWriteOffNum(SINGLE); + } + spuExcelVO.setWriteOffMultipleCount(StrUtil.equals(spuExcelVO.getWriteOffMultipleCount(), UNLIMITED_STR) ? UNLIMITED : spuExcelVO.getWriteOffMultipleCount()); + spuExcelVO.setWriteOffTime(StrUtil.equals(spuExcelVO.getWriteOffTime(), null) ? "" : spuExcelVO.getWriteOffTime() + DAY_STR); + } + spuExcelVO.setIsRefund(StrUtil.equals(spuExcelVO.getIsRefund(), SINGLE_STR) ? YES : NO); + spuExcelVO.setIsTop(StrUtil.equals(spuExcelVO.getIsTop(), SINGLE_STR) ? YES : NO); + } + + private String getDelivery(SpuVO.DeliveryModeVO deliveryModeVO) { + String delivery = ""; + if (deliveryModeVO.getHasUserPickUp()) { + delivery = DeliveryType.STATION.description() + Constant.COMMA; + } + if (deliveryModeVO.getHasCityDelivery()) { + delivery = delivery + DeliveryType.SAME_CITY.description() + Constant.COMMA; + } + if (deliveryModeVO.getHasShopDelivery()) { + delivery = delivery + DeliveryType.DELIVERY.description() + Constant.COMMA; + } + return delivery; + } + + private void handlePlatformSpuExcelInfo(Map categoryMap, List skuData, List spuExcelList, PlatformSpuExcelVO spuExcelVO) { + + String brandName = null; + if (CollUtil.isNotEmpty(spuExcelVO.getBrandLangList())) { + BrandLangVO brandLang = ProductLangUtil.handelBrandLang(spuExcelVO.getBrandLangList()); + brandName = brandLang.getName(); + } + // 名称、卖点 + for (SpuLangVO spuLangVO : spuExcelVO.getSpuLangList()) { + if (Objects.equals(spuLangVO.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + spuExcelVO.setSellingPointZh(spuLangVO.getSellingPoint()); + spuExcelVO.setNameZh(spuLangVO.getSpuName()); + } + } + String categoryName = null; + // 平台分类 + CategoryVO categoryVO = categoryMap.get(spuExcelVO.getCategoryId()); + if (Objects.nonNull(categoryVO)) { + categoryName = categoryVO.getName(); + } + String shopCategoryName = null; + // 店铺分类 + CategoryVO shopCategoryVO = categoryMap.get(spuExcelVO.getShopCategoryId()); + if (Objects.nonNull(shopCategoryVO)) { + shopCategoryName = shopCategoryVO.getName(); + } + String delivery = spuExcelVO.getDeliveryMode(); + delivery = delivery.substring(0, delivery.length() - 1); + for (PlatformSpuExcelVO spuExcel : skuData) { + spuExcel.setPriceFee(AnalysisUtil.conversionPrices(spuExcel.getPriceFee())); + spuExcel.setShopName(spuExcelVO.getShopName()); + spuExcel.setSpuTypeName(spuExcelVO.getSpuTypeName()); + spuExcel.setMarketPriceFee(AnalysisUtil.conversionPrices(spuExcel.getMarketPriceFee())); + spuExcel.setSeq(spuExcelVO.getSeq()); + spuExcel.setWaterSoldNum(spuExcelVO.getWaterSoldNum()); + spuExcel.setDeliveryTemplate(spuExcelVO.getDeliveryTemplate()); + spuExcel.setBrandName(brandName); + spuExcel.setDeliveryTemplate(spuExcelVO.getDeliveryTemplate()); + spuExcel.setNameZh(spuExcelVO.getNameZh()); + spuExcel.setSellingPointZh(spuExcelVO.getSellingPointZh()); + spuExcel.setCategoryName(categoryName); + spuExcel.setShopCategoryName(shopCategoryName); + spuExcel.setDeliveryMode(delivery); + spuExcel.setStatus(spuExcelVO.getStatus()); + spuExcel.setSpuMold(spuExcelVO.getSpuMold()); + spuExcel.setWriteOffTime(spuExcelVO.getWriteOffTime()); + spuExcel.setWriteOffNum(spuExcelVO.getWriteOffNum()); + spuExcel.setWriteOffMultipleCount(spuExcelVO.getWriteOffMultipleCount()); + spuExcel.setWriteOffStart(spuExcelVO.getWriteOffStart()); + spuExcel.setWriteOffEnd(spuExcelVO.getWriteOffEnd()); + spuExcel.setIsRefund(spuExcelVO.getIsRefund()); + spuExcel.setIsTop(spuExcelVO.getIsTop()); + spuExcel.setVirtualRemark(spuExcelVO.getVirtualRemark()); + spuExcelList.add(spuExcel); + } + } + + private void handleSupplierSpuExcelInfo(Map categoryMap, List skuData, List spuExcelList, SupplierSpuExcelVO spuExcelVO) { + + String brandName = null; + if (CollUtil.isNotEmpty(spuExcelVO.getBrandLangList())) { + BrandLangVO brandLang = ProductLangUtil.handelBrandLang(spuExcelVO.getBrandLangList()); + brandName = brandLang.getName(); + } + // 名称、卖点 + for (SpuLangVO spuLangVO : spuExcelVO.getSpuLangList()) { + if (Objects.equals(spuLangVO.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + spuExcelVO.setSellingPointZh(spuLangVO.getSellingPoint()); + spuExcelVO.setNameZh(spuLangVO.getSpuName()); + } + } + String categoryName = null; + String shopCategoryName = null; + // 店铺分类 + CategoryVO shopCategoryVO = categoryMap.get(spuExcelVO.getShopCategoryId()); + if (Objects.nonNull(shopCategoryVO)) { + shopCategoryName = shopCategoryVO.getName(); + } + // 平台分类 + CategoryVO categoryVO = categoryMap.get(spuExcelVO.getCategoryId()); + if (Objects.nonNull(categoryVO)) { + categoryName = categoryVO.getName(); + } + String delivery = spuExcelVO.getDeliveryMode(); + delivery = delivery.substring(0, delivery.length() - 1); + for (SupplierSpuExcelVO spuExcel : skuData) { + spuExcel.setPriceFee(AnalysisUtil.conversionPrices(spuExcel.getPriceFee())); + spuExcel.setMarketPriceFee(AnalysisUtil.conversionPrices(spuExcel.getMarketPriceFee())); + spuExcel.setSeq(spuExcelVO.getSeq()); + spuExcel.setBrandName(brandName); + spuExcel.setDeliveryTemplate(spuExcelVO.getDeliveryTemplate()); + spuExcel.setNameZh(spuExcelVO.getNameZh()); + spuExcel.setSellingPointZh(spuExcelVO.getSellingPointZh()); + spuExcel.setShopCategoryName(shopCategoryName); + spuExcel.setCategoryName(categoryName); + spuExcel.setDeliveryMode(delivery); + spuExcel.setStatus(spuExcelVO.getStatus()); + spuExcel.setCommissionSpuStatus(spuExcelVO.getCommissionSpuStatus()); + spuExcel.setSupplierDelivery(spuExcelVO.getSupplierDelivery()); + spuExcel.setSupplyPrice(AnalysisUtil.conversionPrices(spuExcel.getSupplyPrice())); + spuExcel.setSupplierName(spuExcelVO.getSupplierName()); + spuExcelList.add(spuExcel); + } + } + + /** + * 获取spu信息 + * + * @param spuList + * @param spu + * @param categoryMap 平台分类 + * @param shopCategoryMap 店铺分类 + * @param transportMap 运费模板 + * @param brandMap 品牌 + */ + private void loadSpuData(List spuList, SpuDTO spu, Map categoryMap, Map shopCategoryMap, + Map transportMap, Map> brandMap, Map> errorMap) { + Integer sysType = AuthUserContext.get().getSysType(); + boolean init = false; + List skuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuExcelVO spuExcelVO : spuList) { + if (!init) { + if (StrUtil.isBlank(spuExcelVO.getNameZh())) { + addSpuExcelError(errorMap, SpuExportError.SPU_NAME, spuExcelVO.getSeq()); + return; + } + spu.setSpuCode(Objects.nonNull(spuExcelVO.getSpuCode()) ? spuExcelVO.getSpuCode() : null); + // 商品国际化信息 + spu.setSpuLangList(new ArrayList<>(1)); + SpuLangDTO spuLangDTO = new SpuLangDTO(LanguageEnum.LANGUAGE_ZH_CN.getLang(), spuExcelVO.getNameZh(), spuExcelVO.getSellingPointZh()); + spuLangDTO.setDetail(spuExcelVO.getDetailZh()); + spu.getSpuLangList().add(spuLangDTO); + spu.setBrandId(handleBrand(brandMap.get(spuExcelVO.getBrandName()))); + // 平台分类 + Long categoryId = categoryMap.get(spuExcelVO.getCategoryName()); + if (Objects.isNull(categoryId)) { + addSpuExcelError(errorMap, SpuExportError.PLATFORM_CATEGORY, spuExcelVO.getSeq()); + return; + } + spu.setCategoryId(categoryId); + // 店铺分类 + Long shopCategoryId = shopCategoryMap.get(spuExcelVO.getShopCategoryName()); + //供应商没有店铺分类 + if (Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + spu.setShopCategoryId(-1L); + spu.setSupplierSpuType(SupplierSpuType.YES.value()); + } else { + if (Objects.isNull(shopCategoryId)) { + addSpuExcelError(errorMap, SpuExportError.SHOP_CATEGORY, spuExcelVO.getSeq()); + return; + } + spu.setShopCategoryId(shopCategoryId); + spu.setSupplierSpuType(SupplierSpuType.NO.value()); + } + if (handleVirtual(spu, errorMap, spuExcelVO)) { + return; + } + spu.setDeliveryMode(getDeliveryMode(spuExcelVO.getDeliveryMode())); + spu.setPreSaleType(Objects.isNull(spu.getPreSaleType()) ? -1 : spu.getPreSaleType()); + // 运费模板 + Long deliveryTemplateId = transportMap.get(spuExcelVO.getDeliveryTemplate()); + if (Objects.isNull(deliveryTemplateId) && !Objects.equals(spu.getSpuMold(), 1)) { + addSpuExcelError(errorMap, SpuExportError.DELIVER, spuExcelVO.getSeq()); + return; + } + setSpuInfo(spu, spuExcelVO, deliveryTemplateId); + init = true; + } + SkuDTO sku; + try { + //多规格商品 销售属性不能为空 + if (skuList.size() > 0 && StrUtil.isBlank(spuExcelVO.getPropertiesZh())) { + addSpuExcelError(errorMap, SpuExportError.PROPERTIES, spuExcelVO.getSeq()); + } + sku = loadSkuData(spuExcelVO, spu, errorMap); + } catch (Exception e) { + if (!Objects.equals(e.getMessage(), ResponseEnum.DATA_ERROR.value())) { + addSpuExcelError(errorMap, SpuExportError.PRODUCT_DATA, spuExcelVO.getSeq()); + } + return; + } + skuList.add(sku); + } + spu.setSkuList(skuList); + setPrice(spu, skuList); + // 保存商品信息 + spuService.save(spu); + } + + private boolean handleVirtual(SpuDTO spu, Map> errorMap, SpuExcelVO spuExcelVO) { + // 虚拟商品信息 + if (Objects.equals(spuExcelVO.getIsRefund(), YES)) { + spu.setIsRefund(1); + } else { + spu.setIsRefund(0); + } + if (Objects.equals(spuExcelVO.getSpuMold(), PHYSICAL_SPU)) { + spu.setSpuMold(0); + spu.setIsRefund(1); + spu.setVirtualRemark(null); + if (StrUtil.contains(spuExcelVO.getDeliveryMode(), DeliveryType.NOT_DELIVERY.description())) { + addSpuExcelError(errorMap, SpuExportError.DELIVERY_TYPE, spuExcelVO.getSeq()); + return true; + } + } else if (Objects.equals(spuExcelVO.getSpuMold(), VIRTUAL_SPU)) { + spu.setSpuMold(1); + String writeOffNum = spuExcelVO.getWriteOffNum(); + String writeOffTime = spuExcelVO.getWriteOffTime(); + if (!StrUtil.equals(writeOffNum, WITHOUT) && Objects.isNull(writeOffTime)) { + addSpuExcelError(errorMap, SpuExportError.VIRTUAL_DATA, spuExcelVO.getSeq()); + return true; + } + switch (writeOffNum) { + case REPEATEDLY: + spu.setWriteOffNum(-1); + spu.setWriteOffMultipleCount(StrUtil.equals(spuExcelVO.getWriteOffMultipleCount(), UNLIMITED) || StrUtil.isBlank(spuExcelVO.getWriteOffMultipleCount()) ? -1 : Integer.parseInt(spuExcelVO.getWriteOffMultipleCount().replace("次", ""))); + break; + case WITHOUT: + spu.setWriteOffNum(0); + break; + case SINGLE: + spu.setWriteOffNum(1); + break; + default: break; + } + if (StrUtil.equals(spuExcelVO.getWriteOffNum(), WITHOUT)) { + spu.setWriteOffTime(null); + }else if (StrUtil.equals(writeOffTime, CUSTOMIZATION)) { + spu.setWriteOffTime(0); + } else if (StrUtil.equals(writeOffTime, LONG_TERM)) { + spu.setWriteOffTime(-1); + } else { + spu.setWriteOffTime(Integer.parseInt(spuExcelVO.getWriteOffTime().replace(DAY_STR, ""))); + } + spu.setWriteOffStart(spuExcelVO.getWriteOffStart()); + spu.setWriteOffEnd(spuExcelVO.getWriteOffEnd()); + spu.setVirtualRemark(spuExcelVO.getVirtualRemark()); + spu.setDeliveryMode(DeliveryType.NOT_DELIVERY.description()); + } + return false; + } + + private static void setSpuInfo(SpuDTO spu, SpuExcelVO spuExcelVO, Long deliveryTemplateId) { + spu.setDeliveryTemplateId(deliveryTemplateId); + if (Objects.nonNull(deliveryTemplateId) && deliveryTemplateId == -1L) { + spu.setDeliveryAmount(Math.round(Arith.mul(Double.parseDouble(spuExcelVO.getDeliveryAmount()), Constant.PRICE_MAGNIFICATION))); + } + spu.setPriceFee(Constant.MIN_SPU_AMOUNT); + spu.setMarketPriceFee(Constant.MIN_SPU_AMOUNT); + if (Objects.equals(spuExcelVO.getStatus(), ENABLE)) { + spu.setStatus(StatusEnum.ENABLE.value()); + } else { + spu.setStatus(StatusEnum.DISABLE.value()); + } + spu.setMainImgUrl(StrUtil.isNotBlank(spuExcelVO.getImgs()) ? spuExcelVO.getImgs().split(",")[0] : ""); + spu.setImgUrls(StrUtil.isNotBlank(spuExcelVO.getImgs()) ? spuExcelVO.getImgs() : ""); + spu.setVideo(spuExcelVO.getVideo()); + spu.setHasSkuImg(0); + spu.setSpuType(SpuType.NORMAL.value()); + spu.setSeq(1); + spu.setScoreFee(Constant.ZERO_LONG); + if (Objects.isNull(spu.getSpuMold())) { + spu.setSpuMold(0); + } + } + + private static void setPrice(SpuDTO spu, List skuList) { + // 售价最小的sku,决定spu的售价以及市场价 + Long priceFee = Long.MAX_VALUE; + Long marketPriceFee = Constant.MIN_SPU_AMOUNT; + for (SkuDTO sku : skuList) { + if (sku.getPriceFee() < priceFee) { + priceFee = sku.getPriceFee(); + marketPriceFee = sku.getMarketPriceFee(); + } + } + if (priceFee == Long.MAX_VALUE) { + priceFee = Constant.MIN_SPU_AMOUNT; + } + spu.setPriceFee(priceFee); + spu.setMarketPriceFee(marketPriceFee); + } + + private Long handleBrand(List brandLangList) { + if (CollUtil.isEmpty(brandLangList)) { + return null; + } + if (brandLangList.size() > 1) { + brandLangList.sort(Comparator.comparing(BrandLang::getLang).thenComparing(BrandLang::getBrandId).reversed()); + } + return brandLangList.get(0).getBrandId(); + } + + + /** + * 获取spu配送类型信息 + * + * @param data + * @return + */ + private String getDeliveryMode(String data) { + SpuVO.DeliveryModeVO deliveryModeVO = new SpuVO.DeliveryModeVO(); + // 默认支持快递 + deliveryModeVO.setHasShopDelivery(Boolean.TRUE); + deliveryModeVO.setHasCityDelivery(StrUtil.contains(data, DeliveryType.SAME_CITY.description())); + deliveryModeVO.setHasUserPickUp(StrUtil.contains(data, DeliveryType.STATION.description())); + return Json.toJsonString(deliveryModeVO); + } + + /** + * 获取sku数据 + * + * @param spuExcelVO + * @param spu + * @param errorMap + * @return + */ + private SkuDTO loadSkuData(SpuExcelVO spuExcelVO, SpuDTO spu, Map> errorMap) { + spu.setTotalStock(0); + SkuDTO sku = new SkuDTO(); + sku.setSkuLangList(new ArrayList<>(Constant.INITIAL_CAPACITY)); + StrUtil.isNotBlank(sku.getSkuName()); + sku.setPriceFee(conversionPricesToLong(spuExcelVO.getPriceFee())); + sku.setMarketPriceFee(conversionPricesToLong(spuExcelVO.getMarketPriceFee())); + sku.setStatus(StatusEnum.ENABLE.value()); + sku.setStock(getStock(spuExcelVO.getStock())); + // 添加管理库存点数据 + StockPointSkuDTO stockPointSkuDTO = new StockPointSkuDTO(); + Long warehouseId = warehouseFeignClient.getDefaultIdByShopId(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()).getData(); + stockPointSkuDTO.setStockPointId(warehouseId); + stockPointSkuDTO.setStockPointType(StockPointType.WAREHOUSE.getValue()); + stockPointSkuDTO.setType(0); + stockPointSkuDTO.setStock(sku.getStock()); + sku.setStockPointList(Collections.singletonList(stockPointSkuDTO)); + spu.setTotalStock(spu.getTotalStock() + sku.getStock()); + sku.setPartyCode(spuExcelVO.getPartyCode()); + sku.setWeight(spuExcelVO.getWeight()); + sku.setVolume(spuExcelVO.getVolume()); + sku.setStockWarning(spuExcelVO.getStockWarning()); + sku.setScoreFee(Constant.ZERO_LONG); + if (sku.getPriceFee() < spu.getPriceFee()) { + spu.setPriceFee(sku.getPriceFee()); + } + if (sku.getMarketPriceFee() < spu.getMarketPriceFee()) { + spu.setMarketPriceFee(sku.getMarketPriceFee()); + } + boolean blankSkuNameZh = StrUtil.isBlank(spuExcelVO.getSkuNameZh()); + boolean blankPropertiesZh = StrUtil.isBlank(spuExcelVO.getPropertiesZh()); + if (blankSkuNameZh && blankPropertiesZh) { + return sku; + } + // 属性值及sku名称状态必须一致(都为空,或都有值) + else if (!Objects.equals(blankPropertiesZh, blankSkuNameZh)) { + addSpuExcelError(errorMap, blankPropertiesZh ? SpuExportError.SKU_NAME : SpuExportError.PROPERTIES, spuExcelVO.getSeq()); + throw new LuckException(ResponseEnum.DATA_ERROR); + } + + + sku.setSpuSkuAttrValues(new ArrayList<>(Constant.INITIAL_CAPACITY)); + String[] propertiesZh = spuExcelVO.getPropertiesZh().split(Constant.SEMICOLON); + StringBuilder attrsZh = new StringBuilder(Constant.INITIAL_CAPACITY); + StringBuilder attrsEn = new StringBuilder(Constant.INITIAL_CAPACITY); + for (String s : propertiesZh) { + SpuSkuAttrValueDTO spuSkuAttrValue = new SpuSkuAttrValueDTO(); + spuSkuAttrValue.setSpuSkuAttrValueLangList(new ArrayList<>(Constant.INITIAL_CAPACITY)); + setSpuSkuAttrValueLang(spuSkuAttrValue, s, attrsZh, LanguageEnum.LANGUAGE_ZH_CN.getLang()); + sku.getSpuSkuAttrValues().add(spuSkuAttrValue); + } + attrsZh.deleteCharAt(attrsZh.lastIndexOf(Constant.COMMA)); + // sku国际化信息 + sku.getSkuLangList().add(new SkuLangDTO(LanguageEnum.LANGUAGE_ZH_CN.getLang(), spuExcelVO.getSkuNameZh(), attrsZh.toString())); + return sku; + } + + /** + * 插入属性数据 + * + * @param spuSkuAttrValue + * @param property + * @param attrs + * @param lang + */ + private void setSpuSkuAttrValueLang(SpuSkuAttrValueDTO spuSkuAttrValue, String property, StringBuilder attrs, Integer lang) { + String[] attr = property.split(Constant.COLON); + attrs.append(attr[0]).append(Constant.COMMA); + SpuSkuAttrValueLangDTO spuSkuAttrValueLangDTO = new SpuSkuAttrValueLangDTO(); + spuSkuAttrValueLangDTO.setLang(lang); + spuSkuAttrValueLangDTO.setAttrName(attr[0]); + spuSkuAttrValueLangDTO.setAttrValueName(attr[1]); + spuSkuAttrValue.getSpuSkuAttrValueLangList().add(spuSkuAttrValueLangDTO); + } + + /** + * 获取sku库存 + * + * @param stock + * @return + */ + private Integer getStock(Integer stock) { + Integer minStock = 0; + if (Objects.isNull(stock) || stock < minStock) { + return minStock; + } + return stock; + } + + /** + * 金额Double格式转换Long + * + * @param num + * @return + */ + private Long conversionPricesToLong(String num) { + long amount; + try { + amount = Math.round(Arith.mul(Double.parseDouble(num), Constant.PRICE_MAGNIFICATION)); + if (amount < Constant.MIN_SPU_AMOUNT) { + amount = Constant.MIN_SPU_AMOUNT; + } + if (amount > Constant.MAX_SPU_AMOUNT) { + amount = Constant.MAX_SPU_AMOUNT; + } + } catch (Exception e) { + amount = Constant.MIN_SPU_AMOUNT; + } + return amount; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuExtensionServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuExtensionServiceImpl.java new file mode 100644 index 0000000..8916bb8 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuExtensionServiceImpl.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.mapper.SpuExtensionMapper; +import com.tmerclub.cloud.product.model.SpuExtension; +import com.tmerclub.cloud.product.service.SkuStockService; +import com.tmerclub.cloud.product.service.SpuExtensionService; +import com.tmerclub.cloud.product.vo.SpuExtensionVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; + +/** + * + * + * @author FrozenWatermelon + * @date 2020-11-11 13:49:06 + */ +@Service +public class SpuExtensionServiceImpl implements SpuExtensionService { + + @Autowired + private SpuExtensionMapper spuExtensionMapper; + @Autowired + private SkuStockService skuStockService; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> spuExtensionMapper.list()); + } + + @Override + public SpuExtensionVO getBySpuExtendId(Long spuExtendId) { + return spuExtensionMapper.getBySpuExtendId(spuExtendId); + } + + @Override + public void save(SpuExtension spuExtension) { + spuExtensionMapper.save(spuExtension); + } + + @Override + public void deleteById(Long spuId) { + spuExtensionMapper.deleteById(spuId); + } + + @Override + public SpuExtension getBySpuId(Long spuId) { + return spuExtensionMapper.getBySpuId(spuId); + } + + @Override + @CacheEvict(cacheNames = CacheNames.SPU_EXTENSION_KEY, key = "#spuExtension.spuId") + public void update(SpuExtension spuExtension) { + spuExtensionMapper.update(spuExtension); + } + + @Override + @CacheEvict(cacheNames = CacheNames.SPU_EXTENSION_KEY, key = "#spuId") + public void updateWaterSoldNumBySpuId(Long spuId, Integer waterSoldNum) { + spuExtensionMapper.updateWaterSoldNumBySpuId(spuId, waterSoldNum); + } + + @Override + @CacheEvict(cacheNames = CacheNames.SPU_EXTENSION_KEY, key = "#spuId") + public void changeCommentNum(Long spuId, Integer changeCount) { + spuExtensionMapper.changeCommentNum(spuId, changeCount); + } + + @Override + public void updateSaleNumBySeckillOrder(Long spuId, Integer prodCount) { + spuExtensionMapper.updateSaleNumBySeckillOrder(spuId, prodCount); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuLangServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuLangServiceImpl.java new file mode 100644 index 0000000..a6ed0cb --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuLangServiceImpl.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.mapper.SpuLangMapper; +import com.tmerclub.cloud.product.model.SpuLang; +import com.tmerclub.cloud.product.service.SpuLangService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * 商品-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +@Service +public class SpuLangServiceImpl implements SpuLangService { + + @Autowired + private SpuLangMapper spuLangMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> spuLangMapper.list()); + } + + @Override + public SpuLang getBySpuId(Long spuId) { + return spuLangMapper.getBySpuId(spuId); + } + + @Override + public void batchSave(List spuLangList) { + spuLangMapper.batchSave(spuLangList); + } + + @Override + public void batchUpdate(List spuLangList) { + spuLangMapper.batchUpdate(spuLangList); + } + + @Override + public void deleteById(Long spuId) { + spuLangMapper.deleteById(spuId); + } + + @Override + public void update(List spuLangList, Long spuId) { + if (CollUtil.isEmpty(spuLangList)) { + return; + } + List langIds = spuLangMapper.listLangId(spuId); + if (CollUtil.isEmpty(langIds)) { + spuLangMapper.batchSave(spuLangList); + return; + } + if (CollUtil.isEmpty(spuLangList)) { + spuLangMapper.deleteBatchBySpuIdAndLang(spuId, langIds); + return; + } + Iterator iterator = spuLangList.iterator(); + List saveList = new ArrayList<>(Constant.INITIAL_CAPACITY); + while (iterator.hasNext()) { + SpuLang spuLang = iterator.next(); + if (langIds.contains(spuLang.getLang())) { + langIds.remove(spuLang.getLang()); + continue; + } + saveList.add(spuLang); + iterator.remove(); + } + if (CollUtil.isNotEmpty(saveList)) { + spuLangMapper.batchSave(saveList); + } + if (CollUtil.isNotEmpty(spuLangList)) { + spuLangMapper.batchUpdate(spuLangList); + } + if (CollUtil.isNotEmpty(langIds)) { + spuLangMapper.deleteBatchBySpuIdAndLang(spuId, langIds); + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuOfflineServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuOfflineServiceImpl.java new file mode 100644 index 0000000..f16bf45 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuOfflineServiceImpl.java @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.distribution.feign.DistributionFeignClient; +import com.tmerclub.cloud.api.group.feign.GroupFeignClient; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.SpuStatus; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.mapper.BrandMapper; +import com.tmerclub.cloud.product.mapper.SkuComboMapper; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.service.SpuOfflineService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * spu信息 + * + * @author lhd + * @date 2021-07-03 15:27:24 + */ +@Service +public class SpuOfflineServiceImpl implements SpuOfflineService { + + @Autowired + private SpuMapper spuMapper; + @Autowired + private SkuComboMapper skuComboMapper; + @Autowired + private BrandMapper brandMapper; + @DubboReference + private GroupFeignClient groupFeignClient; + @DubboReference + private SeckillFeignClient seckillFeignClient; + @DubboReference + private DistributionFeignClient distributionFeignClient; + + @Override + public void offlineSpuStatusAndActivity(Integer type, List spuIds, Long shopId, List categoryIds, Integer status, List shopIds) { + // 查询出所有的启用商品进行修改 + List spuList = spuMapper.getActivitySpuInfoByCategoryIdsAndShopId(type, spuIds, shopId, categoryIds, status, shopIds); + if (CollectionUtil.isEmpty(spuList)) { + return; + } + List seckillSpuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List groupSpuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuVO spuVO : spuList) { + if (Objects.equals(spuVO.getSpuType(), SpuType.SECKILL.value())) { + spuVO.setSpuType(0); + spuVO.setActivityId(0L); + seckillSpuIds.add(spuVO.getSpuId()); + } + if (Objects.equals(spuVO.getSpuType(), SpuType.GROUP.value())) { + spuVO.setSpuType(0); + spuVO.setActivityId(0L); + groupSpuIds.add(spuVO.getSpuId()); + } + + // 商品那边可能有平台下架和商家下架,其余都为0,商家下架 + if (type != 1) { + spuVO.setStatus(0); + } + } + spuMapper.updateBatch(spuList); + // 下线掉关联当前商品的组合商品 + offlineComboSpuBySpuIds(spuIds); + // 下线秒杀、团购活动 + offlineActivityBySpuIds(seckillSpuIds, groupSpuIds); + // 更新品牌商品数量 + spuIds = updateSpuCount(spuList); + // 下线分销商品 + ServerResponseEntity responseEntity = distributionFeignClient.handleSpuState(spuIds, new ArrayList<>(Constant.INITIAL_CAPACITY), StatusEnum.DISABLE.value()); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + } + + private void offlineComboSpuBySpuIds(List spuIds) { + //spuc + } + + private List updateSpuCount(List spuList) { + List spuIds = spuList.stream().map(SpuVO::getSpuId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(spuIds)) { + List brandIds = brandMapper.listBrandIdBySpuIds(spuIds); + if (CollUtil.isNotEmpty(brandIds)) { + brandMapper.batchUpdateSpuCount(brandIds); + } + } + return spuIds; + } + + @Override + public void offlineSpuStatusAndActivityByBrandId(List spuIds, Long brandId) { + Integer sysType = AuthUserContext.get().getSysType(); + // 查询出所有的启用商品进行修改 + List spuList = spuMapper.getActivitySpuInfoByCategoryIdsAndShopId(1, spuIds, null, null, null, null); + List seckillSpuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List groupSpuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuVO spuVO : spuList) { + spuVO.setBrandId(null); + spuVO.setStatus(SpuStatus.OFF_SHELF.value()); + if (Objects.equals(spuVO.getSpuType(), SpuType.GROUP.value())) { + spuVO.setSpuType(0); + spuVO.setActivityId(0L); + groupSpuIds.add(spuVO.getSpuId()); + } + if (Objects.equals(spuVO.getSpuType(), SpuType.SECKILL.value())) { + spuVO.setSpuType(0); + spuVO.setActivityId(0L); + seckillSpuIds.add(spuVO.getSpuId()); + } + } + if (CollectionUtil.isEmpty(spuList)) { + return; + } + spuMapper.updateBatchFieldSetNull(spuList); + // 下线对应的活动 + offlineActivityBySpuIds(seckillSpuIds, groupSpuIds); + // dev + if (Objects.nonNull(brandId) && !Objects.equals(brandId, Constant.ZERO_LONG)) { + brandMapper.batchUpdateSpuCount(Collections.singleton(brandId)); + } + // 下线分销商品 + ServerResponseEntity responseEntity = distributionFeignClient.handleSpuState(spuIds, new ArrayList<>(Constant.INITIAL_CAPACITY), StatusEnum.DISABLE.value()); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + } + + + private void offlineActivityBySpuIds(List seckillSpuIds, List groupSpuIds) { + // 下线对应的活动 + if (CollectionUtil.isNotEmpty(seckillSpuIds)) { + ServerResponseEntity responseEntity = seckillFeignClient.offlineSeckillBySpuIds(seckillSpuIds, false); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + } + // 下线对应的团购活动 + if (CollectionUtil.isNotEmpty(groupSpuIds)) { + ServerResponseEntity responseEntity = groupFeignClient.offlineGroupBySpuIds(groupSpuIds); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + } + } + + + @Override + public void offlineCommissionSpuStatusAndActivity(Integer type, List spuIds, Long shopId, List categoryIds, Integer status, Integer sysType) { + // 查询出所有的启用商品进行修改 + List spuList = spuMapper.getActivitySpuInfoByCategoryIdsAndShopId(type, spuIds, shopId, categoryIds, status, null); + List seckillSpuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List groupSpuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuVO spuVO : spuList) { + if (Objects.equals(spuVO.getSpuType(), SpuType.SECKILL.value())) { + spuVO.setSpuType(SpuType.NORMAL.value()); + spuVO.setActivityId(0L); + seckillSpuIds.add(spuVO.getSpuId()); + } + if (Objects.equals(spuVO.getSpuType(), SpuType.GROUP.value())) { + spuVO.setSpuType(SpuType.NORMAL.value()); + spuVO.setActivityId(0L); + groupSpuIds.add(spuVO.getSpuId()); + } + // 商品那边可能有平台下架和商家下架,其余都为0,商家下架 + if (type != 1) { + spuVO.setStatus(0); + } + } + if (CollectionUtil.isEmpty(spuList)) { + return; + } + spuMapper.updateBatch(spuList); + // 下线秒杀、团购活动 + offlineActivityBySpuIds(seckillSpuIds, groupSpuIds); + // 更新品牌商品数量 + spuIds = updateSpuCount(spuList); + // 下线分销商品 + ServerResponseEntity responseEntity = distributionFeignClient.handleSpuState(spuIds, Collections.singletonList(shopId), StatusEnum.DISABLE.value()); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuPriceLogServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuPriceLogServiceImpl.java new file mode 100644 index 0000000..265ff24 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuPriceLogServiceImpl.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.dto.SpuPriceLogDTO; +import com.tmerclub.cloud.product.mapper.SpuPriceLogMapper; +import com.tmerclub.cloud.product.model.SpuPriceLog; +import com.tmerclub.cloud.product.service.SpuPriceLogService; +import com.tmerclub.cloud.product.vo.SpuPriceLogVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 商品调价记录 + * + * @author lhd + * @date 2022-06-29 17:48:25 + */ +@Service +public class SpuPriceLogServiceImpl implements SpuPriceLogService { + + @Autowired + private SpuPriceLogMapper spuPriceLogMapper; + + @Override + public PageVO page(PageDTO pageDTO, SpuPriceLogDTO spuPriceLogDTO) { + return PageUtil.doPage(pageDTO, () -> spuPriceLogMapper.pageByParam(spuPriceLogDTO)); + } + + @Override + public SpuPriceLog getById(Long id) { + return spuPriceLogMapper.getById(id); + } + + @Override + public void save(SpuPriceLog spuPriceLog) { + spuPriceLogMapper.save(spuPriceLog); + } + + @Override + public void update(SpuPriceLog spuPriceLog) { + spuPriceLogMapper.update(spuPriceLog); + } + + @Override + public void deleteById(Long id) { + spuPriceLogMapper.deleteById(id); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuServiceImpl.java new file mode 100644 index 0000000..ea9110b --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuServiceImpl.java @@ -0,0 +1,2850 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.TypeReference; +import com.github.pagehelper.Page; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.combo.feign.ComboFeignClient; +import com.tmerclub.cloud.api.coupon.feign.CouponFeignClient; +import com.tmerclub.cloud.api.delivery.feign.DeliveryFeignClient; +import com.tmerclub.cloud.api.delivery.feign.SameCityFeignClient; +import com.tmerclub.cloud.api.delivery.feign.StationFeignClient; +import com.tmerclub.cloud.api.delivery.vo.SameCityVO; +import com.tmerclub.cloud.api.delivery.vo.ShopTransportVO; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.api.discount.feign.DiscountFeignClient; +import com.tmerclub.cloud.api.distribution.feign.DistributionFeignClient; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.flow.feign.FlowFeignClient; +import com.tmerclub.cloud.api.group.feign.GroupFeignClient; +import com.tmerclub.cloud.api.group.vo.GroupActivityVO; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.feign.IndexImgFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopSubstituteSalesFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.product.bo.SpuSimpleBO; +import com.tmerclub.cloud.api.product.dto.SupplierSpuUpdateDTO; +import com.tmerclub.cloud.api.product.feign.CategoryShopFeignClient; +import com.tmerclub.cloud.api.product.feign.GiveawayFeignClient; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.api.seckill.vo.SeckillApiVO; +import com.tmerclub.cloud.api.supplier.bo.SupplierDetailBO; +import com.tmerclub.cloud.api.supplier.constant.SupplierStatus; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.ProductCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.product.bo.EsCategoryBO; +import com.tmerclub.cloud.common.product.constant.*; +import com.tmerclub.cloud.common.product.dto.*; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.product.vo.app.SkuAppVO; +import com.tmerclub.cloud.common.product.vo.app.SpuAppVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.product.constant.DistributedIdKey; +import com.tmerclub.cloud.product.dto.SpuPageSearchDTO; +import com.tmerclub.cloud.api.product.dto.WarehouseDTO; +import com.tmerclub.cloud.product.manager.StockManager; +import com.tmerclub.cloud.product.mapper.*; +import com.tmerclub.cloud.product.model.*; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.mapper.*; +import com.tmerclub.cloud.product.model.*; +import com.tmerclub.cloud.product.service.SpuStockService; +import com.tmerclub.cloud.product.vo.SpuCountVO; +import com.tmerclub.cloud.product.vo.SupplierSpuVo; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.context.annotation.Lazy; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * spu信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@Service +public class SpuServiceImpl implements SpuService { + private static final Logger logger = LoggerFactory.getLogger(SpuServiceImpl.class); + @Autowired + private SpuMapper spuMapper; + @Autowired + private SegmentManager segmentManager; + @Autowired + private SpuOfflineService spuOfflineService; + @Autowired + private SpuDetailService spuDetailService; + @Autowired + private SpuExtensionService spuExtensionService; + @Autowired + private SpuTagReferenceService spuTagReferenceService; + @Autowired + private SpuAttrValueService spuAttrValueService; + @Autowired + private SkuService skuService; + @Autowired + private SkuComboService skuComboService; + @Autowired + private SpuLangService spuLangService; + @Autowired + private CategoryMapper categoryMapper; + @Autowired + private CategoryBrandService categoryBrandService; + @Autowired + private BrandMapper brandMapper; + @Autowired + private BrandShopService brandShopService; + @Autowired + private CategoryShopMapper categoryShopMapper; + @DubboReference + private FlowFeignClient flowFeignClient; + @DubboReference + private DiscountFeignClient discountFeignClient; + @DubboReference + private CouponFeignClient couponFeignClient; + @DubboReference + private OfflineHandleEventFeignClient offlineHandleEventFeignClient; + @DubboReference + private GroupFeignClient groupFeignClient; + @Autowired + @Lazy + private AttrService attrService; + @DubboReference + private SeckillFeignClient seckillFeignClient; + @DubboReference + private ComboFeignClient comboFeignClient; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private DistributionFeignClient distributionFeignClient; + @DubboReference + private DeliveryFeignClient deliveryFeignClient; + @Autowired + private SkuMapper skuMapper; + @DubboReference + private ShopSubstituteSalesFeignClient shopSubstituteSalesFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @Autowired + private SkuLangService skuLangService; + @Autowired + private SpuConsignmentChangeMapper spuConsignmentChangeMapper; + @Autowired + private SpuSupplierChangeLogService spuSupplierChangeLogService; + @Autowired + private ImportSupplierSpuService importSupplierSpuService; + @Autowired + private SupplierSpuUpdateLaterOperateService supplierSpuUpdateLaterOperateService; + @Autowired + private GiveawaySpuMapper giveawaySpuMapper; + @Autowired + private RocketMQTemplate sendProductNotifyToShopTemplate; + @DubboReference + private ConfigFeignClient configFeignClient; + @Autowired + private SkuStockService skuStockService; + @DubboReference + private SameCityFeignClient sameCityFeignClient; + @DubboReference + private IndexImgFeignClient indexImgFeignClient; + @Autowired + private GiveawayService giveawayService; + @DubboReference + private GiveawayFeignClient giveawayFeignClient; + @Autowired + private SpuStockService spuStockService; + @Autowired + private StockPointSkuService stockPointSkuService; + @DubboReference + private StationFeignClient stationFeignClient; + @Autowired + private WarehouseService warehouseService; + @DubboReference + private CategoryShopFeignClient categoryShopFeignClient; + + private static final Integer SHOP_OFFLINE_TYPE = 3; + + @Autowired + private StockManager stockManager; + + @Override + public PageVO page(PageDTO pageDTO, SpuPageSearchDTO spuDTO) { + return PageUtil.doPage(pageDTO, () -> spuMapper.list(spuDTO)); + } + + @Override + @Cacheable(cacheNames = CacheNames.SPU_KEY, key = "#spuId", sync = true) + public SpuVO getBySpuId(Long spuId) { + // 获取数据列表:spu、spu国际化、spu详情、skuIds、赠品活动信息 + SpuVO spu = spuMapper.getSpuInfoBySpuId(spuId); + if (Objects.isNull(spu)) { + throw new LuckException(ResponseEnum.SPU_NOT_EXIST); + } + // 获取skuId和组合商品的sku组合列表 + // skuId列表,更改sku时spu必定会更新,此处的缓存就会被清除,不需要做额外处理,用于后台管理页面查询商品总库存,减少一次sku列表的查询 + List skuList = skuMapper.listSimpleSkuAndComboBySpuId(spuId); + spu.setSkus(skuList); + // 定金预售 + if (Objects.equals(spu.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + spu.setDepositValue(PriceUtil.toDecimalPrice(spu.getDepositAmount())); + spu.setDepositExpansionValue(PriceUtil.toDecimalPrice(spu.getDepositExpansionAmount())); + } + // 插入赠品的信息, 组装订单项时减少赠品的查询,仅活动的数据,不需要用到具体的赠品信息 + GiveawayVO giveawayVO = giveawayService.getGiveawayBySpuId(spuId); + spu.setGiveawayVO(giveawayVO); + return spu; + } + + @Override + public Map mapSpuByCache(List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return Collections.emptyMap(); + } + Map spuMap = RedisUtil.mapByIds(CacheNames.SPU_KEY, spuIds , SpuVO.class); + if (MapUtil.isNotEmpty(spuMap) && spuMap.size() != spuIds.size()) { + spuIds.removeAll(spuMap.keySet()); + if (CollUtil.isEmpty(spuIds)) { + return spuMap; + } + } + SpuService spuService = (SpuServiceImpl) AopContext.currentProxy(); + for (Long spuId : spuIds) { + SpuVO spuVO = spuService.getBySpuId(spuId); + if (Objects.isNull(spuVO)) { + throw new LuckException("商品不存在或者已删除"); + } + spuMap.put(spuId, spuVO); + } + return spuMap; + } + + @Override + @Cacheable(cacheNames = CacheNames.SPU_EXTENSION_KEY, key = "#spuId", sync = true) + public SpuExtension getSpuExtension(Long spuId) { + return spuExtensionService.getBySpuId(spuId); + } + + @Override + public void batchRemoveSpuActivityCache(List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return; + } + RedisUtil.deleteBatch(CacheNames.SPU_ACTIVITY_KEY, spuIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void changeSpuStatus(Long spuId, Integer status) { + batchChangeSpuStatus(Collections.singletonList(spuId), status); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void batchChangeSpuStatus(List spuIds, Integer status) { + if (Objects.isNull(AuthUserContext.get().getSysType())) { + throw new LuckException("下线异常"); + } + spuMapper.batchChangeSpuStatus(spuIds, status); + // 更新品牌信息 + List brandIds = brandMapper.listBrandIdBySpuIds(spuIds); + brandMapper.batchUpdateSpuCount(brandIds); + if (Objects.equals(status, StatusEnum.DISABLE.value()) || Objects.equals(status, StatusEnum.OFFLINE.value())) { + // 更新商品分组信息 + handleStatusChange(spuIds); + // T删掉满减、优惠券,组合商品的商品关联信息 + if (Objects.nonNull(AuthUserContext.get())) { + handleSpuStatusChange(spuIds); + } else { + handleCommissionSpuStatusChange(spuIds); + } + // 下线掉关联商品的活动 (在线下活动之前已经修改了商品的状态,下面的方法就查询不到已有的商品了,所以就需要带着修改后的商品去状态去查询) + spuOfflineService.offlineSpuStatusAndActivity(1, spuIds, null, null, status, null); + } else if (Objects.equals(status, StatusEnum.ENABLE.value())) { + handleDistributionSpuStatusChange(spuIds, status); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void batchChangeCommissionSpuStatus(List spuIds, Integer status, Integer sysType) { + if (CollUtil.isEmpty(spuIds)) { + return; + } + spuMapper.batchChangeSpuStatus(spuIds, status); + // 更新品牌信息 + List brandIds = brandMapper.listBrandIdBySpuIds(spuIds); + brandMapper.batchUpdateSpuCount(brandIds); + if (Objects.equals(status, StatusEnum.DISABLE.value()) || Objects.equals(status, StatusEnum.OFFLINE.value())) { + // 更新商品分组信息 + handleStatusChange(spuIds); + // T删掉满减、优惠券的商品关联信息 + if (!Objects.isNull(AuthUserContext.get())) { + handleSpuStatusChange(spuIds); + } else { + handleCommissionSpuStatusChange(spuIds); + } + // 下线掉关联商品的活动 (在线下活动之前已经修改了商品的状态,下面的方法就查询不到已有的商品了,所以就需要带着修改后的商品去状态去查询) + spuOfflineService.offlineCommissionSpuStatusAndActivity(1, spuIds, null, null, status, sysType); + } else if (Objects.equals(status, StatusEnum.ENABLE.value())) { + handleDistributionSpuStatusChange(spuIds, status); + } + } + + private void handleDistributionSpuStatusChange(List spuIds, Integer status) { + List shopIds; + if (Objects.equals(AuthUserContext.get().getTenantId(), Constant.PLATFORM_SHOP_ID)) { + shopIds = new ArrayList<>(1); + } else { + shopIds = spuMapper.spuShopIdsBySpuIds(spuIds); + } + ServerResponseEntity responseEntity = distributionFeignClient.handleSpuState(spuIds, shopIds, status); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + // 如果是组合商品且为供应商发货的商品,再检查下供应商商品的状态是否为上架状态,如果不是上架状态不能上架 + List supplierComboSpuIds = new ArrayList<>(); + for (Long spuId : spuIds) { + SpuServiceImpl spuService = (SpuServiceImpl) AopContext.currentProxy(); + // 商品信息 + SpuVO spu = spuService.getBySpuId(spuId); + if(Objects.equals(spu.getSpuMold(),SpuMold.COMBO.value()) && Objects.equals(spu.getSupplierDeliveryType(),SupplierDeliveryType.SUPPLIER_DELIVERY.value())){ + supplierComboSpuIds.add(spu.getSupplierSpuId()); + } + } + if(CollectionUtil.isNotEmpty(supplierComboSpuIds)){ + List spuList = listSpuBySpuIds(supplierComboSpuIds); + long count = spuList.stream().filter(spuVO -> !Objects.equals(spuVO.getStatus(), StatusEnum.ENABLE.value())).count(); + if(count > 0){ + throw new LuckException("当前代销组合商品的供应商商品状态异常,不能进行上架"); + } + } + } + + private void handleSpuStatusChange(List spuIds) { + List shopIds; + if (Objects.equals(AuthUserContext.get().getTenantId(), Constant.PLATFORM_SHOP_ID)) { + shopIds = new ArrayList<>(1); + } else { + shopIds = spuMapper.spuShopIdsBySpuIds(spuIds); + } + if (CollUtil.isNotEmpty(spuIds)) { + ServerResponseEntity discountResponseEntity = discountFeignClient.handleSpuOffline(spuIds, shopIds); + if (!discountResponseEntity.isSuccess()) { + throw new LuckException(discountResponseEntity.getMsg()); + } + ServerResponseEntity couponResponseEntity = couponFeignClient.handleSpuOffline(spuIds, shopIds); + if (!couponResponseEntity.isSuccess()) { + throw new LuckException(couponResponseEntity.getMsg()); + } + offlineRelatedComboBySpuIds(spuIds); + } + } + + + private void handleCommissionSpuStatusChange(List spuIds) { + List shopIds = spuMapper.spuShopIdsBySpuIds(spuIds); + if (CollUtil.isNotEmpty(spuIds)) { + ServerResponseEntity discountResponseEntity = discountFeignClient.handleSpuOffline(spuIds, shopIds); + if (!discountResponseEntity.isSuccess()) { + throw new LuckException(discountResponseEntity.getMsg()); + } + ServerResponseEntity couponResponseEntity = couponFeignClient.handleSpuOffline(spuIds, shopIds); + if (!couponResponseEntity.isSuccess()) { + throw new LuckException(couponResponseEntity.getMsg()); + } + offlineRelatedComboBySpuIds(spuIds); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(SpuDTO spuDTO) { + int sysType = AuthUserContext.get().getSysType(); + if (sysType == SysTypeEnum.MULTISHOP.value()) { + spuDTO.setShopId(AuthUserContext.get().getTenantId()); + spuDTO.setSupplierId(-1L); + } else if (sysType == SysTypeEnum.SUPPLIER.value()) { + spuDTO.setSupplierId(AuthUserContext.get().getTenantId()); + spuDTO.setShopId(-1L); + } + checkSaveOrUpdateInfo(spuDTO, null, true); + Spu spu = BeanUtil.map(spuDTO, Spu.class); + handlePreSaleInfo(spuDTO, spu); + Long spuId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SPU); + spu.setSpuId(spuId); + //判断发货方式,供应商发货属于代销商品 + handleSupplierDelivery(spuDTO, spu); + //判断发货方式,商家发货属于普通商品 + if (Objects.nonNull(spu.getSupplierDeliveryType()) && Objects.equals(spu.getSupplierDeliveryType(), SupplierDeliveryType.SHOP_DELIVERY.value())) { + spu.setSupplierSpuType(SupplierSpuType.NO.value()); + } + handlePlatformAudit(sysType, spu); + // 1.保存商品信息 + spu.setBrandId(Objects.equals(spuDTO.getBrandId(), 0L) ? null : spuDTO.getBrandId()); + spu.setScoreFee(Objects.isNull(spuDTO.getScoreFee()) ? Constant.ZERO_LONG : spuDTO.getScoreFee()); + if (!Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + if (!Objects.isNull(spuDTO.getSupplierDeliveryType())) { + spu.setDeliveryTemplateId(Objects.nonNull(spuDTO.getSupplierDeliveryType()) && spuDTO.getSupplierDeliveryType() == 2 ? spuDTO.getDeliveryTemplateId() : 0); + } + } + spu.setSupplierId(Objects.isNull(spu.getSupplierId()) ? 0L : spu.getSupplierId()); + //供应商商品没有店铺分类 + spu.setShopCategoryId(Objects.equals(spu.getSupplierId(), -1L) ? spuDTO.getShopCategoryId() : -1L); + spu.setSpuMold(Objects.nonNull(spuDTO.getSpuMold()) ? spuDTO.getSpuMold() : 0); + if (Objects.equals(spu.getSpuMold(), 1)) { + // 虚拟商品的配送方式 + SpuVO.DeliveryModeVO mode = new SpuVO.DeliveryModeVO(); + mode.setHasShopDelivery(true); + mode.setHasUserPickUp(false); + mode.setHasCityDelivery(false); + spu.setDeliveryMode(Json.toJsonString(mode)); + } + + spuMapper.save(spu); + // 2.保存商品属性信息 + spuAttrValueService.save(spu.getSpuId(), spu.getCategoryId(), spuDTO.getSpuAttrValues(), AuthUserContext.get().getSysType()); + // 3.国际化信息、商品详情 + spuDTO.setSpuId(spu.getSpuId()); + List spuLangList = loadSpuLangInfo(spuDTO, Boolean.TRUE); + saveSpuExtension(spuDTO, spu); + // 5.更新品牌信息,仅在商家端发布商品时才更新 + if (Objects.equals(sysType, SysTypeEnum.MULTISHOP.value()) && Objects.nonNull(spu.getBrandId())) { + brandMapper.batchUpdateSpuCount(Collections.singleton(spu.getBrandId())); + } + // 6.保存sku和库存信息 + loadSkuInfo(spuLangList, spu.getMainImgUrl(), spuDTO.getSkuList()); + skuService.saveSkuAndStock(spuDTO.getSpuMold(), spu.getSpuId(), spu.getStatus(), spuDTO.getSkuList(), sysType, AuthUserContext.get().getUserId(), AuthUserContext.get().getTenantId()); + + } + + private void loadSkuInfo(List spuLangList, String mainImgUrl, List skuList) { + Map spuNameMap = spuLangList.stream().collect(Collectors.toMap(SpuLang::getLang, SpuLang::getSpuName)); + for (SkuDTO skuDTO : skuList) { + // 目前默认是中文,后面如果要国际化再改 + skuDTO.setSpuName(spuNameMap.get(LanguageEnum.LANGUAGE_ZH_CN.getLang())); + skuDTO.setSpuMainImgUrl(mainImgUrl); + } + } + + private void handleSupplierDelivery(SpuDTO spuDTO, Spu spu) { + if (Objects.nonNull(spu.getSupplierDeliveryType()) && Objects.equals(spu.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + //供应商商品类型为代销商品 + spu.setSupplierSpuType(SupplierSpuType.CONSIGNMENT.value()); + //判断规格全选还是部分选择 + //获取供应商商品sku信息 + SpuVO spuVO = BeanUtil.map(spu, SpuVO.class); + List skuVOList = skuService.listSkuAllInfoBySpuId(spu.getSupplierSpuId(), spuVO, false); + //判断选择sku长度是否小于供应商商品sku + spu.setSkuChoiceStatus(SkuChoiceStatus.ALL_CHOICE.value()); + if (spuDTO.getSkuList().size() < skuVOList.size()) { + //规格部分选择 + spu.setSkuChoiceStatus(SkuChoiceStatus.PART_CHOICE.value()); + } + } + } + + private void saveSpuExtension(SpuDTO spuDTO, Spu spu) { + // 4.商品扩展信息 + SpuExtension spuExtension = new SpuExtension(); + spuExtension.setSpuId(spu.getSpuId()); + spuExtensionService.save(spuExtension); + } + + private void handlePlatformAudit(int sysType, Spu spu) { + // 判断是否开启“商品发布审核”,若开启,商品状态改为“待审核”【平台端发布不用审核】 + String prodSwitchConfig = configFeignClient.getConfig(Constant.SPU_SWITCH_CONFIG).getData(); + if (!SysTypeEnum.PLATFORM.value().equals(sysType) + && !ObjectUtils.isEmpty(prodSwitchConfig)) { + Boolean spuAudit = JSON.parseObject(prodSwitchConfig, new TypeReference>() { + }) + .getOrDefault("spuAudit", false); + if (spuAudit) { + spu.setStatus(SpuStatus.PUBLISH_WAIT_AUDIT.value()); + } + } + } + + /** + * 处理平台端商品审核 + * @param sysType + * @param spuDTO + * @param spuDb + * @param isUpdate true:只更新商品名称 false:整个商品修改 + */ + private void handlePlatformAudits(int sysType, SpuDTO spuDTO, SpuVO spuDb, boolean isUpdate) { + // 判断是否开启“商品发布审核”,若开启,商品状态改为“待审核”【平台端发布不用审核】 + String prodSwitchConfig = configFeignClient.getConfig(Constant.SPU_SWITCH_CONFIG).getData(); + if (!SysTypeEnum.PLATFORM.value().equals(sysType) && !ObjectUtils.isEmpty(prodSwitchConfig)) { + Boolean spuAudit = JSON.parseObject(prodSwitchConfig, new TypeReference>() { + }) + .getOrDefault("spuAudit", false); + // 只有商品审核开启并且商品状态为上架状态的商品需要判断,并且不能是积分商品 + if (spuAudit && Objects.equals(spuDb.getStatus(), SpuStatus.PUT_SHELF.value()) && !spuDb.getSpuType().equals(SpuType.SCORE.value())) { + if (isUpdate) { + if (spuDTO.getSpuLangList() != null && !Objects.equals(spuDTO.getSpuLangList().get(0).getSpuName(), spuDb.getSpuLangList().get(0).getSpuName())) { + logger.info("判断商品是否修改了商品名称"); + spuDTO.setStatus(SpuStatus.PUBLISH_WAIT_AUDIT.value()); + } + } else { + handleAudits(spuDTO, spuDb); + } + } + } + } + + /** + * 判断商品是否需要审核 + * @param spuDTO + * @param spuDb + */ + private void handleAudits(SpuDTO spuDTO, SpuVO spuDb){ + // 判断商品是否修改了商品名称 + logger.info("判断商品是否修改了商品名称、卖点、详情"); + Map detailMap = spuDb.getDetailList().stream().collect(Collectors.toMap(SpuDetailVO::getLang, SpuDetailVO::getDetail)); + spuDTO.getSpuLangList().forEach(spuLangDTO -> { + spuDb.getSpuLangList().forEach(dbSpuLang -> { + if (spuLangDTO.getLang().equals(LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + boolean spuflag = (!Objects.equals(spuLangDTO.getSpuName(), dbSpuLang.getSpuName()) + || !Objects.equals(spuLangDTO.getSellingPoint(), dbSpuLang.getSellingPoint())); + boolean detailFlag = (Objects.equals(spuLangDTO.getDetail(), "") && spuDb.getDetailList().size() != 0) + || (!Objects.equals(spuLangDTO.getDetail(), "") && spuDb.getDetailList().size() == 0) + || !Objects.equals(spuLangDTO.getDetail(), detailMap.get(spuLangDTO.getLang()) == null ? "" : detailMap.get(spuLangDTO.getLang())); + if (spuflag || detailFlag) { + spuDTO.setStatus(SpuStatus.PUBLISH_WAIT_AUDIT.value()); + } + } + }); + }); + // 判断商品是否修改了图片视频 + boolean picflag = Objects.equals(spuDTO.getMainImgUrl(), spuDb.getMainImgUrl()) + && Objects.equals(spuDTO.getImgUrls(), spuDb.getImgUrls()) + && Objects.equals(spuDTO.getVideo(), spuDb.getVideo()); + List oldSkuList = skuService.listSkuWithAttrBySpuId(spuDTO.getSpuId()); + if (spuDTO.getSkuList().size() == oldSkuList.size() && picflag) { + logger.info("判断商品是否修改了规格(名,值,图片)"); + spuDTO.getSkuList().forEach(sku -> { + oldSkuList.forEach(dbSku -> { + if (Objects.equals(sku.getSkuId(), null)) { + logger.info("新增的sku"); + spuDTO.setStatus(SpuStatus.PUBLISH_WAIT_AUDIT.value()); + return; + } + if (sku.getSkuId().equals(dbSku.getSkuId()) && !Objects.equals(sku.getSkuLangList(), null) + && sku.getSkuLangList().size() != 0 && dbSku.getSkuLangList().size() != 0) { + Map skuNameMap = sku.getSkuLangList().stream().collect(Collectors.toMap(SkuLangDTO::getLang, SkuLangDTO::getSkuName)); + Map dbSkuNameMap = dbSku.getSkuLangList().stream().collect(Collectors.toMap(SkuLangVO::getLang, SkuLangVO::getSkuName)); + logger.info("语言判断"); + if (!Objects.equals(skuNameMap.get(LanguageEnum.LANGUAGE_ZH_CN.getLang()), dbSkuNameMap.get(LanguageEnum.LANGUAGE_ZH_CN.getLang())) + || !Objects.equals(sku.getImgUrl(), dbSku.getImgUrl())) { + spuDTO.setStatus(SpuStatus.PUBLISH_WAIT_AUDIT.value()); + } + } + }); + }); + } else { + spuDTO.setStatus(SpuStatus.PUBLISH_WAIT_AUDIT.value()); + return; + } + // 判断商品是否修改了基本属性 + List dbSpuAttrValues = spuAttrValueService.getSpuAttrsBySpuId(spuDTO.getSpuId()); + if (Objects.equals(spuDTO.getSpuAttrValues(), null) && Objects.isNull(dbSpuAttrValues)) { + logger.info("判断商品基本属性为空,直接返回"); + return; + } + boolean parameterFlag = !Objects.equals(spuDTO.getSpuAttrValues(), null) && Objects.isNull(dbSpuAttrValues); + boolean dbParameterFlag = Objects.nonNull(dbSpuAttrValues) && Objects.equals(spuDTO.getSpuAttrValues(), null); + if (parameterFlag || dbParameterFlag) { + logger.info("判断商品基本属性修改过,直接返回"); + spuDTO.setStatus(SpuStatus.PUBLISH_WAIT_AUDIT.value()); + return; + } + List spuAttrValueDTOS = spuDTO.getSpuAttrValues().stream().filter(spuAttrValueDTO -> !Objects.equals(spuAttrValueDTO.getAttrValueName(), null)).collect(Collectors.toList()); + if (spuAttrValueDTOS.size() != dbSpuAttrValues.size()) { + logger.info("商品新增或者删除了基本属性"); + spuDTO.setStatus(SpuStatus.PUBLISH_WAIT_AUDIT.value()); + } else { + spuAttrValueDTOS.forEach(spuAttrValueDTO -> { + dbSpuAttrValues.forEach(dbSpuAttrValue -> { + if (Objects.equals(spuAttrValueDTO.getAttrId(), dbSpuAttrValue.getAttrId())) { + logger.info("商品是否修改了基本属性值"); + boolean attrflag = Objects.equals(spuAttrValueDTO.getAttrValueName(), dbSpuAttrValue.getSpuAttrValueLangList().get(0).getAttrValueName()); + if (!attrflag) { + spuDTO.setStatus(SpuStatus.PUBLISH_WAIT_AUDIT.value()); + } + } + }); + }); + } + } + + /** + * 处理商品的预售信息 + * + * @param spuDTO + * @param spu + */ + private void handlePreSaleInfo(SpuDTO spuDTO, Spu spu) { + if (Objects.isNull(spuDTO.getPreSaleType()) || Objects.equals(spuDTO.getPreSaleType(), PreSaleType.DISABLE.value())) { + spu.setPreSaleType(-1); + return; + } + if (!(Objects.equals(spuDTO.getPreSaleType(), PreSaleType.FULLPAY.value()) || Objects.equals(spuDTO.getPreSaleType(), PreSaleType.DEPOSIT.value()))) { + spu.setPreSaleType(-1); + return; + } + if (Objects.isNull(spuDTO.getPreSaleDeliveryType())) { + throw new LuckException(ResponseEnum.DATA_INCOMPLETE); + } + // 定金预售 + if (Objects.equals(spuDTO.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + Long depositAmount = PriceUtil.toLongCent(spuDTO.getDepositValue()); + if (depositAmount < 1) { + throw new LuckException("定金数值设置错误,数值不能小于0.01"); + } + spu.setDepositAmount(depositAmount); + Long depositExpansionAmount = PriceUtil.toLongCent(spuDTO.getDepositExpansionValue()); + long balanceAmount = spu.getPriceFee() - depositExpansionAmount; + if (depositExpansionAmount < 1) { + throw new LuckException("定金膨胀数值设置错误,数值不能小于0.01"); + } + if (depositExpansionAmount < depositAmount) { + spu.setDepositExpansionAmount(depositAmount); + } + if (Objects.equals(spuDTO.getDepositType(), 1) && balanceAmount < 0) { + throw new LuckException("定金膨胀数值不能大于最低尾款数值"); + } + spu.setDepositExpansionAmount(depositExpansionAmount); + // 校验时间先后顺序 + if (spuDTO.getBalanceStartTime().getTime() < spuDTO.getDepositStartTime().getTime() || spuDTO.getBalanceEndTime().getTime() < spuDTO.getDepositEndTime().getTime()) { + throw new LuckException(ResponseEnum.HTTP_MESSAGE_NOT_READABLE); + } + } + } + + @Override + @CacheEvict(cacheNames = CacheNames.SPU_KEY, key = "#spuDTO.spuId") + @Transactional(rollbackFor = Exception.class) + public void update(SpuDTO spuDTO) { + Integer sysType = AuthUserContext.get().getSysType(); + SpuVO spuDb = spuMapper.getBySpuId(spuDTO.getSpuId()); + checkSaveOrUpdateInfo(spuDTO, spuDb,false); + Spu spu = BeanUtil.map(spuDTO, Spu.class); + spuDTO.setStatus(spuDb.getStatus()); + handlePlatformAudits(sysType, spuDTO, spuDb, false); + spu.setStatus(spuDTO.getStatus() == null? spuDb.getStatus() : spuDTO.getStatus()); + handlePreSaleInfo(spuDTO, spu); + if (Objects.nonNull(spuDTO.getPreSaleType()) && !Objects.equals(spuDTO.getPreSaleType(), PreSaleType.DISABLE.value())) { + checkProductType(spuDb); + } + spu.setBrandId(Objects.isNull(spuDTO.getBrandId()) ? Constant.ZERO_LONG : spuDTO.getBrandId()); + // 获取启用状态sku的最低价 + spuDTO.getSkuList().stream().filter(sku -> Objects.equals(sku.getStatus(), 1)).min(Comparator.comparing(SkuDTO::getPriceFee)).ifPresent(sku -> spu.setPriceFee(sku.getPriceFee())); + //代销商品验证基本信息是否更改以及商品金额判断修改 + if (Objects.equals(spuDTO.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value())) { + verifySpuMsgIsChange(spuDTO,spu); + } + // 如果是虚拟商品,在保存一下默认配送json | 代销商品,且供应商发货,默认只有快递配送方式 + if (Objects.equals(spu.getSpuMold(), 1) + || (Objects.equals(spuDTO.getSupplierDeliveryType(), 1) && Objects.equals(spuDTO.getSupplierSpuType(), 2))) { + SpuVO.DeliveryModeVO mode = new SpuVO.DeliveryModeVO(); + mode.setHasShopDelivery(true); + mode.setHasUserPickUp(false); + mode.setHasCityDelivery(false); + spu.setDeliveryMode(Json.toJsonString(mode)); + } + // 1.修改商品信息 + spuMapper.update(spu); + // 2.非代销商品修改属性信息 + if (!Objects.equals(spu.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value())) { + spuAttrValueService.update(spu.getSpuId(), spu.getCategoryId(), spuDb.getSupplierSpuType(), spuDTO.getSpuAttrValues()); + + } + // 3.国际化信息、商品详情 + List spuLangList = loadSpuLangInfo(spuDTO, Boolean.FALSE); + //校验赠品活动 + giveawayService.checkGiveawaySpuPrice(spuDTO); + + // 更新品牌信息 + if (!Objects.equals(spuDb.getBrandId(), spu.getBrandId())) { + List brandIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + brandIds.add(spuDb.getBrandId()); + brandIds.add(spu.getBrandId()); + brandMapper.batchUpdateSpuCount(brandIds); + } + if (Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + // 设置供应商商品变化缓存,用于更新代销商品下架 + RedisUtil.set(ProductCacheNames.SUPPLIER_SPU_UPDATE_STATUS + spuDb.getSpuId(), new SupplierSpuUpdateDTO(), 0); + //供应商修改 商家供应商发货的商品时 + //给代销商品增加供应商是商品更新标识 + List commissionSpuList = spuMapper.getCommissionSpuListBySupplierDeliver(spuDb.getSpuId()); + SendStatus sendStatus = sendProductNotifyToShopTemplate.syncSend(RocketMqConstant.SUPPLIER_PRODUCT_UPDATE, new GenericMessage<>(spu.getSpuId())).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + ServerResponseEntity supplierResp = supplierDetailFeignClient.getSupplierBySupplierId(spuDb.getSupplierId()); + // 校验spu基本信息变更 + this.checkSupplierSpuMsgChange(spuDTO, spuDb); + //发送给商家 代销商品变更提醒 + //批量发送商品下架消息给商家或供应商:商品xxx已被平台或供应商下架,点击去查看 + List notifyList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuVO spuVO : commissionSpuList) { + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setShopId(spuVO.getShopId()); + sendNotifyBO.setSendType(SendTypeEnum.COMMISSION_CHANGE.getValue()); + sendNotifyBO.setSpuId(spuVO.getSpuId()); + sendNotifyBO.setSpuName(spuVO.getName()); + sendNotifyBO.setSupplierName(supplierResp.getData().getSupplierName()); + notifyList.add(sendNotifyBO); + } + SendStatus sendStockStatus = sendProductNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_PRODUCT_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(notifyList)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + if (spu.getStatus().equals(SpuStatus.PUBLISH_WAIT_AUDIT.value())){ + //商品进入待审核状态,下架活动 + spuOfflineService.offlineCommissionSpuStatusAndActivity(1, Collections.singletonList(spu.getSpuId()), null, null, StatusEnum.FINISHED.value(), sysType); + // 下架商品时如果商品在套餐活动中且为主商品则失效套餐活动,赠品同样 + comboFeignClient.offComboMainSpu(spu.getSpuId()); + giveawayFeignClient.changeGiveawayStatus(spu.getSpuId()); + } + //改变 供应商商品更新后代销商品是否已同步更新 + if (!Objects.isNull(spuDTO.getIsSynUpdate()) && Objects.equals(spuDTO.getIsSynUpdate(), IsSynUpdate.NO_CHANGE.value)) { + spuMapper.changeSynUpdate(spuDTO.getSpuId(), IsSynUpdate.YEW_CHANGE.value()); + } + // 更新商品库存及sku信息 + updateSku(spuDTO, spuLangList); + + // 移除代销商品基本信息是否改变缓存 + RedisUtil.del(CacheNames.SPU_SUPPLIER_CHANGE_LOG + CacheNames.UNION + spuDTO.getSpuId()); + } + + /** + * 检查商品活动是否冲突 + * + * @param spuDb 修改前的商品信息 + */ + private void checkProductType(SpuVO spuDb) { + // 拼团商品 + if (Objects.equals(spuDb.getSpuType(), SpuType.GROUP.value()) && Objects.nonNull(spuDb.getActivityId()) && !Objects.equals(spuDb.getActivityId(), 0L)) { + ServerResponseEntity activityInfo = groupFeignClient.getActivityInfo(spuDb.getActivityId()); + String activityName = ""; + if (activityInfo.isSuccess()) { + activityName = activityInfo.getData().getActivityName(); + } + throw new LuckException("商品已经参加名为" + activityName + "的拼团活动,活动失效或结束后才能修改预售信息"); + } + // 秒杀商品 + if (Objects.equals(spuDb.getSpuType(), SpuType.SECKILL.value()) && Objects.nonNull(spuDb.getActivityId()) && !Objects.equals(spuDb.getActivityId(), 0L)) { + ServerResponseEntity seckillInfo = seckillFeignClient.getSeckillInfoById(spuDb.getActivityId()); + String seckillName = ""; + if (seckillInfo.isSuccess()) { + seckillName = seckillInfo.getData().getSeckillName(); + } + throw new LuckException("商品已经参加名为" + seckillName + "的秒杀活动,活动失效或结束后才能修改预售信息"); + } + // 积分商品 + if (Objects.equals(spuDb.getSpuType(), SpuType.SCORE.value())) { + throw new LuckException("积分商品无法参与预售活动"); + } + // 活动商品 + if (Objects.equals(spuDb.getSpuType(), SpuType.ACTIVE.value())) { + throw new LuckException("活动商品无法参与预售活动"); + } + ServerResponseEntity> comboInfoResponseEntity = comboFeignClient.listComboInfoBySpuId(spuDb.getShopId(), spuDb.getSpuId()); + List comboVOList = comboInfoResponseEntity.getData(); + // 优惠套餐 + if (CollUtil.isNotEmpty(comboVOList)) { + StringBuilder comboName = new StringBuilder(Constant.INITIAL_CAPACITY); + comboVOList.forEach(comboVO -> comboName.append(comboVO.getName()).append(" ")); + throw new LuckException("此商品正在参加" + comboName + "优惠套餐,待套餐活动失效或结束后才能修改预售信息"); + } + // 下架关联的组合商品 + List spuIds = skuComboService.getCombSpusByComboSpuIds(Collections.singletonList(spuDb.getSpuId()),null); + if(CollUtil.isNotEmpty(spuIds)) { + batchChangeSpuStatus(spuIds, StatusEnum.DISABLE.value()); + } + } + + private void verifySpuMsgIsChange(SpuDTO spuDTO, Spu spu) { + // 供应商发货,根据供应商的sku启用状态获取最低价 + if(Objects.equals(spuDTO.getSupplierDeliveryType(),SupplierDeliveryType.SUPPLIER_DELIVERY.value())){ + long priceFee = 0L; + for (SkuDTO skuDTO : spuDTO.getSkuList()) { + if(!Objects.equals(skuDTO.getSupplierSkuStatus(),StatusEnum.ENABLE.value())){ + continue; + } + priceFee = priceFee == 0L ? skuDTO.getPriceFee() : Math.min(priceFee,skuDTO.getPriceFee()); + } + spu.setPriceFee(priceFee); + } + SpuConsignmentChange spuConsignmentChange = new SpuConsignmentChange(); + spuConsignmentChange.setSpuId(spuDTO.getSpuId()); + spuConsignmentChange.setImageChange(spuDTO.getImageChange()); + spuConsignmentChange.setBrandChange(spuDTO.getBrandChange()); + spuConsignmentChange.setDetailChange(spuDTO.getDetailChange()); + spuConsignmentChange.setVideoChange(spuDTO.getVideoChange()); + spuConsignmentChange.setMeasureUnitChange(spuDTO.getMeasureUnitChange()); + spuConsignmentChange.setSellingPointChange(spuDTO.getSellingPointChange()); + spuConsignmentChange.setNameChange(spuDTO.getNameChange()); + spuConsignmentChange.setSpuCodeChange(spuDTO.getSpuCodeChange()); + if (Objects.isNull(spuDTO.getImageChange()) && Objects.isNull(spuDTO.getBrandChange()) && Objects.isNull(spuDTO.getDetailChange()) + && Objects.isNull(spuDTO.getVideoChange()) && Objects.isNull(spuDTO.getMeasureUnitChange()) + && Objects.isNull(spuDTO.getSellingPointChange()) && Objects.isNull(spuDTO.getNameChange()) && Objects.isNull(spuDTO.getSpuCodeChange())) { + return; + } + spuConsignmentChangeMapper.updateBySpuId(spuConsignmentChange); + } + + /** + * @param + */ + public List loadSpuLangInfo(SpuDTO spuDTO, Boolean isSave) { + List spuDetailList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List spuLangList = new ArrayList<>(Constant.INITIAL_CAPACITY); + boolean dataCorrect = false; + for (SpuLangDTO spuLangDTO : spuDTO.getSpuLangList()) { + SpuLang spuLang = BeanUtil.map(spuLangDTO, SpuLang.class); + spuLang.setSpuId(spuDTO.getSpuId()); + boolean isBlank = StrUtil.isBlank(spuLang.getSpuName()) && StrUtil.isBlank(spuLang.getSellingPoint()); + if (!isBlank) { + spuLangList.add(spuLang); + } + if (StrUtil.isNotBlank(spuLangDTO.getDetail())) { + SpuDetail spuDetail = new SpuDetail(); + spuDetail.setSpuId(spuDTO.getSpuId()); + spuDetail.setLang(spuLangDTO.getLang()); + spuDetail.setDetail(spuLangDTO.getDetail()); + spuDetailList.add(spuDetail); + } + if (!isBlank && Objects.equals(spuLang.getLang(), Constant.DEFAULT_LANG)) { + dataCorrect = true; + } + + } + + // 商品名称、卖点,商品详情,是否包含默认语言信息 + if (CollUtil.isEmpty(spuLangList) || !dataCorrect) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + if (isSave) { + if (spuDetailList.size() != 0) { + spuDetailService.batchSave(spuDetailList); + } + if (spuLangList.size() != 0) { + spuLangService.batchSave(spuLangList); + } + return spuLangList; + } + SpuVO spuDb = getBySpuId(spuDTO.getSpuId()); + spuDetailService.update(spuDetailList, spuDb.getDetailList(), spuDb.getSpuId()); + spuLangService.update(spuLangList, spuDb.getSpuId()); + return spuLangList; + } + + + /** + * 更新sku列表信息 + * + * @param spuDTO 商品信息 + */ + private void updateSku(SpuDTO spuDTO, List spuLangList) { + // 供应商商品不需要进行活动判断 + if(spuDTO.getShopId() != null) { + logger.info(" 商品进行套餐、赠品活动判断"); + // 套餐,赠品商品禁止修改新增/删除/禁用sku + List newSkuList = spuDTO.getSkuList(); + List newSkuStatus = newSkuList.stream().map(SkuDTO::getStatus).toList(); + // 获取修改前的sku信息 + List oldSkuList = skuService.listSkuWithAttrBySpuId(spuDTO.getSpuId()); + List oldSkuStatus = oldSkuList.stream().map(SkuVO::getStatus).toList(); + boolean equals = newSkuStatus.equals(oldSkuStatus); + if (newSkuList.size() != oldSkuList.size() || !equals) { + Boolean isComboSpu = comboFeignClient.checkComboSpu(spuDTO.getSpuId(), spuDTO.getShopId()).getData(); + if (isComboSpu) { + throw new LuckException("商品正在参与套餐活动,不能修改规格"); + } + List giveawaySpuVOList = giveawaySpuMapper.getBySpuId(spuDTO.getSpuId()); + if (CollectionUtil.isNotEmpty(giveawaySpuVOList)) { + throw new LuckException("商品正在参与赠品活动,不能修改规格"); + } + } + } + boolean notAllChange = false; + Integer stock = 0; + for (SkuDTO skuDTO : spuDTO.getSkuList()) { + stock = Objects.isNull(skuDTO.getStock()) ? 0 : skuDTO.getStock() + stock; + if (!notAllChange && Objects.nonNull(skuDTO.getSkuId())) { + notAllChange = true; + } + if (Objects.isNull(skuDTO.getSkuId())) { + if (spuDTO.getSpuType() != null && spuDTO.getSpuType().equals(SpuType.GROUP.value())) { + // 商品正在参与拼团活动,无法新增规格 + throw new LuckException("商品正在参与拼团活动,无法新增规格"); + } + if (spuDTO.getSpuType() != null && spuDTO.getSpuType().equals(SpuType.SECKILL.value())) { + // 商品正在参与秒杀活动,无法新增规格 + throw new LuckException("商品正在参与秒杀活动,无法新增规格"); + } + } + } + // 商品库存、商品sku + // sku更新 + if (notAllChange) { + updateGroupActivityPrice(spuDTO); + skuService.update(spuDTO, spuDTO.getSkuList()); + return; + } + List skuVOList = skuMapper.listSkuWithAttrBySpuId(spuDTO.getSpuId()); + if (skuVOList.size() > spuDTO.getSkuList().size()) { + //删除了sku + RedisUtil.set(ProductCacheNames.SKU_STATUS_DELETE + spuDTO.getSpuId(), 1, -1); + List commissionSpuIdList = spuMapper.getCommissionSpuIdList(spuDTO.getSpuId(), null); + //改变 供应商商品更新后代销商品是否已同步更新 + if (commissionSpuIdList.size() != 0) { + spuMapper.batchChangeSynUpdate(commissionSpuIdList, IsSynUpdate.YEW_CHANGE.value()); + } + } + skuService.deleteBySpuId(spuDTO); + loadSkuInfo(spuLangList, spuDTO.getMainImgUrl(), spuDTO.getSkuList()); + skuService.saveSkuAndStock(spuDTO.getSpuMold(), spuDTO.getSpuId(), spuDTO.getStatus(), spuDTO.getSkuList(), AuthUserContext.get().getSysType(), AuthUserContext.get().getUserId(), AuthUserContext.get().getTenantId()); + } + + private void updateGroupActivityPrice(SpuDTO spuDTO) { + List skuIds = spuDTO.getSkuList().stream().filter(sku -> Objects.equals(sku.getStatus(), 1)).map(SkuDTO::getSkuId).collect(Collectors.toList()); + ServerResponseEntity updateGroupActivityPrice = groupFeignClient.updateGroupActivityPrice(skuIds, spuDTO.getSpuId()); + if (!updateGroupActivityPrice.isSuccess()) { + throw new LuckException(updateGroupActivityPrice.getMsg()); + } + } + + @Override + @CacheEvict(cacheNames = CacheNames.SPU_KEY, key = "#spuId") + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void deleteById(Long spuId) { + SpuVO spuVO = getBySpuId(spuId); + if (Objects.isNull(spuVO) || Objects.equals(spuVO.getStatus(), StatusEnum.DELETE.value())) { + throw new LuckException("商品不存在或者已被删除!"); + } + // 删除商品、sku信息(逻辑删除) + spuMapper.updateStatusBySpuId(spuId); + List spuIds = Collections.singletonList(spuId); + // 删除关联活动的信息 + handleSpuStatusChange(spuIds); + // 下线掉关联商品的活动 (在线下活动之前已经修改了商品的状态,下面的方法就查询不到已有的商品了,所以就需要带着修改后的商品去状态去查询) + spuOfflineService.offlineSpuStatusAndActivity(1, spuIds, null, null, SpuStatus.DELETE.value(), null); + // 更新品牌信息 + brandMapper.batchUpdateSpuCount(Collections.singleton(spuVO.getBrandId())); + // 移除关联的分组 + handleStatusChange(Collections.singletonList(spuId)); + // 删除关联的组合商品信息 + skuComboService.deleteByComboSpuIds(spuIds); + handleStatusChange(Collections.singletonList(spuId)); + //如果是供应商品,给代销商品标注供应商品以更新 + if (Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.YES.value())) { + SpuDTO spuDTO = BeanUtil.map(spuVO, SpuDTO.class); + this.offSupplierSendCommissionSpu(spuDTO); + } + // 更新关联该商品的轮播图,以及缓存 + indexImgFeignClient.udpateIndexImgBySpuId(spuId, spuVO.getShopId()); + // 清除商品的统计数据 + flowFeignClient.deleteSpuDataBySpuId(spuId); + // 删除仓库门店关联商品库存信息 + stockPointSkuService.deleteBySpuId(spuId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateSpuOrSku(SpuDTO spuDTO) { + Spu spu = new Spu(); + spu.setSpuId(spuDTO.getSpuId()); + SpuVO spuDb = spuMapper.getBySpuId(spuDTO.getSpuId()); + Integer sysType = AuthUserContext.get().getSysType(); + // 供货价修改代销商品需要判断是否下架 + if (Objects.equals(sysType, SysTypeEnum.SUPPLIER.value()) && Objects.nonNull(spuDTO.getPriceFee())) { + SupplierSpuUpdateDTO spuUpdateDTO = new SupplierSpuUpdateDTO(); + spuUpdateDTO.setPriceUpdate(true); + RedisUtil.set(CacheNames.SUPPLIER_SPU_UPDATE_STATUS + spuDb.getSpuId(), spuUpdateDTO, 0); + } + + handlePlatformAudits(sysType, spuDTO, spuDb, true); + spu.setStatus(spuDTO.getStatus() == null? spuDb.getStatus() : spuDTO.getStatus()); + ProductLangUtil.spu(spuDb); + List skusDb = skuMapper.listSkuWithAttrBySpuId(spuDTO.getSpuId()); + // 修改商品名 + if (CollUtil.isNotEmpty(spuDTO.getSpuLangList())) { + SpuVO spuVO = spuMapper.getBySpuId(spuDTO.getSpuId()); + if (Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value())) { + //代销商品修改名称,记录代销商品基本信息是否已更新 + SpuConsignmentChange spuConsignmentChange = new SpuConsignmentChange(); + spuConsignmentChange.setSpuId(spuDTO.getSpuId()); + spuConsignmentChange.setNameChange(1); + spuConsignmentChangeMapper.updateBySpuId(spuConsignmentChange); + } + for (SpuLangDTO spuLangDTO : spuDTO.getSpuLangList()) { + spuLangDTO.setSpuId(spuDTO.getSpuId()); + } + spuLangService.update(BeanUtil.mapAsList(spuDTO.getSpuLangList(), SpuLang.class), spuDTO.getSpuId()); + } + spu.setSeq(spuDTO.getSeq()); + spuDTO.setName(spuDb.getName()); + spuDTO.setMainImgUrl(spuDb.getMainImgUrl()); + if (CollUtil.isNotEmpty(spuDTO.getSkuList())) { + skuService.updateAmountOrStock(spuDTO); + } + spu.setPriceFee(spuDTO.getPriceFee()); + //校验赠品活动 + spuDTO.setPriceFee(null == spuDTO.getPriceFee() ? spuDb.getPriceFee() : spuDTO.getPriceFee()); + giveawayService.checkGiveawaySpuPrice(spuDTO); + spuMapper.update(spu); + //供应商修改spu信息时,生成对应的变更记录 + if (Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.SUPPLIER.value())) { + //变更类型 1.商品上架 2.商品下架 3.代销sku信息变更4.新增sku + //新增sku + List spuSupplierChangeLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isNotEmpty(spuDTO.getSkuList()) && spuDTO.getSkuList().size() > skusDb.size()) { + SpuSupplierChangeLog spuSupplierChangeLog = new SpuSupplierChangeLog(); + spuSupplierChangeLog.setSpuId(spuDTO.getSpuId()); + spuSupplierChangeLog.setChangeType(SupplierSpuChangeType.ADD_SKU.value()); + spuSupplierChangeLogs.add(spuSupplierChangeLog); + } + //商品上架 + if (!Objects.equals(spuDTO.getStatus(), spuDb.getStatus()) && Objects.equals(spuDTO.getStatus(), StatusEnum.ENABLE.value())) { + SpuSupplierChangeLog spuSupplierChangeLog = new SpuSupplierChangeLog(); + spuSupplierChangeLog.setSpuId(spuDTO.getSpuId()); + spuSupplierChangeLog.setChangeType(SupplierSpuChangeType.PUT_SHELF.value()); + spuSupplierChangeLogs.add(spuSupplierChangeLog); + } + //商品下架 + if (!Objects.equals(spuDTO.getStatus(), spuDb.getStatus()) && Objects.equals(spuDTO.getStatus(), StatusEnum.DISABLE.value())) { + SpuSupplierChangeLog spuSupplierChangeLog = new SpuSupplierChangeLog(); + spuSupplierChangeLog.setChangeType(SupplierSpuChangeType.OFF_SHELF.value()); + spuSupplierChangeLog.setSpuId(spuDTO.getSpuId()); + spuSupplierChangeLogs.add(spuSupplierChangeLog); + } + //代销商品信息变更 + if (Objects.equals(spuDb.getSupplierSpuType(), SupplierSpuType.YES.value())) { + SpuSupplierChangeLog spuSupplierChangeLog = new SpuSupplierChangeLog(); + spuSupplierChangeLog.setChangeType(SupplierSpuChangeType.SKU_MSG_CHANGE.value()); + spuSupplierChangeLog.setSpuId(spuDTO.getSpuId()); + spuSupplierChangeLogs.add(spuSupplierChangeLog); + } + if (spuSupplierChangeLogs.size() > 0) { + spuSupplierChangeLogService.saveBatch(spuSupplierChangeLogs); + } + } + if (spu.getStatus().equals(SpuStatus.PUBLISH_WAIT_AUDIT.value())){ + //商品进入待审核状态,下架活动 + spuOfflineService.offlineCommissionSpuStatusAndActivity(1, Collections.singletonList(spu.getSpuId()), null, null, StatusEnum.FINISHED.value(), sysType); + // 下架商品时如果商品在套餐活动中且为主商品则失效套餐活动,赠品同样 + comboFeignClient.offComboMainSpu(spu.getSpuId()); + giveawayFeignClient.changeGiveawayStatus(spu.getSpuId()); + } + } + + @Override + public void updateSpuUpdateTime(List spuIds, List categoryIds, List shopIds, Integer sysType) { + if (CollUtil.isEmpty(spuIds) && CollUtil.isEmpty(categoryIds) && CollUtil.isEmpty(shopIds)) { + return; + } + spuMapper.updateSpuUpdateTime(spuIds, categoryIds, shopIds, sysType); + } + + + /** + * 处理分类数据 + * + * @param category + * @return + */ + private EsCategoryBO handleCategory(CategoryVO category) { + EsCategoryBO categoryBO = new EsCategoryBO(); + categoryBO.setCategoryId(category.getCategoryId()); + Map categoryMap = category.getCategoryLangList().stream().collect(Collectors.toMap(CategoryLangVO::getLang, CategoryLangVO::getName)); + categoryBO.setCategoryNameZh(categoryMap.get(LanguageEnum.LANGUAGE_ZH_CN.getLang())); + categoryBO.setCategoryNameEn(categoryMap.get(LanguageEnum.LANGUAGE_EN.getLang())); + return categoryBO; + } + + @Override + public List getSpuIdsBySpuUpdateDTO(List shopCategoryIds, List categoryIds, Long brandId, Long shopId) { + if (CollUtil.isEmpty(shopCategoryIds) && CollUtil.isEmpty(categoryIds) && Objects.isNull(brandId) && Objects.isNull(shopId)) { + return new ArrayList<>(0); + } + return spuMapper.getSpuIdsBySpuUpdateDTO(shopCategoryIds, categoryIds, brandId, shopId); + } + + @Override + @Cacheable(cacheNames = CacheNames.SPU_ACTIVITY_KEY, key = "#spuId", sync = true) + public SpuActivityAppVO spuActivityBySpuId(Long shopId, Long spuId) { + SpuActivityAppVO spuActivity = new SpuActivityAppVO(); + // 满减活动 + ServerResponseEntity> discountResponse = discountFeignClient.spuDiscountList(shopId, spuId); + if (!Objects.equals(discountResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(discountResponse.getMsg()); + } + spuActivity.setDiscountList(discountResponse.getData()); + + // 优惠券 + ServerResponseEntity> couponResponse = couponFeignClient.couponOfSpuDetail(shopId, spuId); + if (!Objects.equals(couponResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(couponResponse.getMsg()); + } + spuActivity.setCouponList(couponResponse.getData()); + return spuActivity; + } + + @Override + public List listSpuIdsByShopId(Long shopId) { + return spuMapper.getSpuIdsBySpuUpdateDTO(null, null, null, shopId); + } + + @Override + public SpuCountVO getSpuCountBySupplierId(Long supplierId) { + return spuMapper.getSpuCountBySupplierId(supplierId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void offlineSpuByShopId(Long shopId) { + spuMapper.offlineSpuByShopId(shopId); + // 查询出秒杀or团购的商品进行下线 + // 下线掉关联商品的活动 + // 下面这个方法查不到正常状态的商品了,所以需要把修改后的商品状态传过去 + spuOfflineService.offlineSpuStatusAndActivity(3, null, shopId, null, StatusEnum.DISABLE.value(), null); + } + + @Override + public List list(SpuPageSearchDTO spu) { + return spuMapper.list(spu); + } + + @Override + public void updateSpu(Spu spu) { + spuMapper.update(spu); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void offline(OfflineHandleEventDTO offlineHandleEventDto) { + OfflineHandleEventDTO offlineHandleEvent = new OfflineHandleEventDTO(); + offlineHandleEvent.setHandleId(offlineHandleEventDto.getHandleId()); + offlineHandleEvent.setHandleType(OfflineHandleEventType.PROD.getValue()); + offlineHandleEvent.setOfflineReason(offlineHandleEventDto.getOfflineReason()); + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.save(offlineHandleEvent); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 更新活动状态为下线状态 + changeSpuStatus(offlineHandleEvent.getHandleId(), StatusEnum.OFFLINE.value()); + } + + @Override + public OfflineHandleEventVO getOfflineHandleEvent(Long couponId) { + ServerResponseEntity offlineHandleEventResponse = + offlineHandleEventFeignClient.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.PROD.getValue(), couponId, null); + return offlineHandleEventResponse.getData(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void audit(OfflineHandleEventDTO offlineHandleEventDto) { + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.auditOfflineEvent(offlineHandleEventDto); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + Long spuId = offlineHandleEventDto.getHandleId(); + // 审核通过 + if (Objects.equals(offlineHandleEventDto.getStatus(), OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue())) { + changeSpuStatus(spuId, StatusEnum.DISABLE.value()); + } + // 审核不通过 + else if (Objects.equals(offlineHandleEventDto.getStatus(), OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue())) { + changeSpuStatus(spuId, StatusEnum.OFFLINE.value()); + } + //发送商品审核结果消息给商家或供应商:商品xxx审核成功,点击去查看 + SpuVO spuVO = spuMapper.getBySpuId(spuId); + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + if (Objects.nonNull(spuVO.getSupplierSpuType()) && Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.YES.value())) { + sendNotifyBO.setSupplierId(spuVO.getSupplierId()); + } else { + sendNotifyBO.setShopId(spuVO.getShopId()); + } + sendNotifyBO.setSendType(Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.YES.value()) ? SendTypeEnum.PRODUCT_AUDIT_TO_SUPPLIER.getValue() : SendTypeEnum.PRODUCT_AUDIT.getValue()); + sendNotifyBO.setSpuId(spuVO.getSpuId()); + sendNotifyBO.setSpuName(spuVO.getName()); + + SendStatus sendStockStatus = sendProductNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_PRODUCT_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(Collections.singletonList(sendNotifyBO))).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void auditApply(OfflineHandleEventDTO offlineHandleEventDto) { + // 更新事件状态 + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.updateToApply(offlineHandleEventDto); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 更新优惠券为待审核状态 + changeSpuStatus(offlineHandleEventDto.getHandleId(), StatusEnum.WAIT_AUDIT.value()); + } + + @Override + public List listCanSeckillProd(Long spuId, Long shopId) { + PageDTO pageDTO = new PageDTO(); + pageDTO.setPageNum(0); + pageDTO.setPageSize(PageDTO.MAX_PAGE_SIZE); + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setShopId(shopId); + spuDTO.setSpuId(spuId); + return spuMapper.listCanSeckillProd(new PageAdapter(pageDTO), spuDTO, I18nMessage.getLang()); + } + + @Override + public Integer countByTransportId(Long transportId) { + return spuMapper.countByTransportId(transportId); + } + + @Override + public void changeToNormalSpu(List spuIds) { + spuMapper.changeToNormalSpu(spuIds); + } + + @Override + public int countByCategoryAndShopId(Long categoryId, Long shopId, Integer sysType) { + return spuMapper.countByCategoryAndShopId(categoryId, shopId, sysType); + } + + @Override + public void handleStatusChange(List spuIds) { + // 删除商品的分组信息 + spuTagReferenceService.deleteSpuData(spuIds); + + } + + @Override + public Integer countByUserId(Long userId) { + return spuMapper.countByUserId(userId); + } + + @Override + public List listSpuNameBySpuIds(List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return new ArrayList<>(0); + } + List spuVOList = spuMapper.listSpuNameBySpuIds(spuIds); + ProductLangUtil.spuList(spuVOList); + return spuVOList; + } + + @Override + public List listSpuDetailBySpuIds(List spuIds) { + return spuMapper.listSpuDetailBySpuIds(spuIds); + } + + @Override + public void batchChangeSpuStatusByCidListAndShopId(List cidList, Integer status, Long shopId, Integer sysType) { + if (Objects.isNull(cidList) || cidList.size() == 0) { + return; + } + List spuIds = spuMapper.listIdByCidAndShopId(cidList, shopId, sysType); + if (Objects.isNull(spuIds) || spuIds.size() == 0) { + return; + } + this.batchChangeSpuStatus(spuIds, status); + } + + @Override + public List listSpuBySpuIds(List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return null; + } + List spuList = spuMapper.listSpuBySpuIds(spuIds); + ProductLangUtil.spuList(spuList); + if (CollectionUtil.isEmpty(spuList)) { + return spuList; + } + List shopIds = spuList.stream().map(SpuVO::getShopId).collect(Collectors.toList()); + ServerResponseEntity> shopResponse = shopDetailFeignClient.listByShopIds(shopIds); + if (!shopResponse.isSuccess()) { + throw new LuckException(shopResponse.getMsg()); + } + List shopDetailList = shopResponse.getData(); + Map shopMap = shopDetailList.stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName)); + for (SpuVO spuVO : spuList) { + if (!shopMap.containsKey(spuVO.getShopId())) { + continue; + } + spuVO.setShopName(shopMap.get(spuVO.getShopId())); + } + return spuList; + } + + @Override + public void verifySpuData() { + Date currentTime = new Date(); + // 获取数据库商品更新的数量 + ProductSearchDTO productSearchDTO = new ProductSearchDTO(); + Long spuNum = spuMapper.getAllSpuNum(currentTime); + productSearchDTO.setPageSize(1); + productSearchDTO.setPageNum(1); + // 需要获取被删除的商品,否则数量不对 + productSearchDTO.setGetDelete(1); + // 数量相同,不需要更新 + if (verifySpuNum(currentTime, productSearchDTO, spuNum)) { + return; + } + PageDTO pageDTO = new PageDTO(); + pageDTO.setPageSize(Constant.MAX_PAGE_SIZE); + pageDTO.setPageNum(1); + List updateList = new ArrayList<>(Constant.INITIAL_CAPACITY); + ProductSearchDTO simpleDTO = new ProductSearchDTO(); + while (spuNum > 0) { + // 每十次循环判断下,数据库与es中的商品数量是否一致了, 一致则不需要再更新 + boolean notUpdate = pageDTO.getPageNum() % 10 == 0 && verifySpuNum(currentTime, productSearchDTO, null) && CollUtil.isEmpty(updateList); + if (notUpdate) { + return; + } + PageVO page = PageUtil.doPage(pageDTO, () -> spuMapper.listAllSpu(currentTime)); + if (CollUtil.isEmpty(page.getList())) { + break; + } + List spuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Spu spu : page.getList()) { + spuIds.add(spu.getSpuId()); + } + simpleDTO.setSpuIds(spuIds); + // 需要获取被删除的商品,否则数量不对 + simpleDTO.setGetDelete(1); + ServerResponseEntity> spuResponseEntity = searchSpuFeignClient.simpleList(simpleDTO); + if (!spuResponseEntity.isSuccess()) { + throw new LuckException(spuResponseEntity.getMsg()); + } + Map spuMap = spuResponseEntity.getData().stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, SpuSearchVO::getUpdateTime)); + for (Spu spu : page.getList()) { + boolean isSame = spuMap.containsKey(spu.getSpuId()) && DateUtil.isSameTime(spu.getUpdateTime(), spuMap.get(spu.getSpuId())); + if (isSame) { + continue; + } + updateList.add(spu.getSpuId()); + } + if (updateList.size() > Constant.MAX_DATA_HANDLE_NUM) { + spuMapper.updateSpuUpdateTime(updateList, null, null, null); + updateList.clear(); + } + spuNum = spuNum - Constant.MAX_PAGE_SIZE; + pageDTO.setPageNum(pageDTO.getPageNum() + 1); + } + if (CollUtil.isNotEmpty(updateList)) { + spuMapper.updateSpuUpdateTime(updateList, null, null, null); + } + } + + @Override + public SpuAppVO prodInfo(Long spuId) { + SpuServiceImpl spuService = (SpuServiceImpl) AopContext.currentProxy(); + // 商品信息 + SpuVO spu = spuService.getBySpuId(spuId); + // 如果商品未上架,直接返回 + if (!Objects.equals(spu.getStatus(), StatusEnum.ENABLE.value())) { + this.updateSpuUpdateTime(Collections.singletonList(spuId), null, null, null); + throw new LuckException("商品已下架"); + } + ProductLangUtil.spu(spu); + ProductLangUtil.spuDetail(spu); + // 检验店铺信息 + this.checkShopStatusIsOpen(spu.getShopId()); + // 判断同城配送情况 + this.checkSameCity(spu); + SpuAppVO spuAppVO = BeanUtil.map(spu, SpuAppVO.class); + spuAppVO.setSpuName(spu.getName()); + + // 插入商品评论数量 + this.loadSpuSale(spuId, spuService, spuAppVO); + + // 商品sku + List skuList = skuService.listSkuWithAttrBySpuId(spu.getSpuId()); + + // 代销商品且是供应商发货,更改商品运费模板、商品sku信息替换为供应商商品sku信息 + if (Objects.nonNull(spu.getSupplierSpuType()) && Objects.equals(spu.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + this.handleSupplierDelivery(spuService, spu, spuAppVO, skuList); + } + + // 启用的sku,app查询到的商品是启用sku的商品 + skuList = skuList.stream().filter(skuVO -> Objects.equals(skuVO.getStatus(), StatusEnum.ENABLE.value())).collect(Collectors.toList()); + // 获取商品sku的国际化信息 + ProductLangUtil.skuList(skuList); + // 如果是组合商品获取所有组合的商品信息并组装,且获取对应库存 + if(Objects.equals(spu.getSpuMold(),SpuMold.COMBO.value())){ + skuService.assembleComboSpuListAndStock(skuList,spu); + } + // 拼接sku属性 + List skuAppList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SkuVO sku : skuList) { + SkuAppVO skuAppVO = BeanUtil.map(sku, SkuAppVO.class); + skuAppVO.setProperties(skuService.spliceProperties(sku.getSpuSkuAttrValues())); + skuAppList.add(skuAppVO); + } + + spuAppVO.setSkus(skuAppList); + return spuAppVO; + } + + private void handleSupplierDelivery(SpuServiceImpl spuService, SpuVO spu, SpuAppVO spuAppVO, List skuList) { + // 获取供应商商品spu + SpuVO spupplierSpu = spuService.getBySpuId(spuAppVO.getSupplierSpuId()); + spuAppVO.setDeliveryTemplateId(spupplierSpu.getDeliveryTemplateId()); + //获取供应商品sku + List supplierSkuList = skuService.listSkuWithAttrBySpuId(spu.getSupplierSpuId()); + Map skuMap = supplierSkuList.stream().collect(Collectors.toMap(SkuVO::getSkuId, s -> s)); + Iterator iterator = skuList.iterator(); + while (iterator.hasNext()) { + SkuVO skuVO = iterator.next(); + SkuVO supplierSkuVO = skuMap.get(skuVO.getSupplierSkuId()); + // 判断是否需要删除 + boolean isDelete = Objects.isNull(supplierSkuVO) || + Objects.equals(supplierSkuVO.getStatus(), null) || + Objects.equals(supplierSkuVO.getStatus(), 0) || + Objects.equals(supplierSkuVO.getStatus(), -1); + //供应商商品信息 + if (isDelete) { + iterator.remove(); + continue; + } + skuVO.setWeight(supplierSkuVO.getWeight()); + skuVO.setVolume(supplierSkuVO.getVolume()); + skuVO.setSupplyPriceFee(supplierSkuVO.getPriceFee()); + skuVO.setSupplierSkuCode(supplierSkuVO.getPartyCode()); + skuVO.setSupplierSkuStatus(supplierSkuVO.getStatus()); + if (supplierSkuVO.getStatus() >= 0) { + skuVO.setIsSell(supplierSkuVO.getStatus()); + } + } + } + + /** + * 插入商品销量和评论数量 + * + * @param spuId + * @return + */ + private void loadSpuSale(Long spuId, SpuServiceImpl spuService, SpuAppVO spuAppVO) { + SpuExtension spuExtension = spuService.getSpuExtension(spuId); + spuAppVO.setCommentNum(spuExtension.getCommentNum()); + } + + @Override + public void offlineSpuByShopIds(Integer type, List shopIds) { + if (CollUtil.isEmpty(shopIds)) { + return; + } + List spuIds = spuMapper.listSpuIdByShopIdsAndStatus(SysTypeEnum.MULTISHOP.value(), shopIds, StatusEnum.ENABLE.value(), null); + if (CollUtil.isEmpty(spuIds)) { + return; + } + // 删除商品分组信息 + this.handleStatusChange(spuIds); + if (SHOP_OFFLINE_TYPE.equals(type)) { + logger.info("通过店铺ids下架店铺商品"); + spuOfflineService.offlineSpuStatusAndActivity(3, spuIds, null, null, null, shopIds); + } else { + logger.info("通过商品id修改商品类型"); + spuOfflineService.offlineSpuStatusAndActivity(type, spuIds, null, null, null, null); + } + } + + @Override + @CacheEvict(cacheNames = CacheNames.SPU_KEY, key = "#spuId") + public void toTopBySpuId(Long spuId) { + spuMapper.toTopBySpuId(spuId); + } + + @Override + @CacheEvict(cacheNames = CacheNames.SPU_KEY, key = "#spuId") + public void removeSpuCacheBySpuId(Long spuId) { + + } + + @Override + public List listSpuIdsByShopIds(List shopIds) { + if (CollUtil.isEmpty(shopIds)) { + return new ArrayList<>(0); + } + return spuMapper.getSpuIdsByShopIds(shopIds); + } + + @Override + public void removeBrandOfSpu(Long brandId) { + spuMapper.removeBrandOfSpu(brandId); + } + + @Override + public ServerResponseEntity checkSpuStatus(List spuIds) { + List spuList = spuMapper.listSpuStatusByIds(spuIds); + spuList.forEach(spuVO -> { + if (!Objects.equals(spuVO.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException(ResponseEnum.SPU_STATUS_ERROR, spuVO.getSpuId()); + } + }); + return ServerResponseEntity.success(); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public void batchOffile(OfflineHandleEventDTO offlineHandleEventDto) { + List spuList = spuMapper.listSpuStatusByIds(offlineHandleEventDto.getHandleIds()); + ProductLangUtil.spuList(spuList); + if (CollUtil.isEmpty(spuList)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + List offlineHandleEventList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List spuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuVO spuVO : spuList) { + //如果是供应商品 给代销商品增加供应商品变更值 + if (Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.YES.value())) { + List spuIdList = spuMapper.getSupIdListBySupplierId(spuVO.getSpuId()); + if (CollUtil.isNotEmpty(spuIdList)) { + spuMapper.batchChangeSynUpdate(spuIdList, IsSynUpdate.NO_CHANGE.value()); + } + } + if (!Objects.equals(spuVO.getStatus(), SpuStatus.OFF_SHELF.value()) && !Objects.equals(spuVO.getStatus(), SpuStatus.PUT_SHELF.value())) { + continue; + } + OfflineHandleEventDTO offlineHandleEvent = new OfflineHandleEventDTO(); + //设置sysType + if (Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.NO.value()) || Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value())) { + offlineHandleEvent.setSysType(SysTypeEnum.MULTISHOP.value()); + } + if (Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.YES.value())) { + offlineHandleEvent.setSysType(SysTypeEnum.SUPPLIER.value()); + } + offlineHandleEvent.setHandleId(spuVO.getSpuId()); + offlineHandleEvent.setHandleType(OfflineHandleEventType.PROD.getValue()); + offlineHandleEvent.setOfflineReason(offlineHandleEventDto.getOfflineReason()); + spuIds.add(spuVO.getSpuId()); + offlineHandleEventList.add(offlineHandleEvent); + } + if (CollUtil.isEmpty(offlineHandleEventList)) { + throw new LuckException("您选择的商品数据已发生改变,请刷新后重试"); + } + + // 批量新增下线事件记录 + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.batchSave(offlineHandleEventList); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 批量更新活动状态为下线状态 + batchChangeSpuStatus(spuIds, StatusEnum.OFFLINE.value()); + //批量发送商品下架消息给商家或供应商:商品xxx已被平台或供应商下架,点击去查看 + List supplierIds = spuList.stream().filter(s -> Objects.equals(s.getSupplierSpuType(), SupplierSpuType.YES.value())).map(SpuVO::getSupplierId).collect(Collectors.toList()); + ServerResponseEntity> supplierResp = supplierDetailFeignClient.listSupplierDetailBySupplierIds(supplierIds); + Map supplierNameMap = supplierResp.getData().stream().collect(Collectors.toMap(SupplierApiDetailVO::getSupplierId, SupplierApiDetailVO::getSupplierName)); + List notifyList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuVO spuVO : spuList) { + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + if (Objects.nonNull(spuVO.getSupplierSpuType()) && Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.YES.value())) { + sendNotifyBO.setShopId(null); + sendNotifyBO.setSupplierId(spuVO.getSupplierId()); + } else { + sendNotifyBO.setShopId(spuVO.getShopId()); + sendNotifyBO.setSupplierId(null); + } + sendNotifyBO.setSendType(Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.YES.value()) ? SendTypeEnum.PRODUCT_OFFLINE_TO_SUPPLIER.getValue() : SendTypeEnum.PRODUCT_OFFLINE.getValue()); + sendNotifyBO.setSpuId(spuVO.getSpuId()); + sendNotifyBO.setSpuName(spuVO.getName()); + sendNotifyBO.setSupplierName(Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.YES.value()) ? supplierNameMap.get(spuVO.getSupplierId()) : null); + notifyList.add(sendNotifyBO); + } + + SendStatus sendStockStatus = sendProductNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_PRODUCT_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(notifyList)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public List listSimple(SpuSimpleBO spuSimpleBO) { + return spuMapper.listSimple(spuSimpleBO); + } + + @Override + public List listSimples(SpuSimpleBO spuSimpleBO) { + return spuMapper.listSimples(spuSimpleBO); + } + + private Boolean verifySpuNum(Date currentTime, ProductSearchDTO productSearchDTO, Long spuNum) { + if (Objects.isNull(spuNum)) { + spuNum = spuMapper.getAllSpuNum(currentTime); + } + ServerResponseEntity> responseEntity = searchSpuFeignClient.adminPage(productSearchDTO); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + Long total = responseEntity.getData().getTotal(); + // 数量相同,不需要更新 + return Objects.equals(spuNum, total); + } + + + private void checkShopStatusIsOpen(Long shopId) { + Date now = new Date(); + ServerResponseEntity shopDetailRes = shopDetailFeignClient.getShopByShopId(shopId); + if (!shopDetailRes.isSuccess()) { + throw new LuckException(shopDetailRes.getMsg()); + } + EsShopDetailBO esShopDetailBO = shopDetailRes.getData(); + if (Objects.equals(esShopDetailBO.getShopStatus(), ShopStatus.OPEN.value())) { + return; + } + if (Objects.equals(esShopDetailBO.getShopStatus(), ShopStatus.OFFLINE.value()) || Objects.equals(esShopDetailBO.getShopStatus(), ShopStatus.OFFLINE_AWAIT_AUDIT.value())) { + throw new LuckException("店铺已下线"); + } + if (Objects.equals(esShopDetailBO.getShopStatus(), ShopStatus.STOP.value())) { + if (now.compareTo(esShopDetailBO.getContractStartTime()) < 0) { + throw new LuckException("店铺未开始营业"); + } else { + throw new LuckException("店铺已停止营业"); + } + } + } + + private void checkSameCity(SpuVO spuVO) { + SpuVO.DeliveryModeVO deliveryModeVO = Json.parseObject(spuVO.getDeliveryMode(), SpuVO.DeliveryModeVO.class); + // 商品不支持同城配送 + if (!deliveryModeVO.getHasCityDelivery()) { + spuVO.setCityDelivery(false); + return; + } + ServerResponseEntity responseEntity = sameCityFeignClient.getSameCityByShopId(spuVO.getShopId()); + if (!responseEntity.isSuccess()) { + spuVO.setCityDelivery(false); + } + SameCityVO sameCityVO = responseEntity.getData(); + spuVO.setCityDelivery(!Objects.isNull(sameCityVO) && sameCityVO.getStatus() != 0); + } + + /** + * 校验spu新增或更新信息 + * + * @param spuDTO + * @param spuDb + * @param saveProd true: 保存,false: 更新 + */ + private void checkSaveOrUpdateInfo(SpuDTO spuDTO, SpuVO spuDb, boolean saveProd) { + Long tenantId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, tenantId) && Objects.isNull(spuDTO.getShopCategoryId()) && Objects.equals(sysType, SysTypeEnum.MULTISHOP.value())) { + throw new LuckException("店铺分类不能为空"); + } + if (Objects.isNull(spuDTO.getCategoryId()) && !Objects.equals(spuDTO.getSpuType(), SpuType.SCORE.value())) { + throw new LuckException("平台分类不能为空"); + } + if (saveProd) { + checkShopStatus(spuDTO, tenantId, sysType); + checkCategory(spuDTO, tenantId, sysType); + } + // spu编码校验(编码为空or编码重复,自动生成新的编码) + List spuCodes = spuMapper.listSpuCodes(tenantId, sysType, spuDTO.getSpuId()); + if (ObjectUtils.isEmpty(spuDTO.getSpuCode()) + || spuCodes.contains(spuDTO.getSpuCode())) { + String spuCode; + do { + spuCode = StringUtils.join("P", segmentManager.getSegmentCode(DistributedIdKey.MALL4CLOUD_PRODUCT_SKU_CODE)); + } while (spuCodes.contains(spuCode)); + spuDTO.setSpuCode(spuCode); + } + checkShopCategory(spuDTO, tenantId, sysType); + checkBrand(spuDTO, tenantId, sysType); + //校验运费模板 + if (Objects.nonNull(spuDTO.getDeliveryTemplateId())) { + //发货方式为仓库发货才校验 + if (Objects.nonNull(spuDTO.getSupplierDeliveryType()) && Objects.equals(spuDTO.getSupplierDeliveryType(), SupplierDeliveryType.SHOP_DELIVERY.value())) { + ServerResponseEntity> response = deliveryFeignClient.listTransportByShopId(spuDTO.getShopId()); + if (!Objects.equals(response.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(response.getMsg()); + } + Set transportIds = response.getData().stream().map(ShopTransportVO::getTransportId).collect(Collectors.toSet()); + if (!transportIds.contains(spuDTO.getDeliveryTemplateId()) + && spuDTO.getDeliveryTemplateId() != 0L && spuDTO.getDeliveryTemplateId() != -1L) { + throw new LuckException("产品运费模板不存在"); + } + } + } + if (Objects.isNull(spuDTO.getSeq())) { + spuDTO.setSeq(0); + } + if (Objects.isNull(spuDTO.getBrandId())) { + spuDTO.setBrandId(0L); + } + if (Objects.isNull(spuDTO.getVideo())) { + spuDTO.setVideo(""); + } + List partyCodes = skuService.listSkuPartyCodesByShopId(tenantId, sysType, spuDTO.getSpuId()); + for (SkuDTO sku : spuDTO.getSkuList()) { + // 生成商品编码 + if (StrUtil.isBlank(sku.getPartyCode())) { + String partyCode = StringUtils.join("P", segmentManager.getSegmentCode(DistributedIdKey.MALL4CLOUD_PRODUCT_SKU_CODE)); + sku.setPartyCode(partyCode); + } + if (CollUtil.isNotEmpty(partyCodes)) { + if (partyCodes.contains(sku.getPartyCode())) { + // 商品编码已存在,生成新的 + String partyCode = StringUtils.join("P", segmentManager.getSegmentCode(DistributedIdKey.MALL4CLOUD_PRODUCT_SKU_CODE)); + sku.setPartyCode(partyCode); + } else { + partyCodes.add(sku.getPartyCode()); + } + } + } + List giveawaySpuList = giveawaySpuMapper.getBySpuId(spuDTO.getSpuId()); + if (CollectionUtils.isNotEmpty(giveawaySpuList) && !Objects.equals(spuDTO.getPreSaleType(), PreSaleType.DISABLE.value())) { + // 参与赠品活动的商品不能添加为定金预售商品 + throw new LuckException("参与赠品活动的赠品不能添加为预售商品"); + } + if (Objects.equals(spuDTO.getSpuMold(), SpuMold.VIRTUAL.value()) || Objects.equals(spuDTO.getSpuType(), SpuType.ACTIVE.value())) { + spuDTO.setDeliveryTemplateId(null); + spuDTO.setDeliveryAmount(null); + } + spuDTO.setIsAllEntity(0); + + // 检查一下组合商品情况或者关联组合商品的情况 + checkComboSpuOrRelatedCombo(spuDTO,spuDb,saveProd); + } + + /** + * 组合商品关联的子商品状态变更,导致组合商品下架: + * 1.关联子商品信息不变 + * 1.1 子商品下架 + * 1.2 子商品由商家发货转为供应商发货(商家商品) + * 1.3 子商品变成预售商品 + * 1.4 sku禁用 + * 2.关联子商品信息删除 + * 2.1 删除子商品或者规格 + * + * @param spuDTO + * @param spuDb + * @param saveProd + */ + private void checkComboSpuOrRelatedCombo(SpuDTO spuDTO, SpuVO spuDb, boolean saveProd) { + if(!Objects.equals(spuDTO.getSpuMold(),SpuMold.COMBO.value())) { + // 如果是新增的普通商品不需要判断 + if(saveProd){ + return; + } + Set handleSkuIds = new HashSet<>(); + Set deleteSkuIds = new HashSet<>(); + List skuList = spuDTO.getSkuList().stream().filter(skuDTO -> Objects.nonNull(skuDTO.getSkuId())).toList(); + Map skuMap = skuList.stream().collect(Collectors.toMap(SkuDTO::getSkuId, skuVO -> skuVO)); + Set skuIds = skuList.stream().map(SkuDTO::getSkuId).collect(Collectors.toSet()); + boolean checkSupplierSpu = !Objects.equals(spuDTO.getShopId(), -1L) && Objects.equals(spuDTO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()) + && Objects.equals(spuDb.getSupplierDeliveryType(), SupplierDeliveryType.SHOP_DELIVERY.value()); + boolean checkPreSale = !Objects.equals(spuDTO.getPreSaleType(), -1); + if(checkSupplierSpu || checkPreSale) { + handleSkuIds.addAll(skuIds); + } + // 获取修改前的sku信息 + List oldSkuList = skuService.listSkuWithAttrBySpuId(spuDTO.getSpuId()); + Map skuDbMap = oldSkuList.stream().collect(Collectors.toMap(SkuVO::getSkuId, skuVO -> skuVO)); + for (Long skuIdDb : skuDbMap.keySet()) { + // 修改时如果不存在数据库的sku,则表示已经删除,进行下架和删除关联 + if(!skuMap.containsKey(skuIdDb)){ + deleteSkuIds.add(skuIdDb); + Long priceFee = skuDbMap.get(skuIdDb).getPriceFee(); + continue; + } + // 如果数据库是启用,修改时变成禁用,则进行下架 + if(Objects.equals(skuDbMap.get(skuIdDb).getStatus(),StatusEnum.ENABLE.value()) && Objects.equals(skuMap.get(skuIdDb),StatusEnum.DISABLE.value())){ + handleSkuIds.add(skuIdDb); + } + } + handleSkuIds.addAll(deleteSkuIds); + if(CollectionUtil.isNotEmpty(handleSkuIds)) { + // 下架关联的组合商品 + List spuIds = skuComboService.getCombSpusByComboSpuIds(null, new ArrayList<>(handleSkuIds)); + if (CollUtil.isNotEmpty(spuIds)) { + batchChangeSpuStatus(spuIds, StatusEnum.DISABLE.value()); + } + } + if(CollectionUtil.isNotEmpty(deleteSkuIds)) { + // 删除关联的组合商品信息 + skuComboService.deleteByComboSkuIds(deleteSkuIds.stream().toList()); + } + } + if(!Objects.equals(spuDTO.getSpuMold(),SpuMold.COMBO.value())){ + return; + } + // 组合商品不能选择其他组合商品一起组合 + Set spuIds = new HashSet<>(); + for (SkuDTO skuDTO : spuDTO.getSkuList()) { + spuIds.addAll(skuDTO.getSkuComboList().stream().map(SkuComboDTO::getComboSpuId).collect(Collectors.toSet())); + } + List spuList = spuMapper.listSpuBySpuIds(spuIds.stream().toList()); + List comboSpuList = spuList.stream().filter(spuVO -> Objects.equals(spuVO.getSpuMold(), SpuMold.COMBO)).toList(); + for (SpuVO spuVO : spuList) { + if (Objects.equals(spuVO.getSpuMold(), SpuMold.COMBO.value())) { + throw new LuckException("组合商品不能选择其他组合商品一起组合"); + } + // 组合商品不能为(预售,供应商发货(商家的组合商品))类型 + if (!Objects.equals(spuVO.getPreSaleType(), -1)) { + throw new LuckException("组合商品的关联商品不能为预售类型"); + } + if (!Objects.equals(spuVO.getShopId(), -1L) && Objects.equals(spuVO.getSupplierDeliveryType(),SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + throw new LuckException("组合商品的关联商品发货方式不能为供应商发货"); + } + } + // 判断一下是否为全实物商品,用于赠品操作 + List noRealSpuList = spuList.stream().filter(spuVO -> !Objects.equals(spuVO.getSpuMold(), SpuMold.REAL.value())).toList(); + spuDTO.setIsAllEntity(CollectionUtil.isNotEmpty(noRealSpuList) ? 0 : 1); + } + + private void checkBrand(SpuDTO spuDTO, Long tenantId, Integer sysType) { + // 校验品牌是否可用 + if (Objects.nonNull(spuDTO.getBrandId()) && !Objects.equals(spuDTO.getBrandId(), 0L)) { + BrandVO brandVO = brandMapper.getByBrandId(spuDTO.getBrandId()); + if (Objects.isNull(brandVO) || !Objects.equals(brandVO.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException("当前选择的品牌已下架或已删除,请重新选择品牌"); + } + if (!Objects.equals(tenantId, Constant.PLATFORM_SHOP_ID)) { + if (!Objects.equals(spuDTO.getSupplierSpuType(), SupplierDeliveryType.SHOP_DELIVERY.value())) { + // 判断当前店铺是否可以使用该品牌 + int categoryBrandCount = categoryBrandService.countByBrandIdAndCategoryId(spuDTO.getBrandId(), spuDTO.getCategoryId()); + if (categoryBrandCount == 0) { + int signingCount = brandShopService.countByShopIdAndBrandId(tenantId, spuDTO.getBrandId(), sysType); + if (signingCount == 0) { + throw new LuckException("当前选择的品牌签约关系已失效,请重新选择品牌"); + } + } + } + } + } + } + + private void checkShopCategory(SpuDTO spuDTO, Long tenantId, Integer sysType) { + // 校验店铺分类是否可用 + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, tenantId) && Objects.equals(sysType, SysTypeEnum.MULTISHOP.value()) && Objects.nonNull(spuDTO.getShopCategoryId())) { + CategoryVO shopCategory = categoryMapper.getById(spuDTO.getShopCategoryId()); + if (Objects.isNull(shopCategory) || !Objects.equals(shopCategory.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException("当前选择的店铺分类已下架或已删除, 请重新选择店铺分类"); + } + } + // 校验供应商分类是否可用 + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, tenantId) && Objects.equals(sysType, SysTypeEnum.SUPPLIER.value()) && Objects.nonNull(spuDTO.getSupplierCategoryId())) { + CategoryVO supplierCategory = categoryMapper.getById(spuDTO.getSupplierCategoryId()); + if (Objects.isNull(supplierCategory) || !Objects.equals(supplierCategory.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException("当前选择的供应商分类已下架或已删除, 请重新选择供应商分类"); + } + } + } + + private void checkCategory(SpuDTO spuDTO, Long tenantId, Integer sysType) { + // 校验平台分类是否处于上架状态 + CategoryVO platformCategory = categoryMapper.getById(spuDTO.getCategoryId()); + // 积分商品不需要分类 + if (!Objects.equals(spuDTO.getSpuType(), SpuType.SCORE.value())) { + //如果是下架了分类,就提示 该平台分类已被下线,无法上架该商品 + //如果是签约丢了,就提示 您已取消与该商品类型的签约,请重新签约该商品类型方可上架 + if (Objects.isNull(platformCategory) || !Objects.equals(platformCategory.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException("该平台分类已被下线,无法上架该商品"); + } + if (!Objects.equals(tenantId, Constant.PLATFORM_SHOP_ID)) { + // 判断当前店铺是否可用使用该平台分类 + int signingCount = categoryShopMapper.countByShopIdAndCategoryId(tenantId, spuDTO.getCategoryId(), sysType); + if (signingCount == 0) { + throw new LuckException("您已取消与该商品类型的签约,请重新签约该商品类型方可上架"); + } + } + } else { + spuDTO.setCategoryId(0L); + } + } + + private void checkShopStatus(SpuDTO spuDTO, Long tenantId, Integer sysType) { + if (Objects.equals(sysType, SysTypeEnum.MULTISHOP.value())) { + // 发布商品时,需要根据店铺或供应商状态判断是否可以发布商品 + ServerResponseEntity shopRequest = shopDetailFeignClient.getShopByShopId(tenantId); + EsShopDetailBO shopDetail = shopRequest.getData(); + if (Objects.equals(shopDetail.getShopStatus(), ShopStatus.OFFLINE.value())) { + throw new LuckException("店铺处于违规下线状态,不能发布新商品"); + } + if (Objects.equals(shopDetail.getShopStatus(), ShopStatus.OFFLINE_AWAIT_AUDIT.value())) { + throw new LuckException("店铺上线申请待审核中,不能发布新商品"); + } + if (Objects.equals(shopDetail.getShopStatus(), ShopStatus.STOP.value())) { + logger.info("店铺处于停止状态,商品状态设置为下架"); + spuDTO.setStatus(StatusEnum.DISABLE.value()); + } + } else if (Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + ServerResponseEntity supplierRequest = supplierDetailFeignClient.getSupplierBySupplierId(tenantId); + SupplierDetailBO supplierDetail = supplierRequest.getData(); + if (Objects.equals(supplierDetail.getSupplierStatus(), SupplierStatus.OFFLINE.value())) { + throw new LuckException("供应商处于违规下线状态,不能发布新商品"); + } + if (Objects.equals(supplierDetail.getSupplierStatus(), SupplierStatus.OFFLINE_AWAIT_AUDIT.value())) { + throw new LuckException("供应商上线申请待审核中,不能发布新商品"); + } + if (Objects.equals(supplierDetail.getSupplierStatus(), SupplierStatus.STOP.value())) { + logger.info("供应商处于停止状态,商品状态设置为下架"); + spuDTO.setStatus(StatusEnum.DISABLE.value()); + } + } + } + + @Override + public Integer isCommissionByShopIdAndSpuId(Long shopId, Long supplierSpuId) { + return spuMapper.isCommissionByShopIdAndSpuId(shopId, supplierSpuId); + } + + @Override + public SupplierSpuVo getSupplierInfoBySpuId(Long spuId, Long shopId) { + SupplierSpuVo supplierSpuVo = new SupplierSpuVo(); + SpuVO spu = spuMapper.getBySpuId(spuId); + //编辑返回数据 + supplierSpuVo.setSupplierSpuId(spu.getSpuId()); + supplierSpuVo.setMainImgUrl(spu.getMainImgUrl()); + supplierSpuVo.setImgUrls(spu.getImgUrls()); + supplierSpuVo.setSellingPoint(spu.getSellingPoint()); + supplierSpuVo.setVideo(spu.getVideo()); + supplierSpuVo.setMeasureUnit(spu.getMeasureUnit()); + supplierSpuVo.setSpuCode(spu.getSpuCode()); + supplierSpuVo.setCategoryId(spu.getCategoryId()); + supplierSpuVo.setShopCategoryId(spu.getShopCategoryId()); + supplierSpuVo.setSupplierId(spu.getSupplierId()); + supplierSpuVo.setSpuLangList(spu.getSpuLangList()); + supplierSpuVo.setDetail(spu.getDetail()); + supplierSpuVo.setDetailList(spu.getDetailList()); + supplierSpuVo.setBrandId(spu.getBrandId()); + supplierSpuVo.setHasSkuImg(spu.getHasSkuImg()); + //返回数据时根据智能代销设置销售价 + //获取店铺的代销设置 + ServerResponseEntity sales = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(shopId); + ShopSubstituteSalesVO data = sales.getData(); + //sku信息 + List skuVOList = skuService.listSkuAllInfoBySpuId(spuId,spu, false); + for (SkuVO skuVO : skuVOList) { + List skuLang = skuLangService.getBySkuId(skuVO.getSkuId()); + skuVO.setSkuLangList(skuLang); + //设置供货价 + skuVO.setSupplyPriceFee(skuVO.getPriceFee()); + if (!Objects.isNull(data)) { + //代销设置为智能设价时,计算代销商品售价 + if (data.getSalesType() != 1) { + long price = 0L; + if (data.getSalesPriceType() == 0) { + //按比例加价 + price = PriceUtil.divideByBankerRounding(spu.getPriceFee() * data.getSalesPrice(), 100) + spu.getPriceFee(); + } + if (data.getSalesPriceType() == 1) { + //按固定数值加价 + price = skuVO.getPriceFee() + data.getSalesPrice(); + } + skuVO.setPriceFee(price); + } + } + //判断sku状态是否可售 + skuVO.setIsSell(SkuIsSell.NO_SELL.value()); + if (skuVO.getStatus() == 1) { + skuVO.setIsSell(SkuIsSell.CAN_SELL.value()); + } + if (skuVO.getStatus() == 0) { + skuVO.setIsSell(SkuIsSell.NO_SELL.value()); + } + skuVO.setStockWarning(0L); + } + supplierSpuVo.setSkus(skuVOList); + return supplierSpuVo; + } + + @Override + public void soldOutSpu(Long skuId, Long supplierPrice) { + SkuVO skuBySkuId = skuMapper.getSkuBySkuId(skuId); + SpuVO bySpuId = spuMapper.getBySpuId(skuBySkuId.getSpuId()); + if (Objects.equals(bySpuId.getSupplierSpuType(), SupplierSpuType.YES.value())) { + //查询代销商品 + List supplierSup = spuMapper.getSupplierSupIdBySkuId(skuId); + for (int i = 0; i < supplierSup.size(); i++) { + Long shopId = supplierSup.get(i).getShopId(); + //获取代销商品sku信息 + Long spuSkuId = skuMapper.getSkuIdBySpuIdAndSupplierSkuId(supplierSup.get(i).getSpuId(), skuId); + //过滤掉没有设置手动设价的店铺 + ServerResponseEntity salesType = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(shopId); + if (!Objects.isNull(salesType.getData())) { + //智能设价 商家发货的代销商品不需要修改价格 + if (Objects.equals(salesType.getData().getSalesType(), 0) && Objects.equals(supplierSup.get(i).getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + //重新计算售价 + //智能设价计算售价 + long priceFee = 0L; + if (salesType.getData().getSalesPriceType() == 0) { + //按比例加价 + priceFee = PriceUtil.divideByBankerRounding(supplierPrice * salesType.getData().getSalesPrice(), 10000) + supplierPrice; + } + if (salesType.getData().getSalesPriceType() == 1) { + //按固定数值加价 + priceFee = supplierPrice + salesType.getData().getSalesPrice(); + } + //更新sku + Sku sku = new Sku(); + sku.setSkuId(spuSkuId); + sku.setPriceFee(priceFee); + sku.setMarketPriceFee(priceFee); + skuMapper.update(sku); + break; + } +// //没有设置供货价高于代销价时自动下架的移除 +// if (Objects.equals(salesType.getData().getAutomaticOff(), 0)) { +// supplierSup.remove(i); +// break; +// } +// //获取代销商品sku代销价 +// Long spuId = supplierSup.get(i).getSpuId(); +// Long priceFee = skuMapper.getPriceFeeBySpuIdAndSupplierSkuId(spuId, skuId); +// //下架商品 +// Spu spu = new Spu(); +// spu.setSpuId(spuId); +// spu.setStatus(SpuStatus.OFF_SHELF.value()); +// spuMapper.update(spu); +// } + } + } + } + } + + @Override + public List importSupplierSpu(List supplierSpuId) { + List spuIdList = new ArrayList<>(); + for (Long aLong : supplierSpuId) { + spuIdList.add(importSupplierSpuService.importSpu(aLong, AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType(), + AuthUserContext.get().getUserId(), false)); + } + return spuIdList; + } + + + @Override + public Long setPriceFee(SkuVO skuVO) { + Long shopId = AuthUserContext.get().getTenantId(); + //获取商家代销设置 + ServerResponseEntity salesType = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(shopId); + ShopSubstituteSalesVO shopSubstituteSalesVO = salesType.getData(); + if (!Objects.isNull(shopSubstituteSalesVO)) { + if (shopSubstituteSalesVO.getSalesType() == 0) { + //智能设价计算售价 + long price = 0L; + if (shopSubstituteSalesVO.getSalesPriceType() == 0) { + //按比例加价 + price = PriceUtil.divideByBankerRounding(skuVO.getPriceFee() * shopSubstituteSalesVO.getSalesPrice(), 10000) + skuVO.getPriceFee(); + } + if (shopSubstituteSalesVO.getSalesPriceType() == 1) { + //按固定数值加价 + price = skuVO.getPriceFee() + shopSubstituteSalesVO.getSalesPrice(); + } + return price; + } + } + return 0L; + } + + + @Override + public SpuVO getSpuByShopIdAndSupplierSpuId(Long shopId, Long supplierSpuId) { + return spuMapper.getSpuByShopIdAndSupplierSpuId(shopId, supplierSpuId); + } + + @Override + public List supplierSpuList(SpuPageSearchDTO spu) { + return spuMapper.supplierSpuList(spu); + } + + @Override + public List getSpuIdsBySupplierIdAndSupplierSpuType(Long supplierId, Date createTime, Integer supplierSpuType) { + return spuMapper.getSpuIdsBySupplierIdAndSupplierSpuType(supplierId, createTime, supplierSpuType); + } + + @Override + public List listMerchantSpuIdsBySupplierId(Long supplierId) { + return spuMapper.listMerchantSpuIdsBySupplierId(supplierId); + } + + @Override + public List listSpuByShopIdAndSupplierSpuId(Long shopId, List supplierSpuIds) { + return spuMapper.listSpuByShopIdAndSupplierSpuId(shopId, supplierSpuIds); + } + + @Override + public void soldOutSpuBySpu(Long spuId, Long price, Long marketPriceFee) { + List spuVos = spuMapper.listSpuBySupplierSpuId(spuId); + if (spuVos.size() == 0) { + return; + } + // 获取商家代销设置 + List shopIds = spuVos.stream().map(SpuVO::getShopId).collect(Collectors.toList()); + ServerResponseEntity> listServerResponseEntity = shopSubstituteSalesFeignClient.shopSubstituteSalesList(shopIds); + if (!listServerResponseEntity.isSuccess()) { + throw new LuckException(listServerResponseEntity.getMsg()); + } + Map salesMap = listServerResponseEntity.getData().stream().collect(Collectors.toMap(ShopSubstituteSalesVO::getShopId, s -> s)); + for (SpuVO spuVo : spuVos) { + ShopSubstituteSalesVO shopSubstituteSalesVO = salesMap.get(spuVo.getShopId()); + if (Objects.isNull(shopSubstituteSalesVO)) { + continue; + } + // 手动设价不执行 + if (Objects.equals(shopSubstituteSalesVO.getSalesType(), SalesType.MANUAL_OPERATION_PRICE.value())) { + continue; + } + long priceFee = 0L; + if (Objects.equals(shopSubstituteSalesVO.getSalesPriceType(), SalesPriceType.PROPORTION_PRICE.value())) { + // 按比例加价 + priceFee = PriceUtil.divideByBankerRounding(price * shopSubstituteSalesVO.getSalesPrice(), 10000) + price; + } + if (Objects.equals(shopSubstituteSalesVO.getSalesPriceType(), SalesPriceType.FIXED_NUMBER_PRICE.value())) { + // 按固定数值加价 + priceFee = price + shopSubstituteSalesVO.getSalesPrice(); + } + Spu spu = new Spu(); + spu.setSpuId(spuVo.getSpuId()); + spu.setPriceFee(priceFee); + spu.setMarketPriceFee(marketPriceFee); + spuMapper.update(spu); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void offlineSpuBySupplierId(Long supplierId) { + List supplierVoList = spuMapper.getSupplierSpuBySupplierId(supplierId, StatusEnum.ENABLE.value()); + if (CollectionUtil.isEmpty(supplierVoList)) { + return; + } + spuMapper.offlineSpuBySupplierId(supplierId); + List supplierSpuIdList = supplierVoList.stream().map(SpuVO::getSpuId).collect(Collectors.toList()); + List spuIdList = spuMapper.batchSupIdListBySupplierId(supplierSpuIdList); + if (CollectionUtil.isNotEmpty(spuIdList)) { + spuMapper.batchChangeSynUpdate(spuIdList, IsSynUpdate.NO_CHANGE.value()); + } + // 查询出秒杀or团购的商品进行下线 + // 下线掉关联商品的活动 + // 下面这个方法查不到正常状态的商品了,所以需要把修改后的商品状态传过去 +// spuOfflineService.offlineSpuStatusAndActivity(3, null, shopId, null, StatusEnum.DISABLE.value()); + } + + @Override + public List listSpuBySupplierSpuId(Long supplierSpuId) { + return spuMapper.listSpuBySupplierSpuId(supplierSpuId); + } + + @Override + public List getSpuIsSynUpdate(List spuIds) { + List spuIsSynUpdate = spuMapper.getSpuIsSynUpdate(spuIds); + // 获取供应商商品库存 + spuIds = spuIsSynUpdate.stream().map(spuVO -> Objects.isNull(spuVO.getSupplierSpuId()) ? spuVO.getSpuId() : spuVO.getSupplierSpuId()).collect(Collectors.toList()); + spuStockService.setSpuStock(spuIsSynUpdate); + return spuIsSynUpdate; + } + + @Override + public List getSupIdListBySupplierId(Long supplierId) { + return spuMapper.getSupIdListBySupplierId(supplierId); + } + + @Override + public void batchChangeSynUpdate(List spuIds, Integer isSynUpdate) { + if (CollUtil.isEmpty(spuIds)) { + return; + } + spuMapper.batchChangeSynUpdate(spuIds, isSynUpdate); + } + + @Override + public void batchUpdateCommissionSpuDeliverType(List spuIds, Integer deliverType) { + if (CollUtil.isEmpty(spuIds)) { + return; + } + spuMapper.batchUpdateCommissionSpuDeliverType(spuIds, deliverType); + } + + private void offSupplierSendCommissionSpu(SpuDTO spuDTO) { + //下架商家供应商发货的代销商品 + List commissionSpuId = spuMapper.getCommissionSpuIdList(spuDTO.getSpuId(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + if (CollectionUtil.isNotEmpty(commissionSpuId)) { + spuMapper.batchChangeSpuStatus(commissionSpuId, SpuStatus.OFF_SHELF.value()); + } + } + + @Override + public void supplierSpuUpdateLaterOffSpu(Long supplierSpuId, Integer commissionSpuOffType) { + if (Objects.equals(commissionSpuOffType, CommissionSpuOffType.ALL.value())) { + List commissionSpuIds = spuMapper.getSupIdListBySupplierId(supplierSpuId); + //下架 + supplierSpuUpdateLaterOperateService.batchChangeSpuStatus(commissionSpuIds, SpuStatus.OFF_SHELF.value(), SysTypeEnum.MULTISHOP.value()); + } + + if (Objects.equals(commissionSpuOffType, CommissionSpuOffType.SUPPLIER_DELIVERY_SPU.value())) { + List commissionSpuIds = spuMapper.getCommissionSpuIdList(supplierSpuId, SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + //下架 + batchChangeSpuStatus(commissionSpuIds, SpuStatus.OFF_SHELF.value()); + } + + if (Objects.equals(commissionSpuOffType, CommissionSpuOffType.SHOP_DELIVERY.value())) { + List commissionSpuIds = spuMapper.getCommissionSpuIdList(supplierSpuId, SupplierDeliveryType.SHOP_DELIVERY.value()); + //下架 + batchChangeSpuStatus(commissionSpuIds, SpuStatus.OFF_SHELF.value()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateManualPriceCommissionSpuPrice(Long shopId) { + List spuIds = spuMapper.getCommissionSpuListByShopId(shopId); + List supplierSpuId = spuMapper.getSupplierSpuId(shopId); + if (CollUtil.isNotEmpty(spuIds)) { + List spuVOList = spuMapper.listSpuBySpuIds(spuIds); + List supplierSpuList = spuMapper.listSpuBySpuIds(supplierSpuId); + //获取商家代销设置 + ServerResponseEntity salesType = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(shopId); + ShopSubstituteSalesVO shopSubstituteSalesVO = salesType.getData(); + if (!Objects.isNull(shopSubstituteSalesVO) && shopSubstituteSalesVO.getSalesType() == 0) { + for (SpuVO spuVO : spuVOList) { + if (Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SHOP_DELIVERY.value())) { + //商家自行发货的不用执行 + continue; + } + //供应商商品 + SpuVO supplierSpuVO = supplierSpuList.stream().filter(spu -> spu.getSpuId().equals(spuVO.getSupplierSpuId())).findFirst().get(); + //智能设价计算售价 + long price = 0L; + if (Objects.equals(shopSubstituteSalesVO.getSalesPriceType(), SalesPriceType.PROPORTION_PRICE.value())) { + //按比例加价 + price = PriceUtil.divideByBankerRounding(supplierSpuVO.getPriceFee() * shopSubstituteSalesVO.getSalesPrice(), 10000) + supplierSpuVO.getPriceFee(); + } + if (Objects.equals(shopSubstituteSalesVO.getSalesPriceType(), SalesPriceType.FIXED_NUMBER_PRICE.value())) { + //按固定数值加价 + price = supplierSpuVO.getPriceFee() + shopSubstituteSalesVO.getSalesPrice(); + } + spuVO.setPriceFee(price); + //sku信息 + List skuVOList = skuMapper.listSkuWithAttrBySpuId(spuVO.getSpuId()); + List supplierSkuVOList = skuMapper.listSkuWithAttrBySpuId(supplierSpuVO.getSpuId()); + List skus = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SkuVO skuVO : skuVOList) { + //供应商sku + SkuVO supplierSkuVO = supplierSkuVOList.stream().filter(sku -> sku.getSkuId().equals(skuVO.getSupplierSkuId())).findFirst().get(); + //智能设价计算售价 + long skuPrice = 0L; + if (Objects.equals(shopSubstituteSalesVO.getSalesPriceType(), SalesPriceType.PROPORTION_PRICE.value())) { + //按比例加价 + skuPrice = PriceUtil.divideByBankerRounding(supplierSkuVO.getPriceFee() * shopSubstituteSalesVO.getSalesPrice(), 10000) + supplierSkuVO.getPriceFee(); + } + if (Objects.equals(shopSubstituteSalesVO.getSalesPriceType(), SalesPriceType.FIXED_NUMBER_PRICE.value())) { + //按固定数值加价 + skuPrice = supplierSkuVO.getPriceFee() + shopSubstituteSalesVO.getSalesPrice(); + } + skuVO.setPriceFee(skuPrice); + Sku sku = BeanUtil.map(skuVO, Sku.class); + skus.add(sku); + } + skuMapper.updateBatch(skus); + } + spuMapper.updateBatch(spuVOList); + } + } + } + + @Override + public List getBySpuIds(List spuIds) { + return spuMapper.getBySpuIds(spuIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void batchChangeSpuStatusToDisableBySupplierIds(List supplierIdsToStop) { + List spuIds = spuMapper.listSpuIdByShopIdsAndStatus(SysTypeEnum.SUPPLIER.value(), supplierIdsToStop, StatusEnum.ENABLE.value(), null); + if (CollectionUtil.isNotEmpty(spuIds)) { + spuMapper.batchChangeSpuStatus(spuIds, StatusEnum.DISABLE.value()); + } + } + + @Override + public List getCommissionSpuList(Long supplierSpuId) { + return spuMapper.getCommissionSpuListBySupplierDeliver(supplierSpuId); + } + + @Override + public void syncUpdateCommissionSpuBrandOrSeq(Long brandId, Integer seq, Long supplierSpuId) { + List commissionSpuList = spuMapper.getCommissionSpuList(supplierSpuId); + if (commissionSpuList.size() == 0) { + return; + } + List spuVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + SpuVO spuVO; + for (SpuVO spu : commissionSpuList) { + spuVO = new SpuVO(); + spuVO.setSpuId(spu.getSpuId()); + if (brandId != -1) { + spuVO.setBrandId(brandId); + } + if (seq != -1) { + spuVO.setSeq(seq); + } + spuVOList.add(spuVO); + } + spuMapper.updateBatch(spuVOList); + } + + @Override + public PageVO pageSpuSku(PageDTO pageDTO, SpuDTO spuDTO) { + PageVO spuPageVO = new PageVO<>(); + // 全部商品查出,对spu进行分页处理 + List spuVOList = spuMapper.pageSpuSku(spuDTO, I18nMessage.getLang()); + if (CollectionUtil.isEmpty(spuVOList)) { + spuPageVO.setList(new ArrayList<>(0)); + spuPageVO.setTotal(0L); + spuPageVO.setPages(0); + return spuPageVO; + } + // 对spu进行分组 + Map> spuMap = spuVOList.stream() + .collect(Collectors.groupingBy(SpuVO::getSpuId, LinkedHashMap::new, Collectors.toList())); + // stream流分页取数据 + List data = new ArrayList<>(Constant.INITIAL_CAPACITY); + spuMap.entrySet().stream() + .skip((long) (pageDTO.getPageNum() - 1) * pageDTO.getPageSize()) + .limit(pageDTO.getPageSize()) + .forEach(x -> data.addAll(x.getValue())); + List skuList = new ArrayList<>(); + for (SpuVO spuVO : data) { + skuList.addAll(spuVO.getSkus()); + } + List skuIds = skuList.stream().map(SkuVO::getSkuId).collect(Collectors.toList()); + // 获取sku总库存 + Map skuStockMap = skuStockService.mapSkuTotalStockBySkuIds(skuIds); + for (SkuVO skuVO : skuList) { + if (!skuStockMap.containsKey(skuVO.getSkuId())) { + continue; + } + SkuStockVO skuStockVO = skuStockMap.get(skuVO.getSkuId()); + skuVO.setStock(skuStockVO.getStock()); + skuVO.setSaleNum(skuStockVO.getSale()); + } + spuPageVO.setList(data); + spuPageVO.setTotal(Long.valueOf(String.valueOf(spuMap.keySet().size()))); + spuPageVO.setPages(PageUtil.getPages(spuPageVO.getTotal(), pageDTO.getPageSize())); + return spuPageVO; + } + + @Override + public void voluntarilyImportSupplierSpu(List spuVOList, Integer sysType, Long userId) { + for (SpuVO spuVO : spuVOList) { + SpuVO spu = spuMapper.getSpuByShopIdAndSupplierSpuId(spuVO.getShopId(), spuVO.getSupplierSpuId()); + // 不存在则导入 + if (Objects.isNull(spu)) { + importSupplierSpuService.importSpu(spuVO.getSupplierSpuId(), spuVO.getShopId(), sysType, userId, true); + } + } + } + + @Override + public void auditSpu(OfflineHandleEventDTO eventDTO) { + // 查询商品及其状态 + SpuVO spuVO = spuMapper.getBySpuId(eventDTO.getHandleId()); + if (spuVO == null) { + throw new LuckException("查找不到该商品信息"); + } + if (!SpuStatus.PUBLISH_WAIT_AUDIT.value().equals(spuVO.getStatus())) { + throw new LuckException("商品状态已改变,请刷新页面"); + } + // 是否审核通过,通过直接修改商品状态;未通过新增一条下线数据,再修改状态 + Spu spu = new Spu(); + spu.setSpuId(eventDTO.getHandleId()); + if (Objects.equals(eventDTO.getStatus(), OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue())) { + spu.setStatus(SpuStatus.PUT_SHELF.value()); + } else if (Objects.equals(eventDTO.getStatus(), OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue())) { + eventDTO.setStatus(OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue()); + eventDTO.setHandleType(OfflineHandleEventType.PROD.getValue()); + eventDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + eventDTO.setShopId(spuVO.getShopId()); + eventDTO.setOfflineReason(eventDTO.getRefuseReason()); + offlineHandleEventFeignClient.save(eventDTO); + spu.setIsTop(0); + spu.setStatus(SpuStatus.PLATFORM_OFF_SHELF.value()); + } + spuMapper.update(spu); + } + + @Override + public Long stockWarningCount(Long supplierId) { + return spuMapper.stockWarningCount(supplierId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public List handleExpireVirtualProd() { + List spuVOList = spuMapper.getVirtualSpuList(); + if (CollectionUtils.isEmpty(spuVOList)) { + return null; + } + for (SpuVO spuVO : spuVOList) { + spuVO.setStatus(SpuStatus.OFF_SHELF.value()); + Spu spu = new Spu(); + spu.setSpuId(spuVO.getSpuId()); + spu.setStatus(spuVO.getStatus()); + updateSpu(spu); + } + offlineRelatedComboBySpuIds(spuVOList.stream().map(SpuVO::getSpuId).toList()); + return spuVOList; + } + + @Override + public void loadSpuAttrs(SpuVO spuVO) { + Map attrMap; + if (CollUtil.isNotEmpty(spuVO.getSpuAttrValues())) { + attrMap = spuVO.getSpuAttrValues().stream().collect(Collectors.toMap(SpuAttrValueVO::getAttrId, s -> s)); + } else { + attrMap = new HashMap<>(1); + } + List attrList = attrService.getAttrsByCategoryIdAndAttrType(spuVO.getCategoryId()); + List spuAttrValues = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (AttrVO attrVO : attrList) { + SpuAttrValueVO spuAttrValueVO = attrMap.get(attrVO.getAttrId()); + SpuAttrValueVO newSpuAttrValue = new SpuAttrValueVO(); + if (Objects.nonNull(spuAttrValueVO)) { + boolean hasValue = false; + for (AttrValueVO attrValue : attrVO.getAttrValues()) { + if (Objects.equals(attrValue.getAttrValueId(), spuAttrValueVO.getAttrValueId())) { + hasValue = true; + break; + } + } + if (hasValue || CollUtil.isEmpty(attrVO.getAttrValues())) { + spuAttrValues.add(spuAttrValueVO); + continue; + } + newSpuAttrValue.setSpuAttrValueId(spuAttrValueVO.getSpuAttrValueId()); + } + newSpuAttrValue.setAttrId(attrVO.getAttrId()); + newSpuAttrValue.setAttrName(attrVO.getName()); + newSpuAttrValue.setSearchType(attrVO.getSearchType()); + spuAttrValues.add(newSpuAttrValue); + } + spuVO.setSpuAttrValues(spuAttrValues); + } + + @Override + public void updateSpuByShopId(Long shopId, Integer sysType){ + spuMapper.updateSpuByShopId(shopId, sysType); + } + + @Override + public List listShopSpuBySupplierSpuIds(Long shopId, List supplierSpuIds) { + List spuList = spuMapper.listShopSpuBySupplierSpuIds(shopId, supplierSpuIds); + ProductLangUtil.spuList(spuList); + return spuList; + } + + @Override + public PageVO pageStockPointSpu(PageDTO pageDTO, StockPointSkuDTO spuDTO) { + // 调拨订单查询库存点商品需过滤空库存数据(空库存只有默认仓库会出现) + if (Objects.equals(spuDTO.getType(), 0) + && !Objects.isNull(spuDTO.getInStockPointId())) { + List emptySkuIds = this.listEmptySkuIds(Collections.singletonList(spuDTO.getStockPointId())); + if (!CollectionUtils.isEmpty(emptySkuIds)) { + spuDTO.setNotInSkuIds(emptySkuIds); + } + } + return PageUtil.doPage(pageDTO, () -> spuMapper.listPointSpu(spuDTO)); + } + + @Override + public PageVO pageSupplierStockPointSpu(PageDTO pageDTO, SkuStockPointSearchDTO searchDTO) { + PageVO pageVO = new PageVO<>(); + pageVO.setPages(0); + pageVO.setTotal(0L); + pageVO.setList(new ArrayList<>()); + // 查询仓库信息 + WarehouseVO warehouse = this.checkWarehouse(searchDTO.getStockPointId(), searchDTO.getShopId(), searchDTO.getSysType()); + // 获取可采购的供应商Id集合 + List categoryIds = categoryShopFeignClient.getCategoryIdsByShopId(searchDTO.getShopId(), SysTypeEnum.MULTISHOP.value()).getData(); + List supplierIds = categoryShopFeignClient.getSupplyIdByCategoryIds(categoryIds).getData(); + if (CollectionUtils.isEmpty(supplierIds)) { + return pageVO; + } + if (!Objects.isNull(searchDTO.getSupplierId())) { + if (supplierIds.contains(searchDTO.getSupplierId())) { + supplierIds = Collections.singletonList(searchDTO.getSupplierId()); + } else { + return pageVO; + } + } + // 根据仓库areaId获取供应商可配送的仓库列表 + WarehouseDTO warehouseDTO = new WarehouseDTO(); + warehouseDTO.setShopIds(supplierIds); + warehouseDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + warehouseDTO.setAreaId(warehouse.getAreaId()); + List canDeliveryWarehouses = warehouseService.listCanDeliveryWarehouse(warehouseDTO); + List defaultWarehouseIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List warehouseIds = new ArrayList<>(canDeliveryWarehouses.size()); + for (WarehouseVO warehouseVO : canDeliveryWarehouses) { + warehouseIds.add(warehouseVO.getWarehouseId()); + if (Objects.equals(warehouseVO.getType(), 0)) { + defaultWarehouseIds.add(warehouseVO.getWarehouseId()); + } + } + // 分页查询仓库对应的商品 + if (!CollectionUtils.isEmpty(defaultWarehouseIds)) { + // 默认仓库在stock_point_sku就算没有库存,关联数据也会存在,通过not in排除空库存,再进行分页 + List emptySkuIds = this.listEmptySkuIds(defaultWarehouseIds); + if (!CollectionUtils.isEmpty(emptySkuIds)) { + searchDTO.setNotInSkuIds(emptySkuIds); + } + } + searchDTO.setCategoryIds(categoryIds); + PageVO spuPage = this.pageSupplierSpu(pageDTO, searchDTO, warehouseIds); + if (CollectionUtils.isEmpty(spuPage.getList())) { + return spuPage; + } + // 补充sku信息和库存 + this.fillSupplierSkuInfo(spuPage, warehouseIds, searchDTO); + // 补充供应商信息 + List suppliers = supplierDetailFeignClient.listBySupplierIds(supplierIds).getData(); + Map supplierMap = suppliers.stream().collect(Collectors.toMap(SupplierApiDetailVO::getSupplierId, x -> x)); + for (SpuVO spuVO : spuPage.getList()) { + SupplierApiDetailVO supplier = supplierMap.get(spuVO.getSupplierId()); + spuVO.setSupplierName(Objects.isNull(supplier) ? "" : supplier.getSupplierName()); + } + return spuPage; + } + + @Override + public void intiStockPointSKu() { + // 获取所有的默认仓库 + List warehouseVOS = warehouseService.listDefaultWarehouses(); + if (CollectionUtils.isEmpty(warehouseVOS)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + // 根据店铺id和系统类型区分 + Map> warehouseVOMap = warehouseVOS.stream().collect(Collectors.groupingBy(warehouse -> warehouse.getShopId() + Constant.UNDERLINE + warehouse.getSysType())); + List skuVOS = skuMapper.listAll(); + List skuIds = skuVOS.stream().map(SkuVO::getSkuId).toList(); + List stockPointSkuVOList = stockPointSkuService.listBySkuIds(skuIds); + Map> stockPointSkuMap = stockPointSkuVOList.stream().collect(Collectors.groupingBy(StockPointSkuVO::getSkuId)); + + List spuIds = skuVOS.stream().map(SkuVO::getSpuId).collect(Collectors.toList()); + List spuVOS = spuMapper.listSpuBySpuIds(spuIds); + Map shopMap = spuVOS.stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getShopId)); + Map supplierMap = spuVOS.stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getSupplierId)); + List stockPointSkuList = new ArrayList<>(skuVOS.size()); + for (SkuVO skuVO : skuVOS) { + // 已经有区域库存,就不用再创建默认库存了 + if (stockPointSkuMap.containsKey(skuVO.getSkuId()) || Objects.equals(skuVO.getStatus(), StatusEnum.DELETE.value())) { + continue; + } + StockPointSkuDTO stockPointSku = new StockPointSkuDTO(); + Integer sysType = SysTypeEnum.MULTISHOP.value(); + Long shopId = shopMap.get(skuVO.getSpuId()); + if (shopId == null) { + continue; + } + // 供应商商品 + if (shopId == -1) { + shopId = supplierMap.get(skuVO.getSpuId()); + sysType = SysTypeEnum.SUPPLIER.value(); + } + // 平台端-积分商品 + else if (Objects.equals(shopId, Constant.ZERO_LONG)) { + sysType = SysTypeEnum.PLATFORM.value(); + } + String key = shopId + Constant.UNDERLINE + sysType; + if (!warehouseVOMap.containsKey(key)) { + continue; + } + Long warehouseId = warehouseVOMap.get(key).get(0).getWarehouseId(); + stockPointSku.setStockPointId(warehouseId); + stockPointSku.setStockPointType(StockPointType.WAREHOUSE.getValue()); + stockPointSku.setSkuId(skuVO.getSkuId()); + stockPointSku.setSpuId(skuVO.getSpuId()); + stockPointSku.setType(0); + stockPointSku.setStatus(skuVO.getStatus()); + stockPointSkuList.add(stockPointSku); + } + if (CollUtil.isNotEmpty(stockPointSkuList)) { + stockPointSkuService.batchSave(stockPointSkuList); + } + } + + @Override + public int countNormalSpuBySpuIds(Set spuIds) { + return spuMapper.countNormalSpuBySpuIds(spuIds); + } + + /** + * 校验供应商信息是否变更 + * @param spuDTO 变更的spu信息 + * @param spuDb 原spu信息 + */ + private void checkSupplierSpuMsgChange(SpuDTO spuDTO, SpuVO spuDb) { + // 校验'图片'变化 + boolean isChange = (Objects.nonNull(spuDTO.getMainImgUrl()) && !Objects.equals(spuDTO.getMainImgUrl(), spuDb.getMainImgUrl())) + || (Objects.nonNull(spuDTO.getImgUrls()) && !Objects.equals(spuDTO.getImgUrls(), spuDb.getImgUrls())); + // 校验'品牌'变化 + isChange = isChange + || (Objects.nonNull(spuDTO.getBrandId()) && !Objects.equals(spuDTO.getBrandId(), spuDb.getBrandId())); + // 校验'详情'变化 + isChange = isChange + || (Objects.nonNull(spuDTO.getDetail()) && !Objects.equals(spuDTO.getDetail(), spuDb.getDetail())); + // 校验'视频'变化 + isChange = isChange + || (Objects.nonNull(spuDTO.getVideo()) && !Objects.equals(spuDTO.getVideo(), spuDb.getVideo())); + // 校验'计量单位'变化 + isChange = isChange + || (Objects.nonNull(spuDTO.getMeasureUnit()) && !Objects.equals(spuDTO.getMeasureUnit(), spuDb.getMeasureUnit())); + // 校验'商品卖点'变化 + isChange = isChange + || (Objects.nonNull(spuDTO.getSellingPoint()) && Objects.equals(spuDTO.getSellingPoint(), spuDb.getSellingPoint())); + // 校验'名称'变化 + isChange = isChange + || (Objects.nonNull(spuDTO.getName()) && !Objects.equals(spuDTO.getName(), spuDb.getName())); + // 校验'spu编码'变化 + isChange = isChange + || Objects.nonNull(spuDTO.getSpuCode()) && !Objects.equals(spuDTO.getSpuCode(), spuDb.getSpuCode()); + // 新增供应商商品变更日志 + if (isChange) { + SpuSupplierChangeLog changeLog = new SpuSupplierChangeLog(); + changeLog.setSpuId(spuDTO.getSpuId()); + changeLog.setChangeType(SupplierSpuChangeType.SPU_MSG_CHANGE.value()); + spuSupplierChangeLogService.save(changeLog); + } + } + + /** + * 检查仓库 + * @param warehouseId 仓库id + * @param shopId 店铺id + * @param sysType 系统类型 + */ + private WarehouseVO checkWarehouse(Long warehouseId, + Long shopId, + Integer sysType) { + WarehouseVO warehouse = warehouseService.getByWarehouseId(warehouseId); + if (Objects.isNull(warehouse)) { + throw new LuckException(String.format("仓库[%s]不存在", warehouseId)); + } + if (Objects.equals(warehouse.getSysType(), SysTypeEnum.STATION.value())) { + // 检查门店仓库 + if(Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + throw new LuckException("供应商不存在门店"); + } + StationVO station = stationFeignClient.getStationByInside(warehouse.getShopId()).getData(); + if (!Objects.equals(station.getShopId(), shopId)) { + throw new LuckException(String.format("门店[%s]非该店铺的门店", station.getStationId())); + } + } else if (!Objects.equals(shopId, warehouse.getShopId()) + || !Objects.equals(sysType, warehouse.getSysType())) { + // 检查商家/供应商仓库 + throw new LuckException(String.format("仓库[%s]非该店铺的仓库", warehouseId)); + } + return warehouse; + } + + /** + * 补充供应商sku信息 + * @param pageVO 分页数据 + * @param searchDTO 查询参数 + */ + private void fillSupplierSkuInfo(PageVO pageVO, List warehouseIds, SkuStockPointSearchDTO searchDTO) { + // 查询spu在该库存关联的skuId + List spuIds = pageVO.getList().stream().map(SpuVO::getSpuId).collect(Collectors.toList()); + StockPointSkuDTO stockPointSkuDTO = new StockPointSkuDTO(); + stockPointSkuDTO.setSpuIds(spuIds); + stockPointSkuDTO.setStockPointIds(warehouseIds); + List spuVOList = spuMapper.listStockPointSpuAndSku(stockPointSkuDTO); + pageVO.setList(spuVOList); + // 查询sku信息 + List skuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List skuVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuVO spuVO : spuVOList) { + spuIds.add(spuVO.getSpuId()); + for (SkuVO skuVO : spuVO.getSkus()) { + skuVOList.add(skuVO); + skuIds.add(skuVO.getSkuId()); + } + } + SkuDTO skuDTO = new SkuDTO(); + skuDTO.setSkuIds(skuIds); + List skus = skuService.listSku(skuDTO); + Map skuMap = skus.stream().collect(Collectors.toMap(SkuVO::getSkuId, x -> x)); + // 查询代销商品信息(用于查询商家库存) + List saleSkus = skuStockService.listSkuStockBySupplierSpuIds(new ArrayList<>(spuIds), searchDTO.getShopId()); + Map saleSkuMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(saleSkus)) { + saleSkuMap = saleSkus.stream().collect(Collectors.toMap(SkuVO::getSupplierSkuId, SkuVO::getSkuId)); + } + // 查询库存 + List stockPointSkuVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SkuVO skuVO : skuVOList) { + stockPointSkuVOList.add(new StockPointSkuVO(skuVO.getSkuId(), skuVO.getStockPointId())); + } + for (Long saleSkuId : saleSkuMap.values()) { + stockPointSkuVOList.add(new StockPointSkuVO(saleSkuId, searchDTO.getStockPointId())); + } + Map skuStockMap = skuStockService.mapSkuPointStockByStockPoints(stockPointSkuVOList); + // sku数据补充 + for (SpuVO spuVO : spuVOList) { + skuVOList = new ArrayList<>(spuVO.getSkus().size()); + for (SkuVO skuVO : spuVO.getSkus()) { + SkuVO sku = skuMap.get(skuVO.getSkuId()); + if (Objects.isNull(sku)) { + continue; + } + sku.setStockPointId(skuVO.getStockPointId()); + // 补充库存(过滤供应商库存为0的sku) + SkuStockVO skuStockVO = skuStockMap.get(skuVO.getSkuId() + "_" + skuVO.getStockPointId()); + if (Objects.isNull(skuStockVO) + || Objects.equals(skuStockVO.getStock(), 0)) { + continue; + } + sku.setSupplierStock(skuStockVO.getStock()); + // 补充代销商品库存 + skuStockVO = skuStockMap.get(saleSkuMap.get(skuVO.getSkuId()) + "_" + searchDTO.getStockPointId()); + sku.setStock(Objects.isNull(skuStockVO) ? 0 : skuStockVO.getStock()); + skuVOList.add(sku); + } + spuVO.setSkus(skuVOList); + } + } + + private void offlineRelatedComboBySpuIds(List spuIds) { + // 下架关联的组合商品 + List comboSpuIds = skuComboService.getCombSpusByComboSpuIds(spuIds,null); + if(CollUtil.isEmpty(comboSpuIds)){ + return; + } + spuMapper.batchChangeSpuStatus(comboSpuIds, StatusEnum.DISABLE.value()); + // 更新品牌信息 + List brandIds = brandMapper.listBrandIdBySpuIds(comboSpuIds); + brandMapper.batchUpdateSpuCount(brandIds); + // 更新商品分组信息 + handleStatusChange(comboSpuIds); + List shopIds = spuMapper.spuShopIdsBySpuIds(comboSpuIds); + if (CollUtil.isNotEmpty(comboSpuIds)) { + ServerResponseEntity discountResponseEntity = discountFeignClient.handleSpuOffline(comboSpuIds, shopIds); + if (!discountResponseEntity.isSuccess()) { + throw new LuckException(discountResponseEntity.getMsg()); + } + ServerResponseEntity couponResponseEntity = couponFeignClient.handleSpuOffline(comboSpuIds, shopIds); + if (!couponResponseEntity.isSuccess()) { + throw new LuckException(couponResponseEntity.getMsg()); + } + } + } + + /** + * 获取空库存的skuId集合 + * @param warehouseIds 仓库id集合 + * @return 空库存skuId集合 + */ + private List listEmptySkuIds(List warehouseIds) { + // 查询仓库关联的所有sku库存 + Map stockMap = stockManager.mapSkuStockByStockPointIds(warehouseIds); + if (stockMap.size() == 0) { + return new ArrayList<>(); + } + // 找出库存为0的skuId, 通过'not in',分页查询sku对应的spu + return stockMap.values().stream() + .filter(x -> x.getStock() <= 0) + .map(SkuStockVO::getSkuId).toList(); + } + + /** + * 分页查询供应商商品 + * @param pageDTO 分页参数 + * @param searchDTO 查询参数 + * @param warehouseIds 仓库id集合 + * @return 供应商商品分页数据 + */ + private PageVO pageSupplierSpu(PageDTO pageDTO, SkuStockPointSearchDTO searchDTO, List warehouseIds) { + StockPointSkuDTO stockPointSkuDTO = new StockPointSkuDTO(); + BeanUtils.copyProperties(searchDTO, stockPointSkuDTO); + stockPointSkuDTO.setShopId(null); + stockPointSkuDTO.setStockPointId(null); + stockPointSkuDTO.setStockPointIds(warehouseIds); + stockPointSkuDTO.setStatus(SpuStatus.PUT_SHELF.value()); + stockPointSkuDTO.setSpuMold(SpuMold.REAL.value()); + return PageUtil.doPage(pageDTO, () -> spuMapper.listPointSpu(stockPointSkuDTO)); + } +} + diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuSkuAttrValueServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuSkuAttrValueServiceImpl.java new file mode 100644 index 0000000..cbfeea4 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuSkuAttrValueServiceImpl.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.product.constant.AttrType; +import com.tmerclub.cloud.common.product.dto.SpuSkuAttrValueDTO; +import com.tmerclub.cloud.common.product.dto.SpuSkuAttrValueLangDTO; +import com.tmerclub.cloud.common.product.vo.AttrLangVO; +import com.tmerclub.cloud.common.product.vo.AttrVO; +import com.tmerclub.cloud.common.product.vo.AttrValueLangVO; +import com.tmerclub.cloud.common.product.vo.AttrValueVO; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.LangUtil; +import com.tmerclub.cloud.product.mapper.AttrMapper; +import com.tmerclub.cloud.product.mapper.SpuSkuAttrValueLangMapper; +import com.tmerclub.cloud.product.mapper.SpuSkuAttrValueMapper; +import com.tmerclub.cloud.product.model.SpuSkuAttrValue; +import com.tmerclub.cloud.product.model.SpuSkuAttrValueLang; +import com.tmerclub.cloud.product.service.SpuSkuAttrValueService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商品sku销售属性关联信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@Service +public class SpuSkuAttrValueServiceImpl implements SpuSkuAttrValueService { + + @Autowired + private SpuSkuAttrValueMapper spuSkuAttrValueMapper; + @Autowired + private SpuSkuAttrValueLangMapper spuSkuAttrValueLangMapper; + @Autowired + private AttrMapper attrMapper; + + @Override + public void save(List spuSkuAttrValueList, Integer sysType) { + if (CollUtil.isEmpty(spuSkuAttrValueList)) { + return; + } + spuSkuAttrValueMapper.batchSave(spuSkuAttrValueList); + List spuSkuAttrValueLangList = loadSpuSkuAttrValueInfo(spuSkuAttrValueList, sysType); + spuSkuAttrValueLangMapper.batchSave(spuSkuAttrValueLangList); + } + + @Override + public void updateBatch(List spuSkuAttrValues) { + if (CollUtil.isNotEmpty(spuSkuAttrValues)) { + spuSkuAttrValueMapper.updateBatch(spuSkuAttrValues); + } + } + + @Override + public void deleteById(Long spuSkuAttrId) { + spuSkuAttrValueMapper.deleteById(spuSkuAttrId); + } + + @Override + public void updateBySpuId(Long spuId) { + spuSkuAttrValueMapper.updateBySpuId(spuId); + } + + @Override + public void changeStatusBySkuId(List skuIds, Integer status) { + spuSkuAttrValueMapper.changeStatusBySkuId(skuIds, status); + } + + /** + * 加载销售属性国际化信息 + * + * @param spuSkuAttrValueList + * @return 属性国际化信息列表 + */ + private List loadSpuSkuAttrValueInfo(List spuSkuAttrValueList, Integer sysType) { + if (Objects.isNull(sysType)) { + sysType = AuthUserContext.get().getSysType(); + } + Map dbAttrMap = null; + List spuSkuAttrValueLangList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuSkuAttrValueDTO spuSkuAttrValueDTO : spuSkuAttrValueList) { + if (CollUtil.isNotEmpty(spuSkuAttrValueDTO.getSpuSkuAttrValueLangList())) { + for (SpuSkuAttrValueLangDTO spuSkuAttrValueLangDTO : spuSkuAttrValueDTO.getSpuSkuAttrValueLangList()) { + spuSkuAttrValueLangDTO.setSpuSkuAttrId(spuSkuAttrValueDTO.getSpuSkuAttrId()); + } + spuSkuAttrValueLangList.addAll(BeanUtil.mapAsList(spuSkuAttrValueDTO.getSpuSkuAttrValueLangList(), SpuSkuAttrValueLang.class)); + continue; + } + if (Objects.isNull(dbAttrMap)) { + List shopAttrs = attrMapper.getAttrsByCategoryIdAndAttrType(AttrType.SALES.value(), null, AuthUserContext.get().getTenantId(), sysType); + dbAttrMap = shopAttrs.stream().collect(Collectors.toMap(AttrVO::getAttrId, a -> a)); + } + AttrVO attrVO = dbAttrMap.get(spuSkuAttrValueDTO.getAttrId()); + // 通用 + boolean isShare = (Objects.isNull(spuSkuAttrValueDTO.getAttrId()) || Objects.isNull(spuSkuAttrValueDTO.getAttrValueId())) + || Objects.isNull(attrVO); + if (isShare) { + SpuSkuAttrValueLang spuSkuAttrValueLang = new SpuSkuAttrValueLang(); + spuSkuAttrValueLang.setSpuSkuAttrId(spuSkuAttrValueDTO.getSpuSkuAttrId()); + spuSkuAttrValueLang.setLang(LanguageEnum.LANGUAGE_ZH_CN.getLang()); + spuSkuAttrValueLang.setAttrName(spuSkuAttrValueDTO.getAttrName()); + spuSkuAttrValueLang.setAttrValueName(spuSkuAttrValueDTO.getAttrValueName()); + spuSkuAttrValueLangList.add(spuSkuAttrValueLang); + continue; + } + + Map attrNameMap = attrVO.getAttrLangList().stream().collect(Collectors.toMap(AttrLangVO::getLang, AttrLangVO::getName)); + Map attrValueMap = new HashMap<>(0); + for (AttrValueVO attrValue : attrVO.getAttrValues()) { + if (!Objects.equals(attrValue.getAttrValueId(), spuSkuAttrValueDTO.getAttrValueId())) { + continue; + } + attrValueMap = attrValue.getValues().stream().collect(Collectors.toMap(AttrValueLangVO::getLang, AttrValueLangVO::getValue)); + } + for (LanguageEnum languageEnum : LanguageEnum.values()) { + Integer lang = languageEnum.getLang(); + if (!attrNameMap.containsKey(lang) && !attrValueMap.containsKey(lang)) { + continue; + } + SpuSkuAttrValueLang spuSkuAttrValueLang = new SpuSkuAttrValueLang(); + + spuSkuAttrValueLang.setSpuSkuAttrId(spuSkuAttrValueDTO.getSpuSkuAttrId()); + spuSkuAttrValueLang.setLang(languageEnum.getLang()); + spuSkuAttrValueLang.setAttrName(LangUtil.getLangValue(attrNameMap, lang)); + spuSkuAttrValueLang.setAttrValueName(LangUtil.getLangValue(attrValueMap, lang)); + spuSkuAttrValueLangList.add(spuSkuAttrValueLang); + } + } + return spuSkuAttrValueLangList; + } + + @Override + public void commissionSave(List spuSkuAttrValueList, Integer sysType) { + if (CollUtil.isEmpty(spuSkuAttrValueList)) { + return; + } + spuSkuAttrValueMapper.batchSave(spuSkuAttrValueList); + List spuSkuAttrValueLangList = loadSpuSkuAttrValueInfo(spuSkuAttrValueList, sysType); + spuSkuAttrValueLangMapper.batchSave(spuSkuAttrValueLangList); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuTagServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuTagServiceImpl.java new file mode 100644 index 0000000..61976ff --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuTagServiceImpl.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.dto.SpuTagDTO; +import com.tmerclub.cloud.product.mapper.SpuTagMapper; +import com.tmerclub.cloud.product.model.SpuTag; +import com.tmerclub.cloud.product.service.SpuTagService; +import com.tmerclub.cloud.product.vo.SpuTagVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商品分组表 + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +@Service +public class SpuTagServiceImpl implements SpuTagService { + + @Autowired + private SpuTagMapper spuTagMapper; + + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + + @Override + public SpuTagVO getById(Long id) { + return spuTagMapper.getById(id); + } + + @Override + public void save(SpuTag spuTag) { + spuTagMapper.save(spuTag); + } + + @Override + public void update(SpuTag spuTag) { + spuTagMapper.update(spuTag); + } + + @Override + public void deleteById(Long id) { + spuTagMapper.deleteById(id); + } + + @Override + public PageVO pageByTitle(PageDTO pageDTO, SpuTagDTO spuTagDTO) { + return PageUtil.doPage(pageDTO, () -> spuTagMapper.list(spuTagDTO)); + } + + @Override + public List listByTitle(SpuTagDTO spuTagDTO) { + return spuTagMapper.list(spuTagDTO); + } + + @Override + public void updateProdCountById(Long id) { + spuTagMapper.updateProdCountById(id); + } + + @Override + public void batchUpdateProdCountById(List ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + spuTagMapper.batchUpdateProdCountById(ids); + } + + @Override + @Cacheable(cacheNames = CacheNames.SPU_TAG_BY_SHOP, key = "#shopId") + public List listByShopId(Long shopId) { + List spuTagList = spuTagMapper.listByShopId(shopId); + if (CollUtil.isEmpty(spuTagList)) { + return new ArrayList<>(0); + } + Set spuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + Iterator iterator = spuTagList.iterator(); + while (iterator.hasNext()) { + SpuTagVO spuTagVO = iterator.next(); + // 商品数量少于3件不展示 + if (CollUtil.isEmpty(spuTagVO.getSpuList()) || spuTagVO.getSpuList().size() < 3) { + iterator.remove(); + continue; + } + for (SpuSearchVO spuSearchVO : spuTagVO.getSpuList()) { + spuIds.add(spuSearchVO.getSpuId()); + } + } + ServerResponseEntity> spuResponse = searchSpuFeignClient.listSpuBySpuIds(new ArrayList<>(spuIds)); + if (!spuResponse.isSuccess()) { + throw new LuckException(spuResponse.getMsg()); + } + Map spuMap = spuResponse.getData().stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, s -> s)); + for (SpuTagVO spuTagVO : spuTagList) { + for (SpuSearchVO spuSearchVO : spuTagVO.getSpuList()) { + SpuSearchVO spu = spuMap.get(spuSearchVO.getSpuId()); + if (Objects.isNull(spu)) { + continue; + } + spuSearchVO.setMainImgUrl(spu.getMainImgUrl()); + spuSearchVO.setMarketPriceFee(spu.getMarketPriceFee()); + spuSearchVO.setPriceFee(spu.getPriceFee()); + spuSearchVO.setSellingPoint(spu.getSellingPoint()); + spuSearchVO.setShopId(spu.getShopId()); + spuSearchVO.setSpuName(spu.getSpuName()); + } + } + return spuTagList; + } + + @Override + @CacheEvict(cacheNames = CacheNames.SPU_TAG_BY_SHOP, key = "#shopId") + public void removeCacheByShopId(Long shopId) { + + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockBillLogItemServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockBillLogItemServiceImpl.java new file mode 100644 index 0000000..ddb0b05 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockBillLogItemServiceImpl.java @@ -0,0 +1,489 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.delivery.feign.StationFeignClient; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.api.product.bo.SpuSimpleBO; +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.api.product.dto.WarehouseDTO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.common.product.constant.*; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.StockBillLogItemVO; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.product.bo.mongo.MongoStockBillLogBO; +import com.tmerclub.cloud.product.constant.ProdKeyType; +import com.tmerclub.cloud.product.dto.StockBillLogDTO; +import com.tmerclub.cloud.product.mapper.SkuMapper; +import com.tmerclub.cloud.product.model.SkuStock; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.vo.SkuExcelVO; +import com.tmerclub.cloud.product.vo.StockBillLogItemExcelVO; +import com.tmerclub.cloud.product.vo.StockBillLogItemImportExcelVO; +import com.tmerclub.cloud.product.vo.StockBillLogItemImportVO; +import com.tmerclub.cloud.product.vo.mongo.MongoStockBillLogItemVO; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import java.util.*; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 出入库商品项 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +@Service +public class StockBillLogItemServiceImpl implements StockBillLogItemService { + + private static final Logger logger = LoggerFactory.getLogger(StockBillLogItemServiceImpl.class); + + @Autowired + private SkuService skuService; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private SkuStockService skuStockService; + @Autowired + private SpuService spuService; + @Autowired + private SkuMapper skuMapper; + + @Autowired + private WarehouseService warehouseService; + @DubboReference + private StationFeignClient stationFeignClient; + @DubboReference + private AccountFeignClient accountFeignClient; + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + @Override + public PageVO page(PageDTO pageDTO, StockBillLogDTO stockBillLogDTO) { + // 只查询已 出/入 库的数据 + stockBillLogDTO.setStatus(StockBillStatus.SUCCESS.value()); + // 主表查询条件 + Criteria criteria = loadStockBillLogItemQuery(stockBillLogDTO); + ProjectionOperation projectionOperation = Aggregation.project("stockBillNo", "sourceOrderNo", "stockBillType", "type", "createTime", "makerMobile") + .and("_id").as("stockBillLogId") + .and("stockPointId").as("stockPointId") + .and("stockPointType").as("stockPointType") + .and("employeeId").as("employeeId") + .and("stockBillItemLogs.skuId").as("skuId") + .and("stockBillItemLogs.spuId").as("spuId") + .and("stockBillItemLogs.spuName").as("spuName") + .and("stockBillItemLogs.stockCount").as("stockCount") + .and("stockBillItemLogs.unitPrice").as("unitPrice") + .and("stockBillItemLogs.partyCode").as("partyCode"); + // 查询结果进行排序 + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "createTime").and(Sort.Direction.DESC, "skuId"); + // 分页数据 - + SkipOperation skipOperation = Aggregation.skip((long) pageDTO.getPageSize() * (pageDTO.getPageNum() - 1)); + LimitOperation limitOperation = Aggregation.limit(pageDTO.getPageSize()); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoStockBillLogItemVO.class, + Aggregation.unwind("stockBillItemLogs"), + Aggregation.match(criteria), + sortOperation, + skipOperation, + limitOperation, + projectionOperation + ); + logger.info("pageStockItem()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作获取当前页数据 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, "stock_bill_log", MongoStockBillLogItemVO.class); + List curList = aggregationResults.getMappedResults(); + // 查询信息 + Map warehouseNameMap = new HashMap<>(Constant.INITIAL_CAPACITY); + Map userMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(curList)) { + Set stockPointIds = new HashSet<>(Constant.INITIAL_CAPACITY); + Set userIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (MongoStockBillLogItemVO mongoStockBillLogItemVO : curList) { + stockPointIds.add(mongoStockBillLogItemVO.getStockPointId()); + userIds.add(mongoStockBillLogItemVO.getEmployeeId()); + } + // 查询库存点 + if (!CollectionUtils.isEmpty(stockPointIds)) { + WarehouseDTO warehouseDTO = new WarehouseDTO(); + warehouseDTO.setWarehouseIds(new ArrayList<>(stockPointIds)); + List warehouses = warehouseService.listWarehouse(warehouseDTO); + if(!CollectionUtils.isEmpty(warehouses)) { + warehouseNameMap = warehouses.stream().collect(Collectors.toMap(WarehouseVO::getWarehouseId, WarehouseVO::getWarehouseName)); + } + } + // 查询制单人 + if (!CollectionUtils.isEmpty(userIds)) { + List accounts = accountFeignClient.listByUserIdsAndPhoneAndType(new ArrayList<>(userIds), null, SysTypeEnum.MULTISHOP.value()).getData(); + if (!CollectionUtils.isEmpty(accounts)) { + userMap = accounts.stream().collect(Collectors.toMap(AuthAccountVO::getUserId, x -> x)); + } + } + } + // 补充信息 + AuthAccountVO accountVO; + for (MongoStockBillLogItemVO mongoStockBillLogItem : curList) { + // 补充库存点名称 + mongoStockBillLogItem.setStockPointName(warehouseNameMap.get(mongoStockBillLogItem.getStockPointId())); + mongoStockBillLogItem.setStockPointType(mongoStockBillLogItem.getStockPointType() == null ? StockPointType.WAREHOUSE.getValue() : mongoStockBillLogItem.getStockPointType()); + // 补充制单人信息 + if (!Objects.isNull(accountVO = userMap.get(mongoStockBillLogItem.getEmployeeId()))) { + mongoStockBillLogItem.setMakerName(accountVO.getUsername()); + mongoStockBillLogItem.setMakerMobile(accountVO.getPhone()); + } + // 手机号隐藏 + if (StrUtil.isNotBlank(mongoStockBillLogItem.getMakerMobile())) { + mongoStockBillLogItem.setMakerMobile(PhoneUtil.hideBetween(mongoStockBillLogItem.getMakerMobile()).toString()); + } + } + + TypedAggregation totalTypedAggregation = Aggregation.newAggregation( + MongoStockBillLogBO.class, + Aggregation.unwind("stockBillItemLogs"), + Aggregation.match(criteria), + Aggregation.count().as("totalCount") + ); + AggregationResults totalAggregationResults = mongoTemplate.aggregate(totalTypedAggregation, "stock_bill_log", MongoStockBillLogBO.class); + + // 总条数 + long count = 0L; + if (CollUtil.isNotEmpty(totalAggregationResults.getMappedResults())) { + count = totalAggregationResults.getMappedResults().get(0).getTotalCount(); + } + + PageVO stockBillLogItemPage = new PageVO<>(); + stockBillLogItemPage.setTotal(count); + stockBillLogItemPage.setList(curList); + stockBillLogItemPage.setPages(PageUtil.getPages(count, pageDTO.getPageSize())); + return stockBillLogItemPage; + } + + private Criteria loadStockBillLogItemQuery(StockBillLogDTO stockBillLogDTO) { + Criteria criteria = new Criteria(); + if (StrUtil.isNotBlank(stockBillLogDTO.getProdKey())) { + if (Objects.equals(stockBillLogDTO.getProdKeyType(), ProdKeyType.SPU_NAME.value())) { + SpuSimpleBO spuSimpleBO = new SpuSimpleBO(); + spuSimpleBO.setLang(I18nMessage.getLang()); + // 商品名称 + spuSimpleBO.setSpuName(stockBillLogDTO.getProdKey()); + List spuList = spuService.listSimple(spuSimpleBO); + List spuIds = spuList.stream().map(SpuSimpleBO::getSpuId).collect(Collectors.toList()); + criteria.and("stockBillItemLogs.spuId").in(spuIds); + } else if (Objects.equals(stockBillLogDTO.getProdKeyType(), ProdKeyType.PARTY_CODE.value())) { + logger.info("通过商品编码查询库存流水,商品编码:{}", stockBillLogDTO.getProdKey()); + // 商品编码 + List skuVoList = skuMapper.listSkuByPartyCodeAndShopId(stockBillLogDTO.getProdKey(), stockBillLogDTO.getShopId(), stockBillLogDTO.getSupplierId()); + // skuId + List skuIdList = skuVoList.stream().map(SkuVO::getSkuId).collect(Collectors.toList()); + // 供应商skuId + List supplierSkuIdList = skuVoList.stream().filter(skuVO->Objects.nonNull(skuVO.getSupplierSkuId())).map(SkuVO::getSupplierSkuId).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(supplierSkuIdList) ){ + skuIdList.addAll(supplierSkuIdList); + } + criteria.and("stockBillItemLogs.skuId").in(skuIdList); + } + } + if (!ObjectUtils.isEmpty(stockBillLogDTO.getStockPointName())) { + WarehouseDTO warehouseDTO = new WarehouseDTO(); + warehouseDTO.setWarehouseName(stockBillLogDTO.getStockPointName()); + List warehouse = warehouseService.listWarehouse(warehouseDTO); + if (!CollectionUtils.isEmpty(warehouse)) { + List warehouseIds = warehouse.stream().map(WarehouseVO::getWarehouseId).toList(); + criteria.and("stockPointId").in(warehouseIds); + } + } + if (CollUtil.isNotEmpty(stockBillLogDTO.getStockBillLogItemIds())) { + criteria.and("_id").in(stockBillLogDTO.getStockBillLogItemIds()); + } + if (AuthUserContext.get().getSysType().equals(SysTypeEnum.MULTISHOP.value())) { + criteria.and("supplierId").isNull(); + } + criteria.and("shopId").is(stockBillLogDTO.getShopId()); + if (Objects.nonNull(stockBillLogDTO.getCreateStartTime()) && Objects.nonNull(stockBillLogDTO.getCreateEndTime())) { + criteria.andOperator(Criteria.where("createTime").lte(stockBillLogDTO.getCreateEndTime()), + Criteria.where("createTime").gte(stockBillLogDTO.getCreateStartTime())); + } + if (StrUtil.isNotBlank(stockBillLogDTO.getSourceOrderNo())) { + // 模糊查询只支持字段属性是字符串 + criteria.and("sourceOrderNo").regex(Pattern.compile("^.*" + stockBillLogDTO.getSourceOrderNo() + ".*$", Pattern.CASE_INSENSITIVE)); + } + if (StrUtil.isNotBlank(stockBillLogDTO.getStockBillNo())) { + criteria.and("stockBillNo").regex(Pattern.compile("^.*" + stockBillLogDTO.getStockBillNo() + ".*$", Pattern.CASE_INSENSITIVE)); + } + if (Objects.nonNull(stockBillLogDTO.getStockBillType()) && !Objects.equals(stockBillLogDTO.getStockBillType(), 0)) { + criteria.and("stockBillType").is(stockBillLogDTO.getStockBillType()); + } + if (Objects.nonNull(stockBillLogDTO.getType())) { + criteria.and("type").is(stockBillLogDTO.getType()); + } + if (Objects.nonNull(stockBillLogDTO.getStatus())) { + criteria.and("status").is(stockBillLogDTO.getStatus()); + } + if (StrUtil.isNotBlank(stockBillLogDTO.getMakerMobile())) { + criteria.and("makerMobile").is(stockBillLogDTO.getMakerMobile()); + } + return criteria; + } + + private Map getSkuMap(Stream curList) { + List skuIds = curList.collect(Collectors.toList()); + ProductSearchDTO productSearchDTO = new ProductSearchDTO(); + productSearchDTO.setSkuIds(skuIds); + List skuList = skuService.exportSkuList(productSearchDTO); + return skuList.stream().collect(Collectors.toMap(SkuExcelVO::getSkuId, s -> s)); + } + + @Override + public List exportFlow(StockBillLogDTO stockBillLogDTO, HttpServletResponse response) { + // 主表查询条件 + Criteria criteria = loadStockBillLogItemQuery(stockBillLogDTO); + ProjectionOperation projectionOperation = Aggregation.project("stockBillNo", "sourceOrderNo", "stockBillType", "type", "measureUnit", "createTime", "makerMobile") + .and("stockPointId").as("stockPointId") + .and("stockPointType").as("stockPointType") + .and("stockBillItemLogs.skuId").as("skuId") + .and("stockBillItemLogs.spuId").as("spuId") + .and("stockBillItemLogs.spuName").as("spuName") + .and("stockBillItemLogs.stockCount").as("stockCount") + .and("stockBillItemLogs.unitPrice").as("unitPrice") + .and("stockBillItemLogs.partyCode").as("partyCode"); + // 查询结果进行排序 + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "createTime").and(Sort.Direction.DESC, "skuId"); + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoStockBillLogItemVO.class, + Aggregation.unwind("stockBillItemLogs"), + Aggregation.match(criteria), + sortOperation, + projectionOperation + ); + logger.info("exportFlow()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作获取当前页数据 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, "stock_bill_log", MongoStockBillLogItemVO.class); + List mappedResults = aggregationResults.getMappedResults(); + List excelStockBillLogItemList = BeanUtil.mapAsList(mappedResults, StockBillLogItemExcelVO.class); + Map skuMap = getSkuMap(excelStockBillLogItemList.stream().map(StockBillLogItemExcelVO::getSkuId)); + List warehouseIds = mappedResults.stream().filter(logItem-> Objects.equals(logItem.getStockPointType(), StockPointType.WAREHOUSE.getValue())).map(MongoStockBillLogItemVO::getStockPointId).collect(Collectors.toList()); + WarehouseDTO warehouseDTO = new WarehouseDTO(); + warehouseDTO.setWarehouseIds(warehouseIds); + List warehouseVOS = warehouseService.listWarehouse(warehouseDTO); + Map warehouseMap = warehouseVOS.stream().collect(Collectors.toMap(WarehouseVO::getWarehouseId, WarehouseVO::getWarehouseName)); + + List stationIds = mappedResults.stream().filter(logItem-> Objects.equals(logItem.getStockPointType(), StockPointType.STATION.getValue())).map(MongoStockBillLogItemVO::getStockPointId).collect(Collectors.toList()); + List stationVOList = stationFeignClient.listStationByIds(stationIds); + Map stationMap = stationVOList.stream().collect(Collectors.toMap(StationVO::getStationId, StationVO::getStationName)); + + for (StockBillLogItemExcelVO stockBillLogItemExcel : excelStockBillLogItemList) { + if (Objects.equals(stockBillLogItemExcel.getStockPointType(), String.valueOf(StockPointType.STATION.getValue()))) { + stockBillLogItemExcel.setStockPointType(StockPointType.STATION.getDesc()); + stockBillLogItemExcel.setStockPointName(stationMap.get(stockBillLogItemExcel.getStockPointId())); + } else { + stockBillLogItemExcel.setStockPointType(StockPointType.WAREHOUSE.getDesc()); + stockBillLogItemExcel.setStockPointName(warehouseMap.get(stockBillLogItemExcel.getStockPointId())); + } + if (StrUtil.isNotBlank(stockBillLogItemExcel.getMakerMobile())) { + stockBillLogItemExcel.setMakerMobile(PhoneUtil.hideBetween(stockBillLogItemExcel.getMakerMobile()).toString()); + } + stockBillLogItemExcel.setStockBillTypeName(Objects.nonNull(stockBillLogItemExcel.getStockBillType()) ? Objects.requireNonNull(StockBillType.instance(stockBillLogItemExcel.getStockBillType())).text() : ""); + if (!skuMap.containsKey(stockBillLogItemExcel.getSkuId())) { + continue; + } + SkuExcelVO skuExcelVO = skuMap.get(stockBillLogItemExcel.getSkuId()); + stockBillLogItemExcel.setSpuName(skuExcelVO.getSpuName()); + stockBillLogItemExcel.setSkuName(skuExcelVO.getSkuName()); + stockBillLogItemExcel.setPartyCode(skuExcelVO.getPartyCode()); + } + return excelStockBillLogItemList; + } + + @Override + public void downloadModel(HttpServletResponse response, Integer type) { + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map map = new HashMap<>(8); + list.add(new StockBillLogItemExcelVO()); + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + ExcelWriterBuilder excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, Objects.equals(type, StockType.OUT_OF_STOCK.value()) ? StockBillLogItemImportExcelVO.EXCEL_NAME_EXPORT : StockBillLogItemImportExcelVO.EXCEL_NAME_IMPORT, StockBillLogItemImportExcelVO.MERGE_ROW_INDEX, StockBillLogItemImportExcelVO.MERGE_COLUMN_INDEX); + excelWriter = ExcelUtil.getExcelModel(excelWriterMerge, map, Constant.START_ROW).build(); + // 业务代码 + if (CollUtil.isNotEmpty(list)) { + // 进行写入操作 + WriteSheet sheetWriter = EasyExcel.writerSheet(Objects.equals(type, StockType.OUT_OF_STOCK.value()) ? StockBillLogItemImportExcelVO.SHEET_NAME_EXPORT : StockBillLogItemImportExcelVO.SHEET_NAME_IMPORT).head(StockBillLogItemImportExcelVO.class).build(); + excelWriter.write(list, sheetWriter); + } + + } catch (Exception e) { + logger.error("导出出入库商品项模板excel失败", e); + } finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + } + + } + + @Override + public void importExcel(List list, List errorList, Integer stockType, StockBillLogItemImportVO stockBillLogItemImportVO) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + List stockBillLogItemVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + int i = 0; + String tips; + if (list.size() == 0) { + tips = "导入数据为空,请检查下文件"; + stockBillLogItemImportVO.setTips(tips); + } else { + try { + for (StockBillLogItemImportExcelVO item : list) { + i++; + String partyCode = item.getPartyCode(); + if (Objects.isNull(partyCode)) { + throw new LuckException("商品编码不能为空"); + } + + StockBillLogItemDTO stockBillLogItemDTO = skuService.getSkuByPartyCodeAndShopId(partyCode, shopId, sysType); + if (Objects.isNull(stockBillLogItemDTO)) { + throw new LuckException("商品不存在"); + } + if (Objects.isNull(item.getStockCount())) { + throw new LuckException("出入库数量不能为空"); + } + if (Objects.equals(stockType, StockType.WAREHOUSING.value()) && item.getStockCount() <= 0) { + throw new LuckException("入库数量不能少于零"); + } + SkuStock skuStock = skuStockService.getBySkuId(stockBillLogItemDTO.getSkuId(), SpuMold.REAL.value()); + if (Objects.equals(stockType, StockType.OUT_OF_STOCK.value())) { + if (Objects.nonNull(skuStock) && item.getStockCount() > skuStock.getStock()) { + throw new LuckException("出库数量不能超过商品库存"); + } + } + StockBillLogItemVO stockBillLogItemVO = new StockBillLogItemVO(); + stockBillLogItemVO.setSkuId(stockBillLogItemDTO.getSkuId()); + stockBillLogItemVO.setPartyCode(item.getPartyCode()); + stockBillLogItemVO.setStock(skuStock.getStock()); + stockBillLogItemVO.setMainImgUrl(stockBillLogItemDTO.getMainImgUrl()); + stockBillLogItemVO.setStockBillType(stockType); + stockBillLogItemVO.setSpuId(stockBillLogItemDTO.getSpuId()); + stockBillLogItemVO.setStockCount(item.getStockCount()); + stockBillLogItemVO.setSpuName(stockBillLogItemDTO.getSpuName()); + stockBillLogItemVO.setSkuName(stockBillLogItemDTO.getSkuName()); + stockBillLogItemVOList.add(stockBillLogItemVO); + } + } catch (LuckException e) { + //错误信息提示 + errorList.add("第" + (i + 1) + "行数据有错误:" + e.getMessage()); + } + tips = "检查到" + list.size() + "条商品信息,成功导入" + + (stockBillLogItemVOList.size()) + "条商品信息!错误" + (list.size() - stockBillLogItemVOList.size()) + "条商品信息!" + + (CollUtil.isNotEmpty(errorList) ? errorList.toString() : ""); + } + + stockBillLogItemImportVO.setTips(tips); + stockBillLogItemImportVO.setStockBillLogItemList(stockBillLogItemVOList); + } + + private Criteria getLogCriteriaByParam(StockBillLogDTO stockBillLogDTO) { + Criteria criteria = new Criteria(); + criteria.and("stockBillLogs.shopId").is(stockBillLogDTO.getShopId()); + if (Objects.nonNull(stockBillLogDTO.getCreateStartTime()) && Objects.nonNull(stockBillLogDTO.getCreateEndTime())) { + criteria.andOperator(Criteria.where("stockBillLogs.createTime").lte(stockBillLogDTO.getCreateEndTime()), + Criteria.where("stockBillLogs.createTime").gte(stockBillLogDTO.getCreateStartTime())); + } + if (StrUtil.isNotBlank(stockBillLogDTO.getSourceOrderNo())) { + // 模糊查询只支持字段属性是字符串 + criteria.and("stockBillLogs.sourceOrderNo").regex(Pattern.compile("^.*" + stockBillLogDTO.getSourceOrderNo() + ".*$", Pattern.CASE_INSENSITIVE)); + } + if (StrUtil.isNotBlank(stockBillLogDTO.getStockBillNo())) { + criteria.and("stockBillLogs.stockBillNo").regex(Pattern.compile("^.*" + stockBillLogDTO.getStockBillNo() + ".*$", Pattern.CASE_INSENSITIVE)); + } + if (Objects.nonNull(stockBillLogDTO.getStockBillType()) && !Objects.equals(stockBillLogDTO.getStockBillType(), 0)) { + criteria.and("stockBillLogs.stockBillType").is(stockBillLogDTO.getStockBillType()); + } + if (Objects.nonNull(stockBillLogDTO.getType())) { + criteria.and("stockBillLogs.type").is(stockBillLogDTO.getType()); + } + if (Objects.nonNull(stockBillLogDTO.getStatus())) { + criteria.and("stockBillLogs.status").is(stockBillLogDTO.getStatus()); + } + if (StrUtil.isNotBlank(stockBillLogDTO.getMakerMobile())) { + criteria.and("stockBillLogs.makerMobile").is(stockBillLogDTO.getMakerMobile()); + } + return criteria; + } + + private Criteria getItemCriteriaByParam(StockBillLogDTO stockBillLogDTO) { + Criteria criteria = new Criteria(); + if (StrUtil.isNotBlank(stockBillLogDTO.getProdKey())) { + if (Objects.equals(stockBillLogDTO.getProdKeyType(), ProdKeyType.SPU_NAME.value())) { + SpuSimpleBO spuSimpleBO = new SpuSimpleBO(); + spuSimpleBO.setLang(I18nMessage.getLang()); + // 商品名称 + spuSimpleBO.setSpuName(stockBillLogDTO.getProdKey()); + List spuList = spuService.listSimple(spuSimpleBO); + List spuIds = spuList.stream().map(SpuSimpleBO::getSpuId).collect(Collectors.toList()); + criteria.and("spuId").in(spuIds); + } else if (Objects.equals(stockBillLogDTO.getProdKeyType(), ProdKeyType.PARTY_CODE.value())) { + logger.info("通过商品编码查询库存流水,商品编码:{}", stockBillLogDTO.getProdKey()); + // 商品编码 + List skuVoList = skuMapper.listSkuByPartyCodeAndShopId(stockBillLogDTO.getProdKey(), stockBillLogDTO.getShopId(), stockBillLogDTO.getSupplierId()); + // skuId + List skuIdList = skuVoList.stream().map(SkuVO::getSkuId).collect(Collectors.toList()); + // 供应商skuId + List supplierSkuIdList = skuVoList.stream().filter(skuVO->Objects.nonNull(skuVO.getSupplierSkuId())).map(SkuVO::getSupplierSkuId).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(supplierSkuIdList)){ + skuIdList.addAll(supplierSkuIdList); + } + criteria.and("skuId").in(skuIdList); + } + } + if (CollUtil.isNotEmpty(stockBillLogDTO.getStockBillLogItemIds())) { + criteria.and("_id").in(stockBillLogDTO.getStockBillLogItemIds()); + } + return criteria; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockChangeReasonStatusServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockChangeReasonStatusServiceImpl.java new file mode 100644 index 0000000..e491075 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockChangeReasonStatusServiceImpl.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.mapper.StockChangeReasonStatusMapper; +import com.tmerclub.cloud.product.model.StockChangeReasonStatus; +import com.tmerclub.cloud.product.service.StockChangeReasonStatusService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 出入库原因状态 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +@Service +public class StockChangeReasonStatusServiceImpl implements StockChangeReasonStatusService { + + @Autowired + private StockChangeReasonStatusMapper stockChangeReasonStatusMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> stockChangeReasonStatusMapper.list()); + } + + @Override + public StockChangeReasonStatus getByStockChangeReasonStatusId(Long stockChangeReasonStatusId) { + return stockChangeReasonStatusMapper.getByStockChangeReasonStatusId(stockChangeReasonStatusId); + } + + @Override + public void save(StockChangeReasonStatus stockChangeReasonStatus) { + stockChangeReasonStatusMapper.save(stockChangeReasonStatus); + } + + @Override + public void update(StockChangeReasonStatus stockChangeReasonStatus) { + stockChangeReasonStatusMapper.update(stockChangeReasonStatus); + } + + @Override + public void deleteById(Long stockChangeReasonStatusId) { + stockChangeReasonStatusMapper.deleteById(stockChangeReasonStatusId); + } + + @Override + public StockChangeReasonStatus getStatusByShopIdAndReasonId(Long shopId, Long reasonId) { + return stockChangeReasonStatusMapper.getStatusByShopIdAndReasonId(shopId, reasonId); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockPointSkuServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockPointSkuServiceImpl.java new file mode 100644 index 0000000..b550a13 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockPointSkuServiceImpl.java @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.delivery.feign.StationFeignClient; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.constant.StockModeEnum; +import com.tmerclub.cloud.common.product.constant.StockPointType; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.mapper.StockPointSkuMapper; +import com.tmerclub.cloud.product.model.StockPointSku; +import com.tmerclub.cloud.product.service.StockPointSkuService; +import com.tmerclub.cloud.product.service.WarehouseService; +import org.apache.dubbo.config.annotation.DubboReference; +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.*; +import java.util.stream.Collectors; + +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-09 18:00:43 + */ +@Service +public class StockPointSkuServiceImpl implements StockPointSkuService { + + @Autowired + private StockPointSkuMapper stockPointSkuMapper; + @Autowired + private WarehouseService warehouseService; + @DubboReference + private StationFeignClient stationFeignClient; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> stockPointSkuMapper.list()); + } + + @Override + public StockPointSku getByStockPointSkuId(Long stockPointSkuId) { + return stockPointSkuMapper.getByStockPointSkuId(stockPointSkuId); + } + + @Override + public void save(StockPointSku stockPointSku) { + stockPointSku.setType(Objects.isNull(stockPointSku.getType()) ? 1 : stockPointSku.getType()); + stockPointSkuMapper.save(stockPointSku); + } + + @Override + public void update(StockPointSku stockPointSku) { + stockPointSkuMapper.update(stockPointSku); + } + + @Override + public void deleteById(Long stockPointSkuId) { + stockPointSkuMapper.deleteById(stockPointSkuId); + } + + @Override + public void deleteByIds(List stockPointSkuIds) { + if (CollectionUtils.isEmpty(stockPointSkuIds)) { + return; + } + stockPointSkuMapper.deleteByIds(stockPointSkuIds); + } + + @Override + public void deleteBySpuId(Long spuId) { + stockPointSkuMapper.deleteBySpuId(spuId); + } + + @Override + public void batchDeleteByStockPointSkuIdList(List stockPointSkuIdList) { + if (CollectionUtil.isEmpty(stockPointSkuIdList)) { + return; + } + stockPointSkuMapper.batchDeleteByStockPointSkuIdList(stockPointSkuIdList); + } + + @Override + public void batchSave(List stockPointDTOList) { + if (CollectionUtil.isEmpty(stockPointDTOList)) { + return; + } +// if (CollectionUtil.isEmpty(stockPointDTOList)) { +// throw new LuckException("库存不能为空"); +// } + for (StockPointSkuDTO stockPointSkuDTO : stockPointDTOList) { + stockPointSkuDTO.setType(Objects.isNull(stockPointSkuDTO.getType()) ? 1 : stockPointSkuDTO.getType()); + } + stockPointSkuMapper.batchSave(stockPointDTOList); + } + + @Override + public List listBySkuIds(List skuIds) { + return stockPointSkuMapper.listBySkuIds(skuIds); + } + + @Override + public List listPointIdsBySkuIds(List skuIds) { + List stockPoints = stockPointSkuMapper.listBySkuIds(skuIds); + return stockPoints; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void changeStockPoint(List stockPointDTOList, boolean isUpdate) { + // 获取商品原来的关联数据 + List skuIds = stockPointDTOList.stream().map(StockPointSkuDTO::getSkuId).collect(Collectors.toList()); + List stockPointSkuDb = stockPointSkuMapper.listBySkuIds(skuIds); + Map> pointMap = stockPointSkuDb.stream().collect(Collectors.groupingBy(stockPoint -> stockPoint.getStockPointId() + "_" + stockPoint.getSkuId())); + // 需要添加的新库存点数据 + List insertSkuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 需要删除的关联库存点 + List deleteSkuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 需要修改的数据 + List updateSkuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 转换成插入的数据 + Map> skuStockMap = stockPointDTOList.stream().collect(Collectors.groupingBy(StockPointSkuDTO::getSkuId)); + + for (StockPointSkuDTO stockPointSku : stockPointDTOList) { + String key = stockPointSku.getStockPointId() + "_" + stockPointSku.getSkuId(); + if (pointMap.containsKey(key)) { + List pointSkuVOS = pointMap.get(key); + for (StockPointSkuVO pointSkuVO : pointSkuVOS) { + if (stockPointSku.getStock() == 0 && !Objects.equals(pointSkuVO.getType(), 0)) { + deleteSkuIds.add(pointSkuVO.getStockPointSkuId()); + } + } + pointMap.remove(key); + } else { + insertSkuList.add(stockPointSku); + } + } + if (isUpdate) { + for (Map.Entry> map : pointMap.entrySet()) { + // 修改需要删除掉没有的数据 + map.getValue().forEach(stockPointSkuVO -> deleteSkuIds.add(stockPointSkuVO.getStockPointSkuId())); + } + } + if (CollectionUtil.isNotEmpty(insertSkuList)) { + stockPointSkuMapper.batchSave(insertSkuList); + } + if (CollectionUtil.isNotEmpty(deleteSkuIds)) { + stockPointSkuMapper.batchDeleteByStockPointSkuIdList(deleteSkuIds); + } + } + + @Override + public List listByPointId(Long stockPointId) { + + return stockPointSkuMapper.listByPointId(stockPointId); + } + + @Override + public void removeBySkuIdAndPointId(Long skuId, Long stockPointId) { + stockPointSkuMapper.removeBySkuIdAndPointId(skuId, stockPointId); + } + + @Override + public List listPointBySkuIds(List skuIds) { + if (CollUtil.isEmpty(skuIds)) { + return Collections.emptyList(); + } + return stockPointSkuMapper.listPointBySkuIds(skuIds); + } + + @Override + public void updateStockMode(Long stockPointId, Integer stockMode) { + stockPointSkuMapper.updateStockMode(stockPointId, stockMode); + } + + @Override + public List filtePoint(List stockPointSkuVOList) { + List resultList = new ArrayList<>(stockPointSkuVOList.size()); + Long defaultId = warehouseService.getDefaultWarehouseByShopId(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()).getWarehouseId(); + // 获取所有仓库 + List warehouseList = warehouseService.listWarehouseByShopId(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + Map warehouseDbMap = warehouseList.stream().collect(Collectors.toMap(WarehouseVO::getWarehouseId, s -> s)); + // 获取所有还存在的门店 + List stationIds = stockPointSkuVOList.stream().filter(stockPointSkuDTO -> stockPointSkuDTO.getStockPointType() == StockPointType.STATION.getValue()).map(StockPointSkuDTO::getStockPointId).toList(); + List stationVOS = stationFeignClient.listStationByIds(stationIds); + Map stationDbMap = stationVOS.stream().collect(Collectors.toMap(StationVO::getStationId, s -> s)); + + Map> skuStockPointMap = stockPointSkuVOList.stream().collect(Collectors.groupingBy(StockPointSkuDTO::getSkuId)); + for (Map.Entry> map : skuStockPointMap.entrySet()) { + List stockPointIds = map.getValue().stream().map(StockPointSkuDTO::getStockPointId).collect(Collectors.toList()); + // 先判断有没有默认仓库,没有就添加 + if (!stockPointIds.contains(defaultId)) { + StockPointSkuDTO stockPointSkuDTO = new StockPointSkuDTO(defaultId, StockPointType.WAREHOUSE.getValue(), map.getValue().get(0).getSpuId() , map.getKey(), map.getValue().get(0).getStatus(), 0, null); + stockPointSkuDTO.setStock(0); + resultList.add(stockPointSkuDTO); + } + Map> listMap = map.getValue().stream().collect(Collectors.groupingBy(StockPointSkuDTO::getStockPointType)); + int warehouseStock = 0; + int stationStock = 0; + // 1、过滤仓库集合 + if (listMap.containsKey(StockPointType.WAREHOUSE.getValue())) { + List warehousePointList = listMap.get(StockPointType.WAREHOUSE.getValue()); + for (StockPointSkuDTO warehousePoint : warehousePointList) { + if (warehouseDbMap.containsKey(warehousePoint.getStockPointId())) { + resultList.add(warehousePoint); + } else { + // 没有的就将仓库库存补充到默认仓库 + warehouseStock += warehousePoint.getStock(); + } + } + } + // 2、过滤门店集合 + if (listMap.containsKey(StockPointType.STATION.getValue())) { + List stationList = listMap.get(StockPointType.STATION.getValue()); + for (StockPointSkuDTO stationPoint : stationList) { + if (stationDbMap.containsKey(stationPoint.getStockPointId())) { + StationVO stationVO = stationDbMap.get(stationPoint.getStockPointId()); + if (stationVO.getStockMode().equals(StockModeEnum.SINGLE_STOCK.value())) { + resultList.add(stationPoint); + } else { + stationStock += stationPoint.getStock(); + } + } else { + // 没有的就将仓库库存补充到默认仓库 + stationStock += stationPoint.getStock(); + } + } + } + // 3、累加门店和仓库库存 + for (StockPointSkuDTO stockPointSkuDTO : resultList) { + if (stockPointSkuDTO.getType() == 0 && stockPointSkuDTO.getSkuId().equals(map.getKey())){ + stockPointSkuDTO.setStock(stockPointSkuDTO.getStock() + stationStock + warehouseStock); + } + } + } + resultList = resultList.stream().filter(stockPointSkuDTO -> stockPointSkuDTO.getStock() != 0).collect(Collectors.toList()); + return resultList; + } + + @Override + public List listStockPointSku(StockPointSkuDTO stockPointSkuDTO) { + return stockPointSkuMapper.listStockPointSku(stockPointSkuDTO); + } + + @Override + public List checkStockPointContainSku(List stockPointIds, List skuIds) { + StockPointSkuDTO stockPointSkuDTO = new StockPointSkuDTO(); + stockPointSkuDTO.setStockPointIds(stockPointIds); + List stockPointSkus = stockPointSkuMapper.listStockPointSku(stockPointSkuDTO); + if (CollectionUtils.isEmpty(stockPointSkus)) { + return new ArrayList<>(); + } + // 获取库存点含有的skuId + List containSkuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + Set dbSkuIds = stockPointSkus.stream().map(StockPointSkuVO::getSkuId).collect(Collectors.toSet()); + for (Long skuId : skuIds) { + if (!dbSkuIds.contains(skuId)) { + continue; + } + containSkuIds.add(skuId); + } + return containSkuIds; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SupplierSpuUpdateLaterOperateServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SupplierSpuUpdateLaterOperateServiceImpl.java new file mode 100644 index 0000000..8109f33 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SupplierSpuUpdateLaterOperateServiceImpl.java @@ -0,0 +1,528 @@ +package com.tmerclub.cloud.product.service.impl;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.coupon.feign.CouponFeignClient; +import com.tmerclub.cloud.api.discount.feign.DiscountFeignClient; +import com.tmerclub.cloud.api.distribution.feign.DistributionFeignClient; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopSubstituteSalesFeignClient; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.cache.constant.ProductCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.product.constant.*; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.vo.SkuLangVO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuSkuAttrValueVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.product.manager.StockManager; +import com.tmerclub.cloud.product.mapper.BrandMapper; +import com.tmerclub.cloud.product.mapper.SkuMapper; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.model.Sku; +import com.tmerclub.cloud.product.model.SpuConsignmentChange; +import com.tmerclub.cloud.product.service.*; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author xxw + * @date 2022/8/5 17:50 + */ +@Service +public class SupplierSpuUpdateLaterOperateServiceImpl implements SupplierSpuUpdateLaterOperateService { + @Autowired + private SpuMapper spuMapper; + @DubboReference + private ShopSubstituteSalesFeignClient shopSubstituteSalesFeignClient; + @Autowired + private BrandMapper brandMapper; + @Autowired + private SpuOfflineService spuOfflineService; + @DubboReference + private DistributionFeignClient distributionFeignClient; + @DubboReference + private CouponFeignClient couponFeignClient; + @DubboReference + private DiscountFeignClient discountFeignClient; + @Autowired + private SpuTagReferenceService spuTagReferenceService; + @Autowired + private SkuMapper skuMapper; + @Autowired + private SkuService skuService; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @Autowired + private SpuConsignmentChangeService spuConsignmentChangeService; + @Autowired + private StockManager stockManager; + @Autowired + private StockPointSkuService stockPointSkuService; + + + @Override + public void skuUpdateLaterOperate(Long supplierSpuId) { + //获取所有代销商品信息 + List commissionSpuLists = spuMapper.getCommissionSpuList(supplierSpuId); + List commissionSpuIds = commissionSpuLists.stream().map(SpuVO::getSpuId).collect(Collectors.toList()); + //过滤掉自动设价的商品 + for (SpuVO commissionSpuList : commissionSpuLists) { + //获取商家代销设置 + ShopSubstituteSalesVO substituteSalesVO = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(commissionSpuList.getShopId()).getData(); + if (Objects.equals(substituteSalesVO.getSalesType(), SalesType.SMART_PRICE.value())) { + List list = Collections.singletonList(commissionSpuList.getSpuId()); + commissionSpuIds.removeAll(list); + } + } + //下架手动设价的商品 + if (commissionSpuIds.size() != 0) { + batchChangeSpuStatus(commissionSpuIds, SpuStatus.OFF_SHELF.value(), SysTypeEnum.MULTISHOP.value()); + } + } + + @Override + public void skuWeightOrVolumeUpdateOperate(Long supplierSpuId) { + supplierSpuUpdateLaterOffSpu(supplierSpuId, CommissionSpuOffType.SHOP_DELIVERY.value()); + } + + @Override + public void skuAddOperate(Long supplierSpuId) { + + } + + @Override + public void feePriceUnderSupplyPrice(EsProductBO esProductBO) { + //获取商家代销设置 + ShopSubstituteSalesVO substituteSalesVO = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(esProductBO.getShopId()).getData(); + if (Objects.equals(substituteSalesVO.getSalesType(), SalesType.MANUAL_OPERATION_PRICE.value())) { + if (Objects.equals(substituteSalesVO.getAutomaticOff(), 1)) { + //下架商品 + List spuIds = Collections.singletonList(esProductBO.getSpuId()); + batchChangeSpuStatus(spuIds, SpuStatus.OFF_SHELF.value(), SysTypeEnum.MULTISHOP.value()); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void batchChangeSpuStatus(List spuIds, Integer status, Integer sysType) { + if (CollUtil.isEmpty(spuIds)) { + return; + } + spuMapper.batchChangeSpuStatus(spuIds, status); + // 更新品牌信息 + List brandIds = brandMapper.listBrandIdBySpuIds(spuIds); + brandMapper.batchUpdateSpuCount(brandIds); + if (Objects.equals(status, StatusEnum.DISABLE.value()) || Objects.equals(status, StatusEnum.OFFLINE.value())) { + // 更新商品分组信息 + handleStatusChange(spuIds); + // T删掉满减、优惠券的商品关联信息 + if (!Objects.isNull(AuthUserContext.get())) { + handleSpuStatusChange(spuIds); + } else { + handleCommissionSpuStatusChange(spuIds); + } + // 下线掉关联商品的活动 (在线下活动之前已经修改了商品的状态,下面的方法就查询不到已有的商品了,所以就需要带着修改后的商品去状态去查询) + spuOfflineService.offlineCommissionSpuStatusAndActivity(1, spuIds, null, null, status, SysTypeEnum.MULTISHOP.value()); + } else if (Objects.equals(status, StatusEnum.ENABLE.value())) { + handleDistributionSpuStatusChange(spuIds, status); + } + } + + @Override + public void synMarketPrice(Long skuId, Long price) { + List commissionSkuIds = skuMapper.getSkuIdsBySupplierSkuId(skuId); + if (commissionSkuIds.size() != 0) { + List skus = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long commissionSkuId : commissionSkuIds) { + Sku sku = new Sku(); + sku.setSkuId(commissionSkuId); + sku.setMarketPriceFee(price); + skus.add(sku); + } + if (CollUtil.isNotEmpty(skus)) { + skuMapper.updateBatch(skus); + } + } + } + + @Override + public void soldOutManualPriceCommissionSpu(Long supplierSpuId, Integer type, Integer isFiltration) { + // + List commissionSpuLists = spuMapper.getCommissionSpuList(supplierSpuId); + // 手动设价商品id + List manualSpuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 智能设价商品id + List smartSpuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuVO commissionSpuList : commissionSpuLists) { + // 是否过滤商家自行发货的商品 + if (isFiltration != -1) { + if (Objects.equals(commissionSpuList.getSupplierDeliveryType(), SupplierDeliveryType.SHOP_DELIVERY.value())) { + continue; + } + } + ShopSubstituteSalesVO data = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(commissionSpuList.getShopId()).getData(); + if (Objects.equals(data.getSalesType(), SalesType.MANUAL_OPERATION_PRICE.value())) { + manualSpuIds.add(commissionSpuList.getSpuId()); + } else { + smartSpuIds.add(commissionSpuList.getSpuId()); + } + } + + // 根据下架类型下架不同的代销商品 + if (Objects.equals(type, SalesType.SMART_PRICE.value())) { + // 下架智能设价 + if (smartSpuIds.size() != 0) { + // 下架商品 + batchChangeSpuStatus(smartSpuIds, SpuStatus.OFF_SHELF.value(), SysTypeEnum.MULTISHOP.value()); + } + } + + if (Objects.equals(type, SalesType.MANUAL_OPERATION_PRICE.value())) { + // 下架手动设价 + if (manualSpuIds.size() != 0) { + // 下架商品 + batchChangeSpuStatus(manualSpuIds, SpuStatus.OFF_SHELF.value(), SysTypeEnum.MULTISHOP.value()); + } + } + + + } + + @Override + public void supplierSkuAddOrDeleteLaterOperate(Long supplierSpuId, Long skuId) { + SpuVO supplierSpu = spuMapper.getBySpuId(supplierSpuId); + if (Objects.equals(supplierSpu.getSupplierSpuType(), SupplierSpuType.YES.value())) { + SkuVO supplierSkuVO = skuMapper.getSkuBySkuId(skuId); + //供应商sku信息 + List skuVOList = skuMapper.listSkuWithAttrBySpuId(supplierSpuId); + Map> supplierSkuAttrValueVO = skuVOList.stream().collect(Collectors.toMap(SkuVO::getSkuId, SkuVO::getSpuSkuAttrValues)); + // 获取sku总库存 + SkuStockVO skuStock = stockManager.getSkuTotalStock(skuId); + supplierSkuVO.setSpuSkuAttrValues(supplierSkuAttrValueVO.get(skuId)); + if (supplierSkuVO.getSkuLangList().size() != 0) { + List skuLangList = supplierSkuVO.getSkuLangList(); + Map stringMap = skuLangList.stream().collect(Collectors.toMap(SkuLangVO::getLang, SkuLangVO::getSkuName)); + supplierSkuVO.setSkuName(stringMap.get(I18nMessage.getLang())); + } + supplierSkuVO.setStock(skuStock.getStock()); + //供应商skuID对应的售价 + Map supplierSkuIdPriceFee = skuVOList.stream().collect(Collectors.toMap(SkuVO::getSkuId, SkuVO::getPriceFee)); + //供应商skuID对应的市场价 + Map supplierSkuIdMarketPriceFee = skuVOList.stream().collect(Collectors.toMap(SkuVO::getSkuId, SkuVO::getMarketPriceFee)); + //代销商品信息 + List commissionSpuIdList = spuMapper.getCommissionSpuList(supplierSpuId); + // sku变化时,需要更新是商品id + Set spuIds = new HashSet<>(); + for (SpuVO spuVO : commissionSpuIdList) { + spuIds.add(spuVO.getSpuId()); + //获取商家代销设置 + ShopSubstituteSalesVO salesVO = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(spuVO.getShopId()).getData(); + //获取代销商品sku信息 + List commissionSkuVOList = this.listSkuWithAttrBySpuId(spuVO.getSpuId()); + List commissionSkuNames = commissionSkuVOList.stream().map(SkuVO::getSkuName).toList(); + Map commissionSkuNameMap = commissionSkuVOList.stream().collect(Collectors.toMap(SkuVO::getSkuName, SkuVO::getSkuId)); + boolean contains = commissionSkuNames.contains(supplierSkuVO.getSkuName()); + //智能设价计算售价 + long price = 0L; + if (!Objects.isNull(salesVO)) { + if (Objects.equals(salesVO.getSalesPriceType(), SalesPriceType.PROPORTION_PRICE.value())) { + //按比例加价 + price = PriceUtil.divideByBankerRounding(supplierSkuVO.getPriceFee() * salesVO.getSalesPrice(), 10000) + supplierSkuVO.getPriceFee(); + } + if (Objects.equals(salesVO.getSalesPriceType(), SalesPriceType.FIXED_NUMBER_PRICE.value())) { + //按固定数值加价 + price = supplierSkuVO.getPriceFee() + salesVO.getSalesPrice(); + } + } + if (contains) { + //存在,说明供应商新增的sku是之前删除的sku,同步改变代销商品中的供应商SkuId值和售价 + Sku sku = new Sku(); + sku.setSkuId(commissionSkuNameMap.get(supplierSkuVO.getSkuName())); + sku.setSupplierSkuId(supplierSkuVO.getSkuId()); + //售价 + if (!Objects.isNull(salesVO)) { + if (salesVO.getSalesType() == 0) { + sku.setPriceFee(price); + } + if (salesVO.getSalesType() == 1) { + sku.setPriceFee(supplierSkuIdPriceFee.get(supplierSkuVO.getSkuId())); + } + } + //市场价 + sku.setMarketPriceFee(supplierSkuIdMarketPriceFee.get(supplierSkuVO.getSkuId())); + skuMapper.update(sku); + continue; + } + //不存在说明供应商sku属于新增的,同步新增 + if (salesVO.getSalesType() == 0) { + supplierSkuVO.setPriceFee(price); + } + SkuDTO skuDTO = BeanUtil.map(supplierSkuVO, SkuDTO.class); + skuDTO.setSupplierSkuId(skuDTO.getSkuId()); + skuDTO.setSpuId(null); + skuDTO.setStock(supplierSkuVO.getStock()); + List skuDTOList = Collections.singletonList(skuDTO); + skuService.commissionSave(spuVO, skuDTOList, SysTypeEnum.MULTISHOP.value()); + } + if(CollUtil.isNotEmpty(spuIds)) { + // sku变化时通知商品更新 + spuMapper.updateSpuUpdateTime(spuIds.stream().toList(), null, null, null); + } + } + } + + @Override + public void changeSynUpdate(Long supplierSpuId) { + List commissionSpuIdList = spuMapper.getCommissionSpuIdList(supplierSpuId, null); + Object delete = RedisUtil.get(ProductCacheNames.SKU_STATUS_DELETE + supplierSpuId); + Object insert = RedisUtil.get(ProductCacheNames.SKU_STATUS_INSERT + supplierSpuId); + //改变 供应商商品更新后代销商品是否已同步更新 + if (commissionSpuIdList.size() != 0) { + if (Objects.nonNull(delete)) { + spuMapper.batchChangeSynUpdate(commissionSpuIdList, IsSynUpdate.YEW_CHANGE.value()); + } + for (Long aLong : commissionSpuIdList) { + SpuVO spuVO = spuMapper.getBySpuId(aLong); + //获取商家代销设置 + ShopSubstituteSalesVO salesVO = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(spuVO.getShopId()).getData(); + if (!Objects.isNull(salesVO)) { + if (Objects.equals(salesVO.getSalesType(), 0) && !Objects.isNull(insert)) { + //智能设价时,供应商新增SKU时,编辑商品没有提示信息 + spuMapper.batchChangeSynUpdate(commissionSpuIdList, IsSynUpdate.YEW_CHANGE.value()); + } + + } + } + RedisUtil.del(ProductCacheNames.SKU_STATUS_INSERT + supplierSpuId); + } + } + + @Override + public List disposeSpuMsg(List spuAdminList, Map> supplierSpuMap) { + if (spuAdminList.size() == 0) { + return spuAdminList; + } + ShopSubstituteSalesVO salesVO = null; + if (Objects.nonNull(spuAdminList.get(0).getShopId())) { + salesVO = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(spuAdminList.get(0).getShopId()).getData(); + } + List spuIdList = spuAdminList.stream().map(SpuAdminVO::getSpuId).collect(Collectors.toList()); + //批量获取代销商品基本信息是否改变 + List spuConsignmentChanges = spuConsignmentChangeService.batchGetBySpuIdList(spuIdList); + Map> spuConsignmentChangeMap = new HashMap<>(16); + if (spuConsignmentChanges.size() != 0) { + spuConsignmentChangeMap = spuConsignmentChanges.stream().collect(Collectors.groupingBy(SpuConsignmentChange::getSpuId)); + } + for (SpuAdminVO spuAdminVO : spuAdminList) { + if (Objects.isNull(spuAdminVO.getSupplierSpuId())) { + continue; + } + //返回代销设置类型 + if (Objects.nonNull(salesVO)) { + spuAdminVO.setSalesType(salesVO.getSalesType()); + } + //判断代销商品是否选择了店铺分类 + if (Objects.nonNull(spuAdminVO.getShopCategoryId()) && spuAdminVO.getShopCategoryId() == -1) { + spuAdminVO.setIsSynUpdate(IsSynUpdate.NO_CHANGE.value()); + } + //获取代销商品基本信息是否改变 + List consignmentChanges = spuConsignmentChangeMap.get(spuAdminVO.getSpuId()); + if (Objects.isNull(consignmentChanges)) { + continue; + } + SpuConsignmentChange spuConsignmentChange = consignmentChanges.get(0); + if(!supplierSpuMap.containsKey(spuAdminVO.getSupplierSpuId())){ + continue; + } + //获取供应商信息 + SpuVO supplierSpu = supplierSpuMap.get(spuAdminVO.getSupplierSpuId()).get(0); + List supplierSpuIds = Collections.singletonList(spuAdminVO.getSupplierSpuId()); + List data = searchSpuFeignClient.listNotDeleteSpu(supplierSpuIds).getData(); + //没有数据说明供应商品已删除, + if (data.size() == 0) { + continue; + } + + if (Objects.equals(spuAdminVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + //名称 + if (Objects.equals(spuConsignmentChange.getNameChange(), 0)) { + spuAdminVO.setSpuName(supplierSpu.getName()); + } + //图片 + if (Objects.equals(spuConsignmentChange.getImageChange(), 0)) { + spuAdminVO.setMainImgUrl(data.get(0).getMainImgUrl()); + } + //spuCod + if (Objects.equals(spuConsignmentChange.getSpuCodeChange(), 0)) { + spuAdminVO.setSpuCode(supplierSpu.getSpuCode()); + } + //品牌 + if (Objects.equals(spuConsignmentChange.getBrandChange(), 0)) { + if (!Objects.isNull(supplierSpu.getBrand())) { + spuAdminVO.setBrandName(supplierSpu.getBrand().getName()); + } + } + } + + } + return spuAdminList; + } + + @Override + public List usDisposeSpuMsg(List spuSearchVOList, Map> spuConsignmentChangeMap, Map> supplierSpuMap) { + for (SpuSearchVO spuSearchVO : spuSearchVOList) { + if (Objects.isNull(spuSearchVO.getSupplierSpuId())) { + continue; + } + //获取代销商品基本信息是否改变 + if (Objects.isNull(spuConsignmentChangeMap.get(spuSearchVO.getSpuId()))) { + continue; + } + SpuConsignmentChange spuConsignmentChange = spuConsignmentChangeMap.get(spuSearchVO.getSpuId()).get(0); + if (Objects.isNull(spuConsignmentChange)) { + continue; + } + //获取供应商信息 + SpuVO supplierSpu = supplierSpuMap.get(spuSearchVO.getSupplierSpuId()).get(0); + List supplierSpuIds = Collections.singletonList(spuSearchVO.getSupplierSpuId()); + List data = searchSpuFeignClient.listNotDeleteSpu(supplierSpuIds).getData(); + + if (Objects.equals(spuSearchVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + //名称 + if (Objects.equals(spuConsignmentChange.getNameChange(), 0)) { + if (Objects.isNull(supplierSpu.getName())) { + supplierSpu.setName(""); + } + spuSearchVO.setSpuName(supplierSpu.getName()); + } + //图片 + if (Objects.equals(spuConsignmentChange.getImageChange(), 0)) { + if (Objects.nonNull(data) && data.size() != 0 && Objects.nonNull(data.get(0).getMainImgUrl())) { + spuSearchVO.setMainImgUrl(data.get(0).getMainImgUrl()); + } + } + //spuCod + if (Objects.equals(spuConsignmentChange.getSpuCodeChange(), 0)) { + spuSearchVO.setSpuCode(supplierSpu.getSpuCode()); + } + //品牌 + if (Objects.equals(spuConsignmentChange.getBrandChange(), 0)) { + if (!Objects.isNull(supplierSpu.getBrand())) { + spuSearchVO.setBrandName(supplierSpu.getBrand().getName()); + } + } + } + } + return spuSearchVOList; + } + + @Override + public void supplierSpuUpdateLaterOffSpu(Long supplierSpuId, Integer commissionSpuOffType) { + if (Objects.equals(commissionSpuOffType, CommissionSpuOffType.ALL.value())) { + List commissionSpuIds = spuMapper.getSupIdListBySupplierId(supplierSpuId); + //下架 + batchChangeSpuStatus(commissionSpuIds, SpuStatus.OFF_SHELF.value(), SysTypeEnum.MULTISHOP.value()); + } + + if (Objects.equals(commissionSpuOffType, CommissionSpuOffType.SUPPLIER_DELIVERY_SPU.value())) { + List commissionSpuIds = spuMapper.getCommissionSpuIdList(supplierSpuId, SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + //下架 + batchChangeSpuStatus(commissionSpuIds, SpuStatus.OFF_SHELF.value(), SysTypeEnum.MULTISHOP.value()); + } + + if (Objects.equals(commissionSpuOffType, CommissionSpuOffType.SHOP_DELIVERY.value())) { + List commissionSpuIds = spuMapper.getCommissionSpuIdList(supplierSpuId, SupplierDeliveryType.SHOP_DELIVERY.value()); + //下架 + batchChangeSpuStatus(commissionSpuIds, SpuStatus.OFF_SHELF.value(), SysTypeEnum.MULTISHOP.value()); + } + } + + private void handleStatusChange(List spuIds) { + // 删除商品的分组信息 + spuTagReferenceService.deleteSpuData(spuIds); + } + + private void handleSpuStatusChange(List spuIds) { + List shopIds; + if (Objects.equals(AuthUserContext.get().getTenantId(), Constant.PLATFORM_SHOP_ID)) { + shopIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + } else { + shopIds = spuMapper.spuShopIdsBySpuIds(spuIds); + } + handleSpuOffline(spuIds, shopIds); + } + + private void handleSpuOffline(List spuIds, List shopIds) { + if (CollUtil.isNotEmpty(spuIds)) { + ServerResponseEntity discountResponseEntity = discountFeignClient.handleSpuOffline(spuIds, shopIds); + if (!discountResponseEntity.isSuccess()) { + throw new LuckException(discountResponseEntity.getMsg()); + } + ServerResponseEntity couponResponseEntity = couponFeignClient.handleSpuOffline(spuIds, shopIds); + if (!couponResponseEntity.isSuccess()) { + throw new LuckException(couponResponseEntity.getMsg()); + } + } + } + + private void handleCommissionSpuStatusChange(List spuIds) { + List shopIds = spuMapper.spuShopIdsBySpuIds(spuIds); + handleSpuOffline(spuIds, shopIds); + } + + private void handleDistributionSpuStatusChange(List spuIds, Integer status) { + List shopIds; + if (Objects.equals(AuthUserContext.get().getTenantId(), Constant.PLATFORM_SHOP_ID)) { + shopIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + } else { + shopIds = spuMapper.spuShopIdsBySpuIds(spuIds); + } + ServerResponseEntity responseEntity = distributionFeignClient.handleSpuState(spuIds, shopIds, status); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + } + + public List listSkuWithAttrBySpuId(Long spuId) { + List skuVOList = skuMapper.listSkuWithAttrBySpuId(spuId); + for (SkuVO skuVO : skuVOList) { + if (skuVO.getSkuLangList().size() != 0) { + skuVO.setSkuName(skuVO.getSkuLangList().get(0).getSkuName()); + } + if (StrUtil.isNotBlank(skuVO.getImgUrl())) { + skuVO.setMainImgUrl(skuVO.getImgUrl()); + } + } + return skuVOList; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/WarehouseAreaServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/WarehouseAreaServiceImpl.java new file mode 100644 index 0000000..0306727 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/WarehouseAreaServiceImpl.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.dto.WarehouseAreaDTO; +import com.tmerclub.cloud.product.mapper.WarehouseAreaMapper; +import com.tmerclub.cloud.product.model.WarehouseArea; +import com.tmerclub.cloud.product.service.WarehouseAreaService; +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.List; + +/** + * 仓库项和供货城市关联信息 + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +@Service +public class WarehouseAreaServiceImpl implements WarehouseAreaService { + + @Autowired + private WarehouseAreaMapper warehouseAreaMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> warehouseAreaMapper.list()); + } + + @Override + public WarehouseArea getByWarehouseAreaId(Long warehouseAreaId) { + return warehouseAreaMapper.getByWarehouseAreaId(warehouseAreaId); + } + + @Override + public void save(WarehouseArea warehouseArea) { + warehouseAreaMapper.save(warehouseArea); + } + + @Override + public void update(WarehouseArea warehouseArea) { + warehouseAreaMapper.update(warehouseArea); + } + + @Override + public void deleteById(Long warehouseAreaId) { + warehouseAreaMapper.deleteById(warehouseAreaId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void batchSave(List warehouseAreaDTOList) { + if (CollectionUtils.isEmpty(warehouseAreaDTOList)) { + return; + } + warehouseAreaMapper.batchSave(warehouseAreaDTOList); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByWarehouseId(Long warehouseId) { + warehouseAreaMapper.deleteByWarehouseId(warehouseId); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/util/StockUtil.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/util/StockUtil.java new file mode 100644 index 0000000..b462448 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/util/StockUtil.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.util; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.product.manager.StockManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Objects; + +/** + * 库存工具类 + * @author YXF + * @date 2021/05/19 + */ +public class StockUtil { + + private static final Logger LOG = LoggerFactory.getLogger(StockUtil.class); + + + public static final int SKU_STOCK_INDEX = 0; + public static final int SKU_LOCK_STOCK_INDEX = 1; + public static final int SKU_SALE_INDEX = 2; + public static final int ADD = 1; + public static final int SUBTRACT = 0; + + + /** + *=========================== 拼接key =================================== + */ + public static String getSkuStockLogKey(StockBillLogItemDTO stockBillLogItem) { + return getSkuStockLogKey(stockBillLogItem.getOrderId(), stockBillLogItem.getSkuId()); + } + + public static String getSkuStockLogKey(Long orderId, Long skuId) { + return CacheNames.ORDER_SKU_LOCK + + orderId + + Constant.UNDERLINE + + StockManager.WAREHOUSE_ID + + Constant.UNDERLINE + skuId; + } + public static String getSkuStockKey(Long skuId, Long stockPointId, Integer stockPointType) { + return CacheNames.SKU_SOCK + stockPointId + Constant.UNDERLINE + stockPointType + + Constant.UNDERLINE + skuId; + } + + public static SkuStockVO getSkuStockVO(String skuKey, String value) { + // 切割出skuId + Long skuId = Long.parseLong(skuKey.split(Constant.UNDERLINE)[0]); + Long stockPointId = skuKey.split(Constant.UNDERLINE).length == 1 ? 0L : Long.parseLong(skuKey.split(Constant.UNDERLINE)[1]); + return getSkuStockVO(skuId, stockPointId, value); + } + + public static SkuStockVO getSkuStockVO(Long skuId, String value) { + return getSkuStockVO(skuId, Constant.ZERO_LONG, value); + } + + private static SkuStockVO getSkuStockVO(Long skuId, Long stockPointId, String value) { + // sku字符串分割为数组 + if (StrUtil.isBlank(value)) { + LOG.error("sku字符串分割为数组异常,skuId:{},stockPointId:{},value:{}", skuId, stockPointId, value); + SkuStockVO skuStockVO = new SkuStockVO(skuId, 0); + skuStockVO.setStockPointId(stockPointId); + skuStockVO.setStatus(StatusEnum.DELETE.value()); + return skuStockVO; + } + String[] skuArray = value.split(Constant.UNDERLINE); + // 封装sku对象 + SkuStockVO skuStock = new SkuStockVO(skuId); + skuStock.setStockPointId(stockPointId); + for (int i = 0; i < skuArray.length; i++) { + Integer num = 0; + if (StrUtil.isNotBlank(skuArray[i]) && !StrUtil.equals(skuArray[i], "null")) { + num = Integer.parseInt(skuArray[i]); + } + switch (i) { + case 0 -> skuStock.setStock(num); + case 1 -> skuStock.setLockStock(num); + case 2 -> skuStock.setSale(num); + case 3 -> skuStock.setStatus(num); + default -> {} + } + } + return skuStock; + } + + public static String[] loadQueryArray(Object... objects) { + int length = objects.length; + String[] queryArray = new String[length]; + for (int i = 0; i < length; i++) { + Object object = objects[i]; + // 默认是0 + if (Objects.isNull(object)) { + queryArray[i] = "0"; + continue; + } + queryArray[i] = objects[i].toString(); + } + return queryArray; + } + + public static String skuPointKey(Long skuId, Long stockPointId) { + if (Objects.isNull(stockPointId) || stockPointId == 0) { + return String.valueOf(skuId); + } + return skuId + Constant.UNDERLINE + stockPointId; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryPlatformExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryPlatformExcelVO.java new file mode 100644 index 0000000..3ee8c5a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryPlatformExcelVO.java @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.tmerclub.cloud.common.product.vo.CategoryLangVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author TRACK + */ +public class CategoryPlatformExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "平台分类信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty({"平台分类信息", "分类中文名称"}) + private String nameZh; + + @ExcelProperty({"平台分类信息", "分类层级"}) + private String grade; + + @ExcelProperty({"平台分类信息", "父级分类(格式:一级分类/二级分类,中文名称)"}) + private String parentName; + + @ExcelProperty({"平台分类信息", "平台扣率"}) + private Double platformRate; + + @ExcelProperty({"平台分类信息", "分类状态"}) + private String categoryStatus; + + @ExcelProperty({"平台分类信息", "排序"}) + private Integer seq; + + @ExcelIgnore + private Long categoryId; + + @ExcelIgnore + private Long parentId; + + @ExcelIgnore + private List categoryLangList; + + @ExcelIgnore + private Integer level; + + @ExcelIgnore + private Integer status; + + public String getNameZh() { + return nameZh; + } + + public void setNameZh(String nameZh) { + this.nameZh = nameZh; + } + + + public String getGrade() { + return grade; + } + + public void setGrade(String grade) { + this.grade = grade; + } + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public Double getPlatformRate() { + return platformRate; + } + + public void setPlatformRate(Double platformRate) { + this.platformRate = platformRate; + } + + public String getCategoryStatus() { + return categoryStatus; + } + + public void setCategoryStatus(String categoryStatus) { + this.categoryStatus = categoryStatus; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public List getCategoryLangList() { + return categoryLangList; + } + + public void setCategoryLangList(List categoryLangList) { + this.categoryLangList = categoryLangList; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "CategoryPlatformExcelVO{" + + "nameZh='" + nameZh + '\'' + + ", grade='" + grade + '\'' + + ", parentName='" + parentName + '\'' + + ", platformRate=" + platformRate + + ", categoryStatus=" + categoryStatus + + ", seq=" + seq + + ", categoryId=" + categoryId + + ", parentId=" + parentId + + ", categoryLangList=" + categoryLangList + + ", level=" + level + + ", status=" + status + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/PlatformSpuExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/PlatformSpuExcelVO.java new file mode 100644 index 0000000..af4a85d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/PlatformSpuExcelVO.java @@ -0,0 +1,518 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.tmerclub.cloud.common.model.ExcelModel; +import com.tmerclub.cloud.common.product.vo.BrandLangVO; +import com.tmerclub.cloud.common.product.vo.SpuLangVO; +import com.tmerclub.cloud.common.product.vo.SpuSkuAttrValueVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * spu信息VO + * + * @author FrozenWatermelon + */ +public class PlatformSpuExcelVO extends ExcelModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "平台商品信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}; + + @ExcelProperty(value = {"商品信息", "编号*"}, index = 0) + private String seq; + + @ExcelProperty(value = {"商品信息", "店铺名称"}, index = 1) + private String shopName; + + @ExcelProperty(value = {"商品信息", "商品中文名称"}, index = 2) + private String nameZh; + + + @ExcelIgnore + private Integer spuType; + + @ExcelProperty(value = {"商品信息", "商品类型"}, index = 3) + private String spuTypeName; + + @ExcelProperty(value = {"商品信息", "商品类别"}, index = 4) + private String spuMold; + + @ExcelProperty(value = {"商品信息", "平台分类"}, index = 5) + private String categoryName; + + @ExcelProperty(value = {"商品信息", "店铺分类"}, index = 6) + private String shopCategoryName; + + @ExcelProperty(value = {"商品信息", "商品中文卖点"}, index = 7) + private String sellingPointZh; + + @ExcelProperty(value = {"商品信息", "品牌"}, index = 8) + private String brandName; + + @ExcelProperty(value = {"商品信息", "配送方式"}, index = 9) + private String deliveryMode; + + @ExcelProperty(value = {"商品信息", "运费模板"}, index = 10) + private String deliveryTemplate; + + @ExcelProperty(value = {"商品信息", "状态"}, index = 11) + private String status; + + @ExcelProperty(value = {"商品信息", "核销次数"}, index = 12) + private String writeOffNum; + + @ExcelProperty(value = {"商品信息", "多次核销次数"}, index = 13) + private String writeOffMultipleCount; + + @ExcelProperty(value = {"商品信息", "核销有效期"}, index = 14) + private String writeOffTime; + + @ExcelProperty(value = {"商品信息", "核销开始时间"}, index = 15) + private Date writeOffStart; + + @ExcelProperty(value = {"商品信息", "核销结束时间"}, index = 16) + private Date writeOffEnd; + + @ExcelProperty(value = {"商品信息", "是否可以退款"}, index = 17) + private String isRefund; + + @ExcelProperty(value = {"商品信息", "虚拟商品留言"}, index = 18) + private String virtualRemark; + + @ExcelProperty(value = {"商品信息", "是否置顶"}, index = 19) + private String isTop; + + @ExcelProperty(value = {"商品信息", "注水销量"}, index = 20) + private Integer waterSoldNum; + + @ExcelProperty({"商品sku信息", "中文sku名称"}) + private String skuNameZh; + + @ExcelProperty({"商品sku信息", "中文销售属规格"}) + private String propertiesZh; + + @ExcelProperty({"商品sku信息", "售价"}) + private String priceFee; + + @ExcelProperty({"商品sku信息", "市场价"}) + private String marketPriceFee; + + @ExcelProperty({"商品sku信息", "库存"}) + private Integer stock; + + @ExcelProperty({"商品sku信息", "商品sku编码"}) + private String partyCode; + + @ExcelProperty({"商品sku信息", "商品重量"}) + private Double weight; + + @ExcelProperty({"商品sku信息", "商品体积"}) + private Double volume; + + /** + * 商品id + */ + @ExcelIgnore + private Long spuId; + + /** + * 物流模板id + */ + @ExcelIgnore + private Long deliveryTemplateId; + + @ExcelIgnore + private List spuSkuAttrValueList; + + @ExcelIgnore + private List brandLangList; + + @ExcelIgnore + private List spuLangList; + + @ExcelIgnore + private Long categoryId; + + @ExcelIgnore + private Long shopCategoryId; + + @ExcelIgnore + @Schema(description = "供应商商品类型 0.否 1.是 2.商家代销") + private Integer supplierSpuType; + + public String getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(String writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public String getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(String writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public String getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(String writeOffTime) { + this.writeOffTime = writeOffTime; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public String getIsRefund() { + return isRefund; + } + + public void setIsRefund(String isRefund) { + this.isRefund = isRefund; + } + + public String getVirtualRemark() { + return virtualRemark; + } + + public void setVirtualRemark(String virtualRemark) { + this.virtualRemark = virtualRemark; + } + + public String getSpuMold() { + return spuMold; + } + + public void setSpuMold(String spuMold) { + this.spuMold = spuMold; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public String getSpuTypeName() { + return spuTypeName; + } + + public void setSpuTypeName(String spuTypeName) { + this.spuTypeName = spuTypeName; + } + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getNameZh() { + return nameZh; + } + + public void setNameZh(String nameZh) { + this.nameZh = nameZh; + } + + + public String getSellingPointZh() { + return sellingPointZh; + } + + public void setSellingPointZh(String sellingPointZh) { + this.sellingPointZh = sellingPointZh; + } + + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getShopCategoryName() { + return shopCategoryName; + } + + public void setShopCategoryName(String shopCategoryName) { + this.shopCategoryName = shopCategoryName; + } + + public String getDeliveryMode() { + return deliveryMode; + } + + public void setDeliveryMode(String deliveryMode) { + this.deliveryMode = deliveryMode; + } + + public String getDeliveryTemplate() { + return deliveryTemplate; + } + + public void setDeliveryTemplate(String deliveryTemplate) { + this.deliveryTemplate = deliveryTemplate; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSkuNameZh() { + return skuNameZh; + } + + public void setSkuNameZh(String skuNameZh) { + this.skuNameZh = skuNameZh; + } + + + public String getPropertiesZh() { + return propertiesZh; + } + + public void setPropertiesZh(String propertiesZh) { + this.propertiesZh = propertiesZh; + } + + public String getPriceFee() { + return priceFee; + } + + public void setPriceFee(String priceFee) { + this.priceFee = priceFee; + } + + public String getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(String marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Double getWeight() { + return weight; + } + + public void setWeight(Double weight) { + this.weight = weight; + } + + public Double getVolume() { + return volume; + } + + public void setVolume(Double volume) { + this.volume = volume; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getDeliveryTemplateId() { + return deliveryTemplateId; + } + + public void setDeliveryTemplateId(Long deliveryTemplateId) { + this.deliveryTemplateId = deliveryTemplateId; + } + + public List getSpuSkuAttrValueList() { + return spuSkuAttrValueList; + } + + public void setSpuSkuAttrValueList(List spuSkuAttrValueList) { + this.spuSkuAttrValueList = spuSkuAttrValueList; + } + + public List getBrandLangList() { + return brandLangList; + } + + public void setBrandLangList(List brandLangList) { + this.brandLangList = brandLangList; + } + + public List getSpuLangList() { + return spuLangList; + } + + public void setSpuLangList(List spuLangList) { + this.spuLangList = spuLangList; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopCategoryId() { + return shopCategoryId; + } + + public void setShopCategoryId(Long shopCategoryId) { + this.shopCategoryId = shopCategoryId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getIsTop() { + return isTop; + } + + public void setIsTop(String isTop) { + this.isTop = isTop; + } + + public Integer getWaterSoldNum() { + return waterSoldNum; + } + + public void setWaterSoldNum(Integer waterSoldNum) { + this.waterSoldNum = waterSoldNum; + } + + @Override + public String toString() { + return "PlatformSpuExcelVO{" + + "seq='" + seq + '\'' + + ", shopName='" + shopName + '\'' + + ", nameZh='" + nameZh + '\'' + + ", spuType=" + spuType + + ", spuTypeName='" + spuTypeName + '\'' + + ", spuMold='" + spuMold + '\'' + + ", categoryName='" + categoryName + '\'' + + ", shopCategoryName='" + shopCategoryName + '\'' + + ", sellingPointZh='" + sellingPointZh + '\'' + + ", brandName='" + brandName + '\'' + + ", deliveryMode='" + deliveryMode + '\'' + + ", deliveryTemplate='" + deliveryTemplate + '\'' + + ", status='" + status + '\'' + + ", writeOffNum='" + writeOffNum + '\'' + + ", writeOffMultipleCount='" + writeOffMultipleCount + '\'' + + ", writeOffTime='" + writeOffTime + '\'' + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", isRefund='" + isRefund + '\'' + + ", virtualRemark='" + virtualRemark + '\'' + + ", isTop='" + isTop + '\'' + + ", waterSoldNum=" + waterSoldNum + + ", skuNameZh='" + skuNameZh + '\'' + + ", propertiesZh='" + propertiesZh + '\'' + + ", priceFee='" + priceFee + '\'' + + ", marketPriceFee='" + marketPriceFee + '\'' + + ", stock=" + stock + + ", partyCode='" + partyCode + '\'' + + ", weight=" + weight + + ", volume=" + volume + + ", spuId=" + spuId + + ", deliveryTemplateId=" + deliveryTemplateId + + ", spuSkuAttrValueList=" + spuSkuAttrValueList + + ", brandLangList=" + brandLangList + + ", spuLangList=" + spuLangList + + ", categoryId=" + categoryId + + ", shopCategoryId=" + shopCategoryId + + ", supplierSpuType=" + supplierSpuType + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/ShopCartAmountVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/ShopCartAmountVO.java new file mode 100644 index 0000000..b406dd9 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/ShopCartAmountVO.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + */ +@Schema(description = "购物车合计") +public class ShopCartAmountVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "总额") + private Long totalMoney; + + @Schema(description = "总计") + private Long finalMoney; + + @Schema(description = "减额") + private Long subtractMoney; + + @Schema(description = "商品数量") + private Integer count; + + public Long getTotalMoney() { + return totalMoney; + } + + public void setTotalMoney(Long totalMoney) { + this.totalMoney = totalMoney; + } + + public Long getFinalMoney() { + return finalMoney; + } + + public void setFinalMoney(Long finalMoney) { + this.finalMoney = finalMoney; + } + + public Long getSubtractMoney() { + return subtractMoney; + } + + public void setSubtractMoney(Long subtractMoney) { + this.subtractMoney = subtractMoney; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "ShopCartAmountVO{" + + "totalMoney=" + totalMoney + + ", finalMoney=" + finalMoney + + ", subtractMoney=" + subtractMoney + + ", count=" + count + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SkuStockZoneVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SkuStockZoneVO.java new file mode 100644 index 0000000..2a9e011 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SkuStockZoneVO.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * VO + * + * @author FrozenWatermelon + * @date 2022-08-17 09:12:37 + */ +public class SkuStockZoneVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分片id") + private Long zoneId; + + @Schema(description = "SKU ID") + private Long skuId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "分片序号") + private Integer zoneNo; + + @Schema(description = "库存") + private Integer stock; + + public Long getZoneId() { + return zoneId; + } + + public void setZoneId(Long zoneId) { + this.zoneId = zoneId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getZoneNo() { + return zoneNo; + } + + public void setZoneNo(Integer zoneNo) { + this.zoneNo = zoneNo; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + @Override + public String toString() { + return "SkuStockZoneVO{" + + "zoneId=" + zoneId + + ", skuId=" + skuId + + ", spuId=" + spuId + + ", zoneNo=" + zoneNo + + ", stock=" + stock + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCollectionVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCollectionVO.java new file mode 100644 index 0000000..a54744c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCollectionVO.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品收藏信息VO + * + * @author FrozenWatermelon + * @date 2020-11-21 14:43:16 + */ +public class SpuCollectionVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "收藏表") + private Long id; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "用户id") + private Long userId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "SpuCollectionVO{" + + "id=" + id + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",spuId=" + spuId + + ",userId=" + userId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuConsignmentChangeVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuConsignmentChangeVO.java new file mode 100644 index 0000000..ebe5b9b --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuConsignmentChangeVO.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家代销商品基本信息相对于供应商品是否改变VO + * + * @author FrozenWatermelon + * @date 2022-08-11 22:21:10 + */ +public class SpuConsignmentChangeVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "代销商品基本信息是否已更新表id") + private Integer consignmentChangeId; + + @Schema(description = "代销商品id") + private Integer spuId; + + @Schema(description = "代销商品名称是否已更改 0未更改,1已更改") + private Integer nameChange; + + @Schema(description = "代销图片是否已更改 0未更改,1已更改") + private Integer imageChange; + + @Schema(description = "代销商品卖点是否已更改, 0未更改,1已更改") + private Integer sellingPointChange; + + @Schema(description = "代销商品视频是否已更改, 0未更改,1已更改") + private Integer videoChange; + + @Schema(description = "代销商品计量单位是否已更改,0未更改,1已更改") + private Integer measureUnitChange; + + @Schema(description = "代销商品品牌是否已更改,0未更改,1已更改") + private Integer brandChange; + + @Schema(description = "代销商品详情是否已更改,0未更改,1已更改") + private Integer detailChange; + + public Integer getConsignmentChangeId() { + return consignmentChangeId; + } + + public void setConsignmentChangeId(Integer consignmentChangeId) { + this.consignmentChangeId = consignmentChangeId; + } + + public Integer getSpuId() { + return spuId; + } + + public void setSpuId(Integer spuId) { + this.spuId = spuId; + } + + public Integer getNameChange() { + return nameChange; + } + + public void setNameChange(Integer nameChange) { + this.nameChange = nameChange; + } + + public Integer getImageChange() { + return imageChange; + } + + public void setImageChange(Integer imageChange) { + this.imageChange = imageChange; + } + + public Integer getSellingPointChange() { + return sellingPointChange; + } + + public void setSellingPointChange(Integer sellingPointChange) { + this.sellingPointChange = sellingPointChange; + } + + public Integer getVideoChange() { + return videoChange; + } + + public void setVideoChange(Integer videoChange) { + this.videoChange = videoChange; + } + + public Integer getMeasureUnitChange() { + return measureUnitChange; + } + + public void setMeasureUnitChange(Integer measureUnitChange) { + this.measureUnitChange = measureUnitChange; + } + + public Integer getBrandChange() { + return brandChange; + } + + public void setBrandChange(Integer brandChange) { + this.brandChange = brandChange; + } + + public Integer getDetailChange() { + return detailChange; + } + + public void setDetailChange(Integer detailChange) { + this.detailChange = detailChange; + } + + @Override + public String toString() { + return "SpuConsignmentChangeVO{" + + "consignmentChangeId=" + consignmentChangeId + + ",spuId=" + spuId + + ",nameChange=" + nameChange + + ",imageChange=" + imageChange + + ",sellingPointChange=" + sellingPointChange + + ",videoChange=" + videoChange + + ",measureUnitChange=" + measureUnitChange + + ",brandChange=" + brandChange + + ",detailChange=" + detailChange + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCountVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCountVO.java new file mode 100644 index 0000000..85c6c56 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCountVO.java @@ -0,0 +1,93 @@ +package com.tmerclub.cloud.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author chiley + * @date 2022/6/29 17:15 + */ +@Schema(description = "我的商品数量") +public class SpuCountVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "所有商品数量") + private Integer allCount; + + @Schema(description = "已删除商品数量") + private Integer deleted; + + @Schema(description = "正常在售商品") + private Integer available; + + @Schema(description = "待审核商品") + private Integer underReview; + + @Schema(description = "平台下架商品") + private Integer removedByPlatform; + + @Schema(description = "所有下架商品") + private Integer removed; + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Integer getDeleted() { + return deleted; + } + + public void setDeleted(Integer deleted) { + this.deleted = deleted; + } + + public Integer getAvailable() { + return available; + } + + public void setAvailable(Integer available) { + this.available = available; + } + + public Integer getUnderReview() { + return underReview; + } + + public void setUnderReview(Integer underReview) { + this.underReview = underReview; + } + + public Integer getRemovedByPlatform() { + return removedByPlatform; + } + + public void setRemovedByPlatform(Integer removedByPlatform) { + this.removedByPlatform = removedByPlatform; + } + + public Integer getRemoved() { + return removed; + } + + public void setRemoved(Integer removed) { + this.removed = removed; + } + + @Override + public String toString() { + return "SpuCountVO{" + + "allCount=" + allCount + + ", deleted=" + deleted + + ", available=" + available + + ", underReview=" + underReview + + ", removedByPlatform=" + removedByPlatform + + ", removed=" + removed + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuExcelVO.java new file mode 100644 index 0000000..9a52c12 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuExcelVO.java @@ -0,0 +1,587 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.tmerclub.cloud.common.model.ExcelModel; +import com.tmerclub.cloud.common.product.vo.BrandLangVO; +import com.tmerclub.cloud.common.product.vo.SpuDetailVO; +import com.tmerclub.cloud.common.product.vo.SpuLangVO; +import com.tmerclub.cloud.common.product.vo.SpuSkuAttrValueVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * spu信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SpuExcelVO extends ExcelModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "商品信息"; + public static final String SHEET_NAME = "商品"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}; + /** + * 需要批注的列 + */ + public static final int[] COMMENT_INDEX = {3, 4, 10}; + + public static final String[] COMMENTS = { + "1. 选填,请填写图片在图片服务器的url地址;\n" + + "2. 最多可上传9张,不同图片请以','隔开;", + "1. 选填,请填写视频在视频服务器的url地址;\n" + + "2. 只能添加一个视频连接;\n" + + "3. 视频仅支付mp4格式,最大限制50MB;", + "默认支持快递配送" + }; + + @ExcelProperty(value = {"商品信息", "编号*"}, index = 0) + private String seq; + + @ExcelProperty(value = {"商品信息", "商品中文名称*"}, index = 1) + private String nameZh; + + @ExcelProperty(value = {"商品信息", "商品spu编码"}, index = 2) + private String spuCode; + + @ExcelIgnore + private String mainImgUrl; + + @ExcelProperty(value = {"商品信息", "商品图片"}, index = 3) + private String imgs; + + @ExcelProperty(value = {"商品信息", "商品视频"}, index = 4) + private String video; + + @ExcelProperty(value = {"商品信息", "商品中文卖点"}, index = 5) + private String sellingPointZh; + + @ExcelProperty(value = {"商品信息", "商品中文详情"}, index = 6) + private String detailZh; + + @ExcelProperty(value = {"商品信息", "品牌"}, index = 7) + private String brandName; + + @ExcelProperty(value = {"商品信息", "平台分类*"}, index = 8) + private String categoryName; + + @ExcelProperty(value = {"商品信息", "店铺分类*"}, index = 9) + private String shopCategoryName; + + @ExcelProperty(value = {"商品信息", "配送方式"}, index = 10) + private String deliveryMode; + + @ExcelProperty(value = {"商品信息", "运费模板*"}, index = 11) + private String deliveryTemplate; + + @ExcelProperty(value = {"商品信息", "固定运费金额(运费模板为固定运费时必填*)"}, index = 12) + private String deliveryAmount; + + @ExcelProperty(value = {"商品信息", "状态*"}, index = 13) + private String status; + + @ExcelProperty(value = {"商品信息", "商品类别*"}, index = 14) + private String spuMold; + + @ExcelIgnore + private Integer spuType; + + @ExcelProperty(value = {"商品信息", "核销次数 (虚拟商品必填*)"}, index = 15) + private String writeOffNum; + + @ExcelProperty(value = {"商品信息", "多次核销次数 (多次核销选项,不填默认无限次)"}, index = 16) + private String writeOffMultipleCount; + + @ExcelProperty(value = {"商品信息", "核销有效期 (x.x天内有效)"}, index = 17) + private String writeOffTime; + + @ExcelProperty(value = {"商品信息", "核销开始时间(格式:2021-08-08 14:32:01,虚拟商品核销有效期是自定义则必填*)"}, index = 18) + private Date writeOffStart; + + @ExcelProperty(value = {"商品信息", "核销结束时间(格式:2021-08-08 14:32:01,虚拟商品核销有效期是自定义则必填*)"}, index = 19) + private Date writeOffEnd; + + @ExcelProperty(value = {"商品信息", "可以退款(虚拟商品必填*)"}, index = 20) + private String isRefund; + + @ExcelProperty(value = {"商品信息", "虚拟商品留言 格式是[{\"name\": \"xx\", \"isRequired\": true}]"}, index = 21) + private String virtualRemark; + + @ExcelProperty(value = {"商品sku信息", "中文sku名称"}, index = 22) + private String skuNameZh; + + + @ExcelProperty(value = {"商品sku信息", "中文销售规格"}, index = 23) + private String propertiesZh; + + + @ExcelProperty(value = {"商品sku信息", "售价"}, index = 24) + private String priceFee; + + @ExcelProperty(value = {"商品sku信息", "市场价"}, index = 25) + private String marketPriceFee; + + @ExcelProperty(value = {"商品sku信息", "库存"}, index = 26) + private Integer stock; + + @ExcelProperty(value = {"商品sku信息", "商品sku编码"}, index = 27) + private String partyCode; + + + @ExcelProperty(value = {"商品sku信息", "商品重量"}, index = 28) + private Double weight; + + @ExcelProperty(value = {"商品sku信息", "商品体积"}, index = 29) + private Double volume; + + @ExcelProperty(value = {"商品sku信息", "库存预警"}, index = 30) + private Long stockWarning; + + /** + * 商品id + */ + @ExcelIgnore + private Long spuId; + + /** + * 物流模板id + */ + @ExcelIgnore + private Long deliveryTemplateId; + + @ExcelIgnore + private List spuSkuAttrValueList; + + @ExcelIgnore + private List brandLangList; + + @ExcelIgnore + private List spuLangList; + + @ExcelIgnore + private List spuDetailList; + + @ExcelIgnore + private Long categoryId; + + @ExcelIgnore + private Long shopCategoryId; + + @ExcelIgnore + @Schema(description = "供应商商品类型 0.否 1.是 2.商家代销") + private Integer supplierSpuType; + + public String getDeliveryAmount() { + return deliveryAmount; + } + + public void setDeliveryAmount(String deliveryAmount) { + this.deliveryAmount = deliveryAmount; + } + + public String getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(String writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public String getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(String writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public String getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(String writeOffTime) { + this.writeOffTime = writeOffTime; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public Long getStockWarning() { + return stockWarning; + } + + public void setStockWarning(Long stockWarning) { + this.stockWarning = stockWarning; + } + + public String getIsRefund() { + return isRefund; + } + + public void setIsRefund(String isRefund) { + this.isRefund = isRefund; + } + + public String getVirtualRemark() { + return virtualRemark; + } + + public void setVirtualRemark(String virtualRemark) { + this.virtualRemark = virtualRemark; + } + + public String getSpuMold() { + return spuMold; + } + + public void setSpuMold(String spuMold) { + this.spuMold = spuMold; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getNameZh() { + return nameZh; + } + + public void setNameZh(String nameZh) { + this.nameZh = nameZh; + } + + + public String getSellingPointZh() { + return sellingPointZh; + } + + public void setSellingPointZh(String sellingPointZh) { + this.sellingPointZh = sellingPointZh; + } + + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getShopCategoryName() { + return shopCategoryName; + } + + public void setShopCategoryName(String shopCategoryName) { + this.shopCategoryName = shopCategoryName; + } + + public String getDeliveryMode() { + return deliveryMode; + } + + public void setDeliveryMode(String deliveryMode) { + this.deliveryMode = deliveryMode; + } + + public String getDeliveryTemplate() { + return deliveryTemplate; + } + + public void setDeliveryTemplate(String deliveryTemplate) { + this.deliveryTemplate = deliveryTemplate; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSkuNameZh() { + return skuNameZh; + } + + public void setSkuNameZh(String skuNameZh) { + this.skuNameZh = skuNameZh; + } + + + public String getPropertiesZh() { + return propertiesZh; + } + + public void setPropertiesZh(String propertiesZh) { + this.propertiesZh = propertiesZh; + } + + + public String getPriceFee() { + return priceFee; + } + + public void setPriceFee(String priceFee) { + this.priceFee = priceFee; + } + + public String getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(String marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + + public Double getWeight() { + return weight; + } + + public void setWeight(Double weight) { + this.weight = weight; + } + + public Double getVolume() { + return volume; + } + + public void setVolume(Double volume) { + this.volume = volume; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getDeliveryTemplateId() { + return deliveryTemplateId; + } + + public void setDeliveryTemplateId(Long deliveryTemplateId) { + this.deliveryTemplateId = deliveryTemplateId; + } + + + public List getSpuSkuAttrValueList() { + return spuSkuAttrValueList; + } + + public void setSpuSkuAttrValueList(List spuSkuAttrValueList) { + this.spuSkuAttrValueList = spuSkuAttrValueList; + } + + public List getBrandLangList() { + return brandLangList; + } + + public void setBrandLangList(List brandLangList) { + this.brandLangList = brandLangList; + } + + public List getSpuLangList() { + return spuLangList; + } + + public void setSpuLangList(List spuLangList) { + this.spuLangList = spuLangList; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopCategoryId() { + return shopCategoryId; + } + + public void setShopCategoryId(Long shopCategoryId) { + this.shopCategoryId = shopCategoryId; + } + + public String getImgs() { + return imgs; + } + + public void setImgs(String imgs) { + this.imgs = imgs; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getDetailZh() { + return detailZh; + } + + public void setDetailZh(String detailZh) { + this.detailZh = detailZh; + } + + public List getSpuDetailList() { + return spuDetailList; + } + + public void setSpuDetailList(List spuDetailList) { + this.spuDetailList = spuDetailList; + } + + @Override + public String toString() { + return "SpuExcelVO{" + + "seq='" + seq + '\'' + + ", nameZh='" + nameZh + '\'' + + ", spuCode='" + spuCode + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", imgs='" + imgs + '\'' + + ", video='" + video + '\'' + + ", sellingPointZh='" + sellingPointZh + '\'' + + ", detailZh='" + detailZh + '\'' + + ", brandName='" + brandName + '\'' + + ", categoryName='" + categoryName + '\'' + + ", shopCategoryName='" + shopCategoryName + '\'' + + ", deliveryMode='" + deliveryMode + '\'' + + ", deliveryTemplate='" + deliveryTemplate + '\'' + + ", status='" + status + '\'' + + ", spuMold='" + spuMold + '\'' + + ", spuType=" + spuType + + ", writeOffNum='" + writeOffNum + '\'' + + ", writeOffMultipleCount='" + writeOffMultipleCount + '\'' + + ", writeOffTime='" + writeOffTime + '\'' + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", isRefund='" + isRefund + '\'' + + ", virtualRemark='" + virtualRemark + '\'' + + ", skuNameZh='" + skuNameZh + '\'' + + ", propertiesZh='" + propertiesZh + '\'' + + ", priceFee='" + priceFee + '\'' + + ", marketPriceFee='" + marketPriceFee + '\'' + + ", stock=" + stock + + ", partyCode='" + partyCode + '\'' + + ", weight=" + weight + + ", volume=" + volume + + ", stockWarning=" + stockWarning + + ", spuId=" + spuId + + ", deliveryTemplateId=" + deliveryTemplateId + + ", spuSkuAttrValueList=" + spuSkuAttrValueList + + ", brandLangList=" + brandLangList + + ", spuLangList=" + spuLangList + + ", spuDetailList=" + spuDetailList + + ", categoryId=" + categoryId + + ", shopCategoryId=" + shopCategoryId + + ", supplierSpuType=" + supplierSpuType + + ", deliveryAmount=" + deliveryAmount + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuPriceLogVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuPriceLogVO.java new file mode 100644 index 0000000..cfb9da6 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuPriceLogVO.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品调价记录VO + * + * @author lhd + * @date 2022-06-29 17:48:25 + */ +public class SpuPriceLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品调价记录id") + private Long id; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "规格id") + private Long skuId; + + @Schema(description = "原供货价") + private Long beforePrice; + + @Schema(description = "现供货价") + private Long afterPrice; + + @Schema(description = "差价") + private Long price; + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + @Schema(description = "商品图片") + private String mainImgUrl; + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + @Schema(description = "SKU编码") + private String partyCode; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品规格") + private String skuName; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getBeforePrice() { + return beforePrice; + } + + public void setBeforePrice(Long beforePrice) { + this.beforePrice = beforePrice; + } + + public Long getAfterPrice() { + return afterPrice; + } + + public void setAfterPrice(Long afterPrice) { + this.afterPrice = afterPrice; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + @Override + public String toString() { + return "SpuPriceLogVO{" + + "id=" + id + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", beforePrice=" + beforePrice + + ", afterPrice=" + afterPrice + + ", price=" + price + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", partyCode='" + partyCode + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuTagReferenceVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuTagReferenceVO.java new file mode 100644 index 0000000..1b26096 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuTagReferenceVO.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商品分组标签关联信息VO + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +public class SpuTagReferenceVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分组引用id") + private Long referenceId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "标签id") + private Long tagId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "状态(1:正常,0:删除)") + private Integer status; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + /** + * 排序 + */ + private Integer seq; + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Long getReferenceId() { + return referenceId; + } + + public void setReferenceId(Long referenceId) { + this.referenceId = referenceId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getTagId() { + return tagId; + } + + public void setTagId(Long tagId) { + this.tagId = tagId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "SpuTagReferenceVO{" + + "referenceId=" + referenceId + + ", shopId=" + shopId + + ", tagId=" + tagId + + ", spuId=" + spuId + + ", status=" + status + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", seq=" + seq + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuTagVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuTagVO.java new file mode 100644 index 0000000..3ae2bd3 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuTagVO.java @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 商品分组表VO + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +public class SpuTagVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分组标签id") + private Long id; + + @Schema(description = "分组标题") + private String title; + + @Schema(description = "店铺Id") + private Long shopId; + + @Schema(description = "状态(1为正常,-1 为删除)") + private Integer status; + + @Schema(description = "默认类型(0:商家自定义,1:系统默认)") + private Integer isDefault; + + @Schema(description = "商品数量") + private Long prodCount; + + @Schema(description = "列表样式(0:一列一个,1:一列两个,2:一列三个)") + private Integer style; + + @Schema(description = "排序") + private Integer seq; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "修改时间") + private Date updateTime; + + @Schema(description = "删除时间") + private Date deleteTime; + + @Schema(description = "商品列表") + private List spuList; + + @Schema(description = "商品id列表") + private List spuIds; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public Long getProdCount() { + return prodCount; + } + + public void setProdCount(Long prodCount) { + this.prodCount = prodCount; + } + + public Integer getStyle() { + return style; + } + + public void setStyle(Integer style) { + this.style = style; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Date getDeleteTime() { + return deleteTime; + } + + public void setDeleteTime(Date deleteTime) { + this.deleteTime = deleteTime; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public List getSpuList() { + return spuList; + } + + public void setSpuList(List spuList) { + this.spuList = spuList; + } + + @Override + public String toString() { + return "SpuTagVO{" + + "id=" + id + + ", title='" + title + '\'' + + ", shopId=" + shopId + + ", status=" + status + + ", isDefault=" + isDefault + + ", prodCount=" + prodCount + + ", style=" + style + + ", seq=" + seq + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", deleteTime=" + deleteTime + + ", spuIds=" + spuIds + + ", spuList=" + spuList + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillInLogExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillInLogExcelVO.java new file mode 100644 index 0000000..25a515a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillInLogExcelVO.java @@ -0,0 +1,288 @@ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author gaozijie + * @date 2023-04-10 + */ +public class StockBillInLogExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "入库明细信息"; + public static final String SHEET_NAME = "入库明细"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ,12}; + + @ExcelProperty(value = {"入库明细信息", "入库单号"}, index = 0) + private String stockBillNo; + + @ExcelProperty(value = {"入库明细信息", "关联订单号"}, index = 1) + private String sourceOrderNo; + + @ExcelProperty(value = {"入库明细信息", "库存点名称"}, index = 2) + private String stockPointName; + + @ExcelProperty(value = {"入库明细信息", "库存点类型"}, index = 3) + private String stockPointType; + + @ExcelProperty(value = {"入库明细信息", "单据类型"}, index = 4) + private String stockBillTypeName; + + @ExcelProperty(value = {"入库明细信息", "入库原因"}, index = 5) + private String reason; + + @ExcelProperty(value = {"入库明细信息", "单据状态"}, index = 6) + private String statusName; + + @ExcelProperty(value = {"入库明细信息", "入库时间"}, index = 7) + private Date businessTime; + + @ExcelProperty(value = {"入库明细信息", "总出入库数量"}, index = 8) + private Integer totalCount; + + @ExcelProperty(value = {"入库明细信息", "总入库金额"}, index = 9) + private String totalAmount; + + @ExcelProperty(value = {"入库明细信息", "制单人"}, index = 10) + private String makerMobile; + + @ExcelProperty(value = {"入库明细信息", "制单时间"}, index = 11) + private Date createTime; + + @ExcelProperty(value = {"入库明细信息", "商品编码"}, index = 12) + private String partyCode; + + @ExcelProperty(value = {"入库明细信息", "商品名称"}, index = 13) + private String spuName; + + @ExcelProperty(value = {"入库明细信息", "规格"}, index = 14) + private String skuName; + + @ExcelProperty(value = {"入库明细信息", "实际出入库数量"}, index = 15) + private Integer stockCount; + + @ExcelProperty(value = {"入库明细信息", "成本单价"}, index = 16) + private String unitPrice; + + @ExcelIgnore + private Long stockBillLogId; + + @ExcelIgnore + private Integer status; + + @ExcelIgnore + private Integer stockBillType; + + @ExcelIgnore + private Long stockChangeReasonId; + + public String getStockPointName() { + return stockPointName; + } + + public void setStockPointName(String stockPointName) { + this.stockPointName = stockPointName; + } + + public String getStockPointType() { + return stockPointType; + } + + public void setStockPointType(String stockPointType) { + this.stockPointType = stockPointType; + } + + public String getStockBillNo() { + return stockBillNo; + } + + public void setStockBillNo(String stockBillNo) { + this.stockBillNo = stockBillNo; + } + + public String getSourceOrderNo() { + return sourceOrderNo; + } + + public void setSourceOrderNo(String sourceOrderNo) { + this.sourceOrderNo = sourceOrderNo; + } + + public String getStockBillTypeName() { + return stockBillTypeName; + } + + public void setStockBillTypeName(String stockBillTypeName) { + this.stockBillTypeName = stockBillTypeName; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getStatusName() { + return statusName; + } + + public void setStatusName(String statusName) { + this.statusName = statusName; + } + + public Date getBusinessTime() { + return businessTime; + } + + public void setBusinessTime(Date businessTime) { + this.businessTime = businessTime; + } + + public Integer getTotalCount() { + return totalCount; + } + + public void setTotalCount(Integer totalCount) { + this.totalCount = totalCount; + } + + public String getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(String totalAmount) { + this.totalAmount = totalAmount; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Integer getStockCount() { + return stockCount; + } + + public void setStockCount(Integer stockCount) { + this.stockCount = stockCount; + } + + public String getUnitPrice() { + return unitPrice; + } + + public void setUnitPrice(String unitPrice) { + this.unitPrice = unitPrice; + } + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + @Override + public String toString() { + return "StockBillInLogExcelVO{" + + "stockBillNo='" + stockBillNo + '\'' + + ", sourceOrderNo='" + sourceOrderNo + '\'' + + ", stockPointName='" + stockPointName + '\'' + + ", stockPointType='" + stockPointType + '\'' + + ", stockBillTypeName='" + stockBillTypeName + '\'' + + ", reason='" + reason + '\'' + + ", statusName='" + statusName + '\'' + + ", businessTime=" + businessTime + + ", totalCount=" + totalCount + + ", totalAmount='" + totalAmount + '\'' + + ", makerMobile='" + makerMobile + '\'' + + ", createTime=" + createTime + + ", partyCode='" + partyCode + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", stockCount=" + stockCount + + ", unitPrice='" + unitPrice + '\'' + + ", stockBillLogId=" + stockBillLogId + + ", status=" + status + + ", stockBillType=" + stockBillType + + ", stockChangeReasonId=" + stockChangeReasonId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemExcelVO.java new file mode 100644 index 0000000..092d14e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemExcelVO.java @@ -0,0 +1,253 @@ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.NumberFormat; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author lanhai + */ +public class StockBillLogItemExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "库存流水信息"; + public static final String SHEET_NAME = "库存流水"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; + + @ExcelProperty(value = {"库存流水信息", "单据编号"}, index = 0) + private String stockBillNo; + + @NumberFormat("#") + @ExcelProperty(value = {"库存流水信息", "关联单号"}, index = 1) + private String sourceOrderNo; + + @ExcelProperty(value = {"库存流水信息", "单据类型"}, index = 2) + private String stockBillTypeName; + + @ExcelProperty(value = {"库存流水信息", "商品名称"}, index = 3) + private String spuName; + + @ExcelProperty(value = {"库存流水信息", "规格"}, index = 4) + private String skuName; + + @ExcelProperty(value = {"库存流水信息", "商品编码"}, index = 5) + private String partyCode; + + @ExcelProperty(value = {"库存流水信息", "实际出入库数量"}, index = 6) + private Integer stockCount; + + @ExcelProperty(value = {"库存流水信息", "商品库存剩余量"}, index = 7) + private Integer afterStock; + + @ExcelProperty(value = {"库存流水信息", "成本单价"}, index = 8) + private Long unitPrice; + + @ExcelProperty(value = {"库存流水信息", "库存点名称"}, index = 9) + private String stockPointName; + + @ExcelProperty(value = {"库存流水信息", "库存点类型"}, index = 10) + private String stockPointType; + + @ExcelProperty(value = {"库存流水信息", "制单人手机号"}, index = 11) + private String makerMobile; + + @ExcelIgnore + private Long spuId; + + @ExcelIgnore + private Long skuId; + + @ExcelIgnore + private Long stockBillLogItemId; + + @ExcelIgnore + private Integer stockBillType; + + @ExcelIgnore + @Schema(description = "出入库明细id") + private Long stockBillLogId; + + @ExcelIgnore + private Long stockPointId; + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public String getStockPointName() { + return stockPointName; + } + + public void setStockPointName(String stockPointName) { + this.stockPointName = stockPointName; + } + + public String getStockPointType() { + return stockPointType; + } + + public void setStockPointType(String stockPointType) { + this.stockPointType = stockPointType; + } + + public String getStockBillTypeName() { + return stockBillTypeName; + } + + public void setStockBillTypeName(String stockBillTypeName) { + this.stockBillTypeName = stockBillTypeName; + } + + public String getStockBillNo() { + return stockBillNo; + } + + public void setStockBillNo(String stockBillNo) { + this.stockBillNo = stockBillNo; + } + + public String getSourceOrderNo() { + return sourceOrderNo; + } + + public void setSourceOrderNo(String sourceOrderNo) { + this.sourceOrderNo = sourceOrderNo; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Integer getStockCount() { + return stockCount; + } + + public void setStockCount(Integer stockCount) { + this.stockCount = stockCount; + } + + public Integer getAfterStock() { + return afterStock; + } + + public void setAfterStock(Integer afterStock) { + this.afterStock = afterStock; + } + + public Long getUnitPrice() { + return unitPrice; + } + + public void setUnitPrice(Long unitPrice) { + this.unitPrice = unitPrice; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getStockBillLogItemId() { + return stockBillLogItemId; + } + + public void setStockBillLogItemId(Long stockBillLogItemId) { + this.stockBillLogItemId = stockBillLogItemId; + } + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + @Override + public String toString() { + return "StockBillLogItemExcelVO{" + + "stockBillNo='" + stockBillNo + '\'' + + ", sourceOrderNo='" + sourceOrderNo + '\'' + + ", stockBillTypeName='" + stockBillTypeName + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", partyCode='" + partyCode + '\'' + + ", stockCount=" + stockCount + + ", afterStock=" + afterStock + + ", unitPrice=" + unitPrice + + ", stockPointName='" + stockPointName + '\'' + + ", stockPointType='" + stockPointType + '\'' + + ", makerMobile='" + makerMobile + '\'' + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", stockBillLogItemId=" + stockBillLogItemId + + ", stockBillType=" + stockBillType + + ", stockBillLogId=" + stockBillLogId + + ", stockPointId=" + stockPointId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemVO.java new file mode 100644 index 0000000..6d70d0d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemVO.java @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 出入库商品项VO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class StockBillLogItemVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "出入库明细id") + private Long stockBillLogId; + + @Schema(description = "实际出入库数量") + private Integer stockCount; + + @Schema(description = "商品库存剩余量") + private Integer afterStock; + + @Schema(description = "成本单价") + private Long unitPrice; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "单位") + private String measureUnit; + + @Schema(description = "1:出库 2:入库") + private Integer stockType; + + @Schema(description = "单据类型") + private Integer stockBillType; + + @Schema(description = "出入库单号") + private String stockBillNo; + + @Schema(description = "关联订单号") + private String sourceOrderNo; + + @Schema(description = "制单人手机号") + private String makerMobile; + + public String getStockBillNo() { + return stockBillNo; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public void setStockBillNo(String stockBillNo) { + this.stockBillNo = stockBillNo; + } + + public String getSourceOrderNo() { + return sourceOrderNo; + } + + public void setSourceOrderNo(String sourceOrderNo) { + this.sourceOrderNo = sourceOrderNo; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getMeasureUnit() { + return measureUnit; + } + + public void setMeasureUnit(String measureUnit) { + this.measureUnit = measureUnit; + } + + public Integer getStockType() { + return stockType; + } + + public void setStockType(Integer stockType) { + this.stockType = stockType; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public Integer getStockCount() { + return stockCount; + } + + public void setStockCount(Integer stockCount) { + this.stockCount = stockCount; + } + + public Integer getAfterStock() { + return afterStock; + } + + public void setAfterStock(Integer afterStock) { + this.afterStock = afterStock; + } + + public Long getUnitPrice() { + return unitPrice; + } + + public void setUnitPrice(Long unitPrice) { + this.unitPrice = unitPrice; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "StockBillLogItemVO{" + + ", stockBillLogId=" + stockBillLogId + + ", stockCount=" + stockCount + + ", afterStock=" + afterStock + + ", unitPrice=" + unitPrice + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", remark='" + remark + '\'' + + ", partyCode='" + partyCode + '\'' + + ", spuName='" + spuName + '\'' + + ", measureUnit='" + measureUnit + '\'' + + ", stockType=" + stockType + + ", stockBillType=" + stockBillType + + ", stockBillNo='" + stockBillNo + '\'' + + ", sourceOrderNo=" + sourceOrderNo + + ", makerMobile='" + makerMobile + '\'' + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogVO.java new file mode 100644 index 0000000..e3c3981 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogVO.java @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 出入库明细VO + * + * @author lhd + * @date 2022-06-22 16:57:26 + */ +public class StockBillLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "出入库明细id") + private Long stockBillLogId; + + @Schema(description = "出入库单号") + private String stockBillNo; + + @Schema(description = "关联订单号") + private String sourceOrderNo; + + @Schema(description = "单据类型") + private Integer stockBillType; + + @Schema(description = "出入库原因id") + private Long stockChangeReasonId; + + @Schema(description = "操作员工id") + private Long employeeId; + + @Schema(description = "状态,0:已作废,1:已出/入库,2:待提交") + private Integer status; + + @Schema(description = "出入库时间") + private Date businessTime; + + @Schema(description = "总出入库数量") + private Integer totalCount; + + @Schema(description = "总出入库金额") + private Long totalAmount; + + @Schema(description = "出入库凭证") + private String qualifications; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "类型,1:出库 2:入库") + private Integer type; + + @Schema(description = "制单人手机号") + private String makerMobile; + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public String getStockBillNo() { + return stockBillNo; + } + + public void setStockBillNo(String stockBillNo) { + this.stockBillNo = stockBillNo; + } + + public String getSourceOrderNo() { + return sourceOrderNo; + } + + public void setSourceOrderNo(String sourceOrderNo) { + this.sourceOrderNo = sourceOrderNo; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Date getBusinessTime() { + return businessTime; + } + + public void setBusinessTime(Date businessTime) { + this.businessTime = businessTime; + } + + public Integer getTotalCount() { + return totalCount; + } + + public void setTotalCount(Integer totalCount) { + this.totalCount = totalCount; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + public String getQualifications() { + return qualifications; + } + + public void setQualifications(String qualifications) { + this.qualifications = qualifications; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + @Override + public String toString() { + return "StockBillLogVO{" + + "stockBillLogId=" + stockBillLogId + + ",stockBillNo=" + stockBillNo + + ",sourceOrderNo=" + sourceOrderNo + + ",stockBillType=" + stockBillType + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",stockChangeReasonId=" + stockChangeReasonId + + ",employeeId=" + employeeId + + ",status=" + status + + ",businessTime=" + businessTime + + ",totalCount=" + totalCount + + ",totalAmount=" + totalAmount + + ",qualifications=" + qualifications + + ",shopId=" + shopId + + ",supplierId=" + supplierId + + ",remark=" + remark + + ",type=" + type + + ",makerMobile=" + makerMobile + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillOutLogExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillOutLogExcelVO.java new file mode 100644 index 0000000..2821eb2 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillOutLogExcelVO.java @@ -0,0 +1,288 @@ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author gaozijie + * @date 2023-04-10 + */ +public class StockBillOutLogExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "出库明细信息"; + public static final String SHEET_NAME = "出库明细"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; + + @ExcelProperty(value = {"出库明细信息", "出库单号"}, index = 0) + private String stockBillNo; + + @ExcelProperty(value = {"出库明细信息", "关联订单号"}, index = 1) + private String sourceOrderNo; + + @ExcelProperty(value = {"入库明细信息", "库存点名称"}, index = 2) + private String stockPointName; + + @ExcelProperty(value = {"入库明细信息", "库存点类型"}, index = 3) + private String stockPointType; + + @ExcelProperty(value = {"出库明细信息", "单据类型"}, index = 4) + private String stockBillTypeName; + + @ExcelProperty(value = {"出库明细信息", "出库原因"}, index = 5) + private String reason; + + @ExcelProperty(value = {"出库明细信息", "状态,0:已作废,1:已出库,2:待提交"}, index = 6) + private String statusName; + + @ExcelProperty(value = {"出库明细信息", "出库时间"}, index = 7) + private Date businessTime; + + @ExcelProperty(value = {"出库明细信息", "总出库数量"}, index = 8) + private Integer totalCount; + + @ExcelProperty(value = {"出库明细信息", "总出库金额"}, index = 9) + private String totalAmount; + + @ExcelProperty(value = {"出库明细信息", "制单人"}, index = 10) + private String makerMobile; + + @ExcelProperty(value = {"出库明细信息", "制单时间"}, index = 11) + private Date createTime; + + @ExcelProperty(value = {"出库明细信息", "商品编码"}, index = 12) + private String partyCode; + + @ExcelProperty(value = {"出库明细信息", "商品名称"}, index = 13) + private String spuName; + + @ExcelProperty(value = {"出库明细信息", "规格"}, index = 14) + private String skuName; + + @ExcelProperty(value = {"出库明细信息", "实际出库数量"}, index = 15) + private Integer stockCount; + + @ExcelProperty(value = {"出库明细信息", "成本单价"}, index = 16) + private String unitPrice; + + @ExcelIgnore + private Long stockBillLogId; + + @ExcelIgnore + private Integer status; + + @ExcelIgnore + private Integer stockBillType; + + @ExcelIgnore + private Long stockChangeReasonId; + + public String getStockPointName() { + return stockPointName; + } + + public void setStockPointName(String stockPointName) { + this.stockPointName = stockPointName; + } + + public String getStockPointType() { + return stockPointType; + } + + public void setStockPointType(String stockPointType) { + this.stockPointType = stockPointType; + } + + public String getStockBillNo() { + return stockBillNo; + } + + public void setStockBillNo(String stockBillNo) { + this.stockBillNo = stockBillNo; + } + + public String getSourceOrderNo() { + return sourceOrderNo; + } + + public void setSourceOrderNo(String sourceOrderNo) { + this.sourceOrderNo = sourceOrderNo; + } + + public String getStockBillTypeName() { + return stockBillTypeName; + } + + public void setStockBillTypeName(String stockBillTypeName) { + this.stockBillTypeName = stockBillTypeName; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getStatusName() { + return statusName; + } + + public void setStatusName(String statusName) { + this.statusName = statusName; + } + + public Date getBusinessTime() { + return businessTime; + } + + public void setBusinessTime(Date businessTime) { + this.businessTime = businessTime; + } + + public Integer getTotalCount() { + return totalCount; + } + + public void setTotalCount(Integer totalCount) { + this.totalCount = totalCount; + } + + public String getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(String totalAmount) { + this.totalAmount = totalAmount; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Integer getStockCount() { + return stockCount; + } + + public void setStockCount(Integer stockCount) { + this.stockCount = stockCount; + } + + public String getUnitPrice() { + return unitPrice; + } + + public void setUnitPrice(String unitPrice) { + this.unitPrice = unitPrice; + } + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + @Override + public String toString() { + return "StockBillOutLogExcelVO{" + + "stockBillNo='" + stockBillNo + '\'' + + ", sourceOrderNo='" + sourceOrderNo + '\'' + + ", stockPointName='" + stockPointName + '\'' + + ", stockPointType='" + stockPointType + '\'' + + ", stockBillTypeName='" + stockBillTypeName + '\'' + + ", reason='" + reason + '\'' + + ", statusName='" + statusName + '\'' + + ", businessTime=" + businessTime + + ", totalCount=" + totalCount + + ", totalAmount='" + totalAmount + '\'' + + ", makerMobile='" + makerMobile + '\'' + + ", createTime=" + createTime + + ", partyCode='" + partyCode + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", stockCount=" + stockCount + + ", unitPrice='" + unitPrice + '\'' + + ", stockBillLogId=" + stockBillLogId + + ", status=" + status + + ", stockBillType=" + stockBillType + + ", stockChangeReasonId=" + stockChangeReasonId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockChangeReasonLangVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockChangeReasonLangVO.java new file mode 100644 index 0000000..c70b023 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockChangeReasonLangVO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 出入库原因-国际化VO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class StockChangeReasonLangVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long stockChangeReasonId; + + @Schema(description = "语言 0.中文 1.英文") + private Integer lang; + + @Schema(description = "原因") + private String reason; + + @Schema(description = "备注") + private String remark; + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "StockChangeReasonLangVO{" + + "stockChangeReasonId=" + stockChangeReasonId + + ",lang=" + lang + + ",reason=" + reason + + ",remark=" + remark + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockChangeReasonStatusVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockChangeReasonStatusVO.java new file mode 100644 index 0000000..446760c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockChangeReasonStatusVO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 出入库原因状态VO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class StockChangeReasonStatusVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long stockChangeReasonStatusId; + + @Schema(description = "关联的系统出入库原因id") + private Long stockChangeReasonId; + + @Schema(description = "状态,1:启用 0:禁用 -1:删除") + private Integer status; + + @Schema(description = "店铺id") + private Long shopId; + + public Long getStockChangeReasonStatusId() { + return stockChangeReasonStatusId; + } + + public void setStockChangeReasonStatusId(Long stockChangeReasonStatusId) { + this.stockChangeReasonStatusId = stockChangeReasonStatusId; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "StockChangeReasonStatusVO{" + + "stockChangeReasonStatusId=" + stockChangeReasonStatusId + + ",stockChangeReasonId=" + stockChangeReasonId + + ",status=" + status + + ",shopId=" + shopId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SupplierProdExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SupplierProdExcelVO.java new file mode 100644 index 0000000..62b54b1 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SupplierProdExcelVO.java @@ -0,0 +1,421 @@ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.tmerclub.cloud.common.product.vo.BrandLangVO; +import com.tmerclub.cloud.common.product.vo.SpuLangVO; +import com.tmerclub.cloud.common.product.vo.SpuSkuAttrValueVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +/** + * @author lanhai + */ +public class SupplierProdExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "商品信息"; + public static final String SHEET_NAME = "商品"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + /** + * 需要批注的列 + */ + public static final int[] COMMENT_INDEX = {3, 4, 9}; + /** + * 对应列批注信息 + */ + public static final String[] COMMENTS = { + "1. 选填,请填写图片在图片服务器的url地址;\n" + + "2. 最多可上传9张,不同图片请以\\',\\'隔开;", + "1. 选填,请填写视频在视频服务器的url地址;\n" + + "2. 只能添加一个视频连接;\n" + + "3. 视频仅支付mp4格式,最大限制50MB;", + "默认支持快递配送" + }; + + @ExcelProperty(value = {"商品信息", "编号*"}, index = 0) + private String seq; + + @ExcelProperty(value = {"商品信息", "商品中文名称*"}, index = 1) + private String nameZh; + + + @ExcelProperty(value = {"商品信息", "商品spu编码"}, index = 2) + private String spuCode; + @ExcelProperty(value = {"商品信息", "商品图片"}, index = 3) + private String imgs; + @ExcelProperty(value = {"商品信息", "商品视频"}, index = 4) + private String video; + @ExcelProperty(value = {"商品信息", "商品中文卖点"}, index = 5) + private String sellingPointZh; + + @ExcelProperty(value = {"商品信息", "商品中文详情"}, index = 6) + private String detailZh; + + @ExcelProperty(value = {"商品信息", "品牌"}, index = 7) + private String brandName; + + @ExcelProperty(value = {"商品信息", "平台分类*"}, index = 8) + private String categoryName; + + @ExcelProperty(value = {"商品信息", "配送方式"}, index = 9) + private String deliveryMode; + + @ExcelProperty(value = {"商品信息", "运费模板*"}, index = 10) + private String deliveryTemplate; + + @ExcelProperty(value = {"商品信息", "固定运费金额(运费模板为固定运费时必填*)"}, index = 11) + private String deliveryAmount; + + @ExcelProperty(value = {"商品信息", "状态*"}, index = 12) + private String status; + + @ExcelProperty(value = {"商品sku信息", "中文sku名称"}, index = 13) + private String skuNameZh; + + + @ExcelProperty(value = {"商品sku信息", "中文销售规格"}, index = 14) + private String propertiesZh; + + + @ExcelProperty(value = {"商品sku信息", "售价"}, index = 15) + private String priceFee; + + @ExcelProperty(value = {"商品sku信息", "市场价"}, index = 16) + private String marketPriceFee; + + @ExcelProperty(value = {"商品sku信息", "库存"}, index = 17) + private Integer stock; + + @ExcelProperty(value = {"商品sku信息", "商品sku编码"}, index = 18) + private String partyCode; + + @ExcelProperty(value = {"商品sku信息", "商品重量"}, index = 19) + private Double weight; + + @ExcelProperty(value = {"商品sku信息", "商品体积"}, index = 20) + private Double volume; + + @ExcelProperty(value = {"商品sku信息", "库存预警"}, index = 21) + private Long stockWarning; + /** + * 商品id + */ + @ExcelIgnore + private Long spuId; + + /** + * 物流模板id + */ + @ExcelIgnore + private Long deliveryTemplateId; + + @ExcelIgnore + private List spuSkuAttrValueList; + + @ExcelIgnore + private List brandLangList; + + @ExcelIgnore + private List spuLangList; + + @ExcelIgnore + private Long categoryId; + + @ExcelIgnore + private Long shopCategoryId; + + @ExcelIgnore + private String shopCategoryName; + + public String getDeliveryAmount() { + return deliveryAmount; + } + + public void setDeliveryAmount(String deliveryAmount) { + this.deliveryAmount = deliveryAmount; + } + + public Long getStockWarning() { + return stockWarning; + } + + public void setStockWarning(Long stockWarning) { + this.stockWarning = stockWarning; + } + + public String getImgs() { + return imgs; + } + + public void setImgs(String imgs) { + this.imgs = imgs; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getNameZh() { + return nameZh; + } + + public void setNameZh(String nameZh) { + this.nameZh = nameZh; + } + + public String getSellingPointZh() { + return sellingPointZh; + } + + public void setSellingPointZh(String sellingPointZh) { + this.sellingPointZh = sellingPointZh; + } + + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getDeliveryMode() { + return deliveryMode; + } + + public void setDeliveryMode(String deliveryMode) { + this.deliveryMode = deliveryMode; + } + + public String getDeliveryTemplate() { + return deliveryTemplate; + } + + public void setDeliveryTemplate(String deliveryTemplate) { + this.deliveryTemplate = deliveryTemplate; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSkuNameZh() { + return skuNameZh; + } + + public void setSkuNameZh(String skuNameZh) { + this.skuNameZh = skuNameZh; + } + + + public String getPropertiesZh() { + return propertiesZh; + } + + public void setPropertiesZh(String propertiesZh) { + this.propertiesZh = propertiesZh; + } + + + public String getPriceFee() { + return priceFee; + } + + public void setPriceFee(String priceFee) { + this.priceFee = priceFee; + } + + public String getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(String marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Double getWeight() { + return weight; + } + + public void setWeight(Double weight) { + this.weight = weight; + } + + public Double getVolume() { + return volume; + } + + public void setVolume(Double volume) { + this.volume = volume; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getDeliveryTemplateId() { + return deliveryTemplateId; + } + + public void setDeliveryTemplateId(Long deliveryTemplateId) { + this.deliveryTemplateId = deliveryTemplateId; + } + + + public List getSpuSkuAttrValueList() { + return spuSkuAttrValueList; + } + + public void setSpuSkuAttrValueList(List spuSkuAttrValueList) { + this.spuSkuAttrValueList = spuSkuAttrValueList; + } + + public List getBrandLangList() { + return brandLangList; + } + + public void setBrandLangList(List brandLangList) { + this.brandLangList = brandLangList; + } + + public List getSpuLangList() { + return spuLangList; + } + + public void setSpuLangList(List spuLangList) { + this.spuLangList = spuLangList; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopCategoryId() { + return shopCategoryId; + } + + public void setShopCategoryId(Long shopCategoryId) { + this.shopCategoryId = shopCategoryId; + } + + public String getShopCategoryName() { + return shopCategoryName; + } + + public void setShopCategoryName(String shopCategoryName) { + this.shopCategoryName = shopCategoryName; + } + + public String getDetailZh() { + return detailZh; + } + + public void setDetailZh(String detailZh) { + this.detailZh = detailZh; + } + + @Override + public String toString() { + return "SupplierProdExcelVO{" + + "seq='" + seq + '\'' + + ", nameZh='" + nameZh + '\'' + + ", spuCode='" + spuCode + '\'' + + ", imgs='" + imgs + '\'' + + ", video='" + video + '\'' + + ", sellingPointZh='" + sellingPointZh + '\'' + + ", detailZh='" + detailZh + '\'' + + ", brandName='" + brandName + '\'' + + ", categoryName='" + categoryName + '\'' + + ", deliveryMode='" + deliveryMode + '\'' + + ", deliveryTemplate='" + deliveryTemplate + '\'' + + ", status='" + status + '\'' + + ", skuNameZh='" + skuNameZh + '\'' + + ", propertiesZh='" + propertiesZh + '\'' + + ", priceFee='" + priceFee + '\'' + + ", marketPriceFee='" + marketPriceFee + '\'' + + ", stock=" + stock + + ", partyCode='" + partyCode + '\'' + + ", weight=" + weight + + ", volume=" + volume + + ", stockWarning=" + stockWarning + + ", spuId=" + spuId + + ", deliveryTemplateId=" + deliveryTemplateId + + ", spuSkuAttrValueList=" + spuSkuAttrValueList + + ", brandLangList=" + brandLangList + + ", spuLangList=" + spuLangList + + ", categoryId=" + categoryId + + ", shopCategoryId=" + shopCategoryId + + ", shopCategoryName='" + shopCategoryName + '\'' + + ", deliveryAmount=" + deliveryAmount + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockSpuExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockSpuExcelVO.java new file mode 100644 index 0000000..ecefb97 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockSpuExcelVO.java @@ -0,0 +1,74 @@ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author lanhai + */ +public class TakeStockSpuExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String EXCEL_NAME = "盘点商品导入模板"; + + public static final String SHEET_NAME = "盘点商品导入模板"; + + public static final int MERGE_ROW_INDEX = 2; + + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty(value = {"盘点商品明细", "商品编码(必填*)"}, index = 0) + private String partyCode; + + @ExcelProperty(value = {"盘点商品明细", "商品名称"}, index = 1) + private String spuName; + + @ExcelProperty(value = {"盘点商品明细", "商品规格"}, index = 2) + private String skuName; + + @ExcelProperty(value = {"盘点商品明细", "盘点数量"}, index = 3) + private Integer changeStock; + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Integer getChangeStock() { + return changeStock; + } + + public void setChangeStock(Integer changeStock) { + this.changeStock = changeStock; + } + + @Override + public String toString() { + return "TakeStockSpuExcelVO{" + + "partyCode='" + partyCode + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", changeStock=" + changeStock + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockSpuImportVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockSpuImportVO.java new file mode 100644 index 0000000..ba2de51 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockSpuImportVO.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.product.model.TakeStockSpu; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +/** + * @author lanhai + */ +public class TakeStockSpuImportVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "成功解析的数据项") + private List takeStockSpuList; + + @Schema(description = "导入结果提示") + private String tips; + + public List getTakeStockSpuList() { + return takeStockSpuList; + } + + public void setTakeStockSpuList(List takeStockSpuList) { + this.takeStockSpuList = takeStockSpuList; + } + + public String getTips() { + return tips; + } + + public void setTips(String tips) { + this.tips = tips; + } + + @Override + public String toString() { + return "TakeStockSpuImportVO{" + + "takeStockSpuList=" + takeStockSpuList + + ", tips='" + tips + '\'' + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockSpuVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockSpuVO.java new file mode 100644 index 0000000..e36b8b3 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockSpuVO.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 盘点商品列表VO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class TakeStockSpuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "盘点商品id") + private Long takeStockSpuId; + + @Schema(description = "盘点id") + private Long takeStockId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "sku_id") + private Long skuId; + + @Schema(description = "账面库存") + private Integer stocks; + + @Schema(description = "实盘库存") + private Integer totalStock; + + @Schema(description = "盈亏类型 0盘平 1盘盈 2盘亏 -1异常") + private Integer ioType; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "异常原因 1.删除商品 2.盘点期间有库存变动 3.其他") + private Integer exceptionReason; + + @Schema(description = "商品名") + private String spuName; + + @Schema(description = "规格名") + private String skuName; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "商品图片") + private String pic; + + public Long getTakeStockSpuId() { + return takeStockSpuId; + } + + public void setTakeStockSpuId(Long takeStockSpuId) { + this.takeStockSpuId = takeStockSpuId; + } + + public Long getTakeStockId() { + return takeStockId; + } + + public void setTakeStockId(Long takeStockId) { + this.takeStockId = takeStockId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getStocks() { + return stocks; + } + + public void setStocks(Integer stocks) { + this.stocks = stocks; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Integer getExceptionReason() { + return exceptionReason; + } + + public void setExceptionReason(Integer exceptionReason) { + this.exceptionReason = exceptionReason; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + @Override + public String toString() { + return "TakeStockSpuVO{" + + "takeStockSpuId=" + takeStockSpuId + + ", takeStockId=" + takeStockId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", stocks=" + stocks + + ", totalStock=" + totalStock + + ", ioType=" + ioType + + ", remark='" + remark + '\'' + + ", exceptionReason=" + exceptionReason + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", partyCode='" + partyCode + '\'' + + ", pic='" + pic + '\'' + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/WarehouseAreaVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/WarehouseAreaVO.java new file mode 100644 index 0000000..b2d37a0 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/WarehouseAreaVO.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 仓库项和供货城市关联信息VO + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +public class WarehouseAreaVO extends BaseVO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "") + private Long warehouseAreaId; + + @Schema(description = "仓库id") + private Long warehouseId; + + @Schema(description = "城市id") + private Long areaId; + + public Long getWarehouseAreaId() { + return warehouseAreaId; + } + + public void setWarehouseAreaId(Long warehouseAreaId) { + this.warehouseAreaId = warehouseAreaId; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + @Override + public String toString() { + return "WarehouseAreaVO{" + + "warehouseAreaId=" + warehouseAreaId + + ", warehouseId=" + warehouseId + + ", areaId=" + areaId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoSpuBrowseLogVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoSpuBrowseLogVO.java new file mode 100644 index 0000000..d088d4d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoSpuBrowseLogVO.java @@ -0,0 +1,47 @@ +package com.tmerclub.cloud.product.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 对应MongoDB中商品浏览记录表emp + * + * @author track + */ +@Document("spu_browse_log") +public class MongoSpuBrowseLogVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "分类计数") + private Integer num; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Integer getNum() { + return num; + } + + public void setNum(Integer num) { + this.num = num; + } + + @Override + public String toString() { + return "MongoSpuBrowseLogVO{" + + "categoryId=" + categoryId + + ", num=" + num + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoStockBillLogItemVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoStockBillLogItemVO.java new file mode 100644 index 0000000..d4ed80a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoStockBillLogItemVO.java @@ -0,0 +1,284 @@ +package com.tmerclub.cloud.product.vo.mongo; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 对应MongoDB存储出入库商品emp + * + * @author track + */ +@Document("stock_bill_log_item") +public class MongoStockBillLogItemVO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 库存字段 + */ + + @Schema(description = "出入库明细id") + private Long stockBillLogId; + + @Schema(description = "出入库单号") + private String stockBillNo; + + @Schema(description = "关联订单号") + private String sourceOrderNo; + + @Schema(description = "单据类型") + private Integer stockBillType; + + @Schema(description = "类型,1:出库 2:入库") + private Integer type; + + @Schema(description = "单位") + private String measureUnit; + + /** + * 库存项字段 + */ + + @Schema(description = "实际出入库数量") + private Integer stockCount; + + @Schema(description = "商品库存剩余量") + private Integer afterStock; + + @Schema(description = "成本单价") + private Long unitPrice; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "主图:sku有图片使用sku图片,否则使用商品主图") + private String mainImgUrl; + + @Schema(description = "规格") + private String skuName; + + @Schema(description = "制单人id") + private Long employeeId; + + @Schema(description = "制单人手机号") + private String makerMobile; + + @Schema(description = "制单人姓名") + private String makerName; + + @Schema(description = "库存点id") + private Long stockPointId; + + @Schema(description = "库存点名称") + private String stockPointName; + + @Schema(description = "库存点类型(1:仓库, 2:门店)") + private Integer stockPointType; + + public Integer getStockCount() { + return stockCount; + } + + public void setStockCount(Integer stockCount) { + this.stockCount = stockCount; + } + + public Integer getAfterStock() { + return afterStock; + } + + public void setAfterStock(Integer afterStock) { + this.afterStock = afterStock; + } + + public Long getUnitPrice() { + return unitPrice; + } + + public void setUnitPrice(Long unitPrice) { + this.unitPrice = unitPrice; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public String getMakerName() { + return makerName; + } + + public void setMakerName(String makerName) { + this.makerName = makerName; + } + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public String getStockBillNo() { + return stockBillNo; + } + + public void setStockBillNo(String stockBillNo) { + this.stockBillNo = stockBillNo; + } + + public String getSourceOrderNo() { + return sourceOrderNo; + } + + public void setSourceOrderNo(String sourceOrderNo) { + this.sourceOrderNo = sourceOrderNo; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getMeasureUnit() { + return measureUnit; + } + + public void setMeasureUnit(String measureUnit) { + this.measureUnit = measureUnit; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public String getStockPointName() { + return stockPointName; + } + + public void setStockPointName(String stockPointName) { + this.stockPointName = stockPointName; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + @Override + public String toString() { + return "MongoStockBillLogItemVO{" + + "stockBillLogId=" + stockBillLogId + + ", stockBillNo='" + stockBillNo + '\'' + + ", sourceOrderNo='" + sourceOrderNo + '\'' + + ", stockBillType=" + stockBillType + + ", type=" + type + + ", measureUnit='" + measureUnit + '\'' + + ", stockCount=" + stockCount + + ", afterStock=" + afterStock + + ", unitPrice=" + unitPrice + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", partyCode='" + partyCode + '\'' + + ", spuName='" + spuName + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", skuName='" + skuName + '\'' + + ", employeeId=" + employeeId + + ", makerMobile='" + makerMobile + '\'' + + ", makerName='" + makerName + '\'' + + ", stockPointId=" + stockPointId + + ", stockPointName='" + stockPointName + '\'' + + ", stockPointType=" + stockPointType + + '}'; + } +} diff --git a/tmerclub-product/src/main/resources/bootstrap.yml b/tmerclub-product/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..756eaae --- /dev/null +++ b/tmerclub-product/src/main/resources/bootstrap.yml @@ -0,0 +1,34 @@ +server: + port: ${MALL4CLOUD_PORT:9104} +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} +mall4cloud: + prod: + thread: + coreSize: 0 + maxSize: 200 + keepAliveTime: 60 +logging: + tracer: + pattern: '%5p [${spring.application.name:},%X{X-B3-Parent-SpanName},%X{X-B3-TraceId},%X{X-B3-SpanId}]' + +# dubbo端口:默认为服务端口+2000 +dubbo: + protocol: + port: ${MALL4CLOUD_DUBBO_PORT:9504} diff --git a/tmerclub-product/src/main/resources/mapper/AttrCategoryMapper.xml b/tmerclub-product/src/main/resources/mapper/AttrCategoryMapper.xml new file mode 100644 index 0000000..7e8544f --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/AttrCategoryMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + insert into attr_category (`category_id`,`attr_id`) values (#{categoryId},#{attrId}); + + + + delete from attr_category where attr_id = #{attrId} and category_id IN + + #{categoryId} + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/AttrValueLangMapper.xml b/tmerclub-product/src/main/resources/mapper/AttrValueLangMapper.xml new file mode 100644 index 0000000..4066886 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/AttrValueLangMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + `attr_value_id`,`lang`,`value` + + + + + delete from attr_value_lang where attr_value_id = #{attrValueId} + + + + insert into attr_value_lang (`attr_value_id`,`lang`,`value`) values + + (#{attrValueLang.attrValueId},#{attrValueLang.lang},#{attrValueLang.value}) + + + + + + update attr_value_lang set `value` = #{attrValueLang.value} + where attr_value_id = #{attrValueLang.attrValueId} and `lang` = #{attrValueLang.lang}; + + + + + DELETE FROM attr_value_lang WHERE attr_value_id IN + + #{attrValueId} + + + + + delete from attr_value_lang where attr_value_id in + + #{attrValueId} + + + + + delete from attr_value_lang where attr_value_id in (select attr_value_id from attr_value where attr_id = #{attrId}) and lang in + + #{lang} + + + diff --git a/tmerclub-product/src/main/resources/mapper/AttrValueMapper.xml b/tmerclub-product/src/main/resources/mapper/AttrValueMapper.xml new file mode 100644 index 0000000..91e22b2 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/AttrValueMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + `attr_value_id`,`create_time`,`update_time`,`attr_id` + + + + DELETE FROM attr_value WHERE attr_value_id IN + + #{attrValueId} + + + + + insert into attr_value (`attr_id`) + values (#{attrValue.attrId}) + + + + DELETE FROM attr_value WHERE attr_id = #{attrId} + + + + diff --git a/tmerclub-product/src/main/resources/mapper/BrandLangMapper.xml b/tmerclub-product/src/main/resources/mapper/BrandLangMapper.xml new file mode 100644 index 0000000..2e3a9be --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/BrandLangMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + `brand_id`,`lang`,`name`,`desc` + + + + + delete from brand_lang where brand_id = #{brandId} + + + delete from brand_lang where brand_id in + + #{brandId} + + + + + insert into brand_lang (`brand_id`,`lang`,`name`,`desc`) + values + + (#{brandLang.brandId},#{brandLang.lang},#{brandLang.name},#{brandLang.desc}) + + + + insert into brand_lang (`brand_id`,`lang`,`name`,`desc`) + values + + (#{brandLang.brandId},#{lang},#{brandLang.name},#{brandLang.desc}) + + + + + + update brand_lang set `name` = #{brandLang.name}, `desc` = #{brandLang.desc} + where brand_id = #{brandLang.brandId} and lang = #{brandLang.lang}; + + + + + + + delete from brand_lang where brand_id = #{brandId} and lang in + + #{lang} + + + + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/BrandMapper.xml b/tmerclub-product/src/main/resources/mapper/BrandMapper.xml new file mode 100644 index 0000000..ae12660 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/BrandMapper.xml @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `brand_id`,`create_time`,`update_time`,,`img_url`,`first_letter`,`seq`,`is_top`,`status`,`shop_id` + + + + + + + insert into brand (`img_url`,`first_letter`,`seq`,`is_top`,`status`,`shop_id`) + values (#{brand.imgUrl},#{brand.firstLetter},#{brand.seq},#{brand.isTop},#{brand.status},#{brand.shopId}); + + + + insert into brand (`img_url`,`first_letter`,`seq`,`is_top`,`status`,`shop_id`) + values (#{brand.imgUrl},#{brand.firstLetter},#{brand.seq},#{brand.isTop},#{brand.status},#{brand.shopId}); + + + + insert into brand (`img_url`,`status`,`shop_id`,`first_letter`,`seq`,`is_top`,`sys_type`) values + + (#{brand.imgUrl},#{brand.status},#{brand.shopId},#{brand.firstLetter},#{brand.seq},#{brand.isTop},#{brand.sysType}) + + + + + update brand + set + + `name` = #{brand.name}, + + + `img_url` = #{brand.imgUrl}, + + + `first_letter` = #{brand.firstLetter}, + + + `seq` = #{brand.seq}, + + + `is_top` = #{brand.isTop}, + + + `status` = #{brand.status}, + + + `shop_id` = #{brand.shopId}, + + + `spu_count` = #{brand.spuCount}, + + update_time = NOW() + where brand_id = #{brand.brandId} + + + delete from brand where brand_id = #{brandId} + + + delete from brand where shop_id = #{shopId} and sys_type = #{sysType} + + + + + + UPDATE brand SET `status` = #{brand.status} WHERE `brand_id` = #{brand.brandId}; + + + + + + UPDATE brand SET spu_count = (SELECT COUNT(*) FROM spu WHERE brand_id = #{brandId} AND `status` = 1) WHERE brand_id = #{brandId}; + + + + + + + + + + + + + + UPDATE brand SET shop_id = #{newShopId}, status = #{status} WHERE shop_id = #{oldShopId} and sys_type = #{sysType} + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/BrandShopMapper.xml b/tmerclub-product/src/main/resources/mapper/BrandShopMapper.xml new file mode 100644 index 0000000..b1cdbfc --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/BrandShopMapper.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `brand_shop_id`,`create_time`,`update_time`,`shop_id`,`brand_id`,`qualifications`,`type`,sys_type + + + + + + + + insert into brand_shop (`shop_id`,`brand_id`,`qualifications`,`type`) + values (#{brandShop.shopId},#{brandShop.brandId},#{brandShop.qualifications},#{brandShop.type}); + + + insert into brand_shop (`brand_shop_id`,`shop_id`,`brand_id`,`qualifications`,`type`,`sys_type`) values + + (#{brandShop.brandShopId},#{shopId},#{brandShop.brandId},#{brandShop.qualifications},#{type},#{sysType}) + + + + + update brand_shop + + + `shop_id` = #{brandShop.shopId}, + + + `brand_id` = #{brandShop.brandId}, + + + `qualifications` = #{brandShop.qualifications}, + + + `type` = #{brandShop.type}, + + + where brand_shop_id = #{brandShop.brandShopId} + + + update brand_shop set `type` = #{type} where shop_id = #{shopId} and sys_type = #{sysType} + + + delete from brand_shop where brand_shop_id = #{brandShopId} + + + delete from brand_shop where shop_id = #{shopId} and sys_type = #{sysType} + + + delete from brand_shop where brand_id = #{brandId} + + + + diff --git a/tmerclub-product/src/main/resources/mapper/CategoryBrandMapper.xml b/tmerclub-product/src/main/resources/mapper/CategoryBrandMapper.xml new file mode 100644 index 0000000..1610e33 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/CategoryBrandMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + `id`,`create_time`,`update_time`,`brand_id`,`category_id` + + + delete from category_brand where brand_id in + + #{brandId} + + + + + + insert into category_brand (`brand_id`,`category_id`) + values (#{categoryBrand.brandId},#{categoryBrand.categoryId}); + + + + + + + DELETE FROM category_brand + WHERE brand_id = #{brandId} AND category_id IN + + #{categoryId} + + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/CategoryMapper.xml b/tmerclub-product/src/main/resources/mapper/CategoryMapper.xml new file mode 100644 index 0000000..b10775f --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/CategoryMapper.xml @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `category_id`,`create_time`,`update_time`,`shop_id`,`parent_id`,`desc`,`path`,`status`,`icon`,`img_url`,`level`,`deduction_rate`,`seq` + + + + insert into category (`shop_id`,`parent_id`,`desc`,`path`,`status`,`icon`,`img_url`,`level`,`deduction_rate`,`seq`) + values (#{category.shopId},#{category.parentId},#{category.desc},#{category.path},#{category.status},#{category.icon},#{category.imgUrl},#{category.level},#{category.deductionRate},#{category.seq}); + + + update category + + + `desc` = #{category.desc}, + + + `icon` = #{category.icon}, + + + `img_url` = #{category.imgUrl}, + + + `deduction_rate` = #{category.deductionRate}, + + + `seq` = #{category.seq}, + + + where category_id = #{category.categoryId} + + + delete from category where category_id = #{categoryId} + + + + + + + + + + + + UPDATE category SET `status` = #{status} WHERE `category_id` in + + #{categoryId} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/ShopCartItemMapper.xml b/tmerclub-product/src/main/resources/mapper/ShopCartItemMapper.xml new file mode 100644 index 0000000..8d54e02 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/ShopCartItemMapper.xml @@ -0,0 +1,418 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `cart_item_id`, + `create_time`, + `update_time`, + `shop_id`, + `spu_id`, + `sku_id`, + `user_id`, + `count`, + `discount_id`, + `price_fee` as sku_price_fee, + `distribution_user_id`, + is_checked, + `combo_id`, + `combo_count`, + `parent_cart_item_id` + + + + insert into shop_cart_item (`shop_id`, `spu_id`, `sku_id`, `user_id`, `category_id`, `count`, `discount_id`, `price_fee`, + `distribution_user_id`, is_checked,`combo_id`,`combo_count`,`parent_cart_item_id`) + values (#{shopCartItem.shopId}, #{shopCartItem.spuId}, #{shopCartItem.skuId}, #{shopCartItem.userId}, + #{shopCartItem.categoryId},#{shopCartItem.count}, #{shopCartItem.discountId}, #{shopCartItem.priceFee}, + #{shopCartItem.distributionUserId}, #{shopCartItem.isChecked},#{shopCartItem.comboId},#{shopCartItem.comboCount},#{shopCartItem.parentCartItemId}); + + + update shop_cart_item + + + `shop_id` = #{shopCartItem.shopId}, + + + `spu_id` = #{shopCartItem.spuId}, + + + `sku_id` = #{shopCartItem.skuId}, + + + `user_id` = #{shopCartItem.userId}, + + + `count` = #{shopCartItem.count}, + + + `discount_id` = #{shopCartItem.discountId}, + + + `price_fee` = #{shopCartItem.priceFee}, + + + `discount_id` = #{shopCartItem.discountId}, + + + `distribution_user_id` = #{shopCartItem.distributionUserId}, + + + `is_checked` = #{shopCartItem.isChecked}, + + + `combo_id` = #{shopCartItem.comboId}, + + + + + + `combo_count` = #{shopCartItem.comboCount} + + + where cart_item_id = #{shopCartItem.cartItemId} and user_id =#{shopCartItem.userId} + + + + + + + + + + delete + from shop_cart_item + where user_id = #{userId} and cart_item_id in + + #{shopCartItemId} + + + + + delete + from shop_cart_item + where user_id = #{userId} + + + + + + + + + + + + + + + update shop_cart_item set is_checked = #{item.isChecked} where cart_item_id = #{item.shopCartItemId} and user_id = #{userId} + + + + update shop_cart_item set is_closed = #{isClosed} + where shop_id in + + #{shopId} + + + + + + update shop_cart_item + + + `shop_id` = #{shopCartItem.shopId}, + + + `spu_id` = #{shopCartItem.spuId}, + + + `sku_id` = #{shopCartItem.skuId}, + + + `user_id` = #{shopCartItem.userId}, + + + `count` = #{shopCartItem.count}, + + + `discount_id` = #{shopCartItem.discountId}, + + + `price_fee` = #{shopCartItem.priceFee}, + + + `discount_id` = #{shopCartItem.discountId}, + + + `distribution_user_id` = #{shopCartItem.distributionUserId}, + + + `is_checked` = #{shopCartItem.isChecked}, + + + where cart_item_id = #{shopCartItem.cartItemId} and user_id =#{shopCartItem.userId} + + + + + + + delete from shop_cart_item + + combo_id in + + #{comboId} + + + AND spu_id = #{spuId} + + + AND sku_id = #{spuId} + + + + + + delete from shop_cart_item + + combo_id = #{comboId} + and + spu_id in + + #{spuId} + + + + + + delete from shop_cart_item + + combo_id = #{comboId} + and + sku_id in + + #{skuId} + + + + + + update shop_cart_item set price_fee = #{price} where combo_id = #{comboId} and sku_id = #{skuId} + + + + + + + + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuAttrValueLangMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuAttrValueLangMapper.xml new file mode 100644 index 0000000..a16b749 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuAttrValueLangMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + `spu_attr_value_id`,`lang`,`attr_name`,`attr_value_name`,`attr_desc` + + + + + insert into spu_attr_value_lang (`lang`,`attr_name`,`attr_value_name`,`attr_desc`) + values (#{spuAttrValueLang.lang},#{spuAttrValueLang.attrName},#{spuAttrValueLang.attrValueName},#{spuAttrValueLang.attrDesc}); + + + update spu_attr_value_lang + + + `lang` = #{spuAttrValueLang.lang}, + + + `attr_name` = #{spuAttrValueLang.attrName}, + + + `attr_value_name` = #{spuAttrValueLang.attrValueName}, + + + `attr_desc` = #{spuAttrValueLang.attrDesc}, + + + where spu_attr_value_id = #{spuAttrValueLang.spuAttrValueId} + + + delete from spu_attr_value_lang where spu_attr_value_id = #{spuAttrValueId} + + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuAttrValueMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuAttrValueMapper.xml new file mode 100644 index 0000000..56d4e31 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuAttrValueMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + `spu_attr_value_id`,`spu_id`,`attr_id`,`attr_name`,`attr_value_id`,`attr_value_name` + + + + insert into spu_attr_value (`spu_id`,`lang`,`attr_id`,`attr_name`,`attr_value_id`,`attr_value_name`)values + + (#{spuAttrValue.spuId},#{spuAttrValue.lang},#{spuAttrValue.attrId},#{spuAttrValue.attrName},#{spuAttrValue.attrValueId},#{spuAttrValue.attrValueName}) + + + + + delete from spu_attr_value where spu_id = #{spuId} + + + + DELETE FROM spu_attr_value WHERE attr_id = #{attrId} AND attr_value_id IN + + #{attrValueId} + + + + + DELETE FROM spu_attr_value WHERE attr_id = #{attrId} AND spu_id IN (SELECT spu_id FROM spu WHERE category_id IN + + #{categoryId} + + ) + + + + + + + update spu_attr_value + set `attr_value_id` = #{spuAttrValue.attrValueId},`attr_value_name` = #{spuAttrValue.attrValueName} + where spu_id = #{spuAttrValue.spuId} and attr_id = #{spuAttrValue.attrId} and lang = #{spuAttrValue.lang}; + + + + + update spu_attr_value + + + `attr_name` = #{spuAttrValue.attrName} + + + ,`attr_value_name` = #{spuAttrValue.attrValueName} + + + where `attr_value_id` = #{spuAttrValue.attrValueId} and attr_id = #{spuAttrValue.attrId} and lang = #{spuAttrValue.lang}; + + + + + delete from spu_attr_value where spu_id = #{spuId} and attr_id in + + #{attrId} + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuLangMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuLangMapper.xml new file mode 100644 index 0000000..80e3188 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuLangMapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + `spu_id`,`lang`,`spu_name`,`selling_point`,`content` + + + + + + update spu_lang + + + `spu_name` = #{spuLang.spuName}, + + + `selling_point` = #{spuLang.sellingPoint}, + + + where spu_id = #{spuLang.spuId} and lang = #{spuLang.lang}; + + + + delete from spu_lang where spu_id = #{spuId} + + + + + insert into spu_lang (`spu_id`,`lang`,`spu_name`,`selling_point`) + values (#{spuLang.spuId},#{spuLang.lang},#{spuLang.spuName},#{spuLang.sellingPoint}); + + + + + delete from spu_lang where spu_id = #{spuId} and lang in + + #{lang} + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuPriceLogMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuPriceLogMapper.xml new file mode 100644 index 0000000..08e010b --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuPriceLogMapper.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + `id`,`before_price`,`after_price`,`price` + + + + + + insert into spu_price_log (`spu_id`,`sku_id`,`before_price`,`after_price`,`price`) + values (#{spuPriceLog.spuId},#{spuPriceLog.skuId},#{spuPriceLog.beforePrice},#{spuPriceLog.afterPrice},#{spuPriceLog.price}); + + + + insert into spu_price_log (`spu_id`,`sku_id`,`before_price`,`after_price`,`price`) + values (#{spuPriceLog.spuId},#{spuPriceLog.skuId},#{spuPriceLog.beforePrice},#{spuPriceLog.afterPrice},#{spuPriceLog.price}); + + + + update spu_price_log + + + `spu_id` = #{spuPriceLog.spuId}, + + + `sku_id` = #{spuPriceLog.skuId}, + + + `before_price` = #{spuPriceLog.beforePrice}, + + + `after_price` = #{spuPriceLog.afterPrice}, + + + `price` = #{spuPriceLog.price}, + + + where id = #{spuPriceLog.id} + + + delete from spu_price_log where id = #{id} + + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuSkuAttrValueLangMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuSkuAttrValueLangMapper.xml new file mode 100644 index 0000000..4cb710c --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuSkuAttrValueLangMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + `spu_sku_attr_id`,`lang`,`attr_name`,`attr_value_name` + + + + + insert into spu_sku_attr_value_lang (`lang`,`attr_name`,`attr_value_name`) + values (#{spuSkuAttrValueLang.lang},#{spuSkuAttrValueLang.attrName},#{spuSkuAttrValueLang.attrValueName}); + + + update spu_sku_attr_value_lang + + + `lang` = #{spuSkuAttrValueLang.lang}, + + + `attr_name` = #{spuSkuAttrValueLang.attrName}, + + + `attr_value_name` = #{spuSkuAttrValueLang.attrValueName}, + + + where spu_sku_attr_id = #{spuSkuAttrValueLang.spuSkuAttrId} + + + delete from spu_sku_attr_value_lang where spu_sku_attr_id = #{spuSkuAttrId} + + + + insert into spu_sku_attr_value_lang (`spu_sku_attr_id`,`lang`,`attr_name`,`attr_value_name`) values + + (#{spuSkuAttrValueLang.spuSkuAttrId},#{spuSkuAttrValueLang.lang},#{spuSkuAttrValueLang.attrName},#{spuSkuAttrValueLang.attrValueName}) + + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuSkuAttrValueMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuSkuAttrValueMapper.xml new file mode 100644 index 0000000..2d84b10 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuSkuAttrValueMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + `spu_sku_attr_id`,`create_time`,`update_time`,`spu_id`,`sku_id`,`attr_id`,`attr_value_id`,`status` + + + + insert into spu_sku_attr_value (`spu_id`,`sku_id`,`lang`,`attr_id`,`attr_value_id`,`status`) values + + (#{spuSkuAttrValue.spuId},#{spuSkuAttrValue.skuId},#{spuSkuAttrValue.lang},#{spuSkuAttrValue.attrId}, + #{spuSkuAttrValue.attrValueId},#{spuSkuAttrValue.status}) + + + + + update spu_sku_attr_value set status = -1 where spu_id = #{spuId} + + + + + update spu_sku_attr_value set update_time = NOW() + WHERE spu_sku_attr_id = #{spuSkuAttrValue.spuSkuAttrId}; + + + + delete from spu_sku_attr_value where spu_sku_attr_id = #{spuSkuAttrId} + + + + update spu_sku_attr_value set `status` = #{status} where sku_id in + + #{skuId} + + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuSupplierChangeLogMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuSupplierChangeLogMapper.xml new file mode 100644 index 0000000..1ea2cac --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuSupplierChangeLogMapper.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + `spu_change_id`,`create_time`,`update_time`,`spu_id`,`change_type`,`remarks` + + + + insert into spu_supplier_change_log (`spu_id`,`change_type`) + values (#{spuSupplierChangeLog.spuId},#{spuSupplierChangeLog.changeType}); + + + insert into spu_supplier_change_log (`spu_id`,`change_type`) values + + ( #{spuId}, #{changeType} ) + + + + insert into spu_supplier_change_log (`spu_id`,`change_type`) values + + ( #{spu.spuId}, #{spu.changeType} ) + + + + update spu_supplier_change_log + + + `spu_id` = #{spuSupplierChangeLog.spuId}, + + + `change_type` = #{spuSupplierChangeLog.changeType}, + + + `remarks` = #{spuSupplierChangeLog.remarks}, + + + where spu_change_id = #{spuSupplierChangeLog.spuChangeId} + + + delete from spu_supplier_change_log where spu_change_id = #{spuChangeId} + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuTagMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuTagMapper.xml new file mode 100644 index 0000000..d2c36ba --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuTagMapper.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `id`,`title`,`shop_id`,`status`,`is_default`,`prod_count`,`style`,`seq`,`create_time`,`update_time`,`delete_time` + + + + + insert into spu_tag (`title`,`shop_id`,`status`,`is_default`,`prod_count`,`style`,`seq`) + values (#{spuTag.title},#{spuTag.shopId},#{spuTag.status},#{spuTag.isDefault},#{spuTag.prodCount},#{spuTag.style},#{spuTag.seq}); + + + update spu_tag + + + `title` = #{spuTag.title}, + + + `shop_id` = #{spuTag.shopId}, + + + `status` = #{spuTag.status}, + + + `is_default` = #{spuTag.isDefault}, + + + `prod_count` = #{spuTag.prodCount}, + + + `style` = #{spuTag.style}, + + + `seq` = #{spuTag.seq}, + + + `create_time` = #{spuTag.createTime}, + + + `update_time` = #{spuTag.updateTime}, + + + `delete_time` = #{spuTag.deleteTime}, + + + where id = #{spuTag.id} + + + delete from spu_tag where id = #{id} + + + + UPDATE spu_tag SET prod_count = (SELECT COUNT(reference_id) FROM `spu_tag_reference` WHERE tag_id = #{id}) WHERE id = #{id} + + + + + UPDATE spu_tag SET prod_count = (SELECT COUNT(reference_id) FROM `spu_tag_reference` WHERE tag_id = #{id}) WHERE id = #{id}; + + + + + + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuTagReferenceMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuTagReferenceMapper.xml new file mode 100644 index 0000000..8b034ca --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuTagReferenceMapper.xml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + `reference_id`,`shop_id`,`tag_id`,`spu_id`,`status`,`create_time`,`update_time` + + + + + + insert into spu_tag_reference (`shop_id`,`tag_id`,`spu_id`,`status`,`seq`) + values + + (#{spuTagReference.shopId},#{spuTagReference.tagId},#{spuTagReference.spuId},#{spuTagReference.status},#{spuTagReference.seq}) + + + + + + insert into spu_tag_reference (`shop_id`,`tag_id`,`spu_id`,`status`,`create_time`,`update_time`) + values (#{spuTagReference.shopId},#{spuTagReference.tagId},#{spuTagReference.spuId},#{spuTagReference.status},#{spuTagReference.createTime},#{spuTagReference.updateTime}); + + + update spu_tag_reference + + + `shop_id` = #{spuTagReference.shopId}, + + + `tag_id` = #{spuTagReference.tagId}, + + + `spu_id` = #{spuTagReference.spuId}, + + + `status` = #{spuTagReference.status}, + + + `create_time` = #{spuTagReference.createTime}, + + + `update_time` = #{spuTagReference.updateTime}, + + + where reference_id = #{spuTagReference.referenceId} + + + + + update spu_tag_reference + + + `seq` = #{spuTagReference.seq} + + + where spu_id = #{spuTagReference.spuId} and tag_id = #{spuTagReference.tagId}; + + + + + delete from spu_tag_reference where reference_id = #{referenceId} + + + + delete from spu_tag_reference where tag_id = #{prodTagId} and spu_id in + + #{id} + + + + + + + + + + delete from spu_tag_reference where spu_id in + + #{spuId} + + + + + DELETE FROM spu_tag_reference WHERE spu_id IN + ( + SELECT spu_id FROM category c + JOIN spu s ON + + c.category_id = s.category_id + + + c.category_id = s.shop_category_id + + WHERE c.category_id IN + + #{categoryId} + + ) + + + + + + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/StockChangeReasonLangMapper.xml b/tmerclub-product/src/main/resources/mapper/StockChangeReasonLangMapper.xml new file mode 100644 index 0000000..7396bae --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/StockChangeReasonLangMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + `stock_change_reason_id`,`lang`,`reason`,`remark` + + + + + + insert into stock_change_reason_lang (`lang`,`reason`,`remark`, stock_change_reason_id) + values (#{stockChangeReasonLang.lang},#{stockChangeReasonLang.reason},#{stockChangeReasonLang.remark}, #{stockChangeReasonLang.stockChangeReasonId}) ; + + + update stock_change_reason_lang + + + `lang` = #{stockChangeReasonLang.lang}, + + + `reason` = #{stockChangeReasonLang.reason}, + + + `remark` = #{stockChangeReasonLang.remark}, + + + where stock_change_reason_id = #{stockChangeReasonLang.stockChangeReasonId} + + + delete from stock_change_reason_lang where stock_change_reason_id = #{stockChangeReasonId} + + + diff --git a/tmerclub-product/src/main/resources/mapper/StockChangeReasonMapper.xml b/tmerclub-product/src/main/resources/mapper/StockChangeReasonMapper.xml new file mode 100644 index 0000000..b2135f7 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/StockChangeReasonMapper.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + `stock_change_reason_id`,`type`,`shop_id`,`status`,`sys_type` + + + + + + insert into stock_change_reason (`type`,`shop_id`,`status`,`sys_type`) + values (#{stockChangeReason.type},#{stockChangeReason.shopId},#{stockChangeReason.status},#{stockChangeReason.sysType}); + + + update stock_change_reason + + + `type` = #{stockChangeReason.type}, + + + `shop_id` = #{stockChangeReason.shopId}, + + + `status` = #{stockChangeReason.status}, + + + `sys_type` = #{stockChangeReason.sysType}, + + + where stock_change_reason_id = #{stockChangeReason.stockChangeReasonId} + + + delete from stock_change_reason where stock_change_reason_id = #{stockChangeReasonId} + + + diff --git a/tmerclub-product/src/main/resources/mapper/StockChangeReasonStatusMapper.xml b/tmerclub-product/src/main/resources/mapper/StockChangeReasonStatusMapper.xml new file mode 100644 index 0000000..78f8c06 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/StockChangeReasonStatusMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + `stock_change_reason_status_id`,`stock_change_reason_id`,`status`,`shop_id` + + + + + + + insert into stock_change_reason_status (`stock_change_reason_id`,`status`,`shop_id`) + values (#{stockChangeReasonStatus.stockChangeReasonId},#{stockChangeReasonStatus.status},#{stockChangeReasonStatus.shopId}); + + + update stock_change_reason_status + + + `status` = #{stockChangeReasonStatus.status}, + + + where stock_change_reason_status_id = #{stockChangeReasonStatus.stockChangeReasonStatusId} and `shop_id` = #{stockChangeReasonStatus.shopId} + + + delete from stock_change_reason_status where stock_change_reason_status_id = #{stockChangeReasonStatusId} + + + diff --git a/tmerclub-product/src/main/resources/mapper/StockPointSkuMapper.xml b/tmerclub-product/src/main/resources/mapper/StockPointSkuMapper.xml new file mode 100644 index 0000000..2c1579f --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/StockPointSkuMapper.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + `stock_point_sku_id`,`stock_point_id`,`stock_point_type`,`spu_id`,`sku_id`,`supplier_sku_id`,`status`,`create_time`,`update_time`,`type`,`stock_mode` + + + + + insert into stock_point_sku (`stock_point_id`,`stock_point_type`,`spu_id`,`sku_id`,`supplier_sku_id`,`status`,`stock_mode`) + values (#{stockPointSku.stockPointId},#{stockPointSku.stockPointType},#{stockPointSku.spuId},#{stockPointSku.skuId},#{stockPointSku.supplierSkuId},#{stockPointSku.status},#{stockPointSku.stockMode}); + + + update stock_point_sku + + + `sku_id` = #{stockPointSku.skuId}, + + + `supplier_sku_id` = #{stockPointSku.supplierSkuId}, + + + `status` = #{stockPointSku.status}, + + + `stock_mode` = #{stockPointSku.stockMode}, + + + where stock_point_sku_id = #{stockPointSku.stockPointSkuId} + + + + delete from stock_point_sku where stock_point_sku_id = #{stockPointSkuId} + + + + DELETE FROM + `stock_point_sku` + WHERE + `stock_point_sku_id` IN + + #{stockPointSkuId} + + + + + delete from stock_point_sku where spu_id = #{spuId} + + + + + + delete from stock_point_sku where stock_point_sku_id in + + #{stockPointSkuId} + + + + + + + + + delete from stock_point_sku where sku_id = #{skuId} and stock_point_id = #{stockPointId} + + + + + + + + update stock_point_sku set stock_mode = #{stockMode} where stock_point_id = #{stockPointId} + + diff --git a/tmerclub-product/src/main/resources/mapper/TakeStockMapper.xml b/tmerclub-product/src/main/resources/mapper/TakeStockMapper.xml new file mode 100644 index 0000000..05dcaff --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/TakeStockMapper.xml @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `take_stock_id`,`take_stock_no`,`bill_status`,`maker`,`create_time`,`stock_region_name`,`remark`,`shop_id`,`maker_mobile`,`warehouse_id`,`stock_point_type` + + + + + insert into take_stock (`take_stock_no`,`bill_status`,`maker`,`stock_region_name`,`remark`,`shop_id`,`maker_mobile`, `warehouse_id`, `stock_point_type`) + values (#{takeStock.takeStockNo},#{takeStock.billStatus},#{takeStock.maker},#{takeStock.stockRegionName}, + #{takeStock.remark},#{takeStock.shopId},#{takeStock.makerMobile},#{takeStock.warehouseId},#{takeStock.stockPointType}); + + + update take_stock + + + `take_stock_no` = #{takeStock.takeStockNo}, + + + `bill_status` = #{takeStock.billStatus}, + + + `maker` = #{takeStock.maker}, + + + `stock_region_name` = #{takeStock.stockRegionName}, + + + `remark` = #{takeStock.remark}, + + + `shop_id` = #{takeStock.shopId}, + + + `maker_mobile` = #{takeStock.makerMobile}, + + + where take_stock_id = #{takeStock.takeStockId} + + + delete from take_stock where take_stock_id = #{takeStockId} + + + + ts.`shop_id` = #{takeStockDTO.shopId} + + AND sl.`spu_name` LIKE CONCAT( "%", #{takeStockDTO.spuName}, "%" ) + + + AND ts.`take_stock_no` LIKE CONCAT( "%", #{takeStockDTO.takeStockNo}, "%" ) + + + AND ts.`bill_status` = #{takeStockDTO.billStatus} + + + AND ts.`create_time` >= #{takeStockDTO.createStartTime} + + + AND ts.`create_time` <= #{takeStockDTO.createEndTime} + + + AND ts.`maker` = #{takeStockDTO.maker} + + + AND ts.`take_stock_id` = #{takeStockDTO.takeStockId} + + + AND s.`party_code` LIKE CONCAT( '%', #{takeStockDTO.partyCode}, '%' ) + + + + + + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/TakeStockSpuMapper.xml b/tmerclub-product/src/main/resources/mapper/TakeStockSpuMapper.xml new file mode 100644 index 0000000..d05f574 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/TakeStockSpuMapper.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + `take_stock_spu_id`,`take_stock_id`,`spu_id`,`sku_id`,`stocks`,`total_stock`,`io_type`,`remark`,`exception_reason` + + + + + + + + insert into take_stock_spu (`take_stock_id`,`spu_id`,`sku_id`,`stocks`,`total_stock`,`io_type`,`remark`,`exception_reason`) + values (#{takeStockSpu.takeStockId},#{takeStockSpu.spuId},#{takeStockSpu.skuId},#{takeStockSpu.stocks},#{takeStockSpu.totalStock},#{takeStockSpu.ioType},#{takeStockSpu.remark},#{takeStockSpu.exceptionReason}); + + + + INSERT INTO `take_stock_spu` (`take_stock_id`,`spu_id`,`sku_id`,`stocks`,`total_stock`,`io_type`,`remark`,`exception_reason`) + VALUES + + ( + #{takeStockSpu.takeStockId}, + #{takeStockSpu.spuId}, + #{takeStockSpu.skuId}, + #{takeStockSpu.stocks}, + #{takeStockSpu.totalStock}, + #{takeStockSpu.ioType}, + #{takeStockSpu.remark}, + #{takeStockSpu.exceptionReason} + ) + + + + + update take_stock_spu + + + `take_stock_id` = #{takeStockSpu.takeStockId}, + + + `spu_id` = #{takeStockSpu.spuId}, + + + `sku_id` = #{takeStockSpu.skuId}, + + + `stocks` = #{takeStockSpu.stocks}, + + + `total_stock` = #{takeStockSpu.totalStock}, + + + `io_type` = #{takeStockSpu.ioType}, + + + `remark` = #{takeStockSpu.remark}, + + + `exception_reason` = #{takeStockSpu.exceptionReason}, + + + where take_stock_spu_id = #{takeStockSpu.takeStockSpuId} + + + + delete from take_stock_spu where take_stock_spu_id = #{takeStockSpuId} + + + + DELETE + FROM + `take_stock_spu` + WHERE + take_stock_id = #{takeStockId} + + + diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/SearchApplication.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/SearchApplication.java new file mode 100644 index 0000000..7a49c22 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/SearchApplication.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search; + +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.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; + +/** + * @author FrozenWatermelon + * @date 2020/09/24 + */ +@SpringBootApplication(scanBasePackages = "com.moyuer.cloud", exclude = {UserDetailsServiceAutoConfiguration.class, DataSourceAutoConfiguration.class}) +@EnableDubbo(scanBasePackages = "com.moyuer.cloud.**.feign") +public class SearchApplication { + + public static void main(String[] args) { + SpringApplication.run(SearchApplication.class, args); + } + + +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/BrandBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/BrandBO.java new file mode 100644 index 0000000..19a1035 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/BrandBO.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 品牌信息 + * + * @author YXF + * @date 2020-12-23 15:27:24 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_product", table = "brand", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class BrandBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * brand_id + */ + private Long brandId; + + /** + * 品牌名称 + */ + private String name; + + /** + * 品牌描述 + */ + private String desc; + + /** + * 品牌logo图片 + */ + private String imgUrl; + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + @Override + public String toString() { + return "BrandBO{" + + "brandId=" + brandId + + ", name='" + name + '\'' + + ", desc='" + desc + '\'' + + ", imgUrl='" + imgUrl + '\'' + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/CategoryBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/CategoryBO.java new file mode 100644 index 0000000..a023f98 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/CategoryBO.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分类信息 + * + * @author YXF + * @date 2020-12-23 15:27:24 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_product", table = "category", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class CategoryBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分类id + */ + private Long categoryId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 父ID + */ + private Long parentId; + + /** + * 分类名称 + */ + private String name; + + /** + * 分类描述 + */ + private String desc; + + /** + * 分类地址{parent_id}-{child_id},... + */ + private String path; + + /** + * 状态 1:enable, 0:disable, -1:deleted + */ + private Integer status; + + /** + * 分类图标 + */ + private String icon; + + /** + * 分类的显示图片 + */ + private String imgUrl; + + /** + * 分类层级 从0开始 + */ + private Integer level; + + /** + * 排序 + */ + private Integer seq; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "CategoryBO{" + + "categoryId=" + categoryId + + ", shopId=" + shopId + + ", parentId=" + parentId + + ", name='" + name + '\'' + + ", desc='" + desc + '\'' + + ", path='" + path + '\'' + + ", status=" + status + + ", icon='" + icon + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", level=" + level + + ", seq=" + seq + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/DistributionInfoBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/DistributionInfoBO.java new file mode 100644 index 0000000..4fcc479 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/DistributionInfoBO.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author lth + * @Date 2021/8/9 16:55 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_marketing", table = "distribution_spu", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class DistributionInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分销商品表id + */ + private Long distributionSpuId; + + /** + * 状态(0:商家下架 1:商家上架 2:违规下架 3:平台审核) + */ + private Integer state; + + /** + * 商品id + */ + private Long spuId; + + /** + * 奖励方式(0 按比例 1 按固定数值) + */ + private Integer awardMode; + + /** + * 上级奖励设置(0 关闭 1开启) + */ + private Integer parentAwardSet; + + /** + * 奖励数额(奖励方式为0时,代表百分比*100,为1时代表实际奖励金额*100) + */ + private Long awardNumbers; + + /** + * 上级奖励数额(奖励方式为0时,表示百分比*100,为1时代表实际奖励金额*100) + */ + private Long parentAwardNumbers; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getDistributionSpuId() { + return distributionSpuId; + } + + public void setDistributionSpuId(Long distributionSpuId) { + this.distributionSpuId = distributionSpuId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getAwardMode() { + return awardMode; + } + + public void setAwardMode(Integer awardMode) { + this.awardMode = awardMode; + } + + public Integer getParentAwardSet() { + return parentAwardSet; + } + + public void setParentAwardSet(Integer parentAwardSet) { + this.parentAwardSet = parentAwardSet; + } + + public Long getAwardNumbers() { + return awardNumbers; + } + + public void setAwardNumbers(Long awardNumbers) { + this.awardNumbers = awardNumbers; + } + + public Long getParentAwardNumbers() { + return parentAwardNumbers; + } + + public void setParentAwardNumbers(Long parentAwardNumbers) { + this.parentAwardNumbers = parentAwardNumbers; + } + + @Override + public String toString() { + return "DistributionInfoBO{" + + "distributionSpuId=" + distributionSpuId + + ", state=" + state + + ", spuId=" + spuId + + ", awardMode=" + awardMode + + ", parentAwardSet=" + parentAwardSet + + ", awardNumbers=" + awardNumbers + + ", parentAwardNumbers=" + parentAwardNumbers + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/OrderBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/OrderBO.java new file mode 100644 index 0000000..9c0b2cc --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/OrderBO.java @@ -0,0 +1,610 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.model.BaseModel; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单信息 + * + * @author YXF + * @date 2021-07-07 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_order", table = "order", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class OrderBO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 订单ID + */ + private Long orderId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 用户订单地址Id + */ + private Long orderAddrId; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 总值 + */ + private Long total; + + /** + * 实际总值 + */ + private Long actualTotal; + + /** + * 订单使用积分 + */ + private Long orderScore; + + /** + * 买家备注 + */ + private String remarks; + + /** + * 卖家备注 + */ + private String shopRemarks; + + /** + * 订单状态 1:待付款 2:待发货(待自提) 3:待收货(已发货) 5:成功 6:失败 7:待成团 + */ + private Integer status; + + /** + * 支付方式 请参考枚举PayType + */ + private Integer payType; + + /** + * 配送类型 1:快递 2:自提 3:无需快递 4同城配送 + */ + private Integer deliveryType; + + /** + * 订单类型1团购订单 2秒杀订单 3积分订单 + */ + private Integer orderType; + + /** + * 订单关闭原因 1-超时未支付 2-退款关闭 4-买家取消 15-已通过货到付款交易 + */ + private Integer closeType; + + /** + * 订单商品总数 + */ + private Integer allCount; + + /** + * 付款时间 + */ + private Date payTime; + + /** + * 发货时间 + */ + private Date deliveryTime; + + /** + * 完成时间 + */ + private Date finallyTime; + + /** + * 结算时间 + */ + private Date settledTime; + + /** + * 取消时间 + */ + private Date cancelTime; + + /** + * 预售发货时间 + */ + private Date bookTime; + + /** + * 是否已支付,1.已支付0.未支付 + */ + private Integer isPayed; + + /** + * 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除 + */ + private Integer deleteStatus; + + /** + * 订单退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败) + */ + private Integer refundStatus; + + /** + * 订单运费 + */ + private Long freightAmount; + + /** + * 积分抵扣金额 + */ + private Long scoreAmount; + + /** + * 会员折扣金额 + */ + private Long memberAmount; + + /** + * 平台优惠券优惠金额 + */ + private Long platformCouponAmount; + + /** + * 商家优惠券优惠金额 + */ + private Long shopCouponAmount; + + /** + * 满减优惠金额 + */ + private Long discountAmount; + + /** + * 分销佣金 + */ + private Long distributionAmount; + /** + * 平台优惠金额 + */ + private Long platformAmount; + + /** + * 运费减免金额 + */ + private Long freeFreightAmount; + + /** + * 平台运费减免金额 + */ + private Long platformFreeFreightAmount; + + /** + * 店铺改价优惠金额 + */ + private Long shopChangeFreeAmount; + + /** + * 优惠总额 + */ + private Long reduceAmount; + + /** + * 平台佣金 + */ + private Long platformCommission; + + /** + * 是否已经进行结算 + */ + private Long isSettled; + + /** + * 收货人姓名 + */ + private String consignee; + + /** + * 收货人手机号 + */ + private String mobile; + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderAddrId() { + return orderAddrId; + } + + public void setOrderAddrId(Long orderAddrId) { + this.orderAddrId = orderAddrId; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getShopRemarks() { + return shopRemarks; + } + + public void setShopRemarks(String shopRemarks) { + this.shopRemarks = shopRemarks; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getFinallyTime() { + return finallyTime; + } + + public void setFinallyTime(Date finallyTime) { + this.finallyTime = finallyTime; + } + + public Date getCancelTime() { + return cancelTime; + } + + public void setCancelTime(Date cancelTime) { + this.cancelTime = cancelTime; + } + + public Date getBookTime() { + return bookTime; + } + + public void setBookTime(Date bookTime) { + this.bookTime = bookTime; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Integer getDeleteStatus() { + return deleteStatus; + } + + public void setDeleteStatus(Integer deleteStatus) { + this.deleteStatus = deleteStatus; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Long getScoreAmount() { + return scoreAmount; + } + + public void setScoreAmount(Long scoreAmount) { + this.scoreAmount = scoreAmount; + } + + public Long getMemberAmount() { + return memberAmount; + } + + public void setMemberAmount(Long memberAmount) { + this.memberAmount = memberAmount; + } + + public Long getPlatformCouponAmount() { + return platformCouponAmount; + } + + public void setPlatformCouponAmount(Long platformCouponAmount) { + this.platformCouponAmount = platformCouponAmount; + } + + public Long getShopCouponAmount() { + return shopCouponAmount; + } + + public void setShopCouponAmount(Long shopCouponAmount) { + this.shopCouponAmount = shopCouponAmount; + } + + public Long getDiscountAmount() { + return discountAmount; + } + + public void setDiscountAmount(Long discountAmount) { + this.discountAmount = discountAmount; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public Long getShopChangeFreeAmount() { + return shopChangeFreeAmount; + } + + public void setShopChangeFreeAmount(Long shopChangeFreeAmount) { + this.shopChangeFreeAmount = shopChangeFreeAmount; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + public Long getIsSettled() { + return isSettled; + } + + public void setIsSettled(Long isSettled) { + this.isSettled = isSettled; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Date getSettledTime() { + return settledTime; + } + + public void setSettledTime(Date settledTime) { + this.settledTime = settledTime; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @Override + public String toString() { + return "Order{" + + "orderId=" + orderId + + ", shopId=" + shopId + + ", userId=" + userId + + ", orderAddrId=" + orderAddrId + + ", shopName='" + shopName + '\'' + + ", total=" + total + + ", actualTotal=" + actualTotal + + ", orderScore=" + orderScore + + ", remarks='" + remarks + '\'' + + ", shopRemarks='" + shopRemarks + '\'' + + ", status=" + status + + ", payType=" + payType + + ", deliveryType=" + deliveryType + + ", orderType=" + orderType + + ", closeType=" + closeType + + ", allCount=" + allCount + + ", payTime=" + payTime + + ", deliveryTime=" + deliveryTime + + ", finallyTime=" + finallyTime + + ", settledTime=" + settledTime + + ", cancelTime=" + cancelTime + + ", bookTime=" + bookTime + + ", isPayed=" + isPayed + + ", deleteStatus=" + deleteStatus + + ", refundStatus=" + refundStatus + + ", freightAmount=" + freightAmount + + ", scoreAmount=" + scoreAmount + + ", memberAmount=" + memberAmount + + ", platformCouponAmount=" + platformCouponAmount + + ", shopCouponAmount=" + shopCouponAmount + + ", discountAmount=" + discountAmount + + ", distributionAmount=" + distributionAmount + + ", platformAmount=" + platformAmount + + ", freeFreightAmount=" + freeFreightAmount + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", shopChangeFreeAmount=" + shopChangeFreeAmount + + ", reduceAmount=" + reduceAmount + + ", platformCommission=" + platformCommission + + ", isSettled=" + isSettled + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/OrderInvoiceBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/OrderInvoiceBO.java new file mode 100644 index 0000000..1dfc654 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/OrderInvoiceBO.java @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.model.BaseModel; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单发票信息 + * + * @author YXF + * @date 2022-11-11 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_order", table = "order_invoice", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class OrderInvoiceBO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 订单发票ID + */ + private Long orderInvoiceId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 发票类型 1.电子普通发票 + */ + private Integer invoiceType; + + /** + * 抬头类型 1.单位 2.个人 + */ + private Integer headerType; + + /** + * 抬头名称 + */ + private String headerName; + + /** + * 发票税号 + */ + private String invoiceTaxNumber; + + /** + * 发票内容 1.商品明细 + */ + private Integer invoiceContext; + + /** + * 发票状态 1.申请中 2.已开票 + */ + private Integer invoiceState; + + /** + * 文件id + */ + private Long fileId; + + /** + * 申请时间 + */ + private Date applicationTime; + + /** + * 上传时间 + */ + private Date uploadTime; + + private Integer orderStatus; + + public Long getOrderInvoiceId() { + return orderInvoiceId; + } + + public void setOrderInvoiceId(Long orderInvoiceId) { + this.orderInvoiceId = orderInvoiceId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getInvoiceType() { + return invoiceType; + } + + public void setInvoiceType(Integer invoiceType) { + this.invoiceType = invoiceType; + } + + public Integer getHeaderType() { + return headerType; + } + + public void setHeaderType(Integer headerType) { + this.headerType = headerType; + } + + public String getHeaderName() { + return headerName; + } + + public void setHeaderName(String headerName) { + this.headerName = headerName; + } + + public String getInvoiceTaxNumber() { + return invoiceTaxNumber; + } + + public void setInvoiceTaxNumber(String invoiceTaxNumber) { + this.invoiceTaxNumber = invoiceTaxNumber; + } + + public Integer getInvoiceContext() { + return invoiceContext; + } + + public void setInvoiceContext(Integer invoiceContext) { + this.invoiceContext = invoiceContext; + } + + public Integer getInvoiceState() { + return invoiceState; + } + + public void setInvoiceState(Integer invoiceState) { + this.invoiceState = invoiceState; + } + + public Long getFileId() { + return fileId; + } + + public void setFileId(Long fileId) { + this.fileId = fileId; + } + + public Date getApplicationTime() { + return applicationTime; + } + + public void setApplicationTime(Date applicationTime) { + this.applicationTime = applicationTime; + } + + public Date getUploadTime() { + return uploadTime; + } + + public void setUploadTime(Date uploadTime) { + this.uploadTime = uploadTime; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + @Override + public String toString() { + return "OrderInvoiceBO{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", orderInvoiceId=" + orderInvoiceId + + ", orderId=" + orderId + + ", shopId=" + shopId + + ", invoiceType=" + invoiceType + + ", headerType=" + headerType + + ", headerName='" + headerName + '\'' + + ", invoiceTaxNumber='" + invoiceTaxNumber + '\'' + + ", invoiceContext=" + invoiceContext + + ", invoiceState=" + invoiceState + + ", fileId=" + fileId + + ", applicationTime=" + applicationTime + + ", uploadTime=" + uploadTime + + ", orderStatus=" + orderStatus + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/OrderRefundBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/OrderRefundBO.java new file mode 100644 index 0000000..99e8379 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/OrderRefundBO.java @@ -0,0 +1,607 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.model.BaseModel; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单退款记录信息 + * + * @author YXF + * @date 2022/8/23 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_order", table = "order_refund", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class OrderRefundBO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 退款记录ID + */ + private Long refundId; + + /** + * 店铺ID + */ + private Long shopId; + /** + * 供应商id + */ + private Long supplierId; + + /** + * 买家ID + */ + private Long userId; + + /** + * 订单号 + */ + private Long orderId; + + /** + * 订单项ID(0:为全部订单项) + */ + private Long orderItemId; + + /** + * 退货数量(0:为全部订单项) + */ + private Integer refundCount; + + /** + * 退还积分 + */ + private Long refundScore; + + /** + * 退款金额 + */ + private Long refundAmount; + + /** + * 平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额) + */ + private Long platformRefundAmount; + + /** + * 平台退款佣金 + */ + private Long platformRefundCommission; + + /** + * 退款单总分销金额 + */ + private Long distributionTotalAmount; + + /** + * 退款单类型(1:整单退款,2:单个物品退款) + */ + private Integer refundType; + + /** + * 申请类型:1,仅退款,2退款退货 + */ + private Integer applyType; + + /** + * 是否接收到商品(1:已收到,0:未收到) + */ + private Integer isReceived; + + /** + * 退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭) + */ + private Integer closeType; + + /** + * 处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType + */ + private Integer returnMoneySts; + + /** + * 申请原因 见 BuyerReasonType + */ + private Integer buyerReason; + + /** + * 申请说明 + */ + private String buyerDesc; + + /** + * 联系方式(退款时留下的手机号码) + */ + private String buyerMobile; + + /** + * 文件凭证(逗号隔开) + */ + private String imgUrls; + + /** + * 超时时间(超过该时间不处理,系统将自动处理)(保留字段) + */ + private Date overTime; + + /** + * 拒绝原因 + */ + private String rejectMessage; + + /** + * 卖家备注 + */ + private String sellerMsg; + + /** + * 受理时间 + */ + private Date handelTime; + + /** + * 发货时间 + */ + private Date deliveryTime; + + /** + * 收货时间 + */ + private Date receiveTime; + + /** + * 关闭时间 + */ + private Date closeTime; + + /** + * 确定时间(确定退款时间) + */ + private Date decisionTime; + + /** + * 退款时间 + */ + private Date refundTime; + + /** + * 移交供应商时间 + */ + private Date supplierTime; + + /** + * 供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝 + */ + private Integer supplierHandleStatus; + /** + * 采购退款金额 + */ + private Long purchaseRefundAmount; + /** + * 采购的平台佣金退款金额 + */ + private Long purPlatformRefundCommission; + + /** + * 平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功 + */ + private Integer platformInterventionStatus; + + /** + * 用户申请介入理由 + */ + private String applyInterventionReason; + + /** + * 平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款 + */ + private Integer interventionRefundType; + + /** + * 平台介入前的退款金额 + */ + private Long afterInterventionRefundAmount; + + /** + * 平台留言 + */ + private String platformMessage; + + /** + * 申请介入时间 + */ + private Date applyInterventionTime; + + /** + * 介入完成时间 + */ + private Date interventionFinishTime; + + public Integer getPlatformInterventionStatus() { + return platformInterventionStatus; + } + + public void setPlatformInterventionStatus(Integer platformInterventionStatus) { + this.platformInterventionStatus = platformInterventionStatus; + } + + public String getApplyInterventionReason() { + return applyInterventionReason; + } + + public void setApplyInterventionReason(String applyInterventionReason) { + this.applyInterventionReason = applyInterventionReason; + } + + public Integer getInterventionRefundType() { + return interventionRefundType; + } + + public void setInterventionRefundType(Integer interventionRefundType) { + this.interventionRefundType = interventionRefundType; + } + + public Long getAfterInterventionRefundAmount() { + return afterInterventionRefundAmount; + } + + public void setAfterInterventionRefundAmount(Long afterInterventionRefundAmount) { + this.afterInterventionRefundAmount = afterInterventionRefundAmount; + } + + public String getPlatformMessage() { + return platformMessage; + } + + public void setPlatformMessage(String platformMessage) { + this.platformMessage = platformMessage; + } + + public Date getApplyInterventionTime() { + return applyInterventionTime; + } + + public void setApplyInterventionTime(Date applyInterventionTime) { + this.applyInterventionTime = applyInterventionTime; + } + + public Date getInterventionFinishTime() { + return interventionFinishTime; + } + + public void setInterventionFinishTime(Date interventionFinishTime) { + this.interventionFinishTime = interventionFinishTime; + } + + public Date getSupplierTime() { + return supplierTime; + } + + public void setSupplierTime(Date supplierTime) { + this.supplierTime = supplierTime; + } + + public Long getPurPlatformRefundCommission() { + return purPlatformRefundCommission; + } + + public void setPurPlatformRefundCommission(Long purPlatformRefundCommission) { + this.purPlatformRefundCommission = purPlatformRefundCommission; + } + + public Long getPurchaseRefundAmount() { + return purchaseRefundAmount; + } + + public void setPurchaseRefundAmount(Long purchaseRefundAmount) { + this.purchaseRefundAmount = purchaseRefundAmount; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSupplierHandleStatus() { + return supplierHandleStatus; + } + + public void setSupplierHandleStatus(Integer supplierHandleStatus) { + this.supplierHandleStatus = supplierHandleStatus; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Integer getRefundCount() { + return refundCount; + } + + public void setRefundCount(Integer refundCount) { + this.refundCount = refundCount; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Long getPlatformRefundAmount() { + return platformRefundAmount; + } + + public void setPlatformRefundAmount(Long platformRefundAmount) { + this.platformRefundAmount = platformRefundAmount; + } + + public Long getPlatformRefundCommission() { + return platformRefundCommission; + } + + public void setPlatformRefundCommission(Long platformRefundCommission) { + this.platformRefundCommission = platformRefundCommission; + } + + public Long getDistributionTotalAmount() { + return distributionTotalAmount; + } + + public void setDistributionTotalAmount(Long distributionTotalAmount) { + this.distributionTotalAmount = distributionTotalAmount; + } + + public Integer getRefundType() { + return refundType; + } + + public void setRefundType(Integer refundType) { + this.refundType = refundType; + } + + public Integer getApplyType() { + return applyType; + } + + public void setApplyType(Integer applyType) { + this.applyType = applyType; + } + + public Integer getIsReceived() { + return isReceived; + } + + public void setIsReceived(Integer isReceived) { + this.isReceived = isReceived; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + public Integer getBuyerReason() { + return buyerReason; + } + + public void setBuyerReason(Integer buyerReason) { + this.buyerReason = buyerReason; + } + + public String getBuyerDesc() { + return buyerDesc; + } + + public void setBuyerDesc(String buyerDesc) { + this.buyerDesc = buyerDesc; + } + + public String getBuyerMobile() { + return buyerMobile; + } + + public void setBuyerMobile(String buyerMobile) { + this.buyerMobile = buyerMobile; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public Date getOverTime() { + return overTime; + } + + public void setOverTime(Date overTime) { + this.overTime = overTime; + } + + public String getRejectMessage() { + return rejectMessage; + } + + public void setRejectMessage(String rejectMessage) { + this.rejectMessage = rejectMessage; + } + + public String getSellerMsg() { + return sellerMsg; + } + + public void setSellerMsg(String sellerMsg) { + this.sellerMsg = sellerMsg; + } + + public Date getHandelTime() { + return handelTime; + } + + public void setHandelTime(Date handelTime) { + this.handelTime = handelTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public Date getCloseTime() { + return closeTime; + } + + public void setCloseTime(Date closeTime) { + this.closeTime = closeTime; + } + + public Date getDecisionTime() { + return decisionTime; + } + + public void setDecisionTime(Date decisionTime) { + this.decisionTime = decisionTime; + } + + public Date getRefundTime() { + return refundTime; + } + + public void setRefundTime(Date refundTime) { + this.refundTime = refundTime; + } + + public Long getRefundScore() { + return refundScore; + } + + public void setRefundScore(Long refundScore) { + this.refundScore = refundScore; + } + + @Override + public String toString() { + return "OrderRefundBO{" + + "refundId=" + refundId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", userId=" + userId + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", refundCount=" + refundCount + + ", refundScore=" + refundScore + + ", refundAmount=" + refundAmount + + ", platformRefundAmount=" + platformRefundAmount + + ", platformRefundCommission=" + platformRefundCommission + + ", distributionTotalAmount=" + distributionTotalAmount + + ", refundType=" + refundType + + ", applyType=" + applyType + + ", isReceived=" + isReceived + + ", closeType=" + closeType + + ", returnMoneySts=" + returnMoneySts + + ", buyerReason=" + buyerReason + + ", buyerDesc='" + buyerDesc + '\'' + + ", buyerMobile='" + buyerMobile + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", overTime=" + overTime + + ", rejectMessage='" + rejectMessage + '\'' + + ", sellerMsg='" + sellerMsg + '\'' + + ", handelTime=" + handelTime + + ", deliveryTime=" + deliveryTime + + ", receiveTime=" + receiveTime + + ", closeTime=" + closeTime + + ", decisionTime=" + decisionTime + + ", refundTime=" + refundTime + + ", supplierTime=" + supplierTime + + ", supplierHandleStatus=" + supplierHandleStatus + + ", purchaseRefundAmount=" + purchaseRefundAmount + + ", purPlatformRefundCommission=" + purPlatformRefundCommission + + ", platformInterventionStatus=" + platformInterventionStatus + + ", applyInterventionReason='" + applyInterventionReason + '\'' + + ", interventionRefundType=" + interventionRefundType + + ", afterInterventionRefundAmount=" + afterInterventionRefundAmount + + ", platformMessage='" + platformMessage + '\'' + + ", applyInterventionTime=" + applyInterventionTime + + ", interventionFinishTime=" + interventionFinishTime + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SkuBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SkuBO.java new file mode 100644 index 0000000..7cecab8 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SkuBO.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.model.BaseModel; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * sku信息 + * + * @author FrozenWatermelon + * @date 2020-12-08 15:54:22 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_product", table = "sku", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class SkuBO extends BaseModel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + /** + * 属性id + */ + private Long skuId; + + /** + * SPU id + */ + private Long spuId; + + /** + * 多个销售属性值id逗号分隔 + */ + private String attrs; + + /** + * sku名称 + */ + private String skuName; + + /** + * sku图片 + */ + private String imgUrl; + + /** + * 售价,整数方式保存 + */ + private Long priceFee; + + /** + * 市场价,整数方式保存 + */ + private Long marketPriceFee; + + /** + * 积分价格 + */ + private Long scoreFee; + + /** + * 商品编码 + */ + private String partyCode; + + /** + * 商品条形码 + */ + private String modelId; + + /** + * 商品重量 + */ + private BigDecimal weight; + + /** + * 商品体积 + */ + private BigDecimal volume; + + /** + * 状态 1:enable, 0:disable, -1:deleted + */ + private Integer status; + + /** + * 当商品为代销商品时,供应商商品skuid + */ + private Long supplierSkuId; + + /** + * 组合id(组合商品独有) + */ + private Long skuComboId; + + public Long getSkuComboId() { + return skuComboId; + } + + public void setSkuComboId(Long skuComboId) { + this.skuComboId = skuComboId; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getAttrs() { + return attrs; + } + + public void setAttrs(String attrs) { + this.attrs = attrs; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public BigDecimal getWeight() { + return weight; + } + + public void setWeight(BigDecimal weight) { + this.weight = weight; + } + + public BigDecimal getVolume() { + return volume; + } + + public void setVolume(BigDecimal volume) { + this.volume = volume; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getSupplierSkuId() { + return supplierSkuId; + } + + public void setSupplierSkuId(Long supplierSkuId) { + this.supplierSkuId = supplierSkuId; + } + + @Override + public String toString() { + return "SkuBO{" + + "skuId=" + skuId + + ", spuId=" + spuId + + ", attrs='" + attrs + '\'' + + ", skuName='" + skuName + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", scoreFee=" + scoreFee + + ", partyCode='" + partyCode + '\'' + + ", modelId='" + modelId + '\'' + + ", weight=" + weight + + ", volume=" + volume + + ", status=" + status + + ", supplierSkuId=" + supplierSkuId + + ", skuComboId=" + skuComboId + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SkuStockZoneBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SkuStockZoneBO.java new file mode 100644 index 0000000..5789a76 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SkuStockZoneBO.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.model.BaseModel; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 库存分片信息 + * + * @author FrozenWatermelon + * @date 2020-11-11 13:49:06 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_product", table = "sku_stock_zone", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class SkuStockZoneBO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分片id + */ + private Long zoneId; + + /** + * SKU ID + */ + private Long skuId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 分片序号 + */ + private Integer zoneNo; + + /** + * 库存 + */ + private Integer stock; + + public Long getZoneId() { + return zoneId; + } + + public void setZoneId(Long zoneId) { + this.zoneId = zoneId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getZoneNo() { + return zoneNo; + } + + public void setZoneNo(Integer zoneNo) { + this.zoneNo = zoneNo; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + @Override + public String toString() { + return "SkuStockZoneBO{" + + "zoneId=" + zoneId + + ", skuId=" + skuId + + ", spuId=" + spuId + + ", zoneNo=" + zoneNo + + ", stock=" + stock + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SpuExtensionBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SpuExtensionBO.java new file mode 100644 index 0000000..32947b8 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SpuExtensionBO.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商品拓展信息 + * + * @author FrozenWatermelon + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_product", table = "spu_extension", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class SpuExtensionBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品扩展信息表id + */ + private Long spuExtendId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 商品id + */ + private Long spuId; + + /** + * 评论数量 + */ + private Integer commentNum; + + /** + * 销量 + */ + private Integer saleNum; + + /** + * 注水销量 + */ + private Integer waterSoldNum; + + public Integer getWaterSoldNum() { + return waterSoldNum; + } + + public void setWaterSoldNum(Integer waterSoldNum) { + this.waterSoldNum = waterSoldNum; + } + + public Long getSpuExtendId() { + return spuExtendId; + } + + public void setSpuExtendId(Long spuExtendId) { + this.spuExtendId = spuExtendId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getCommentNum() { + return commentNum; + } + + public void setCommentNum(Integer commentNum) { + this.commentNum = commentNum; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "SpuExtensionBO{" + + "spuExtendId=" + spuExtendId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", spuId=" + spuId + + ", commentNum=" + commentNum + + ", saleNum=" + saleNum + + ", waterSoldNum=" + waterSoldNum + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/ProductSearchRequestBuilder.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/ProductSearchRequestBuilder.java new file mode 100644 index 0000000..863d576 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/ProductSearchRequestBuilder.java @@ -0,0 +1,893 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.builder; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.google.common.collect.Maps; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.product.constant.*; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.dto.ProductSearchLimitDTO; +import com.tmerclub.cloud.common.util.BooleanUtil; +import com.tmerclub.cloud.search.constant.*; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.common.lucene.search.function.CombineFunction; +import org.elasticsearch.common.lucene.search.function.FieldValueFactorFunction; +import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.functionscore.FieldValueFactorFunctionBuilder; +import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder; +import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilder; +import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders; +import org.elasticsearch.script.Script; +import org.elasticsearch.search.Scroll; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.nested.NestedAggregationBuilder; +import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; +import org.elasticsearch.search.aggregations.metrics.TopHitsAggregationBuilder; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.NestedSortBuilder; +import org.elasticsearch.search.sort.SortBuilders; +import org.elasticsearch.search.sort.SortOrder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.*; + + +/** + * @author FrozenWatermelon + * @date 2020/11/16 + */ +@Component +public class ProductSearchRequestBuilder { + + private static final Logger log = LoggerFactory.getLogger(ProductSearchRequestBuilder.class); + + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param pageDTO 分页数据 + * @param productSearchDTO 商品搜索条件 + * @param isAgg true:聚合搜索 false:非聚合搜索 null:非聚合搜索 + * @return 搜索结果 + */ + public SearchResponse pageSearchResult(EsPageDTO pageDTO, ProductSearchDTO productSearchDTO, Boolean isAgg) { + //1、准备检索请求 + SearchRequest searchRequest = buildSearchRequest(pageDTO, productSearchDTO, isAgg); + return EsSearchUtil.search(searchRequest); + } + + /** + * 准备检索请求 + * + * @param pageDTO 分页参数 + * @param param 搜索参数 + * @param isAgg true:聚合搜索 false:非聚合搜索 null:非聚合搜索 + * @return + */ + private SearchRequest buildSearchRequest(EsPageDTO pageDTO, ProductSearchDTO param, Boolean isAgg) { + if (Objects.isNull(param.getAppDisplay())) { + param.setAppDisplay(Boolean.FALSE); + } + + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + Integer lang = I18nMessage.getLang(); + + // 指定返回数组中的字段 + if (ArrayUtil.isNotEmpty(param.getFetchSource())) { + searchSourceBuilder.fetchSource(param.getFetchSource(), null); + } else { + searchSourceBuilder.fetchSource(EsConstant.APP_FETCH_SOURCE, null); + } + + // 构建bool-query + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + + // 过滤 + filterQueryIfNecessary(param, boolQueryBuilder, lang); + + // 关键字搜索 + keywordSearch(param, boolQueryBuilder, lang); + + // 排序 + sort(param, searchSourceBuilder, boolQueryBuilder, lang); + + //分页 + if (Objects.nonNull(pageDTO)) { + searchSourceBuilder.from((pageDTO.getPageNum() - 1) * pageDTO.getPageSize()); + searchSourceBuilder.size(pageDTO.getPageSize()); + } + + // 进行聚合分析 + agg(param, searchSourceBuilder, isAgg); + + log.info("构建的DSL语句 {}", searchSourceBuilder); + + return new SearchRequest(new String[]{EsIndexEnum.PRODUCT.value()}, searchSourceBuilder); + } + + public SearchRequest buildScrollSearchRequest(ProductSearchDTO param, Scroll scroll) { + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + // 构建bool-query + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + Integer lang = Objects.nonNull(param.getLang()) ? param.getLang() : I18nMessage.getLang(); + // 指定返回数组中的字段 + if (ArrayUtil.isNotEmpty(param.getFetchSource())) { + searchSourceBuilder.fetchSource(param.getFetchSource(), null); + } + // 过滤 + filterQueryIfNecessary(param, boolQueryBuilder, lang); + + // 关键字搜索 + keywordSearch(param, boolQueryBuilder, lang); + + // 排序 + sort(param, searchSourceBuilder, boolQueryBuilder, lang); + + searchSourceBuilder.query(boolQueryBuilder); + //设置最多一次能够取出100笔数据,从第101笔数据开始,将开启滚动查询 + //PS:滚动查询也属于这一次查询,只不过因为一次查不完,分多次查 + searchSourceBuilder.size(EsConstant.MAX_PAGE_SIZE); + + log.info("构建滚动查询的DSL语句 {}", searchSourceBuilder); + + return new SearchRequest(new String[]{EsIndexEnum.PRODUCT.value()}, searchSourceBuilder).scroll(scroll); + } + + /** + * 聚合分析 + */ + private void agg(ProductSearchDTO param, SearchSourceBuilder searchSourceBuilder, Boolean isAgg) { + // 店铺进行聚合 + if (param.getKeyword() != null && param.getKeyword().length() > 0) { + searchSourceBuilder.aggregation(AggregationBuilders.terms(EsConstant.SHOP).field(EsConstant.SHOP_ID).size(1)); + } + if (Objects.isNull(isAgg) || !isAgg) { + return; + } + // 品牌聚合 + searchSourceBuilder.aggregation(EsSearchUtil.nestedAggregation(EsConstant.BRAND, EsConstant.BRAND_UNION_ID, EsConstant.BRAND_ID, EsConstant.BRAND_INCLUDE)); + + // 搜索平台商品,按照平台分类信息进行聚合 + if (Objects.isNull(param.getShopId()) && Objects.isNull(param.getCategoryId())) { + searchSourceBuilder.aggregation(EsSearchUtil.nestedAggregation(EsConstant.CATEGORY, EsConstant.CATEGORY_UNION_ID, EsConstant.CATEGORY_ID, EsConstant.CATEGORY_INCLUDE)); + } + // 搜索店铺中的商品,按照店铺分类信息进行聚合 + else if (Objects.nonNull(param.getShopId()) && Objects.isNull(param.getShopSecondaryCategoryId())) { + searchSourceBuilder.aggregation(EsSearchUtil.nestedAggregation(EsConstant.SHOP_CATEGORY, EsConstant.SHOP_CATEGORY_UNION_ID, EsConstant.SHOP_CATEGORY_ID, EsConstant.CATEGORY_INCLUDE)); + } + + // 按照属性信息进行聚合 + NestedAggregationBuilder attrs = AggregationBuilders.nested(EsConstant.ATTRS, EsConstant.ATTRS); + + // 按照属性ID进行聚合 + TermsAggregationBuilder attrIds = AggregationBuilders.terms(EsConstant.ATTR_IDS).field(EsConstant.ATTR_UNION_ID).size(10); + attrs.subAggregation(attrIds); + TermsAggregationBuilder attrValueIds = AggregationBuilders.terms(EsConstant.ATTR_VALUE_IDS).field(EsConstant.ATTR_ATTR_VALUE_ID).size(10); + attrIds.subAggregation(attrValueIds); + + attrValueIds.subAggregation(AggregationBuilders + .topHits(EsConstant.TOP_HITS_DATA) + .fetchSource(EsConstant.ATTR_INCLUDE, null) + .sort(EsConstant.ATTR_UNION_VALUE_ZH, SortOrder.ASC) + .size(1)); + + searchSourceBuilder.aggregation(attrs); + } + + /** + * 关键字搜索 + */ + private void keywordSearch(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder, Integer lang) { + if (StrUtil.isBlank(param.getKeyword())) { + return; + } + // 创建查询语句 ES中must和should不能同时使用 同时使用should失效 嵌套多个must 将should条件拼接在一个must中即可 + BoolQueryBuilder keywordShouldQuery = QueryBuilders.boolQuery(); + // 商家、平台端商品名称模糊搜索 + if (Objects.isNull(param.getAppDisplay()) || !param.getAppDisplay()) { + if (Objects.equals(lang, LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + keywordShouldQuery.should(QueryBuilders.wildcardQuery(EsConstant.SPU_NAME_LIKE_ZH, "*" + param.getKeyword() + "*")); + } else { + keywordShouldQuery.should(QueryBuilders.wildcardQuery(EsConstant.SPU_NAME_LIKE_EN, "*" + param.getKeyword() + "*")); + } + } + // 用户端商品名称分词搜索 + else { + // 提升商品名称搜索的权重 + if (Objects.equals(lang, LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + keywordShouldQuery.should(QueryBuilders.matchQuery(EsConstant.SPU_NAME_ZH, param.getKeyword()).boost(10)); + } else { + keywordShouldQuery.should(QueryBuilders.matchQuery(EsConstant.SPU_NAME_EN, param.getKeyword()).boost(10)); + } + + if (param.getKeyword().length() > 1) { + // 卖点,不分词 + if (Objects.equals(lang, LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + keywordShouldQuery.should(QueryBuilders.matchPhraseQuery(EsConstant.SELLING_POINT_ZH, param.getKeyword()).boost(2)); + } else { + keywordShouldQuery.should(QueryBuilders.matchPhraseQuery(EsConstant.SELLING_POINT_EN, param.getKeyword()).boost(2)); + } + } + } + boolQueryBuilder.must(keywordShouldQuery); + } + + /** + * 进行排序 + */ + private void sort(ProductSearchDTO param, SearchSourceBuilder searchSourceBuilder, BoolQueryBuilder boolQueryBuilder, Integer lang) { + // 如果是分组搜索,默认排序方式为分组序号倒序(用户端) + if (Objects.nonNull(param.getTagId()) && Objects.isNull(param.getSort())) { + searchSourceBuilder.sort(SortBuilders.fieldSort(EsProductSortEnum.SPU_TAG_DESC.param()) + .order(EsProductSortEnum.SPU_TAG_DESC.order()) + .setNestedSort(new NestedSortBuilder(EsConstant.TAGS))); + searchSourceBuilder.sort(EsProductSortEnum.SALE_NUM_DESC.param(), EsProductSortEnum.SALE_NUM_DESC.order()); + searchSourceBuilder.query(boolQueryBuilder); + return; + } + + // 用户端、商家端、平台端自定义排序 + if (Objects.nonNull(param.getSort())) { + if (Objects.equals(param.getSort(), EsProductSortEnum.NON_SORT.value())) { + // 不进行任何排序 + searchSourceBuilder.query(boolQueryBuilder); + return; + } + for (EsProductSortEnum enumValue : EsProductSortEnum.values()) { + if (!Objects.equals(enumValue.value(), param.getSort())) { + continue; + } + searchSourceBuilder.sort(enumValue.param(), enumValue.order()); + } + //封装所有的查询条件(没有function score) + searchSourceBuilder.query(boolQueryBuilder); + return; + } + + // 用户端关键字排序 -- 没有指定排序规则,且是关键字搜索的查询,统一按关键字优先排序(防止关键字搜素时,关键字的商品没有优先显示) + if (StrUtil.isNotBlank(param.getKeyword()) && param.getAppDisplay()) { + this.keywordSort(param, searchSourceBuilder, boolQueryBuilder, lang); + return; + } + + // 平台、商家端的店铺名称、商品名称搜索排序 + if (StrUtil.isNotBlank(param.getKeyword()) || StrUtil.isNotBlank(param.getShopName())) { + if (StrUtil.isNotBlank(param.getKeyword())) { + this.keywordLikeSort(param, searchSourceBuilder, boolQueryBuilder, lang); + return; + } + // 平台、商家端的店铺名称、商品名称搜索 + this.shopNameSort(param, searchSourceBuilder, boolQueryBuilder); + return; + } + + + // 商家、平台默认排序--商品序号 倒序, 创建时间 倒序 + if (Objects.nonNull(param.getShopId())) { + if (Objects.isNull(param.getShopQuerySupplierSpu()) || Objects.equals(param.getShopQuerySupplierSpu(), false)) { + // 商家端优先显示序号大的商品, 再到实际销量倒序 + searchSourceBuilder.sort(EsProductSortEnum.SEQ_DESC.param(), EsProductSortEnum.SEQ_DESC.order()); + } + } else { + boolean isTop = Objects.isNull(param.getSupplierId()) && (Objects.isNull(param.getShopQuerySupplierSpu()) || Objects.equals(param.getShopQuerySupplierSpu(), false)); + if (isTop) { + // 平台端优先置顶的商品, 再到销量(实际销量+注水销量) + searchSourceBuilder.sort(EsProductSortEnum.IS_TOP_DESC.param(), EsProductSortEnum.IS_TOP_DESC.order()); + searchSourceBuilder.sort(EsProductSortEnum.SALE_NUM_DESC.param(), EsProductSortEnum.SALE_NUM_DESC.order()); + } + } + searchSourceBuilder.sort(EsProductSortEnum.CREATE_TIME_DESC.param(), EsProductSortEnum.CREATE_TIME_DESC.order()); + searchSourceBuilder.query(boolQueryBuilder); + + + } + + private void keywordLikeSort(ProductSearchDTO param, SearchSourceBuilder searchSourceBuilder, BoolQueryBuilder boolQueryBuilder, Integer lang) { + List filterFunctionBuilders = new ArrayList<>(); + String name; + if (Objects.equals(lang, LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + name = EsConstant.SPU_NAME_LIKE_ZH; + } else { + name = EsConstant.SPU_NAME_LIKE_EN; + } + // 商品名称完全匹配 + filterFunctionBuilders.add( + new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.wildcardQuery(name, param.getKeyword()), ScoreFunctionBuilders.weightFactorFunction(1000)) + ); + // 商品名称前缀匹配 + filterFunctionBuilders.add( + new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.wildcardQuery(name, param.getKeyword() + "*"), ScoreFunctionBuilders.weightFactorFunction(500)) + ); + // 商品名称优先前缀匹配 + filterFunctionBuilders.add( + new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.wildcardQuery(name, "?" + param.getKeyword() + "*"), ScoreFunctionBuilders.weightFactorFunction(200)) + ); + FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQueryBuilder, ArrayUtil.toArray(filterFunctionBuilders, FunctionScoreQueryBuilder.FilterFunctionBuilder.class)) + .scoreMode(FunctionScoreQuery.ScoreMode.SUM).boostMode(CombineFunction.SUM); + // 封装所有的查询条件(带有function score) + searchSourceBuilder.query(functionScoreQueryBuilder); + } + /** + * 关键字搜索排序 + * @param param + * @param searchSourceBuilder + * @param boolQueryBuilder + */ + private void shopNameSort(ProductSearchDTO param, SearchSourceBuilder searchSourceBuilder, BoolQueryBuilder boolQueryBuilder) { + List filterFunctionBuilders = new ArrayList<>(); + // 关键字搜索,优先匹配 + filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder( + QueryBuilders.multiMatchQuery(EsConstant.SHOP_NAME, param.getShopName()).minimumShouldMatch("100%"), + ScoreFunctionBuilders.weightFactorFunction(100) + )); + + filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder( + QueryBuilders.multiMatchQuery(EsConstant.SHOP_NAME, param.getShopName()).minimumShouldMatch("70%"), + ScoreFunctionBuilders.weightFactorFunction(100) + )); + FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQueryBuilder, ArrayUtil.toArray(filterFunctionBuilders, FunctionScoreQueryBuilder.FilterFunctionBuilder.class)) + .scoreMode(FunctionScoreQuery.ScoreMode.SUM).boostMode(CombineFunction.SUM); + // 封装所有的查询条件(带有function score) + searchSourceBuilder.query(functionScoreQueryBuilder); + } + + private void keywordSort(ProductSearchDTO param, SearchSourceBuilder searchSourceBuilder, BoolQueryBuilder boolQueryBuilder, Integer lang) { + List filterFunctionBuilders = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 关键字搜索,优先匹配 + if (StrUtil.isNotBlank(param.getKeyword())) { + FunctionScoreQueryBuilder.FilterFunctionBuilder spuName; + if (Objects.equals(lang, LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + spuName = new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery(EsConstant.SPU_NAME_ZH, param.getKeyword()), ScoreFunctionBuilders.weightFactorFunction(1000)); + } else { + spuName = new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery(EsConstant.SPU_NAME_EN, param.getKeyword()), ScoreFunctionBuilders.weightFactorFunction(1000)); + } + filterFunctionBuilders.add(spuName); + } + + + // 用户端默认排序优先使用是否置顶参数 + FunctionScoreQueryBuilder.FilterFunctionBuilder isTop = new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery(EsConstant.IS_TOP, 10), ScoreFunctionBuilders.weightFactorFunction(100)); + filterFunctionBuilders.add(isTop); + + // 评论数 log1p + ScoreFunctionBuilder commentNumScoreFunction = new FieldValueFactorFunctionBuilder(EsConstant.COMMENT_NUM).modifier(FieldValueFactorFunction.Modifier.LOG1P).factor(0.5f); + filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(commentNumScoreFunction)); + // 销量数 square(出现负数销量,导致评分负数,使用平方解决负数评分) + ScoreFunctionBuilder saleNumScoreFunction = new FieldValueFactorFunctionBuilder(EsConstant.SALE_NUM).modifier(FieldValueFactorFunction.Modifier.SQUARE).factor(0.5f); + filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(saleNumScoreFunction)); + + FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQueryBuilder, ArrayUtil.toArray(filterFunctionBuilders, FunctionScoreQueryBuilder.FilterFunctionBuilder.class)) + .scoreMode(FunctionScoreQuery.ScoreMode.SUM).boostMode(CombineFunction.SUM); + + // 封装所有的查询条件(带有function score) + searchSourceBuilder.query(functionScoreQueryBuilder) + .sort(EsConstant.SCORE, SortOrder.DESC); + } + + /** + * 过滤查询条件,如果有必要的话 + * + * @param param 查询条件 + * @param boolQueryBuilder 组合进boolQueryBuilder + * @param lang 当前语言 + */ + private void filterQueryIfNecessary(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder, Integer lang) { + + // 用户端搜索 + if (param.getAppDisplay()) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.APP_DISPLAY, param.getAppDisplay())); + List supplierSpuType = new ArrayList<>(Constant.INITIAL_CAPACITY); + //过滤掉供应商商品, + supplierSpuType.add(0L); + supplierSpuType.add(2L); + boolQueryBuilder.filter(QueryBuilders.termsQuery(EsConstant.SUPPLIER_SPU_TYPE, supplierSpuType)); + //用户端过滤活动商品 + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.SPU_TYPE, SpuType.ACTIVE.value())); + } + + //供应商商品类型 + supplierSpuTypeFilterQuery(param, boolQueryBuilder); + + //供应商id过滤 + supplierIdFilterQuery(param, boolQueryBuilder); + + // 名称(店铺名称) + nameSearch(param, boolQueryBuilder, lang); + + // 商品(状态、库存、商品类型、商品id、商品id列表、商品编码、商品条形码、配送自提) + spuFilterQuery(param, boolQueryBuilder); + + // 分类(商家一二级分类,平台一二三级分类) + categoryFilterQuery(param, boolQueryBuilder); + + // 活动 (活动商品id、 活动时间、 秒杀活动商品、 分销商品) + activityFilterQuery(param, boolQueryBuilder); + + // 商品扩展信息筛选(店铺id、店铺类型、供应商id、spu分组、品牌、规格属性) + extensionFilterQuery(param, boolQueryBuilder); + + // 范围筛选(价格、销量) + rangeFilterQuery(param, boolQueryBuilder); + + //代销商品状态 + commissionSpuStatusFilterQuery(param, boolQueryBuilder); + + //供应商名称 + supplierNameFilterQuery(param, boolQueryBuilder); + + //skuCode + skuCodeFilterQuery(param, boolQueryBuilder); + + //过滤虚拟商品和活动商品和供应商商品、是否过滤定金预售商品 + spuMoldFilterQuery(param, boolQueryBuilder); + + //供应商品状态(商家端不显示平台下架、等待审核状态的供应商商品) + supplierStatusFilterQuery(param, boolQueryBuilder); + + } + + /** + * 范围过滤 + * + * @param param 查询条件 + * @param boolQueryBuilder + */ + private void rangeFilterQuery(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 价格区间 + if (param.getMinPrice() != null || param.getMaxPrice() != null) { + boolQueryBuilder.filter(EsSearchUtil.rangeQuery(EsConstant.PRICE_FEE, param.getMinPrice(), param.getMaxPrice())); + } + // 销量区间 + if (param.getMinSaleNum() != null || param.getMaxSaleNum() != null) { + boolQueryBuilder.filter(EsSearchUtil.rangeQuery(param.getAppDisplay() ? EsConstant.SALE_NUM : EsConstant.ACTUAL_SOLD_NUM, + param.getMinSaleNum(), param.getMaxSaleNum())); + } + if (Objects.nonNull(param.getStockWarning()) && param.getStockWarning().equals(1)) { + Map params = Maps.newHashMap(); + params.put("datesub", 0); + boolQueryBuilder.must(QueryBuilders.scriptQuery( + new Script(Script.DEFAULT_SCRIPT_TYPE, + Script.DEFAULT_SCRIPT_LANG, + "doc['stockWarning'].size()>0 && (doc['stock'].value - doc['stockWarning'].value <= params.datesub)", params))); + } + } + + /** + * 商品扩展信息过滤 + * + * @param param 查询条件 + * @param boolQueryBuilder + */ + private void extensionFilterQuery(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 店铺id + if (Objects.nonNull(param.getShopId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.SHOP_ID, param.getShopId())); + } + + // 店铺类型 + if (Objects.nonNull(param.getSelfShop())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.SHOP_TYPE, param.getSelfShop())); + } + + // 供应商id + if (Objects.nonNull(param.getSupplierId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.SUPPLIER_ID, param.getSupplierId())); + } + + // spu分组 + if (Objects.nonNull(param.getTagId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.TAG_IDS, param.getTagId())); + } + + + // 品牌 + if (StrUtil.isNotBlank(param.getBrandIds())) { + boolQueryBuilder.filter(EsSearchUtil.nestedQueryByArray(EsConstant.BRAND, EsConstant.BRAND_UNION_ID, param.getBrandIds())); + } + + // 规格属性值 + if (MapUtil.isNotEmpty(param.getAttrMap())) { + for (String attrId : param.getAttrMap().keySet()) { + boolQueryBuilder.filter(EsSearchUtil.nestedQuery(EsConstant.ATTRS, EsConstant.ATTR_ATTR_VALUE_ID, param.getAttrMap().get(attrId))); + } + } + } + + /** + * 商品活动信息过滤 + * + * @param param 查询条件 + * @param boolQueryBuilder + */ + private void activityFilterQuery(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 商品活动Id + if (Objects.nonNull(param.getActivityId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.ACTIVITY_ID, param.getActivityId())); + } + + // 活动商品(过滤活动时间) + if (Objects.equals(param.getSpuType(), SpuType.GROUP.value()) && param.getAppDisplay()) { + boolQueryBuilder.filter(EsSearchUtil.rangeQuery(EsConstant.ACTIVITY_START_TIME, null, System.currentTimeMillis())); + } + + // 秒杀活动商品(过滤活动时间及批次及秒杀分类) + if (Objects.equals(param.getSpuType(), SpuType.SECKILL.value())) { + if (Objects.nonNull(param.getActivityTime())) { + Calendar calendar = DateUtil.calendar(param.getActivityTime()); + if (Objects.isNull(param.getSelectedLot())) { + return; + } + long activityStartTime = DateUtil.offsetHour(calendar.getTime(), param.getSelectedLot()).getTime(); + // 根据时间搜索,此处为时间戳 + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.ACTIVITY_START_TIME, activityStartTime)); + } + if (Objects.nonNull(param.getSeckillCategoryId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.SECKILL_CATEGORY_ID, param.getSeckillCategoryId())); + } + if (Objects.nonNull(param.getSelectedLot())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.SELECTED_LOT, param.getSelectedLot())); + } + } + + // 分销商品 + if (Objects.nonNull(param.getDistributionSpu())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.DISTRIBUTION_SPU, param.getDistributionSpu())); + if (Objects.equals(param.getDistributionSpu(), Boolean.TRUE)) { + // 分销信息 + if (Objects.nonNull(param.getDistributionState())) { + boolQueryBuilder.filter(EsSearchUtil.nestedQuery(EsConstant.DISTRIBUTION_INFO, EsConstant.STATE_UNION_NAME, param.getDistributionState().longValue())); + } + if (Objects.nonNull(param.getAwardMode())) { + boolQueryBuilder.filter(EsSearchUtil.nestedQuery(EsConstant.DISTRIBUTION_INFO, EsConstant.AWARD_MODE_UNION_NAME, param.getAwardMode().longValue())); + } + } + } + } + + /** + * 名称过滤 + * + * @param param 查询条件 + * @param boolQueryBuilder + * @param lang + */ + private void nameSearch(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder, Integer lang) { + // 店铺名称 + if (StrUtil.isNotBlank(param.getShopName())) { + BoolQueryBuilder nameShoudongQuery = new BoolQueryBuilder(); + nameShoudongQuery.should(QueryBuilders.matchQuery(EsConstant.SHOP_NAME, param.getShopName())); + BoolQueryBuilder supplierQueryBuilder = new BoolQueryBuilder(); + supplierQueryBuilder.must(QueryBuilders.matchQuery(EsConstant.SUPPLIER_NAME, param.getShopName())); + supplierQueryBuilder.mustNot(QueryBuilders.existsQuery(EsConstant.SHOP_NAME)); + nameShoudongQuery.should(supplierQueryBuilder); + boolQueryBuilder.must(nameShoudongQuery); + } + } + + /** + * 商品信息过滤 + * + * @param param 查询条件 + * @param boolQueryBuilder + */ + private void spuFilterQuery(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 过滤商品状态、库存、类型和类别 + List statusList = filterStatusStockAndType(param, boolQueryBuilder); + + boolean spuStatusCheck = Objects.isNull(param.getDataType()) || Objects.equals(param.getDataType(), DataType.ALL.value()); + // 装修以及定时任务获取删除商品 + if (!BooleanUtil.isTrue(param.getGetDelete()) && Objects.isNull(param.getSpuStatus()) + && spuStatusCheck) { + statusList.add(StatusEnum.ENABLE.value()); + statusList.add(StatusEnum.DISABLE.value()); + statusList.add(StatusEnum.OFFLINE.value()); + statusList.add(StatusEnum.WAIT_AUDIT.value()); + statusList.add(SpuStatus.PUBLISH_WAIT_AUDIT.value()); + } + if (CollUtil.isNotEmpty(statusList)) { + boolQueryBuilder.filter(QueryBuilders.termsQuery(EsConstant.SPU_STATUS, statusList)); + } + + // 是否展示定金预售商品 1.是 0.否 + if (Objects.nonNull(param.getCanDeposit()) && Objects.equals(param.getCanDeposit(), 0)) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.PRE_SALE_TYPE, PreSaleType.DEPOSIT.value())); + } + if (Objects.nonNull(param.getCanDeposit()) && Objects.equals(param.getIsGiveaway(), 1)) { + boolQueryBuilder.filter(QueryBuilders.termsQuery(EsConstant.PRE_SALE_TYPE, PreSaleType.DISABLE.value().toString())); + } + // spuId + if (Objects.nonNull(param.getSpuId())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery(EsConstant.SPU_ID, param.getSpuId().toString())); + } + // spuId列表 + else if (CollectionUtil.isNotEmpty(param.getSpuIds())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery(EsConstant.SPU_ID, param.getSpuIds())); + } + // 查询不在该集合中的商品 + if (Objects.nonNull(param.getSpuIdsExclude())) { + boolQueryBuilder.mustNot(QueryBuilders.termsQuery(EsConstant.SPU_ID, param.getSpuIdsExclude())); + } + // 商品编码 + if (StrUtil.isNotBlank(param.getPartyCodes())) { + BoolQueryBuilder partyCodesShouldQuery = QueryBuilders.boolQuery() + .should(QueryBuilders.matchPhraseQuery("partyCodes", param.getPartyCodes())); + boolQueryBuilder.must(partyCodesShouldQuery); + } + //spu编码 + if (StrUtil.isNotBlank(param.getSpuCode())) { + boolQueryBuilder.filter(QueryBuilders.matchQuery(EsConstant.SPU_CODE, param.getSpuCode())); + } + + // 商品条形码 + if (StrUtil.isNotBlank(param.getModelIds())) { + boolQueryBuilder.filter(EsSearchUtil.termsQueryByArray(EsConstant.MODEL_ID, param.getModelIds())); + } + + //发货方式 如果是商家发货的话只要过滤供应商发货的就可以 + if (Objects.nonNull(param.getSupplierDeliveryType())) { + if (Objects.equals(param.getSupplierDeliveryType(), SupplierDeliveryType.SHOP_DELIVERY.value())) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.SUPPLIER_DELIVERY_TYPE, SupplierDeliveryType.SUPPLIER_DELIVERY.value())); + } else { + boolQueryBuilder.must(QueryBuilders.termQuery(EsConstant.SUPPLIER_DELIVERY_TYPE, param.getSupplierDeliveryType())); + } + } + //商品来源 + if (Objects.nonNull(param.getSpuOrigin())) { + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (param.getSpuOrigin().equals(1)) { + list.add(2); + list.add(1); + } + if (param.getSpuOrigin().equals(0)) { + list.add(0); + } + boolQueryBuilder.must(QueryBuilders.termsQuery(EsConstant.SUPPLIER_SPU_TYPE, list)); + } + //过滤逻辑删除商品 + if (!BooleanUtil.isTrue(param.getGetDelete())) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.SPU_STATUS, StatusEnum.DELETE.value())); + } + // 过滤非自提商品 + if (Objects.nonNull(param.getHasUserPickUp()) && param.getHasUserPickUp()) { + boolQueryBuilder.filter(EsSearchUtil.nestedQuery(EsConstant.DELIVERY_MODE, EsConstant.DELIVERY_USER_MODE, param.getHasUserPickUp().toString())); + } + } + + /** + * 过滤商品状态、库存、类型和类别 + * @param param + * @param boolQueryBuilder + * @return + */ + private static List filterStatusStockAndType(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // spu状态 + List statusList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.nonNull(param.getSpuStatus()) && !Objects.equals(param.getSpuStatus(), StatusEnum.DELETE.value())) { + statusList.add(param.getSpuStatus()); + } else if (Objects.equals(param.getDataType(), DataType.DISABLE.value())) { + statusList.add(StatusEnum.DISABLE.value()); + statusList.add(StatusEnum.OFFLINE.value()); + statusList.add(StatusEnum.WAIT_AUDIT.value()); + statusList.add(SpuStatus.PUBLISH_WAIT_AUDIT.value()); + } + // 是否有库存 + if (Objects.nonNull(param.getHasStock())) { + //不过滤供应商发货的代销商品 + if (Objects.isNull(param.getIsSupplierType())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.HAS_STOCK, BooleanUtil.isTrue(param.getHasStock()))); + } + + if (Objects.nonNull(param.getSupplierDeliveryType())) { + //商家端代销商品过滤掉发货方式为供应商的商品 + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.SUPPLIER_DELIVERY_TYPE, SupplierDeliveryType.SUPPLIER_DELIVERY.value())); + } + } + // 商品类型(搜索全部商品时,不进行类型过滤) + if (!Objects.equals(param.getDataType(), DataType.ALL_PROD.value())) { + if (Objects.nonNull(param.getSpuType())) { + if (param.getIsActive() == null) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.SPU_TYPE, param.getSpuType())); + } else { + boolQueryBuilder.filter(QueryBuilders.termsQuery(EsConstant.SPU_TYPE, param.getSpuType().toString(), 5)); + } + } else { + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.SPU_TYPE, SpuType.SCORE.value().toString())); + } + } + // 不匹配的商品类型 + if (CollUtil.isNotEmpty(param.getMustNotProdTypes())) { + for (Integer prodType : param.getMustNotProdTypes()) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.SPU_TYPE, prodType.toString())); + } + } + // 商品类别 + if (Objects.nonNull(param.getSpuMold())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.SPU_MOLD, param.getSpuMold())); + } + // 商品类别 + if (Objects.nonNull(param.getNotSpuMold())) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.SPU_MOLD, param.getNotSpuMold())); + } + return statusList; + } + + /** + * 商品分类信息过滤 + * + * @param param + * @param boolQueryBuilder + */ + private void categoryFilterQuery(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 商家一级分类 + if (Objects.nonNull(param.getShopPrimaryCategoryId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.SHOP_PRIMARY_CATEGORY_ID, param.getShopPrimaryCategoryId())); + } + + //商家二级分类 + if (Objects.nonNull(param.getShopSecondaryCategoryId())) { + boolQueryBuilder.filter(EsSearchUtil.nestedQuery(EsConstant.SHOP_CATEGORY, EsConstant.SHOP_CATEGORY_UNION_ID, param.getShopSecondaryCategoryId())); + } + + // 平台一级分类 + if (Objects.nonNull(param.getPrimaryCategoryId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.PRIMARY_CATEGORY_ID, param.getPrimaryCategoryId())); + } + // 查询不在该集合中的商品 + if (Objects.nonNull(param.getNotPrimaryCategoryId())) { + boolQueryBuilder.mustNot(QueryBuilders.termsQuery(EsConstant.PRIMARY_CATEGORY_ID, param.getNotPrimaryCategoryId().toString())); + } + + // 平台二级分类 + if (Objects.nonNull(param.getSecondaryCategoryId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.SECONDARY_CATEGORY_ID, param.getSecondaryCategoryId())); + } + + // 平台三级分类 + if (Objects.nonNull(param.getCategoryId())) { + boolQueryBuilder.filter(EsSearchUtil.nestedQuery(EsConstant.CATEGORY, EsConstant.CATEGORY_UNION_ID, param.getCategoryId())); + } + + // 平台三级分类 + if (CollectionUtil.isNotEmpty(param.getCategoryIds())) { + boolQueryBuilder.filter(EsSearchUtil.nestedQuery(EsConstant.CATEGORY, EsConstant.CATEGORY_UNION_ID, param.getCategoryIds())); + } + } + + public SearchResponse getLimitSpuResponse(ProductSearchLimitDTO productSearchLimitDTO) { + Integer size = productSearchLimitDTO.getSize(); + if (Objects.isNull(size) || Objects.equals(size, 0)) { + return null; + } + boolean error = CollUtil.isEmpty(productSearchLimitDTO.getShopIds()) + && CollUtil.isEmpty(productSearchLimitDTO.getBrandIds()) && CollUtil.isEmpty(productSearchLimitDTO.getTagIds()); + if (error) { + return null; + } + + // 每个分组最多只返回10条数据 + int maxSize = 10; + if (size > maxSize) { + size = maxSize; + } + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + builderSearchSource(productSearchLimitDTO, size, searchSourceBuilder); + SearchRequest searchRequest = new SearchRequest(new String[]{EsIndexEnum.PRODUCT.value()}, searchSourceBuilder); + //2、执行检索请求 + return EsSearchUtil.search(searchRequest); + } + + private void builderSearchSource(ProductSearchLimitDTO productSearchLimitDTO, Integer size, SearchSourceBuilder searchSourceBuilder) { + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + // 过滤、聚合分析 + String[] include = {EsConstant.SPU_NAME_ZH, EsConstant.SPU_NAME_EN, EsConstant.SELLING_POINT_ZH, EsConstant.SELLING_POINT_EN, EsConstant.MAIN_IMG_URL, EsConstant.SHOP_ID, EsConstant.BRAND_ID, EsConstant.SPU_ID, EsConstant.PRICE_FEE, EsConstant.MARKET_PRICE_FEE, EsConstant.SPU_STATUS, EsConstant.SUPPLIER_SPU_TYPE}; + TermsAggregationBuilder term = null; + TopHitsAggregationBuilder topHitsAggregationBuilder = AggregationBuilders + .topHits(EsConstant.TOP_HITS_DATA) + .fetchSource(include, null) + .size(size); + // 店铺 + if (CollUtil.isNotEmpty(productSearchLimitDTO.getShopIds())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery(EsConstant.SHOP_ID, productSearchLimitDTO.getShopIds())); + term = AggregationBuilders.terms(EsConstant.SPU_LIST).field(EsConstant.SHOP_ID); + } + // 品牌 + if (CollUtil.isNotEmpty(productSearchLimitDTO.getBrandIds())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery(EsConstant.BRAND_ID, productSearchLimitDTO.getBrandIds())); + term = AggregationBuilders.terms(EsConstant.SPU_LIST).field(EsConstant.BRAND_ID); + } + //不显示供应商商品 + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.SUPPLIER_SPU_TYPE, SupplierSpuType.YES.value())); + //不显示活动商品 + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.SPU_TYPE, SpuType.ACTIVE.value())); + if (CollUtil.isNotEmpty(productSearchLimitDTO.getShopIds()) || CollUtil.isNotEmpty(productSearchLimitDTO.getBrandIds())) { + // 商品按销量倒序 + topHitsAggregationBuilder.sort(EsConstant.SALE_NUM, SortOrder.DESC); + Objects.requireNonNull(term).subAggregation(topHitsAggregationBuilder); + searchSourceBuilder.aggregation(term); + } + boolQueryBuilder.filter(QueryBuilders.termsQuery(EsConstant.APP_DISPLAY, Boolean.TRUE)); + searchSourceBuilder.query(boolQueryBuilder); + searchSourceBuilder.size(0); + log.info("构建的DSL语句 {}", searchSourceBuilder); + } + + public void supplierSpuTypeFilterQuery(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + if (!Objects.isNull(param.getSupplierSpuType())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.SUPPLIER_SPU_TYPE, param.getSupplierSpuType())); + } + if (Objects.equals(param.getIsSupplierType(), 1)) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.SUPPLIER_SPU_TYPE, param.getIsSupplierType())); + } + } + + public void supplierIdFilterQuery(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + if (!Objects.isNull(param.getSupplierIds())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery(EsConstant.SUPPLIER_ID, param.getSupplierIds())); + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.SUPPLIER_SPU_TYPE, EsSupplierSpuStatus.SUPPLIER_SPU.value())); + } + + } + + public void commissionSpuStatusFilterQuery(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + if (!Objects.isNull(param.getCommissionSpuStatus())) { + boolQueryBuilder.filter(QueryBuilders.termQuery(EsConstant.COMMISSION_SPU_STATUS, param.getCommissionSpuStatus())); + } + } + + public void supplierNameFilterQuery(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + if (!Objects.isNull(param.getSupplierName()) && !Objects.equals(param.getSupplierName(), "")) { +// if (!Objects.isNull(param.getCommissionSpuStatus())){ + boolQueryBuilder.filter(QueryBuilders.matchQuery(EsConstant.SUPPLIER_NAME, param.getSupplierName())); +// } + } + } + + public void skuCodeFilterQuery(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + if (!Objects.isNull(param.getSkuCode()) && !Objects.equals(param.getSkuCode(), "")) { + boolQueryBuilder.filter(QueryBuilders.matchQuery(EsConstant.PARTY_CODE, param.getSkuCode())); + } + } + + public void spuMoldFilterQuery(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + if (Objects.nonNull(param.getIsVirtual())) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.SPU_MOLD, SpuMold.VIRTUAL.value())); + } + if (Objects.equals(param.getIsSupplierDelivery(), 1)) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.SUPPLIER_SPU_TYPE, SupplierSpuType.YES.value())); + boolQueryBuilder.mustNot(QueryBuilders.termQuery(EsConstant.SUPPLIER_DELIVERY_TYPE, SupplierDeliveryType.SUPPLIER_DELIVERY.value())); + } + } + + public void supplierStatusFilterQuery(ProductSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + if (Objects.nonNull(param.getShopQuerySupplierSpu()) && param.getShopQuerySupplierSpu()) { + List supplierSpuStatus = new ArrayList<>(Constant.INITIAL_CAPACITY); + //只查询状态为上架或者下架的供应商品, + supplierSpuStatus.add(StatusEnum.DISABLE.value()); + supplierSpuStatus.add(StatusEnum.ENABLE.value()); + boolQueryBuilder.filter(QueryBuilders.termsQuery(EsConstant.SPU_STATUS, supplierSpuStatus)); + } + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/ProductSearchResponseBuilder.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/ProductSearchResponseBuilder.java new file mode 100644 index 0000000..d4d5d7c --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/ProductSearchResponseBuilder.java @@ -0,0 +1,305 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.builder; + +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.product.vo.search.*; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.search.constant.EsConstant; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.elasticsearch.search.aggregations.Aggregations; +import org.elasticsearch.search.aggregations.bucket.nested.ParsedNested; +import org.elasticsearch.search.aggregations.bucket.terms.ParsedLongTerms; +import org.elasticsearch.search.aggregations.bucket.terms.Terms; +import org.elasticsearch.search.aggregations.metrics.ParsedTopHits; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * @author YXF + * @date 2021/07/29 + */ +@Component +public class ProductSearchResponseBuilder { + + private static final Logger log = LoggerFactory.getLogger(ProductSearchResponseBuilder.class); + + /** + * + */ + public List getProductSearchList(SearchResponse response) { + + // 1、返回的所有查询到的商品 + ProductSearchVO productSearchVO = new ProductSearchVO(); + //===============spu列表信息====================// + productSearchVO.setSpus(buildSpuSearchList(response.getHits())); + + //===============聚合信息====================// + Aggregations aggregations = response.getAggregations(); + if (Objects.nonNull(aggregations)) { + processingAggregationsData(productSearchVO, aggregations); + } + + List productSearches = new ArrayList<>(Constant.INITIAL_CAPACITY); + productSearches.add(productSearchVO); + return productSearches; + } + + /** + * 从es返回的数据中获取spu列表 + * + * @param hits es返回的数据 + * @return + */ + public List buildSpuSearchList(SearchHits hits) { + String spuName; + String sellingPoin; + if (Objects.equals(I18nMessage.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + spuName = EsConstant.SPU_NAME_ZH; + sellingPoin = EsConstant.SELLING_POINT_ZH; + } else { + spuName = EsConstant.SPU_NAME_EN; + sellingPoin = EsConstant.SELLING_POINT_EN; + } + List spus = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SearchHit hit : hits.getHits()) { + String json = hit.getSourceAsString(); + SpuSearchVO spuSearchVO = Json.parseObject(json, SpuSearchVO.class); + spuSearchVO.setSpuName(handleAggregationsLang(json, spuName, EsConstant.SPU_NAME_ZH)); + spuSearchVO.setSellingPoint(handleAggregationsLang(json, sellingPoin, EsConstant.SELLING_POINT_ZH)); + spus.add(spuSearchVO); + } + return spus; + } + + /** + * 处理聚合数据 + * + * @param productSearchVO + * @param aggregations + */ + private void processingAggregationsData(ProductSearchVO productSearchVO, Aggregations aggregations) { + String brandName; + String categoryName; + String attrName; + String attrValueName; + if (Objects.equals(I18nMessage.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + brandName = EsConstant.BRAND_NAME_ZH; + categoryName = EsConstant.CATEGORY_NAME_ZH; + attrName = EsConstant.ATTR_NAME_ZH; + attrValueName = EsConstant.ATTR_VALUE_NAME_ZH; + } else { + brandName = EsConstant.BRAND_NAME_EN; + categoryName = EsConstant.CATEGORY_NAME_EN; + attrName = EsConstant.ATTR_NAME_EN; + attrValueName = EsConstant.ATTR_VALUE_NAME_EN; + } + //===============品牌信息====================// + ParsedNested brandNested = aggregations.get(EsConstant.BRAND); + if (Objects.nonNull(brandNested)) { + productSearchVO.setBrands(new ArrayList<>(Constant.INITIAL_CAPACITY)); + List brandJson = handleAggregations(brandNested, EsConstant.BRAND_ID); + for (String json : brandJson) { + BrandSearchVO brandSearchVO = Json.parseObject(json, BrandSearchVO.class); + brandSearchVO.setBrandName(handleAggregationsLang(json, brandName, EsConstant.BRAND_NAME_ZH)); + productSearchVO.getBrands().add(brandSearchVO); + } + } + //===============分类信息====================// + loadCategoryAggregationsData(productSearchVO, aggregations, categoryName); + + //===============店铺信息====================// + ParsedLongTerms shopTerms = aggregations.get(EsConstant.SHOP); + if (Objects.nonNull(shopTerms)) { + List shopBuckets = shopTerms.getBuckets(); + for (Terms.Bucket bucket : shopBuckets) { + productSearchVO.setShopInfo(new ShopInfoSearchVO()); + productSearchVO.getShopInfo().setShopId(Long.valueOf(bucket.getKey().toString())); + } + } + //===============属性信息====================// + loadAttrAggregationsData(productSearchVO, aggregations, attrName, attrValueName); + } + + private void loadCategoryAggregationsData(ProductSearchVO productSearchVO, Aggregations aggregations, String categoryName) { + productSearchVO.setCategorys(new ArrayList<>(Constant.INITIAL_CAPACITY)); + String categoryId; + ParsedNested categoriesNested; + // 平台分类 + if (Objects.nonNull(aggregations.get(EsConstant.CATEGORY))) { + categoryId = EsConstant.CATEGORY_ID; + categoriesNested = aggregations.get(EsConstant.CATEGORY); + } + // 店铺分类 + else { + categoryId = EsConstant.SHOP_CATEGORY_ID; + categoriesNested = aggregations.get(EsConstant.SHOP_CATEGORY); + } + if (Objects.nonNull(categoriesNested)) { + productSearchVO.setCategorys(new ArrayList<>(Constant.INITIAL_CAPACITY)); + List categoryJson = handleAggregations(categoriesNested, categoryId); + for (String json : categoryJson) { + CategorySearchVO categorySearchVO = Json.parseObject(json, CategorySearchVO.class); + categorySearchVO.setName(handleAggregationsLang(json, categoryName, EsConstant.CATEGORY_NAME_ZH)); + productSearchVO.getCategorys().add(categorySearchVO); + } + } + } + + private void loadAttrAggregationsData(ProductSearchVO productSearchVO, Aggregations aggregations, String attrName, String attrValueName) { + productSearchVO.setAttrs(new ArrayList<>(Constant.INITIAL_CAPACITY)); + ParsedNested attrsNested = aggregations.get(EsConstant.ATTRS); + if (Objects.nonNull(attrsNested)) { + Aggregations attrIdAggregations = attrsNested.getAggregations(); + ParsedLongTerms attrIdsTrems = attrIdAggregations.get(EsConstant.ATTR_IDS); + List attrsBuckets = attrIdsTrems.getBuckets(); + for (Terms.Bucket bucket : attrsBuckets) { + ParsedLongTerms attrLongTerms = bucket.getAggregations().get(EsConstant.ATTR_VALUE_IDS); + AttrSearchVO attrSearchVO = null; + for (Terms.Bucket attrValueBucket : attrLongTerms.getBuckets()) { + ParsedTopHits parsedTopHits = attrValueBucket.getAggregations().get(EsConstant.TOP_HITS_DATA); + for (SearchHit hit : parsedTopHits.getHits().getHits()) { + String json = hit.getSourceAsString(); + if (Objects.isNull(attrSearchVO)) { + attrSearchVO = Json.parseObject(json, AttrSearchVO.class); + attrSearchVO.setAttrId(Long.valueOf(bucket.getKey().toString())); + attrSearchVO.setAttrName(handleAggregationsLang(json, attrName, EsConstant.ATTR_NAME_ZH)); + attrSearchVO.setAttrValues(new ArrayList<>(0)); + } + AttrValueSearchVO attrValueSearchVO = Json.parseObject(hit.getSourceAsString(), AttrValueSearchVO.class); + attrValueSearchVO.setAttrValueName(handleAggregationsLang(json, attrValueName, EsConstant.ATTR_VALUE_NAME_ZH)); + attrSearchVO.getAttrValues().add(attrValueSearchVO); + } + } + productSearchVO.getAttrs().add(attrSearchVO); + } + } + } + + /** + * 处理聚合数据 + * + * @param brandNested + * @return + */ + public List handleAggregations(ParsedNested brandNested, String id) { + List dataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + ParsedLongTerms brandLongTerms = brandNested.getAggregations().get(id); + List buckets = brandLongTerms.getBuckets(); + for (Terms.Bucket bucket : buckets) { + ParsedTopHits parsedTopHits = bucket.getAggregations().get(EsConstant.TOP_HITS_DATA); + for (SearchHit hit : parsedTopHits.getHits().getHits()) { + String sourceAsString = hit.getSourceAsString(); + dataList.add(sourceAsString); + } + } + return dataList; + } + + /** + * 从es返回的数据中获取spu列表 + * + * @param response es返回的数据 + * @return + */ + public List buildSpuAdminList(SearchResponse response) { + List spus = new ArrayList<>(Constant.INITIAL_CAPACITY); + String spuName; + if (Objects.equals(I18nMessage.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + spuName = EsConstant.SPU_NAME_ZH; + } else { + spuName = EsConstant.SPU_NAME_EN; + } + for (SearchHit hit : response.getHits()) { + String json = hit.getSourceAsString(); + SpuAdminVO spuSearchVO = Json.parseObject(json, SpuAdminVO.class); + spuSearchVO.setSpuName(handleAggregationsLang(json, spuName, EsConstant.SPU_NAME_ZH)); + spus.add(spuSearchVO); + } + return spus; + } + + /** + * 从聚合数据中获取商品列表 + * + * @param response + * @return + */ + public Map> loadSpuMapByAggregations(SearchResponse response) { + Aggregations aggregations = response.getAggregations(); + if (Objects.isNull(aggregations.getAsMap())) { + return new HashMap<>(0); + } + ParsedLongTerms shopTerm = aggregations.get(EsConstant.SPU_LIST); + Map> spuMap = new HashMap<>(10); + if (Objects.nonNull(shopTerm)) { + List buckets = shopTerm.getBuckets(); + for (Terms.Bucket bucket : buckets) { + Aggregations shopAgg = bucket.getAggregations(); + ParsedTopHits shopHits = shopAgg.get(EsConstant.TOP_HITS_DATA); + spuMap.put(Long.valueOf(bucket.getKey().toString()), buildSpuSearchList(shopHits.getHits())); + } + } + return spuMap; + } + + /** + * 构建分页数据 + * + * @param pageDTO + * @param esPageVO + * @param response + */ + public void buildSearchPage(EsPageDTO pageDTO, EsPageVO esPageVO, SearchResponse response) { + //总记录数 + long total = response.getHits().getTotalHits().value; + esPageVO.setTotal(total); + // 总页码 + int totalPages = (int) total % pageDTO.getPageSize() == 0 ? + (int) total / pageDTO.getPageSize() : ((int) total / pageDTO.getPageSize() + 1); + esPageVO.setPages(totalPages); + } + + /** + * 处理聚合国际化信息 + * + * @param json 数据 + * @param field 字段 + * @return 对应语言的字段 + */ + @SuppressWarnings("unchecked") + private String handleAggregationsLang(String json, String field, String defaultField) { + Map map = Json.parseObject(json, Map.class); + Object object; + // 找不到指定语言的数据,就查默认语言 + if (Objects.isNull(map.get(field))) { + object = map.get(defaultField); + } + // 获取指定语言的数据 + else { + object = map.get(field); + } + // 没有查到数据 + if (Objects.isNull(object)) { + return null; + } + return object.toString(); + } + +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/CanalGlue.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/CanalGlue.java new file mode 100644 index 0000000..121b30b --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/CanalGlue.java @@ -0,0 +1,16 @@ +package com.tmerclub.cloud.search.canal; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/23 0:54 + */ +public interface CanalGlue { + + /** + * 进程 + * @param content + */ + void process(String content); +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/DefaultCanalGlue.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/DefaultCanalGlue.java new file mode 100644 index 0000000..e066135 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/DefaultCanalGlue.java @@ -0,0 +1,26 @@ +package com.tmerclub.cloud.search.canal; + +import com.tmerclub.cloud.search.canal.model.CanalBinLogEvent; +import com.tmerclub.cloud.search.canal.model.ModelTable; +import com.tmerclub.cloud.search.canal.support.adapter.SourceAdapterFacade; +import com.tmerclub.cloud.search.canal.support.processor.CanalBinlogEventProcessorFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/23 0:54 + */ +public class DefaultCanalGlue implements CanalGlue { + + @Autowired + private CanalBinlogEventProcessorFactory canalBinlogEventProcessorFactory; + + @Override + public void process(String content) { + CanalBinLogEvent event = SourceAdapterFacade.X.adapt(CanalBinLogEvent.class, content); + ModelTable modelTable = ModelTable.of(event.getDatabase(), event.getTable()); + canalBinlogEventProcessorFactory.get(modelTable).forEach(processor -> processor.process(event)); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/LuckCanalBinLogEventParser.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/LuckCanalBinLogEventParser.java new file mode 100644 index 0000000..b60c187 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/LuckCanalBinLogEventParser.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.canal; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.search.canal.common.BinLogEventType; +import com.tmerclub.cloud.search.canal.common.OperationType; +import com.tmerclub.cloud.search.canal.model.CanalBinLogEvent; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import com.tmerclub.cloud.search.canal.support.parser.BaseCommonEntryFunction; +import com.tmerclub.cloud.search.canal.support.parser.BasePrimaryKeyTupleFunction; +import com.tmerclub.cloud.search.canal.support.parser.CanalBinLogEventParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; + +/** + * @author FrozenWatermelon + */ +public class LuckCanalBinLogEventParser implements CanalBinLogEventParser { + + private static final Logger log = LoggerFactory.getLogger(LuckCanalBinLogEventParser.class); + + @Override + public List> parse(CanalBinLogEvent event, Class klass, BasePrimaryKeyTupleFunction primaryKeyFunction, BaseCommonEntryFunction commonEntryFunction) { + BinLogEventType eventType = BinLogEventType.fromType(event.getType()); + if (Objects.equals(BinLogEventType.CREATE, eventType) || Objects.equals(BinLogEventType.ALTER, eventType)) { + if (log.isDebugEnabled()) { + log.debug("监听到不需要处理或者未知的binlog事件类型[{}],将忽略解析过程返回空列表,binlog事件:{}", eventType, JSON.toJSONString(event)); + } + return Collections.emptyList(); + } + + if (BinLogEventType.UNKNOWN != eventType && BinLogEventType.QUERY != eventType) { + if (Boolean.TRUE.equals(event.getIsDdl())) { + CanalBinLogResult entry = new CanalBinLogResult<>(); + entry.setOperationType(OperationType.DDL); + entry.setBinLogEventType(eventType); + entry.setDatabaseName(event.getDatabase()); + entry.setTableName(event.getTable()); + entry.setSql(event.getSql()); + return Collections.singletonList(entry); + } else { + Optional.ofNullable(event.getPkNames()).filter((x) -> x.size() == 1).orElseThrow(() -> new IllegalArgumentException("DML类型binlog事件主键列数量不为1")); + String primaryKeyName = event.getPkNames().get(0); + List> entryList = new LinkedList<>(); + List> data = event.getData(); + List> old = event.getOld(); + int dataSize = null != data ? data.size() : 0; + int oldSize = null != old ? old.size() : 0; + if (dataSize > 0) { + for (int index = 0; index < dataSize; ++index) { + CanalBinLogResult entry = new CanalBinLogResult<>(); + entryList.add(entry); + entry.setSql(event.getSql()); + entry.setOperationType(OperationType.DML); + entry.setBinLogEventType(eventType); + entry.setTableName(event.getTable()); + entry.setDatabaseName(event.getDatabase()); + Map item = data.get(index); + entry.setAfterData(commonEntryFunction.apply(item)); + Map oldItem = null; + if (oldSize > 0 && index <= oldSize) { + oldItem = old.get(index); + entry.setBeforeData(commonEntryFunction.apply(oldItem)); + } + + entry.setPrimaryKey(primaryKeyFunction.apply(oldItem, item, primaryKeyName)); + } + } + + return entryList; + } + } else { + if (log.isDebugEnabled()) { + log.debug("监听到不需要处理或者未知的binlog事件类型[{}],将忽略解析过程返回空列表,binlog事件:{}", eventType, JSON.toJSONString(event)); + } + + return Collections.emptyList(); + } + } + + private LuckCanalBinLogEventParser() { + } + + public static LuckCanalBinLogEventParser of() { + return new LuckCanalBinLogEventParser(); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/LuckCanalBinlogEventProcessorFactory.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/LuckCanalBinlogEventProcessorFactory.java new file mode 100644 index 0000000..529837b --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/LuckCanalBinlogEventProcessorFactory.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.canal; + + +import com.tmerclub.cloud.search.canal.model.ModelTable; +import com.tmerclub.cloud.search.canal.support.processor.BaseCanalBinlogEventProcessor; +import com.tmerclub.cloud.search.canal.support.processor.CanalBinlogEventProcessorFactory; + +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * @author FrozenWatermelon + */ +public class LuckCanalBinlogEventProcessorFactory implements CanalBinlogEventProcessorFactory { + + private final ConcurrentMap>> cache = new ConcurrentHashMap<>(16); + + @Override + public void register(ModelTable modelTable, BaseCanalBinlogEventProcessor processor) { + synchronized (this.cache) { + this.cache.putIfAbsent(modelTable, new LinkedList<>()); + this.cache.get(modelTable).add(processor); + } + } + + @Override + public List> get(ModelTable modelTable) { + return this.cache.get(modelTable); + } + + private LuckCanalBinlogEventProcessorFactory() { + } + + public static LuckCanalBinlogEventProcessorFactory of() { + return new LuckCanalBinlogEventProcessorFactory(); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/annotation/CanalField.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/annotation/CanalField.java new file mode 100644 index 0000000..4da441a --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/annotation/CanalField.java @@ -0,0 +1,43 @@ +package com.tmerclub.cloud.search.canal.annotation; + + +import com.tmerclub.cloud.search.canal.support.parser.converter.BaseCanalFieldConverter; +import com.tmerclub.cloud.search.canal.support.parser.converter.NullCanalFieldConverter; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.sql.JDBCType; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/23 23:41 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface CanalField { + + /** + * 行名称 + * + * @return columnName + */ + String columnName() default ""; + + /** + * sql字段类型 + * + * @return JDBCType + */ + JDBCType sqlType() default JDBCType.NULL; + + /** + * 转换器类型 + * + * @return klass + */ + Class> converterKlass() default NullCanalFieldConverter.class; +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/annotation/CanalModel.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/annotation/CanalModel.java new file mode 100644 index 0000000..43fbb39 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/annotation/CanalModel.java @@ -0,0 +1,35 @@ +package com.tmerclub.cloud.search.canal.annotation; + + +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/24 22:04 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface CanalModel { + + /** + * 目标数据库 + */ + String database(); + + /** + * 目标表 + */ + String table(); + + /** + * 属性名 -> 列名命名转换策略 + */ + FieldNamingPolicy fieldNamingPolicy() default FieldNamingPolicy.DEFAULT; +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/BinLogEventType.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/BinLogEventType.java new file mode 100644 index 0000000..320af41 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/BinLogEventType.java @@ -0,0 +1,72 @@ +package com.tmerclub.cloud.search.canal.common; + +/** + * @author throwable + * @version v1 + * @description binlog事件类型 + * @since 2020/9/20 17:19 + */ +public enum BinLogEventType { + + /** + * 查询 + */ + QUERY("QUERY", "查询"), + + /** + * 新增 + */ + INSERT("INSERT", "新增"), + + /** + * 更新 + */ + UPDATE("UPDATE", "更新"), + + /** + * 删除 + */ + DELETE("DELETE", "删除"), + + /** + * 列修改操作 + */ + ALTER("ALTER", "列修改操作"), + + /** + * 表创建 + */ + CREATE("CREATE", "表创建"), + + /** + * 未知 + */ + UNKNOWN("UNKNOWN", "未知"), + + ; + + private final String type; + private final String description; + + BinLogEventType(String type, String description) { + this.type = type; + this.description = description; + } + + public String getType() { + return type; + } + + public String getDescription() { + return description; + } + + public static BinLogEventType fromType(String type) { + for (BinLogEventType binLogType : values()) { + if (binLogType.getType().equals(type)) { + return binLogType; + } + } + return UNKNOWN; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/FieldNamingPolicy.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/FieldNamingPolicy.java new file mode 100644 index 0000000..f3ccc5e --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/FieldNamingPolicy.java @@ -0,0 +1,65 @@ +package com.tmerclub.cloud.search.canal.common; + + +import com.tmerclub.cloud.common.constant.Constant; + +/** + * @author throwable + * @version v1 + * @description 属性名 -> 列名命名转换策略, 默认认为所有属性都是标准驼峰命名 + * @since 2020/9/24 22:07 + */ +public enum FieldNamingPolicy implements NamingPolicy { + + /** + * 返回属性的原始名称作为列名,如"customerName" -> "customerName" + */ + DEFAULT { + @Override + public String convert(String source) { + return source; + } + }, + + /** + * 属性的原始名称转为下划线大写作为列名,如"customerName" -> "CUSTOMER_NAME" + */ + UPPER_UNDERSCORE { + @Override + public String convert(String source) { + StringBuilder content = new StringBuilder(Constant.INITIAL_CAPACITY); + int len = source.length(); + for (int i = 0; i < len; i++) { + char c = source.charAt(i); + if (Character.isUpperCase(c)) { + content.append(UNDER_LINE); + } + content.append(Character.toUpperCase(c)); + } + return content.toString(); + } + }, + + /** + * 属性的原始名称转为下划线小写作为列名,如"customerName" -> "customer_name" + */ + LOWER_UNDERSCORE { + @Override + public String convert(String source) { + StringBuilder content = new StringBuilder(Constant.INITIAL_CAPACITY); + int len = source.length(); + for (int i = 0; i < len; i++) { + char c = source.charAt(i); + if (Character.isUpperCase(c)) { + content.append(UNDER_LINE); + } + content.append(Character.toLowerCase(c)); + } + return content.toString(); + } + }, + + ; + + private static final String UNDER_LINE = "_"; +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/DefaultModelTable.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/DefaultModelTable.java new file mode 100644 index 0000000..9501cb0 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/DefaultModelTable.java @@ -0,0 +1,59 @@ +package com.tmerclub.cloud.search.canal.model; + +import java.io.Serial; +import java.util.Objects; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 12:29 + */ +public class DefaultModelTable implements ModelTable { + @Serial + private static final long serialVersionUID = 1L; + private final String database; + private final String table; + + private DefaultModelTable(String database, String table) { + this.database = database; + this.table = table; + } + + public static DefaultModelTable of(String database, String table) { + return new DefaultModelTable(database, table); + } + + @Override + public String database() { + return database; + } + + @Override + public String table() { + return table; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + DefaultModelTable that = (DefaultModelTable) o; + return Objects.equals(database, that.database) && + Objects.equals(table, that.table); + } + + @Override + public int hashCode() { + return Objects.hash(database, table); + } + + @Override + public String toString() { + return database() + "." + table(); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/ModelTable.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/ModelTable.java new file mode 100644 index 0000000..8707246 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/ModelTable.java @@ -0,0 +1,32 @@ +package com.tmerclub.cloud.search.canal.model; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 12:29 + */ +public interface ModelTable { + + /** + * database + * @return + */ + String database(); + + /** + * table + * @return + */ + String table(); + + /** + * of + * @param database + * @param table + * @return + */ + static ModelTable of(String database, String table) { + return DefaultModelTable.of(database, table); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/BaseParameterizedTypeReferenceSupport.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/BaseParameterizedTypeReferenceSupport.java new file mode 100644 index 0000000..bf24a3d --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/BaseParameterizedTypeReferenceSupport.java @@ -0,0 +1,63 @@ +package com.tmerclub.cloud.search.canal.support; + +import com.tmerclub.cloud.search.canal.util.AssertUtils; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/26 22:26 + */ +public abstract class BaseParameterizedTypeReferenceSupport { + + private final Class klass; + private final Class childKlass; + + @SuppressWarnings("unchecked") + public BaseParameterizedTypeReferenceSupport() { + childKlass = getClass(); + Type type = findParameterizedTypeReferenceSubClass(childKlass); + AssertUtils.X.isInstanceOf(ParameterizedType.class, type, "Type must be a parameterized type"); + ParameterizedType parameterizedType = (ParameterizedType) type; + Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); + AssertUtils.X.isTrue(actualTypeArguments.length == 1, "Number of type arguments must be 1"); + this.klass = (Class) actualTypeArguments[0]; + } + + /** + * 递归搜索ParameterizedType类型引用的父类 - 目的是获取泛型参数类型 + * + * @param child child + * @return Class + */ + private static Type findParameterizedTypeReferenceSubClass(Class child) { + Type genericSuperclass = child.getGenericSuperclass(); + if (!(genericSuperclass instanceof ParameterizedType)) { + Class parent = child.getSuperclass(); + if (Object.class == parent) { + throw new IllegalStateException("Expected ParameterizedTypeReference superclass"); + } + return findParameterizedTypeReferenceSubClass(parent); + } + return genericSuperclass; + } + + public Class getKlass() { + return klass; + } + + public Class getChildKlass() { + return childKlass; + } + + @Override + public String toString() { + return "BaseParameterizedTypeReferenceSupport{" + + "klass=" + klass + + ", childKlass=" + childKlass + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/adapter/FastJsonSourceAdapter.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/adapter/FastJsonSourceAdapter.java new file mode 100644 index 0000000..749e651 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/adapter/FastJsonSourceAdapter.java @@ -0,0 +1,37 @@ +package com.tmerclub.cloud.search.canal.support.adapter; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.search.canal.util.StringUtils; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 17:28 + */ +@SuppressWarnings("rawtypes") +class FastJsonSourceAdapter implements SourceAdapter { + + private final Class klass; + + private FastJsonSourceAdapter(Class klass) { + this.klass = klass; + } + + @SuppressWarnings("unchecked") + public static FastJsonSourceAdapter of(Class klass) { + return new FastJsonSourceAdapter(klass); + } + + public Class getKlass() { + return klass; + } + + @Override + public T adapt(String source) { + if (StringUtils.X.isEmpty(source)) { + return null; + } + return JSON.parseObject(source, klass); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BasePrimaryKeyTupleFunction.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BasePrimaryKeyTupleFunction.java new file mode 100644 index 0000000..db02670 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BasePrimaryKeyTupleFunction.java @@ -0,0 +1,18 @@ +package com.tmerclub.cloud.search.canal.support.parser; + + +import java.util.Map; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/23 23:48 + */ +public abstract class BasePrimaryKeyTupleFunction implements TupleFunction, Map, String, Long> { + + @Override + public Long apply(Map before, Map after, String primaryKey) { + throw new UnsupportedOperationException(); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BigIntPrimaryKeyTupleFunction.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BigIntPrimaryKeyTupleFunction.java new file mode 100644 index 0000000..ac8bdb7 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BigIntPrimaryKeyTupleFunction.java @@ -0,0 +1,32 @@ +package com.tmerclub.cloud.search.canal.support.parser; + + +import com.tmerclub.cloud.search.canal.support.parser.converter.BigIntCanalFieldConverter; + +import java.util.Map; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/23 23:35 + */ +public class BigIntPrimaryKeyTupleFunction extends BasePrimaryKeyTupleFunction { + + /** + * 单例 + */ + public static final BasePrimaryKeyTupleFunction X = new BigIntPrimaryKeyTupleFunction(); + + private BigIntPrimaryKeyTupleFunction() { + } + + @Override + public Long apply(Map before, Map after, String primaryKey) { + String temp; + if (null != after && null != (temp = after.get(primaryKey))) { + return BigIntCanalFieldConverter.X.convert(temp); + } + return null; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ColumnMetadata.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ColumnMetadata.java new file mode 100644 index 0000000..5982279 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ColumnMetadata.java @@ -0,0 +1,40 @@ +package com.tmerclub.cloud.search.canal.support.parser; + +import com.tmerclub.cloud.search.canal.support.parser.converter.BaseCanalFieldConverter; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/24 0:54 + */ +public class ColumnMetadata { + + private String columnName; + + private BaseCanalFieldConverter converter; + + public String getColumnName() { + return columnName; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public BaseCanalFieldConverter getConverter() { + return converter; + } + + public void setConverter(BaseCanalFieldConverter converter) { + this.converter = converter; + } + + @Override + public String toString() { + return "ColumnMetadata{" + + "columnName='" + columnName + '\'' + + ", converter=" + converter + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/DefaultCanalBinLogEventParser.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/DefaultCanalBinLogEventParser.java new file mode 100644 index 0000000..8f7993e --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/DefaultCanalBinLogEventParser.java @@ -0,0 +1,76 @@ +package com.tmerclub.cloud.search.canal.support.parser; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.search.canal.common.BinLogEventType; +import com.tmerclub.cloud.search.canal.common.OperationType; +import com.tmerclub.cloud.search.canal.model.CanalBinLogEvent; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/24 23:22 + */ +public class DefaultCanalBinLogEventParser implements CanalBinLogEventParser { + + private static final Logger log = LoggerFactory.getLogger(DefaultCanalBinLogEventParser.class); + + @Override + public List> parse(CanalBinLogEvent event, + Class klass, + BasePrimaryKeyTupleFunction primaryKeyFunction, + BaseCommonEntryFunction commonEntryFunction) { + BinLogEventType eventType = BinLogEventType.fromType(event.getType()); + if (BinLogEventType.UNKNOWN == eventType || BinLogEventType.QUERY == eventType) { + if (log.isDebugEnabled()) { + log.debug("监听到不需要处理或者未知的binlog事件类型[{}],将忽略解析过程返回空列表,binlog事件:{}", eventType, JSON.toJSONString(event)); + } + return Collections.emptyList(); + } + if (Boolean.TRUE.equals(event.getIsDdl())) { + CanalBinLogResult entry = new CanalBinLogResult<>(); + entry.setOperationType(OperationType.DDL); + entry.setBinLogEventType(eventType); + entry.setTableName(event.getTable()); + entry.setDatabaseName(event.getDatabase()); + entry.setSql(event.getSql()); + return Collections.singletonList(entry); + } + Optional.ofNullable(event.getPkNames()).filter(x -> x.size() == 1) + .orElseThrow(() -> new IllegalArgumentException("DML类型binlog事件主键列数量不为1")); + // 主键列的名称 + String primaryKeyName = event.getPkNames().get(0); + List> data = event.getData(); + List> old = event.getOld(); + List> entryList = new LinkedList<>(); + int dataSize = null != data ? data.size() : 0; + int oldSize = null != old ? old.size() : 0; + if (dataSize > 0) { + for (int index = 0; index < dataSize; index++) { + CanalBinLogResult entry = new CanalBinLogResult<>(); + entryList.add(entry); + entry.setSql(event.getSql()); + entry.setBinLogEventType(eventType); + entry.setOperationType(OperationType.DML); + entry.setDatabaseName(event.getDatabase()); + entry.setTableName(event.getTable()); + // 预防old节点空指针 + Map oldItem = null; + if (oldSize > 0 && index <= oldSize) { + oldItem = old.get(index); + entry.setBeforeData(commonEntryFunction.apply(oldItem)); + } + Map item = data.get(index); + entry.setAfterData(commonEntryFunction.apply(item)); + // 封装主键 + entry.setPrimaryKey(primaryKeyFunction.apply(oldItem, item, primaryKeyName)); + } + } + return entryList; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ModelTableMetadataManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ModelTableMetadataManager.java new file mode 100644 index 0000000..7f83fde --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ModelTableMetadataManager.java @@ -0,0 +1,18 @@ +package com.tmerclub.cloud.search.canal.support.parser; + + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/24 0:55 + */ +public interface ModelTableMetadataManager { + + /** + * 加载 + * @param klass + * @return + */ + ModelTableMetadata load(Class klass); +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/BaseCanalFieldConverter.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/BaseCanalFieldConverter.java new file mode 100644 index 0000000..e8f8a06 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/BaseCanalFieldConverter.java @@ -0,0 +1,77 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import com.tmerclub.cloud.search.canal.util.StringUtils; + +import java.sql.SQLType; +import java.util.Objects; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 18:08 + */ +public abstract class BaseCanalFieldConverter implements BinLogFieldConverter { + + private final SQLType sqlType; + private final Class klass; + + protected BaseCanalFieldConverter(SQLType sqlType, Class klass) { + this.sqlType = sqlType; + this.klass = klass; + } + + @Override + public int hashCode() { + return Objects.hash(sqlType, klass); + } + + @SuppressWarnings("rawtypes") + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + BaseCanalFieldConverter obj = (BaseCanalFieldConverter) o; + return Objects.equals(sqlType, obj.sqlType) && + Objects.equals(klass, obj.klass); + } + + @Override + public T convert(String source) { + if (StringUtils.X.isEmpty(source)) { + return null; + } + return convertInternal(source); + } + + /** + * 内部转换方法 + * + * @param source 源字符串 + * @return T + */ + protected abstract T convertInternal(String source); + + /** + * 返回SQL类型 + * + * @return SQLType + */ + public SQLType sqlType() { + return sqlType; + } + + /** + * 返回类型 + * + * @return Class + */ + public Class typeKlass() { + return klass; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/BigIntCanalFieldConverter.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/BigIntCanalFieldConverter.java new file mode 100644 index 0000000..1c98a10 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/BigIntCanalFieldConverter.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import java.sql.JDBCType; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 18:11 + */ +public class BigIntCanalFieldConverter extends BaseCanalFieldConverter { + + /** + * 单例 + */ + public static final BaseCanalFieldConverter X = new BigIntCanalFieldConverter(); + + private BigIntCanalFieldConverter() { + super(JDBCType.BIGINT, Long.class); + } + + @Override + protected Long convertInternal(String source) { + return Long.valueOf(source); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/CanalFieldConvertInput.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/CanalFieldConvertInput.java new file mode 100644 index 0000000..2a8fe86 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/CanalFieldConvertInput.java @@ -0,0 +1,89 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + +import java.sql.SQLType; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/22 0:55 + */ +@SuppressWarnings("rawtypes") +public class CanalFieldConvertInput { + + private Class fieldKlass; + private Class converterKlass; + private SQLType sqlType; + + public CanalFieldConvertInput() { + + } + + public CanalFieldConvertInput(Class fieldKlass, Class converterKlass, SQLType sqlType) { + this.fieldKlass = fieldKlass; + this.converterKlass = converterKlass; + this.sqlType = sqlType; + } + + public static CanalFieldConvertInputBuild builder() { + return new CanalFieldConvertInputBuild(); + } + + public static class CanalFieldConvertInputBuild { + private Class fieldKlass; + private Class converterKlass; + private SQLType sqlType; + + public CanalFieldConvertInputBuild fieldKlass(Class fieldKlass) { + this.fieldKlass = fieldKlass; + return this; + } + + public CanalFieldConvertInputBuild converterKlass(Class converterKlass) { + this.converterKlass = converterKlass; + return this; + } + + public CanalFieldConvertInputBuild sqlType(SQLType sqlType) { + this.sqlType = sqlType; + return this; + } + + public CanalFieldConvertInput build() { + return new CanalFieldConvertInput(fieldKlass, converterKlass, sqlType); + } + } + + public Class getFieldKlass() { + return fieldKlass; + } + + public void setFieldKlass(Class fieldKlass) { + this.fieldKlass = fieldKlass; + } + + public Class getConverterKlass() { + return converterKlass; + } + + public void setConverterKlass(Class converterKlass) { + this.converterKlass = converterKlass; + } + + public SQLType getSqlType() { + return sqlType; + } + + public void setSqlType(SQLType sqlType) { + this.sqlType = sqlType; + } + + @Override + public String toString() { + return "CanalFieldConvertInput{" + + "fieldKlass=" + fieldKlass + + ", converterKlass=" + converterKlass + + ", sqlType=" + sqlType + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/IntCanalFieldConverter.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/IntCanalFieldConverter.java new file mode 100644 index 0000000..cd2370f --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/IntCanalFieldConverter.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import java.sql.JDBCType; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/22 0:29 + */ +public class IntCanalFieldConverter extends BaseCanalFieldConverter { + + /** + * 单例 + */ + public static final BaseCanalFieldConverter X = new IntCanalFieldConverter(); + + private IntCanalFieldConverter() { + super(JDBCType.INTEGER, Integer.class); + } + + @Override + protected Integer convertInternal(String source) { + return Integer.valueOf(source); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/NullCanalFieldConverter.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/NullCanalFieldConverter.java new file mode 100644 index 0000000..0ffc68b --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/NullCanalFieldConverter.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import java.sql.JDBCType; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 18:11 + */ +public class NullCanalFieldConverter extends BaseCanalFieldConverter { + + /** + * 单例 + */ + public static final BaseCanalFieldConverter X = new NullCanalFieldConverter(); + + private NullCanalFieldConverter() { + super(JDBCType.NULL, Void.class); + } + + @Override + protected Void convertInternal(String source) { + return null; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TimestampCanalFieldConverter0.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TimestampCanalFieldConverter0.java new file mode 100644 index 0000000..0a20f7d --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TimestampCanalFieldConverter0.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import java.sql.JDBCType; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/22 0:37 + */ +public class TimestampCanalFieldConverter0 extends BaseCanalFieldConverter { + + private static final DateTimeFormatter F = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + public static final BaseCanalFieldConverter X = new TimestampCanalFieldConverter0(); + + private TimestampCanalFieldConverter0() { + super(JDBCType.TIMESTAMP, LocalDateTime.class); + } + + @Override + protected LocalDateTime convertInternal(String source) { + return LocalDateTime.parse(source, F); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TinyIntCanalFieldConverter.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TinyIntCanalFieldConverter.java new file mode 100644 index 0000000..4fecbc9 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TinyIntCanalFieldConverter.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import java.sql.JDBCType; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/22 0:31 + */ +public class TinyIntCanalFieldConverter extends BaseCanalFieldConverter { + + /** + * 单例 + */ + public static final BaseCanalFieldConverter X = new TinyIntCanalFieldConverter(); + + private TinyIntCanalFieldConverter() { + super(JDBCType.TINYINT, Integer.class); + } + + @Override + protected Integer convertInternal(String source) { + return IntCanalFieldConverter.X.convert(source); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/VarcharCanalFieldConverter.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/VarcharCanalFieldConverter.java new file mode 100644 index 0000000..fb3733a --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/VarcharCanalFieldConverter.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import java.sql.JDBCType; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/22 0:23 + */ +public class VarcharCanalFieldConverter extends BaseCanalFieldConverter { + + /** + * 单例 + */ + public static final BaseCanalFieldConverter X = new VarcharCanalFieldConverter(); + + private VarcharCanalFieldConverter() { + super(JDBCType.VARCHAR, String.class); + } + + @Override + protected String convertInternal(String source) { + return source; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/processor/CanalBinlogEventProcessorFactory.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/processor/CanalBinlogEventProcessorFactory.java new file mode 100644 index 0000000..3b798f3 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/processor/CanalBinlogEventProcessorFactory.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.search.canal.support.processor; + +import com.tmerclub.cloud.search.canal.model.ModelTable; + +import java.util.List; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/24 0:59 + */ +public interface CanalBinlogEventProcessorFactory { + + /** + * 注册 + * @param modelTable + * @param processor + */ + void register(ModelTable modelTable, BaseCanalBinlogEventProcessor processor); + + /** + * 获取 + * @param modelTable + * @return + */ + List> get(ModelTable modelTable); +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/CollectionUtils.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/CollectionUtils.java new file mode 100644 index 0000000..ab5c8a1 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/CollectionUtils.java @@ -0,0 +1,25 @@ +package com.tmerclub.cloud.search.canal.util; + +import java.util.Collection; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/28 23:06 + */ +public enum CollectionUtils { + + /** + * 单例 + */ + X; + + public boolean isEmpty(Collection collection) { + return null == collection || collection.isEmpty(); + } + + public boolean isNotEmpty(Collection collection) { + return !isEmpty(collection); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/ReflectionUtils.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/ReflectionUtils.java new file mode 100644 index 0000000..d7a7949 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/ReflectionUtils.java @@ -0,0 +1,97 @@ +package com.tmerclub.cloud.search.canal.util; + + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/28 22:56 + */ +public enum ReflectionUtils { + + /** + * 单例 + */ + X; + + private static final Field[] EMPTY_FIELD_ARRAY = new Field[0]; + + private static final Map, Field[]> DECLARED_FIELDS_CACHE = new ConcurrentHashMap<>(32); + + private Field[] getDeclaredFields(Class clazz) { + AssertUtils.X.notNull(clazz, "Class must not be null"); + Field[] result = DECLARED_FIELDS_CACHE.get(clazz); + if (Objects.isNull(result)) { + try { + result = clazz.getDeclaredFields(); + DECLARED_FIELDS_CACHE.put(clazz, result.length == 0 ? EMPTY_FIELD_ARRAY : result); + } catch (Throwable e) { + throw new IllegalStateException("Failed to introspect Class [" + Objects.requireNonNull(clazz).getName() + "] from ClassLoader [" + clazz.getClassLoader() + "]", e); + } + } + return result; + } + + public void doWithFields(Class clazz, FieldCallback fieldCallback) { + doWithFields(clazz, fieldCallback, null); + } + + public void doWithFields(Class clazz, FieldCallback fieldCallback, FieldFilter fieldFilter) { + Class targetClass = clazz; + do { + Field[] fields = getDeclaredFields(targetClass); + int len = fields.length; + for (Field field : fields) { + if (field.getName() == "serialVersionUID") { + continue; + } + if (null == fieldFilter || fieldFilter.matches(field)) { + try { + fieldCallback.doWith(field); + } catch (IllegalAccessException var10) { + throw new IllegalStateException("Not allowed to access field '" + field.getName() + "': " + var10); + } + } + } + targetClass = targetClass.getSuperclass(); + } while (targetClass != null && targetClass != Object.class); + } + + public void makeAccessible(Field field) { + boolean isAccessible = (!Modifier.isPublic(field.getModifiers()) || + !Modifier.isPublic(field.getDeclaringClass().getModifiers()) || + Modifier.isFinal(field.getModifiers())) && !field.isAccessible(); + if (isAccessible) { + field.setAccessible(true); + } + } + + @FunctionalInterface + public interface FieldCallback { + + /** + * dowith + * @param field + * @throws IllegalArgumentException + * @throws IllegalAccessException + */ + void doWith(Field field) throws IllegalArgumentException, IllegalAccessException; + } + + @FunctionalInterface + public interface FieldFilter { + + /** + * matches + * @param field + * @return + */ + boolean matches(Field field); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/config/RocketMqConfig.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/config/RocketMqConfig.java new file mode 100644 index 0000000..a2f17c2 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/config/RocketMqConfig.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.config; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqAdapter; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * @author FrozenWatermelon + * @date 2021/3/30 + */ +@RefreshScope +@Configuration +public class RocketMqConfig { + + @Autowired + private RocketMqAdapter rocketMqAdapter; + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate presaleOrderCanalMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.PRESALE_ORDER_CANAL_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderNotifyTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_NOTIFY_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderRefundCancelMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_REFUND_CANAL_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate refundInterventionCancelMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.REFUND_INTERVENTION_CANAL_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderRefundRequstMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_REFUND_REQUEST_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendNotifyToUserTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsConstant.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsConstant.java new file mode 100644 index 0000000..ba55bdf --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsConstant.java @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.constant; + +import com.tmerclub.cloud.common.constant.Constant; + +/** + * 配置缓存名字 + * + * @author lhd + * @date 2020/12/30 + */ +public interface EsConstant { + /** + * 滚动查询的分片数 + */ + Integer MAX_PAGE_SIZE = 100; + /** + * 装修商品ids缓存名称和缓存失效时间 + */ + String RENOVATION_PRODUCT_IDS_CACHE = "renovationProductIdsCache"; + Integer RENOVATION_PRODUCT_IDS_CACHE_TIME = 300; + Integer RENOVATION_PRODUCT_IDS_LIMIT = 1000; + + String SCORE = "_score"; + + /** + * 商品 + */ + String SPU_ID = "spuId"; + String SHOP = "shop"; + String SPU_NAME_ZH = "spuNameZh"; + String SPU_NAME_EN = "spuNameEn"; + String SPU_NAME_LIKE_ZH = "spuNameLikeZh"; + String SPU_NAME_LIKE_EN = "spuNameLikeEn"; + String SELLING_POINT_ZH = "sellingPointZh"; + String SELLING_POINT_EN = "sellingPointEn"; + String SCORE_FEE = "scoreFee"; + String PRICE_FEE = "priceFee"; + String MARKET_PRICE_FEE = "marketPriceFee"; + String MAIN_IMG_URL = "mainImgUrl"; + String SPU_TYPE = "spuType"; + String SHOP_NAME = "shopName"; + String SHOP_ID = "shopId"; + String SHOP_IMG = "shopImg"; + String SHOP_TYPE = "shopType"; + String SPU_STATUS = "spuStatus"; + String PARTY_CODE = "partyCodes"; + String MODEL_ID = "modelIds"; + String HAS_STOCK = "hasStock"; + String PRE_SALE_TYPE = "preSaleType"; + String STOCK = "stock"; + String SALE_NUM = "saleNum"; + String ACTUAL_SOLD_NUM = "actualSoldNum"; + String WATER_SOLD_NUM = "waterSoldNum"; + String COMMENT_NUM = "commentNum"; + String GOOD_REVIEW_NUM = "goodReviewNum"; + String CREATE_TIME = "createTime"; + String UPDATE_TIME = "updateTime"; + String ACTIVITY_START_TIME = "activityStartTime"; + String SELECTED_LOT = "selectedLot"; + String SECKILL_CATEGORY_ID = "seckillCategoryId"; + String BRAND = "brand"; + String SEQ = "seq"; + String IS_TOP = "isTop"; + String ACTIVITY_ID = "activityId"; + String ACTIVITY_PRICE = "activityPrice"; + String SHOP_PRIMARY_CATEGORY_ID = "shopPrimaryCategoryId"; + String SHOP_CATEGORY = "shopCategory"; + String PRIMARY_CATEGORY_ID = "primaryCategoryId"; + String SECONDARY_CATEGORY_ID = "secondaryCategoryId"; + String CATEGORY = "category"; + String TAGS = "tags"; + String TAG_IDS = "tagIds"; + String ATTRS = "attrs"; + String SPU_LIST = "spuList"; + String APP_DISPLAY = "appDisplay"; + String DISTRIBUTION_SPU = "distributionSpu"; + String SUPPLIER_SPU_TYPE = "supplierSpuType"; + String SKU_CHOICE_STATUS = "skuChoiceStatus"; + String COMMISSION_SPU_STATUS = "commissionSpuStatus"; + String SUPPLIER_SPU_ID = "supplierSpuId"; + String SPU_CODE = "spuCode"; + String SKU_CODE = "partyCode"; + String SUPPLIER_DELIVERY_TYPE = "supplierDeliveryType"; + String SPU_MOLD = "spuMold"; + + /** + * 分销信息 + */ + String DISTRIBUTION_INFO = "distributionInfo"; + String DISTRIBUTION_SPU_ID = "distributionSpuId"; + String STATE = "state"; + String AWARD_MODE = "awardMode"; + String PARENT_AWARD_SET = "parentAwardSet"; + String AWARD_NUMBERS = "awardNumbers"; + String PARENT_AWARD_NUMBERS = "parentAwardNumbers"; + String STATE_UNION_NAME = DISTRIBUTION_INFO + Constant.PERIOD + STATE; + String AWARD_MODE_UNION_NAME = DISTRIBUTION_INFO + Constant.PERIOD + AWARD_MODE; + + /** + * 分组 + */ + String TAG_ID = "tagId"; + String TAG_UNION_ID = TAGS + Constant.PERIOD + TAG_ID; + String TAG_SEQ = "seq"; + String TAG_UNION_SEQ = TAGS + Constant.PERIOD + TAG_SEQ; + + /** + * 属性 + */ + String ATTR_IDS = "attrIds"; + String ATTR_ID = "attrId"; + String ATTR_VALUE_ID = "attrValueId"; + String ATTR_NAME_ZH = "attrNameZh"; + String ATTR_NAME_EN = "attrNameEn"; + String ATTR_VALUE_NAME_ZH = "attrValueNameZh"; + String ATTR_VALUE_NAME_EN = "attrValueNameEn"; + String ATTR_VALUE_IDS = "attrValueIds"; + String ATTR_UNION_ID = ATTRS + Constant.PERIOD + ATTR_ID; + String ATTR_ATTR_VALUE_ID = ATTRS + Constant.PERIOD + ATTR_VALUE_ID; + String ATTR_UNION_NAME_ZH = ATTRS + Constant.PERIOD + ATTR_NAME_ZH; + String ATTR_UNION_NAME_EN = ATTRS + Constant.PERIOD + ATTR_NAME_EN; + String ATTR_UNION_VALUE_ZH = ATTRS + Constant.PERIOD + ATTR_VALUE_NAME_ZH; + String ATTR_UNION_VALUE_EN = ATTRS + Constant.PERIOD + ATTR_VALUE_NAME_EN; + + /** + * 品牌 + */ + String BRANDS = "brands"; + String BRAND_ID = "brandId"; + String BRAND_IMG = "brandImg"; + String BRAND_NAME = "brandName"; + String BRAND_NAME_ZH = "brandNameZh"; + String BRAND_NAME_EN = "brandNameEn"; + String BRAND_UNION_ID = BRAND + Constant.PERIOD + BRAND_ID; + String BRAND_UNION_IMG = BRAND + Constant.PERIOD + BRAND_IMG; + String BRAND_UNION_NAME_ZH = BRAND + Constant.PERIOD + BRAND_NAME_ZH; + String BRAND_UNION_NAME_EN = BRAND + Constant.PERIOD + BRAND_NAME_EN; + + /** + * 分类 + */ + String CATEGORIES = "categories"; + String CATEGORY_ID = "categoryId"; + String CATEGORY_NAME = "categoryName"; + String SHOP_CATEGORIES = "shopCategories"; + String CATEGORY_NAME_ZH = "categoryNameZh"; + String CATEGORY_NAME_EN = "categoryNameEn"; + String SHOP_CATEGORY_ID = "shopSecondaryCategoryId"; + String SHOP_SECONDARY_CATEGORY_ID = "secondaryCategoryId"; + String SHOP_CATEGORYID = "shopCategoryId"; + String CATEGORY_UNION_ID = CATEGORY + Constant.PERIOD + CATEGORY_ID; + String SHOP_CATEGORY_UNION_ID = SHOP_CATEGORY + Constant.PERIOD + CATEGORY_ID; + String CATEGORY_UNION_NAME_ZH = CATEGORY + Constant.PERIOD + CATEGORY_NAME_ZH; + String CATEGORY_UNION_NAME_EN = CATEGORY + Constant.PERIOD + CATEGORY_NAME_EN; + String CATEGORY_NAMES = "categoryNames"; + String DELIVERY_MODE ="deliveryMode"; + String HAS_USER_PICK_UP ="hasUserPickUp"; + String HAS_SHOP_DELIVERY ="hasShopDelivery"; + String HAS_CITY_DELIVERY ="hasCityDelivery"; + String DELIVERY_USER_MODE = DELIVERY_MODE + Constant.PERIOD + HAS_USER_PICK_UP; + + String TOP_HITS_DATA = "top_hits_data"; + + /** + * 供应商 + */ + String SUPPLIER_NAME = "supplierName"; + String SUPPLIER_ID = "supplierId"; + + /** + * 商品指定返回字段 + */ + String[] BRAND_INCLUDE = {BRAND_UNION_ID, BRAND_UNION_IMG, BRAND_UNION_NAME_ZH, BRAND_UNION_NAME_EN}; + String[] CATEGORY_INCLUDE = {CATEGORY_UNION_ID, CATEGORY_UNION_NAME_ZH, CATEGORY_UNION_NAME_EN}; + String[] ATTR_INCLUDE = {ATTR_UNION_NAME_ZH, ATTR_UNION_NAME_EN, ATTR_ATTR_VALUE_ID, ATTR_UNION_VALUE_ZH, ATTR_UNION_VALUE_EN}; + String[] TAG_INCLUDE = {TAG_ID}; + String[] APP_FETCH_SOURCE = {SPU_ID, SPU_NAME_ZH, SPU_NAME_EN, SELLING_POINT_ZH, SELLING_POINT_EN, SHOP_ID, SHOP_NAME, SHOP_TYPE, SPU_TYPE, PRICE_FEE, MARKET_PRICE_FEE, ACTIVITY_PRICE, HAS_STOCK, SALE_NUM, COMMENT_NUM, GOOD_REVIEW_NUM, MAIN_IMG_URL, SCORE_FEE, ACTIVITY_ID, ACTIVITY_START_TIME, SUPPLIER_SPU_ID, SUPPLIER_DELIVERY_TYPE, SUPPLIER_SPU_TYPE}; + String[] SHOP_FETCH_SOURCE = {SPU_ID, SPU_NAME_ZH, SPU_NAME_EN, SHOP_NAME, MAIN_IMG_URL, PRICE_FEE, MARKET_PRICE_FEE, SPU_TYPE, SPU_MOLD, ACTUAL_SOLD_NUM, SALE_NUM, STOCK, SEQ, SPU_STATUS, SUPPLIER_SPU_TYPE, SUPPLIER_SPU_ID, SUPPLIER_DELIVERY_TYPE, SHOP_ID, SHOP_CATEGORY_ID, SHOP_SECONDARY_CATEGORY_ID, SHOP_CATEGORYID, DELIVERY_MODE}; + String[] PLATFORM_FETCH_SOURCE = {SHOP_ID, SUPPLIER_ID, SUPPLIER_SPU_TYPE, SHOP_NAME, SUPPLIER_NAME, MAIN_IMG_URL, SPU_ID, SPU_NAME_ZH, SPU_NAME_EN, PRICE_FEE, MARKET_PRICE_FEE, SPU_TYPE, SPU_MOLD, ACTUAL_SOLD_NUM, WATER_SOLD_NUM, STOCK, SEQ, IS_TOP, SPU_STATUS, SCORE_FEE, PRIMARY_CATEGORY_ID}; + String[] PLATFORM_TAG_FETCH_SOURCE = {SPU_ID, SPU_NAME_ZH, SPU_NAME_EN, MAIN_IMG_URL, SPU_STATUS, TAGS}; + String[] SIMPLE_FETCH_SOURCE = {SPU_ID, SHOP_NAME, SPU_NAME_ZH, SPU_NAME_EN, MAIN_IMG_URL, UPDATE_TIME}; + String[] DISTRIBUTION_SPU_SOURCE = {SPU_ID, SHOP_NAME, SPU_NAME_ZH, SPU_NAME_EN, MAIN_IMG_URL, PRICE_FEE, DISTRIBUTION_INFO}; + String[] SUPPLIER_SPU = {SPU_ID, SHOP_ID, MAIN_IMG_URL, SPU_NAME_ZH, SPU_NAME_EN, BRAND_NAME_ZH, BRAND_NAME_EN, SHOP_NAME, PRICE_FEE, SPU_STATUS, CATEGORY_NAMES, SUPPLIER_SPU_TYPE, SUPPLIER_NAME, SUPPLIER_ID, BRAND, SHOP_NAME, SHOP_SECONDARY_CATEGORY_ID, SHOP_CATEGORYID}; + String[] CONSIGNMENT_SPU = {SPU_ID, MAIN_IMG_URL, SPU_NAME_ZH, SPU_NAME_EN, CATEGORY_NAME, BRAND_NAME_ZH, BRAND_NAME_EN, SUPPLIER_NAME, SPU_STATUS, SKU_CHOICE_STATUS, SUPPLIER_ID, BRAND_NAME, COMMISSION_SPU_STATUS, SUPPLIER_SPU_ID, CATEGORY_NAMES, BRAND, SUPPLIER_DELIVERY_TYPE, SHOP_CATEGORYID}; + String[] SUPPLIER_FETCH_SOURCE = {SPU_ID, SPU_NAME_ZH,SPU_MOLD, SPU_NAME_EN, MAIN_IMG_URL, PRICE_FEE, MARKET_PRICE_FEE, ACTUAL_SOLD_NUM, STOCK, SEQ, SPU_STATUS, CATEGORY_ID, CATEGORY_NAME, SUPPLIER_NAME, HAS_STOCK, BRAND_NAME, SPU_CODE, SKU_CODE, CATEGORY_NAMES, PARTY_CODE, BRAND}; + String[] RENOVATION_FETCH_SOURCE = {SPU_ID, SPU_NAME_ZH, SPU_NAME_EN, SPU_TYPE, SPU_STATUS, SELLING_POINT_ZH, SELLING_POINT_EN, SHOP_ID, PRICE_FEE, MARKET_PRICE_FEE, ACTIVITY_PRICE, SCORE_FEE, SALE_NUM, MAIN_IMG_URL, ACTIVITY_ID, SHOP_NAME, STOCK, ACTIVITY_START_TIME}; + String[] PLATFORM_EXPORT_FETCH_SOURCE = {SPU_ID, SPU_TYPE, SPU_STATUS, SPU_MOLD, SPU_CODE, SHOP_NAME, SUPPLIER_NAME}; + + /** + * 订单指定返回字段 + */ + String[] ORDER_TASK_FETCH_SOURCE = {"orderId", "paySysType", "shopId", "freightAmount", "platformFreeFreightAmount"}; + /** + * 退款订单指定返回字段 + */ + String[] REFUND_ORDER_CANAL_TASK_FETCH_SOURCE = {"refundId"}; + /** + * 退款订单超时提醒指定返回字段 + */ + String[] REFUND_ORDER_TIMEOUT_REMINDER_TASK_FETCH_SOURCE = {"refundId", "orderId", "spuNameZh", "spuNameEn", "shopId", "userId", "actualTotal", "mobile"}; + + /** + * 待发货订单返回字段 + */ + String[] UN_DELIVERY_ORDER_FETCH_SOURCE = {"orderId", "consignee", "mobile", "deliveryType", "orderAddrId", "total", "actualTotal", "shopId", "userId", "orderItems", "province", "city", "area", "addr"}; +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsProductSortEnum.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsProductSortEnum.java new file mode 100644 index 0000000..9d8df2d --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsProductSortEnum.java @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.constant; + +import org.elasticsearch.search.sort.SortOrder; + + +/** + * 商品排序 + * @author FrozenWatermelon + * @date 2020/11/17 + */ +public enum EsProductSortEnum { + + /** + * 创建时间正序 + */ + CREATE_TIME_ASC(0, "createTime", SortOrder.ASC), + + /** + * 创建时间倒序 + */ + CREATE_TIME_DESC(1, "createTime", SortOrder.DESC), + + /** + * 销量倒序 + */ + SALE_NUM_DESC(2, "saleNum", SortOrder.DESC), + + /** + * 销量正序 + */ + SALE_NUM_ASC(3, "saleNum", SortOrder.ASC), + + /** + * 商品价格倒序 + */ + PRICE_DESC(4, "priceFee", SortOrder.DESC), + + /** + * 商品价格正序 + */ + PRICE_ASC(5, "priceFee", SortOrder.ASC), + + /** + * 分组排序 + */ + SPU_TAG_DESC(6, "tags.seq", SortOrder.DESC), + + /** + * 市场价倒序 + */ + MARKET_PRICE_DESC(7, "marketPriceFee", SortOrder.DESC), + + /** + * 市场价正序 + */ + MARKET_PRICE_ASC(8, "marketPriceFee", SortOrder.ASC), + + /** + * 分组正序 + */ + SPU_TAG_ASC(9, "tags.seq", SortOrder.ASC), + + /** + * 商品库存倒序 + */ + STOCK_DESC(10, "stock", SortOrder.DESC), + + /** + * 商品库存正序 + */ + STOCK_ASC(11, "stock", SortOrder.ASC), + + /** + * 商品序号倒序 + */ + SEQ_DESC(12, "seq", SortOrder.DESC), + + /** + * 商品序号正序 + */ + SEQ_ASC(13, "seq", SortOrder.ASC), + + /** + * 评论数量倒序 + */ + COMMENT_NUM_DESC(14, "commentNum", SortOrder.DESC), + + /** + * 评论数量正序 + */ + COMMENT_NUM_ASC(15, "commentNum", SortOrder.ASC), + + /** + * 根据置顶状态排序 + */ + IS_TOP_DESC(16, "isTop", SortOrder.DESC), + + /** + * 实际销量倒序 + */ + ACTUAL_SOLD_NUM_DESC(17, "actualSoldNum", SortOrder.DESC), + + /** + * 实际销量正序 + */ + ACTUAL_SOLD_NUM_ASC(18, "actualSoldNum", SortOrder.ASC), + + /** + * 注水销量倒序 + */ + WATER_SOLD_NUM_DESC(19, "waterSoldNum", SortOrder.DESC), + + /** + * 注水销量正序 + */ + WATER_SOLD_NUM_ASC(20, "waterSoldNum", SortOrder.ASC), + + /** + * spu编码正序 + */ + SPU_CODE_ASC(21, "spuCode", SortOrder.ASC), + + /** + * spu编码倒序 + */ + SPU_CODE_DESC(22, "spuCode", SortOrder.DESC), + + /** + * spu状态正序 + */ + SPU_STATUS_ASC(23, "spuStatus", SortOrder.ASC), + + /** + * spu状态倒序 + */ + SPU_STATUS_DESC(24, "spuStatus", SortOrder.DESC), + + /** + * 不进行任何排序 + */ + NON_SORT(25, null, null), + + + ; + + private final Integer value; + + private final String param; + + private final SortOrder order; + + public Integer value() { + return value; + } + + EsProductSortEnum(Integer value, String param, SortOrder order) { + this.value = value; + this.param = param; + this.order = order; + } + + public String param() { + return param; + } + + public SortOrder order() { + return order; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsSupplierSpuStatus.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsSupplierSpuStatus.java new file mode 100644 index 0000000..f317168 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsSupplierSpuStatus.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.tmerclub.cloud.search.constant; + +/** + * @author xxw + * @date 2022/7/4 9:09 + * 供应商商品类型 + */ +public enum EsSupplierSpuStatus { + /** + * 不是供应商商品类型 + */ + NO_SUPPLIER_SPU(0), + + /** + * 是供应商商品类型 + */ + SUPPLIER_SPU(1), + + /** + * 代销商品 + */ + CONSIGNMENT(2); + + private final Integer value; + + public Integer value() { + return value; + } + + EsSupplierSpuStatus(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/admin/OrderRefundSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/admin/OrderRefundSearchController.java new file mode 100644 index 0000000..df485ae --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/admin/OrderRefundSearchController.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.controller.admin; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderRefundVO; +import com.tmerclub.cloud.common.order.vo.EsOrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.search.manager.OrderRefundSearchManager; +import com.tmerclub.cloud.search.manager.OrderSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 商品搜索 + * + * @author FrozenWatermelon + * @date 2020/11/16 + */ +@RestController("adminOrderRefundSearchController") +@RequestMapping("/mp/search/order_refund") +@Tag(name = "admin-退款订单搜索接口") +public class OrderRefundSearchController { + + @Autowired + private OrderRefundSearchManager orderRefundSearchManager; + + @Autowired + private OrderSearchManager orderSearchManager; + + @GetMapping("/page") + @Operation(summary = "退款订单搜索接口", description = "退款订单搜索接口") + public ServerResponseEntity> pcPage(@Valid EsPageDTO pageDTO, OrderRefundSearchDTO orderRefundSearchDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + orderRefundSearchDTO.setShopId(shopId); + } + orderRefundSearchDTO.setSysType(AuthUserContext.get().getSysType()); + EsPageVO orderRefundPage = orderRefundSearchManager.page(pageDTO, orderRefundSearchDTO); + if (CollUtil.isNotEmpty(orderRefundPage.getList())) { + insertOrderStatus(orderRefundPage.getList()); + } + return ServerResponseEntity.success(orderRefundPage); + } + + private void insertOrderStatus(List list) { + List orderIds = list.stream().map(EsOrderRefundVO::getOrderId).collect(Collectors.toList()); + List orderList = orderSearchManager.listByOrderIds(orderIds); + Map orderMap = orderList.stream().collect(Collectors.toMap(EsOrderVO::getOrderId, EsOrderVO::getStatus)); + for (EsOrderRefundVO orderRefund : list) { + orderRefund.setOrderStatus(orderMap.get(orderRefund.getOrderId())); + } + } + +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/app/ProductSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/app/ProductSearchController.java new file mode 100644 index 0000000..793fdfc --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/app/ProductSearchController.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.controller.app; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.product.constant.SupplierSpuType; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.search.constant.EsConstant; +import com.tmerclub.cloud.search.manager.ProductSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +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.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 商品搜索 + * + * @author FrozenWatermelon + * @date 2020/11/16 + */ +@RestController("appSearchSpuController") +@RequestMapping("/ua/search") +@Tag(name = "spu搜索接口") +public class ProductSearchController { + + @Autowired + private ProductSearchManager productSearchManager; + @DubboReference + private SpuFeignClient spuFeignClient; + + + @GetMapping("/pc_page") + @Operation(summary = "pc端商品搜索接口", description = "pc端商品搜索接口") + public ServerResponseEntity> pcPage(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + productSearchDTO.setAttrMap(productSearchManager.splitAttr(productSearchDTO.getAttrIds())); + productSearchDTO.setAppDisplay(true); + productSearchDTO.setIsSupplierType(1); + EsPageVO searchPage = productSearchManager.page(pageDTO, productSearchDTO); + productSearchManager.loadData(productSearchDTO, searchPage.getList()); + //检查代销商品是否改变了原有得供应商图片和名字,如果改变了显示商家改变后的图片和名字,没有改变则显示供应商信息 + ServerResponseEntity> listServerResponseEntity = spuFeignClient.usCheckCommissionSpuIsUpdateMsg(searchPage.getList()); + List result = listServerResponseEntity.getData(); + //仅看有货 + if (Objects.nonNull(productSearchDTO.getHasStock()) && Objects.equals(productSearchDTO.getHasStock(), 1)) { + //供应商发货的代销商品Spu + List commissionList = searchPage.getList().get(0).getSpus().stream().filter(item -> Objects.equals(item.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value()) && Objects.equals(item.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())).collect(Collectors.toList()); + List commisionIds = commissionList.stream().map(SpuSearchVO::getSpuId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(commisionIds)) { + List spuIsSyn = spuFeignClient.getSpuIsSynUpdate(commisionIds).getData(); + Map stockInfo = spuIsSyn.stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getTotalStock)); + List zeroStock = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long spuId : commisionIds) { + if (Objects.equals(stockInfo.get(spuId), 0)) { + zeroStock.add(spuId); + } + } + //获取供应商发货的代销商品的id,过滤掉供应商库存为0的商品 + List searchList = result.get(0).getSpus().stream().filter(spuSearch -> !zeroStock.contains(spuSearch.getSpuId())).collect(Collectors.toList()); + result.get(0).setSpus(searchList); + } + + } + + + searchPage.setList(result); + return ServerResponseEntity.success(searchPage); + } + + @GetMapping("/page") + @Operation(summary = "商品搜索接口(仅商品信息)", description = "商品搜索接口") + public ServerResponseEntity> page(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + return ServerResponseEntity.success(simplePage(pageDTO, productSearchDTO)); + } + + @GetMapping("/search_page") + @Operation(summary = "手机端商品搜索接口", description = "手机端商品搜索接口") + public ServerResponseEntity> searchPage(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + productSearchDTO.setAttrMap(productSearchManager.splitAttr(productSearchDTO.getAttrIds())); + EsPageVO page = simplePage(pageDTO, productSearchDTO); + ProductSearchVO productSearchVO = page.getList().get(0); + ProductSearchVO productInfo = productSearchManager.searchExtension(pageDTO, productSearchDTO); + if (!Objects.isNull(productInfo.getAttrs())) { + productSearchManager.loadAttr(productInfo, null); + } + productSearchVO.setBrands(productInfo.getBrands()); + productSearchVO.setAttrs(productInfo.getAttrs()); + productSearchVO.setCategorys(productInfo.getCategorys()); + //检查代销商品是否改变了原有得供应商图片和名字,如果改变了显示商家改变后的图片和名字,没有改变则显示供应商信息 + ServerResponseEntity> listServerResponseEntity = spuFeignClient.usCheckCommissionSpuIsUpdateMsg(page.getList()); + List result = listServerResponseEntity.getData(); + page.setList(result); + return ServerResponseEntity.success(page); + } + + @GetMapping("/page_distribution_spu") + @Operation(summary = "分销商品列表", description = "分销商品列表") + public ServerResponseEntity> pageDistributionSpu(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + productSearchDTO.setDistributionSpu(Boolean.TRUE); + productSearchDTO.setFetchSource(EsConstant.DISTRIBUTION_SPU_SOURCE); + EsPageVO searchPage = productSearchManager.page(pageDTO, productSearchDTO); + return ServerResponseEntity.success(searchPage); + } + + @GetMapping("/renovation_page") + @Operation(summary = "商品信息列表(app装修商品列表)", description = "商品信息列表(app装修商品列表)") + public ServerResponseEntity> renovationPage(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + EsPageVO searchPage = productSearchManager.showSpuTypeRenovationPage(pageDTO, productSearchDTO); + return ServerResponseEntity.success(searchPage); + } + + private EsPageVO simplePage(EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + EsPageVO searchPage = productSearchManager.spuPage(pageDTO, productSearchDTO); + productSearchManager.loadData(productSearchDTO, searchPage.getList()); + //检查代销商品是否改变了原有得供应商图片和名字,如果改变了显示商家改变后的图片和名字,没有改变则显示供应商信息 + List spus = searchPage.getList().get(0).getSpus(); + List spuAdminList = BeanUtil.mapAsList(spus, SpuAdminVO.class); + List data = spuFeignClient.checkCommissionSpuIsUpdateMsg(spuAdminList).getData(); + List spuSearchList = BeanUtil.mapAsList(data, SpuSearchVO.class); + Map spuMap = spus.stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, s -> s)); + for (SpuSearchVO spuSearchVO : spuSearchList) { + if (!spuMap.containsKey(spuSearchVO.getSpuId())) { + continue; + } + SpuSearchVO spu = spuMap.get(spuSearchVO.getSpuId()); + spuSearchVO.setSpuActivity(spu.getSpuActivity()); + } + + searchPage.getList().get(0).setSpus(spuSearchList); + return searchPage; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/multishop/AllotOrderSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/multishop/AllotOrderSearchController.java new file mode 100644 index 0000000..17eea82 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/multishop/AllotOrderSearchController.java @@ -0,0 +1,39 @@ +package com.tmerclub.cloud.search.controller.multishop; + +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.order.dto.AllotOrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsAllotOrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.search.manager.AllotOrderSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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; + +/** + * @author gaozijie + * @since 2023-11-27 + */ +@Tag(name = "调拨订单搜索接口(商家端)") +@RestController("multiShopAllotOrderSearchController") +@RequestMapping("/m/allot_order_search") +public class AllotOrderSearchController { + + @Autowired + private AllotOrderSearchManager allotOrderSearchManager; + + @Operation(summary = "分页查询") + @GetMapping("/page") + public ServerResponseEntity> page(EsPageDTO pageDTO, + AllotOrderSearchDTO allotOrderSearchDTO) { + allotOrderSearchDTO.setShopId(AuthUserContext.get().getTenantId()); + allotOrderSearchDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + EsPageVO page = allotOrderSearchManager.page(pageDTO, allotOrderSearchDTO); + return ServerResponseEntity.success(page); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/platform/WalletLogOperationController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/platform/WalletLogOperationController.java new file mode 100644 index 0000000..8e19b3e --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/platform/WalletLogOperationController.java @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.controller.platform; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.multishop.feign.WalletLogOperationFeignClient; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.supplier.feign.SupplierWalletLogOperationFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.search.manager.OrderSearchManager; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import io.swagger.v3.oas.annotations.Operation; +import org.apache.dubbo.config.annotation.DubboReference; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchScrollRequest; +import org.elasticsearch.core.TimeValue; +import org.elasticsearch.search.Scroll; +import org.elasticsearch.search.SearchHit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 恢复供应商结算和未结算记录用的,商城中不要调这个类下的接口 + * + * @author FrozenWatermelon + * @date 2020/11/16 + */ +public class WalletLogOperationController { + + private static final Logger logger = LoggerFactory.getLogger(WalletLogOperationController.class); + + @Autowired + private OrderSearchManager orderSearchManager; + @DubboReference + private WalletLogOperationFeignClient walletLogOperationFeignClient; + @DubboReference + private SupplierWalletLogOperationFeignClient supplierWalletLogOperationFeignClient; + + @GetMapping("/supplierLog") + @Operation(summary = "恢复供应商待结算、已结算记录", description = "商品管理信息列表(平台端)") + public ServerResponseEntity> supplierLog() { + OrderSearchDTO param = new OrderSearchDTO(); + param.setPageSize(50); + List mustNotStatusList = new ArrayList<>(Constant.INITIAL_CAPACITY); + mustNotStatusList.add(OrderStatus.CLOSE.value()); + mustNotStatusList.add(OrderStatus.WAIT_GROUP.value()); + mustNotStatusList.add(OrderStatus.WAIT_PURCHASE.value()); + mustNotStatusList.add(OrderStatus.WAIT_BALANCE.value()); + param.setMustNotStatusList(mustNotStatusList); + String scrollId = null; + //设置查询超时时间 + Scroll scroll = new Scroll(TimeValue.timeValueMinutes(5L)); + SearchRequest searchRequest = orderSearchManager.buildScrollSearchRequest(param, scroll); + try { + // 进行第一次滚动查询 + SearchResponse searchResponse = EsSearchUtil.search(searchRequest); + scrollId = searchResponse.getScrollId(); + /* + 在这个位置已经读到了前一百条数据,可以在这先对这一百数据进行处理。下面滚动查询剩下的数据 + */ + addSupplierLog(searchResponse); + //记录要滚动的ID + //滚动查询部分,将从第101笔数据开始取 + SearchHit[] hitsScroll = searchResponse.getHits().getHits(); + while (hitsScroll != null && hitsScroll.length > 0) { + //构造滚动查询条件 + SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId); + searchScrollRequest.scroll(scroll); + searchResponse = EsSearchUtil.scroll(searchScrollRequest); + addSupplierLog(searchResponse); + scrollId = searchResponse.getScrollId(); + hitsScroll = searchResponse.getHits().getHits(); + } + } catch (Exception e) { + logger.error("订单结算异常", e); + return ServerResponseEntity.fail(ResponseEnum.EXCEPTION); + } finally { + if (Objects.nonNull(scrollId)) { + //清除滚动,否则影响下次查询 + EsSearchUtil.clearScroll(scrollId); + } + } + return ServerResponseEntity.success(); + } + + /** + * 删除供应商中未支付的待结算记录 + * 基本用不到,只有supplierLog()生成记录时没有过滤掉未支付和支付失败的订单时 + * 才会用这个接口来删除supplierLog()多生成的未支付和支付失败的订单的待结算记录 + * + * @return + */ + @GetMapping("/deleteSupplierLog") + @Operation(summary = "删除供应商中未支付的待结算记录", description = "删除供应商待结算") + public ServerResponseEntity> deleteSupplierLog() { + OrderSearchDTO param = new OrderSearchDTO(); + param.setPageSize(50); + // 状态可以改为待支付(UNPAY)、交易失败(CLOSE) + param.setStatus(OrderStatus.CLOSE.value()); + String scrollId = null; + //设置查询超时时间 + Scroll scroll = new Scroll(TimeValue.timeValueMinutes(5L)); + SearchRequest searchRequest = orderSearchManager.buildScrollSearchRequest(param, scroll); + try { + // 进行第一次滚动查询 + SearchResponse searchResponse = EsSearchUtil.search(searchRequest); + scrollId = searchResponse.getScrollId(); + /* + 在这个位置已经读到了前一百条数据,可以在这先对这一百数据进行处理。下面滚动查询剩下的数据 + */ + deleteSupplierLog(searchResponse); + //记录要滚动的ID + //滚动查询部分,将从第101笔数据开始取 + SearchHit[] hitsScroll = searchResponse.getHits().getHits(); + while (hitsScroll != null && hitsScroll.length > 0) { + //构造滚动查询条件 + SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId); + searchScrollRequest.scroll(scroll); + searchResponse = EsSearchUtil.scroll(searchScrollRequest); + deleteSupplierLog(searchResponse); + scrollId = searchResponse.getScrollId(); + hitsScroll = searchResponse.getHits().getHits(); + } + } catch (Exception e) { + logger.error("订单结算异常", e); + return ServerResponseEntity.fail(ResponseEnum.EXCEPTION); + } finally { + if (Objects.nonNull(scrollId)) { + //清除滚动,否则影响下次查询 + EsSearchUtil.clearScroll(scrollId); + } + } + return ServerResponseEntity.success(); + } + + private void addSupplierLog(SearchResponse searchResponse) { + List orderBOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SearchHit hit : searchResponse.getHits().getHits()) { + EsOrderBO esOrderBO = JSON.parseObject(hit.getSourceAsString(), EsOrderBO.class); + if (Objects.equals(esOrderBO.getStatus(), OrderStatus.CLOSE.value())) { + logger.info("订单关闭"); + } + if (Objects.isNull(esOrderBO.getSupplierId()) || Objects.equals(esOrderBO.getSupplierId(), 0L)) { + continue; + } + orderBOList.add(esOrderBO); + } + if (CollUtil.isEmpty(orderBOList)) { + return; + } + walletLogOperationFeignClient.addSupplierLog(Json.toJsonString(orderBOList)); + } + + private void deleteSupplierLog(SearchResponse searchResponse) { + List orderBOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SearchHit hit : searchResponse.getHits().getHits()) { + EsOrderBO esOrderBO = JSON.parseObject(hit.getSourceAsString(), EsOrderBO.class); + if (!Objects.equals(esOrderBO.getStatus(), OrderStatus.CLOSE.value()) || Objects.equals(esOrderBO.getIsPayed(), 1)) { + continue; + } + if (Objects.isNull(esOrderBO.getSupplierId()) || Objects.equals(esOrderBO.getSupplierId(), 0L)) { + continue; + } + orderBOList.add(esOrderBO); + } + if (CollUtil.isEmpty(orderBOList)) { + return; + } + supplierWalletLogOperationFeignClient.deleteSupplierLog(Json.toJsonString(orderBOList)); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/AllotOrderSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/AllotOrderSearchController.java new file mode 100644 index 0000000..5227409 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/AllotOrderSearchController.java @@ -0,0 +1,39 @@ +package com.tmerclub.cloud.search.controller.supplier; + +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.order.dto.AllotOrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsAllotOrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.search.manager.AllotOrderSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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; + +/** + * @author gaozijie + * @since 2023-11-27 + */ +@Tag(name = "调拨订单搜索接口(供应商端)") +@RestController("supplierAllotOrderSearchController") +@RequestMapping("/s/allot_order_search") +public class AllotOrderSearchController { + + @Autowired + private AllotOrderSearchManager allotOrderSearchManager; + + @Operation(summary = "分页查询") + @GetMapping("/page") + public ServerResponseEntity> page(EsPageDTO pageDTO, + AllotOrderSearchDTO allotOrderSearchDTO) { + allotOrderSearchDTO.setShopId(AuthUserContext.get().getTenantId()); + allotOrderSearchDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + EsPageVO page = allotOrderSearchManager.page(pageDTO, allotOrderSearchDTO); + return ServerResponseEntity.success(page); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/OrderSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/OrderSearchController.java new file mode 100644 index 0000000..2881125 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/OrderSearchController.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.controller.supplier; + +import com.tmerclub.cloud.api.product.feign.CategoryShopFeignClient; +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.OrderExcelVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.search.manager.OrderSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.util.List; + +/** + * 订单搜索 + * + * @author YXF + * @date 2023/08/10 + */ +@RestController("supplierOrderSearchController") +@RequestMapping("/s/order/search") +@Tag(name = "admin-order管理列表接口") +public class OrderSearchController { + private static final Logger LOGGER = LoggerFactory.getLogger(OrderSearchController.class); + + @Autowired + private OrderSearchManager orderSearchManager; + @Autowired + private SkuFeignClient skuFeignClient; + @Autowired + private CategoryShopFeignClient categoryShopFeignClient; + @Autowired + private SpuFeignClient spuFeignClient; + @Autowired + private SupplierDetailFeignClient supplierDetailFeignClient; + + + @GetMapping("/sold_excel") + @Operation(summary = "导出excel", description = "导出订单excel") + public ServerResponseEntity orderSoldExcel(HttpServletResponse response, OrderSearchDTO orderSearchDTO) { + orderSearchDTO.setSupplierId(AuthUserContext.get().getTenantId()); + orderSearchDTO.setIsPayed(1); + // 查询订单列表 + List orderExcelList = orderSearchManager.orderExcelScrollSearch(orderSearchDTO); + // 生成excel + ExcelUtil.soleExcel(response, orderExcelList, OrderExcelVO.EXCEL_NAME, OrderExcelVO.MERGE_ROW_INDEX, OrderExcelVO.MERGE_COLUMN_INDEX, OrderExcelVO.class); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/ProductSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/ProductSearchController.java new file mode 100644 index 0000000..1075cfa --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/ProductSearchController.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.controller.supplier; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.product.feign.CategoryFeignClient; +import com.tmerclub.cloud.api.product.feign.SkuStockFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.product.bo.EsBrandBO; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.constant.SupplierSpuType; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.search.constant.EsConstant; +import com.tmerclub.cloud.search.manager.ProductSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.commons.compress.utils.Lists; +import org.apache.dubbo.config.annotation.DubboReference; +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.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 商品搜索 + * + * @author FrozenWatermelon + * @date 2020/11/16 + */ +@RestController("suplplierSearchSpuController") +@RequestMapping("/s/search") +@Tag(name = "supplier-spu管理列表接口") +public class ProductSearchController { + + @Autowired + private ProductSearchManager productSearchManager; + @Autowired + private SkuStockFeignClient skuStockFeignClient; + + @DubboReference + private CategoryFeignClient categoryFeignClient; + + @GetMapping("/page") + @Operation(summary = "商品信息列表", description = "商品信息列表") + public ServerResponseEntity> page(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + Long supplierId = AuthUserContext.get().getTenantId(); + productSearchDTO.setFetchSource(EsConstant.SUPPLIER_FETCH_SOURCE); + productSearchDTO.setSupplierId(supplierId); + productSearchDTO.setShopId(-1L); + productSearchDTO.setSupplierSpuType(SupplierSpuType.YES.value()); + EsPageVO searchPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + List list = searchPage.getList(); + Set categoryIds = list.stream().map(SpuAdminVO::getCategoryId).collect(Collectors.toSet()); + ServerResponseEntity> categoryResp = categoryFeignClient.getByCategoryIds(categoryIds); + Map categoryMap = categoryResp.getData().stream().collect(Collectors.toMap(CategoryVO::getCategoryId, c -> c)); + List comboSpuList = Lists.newArrayList(); + for (SpuAdminVO spuAdminVO : list) { + //品牌名称 + setBrandName(spuAdminVO); + spuAdminVO.setCategoryNames(Objects.nonNull(spuAdminVO.getCategoryId()) ? Objects.equals(I18nMessage.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang()) ? categoryMap.get(spuAdminVO.getCategoryId()).getCategoryLangList().get(0).getName() : categoryMap.get(spuAdminVO.getCategoryId()).getCategoryLangList().get(1).getName() : null); + if(Objects.equals(spuAdminVO.getSpuMold(), SpuMold.COMBO.value())) { + comboSpuList.add(spuAdminVO.getSpuId()); + } + } + // 如果是组合商品,需要重新计算一下库存 + if (CollUtil.isNotEmpty(comboSpuList)) { + ServerResponseEntity> spuIdStockMapResp = skuStockFeignClient.calculateStockByComboSpuList(comboSpuList); + Map spuStockMap = spuIdStockMapResp.getData(); + for (SpuAdminVO spuAdminVO : list) { + if(!spuStockMap.containsKey(spuAdminVO.getSpuId())){ + continue; + } + spuAdminVO.setStock(spuStockMap.get(spuAdminVO.getSpuId())); + } + } + // 加载商品总库存 + this.loadSpuStock(searchPage); + return ServerResponseEntity.success(searchPage); + + } + + @GetMapping("/page_distribution_spu") + @Operation(summary = "分销商品列表", description = "分销商品列表") + public ServerResponseEntity> pageDistributionSpu(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + productSearchDTO.setShopId(shopId); + } + productSearchDTO.setFetchSource(EsConstant.DISTRIBUTION_SPU_SOURCE); + EsPageVO searchPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + List list = searchPage.getList(); + return ServerResponseEntity.success(searchPage); + } + + @GetMapping("/stockWarning_count") + @Operation(summary = "库存预警数目", description = "库存预警数目") + public ServerResponseEntity stockWarningCount() { + Long supplierId = AuthUserContext.get().getTenantId(); + ProductSearchDTO productSearchDTO = new ProductSearchDTO(); + productSearchDTO.setFetchSource(EsConstant.SUPPLIER_FETCH_SOURCE); + productSearchDTO.setSupplierId(supplierId); + productSearchDTO.setShopId(-1L); + productSearchDTO.setSupplierSpuType(SupplierSpuType.YES.value()); + productSearchDTO.setStockWarning(1); + productSearchDTO.setDataType(0); + EsPageDTO pageDTO = new EsPageDTO(); + pageDTO.setPageSize(1); + pageDTO.setPageNum(1); + EsPageVO searchPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + return ServerResponseEntity.success(searchPage.getTotal()); + } + + public void setBrandName(SpuAdminVO spuAdminVO) { + //品牌名称 + Integer lang = I18nMessage.getLang(); + EsBrandBO brand = spuAdminVO.getBrand(); + if (!Objects.isNull(brand)) { + if (Objects.equals(lang, LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + spuAdminVO.setBrandName(brand.getBrandNameZh()); + } + if (Objects.equals(lang, LanguageEnum.LANGUAGE_EN.getLang())) { + spuAdminVO.setBrandName(brand.getBrandNameEn()); + } + } + } + + private void loadSpuStock(EsPageVO searchPage) { + ServerResponseEntity> listServerResponseEntity = skuStockFeignClient.loadProdStock(searchPage.getList()); + if (!listServerResponseEntity.isSuccess()) { + throw new LuckException(listServerResponseEntity.getMsg()); + } + searchPage.setList(listServerResponseEntity.getData()); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/PurchaseOrderSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/PurchaseOrderSearchController.java new file mode 100644 index 0000000..4033882 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/PurchaseOrderSearchController.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.controller.supplier; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.order.dto.PurchaseOrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsPurchaseOrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.search.manager.PurchaseOrderSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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.util.Arrays; +import java.util.Objects; + +/** + * 商品搜索 + * + * @author FrozenWatermelon + * @date 2020/11/16 + */ +@RestController("suplplierPurchaseOrderSearchController") +@RequestMapping("/s/purchase_order_search") +@Tag(name = "supplier-采购订单管理接口") +public class PurchaseOrderSearchController { + + @Autowired + private PurchaseOrderSearchManager purchaseOrderSearchManager; + + @GetMapping("/page") + @Operation(summary = "分页查询采购订单", description = "分页查询采购订单") + public ServerResponseEntity> page(@Valid EsPageDTO pageDTO, PurchaseOrderSearchDTO purchaseOrderDTO) { + purchaseOrderDTO.setSupplierId(AuthUserContext.get().getTenantId()); + // 供应商'待收货'订单包含'待入库'和'部分入库' + if (Objects.equals(purchaseOrderDTO.getStatus(), 2)) { + purchaseOrderDTO.setStatus(null); + purchaseOrderDTO.setStatuses(Arrays.asList(2, 3)); + } + EsPageVO page = purchaseOrderSearchManager.page(pageDTO, purchaseOrderDTO); + for (EsPurchaseOrderVO esPurchaseOrderVO : page.getList()) { + if (StrUtil.isNotBlank(esPurchaseOrderVO.getContactPhone())) { + esPurchaseOrderVO.setContactPhone(PhoneUtil.hideBetween(esPurchaseOrderVO.getContactPhone()).toString()); + } + if (StrUtil.isNotBlank(esPurchaseOrderVO.getMobile())) { + esPurchaseOrderVO.setMobile(PhoneUtil.hideBetween(esPurchaseOrderVO.getMobile()).toString()); + } + } + return ServerResponseEntity.success(page); + + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/EsOrderFeignController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/EsOrderFeignController.java new file mode 100644 index 0000000..9858da2 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/EsOrderFeignController.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.feign; + + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.feign.EsOrderFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.search.constant.EsConstant; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import com.tmerclub.cloud.search.manager.OrderSearchManager; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchScrollRequest; +import org.elasticsearch.core.TimeValue; +import org.elasticsearch.search.Scroll; +import org.elasticsearch.search.SearchHit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * ES订单操作 + * + * @author YXF + * @date 2020/12/07 + */ +@DubboService +public class EsOrderFeignController implements EsOrderFeignClient { + + @DubboReference + private OrderFeignClient orderFeignClient; + + @Autowired + private OrderSearchManager orderSearchManager; + + private static final Logger logger = LoggerFactory.getLogger(EsOrderFeignController.class); + + @Override + public void updateOrder(Long orderId) { + EsOrderBO esOrder = orderFeignClient.getEsOrderInfo(orderId); + + if (Objects.isNull(esOrder)) { + return; + } + if (Objects.nonNull(esOrder)) { + logger.info("更新订单信息-订单id为:{},订单信息为:{}", orderId, JSON.toJSONString(esOrder)); + EsSearchUtil.esUpdate(esOrder.getOrderId(), EsIndexEnum.ORDER, esOrder); + } else { + // es相关的不需要报错,打印日志即可 + logger.error("更新订单信息异常-订单id为:{}", orderId); + } + } + + @Override + public List getUndeliveryOrder(OrderSearchDTO orderSearchDTO) { + orderSearchDTO.setFetchSource(EsConstant.UN_DELIVERY_ORDER_FETCH_SOURCE); + orderSearchDTO.setNotRefundStatus(1); + String scrollId = null; + List result = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 设置查询超时时间 + Scroll scroll = new Scroll(TimeValue.timeValueMinutes(5L)); + SearchRequest searchRequest = orderSearchManager.buildScrollSearchRequest(orderSearchDTO, scroll); + try { + // 进行第一次滚动查询 + SearchResponse searchResponse = EsSearchUtil.search(searchRequest); + scrollId = searchResponse.getScrollId(); + + //记录要滚动的ID + //滚动查询部分,将从第1001笔数据开始取 + SearchHit[] hitsScroll = searchResponse.getHits().getHits(); + for (SearchHit searchHit : hitsScroll) { + EsOrderBO esOrderBO = JSON.parseObject(searchHit.getSourceAsString(), EsOrderBO.class); + result.add(esOrderBO); + } + while (hitsScroll != null && hitsScroll.length > 0) { + //构造滚动查询条件 + SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId); + searchScrollRequest.scroll(scroll); + searchResponse = EsSearchUtil.scroll(searchScrollRequest); + scrollId = searchResponse.getScrollId(); + hitsScroll = searchResponse.getHits().getHits(); + } + } catch (Exception e) { + logger.error("获取待发货的订单异常", e); + throw new LuckException("获取待发货的订单异常"); + } finally { + if (Objects.nonNull(scrollId)) { + //清除滚动,否则影响下次查询 + EsSearchUtil.clearScroll(scrollId); + } + } + return result; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderRefundFeignController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderRefundFeignController.java new file mode 100644 index 0000000..3a7f341 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderRefundFeignController.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.feign; + +import com.tmerclub.cloud.api.feign.SearchOrderRefundFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderRefundVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.manager.OrderRefundSearchManager; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 订单搜索feign连接 + * @author YXF + * @date 2020/12/07 + */ +@DubboService +public class SearchOrderRefundFeignController implements SearchOrderRefundFeignClient { + + @Autowired + private OrderRefundSearchManager orderRefundSearchManager; + + + @Override + public ServerResponseEntity> pageOrderRefund(OrderRefundSearchDTO orderRefundSearchDTO) { + return ServerResponseEntity.success(orderRefundSearchManager.pageSearchResult(orderRefundSearchDTO)); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderRefundTaskFeignController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderRefundTaskFeignController.java new file mode 100644 index 0000000..962fad0 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderRefundTaskFeignController.java @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.feign; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.feign.SearchOrderRefundTaskFeignClient; +import com.tmerclub.cloud.api.order.bo.EsOrderRefundBO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.ReturnProcessStatusEnum; +import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderVO; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.search.constant.EsConstant; +import com.tmerclub.cloud.search.manager.OrderRefundSearchManager; +import com.tmerclub.cloud.search.manager.OrderSearchManager; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboService; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchScrollRequest; +import org.elasticsearch.core.TimeValue; +import org.elasticsearch.search.Scroll; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 搜索符合定时任务条件的订单 + * + * @author YXF + * @date 2020/12/07 + */ +@DubboService +public class SearchOrderRefundTaskFeignController implements SearchOrderRefundTaskFeignClient { + private static final Logger logger = LoggerFactory.getLogger(SearchOrderRefundTaskFeignController.class); + + /** + * 退款订单超时关闭 + */ + private static final Integer CANAL_ORDER = 1; + /** + * 退款即将超时发送消息 + */ + private static final Integer TIMEOUT_REMINDER = 2; + /** + * 发放退款 + */ + private static final Integer REFUND_REQUEST = 3; + /** + * 平台介入退款超时 + */ + private static final Integer REFUND_INTERVENTION_TIMEOUT = 4; + + @Autowired + private OrderSearchManager orderSearchManager; + @Autowired + private OrderRefundSearchManager orderRefundSearchManager; + @Autowired + private RocketMQTemplate sendNotifyToUserTemplate; + @Autowired + private RocketMQTemplate orderRefundCancelMqTemplate; + @Autowired + private RocketMQTemplate orderRefundRequstMqTemplate; + + @Override + public ServerResponseEntity cancelWhenTimeOut() { + //设置查询超时时间 + OrderRefundSearchDTO param = new OrderRefundSearchDTO(); + param.setEndTime(DateUtil.offsetDay(new Date(), -Constant.MAX_REFUND_APPLY_TIME).toJdkDate()); + param.setReturnMoneyStsList(ReturnProcessStatusEnum.closeStatus()); + param.setFetchSource(EsConstant.REFUND_ORDER_CANAL_TASK_FETCH_SOURCE); + return handleOrder(param, CANAL_ORDER); + } + + @Override + public ServerResponseEntity pressProximityTimeOutOrder() { + // 临时超时时间为 最大申请时间 - 12小时 + int overTime = Constant.MAX_REFUND_APPLY_TIME * 24; + Date beginTime = DateUtil.offsetHour(new Date(), Constant.MAX_REFUND_HOUR - overTime).toJdkDate(); + Date endTime = DateUtil.offsetDay(new Date(), -Constant.MAX_REFUND_APPLY_TIME).toJdkDate(); + OrderRefundSearchDTO param = new OrderRefundSearchDTO(); + param.setBeginTime(beginTime); + param.setEndTime(endTime); + param.setReturnMoneyStsList(ReturnProcessStatusEnum.closeStatus()); + param.setFetchSource(EsConstant.REFUND_ORDER_TIMEOUT_REMINDER_TASK_FETCH_SOURCE); + return handleOrder(param, TIMEOUT_REMINDER); + } + + @Override + public ServerResponseEntity refundRequest() { + // 找到十分钟之前已经处理退款但是发放退款失败的退款订单 + OrderRefundSearchDTO param = new OrderRefundSearchDTO(); + param.setReturnMoneySts(ReturnProcessStatusEnum.PROCESSING.value()); + Date decisionTime = DateUtil.offsetMinute(new Date(), -10).toJdkDate(); + param.setDecisionTime(decisionTime); + param.setFetchSource(EsConstant.REFUND_ORDER_CANAL_TASK_FETCH_SOURCE); + return handleOrder(param, REFUND_REQUEST); + } + + @Override + public ServerResponseEntity cancelRefundInterventionTimeOut() { + // 设置平台介入查询超时时间 + OrderRefundSearchDTO param = new OrderRefundSearchDTO(); + param.setApplyInterventionTime(DateUtil.offsetDay(new Date(), -Constant.MAX_INTERVENTION_REFUND_APPLY_TIME).toJdkDate()); + param.setPlatformInterventionStatus(1); + param.setFetchSource(EsConstant.REFUND_ORDER_CANAL_TASK_FETCH_SOURCE); + return handleOrder(param, REFUND_INTERVENTION_TIMEOUT); + } + + private ServerResponseEntity handleOrder(OrderRefundSearchDTO param, Integer type) { + String scrollId = null; + // 设置查询超时时间 + Scroll scroll = new Scroll(TimeValue.timeValueMinutes(5L)); + SearchRequest searchRequest = orderRefundSearchManager.buildScrollSearchRequest(param, scroll); + try { + // 进行第一次滚动查询 + SearchResponse searchResponse = EsSearchUtil.search(searchRequest); + scrollId = searchResponse.getScrollId(); + /* + 在这个位置已经读到了前一百条数据,可以在这先对这一百数据进行处理。下面滚动查询剩下的数据 + */ + sendOrderMq(searchResponse, type); + //记录要滚动的ID + //滚动查询部分,将从第1001笔数据开始取 + SearchHit[] hitsScroll = searchResponse.getHits().getHits(); + while (hitsScroll != null && hitsScroll.length > 0) { + //构造滚动查询条件 + SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId); + searchScrollRequest.scroll(scroll); + searchResponse = EsSearchUtil.scroll(searchScrollRequest); + hitsScroll = searchResponse.getHits().getHits(); + scrollId = searchResponse.getScrollId(); + // 发送消息 + sendOrderMq(searchResponse, type); + } + } catch (Exception e) { + logger.error("退款订单定时任务异常", e); + return ServerResponseEntity.fail(ResponseEnum.EXCEPTION); + } finally { + if (Objects.nonNull(scrollId)) { + //清除滚动,否则影响下次查询 + EsSearchUtil.clearScroll(scrollId); + } + } + return ServerResponseEntity.success(); + } + + /** + * 发送消息 + * + * @param searchResponse + * @param type + */ + private void sendOrderMq(SearchResponse searchResponse, Integer type) { + if (Objects.equals(type, CANAL_ORDER)) { + cancelWhenTimeOutMq(searchResponse); + } else if (Objects.equals(type, TIMEOUT_REMINDER)) { + pressProximityTimeOutOrderMq(searchResponse); + } else if (Objects.equals(type, REFUND_REQUEST)) { + refundRequest(searchResponse); + } else if (Objects.equals(type, REFUND_INTERVENTION_TIMEOUT)) { + cancelRefundInterventionWhenTimeOutMq(searchResponse); + } + } + + private void pressProximityTimeOutOrderMq(SearchResponse searchResponse) { + List orderIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + SearchHits hits = searchResponse.getHits(); + for (SearchHit hit : hits.getHits()) { + EsOrderRefundBO orderRefundBO = JSON.parseObject(hit.getSourceAsString(), EsOrderRefundBO.class); + orderIds.add(orderRefundBO.getOrderId()); + } + if (CollUtil.isEmpty(orderIds)) { + return; + } + OrderSearchDTO orderSearchDTO = new OrderSearchDTO(); + orderSearchDTO.setOrderIds(orderIds); + orderSearchDTO.setPageNum(1); + orderSearchDTO.setPageSize(orderIds.size()); + orderSearchDTO.setFetchSource(null); + EsPageVO orderPage = orderSearchManager.pageSearchResult(orderSearchDTO); + List sendNotifyList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (EsOrderVO esOrderVO : orderPage.getList()) { + SendNotifyBO sendNotifyBO = BeanUtil.map(esOrderVO, SendNotifyBO.class); + sendNotifyBO.setBizId(esOrderVO.getOrderId()); + sendNotifyBO.setSendType(SendTypeEnum.REFUND_OUT_TIME.getValue()); + sendNotifyBO.setHour(Constant.MAX_REFUND_APPLY_TIME); + sendNotifyList.add(sendNotifyBO); + } + // 消息推送-退款临近超时 + SendStatus sendBizStatus = sendNotifyToUserTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC, new GenericMessage<>(sendNotifyList)).getSendStatus(); + if (!Objects.equals(sendBizStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为定时任务回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + private void cancelWhenTimeOutMq(SearchResponse searchResponse) { + List refundIds = getRefundIds(searchResponse); + if (CollUtil.isEmpty(refundIds)) { + return; + } + // 发送消息,取消申请超时的订单,无论该超时订单处于任何状态 + SendStatus sendStatus = orderRefundCancelMqTemplate.syncSend(RocketMqConstant.ORDER_REFUND_CANAL_TOPIC, new GenericMessage<>(refundIds)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为定时任务回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + private void cancelRefundInterventionWhenTimeOutMq(SearchResponse searchResponse) { + List refundIds = getRefundIds(searchResponse); + if (CollUtil.isEmpty(refundIds)) { + return; + } + // 发送消息,平台介入超时自动拒绝 + SendStatus sendStatus = orderRefundCancelMqTemplate.syncSend(RocketMqConstant.REFUND_INTERVENTION_CANAL_TOPIC, new GenericMessage<>(refundIds)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为定时任务回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + private static List getRefundIds(SearchResponse searchResponse) { + List refundIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SearchHit hit : searchResponse.getHits().getHits()) { + EsOrderRefundBO orderRefundBO = JSON.parseObject(hit.getSourceAsString(), EsOrderRefundBO.class); + refundIds.add(orderRefundBO.getRefundId()); + } + return refundIds; + } + + private void refundRequest(SearchResponse searchResponse) { + List refundIds = getRefundIds(searchResponse); + if (CollUtil.isEmpty(refundIds)) { + return; + } + // 发送消息,发放退款 + SendStatus sendStatus = orderRefundRequstMqTemplate.syncSend(RocketMqConstant.ORDER_REFUND_REQUEST_TOPIC, new GenericMessage<>(refundIds)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为定时任务回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchPurchaseOrderFeignController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchPurchaseOrderFeignController.java new file mode 100644 index 0000000..1c8b0a4 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchPurchaseOrderFeignController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.feign; + + +import com.tmerclub.cloud.api.dto.PurchaseOrderUpdateDTO; +import com.tmerclub.cloud.api.feign.SearchPurchaseOrderFeignClient; +import com.tmerclub.cloud.api.order.bo.EsPurchaseOrderBO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.order.dto.PurchaseOrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsPurchaseOrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import com.tmerclub.cloud.search.manager.PurchaseOrderSearchManager; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + + +/** + * 订单搜索feign连接 + * @author YXF + * @date 2020/12/07 + */ +@DubboService +public class SearchPurchaseOrderFeignController implements SearchPurchaseOrderFeignClient { + + @Autowired + private PurchaseOrderSearchManager purchaseOrderSearchManager; + + @Override + public ServerResponseEntity> pagePurchaseOrder(PurchaseOrderSearchDTO purchaseOrderSearchDTO) { + return ServerResponseEntity.success(purchaseOrderSearchManager.pageSearchResult(purchaseOrderSearchDTO)); + } + + @Override + public void updatePurchaseOrderStatus(PurchaseOrderUpdateDTO purchaseOrder) { + EsPurchaseOrderBO esOrder = new EsPurchaseOrderBO(); + esOrder.setStatus(purchaseOrder.getStatus()); + EsSearchUtil.esUpdate(purchaseOrder.getPurchaseOrderId(), EsIndexEnum.PURCHASE_ORDER, esOrder); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/AllotOrderCanalListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/AllotOrderCanalListener.java new file mode 100644 index 0000000..fe4253c --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/AllotOrderCanalListener.java @@ -0,0 +1,52 @@ +package com.tmerclub.cloud.search.listener; + +import com.tmerclub.cloud.api.order.bo.EsAllotOrderBO; +import com.tmerclub.cloud.api.order.feign.AllotOrderFeignClient; +import com.tmerclub.cloud.search.bo.AllotOrderBO; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author gaozijie + * @since 2023-11-24 + */ +@Component +public class AllotOrderCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor{ + + private static final Logger log = LoggerFactory.getLogger(AllotOrderCanalListener.class); + + @DubboReference + private AllotOrderFeignClient allotOrderFeignClient; + + @Override + protected void processInsertInternal(CanalBinLogResult result) { + // 新增mongo和es数据 + Long allotOrderId = result.getPrimaryKey(); + EsAllotOrderBO esAllotOrderBO = allotOrderFeignClient.saveMongoAndGetEsInfo(allotOrderId); + if (Objects.isNull(esAllotOrderBO)) { + log.error("调拨订单信息异常的订单id为:{}", allotOrderId); + return; + } + EsSearchUtil.esSave(esAllotOrderBO.getAllotOrderId(), EsIndexEnum.ALLOT_ORDER, esAllotOrderBO); + } + + @Override + protected void processUpdateInternal(CanalBinLogResult result) { + // 更新mongo和es数据 + Long allotOrderId = result.getAfterData().getAllotOrderId(); + EsAllotOrderBO esAllotOrderBO = allotOrderFeignClient.saveMongoAndGetEsInfo(allotOrderId); + if (Objects.isNull(esAllotOrderBO)) { + log.error("调拨订单信息异常的订单id为:{}", allotOrderId); + return; + } + EsSearchUtil.esUpdate(esAllotOrderBO.getAllotOrderId(), EsIndexEnum.ALLOT_ORDER, esAllotOrderBO); + } + +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/BaseCanalBinlogEventThrowExceptionProcessor.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/BaseCanalBinlogEventThrowExceptionProcessor.java new file mode 100644 index 0000000..bf6d513 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/BaseCanalBinlogEventThrowExceptionProcessor.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.search.canal.model.CanalBinLogEvent; +import com.tmerclub.cloud.search.canal.support.processor.BaseCanalBinlogEventProcessor; +import com.tmerclub.cloud.search.canal.support.processor.ExceptionHandler; + +/** + * @author FrozenWatermelon + * @date 2021/4/7 + */ +public class BaseCanalBinlogEventThrowExceptionProcessor extends BaseCanalBinlogEventProcessor { + + @Override + protected ExceptionHandler exceptionHandler() { + return (CanalBinLogEvent event, Throwable throwable) -> { + throw new LuckException("创建索引异常", throwable); + }; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/BaseCanalListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/BaseCanalListener.java new file mode 100644 index 0000000..f04db44 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/BaseCanalListener.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.search.canal.CanalGlue; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.stereotype.Component; + +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author FrozenWatermelon + * @date 2021/02/03 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.CANAL_TOPIC, consumerGroup = RocketMqConstant.CANAL_TOPIC) +public class BaseCanalListener implements RocketMQListener { + + private static final Logger log = LoggerFactory.getLogger(BaseCanalListener.class); + + private static final Pattern PATTERN = Pattern.compile("\\w+[_]{1}[\\d]+"); + private static final String TABLE = "table"; + private static final String DATABASE = "database"; + + @Autowired + private CanalGlue canalGlue; + + @SuppressWarnings("unchecked") + @Override + public void onMessage(String message) { + log.info("get mq message:{}", message); + log.info("当前语言:{}, 语言编码:{}", I18nMessage.getLang(), LocaleContextHolder.getLocale()); + LocaleContextHolder.setLocale(new Locale(LanguageEnum.LANGUAGE_ZH_CN.getLanguage())); + log.info("当前语言:{}, 语言编码:{}", I18nMessage.getLang(), LocaleContextHolder.getLocale()); + Map map = JSON.parseObject(message, Map.class); + map.put(TABLE, handleTableOrDatabaseName(map.get(TABLE))); + map.put(DATABASE, handleTableOrDatabaseName(map.get(DATABASE))); + canalGlue.process(JSON.toJSONString(map)); + } + + private String handleTableOrDatabaseName(Object o) { + if (Objects.isNull(o)) { + return null; + } + String name = o.toString(); + Matcher databaseMatcher = PATTERN.matcher(name); + if (databaseMatcher.matches()) { + name = name.substring(0, name.lastIndexOf('_')); + } + return name; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/OrderRefundCanalListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/OrderRefundCanalListener.java new file mode 100644 index 0000000..bfcd606 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/OrderRefundCanalListener.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + +import com.tmerclub.cloud.api.order.bo.EsOrderRefundBO; +import com.tmerclub.cloud.api.order.feign.OrderRefundFeignClient; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.bo.OrderRefundBO; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author YXF + * @date 2022/8/23 + */ +@Component +public class OrderRefundCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor { + + private static final Logger log = LoggerFactory.getLogger(OrderRefundCanalListener.class); + + @DubboReference + private OrderRefundFeignClient orderRefundFeignClient; + + /** + * 插入商品,此时插入es + */ + @Override + protected void processInsertInternal(CanalBinLogResult result) { + Long refundId = result.getPrimaryKey(); + EsOrderRefundBO orderRefund = getEsOrderRefundData(refundId); + if (Objects.isNull(orderRefund)) { + log.error("订单信息异常的订单id为:{}", refundId); + return; + } + EsSearchUtil.esSave(orderRefund.getRefundId(), EsIndexEnum.ORDER_REFUND, orderRefund); + } + + /** + * 更新订单数据 + */ + @Override + protected void processUpdateInternal(CanalBinLogResult result) { + OrderRefundBO afterData = result.getAfterData(); + EsOrderRefundBO orderRefund = getEsOrderRefundData(afterData.getRefundId()); + if (Objects.isNull(orderRefund)) { + log.error("订单信息异常的订单id为:{}", afterData.getRefundId()); + return; + } + EsSearchUtil.esUpdate(orderRefund.getRefundId(), EsIndexEnum.ORDER_REFUND, orderRefund); + } + + private EsOrderRefundBO getEsOrderRefundData(Long refundId) { + ServerResponseEntity orderResponseEntity = orderRefundFeignClient.saveMongoAndGetEsOrderRefundInfo(refundId); + if (!orderResponseEntity.isSuccess()) { + throw new LuckException(orderResponseEntity.getMsg()); + } + // 添加es中保存的订单数据 + return orderResponseEntity.getData(); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/PurchaseOrderCanalListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/PurchaseOrderCanalListener.java new file mode 100644 index 0000000..77ac589 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/PurchaseOrderCanalListener.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + +import com.tmerclub.cloud.api.order.bo.EsPurchaseOrderBO; +import com.tmerclub.cloud.api.order.feign.PurchaseOrderFeignClient; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.bo.PurchaseOrderBO; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/11/13 + */ +@Component +public class PurchaseOrderCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor { + + private static final Logger log = LoggerFactory.getLogger(PurchaseOrderCanalListener.class); + + @DubboReference + private PurchaseOrderFeignClient purchaseOrderFeignClient; + + /** + * 插入商品,此时插入es + */ + @Override + protected void processInsertInternal(CanalBinLogResult result) { + Long orderId = result.getPrimaryKey(); + EsPurchaseOrderBO purchaseOrderBO = getEsOrderData(orderId); + if (Objects.isNull(purchaseOrderBO)) { + log.error("采购订单信息异常的订单id为:{}", orderId); + return; + } + EsSearchUtil.esSave(purchaseOrderBO.getPurchaseOrderId(), EsIndexEnum.PURCHASE_ORDER, purchaseOrderBO); + } + + /** + * 更新订单数据 + */ + @Override + protected void processUpdateInternal(CanalBinLogResult result) { + PurchaseOrderBO afterData = result.getAfterData(); + EsPurchaseOrderBO purchaseOrderBO = getEsOrderData(afterData.getPurchaseOrderId()); + if (Objects.isNull(purchaseOrderBO)) { + log.error("采购订单信息异常的订单id为:{}", afterData.getPurchaseOrderId()); + return; + } + EsSearchUtil.esUpdate(purchaseOrderBO.getPurchaseOrderId(), EsIndexEnum.PURCHASE_ORDER, purchaseOrderBO); + } + + private EsPurchaseOrderBO getEsOrderData(Long orderId) { + ServerResponseEntity orderResponseEntity = purchaseOrderFeignClient.saveMongoAndGetEsInfo(orderId); + if (!orderResponseEntity.isSuccess()) { + throw new LuckException(orderResponseEntity.getMsg()); + } + // 添加es中保存的采购订单数据 + return orderResponseEntity.getData(); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/ShopDetailCanalListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/ShopDetailCanalListener.java new file mode 100644 index 0000000..d378db0 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/ShopDetailCanalListener.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.bo.ShopDetailBO; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.Objects; + +/** + * @author YXF + * @date 2021/01/21 + */ +@Component +public class ShopDetailCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor { + + private static final Logger log = LoggerFactory.getLogger(ShopDetailCanalListener.class); + @DubboReference + private SpuFeignClient spuFeignClient; + + /** + * 更新店铺 + * @param result + */ + @Override + protected void processUpdateInternal(CanalBinLogResult result) { + ShopDetailBO beforeData = result.getBeforeData(); + ShopDetailBO afterData = result.getAfterData(); + // 删除店铺缓存 + RedisUtil.del(CacheNames.SHOP_DETAIL_ID_KEY + CacheNames.UNION + afterData.getShopId()); + boolean isBlank = Objects.isNull(beforeData.getShopName()) && StrUtil.isBlank(beforeData.getShopLogo()) && Objects.isNull(beforeData.getShopStatus()); + if (isBlank) { + return; + } + // 更新商品信息 + ServerResponseEntity spuRes = spuFeignClient.updateSpuUpdateTimeByShopIds(Collections.singletonList(afterData.getShopId()), SysTypeEnum.MULTISHOP.value()); + if (!spuRes.isSuccess()) { + throw new LuckException(spuRes.getMsg()); + } + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/SkuCanalListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/SkuCanalListener.java new file mode 100644 index 0000000..78b53ce --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/SkuCanalListener.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.search.bo.SkuBO; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/11/13 + */ +@Component +public class SkuCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor { + + private static final Logger log = LoggerFactory.getLogger(SkuCanalListener.class); + + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private SkuFeignClient skuFeignClient; + + /** + * 插入商品,此时插入es + */ + @Override + protected void processInsertInternal(CanalBinLogResult result) { + // 更新之后的数据 + SkuBO afterData = result.getAfterData(); + // 供应商sku插入时,需要更新代销商品的数据 -- + // 没有供应商skuId的不一定就是供应商商品,但有供应商skuId一定为null,此处过滤一部分sku + // 如果在此处判断是否为供应商sku,需要查询spu的数据,也就是至少一次的查询,所以这里简单过滤下就好了,不做spu查询 + if (Objects.isNull(afterData.getSupplierSkuId())) { + spuFeignClient.processSupplierSkuInsert(afterData.getSpuId(), afterData.getSkuId()); + } + } + + /** + * 更新商品,删除商品索引,再重新构建一个 + */ + @Override + protected void processUpdateInternal(CanalBinLogResult result) { + //更新前的数据 + SkuVO beforeData = BeanUtil.map(result.getBeforeData(), SkuVO.class); + // 更新之后的数据 + SkuVO afterData = BeanUtil.map(result.getAfterData(), SkuVO.class); + log.info("更新sku before:{}, after:{}", beforeData, afterData); + // 更新sku信息 + skuFeignClient.processSkuUpdate(beforeData, afterData); + + // 批量删除与sku关联的缓存信息 + RedisUtil.del(CacheNames.SKU_WITH_ATTR_LIST_KEY + CacheNames.UNION + afterData.getSpuId(), + CacheNames.SKU_KEY + CacheNames.UNION + afterData.getSkuId()); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/AllotOrderSearchManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/AllotOrderSearchManager.java new file mode 100644 index 0000000..e4c1eb8 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/AllotOrderSearchManager.java @@ -0,0 +1,217 @@ +package com.tmerclub.cloud.search.manager; + +import com.tmerclub.cloud.api.product.dto.WarehouseSearchDTO; +import com.tmerclub.cloud.api.product.feign.WarehouseFeignClient; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.order.bo.EsAllotOrderBO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.dto.AllotOrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsAllotOrderVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import org.apache.dubbo.config.annotation.DubboReference; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 调拨订单搜索管理 + * @author gaozijie + * @since 2023-11-27 + */ +@Component +public class AllotOrderSearchManager { + + private static final Logger log = LoggerFactory.getLogger(AllotOrderSearchManager.class); + + @Autowired + private RestHighLevelClient restHighLevelClient; + + @DubboReference + private WarehouseFeignClient warehouseFeignClient; + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param param 退款订单搜索条件 + * @return 搜索结果 + */ + public EsPageVO page(EsPageDTO pageDTO, AllotOrderSearchDTO param) { + param.setPageSize(pageDTO.getPageSize()); + param.setPageNum(pageDTO.getPageNum()); + EsPageVO allotOrderPage = pageSearchResult(param); + this.fillInfo(allotOrderPage.getList()); + return allotOrderPage; + } + + /** + * 补充信息 + * @param allotOrders 调拨订单集合 + */ + private void fillInfo(List allotOrders) { + if (CollectionUtils.isEmpty(allotOrders)) { + return; + } + // 补充仓库名称 + Set warehouseIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (EsAllotOrderVO allotOrder : allotOrders) { + warehouseIds.add(allotOrder.getOutWarehouseId()); + warehouseIds.add(allotOrder.getInWarehouseId()); + } + WarehouseSearchDTO warehouseSearchDTO = new WarehouseSearchDTO(); + warehouseSearchDTO.setWarehouseIds(new ArrayList<>(warehouseIds)); + List warehouses = warehouseFeignClient.listWarehouse(warehouseSearchDTO); + Map warehouseMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(warehouses)) { + warehouseMap = warehouses.stream().collect(Collectors.toMap(WarehouseVO::getWarehouseId, WarehouseVO::getWarehouseName)); + } + for (EsAllotOrderVO allotOrder : allotOrders) { + allotOrder.setOutWarehouseName(warehouseMap.getOrDefault(allotOrder.getOutWarehouseId(), "")); + allotOrder.setInWarehouseName(warehouseMap.getOrDefault(allotOrder.getInWarehouseId(), "")); + } + } + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param param 退款订单搜索条件 + * @return 搜索结果 + */ + public EsPageVO pageSearchResult(AllotOrderSearchDTO param) { + if (Objects.isNull(param.getPageNum())) { + param.setPageNum(1); + } + if (Objects.isNull(param.getPageSize())) { + param.setPageSize(10); + } + //1、查询订单数据 + SearchResponse response = this.searchResult(param); + //2.处理响应的数据 + return this.pageEsOrderBO(response, param.getPageSize()); + } + + private EsPageVO pageEsOrderBO(SearchResponse response, Integer pageSize) { + EsPageVO pageVO = new EsPageVO<>(); + List allotOrders = new ArrayList<>(Constant.INITIAL_CAPACITY); + EsAllotOrderBO allotOrder; + for (SearchHit hit : response.getHits().getHits()) { + allotOrder = Json.parseObject(hit.getSourceAsString(), EsAllotOrderBO.class); + allotOrders.add(BeanUtil.map(allotOrder, EsAllotOrderVO.class)); + } + pageVO.setList(allotOrders); + buildSearchPage(pageVO, response, pageSize); + return pageVO; + } + + /** + * 构建分页数据 + * + * @param esPageVO + * @param response + * @param pageSize + */ + private void buildSearchPage(EsPageVO esPageVO, SearchResponse response, Integer pageSize) { + //总记录数 + long total = response.getHits().getTotalHits().value; + esPageVO.setTotal(total); + // 总页码 + int totalPages = (int) total % pageSize == 0 ? + (int) total / pageSize : ((int) total / pageSize + 1); + esPageVO.setPages(totalPages); + } + + /** + * 搜索结果 + * @param param 搜索参数 + * @return es搜索响应数据 + */ + private SearchResponse searchResult(AllotOrderSearchDTO param) { + // 封装检索条件 + SearchRequest searchRequest = this.buildSearchRequest(param); + SearchResponse response; + try { + //2、执行检索请求 + response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + log.info("搜索返回结果:{}", response.toString()); + } catch (IOException e) { + log.error(e.toString()); + throw new LuckException("搜索服务出了点小差,请稍后再试", e); + } + return response; + } + + /** + * 准备检索请求 + * + * @param param 搜索参数 + * @return es搜索请求 + */ + private SearchRequest buildSearchRequest(AllotOrderSearchDTO param) { + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + // 构建bool-query + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + // 过滤 + this.filterQueryIfNecessary(param, boolQueryBuilder); + // 排序 + this.sort(searchSourceBuilder, boolQueryBuilder); + if (Objects.nonNull(param.getPageNum()) && Objects.nonNull(param.getPageSize())) { + //分页 + searchSourceBuilder.from((param.getPageNum() - 1) * param.getPageSize()); + searchSourceBuilder.size(param.getPageSize()); + } + log.info("构建的DSL语句 {}", searchSourceBuilder); + return new SearchRequest(new String[]{EsIndexEnum.ALLOT_ORDER.value()}, searchSourceBuilder); + } + + /** + * 过滤查询条件,如果有必要的话 + * + * @param param 查询条件 + * @param boolQueryBuilder 组合进boolQueryBuilder + */ + private void filterQueryIfNecessary(AllotOrderSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 店铺id + if (Objects.nonNull(param.getShopId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("shopId", param.getShopId())); + } + // 系统类型 + if (Objects.nonNull(param.getSysType())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("sysType", param.getSysType())); + } + // 调拨订单id + if (Objects.nonNull(param.getAllotOrderId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("allotOrderId", param.getAllotOrderId())); + } + // 状态 0:已作废 1:待入库 2.部分入库 3:已完成 + if (Objects.nonNull(param.getStatus())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("status", param.getStatus())); + } + } + + /** + * 进行排序 + */ + private void sort(SearchSourceBuilder searchSourceBuilder, BoolQueryBuilder boolQueryBuilder) { + searchSourceBuilder.sort("createTime", SortOrder.DESC); + searchSourceBuilder.query(boolQueryBuilder); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderRefundSearchManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderRefundSearchManager.java new file mode 100644 index 0000000..7e85b98 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderRefundSearchManager.java @@ -0,0 +1,526 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.order.bo.EsOrderRefundBO; +import com.tmerclub.cloud.api.order.bo.EsOrderRefundItemBO; +import com.tmerclub.cloud.api.order.constant.BuyerReasonType; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderRefundItemVO; +import com.tmerclub.cloud.common.order.vo.EsOrderRefundVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.search.constant.EsConstant; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import org.apache.dubbo.config.annotation.DubboReference; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.RangeQueryBuilder; +import org.elasticsearch.search.Scroll; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/11/16 + */ +@Component +public class OrderRefundSearchManager { + + private static final Logger log = LoggerFactory.getLogger(OrderRefundSearchManager.class); + + /** + * 余额支付(搜索类型) + */ + private static final Integer SEARCH_BALANCE = 3; + + /** + * 1、统计:消费金额 优惠总金额 消费次数 + */ + private static final Integer COUNT_TYPE_FIRST = 1; + /** + * 2、统计:实付金额 + */ + private static final Integer COUNT_TYPE_SECOND = 2; + /** + * 3、统计:最近消费时间 + */ + private static final Integer COUNT_TYPE_THIRD = 3; + + @Autowired + private RestHighLevelClient restHighLevelClient; + + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param orderRefundSearchDTO 退款订单搜索条件 + * @return 搜索结果 + */ + public EsPageVO page(EsPageDTO pageDTO, OrderRefundSearchDTO orderRefundSearchDTO) { + orderRefundSearchDTO.setPageSize(pageDTO.getPageSize()); + orderRefundSearchDTO.setPageNum(pageDTO.getPageNum()); + // 判断处理供应商名称和店铺名称 + Map shopNameMap = checkShopName(orderRefundSearchDTO); + Map supplierNameMap = checkSupplierName(orderRefundSearchDTO); + EsPageVO orderRefundPage = pageSearchResult(orderRefundSearchDTO); + if (CollUtil.isEmpty(orderRefundPage.getList())) { + return orderRefundPage; + } + List supplierIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List shopIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (EsOrderRefundVO esOrderRefundVO : orderRefundPage.getList()) { + esOrderRefundVO.setBuyerReasonValue(BuyerReasonType.instance(esOrderRefundVO.getBuyerReason()).getCn()); + supplierIds.add(esOrderRefundVO.getSupplierId()); + shopIds.add(esOrderRefundVO.getShopId()); + } + // 查询供应商信息 + if (CollUtil.isEmpty(supplierNameMap) && CollUtil.isNotEmpty(supplierIds)) { + log.info("补充供应商订单消息"); + List supplierApiDetailVOList = supplierDetailFeignClient.listBySupplierIds(supplierIds).getData(); + supplierNameMap.putAll(supplierApiDetailVOList.stream().collect(Collectors.toMap(SupplierApiDetailVO::getSupplierId, SupplierApiDetailVO::getSupplierName))); + } + if (CollUtil.isEmpty(shopNameMap)) { + log.info("补充店铺订单消息"); + List shopDetailList = shopDetailFeignClient.listByShopIds(shopIds).getData(); + shopNameMap.putAll(shopDetailList.stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName))); + } + //赠品处理 + for (EsOrderRefundVO esOrderRefundVO : orderRefundPage.getList()) { + esOrderRefundVO.setShopName(null == shopNameMap.get(esOrderRefundVO.getShopId()) ? null : shopNameMap.get(esOrderRefundVO.getShopId())); + esOrderRefundVO.setSupplierName(null == supplierNameMap.get(esOrderRefundVO.getSupplierId()) ? null : supplierNameMap.get(esOrderRefundVO.getSupplierId())); + Map> map = esOrderRefundVO.getOrderItems().stream() + .filter(s -> Objects.equals(s.getActivityType(), OrderActivityType.GIVEAWAY.value())) + .collect(Collectors.groupingBy(EsOrderRefundItemVO::getActivityId)); + Map> comboMap = esOrderRefundVO.getOrderItems().stream() + .filter(s -> Objects.equals(s.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(EsOrderRefundItemVO::getActivityId)); + // 如果没有赠品或者组合,就不需要处理 + if (MapUtil.isEmpty(map) && MapUtil.isEmpty(comboMap)) { + continue; + } + // 将赠品放到对应的主订单项中 + Iterator iterator = esOrderRefundVO.getOrderItems().iterator(); + while (iterator.hasNext()) { + EsOrderRefundItemVO myOrderItemDto = iterator.next(); + // 移除赠品的订单项,进入下一个循环 + if (Objects.equals(myOrderItemDto.getActivityType(), OrderActivityType.GIVEAWAY.value()) || Objects.equals(myOrderItemDto.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + iterator.remove(); + continue; + } + // 主订单项插入赠品订单项 + if (map.containsKey(myOrderItemDto.getOrderItemId())) { + myOrderItemDto.setGiveawayList(map.get(myOrderItemDto.getOrderItemId())); + } + // 主订单项插入组合子订单项 + if (comboMap.containsKey(myOrderItemDto.getOrderItemId())) { + myOrderItemDto.setComboList(comboMap.get(myOrderItemDto.getOrderItemId())); + } + } + } + return orderRefundPage; + } + + private Map checkShopName(OrderRefundSearchDTO orderRefundSearchDTO){ + Map shopNameMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (null != orderRefundSearchDTO.getShopName() && !Objects.equals(orderRefundSearchDTO.getShopName(), "")){ + log.info("根据店铺名称查询店铺信息,防止店铺被改名导致的订单数据不准确"); + List shopList = shopDetailFeignClient.getShopDetailByShopIdAndShopName(orderRefundSearchDTO.getShopName()).getData(); + orderRefundSearchDTO.setShopName(null); + if (CollUtil.isNotEmpty(shopList)) { + log.info("将数据库查询的店铺id放入查询条件中"); + shopNameMap.putAll(shopList.stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName))); + orderRefundSearchDTO.setShopIds(shopList.stream().map(ShopDetailVO::getShopId).collect(Collectors.toList())); + }else{ + orderRefundSearchDTO.setShopId(Constant.DEFAULT_SHOP_ID); + } + } + return shopNameMap; + } + + private Map checkSupplierName(OrderRefundSearchDTO orderRefundSearchDTO){ + Map supplierNameMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (null != orderRefundSearchDTO.getSupplierName() && !Objects.equals(orderRefundSearchDTO.getSupplierName(), "")){ + log.info("根据供应商名称查询供应商信息,防止供应商被改名导致的订单数据不准确"); + List supplierList = supplierDetailFeignClient.getSupplierDetailBySupplierName(orderRefundSearchDTO.getSupplierName()).getData(); + orderRefundSearchDTO.setSupplierName(null); + if (CollUtil.isNotEmpty(supplierList)) { + log.info("将数据库查询的店铺id放入查询条件中"); + supplierNameMap.putAll(supplierList.stream().collect(Collectors.toMap(SupplierApiDetailVO::getSupplierId, SupplierApiDetailVO::getSupplierName))); + orderRefundSearchDTO.setSupplierIds(supplierList.stream().map(SupplierApiDetailVO::getSupplierId).collect(Collectors.toList())); + }else{ + orderRefundSearchDTO.setSupplierId(Constant.DEFAULT_SUPPLIER_ID); + } + } + return supplierNameMap; + } + + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param orderRefundSearchDTO 退款订单搜索条件 + * @return 搜索结果 + */ + public EsPageVO pageSearchResult(OrderRefundSearchDTO orderRefundSearchDTO) { + if (Objects.isNull(orderRefundSearchDTO.getPageSize())) { + orderRefundSearchDTO.setPageSize(10); + } + if (Objects.isNull(orderRefundSearchDTO.getPageNum())) { + orderRefundSearchDTO.setPageNum(1); + } + //1、查询订单数据 + SearchResponse response = searchResult(orderRefundSearchDTO); + //2.处理响应的数据 + return pageEsOrderBO(response, orderRefundSearchDTO.getPageSize()); + } + + private EsPageVO pageEsOrderBO(SearchResponse response, Integer pageSize) { + EsPageVO pageVO = new EsPageVO<>(); + List orderRefundList = getOrderRefundListByResponse(response.getHits().getHits()); + pageVO.setList(orderRefundList); + buildSearchPage(pageVO, response, pageSize); + return pageVO; + } + + /** + * 构建分页数据 + * + * @param esPageVO + * @param response + * @param pageSize + */ + private void buildSearchPage(EsPageVO esPageVO, SearchResponse response, Integer pageSize) { + //总记录数 + long total = response.getHits().getTotalHits().value; + esPageVO.setTotal(total); + // 总页码 + int totalPages = (int) total % pageSize == 0 ? + (int) total / pageSize : ((int) total / pageSize + 1); + esPageVO.setPages(totalPages); + } + + private SearchResponse searchResult(OrderRefundSearchDTO orderRefundSearchDTO) { + // 封装检索条件 + SearchRequest searchRequest = buildSearchRequest(orderRefundSearchDTO); + SearchResponse response; + try { + //2、执行检索请求 + response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + + log.info("退款订单搜索返回结果:{}", response.toString()); + + } catch (IOException e) { + log.error(e.toString()); + throw new LuckException("搜索服务出了点小差,请稍后再试", e); + } + return response; + } + + private List getEsOrderBOList(SearchResponse response) { + return getOrderRefundListByResponse(response.getHits().getHits()); + } + + /** + * 从es返回的数据中获取spu列表 + * + * @param hits es返回的数据 + * @return + */ + private List getOrderRefundListByResponse(SearchHit[] hits) { + List esOrderRefunds = new ArrayList<>(Constant.INITIAL_CAPACITY); + Integer lang = I18nMessage.getLang(); + for (SearchHit hit : hits) { + EsOrderRefundBO esOrderRefundBO = Json.parseObject(hit.getSourceAsString(), EsOrderRefundBO.class); + for (EsOrderRefundItemBO orderRefundItem : esOrderRefundBO.getOrderItems()) { + if (Objects.equals(lang, LanguageEnum.LANGUAGE_EN.getLang())) { + orderRefundItem.setSkuName(orderRefundItem.getSkuNameEn()); + orderRefundItem.setSpuName(orderRefundItem.getSpuNameEn()); + orderRefundItem.setSupplierSpuName(orderRefundItem.getSupplierSpuNameEn()); + orderRefundItem.setSupplierSkuName(orderRefundItem.getSupplierSkuNameEn()); + } + if (StrUtil.isBlank(orderRefundItem.getSkuName())) { + orderRefundItem.setSkuName(orderRefundItem.getSkuNameZh()); + } + if (StrUtil.isBlank(orderRefundItem.getSpuName())) { + orderRefundItem.setSpuName(orderRefundItem.getSpuNameZh()); + } + if (StrUtil.isBlank(orderRefundItem.getSupplierSpuName())) { + orderRefundItem.setSupplierSpuName(orderRefundItem.getSupplierSpuNameZh()); + } + if (StrUtil.isBlank(orderRefundItem.getSupplierSkuName())) { + orderRefundItem.setSupplierSkuName(orderRefundItem.getSupplierSkuNameZh()); + } + } + EsOrderRefundVO orderRefundVO = BeanUtil.map(esOrderRefundBO, EsOrderRefundVO.class); + esOrderRefunds.add(orderRefundVO); + } + return esOrderRefunds; + } + + + /** + * 准备检索请求 + * + * @param param 搜索参数 + * @return + */ + private SearchRequest buildSearchRequest(OrderRefundSearchDTO param) { + + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + + // 指定返回数组中的字段 + if (ArrayUtil.isNotEmpty(param.getFetchSource())) { + searchSourceBuilder.fetchSource(param.getFetchSource(), null); + } + // 构建bool-query + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + + // 过滤 + filterQueryIfNecessary(param, boolQueryBuilder); + + // 关键字搜索 + keywordSearch(param, boolQueryBuilder); + + // 排序 + sort(searchSourceBuilder, boolQueryBuilder); + + if (Objects.nonNull(param.getPageNum()) && Objects.nonNull(param.getPageSize())) { + //分页 + searchSourceBuilder.size(param.getPageSize()); + searchSourceBuilder.from((param.getPageNum() - 1) * param.getPageSize()); + } + + log.info("构建的DSL语句 {}", searchSourceBuilder); + + return new SearchRequest(new String[]{EsIndexEnum.ORDER_REFUND.value()}, searchSourceBuilder); + } + + + /** + * 关键字搜索 + */ + private void keywordSearch(OrderRefundSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + + // 创建查询语句 ES中must和should不能同时使用 同时使用should失效 嵌套多个must 将should条件拼接在一个must中即可 + + + BoolQueryBuilder keywordShouldQuery = QueryBuilders.boolQuery(); + + // 店铺名称 + if (StrUtil.isNotBlank(param.getShopName())) { + keywordShouldQuery.should(QueryBuilders.matchQuery("shopName", param.getShopName())); + } + + boolQueryBuilder.must(keywordShouldQuery); + } + + /** + * 进行排序 + */ + private void sort(SearchSourceBuilder searchSourceBuilder, BoolQueryBuilder boolQueryBuilder) { + searchSourceBuilder.sort("createTime", SortOrder.DESC); + searchSourceBuilder.query(boolQueryBuilder); + } + + /** + * 过滤查询条件,如果有必要的话 + * + * @param param 查询条件 + * @param boolQueryBuilder 组合进boolQueryBuilder + */ + private void filterQueryIfNecessary(OrderRefundSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 店铺id + if (Objects.nonNull(param.getShopId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("shopId", param.getShopId())); + } + // 店铺id集合 + if (CollUtil.isNotEmpty(param.getShopIds())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery("shopId", param.getShopIds())); + } + // 用户id + if (Objects.nonNull(param.getUserId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("userId", param.getUserId())); + } + // 退款id + if (Objects.nonNull(param.getRefundId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("refundId", param.getRefundId())); + } + // 订单id + if (Objects.nonNull(param.getOrderId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("orderId", param.getOrderId())); + } + // 申请类型:1,仅退款,2退款退货 + if (Objects.nonNull(param.getApplyType())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("applyType", param.getApplyType())); + } + + // 创建时间: 开始时间 - 结束时间 + if (param.getBeginTime() != null || param.getEndTime() != null) { + String createTime = "createTime"; + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(createTime); + if (param.getBeginTime() != null) { + rangeQueryBuilder.gte(param.getBeginTime()); + } + if (param.getEndTime() != null) { + rangeQueryBuilder.lte(param.getEndTime()); + } + boolQueryBuilder.filter(rangeQueryBuilder); + } + + // 发放退款搜索处理时间,同时需要refund_time为空 + if (param.getDecisionTime() != null) { + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("decisionTime").lte(param.getDecisionTime()); + boolQueryBuilder.filter(rangeQueryBuilder); + boolQueryBuilder.filter(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("refundTime"))); + } + // 支付宝电脑退款回调处理 + if (param.getDecisionStartTime() != null && param.getDecisionEndTime() != null) { + String decisionTime = "decisionTime"; + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(decisionTime); + if (param.getDecisionStartTime() != null) { + rangeQueryBuilder.gte(param.getDecisionStartTime()); + } + if (param.getDecisionEndTime() != null) { + rangeQueryBuilder.lte(param.getDecisionEndTime()); + } + boolQueryBuilder.filter(rangeQueryBuilder); + boolQueryBuilder.filter(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("refundTime"))); + } + + // 退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType + if (Objects.nonNull(param.getReturnMoneySts())) { + List platStatusList = new ArrayList<>(); + switch (param.getReturnMoneySts()){ + case -1: + platStatusList.add(-1); + platStatusList.add(3); + boolQueryBuilder.filter(QueryBuilders.termsQuery("platformInterventionStatus", platStatusList)); + boolQueryBuilder.filter(QueryBuilders.termQuery("returnMoneySts", param.getReturnMoneySts())); + break; + case 5: + BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery(); + shouldQuery.should(QueryBuilders.matchQuery("platformInterventionStatus", param.getReturnMoneySts())); + shouldQuery.should(QueryBuilders.matchQuery("returnMoneySts", param.getReturnMoneySts())); + boolQueryBuilder.must(shouldQuery); + break; + case 6: + platStatusList.add(1); + platStatusList.add(2); + boolQueryBuilder.filter(QueryBuilders.termsQuery("platformInterventionStatus", platStatusList)); + break; + default: + boolQueryBuilder.filter(QueryBuilders.termQuery("platformInterventionStatus", -1)); + boolQueryBuilder.filter(QueryBuilders.termQuery("returnMoneySts", param.getReturnMoneySts())); + } + } + + // 平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功 + if (Objects.nonNull(param.getPlatformInterventionStatus())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("platformInterventionStatus", param.getPlatformInterventionStatus())); + } + + // 平台介入时间判断 + if (param.getApplyInterventionTime() != null) { + String createTime = "applyInterventionTime"; + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(createTime); + rangeQueryBuilder.lte(param.getApplyInterventionTime()); + boolQueryBuilder.filter(QueryBuilders.termsQuery("platformInterventionStatus", param.getPlatformInterventionStatus().toString())); + boolQueryBuilder.filter(rangeQueryBuilder); + } + + + // 退款状态列表:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType + if (CollUtil.isNotEmpty(param.getReturnMoneyStsList())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery("returnMoneySts", param.getReturnMoneyStsList())); + } + + // 不等于该退款状态 + if (Objects.nonNull(param.getReturnMoneyStsExclude())) { + boolQueryBuilder.mustNot(QueryBuilders.termsQuery("returnMoneySts", param.getReturnMoneyStsExclude().toString())); + } + + // 订单类型 + if (Objects.nonNull(param.getOrderType())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("orderType", param.getOrderType())); + } + + // 退款类型 + if (Objects.nonNull(param.getRefundType())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("refundType", param.getRefundType())); + } + + // 供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝 + if (Objects.equals(param.getSysType(), SysTypeEnum.SUPPLIER.value())) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery("supplierHandleStatus", -1)); + } + + // 供应商id + if (Objects.nonNull(param.getSupplierId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("supplierId", param.getSupplierId())); + } + // 供应商id集合 + if (CollUtil.isNotEmpty(param.getSupplierIds())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery("supplierId", param.getSupplierIds())); + } + + } + + public SearchRequest buildScrollSearchRequest(OrderRefundSearchDTO param, Scroll scroll) { + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + // 构建bool-query + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + + // 过滤 + filterQueryIfNecessary(param, boolQueryBuilder); + + searchSourceBuilder.query(boolQueryBuilder); + //设置最多一次能够取出100笔数据,从第101笔数据开始,将开启滚动查询 + //PS:滚动查询也属于这一次查询,只不过因为一次查不完,分多次查 + searchSourceBuilder.size(EsConstant.MAX_PAGE_SIZE); + + log.info("构建滚动查询的DSL语句 {}", searchSourceBuilder); + + return new SearchRequest(new String[]{EsIndexEnum.ORDER_REFUND.value()}, searchSourceBuilder).scroll(scroll); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderSearchManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderSearchManager.java new file mode 100644 index 0000000..be03ce2 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderSearchManager.java @@ -0,0 +1,1005 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.constant.SearchPayType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.bo.EsOrderItemBO; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.constant.RefundStatusEnum; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderItemVO; +import com.tmerclub.cloud.common.order.vo.EsOrderVO; +import com.tmerclub.cloud.common.order.vo.OrderExcelVO; +import com.tmerclub.cloud.common.order.vo.UserOrderStatisticVO; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.search.constant.EsConstant; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.lucene.search.join.ScoreMode; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchScrollRequest; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.core.TimeValue; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.NestedQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.RangeQueryBuilder; +import org.elasticsearch.search.Scroll; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.Aggregations; +import org.elasticsearch.search.aggregations.bucket.terms.ParsedLongTerms; +import org.elasticsearch.search.aggregations.bucket.terms.Terms; +import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; +import org.elasticsearch.search.aggregations.metrics.ParsedMax; +import org.elasticsearch.search.aggregations.metrics.ParsedSum; +import org.elasticsearch.search.aggregations.metrics.ParsedValueCount; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/11/16 + */ +@Component +public class OrderSearchManager { + + private static final Logger log = LoggerFactory.getLogger(OrderSearchManager.class); + + + /** + * 订单类别 0.实物商品 1. 虚拟商品 + */ + public static final String PHYSICAL_ORDER = "实物商品订单"; + public static final String VIRTUAL_ORDER = "虚拟商品订单"; + + /** + * 余额支付(搜索类型) + */ + private static final Integer SEARCH_BALANCE = 3; + + /** + * 1、统计:消费金额 优惠总金额 消费次数 + */ + private static final Integer COUNT_TYPE_FIRST = 1; + /** + * 2、统计:实付金额 + */ + private static final Integer COUNT_TYPE_SECOND = 2; + /** + * 3、统计:最近消费时间 + */ + private static final Integer COUNT_TYPE_THIRD = 3; + + @Autowired + private RestHighLevelClient restHighLevelClient; + + + @DubboReference + private OrderFeignClient orderFeignClient; + + private void addPayTypeList(OrderSearchDTO orderSearchDTO) { + List payTypeList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.equals(orderSearchDTO.getPayType(), SearchPayType.WECHATPAY.value())) { + payTypeList.addAll(Arrays.asList(PayType.WE_CHAT_PAY_ARRAY)); + } else if (Objects.equals(orderSearchDTO.getPayType(), SearchPayType.ALIPAY.value())) { + payTypeList.addAll(Arrays.asList(PayType.ALI_PAY_ARRAY)); + } else if (Objects.equals(orderSearchDTO.getPayType(), SearchPayType.BALANCE.value())) { + payTypeList.add(PayType.BALANCE.value()); + } else if (Objects.equals(orderSearchDTO.getPayType(), SearchPayType.SCOREPAY.value())) { + payTypeList.add(PayType.SCOREPAY.value()); + } + orderSearchDTO.setPayTypeList(payTypeList); + } + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param orderSearchDTO 订单搜索条件 + * @return 搜索结果 + */ + public EsPageVO pageSearchResult(OrderSearchDTO orderSearchDTO) { + if (Objects.isNull(orderSearchDTO.getPageSize())) { + orderSearchDTO.setPageSize(10); + } + if (Objects.isNull(orderSearchDTO.getPageNum())) { + orderSearchDTO.setPageNum(1); + } + //1、查询订单数据 + SearchResponse response = searchResult(orderSearchDTO); + //2.处理响应的数据 + return pageEsOrderBO(response, orderSearchDTO.getPageSize()); + } + + /** + * 获取检索列表(不分页,获取全部数据) + * + * @param orderSearchDTO + * @return + */ + public List listSearchResult(OrderSearchDTO orderSearchDTO) { + List searchHitsList = new ArrayList<>(Constant.INITIAL_CAPACITY); + int pageNum = 0; + int pageSize = 10000; + orderSearchDTO.setPageSize(pageSize); + SearchResponse response; + // es默认可获取数据最大条数10000,若命中数据超出此值,继续分页查询数据,来实现将全部数据取出 + do { + orderSearchDTO.setPageNum(++pageNum); + response = searchResult(orderSearchDTO); + searchHitsList.add(response.getHits()); + } while ((long) pageNum * pageSize < response.getHits().getTotalHits().value); + // 取出es数据 + List orderList = new ArrayList<>(16); + for (SearchHits searchHits : searchHitsList) { + orderList.addAll(this.getOrderListByResponse(searchHits.getHits())); + } + return orderList; + } + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param orderIds + * @return 搜索结果 + */ + public List listByOrderIds(List orderIds) { + return listByOrderIds(orderIds, null); + } + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param orderIds + * @return 搜索结果 + */ + public List listByOrderIds(List orderIds, String[] fetchSource) { + if (CollUtil.isEmpty(orderIds)) { + return new ArrayList<>(0); + } + + OrderSearchDTO orderSearchDTO = new OrderSearchDTO(); + orderSearchDTO.setOrderIds(orderIds); + orderSearchDTO.setPageSize(orderIds.size()); + orderSearchDTO.setPageNum(1); + if (ArrayUtil.isNotEmpty(fetchSource)) { + orderSearchDTO.setFetchSource(fetchSource); + } + EsPageVO esOrderPage = pageSearchResult(orderSearchDTO); + return esOrderPage.getList(); + } + + private EsPageVO pageEsOrderBO(SearchResponse response, Integer pageSize) { + EsPageVO pageVO = new EsPageVO<>(); + List orderList = getOrderListByResponse(response.getHits().getHits()); + pageVO.setList(orderList); + buildSearchPage(pageVO, response, pageSize); + return pageVO; + } + + /** + * 构建分页数据 + * + * @param esPageVO + * @param response + * @param pageSize + */ + private void buildSearchPage(EsPageVO esPageVO, SearchResponse response, Integer pageSize) { + //总记录数 + long total = response.getHits().getTotalHits().value; + esPageVO.setTotal(total); + // 总页码 + int totalPages = (int) total % pageSize == 0 ? + (int) total / pageSize : ((int) total / pageSize + 1); + esPageVO.setPages(totalPages); + } + + private SearchResponse searchResult(OrderSearchDTO orderSearchDTO) { + // 封装检索条件 + SearchRequest searchRequest = buildSearchRequest(orderSearchDTO); + SearchResponse response; + try { + //2、执行检索请求 + response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + + log.info("订单搜索返回结果:{}", response.toString()); + + } catch (IOException e) { + log.error(e.toString()); + throw new LuckException("搜索服务出了点小差,请稍后再试", e); + } + return response; + } + + /* + 构建结果数据 + */ + + /** + * 从es返回的数据中获取spu列表 + * + * @param hits es返回的数据 + * @return + */ + private List getOrderListByResponse(SearchHit[] hits) { + List esOrders = new ArrayList<>(Constant.INITIAL_CAPACITY); + Integer lang = I18nMessage.getLang(); + for (SearchHit hit : hits) { + EsOrderBO esOrderBO = Json.parseObject(hit.getSourceAsString(), EsOrderBO.class); + EsOrderVO esOrderVO = BeanUtil.map(esOrderBO, EsOrderVO.class); + esOrders.add(esOrderVO); + if (CollUtil.isEmpty(esOrderBO.getOrderItems())) { + continue; + } + for (EsOrderItemBO orderItem : esOrderBO.getOrderItems()) { + if (Objects.equals(lang, LanguageEnum.LANGUAGE_EN.getLang())) { + orderItem.setSpuName(orderItem.getSpuNameEn()); + orderItem.setSkuName(orderItem.getSkuNameEn()); + orderItem.setSupplierSpuName(orderItem.getSupplierSpuNameEn()); + orderItem.setSupplierSkuName(orderItem.getSupplierSkuNameEn()); + } + if (StrUtil.isBlank(orderItem.getSpuName())) { + orderItem.setSpuName(orderItem.getSpuNameZh()); + } + if (StrUtil.isBlank(orderItem.getSkuName())) { + orderItem.setSkuName(orderItem.getSkuNameZh()); + } + if (StrUtil.isBlank(orderItem.getSkuName())) { + orderItem.setSkuName(orderItem.getSkuNameZh()); + } + if (StrUtil.isBlank(orderItem.getSupplierSpuName())) { + orderItem.setSupplierSpuName(orderItem.getSupplierSpuNameZh()); + } + if (StrUtil.isBlank(orderItem.getSupplierSkuName())) { + orderItem.setSupplierSkuName(orderItem.getSupplierSkuNameZh()); + } + } + esOrderVO.setOrderItems(BeanUtil.mapAsList(esOrderBO.getOrderItems(), EsOrderItemVO.class)); + } + return esOrders; + } + + + /** + * 准备检索请求 + * + * @param param 搜索参数 + * @return + */ + private SearchRequest buildSearchRequest(OrderSearchDTO param) { + + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + + // 构建bool-query + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + + // 指定返回数组中的字段 + if (ArrayUtil.isNotEmpty(param.getFetchSource())) { + searchSourceBuilder.fetchSource(param.getFetchSource(), null); + } + + // 过滤 + filterQueryIfNecessary(param, boolQueryBuilder); + + // 关键字搜索 + keywordSearch(param, boolQueryBuilder); + + // 排序 + sort(searchSourceBuilder, boolQueryBuilder); + + if (Objects.nonNull(param.getPageNum()) && Objects.nonNull(param.getPageSize())) { + //分页 + searchSourceBuilder.size(param.getPageSize()); + searchSourceBuilder.from((param.getPageNum() - 1) * param.getPageSize()); + } + if(Objects.nonNull(param.getBegin())){ + searchSourceBuilder.from(param.getBegin()); + } + log.info("构建的订单DSL语句 {}", searchSourceBuilder); + + return new SearchRequest(new String[]{EsIndexEnum.ORDER.value()}, searchSourceBuilder); + } + + + /** + * 关键字搜索 + */ + private void keywordSearch(OrderSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + + // 创建查询语句 ES中must和should不能同时使用 同时使用should失效 嵌套多个must 将should条件拼接在一个must中即可 + + + BoolQueryBuilder keywordShouldQuery = QueryBuilders.boolQuery(); + + // 店铺名称 + if (StrUtil.isNotBlank(param.getShopName())) { + keywordShouldQuery.should(QueryBuilders.matchQuery("shopName", param.getShopName())); + } + + // 商品名称 + if (StrUtil.isNotBlank(param.getSpuName())) { + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); + boolQuery.should(QueryBuilders.matchQuery("orderItems.spuNameZh", param.getSpuName())); + boolQuery.should(QueryBuilders.matchQuery("orderItems.spuNameEn", param.getSpuName())); + NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("orderItems", boolQuery, ScoreMode.None); + boolQueryBuilder.must(nestedQueryBuilder); + } + + //收货人姓名 + if (StrUtil.isNotBlank(param.getConsignee())) { + keywordShouldQuery.should(QueryBuilders.matchQuery("consignee", param.getConsignee())); + } + + //收货人手机号 + if (StrUtil.isNotBlank(param.getMobile())) { + BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery() + .should(QueryBuilders.matchPhraseQuery("mobile", param.getMobile())); + boolQueryBuilder.must(shouldQuery); + } + + // 商品编码 + if (StrUtil.isNotBlank(param.getSpuCodes())) { + keywordShouldQuery.should(QueryBuilders.termQuery("spuCodes", param.getSpuCodes())); + } + + // sku编码 + if (StrUtil.isNotBlank(param.getPartyCodes())) { + BoolQueryBuilder partyCodesShouldQuery = QueryBuilders.boolQuery() + .should(QueryBuilders.matchPhraseQuery("partyCodes", param.getPartyCodes())); + boolQueryBuilder.must(partyCodesShouldQuery); + } + + //自提点名称 + if (StrUtil.isNotBlank(param.getStationName())) { + keywordShouldQuery.should(QueryBuilders.matchQuery("stationName", param.getStationName())); + } + + boolQueryBuilder.must(keywordShouldQuery); + } + + /** + * 进行排序 + */ + private void sort(SearchSourceBuilder searchSourceBuilder, BoolQueryBuilder boolQueryBuilder) { + searchSourceBuilder.sort("createTime", SortOrder.DESC); + searchSourceBuilder.query(boolQueryBuilder); + } + + /** + * 过滤查询条件,如果有必要的话 + * + * @param param 查询条件 + * @param boolQueryBuilder 组合进boolQueryBuilder + */ + private static void filterQueryIfNecessary(OrderSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + if (Objects.nonNull(param.getSupplierDeliveryType())) { + if (Objects.equals(param.getSupplierDeliveryType(), SupplierDeliveryType.SHOP_DELIVERY.value())) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery("supplierDeliveryType", SupplierDeliveryType.SUPPLIER_DELIVERY.value())); + } else { + boolQueryBuilder.filter(QueryBuilders.termQuery("supplierDeliveryType", param.getSupplierDeliveryType())); + } + } + // 店铺id + if (Objects.nonNull(param.getShopId()) && !Objects.equals(param.getShopId(), Constant.PLATFORM_SHOP_ID)) { + boolQueryBuilder.filter(QueryBuilders.termQuery("shopId", param.getShopId())); + } + // 店铺id集合 + if (CollUtil.isNotEmpty(param.getShopIds())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery("shopId", param.getShopIds())); + } + // 供应商id + if (Objects.nonNull(param.getSupplierId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("supplierId", param.getSupplierId())); + boolQueryBuilder.mustNot(QueryBuilders.termQuery("waitPurchase", 1)); + boolQueryBuilder.mustNot(QueryBuilders.termQuery("status", OrderStatus.WAIT_GROUP.value())); + } else if (Objects.equals(param.getWaitPurchase(), 1)) { + boolQueryBuilder.filter(QueryBuilders.termQuery("waitPurchase", param.getWaitPurchase())); + } + // 供应商id集合 + if (CollUtil.isNotEmpty(param.getSupplierIds())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery("supplierId", param.getSupplierIds())); + } + if (Objects.equals(param.getWaitPurchase(), 0)) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery("waitPurchase", 1)); + } + // 用户id + if (Objects.nonNull(param.getUserId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("userId", param.getUserId())); + } + // 订单id和订单项id和主单号 + handleOrderIdAndOrderItemId(param, boolQueryBuilder); + // 处理虚拟订单和自提订单 + handleVritualAndStation(param, boolQueryBuilder); + // 订单状态 + handleOrderStatus(param, boolQueryBuilder); + // 支付相关 + handlePay(param, boolQueryBuilder); + // 订单时间相关 + handleTime(param, boolQueryBuilder); + // 处理预售订单 + handlePreSaleOrder(param, boolQueryBuilder); + // 退款相关 + handleRefund(param, boolQueryBuilder); + // 评论 + handleComm(param, boolQueryBuilder); + + // 删除类型 + if (Objects.nonNull(param.getDeleteStatus())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("deleteStatus", param.getDeleteStatus())); + } + + //订单类型参考orderType ,1团购订单 2秒杀订单,3积分订单 + if (Objects.nonNull(param.getOrderType())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("orderType", param.getOrderType())); + } + // 商品类型为空,且用户id为空(orderIds有值时,是查询指定的订单,不需要订单类型的筛选) -> 商家、平台端获取的非积分订单列表 + else if (Objects.isNull(param.getUserId()) && CollUtil.isEmpty(param.getOrderIds()) && CollUtil.isEmpty(param.getOrderItemIds())) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery("orderType", OrderType.SCORE.value())); + } + + // 是否已经进行结算 + if (Objects.nonNull(param.getIsSettled())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("isSettled", param.getIsSettled())); + } + + if (Objects.nonNull(param.getMaxBalanceAmount())) { + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("balanceAmount").lte(param.getMaxBalanceAmount()); + boolQueryBuilder.filter(rangeQueryBuilder); + } + + // 物流类型 1:快递 2:自提 3:无需快递 4:同城快递 + if (Objects.nonNull(param.getDeliveryType())) { + if (Objects.equals(param.getDeliveryType(), DeliveryType.DELIVERY.value())) { + BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery(); + shouldQuery.should(QueryBuilders.matchQuery("deliveryType", DeliveryType.ONLINE.value())); + shouldQuery.should(QueryBuilders.matchQuery("deliveryType", DeliveryType.DELIVERY.value())); + boolQueryBuilder.must(shouldQuery); + } else { + boolQueryBuilder.filter(QueryBuilders.termQuery("deliveryType", param.getDeliveryType())); + } + } + } + private static void handlePay(OrderSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 是否已经支付,1:已经支付过,0:,没有支付过 + if (Objects.equals(param.getPayType(), PayType.UNPAY.value())) { + param.setIsPayed(0); + } + if (Objects.nonNull(param.getIsPayed())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("isPayed", param.getIsPayed())); + } + // 支付类型 1:积分支付 2:微信支付 3:支付宝支付 + if (CollUtil.isNotEmpty(param.getPayTypeList())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery("payType", param.getPayTypeList())); + } + } + + private static void handleRefund(OrderSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 订单退款状态(0:暂无物流 1:申请退款 2:退款成功 3:部分退款成功 4:退款失败) + if (Objects.equals(param.getRefundStatus(), 0)) { + boolQueryBuilder.mustNot(QueryBuilders.existsQuery("orderItems.refundStatus")); + } else if (Objects.nonNull(param.getRefundStatus())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("refundStatus", param.getRefundStatus())); + } + + if (Objects.nonNull(param.getNotRefundStatus())) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery("refundStatus", param.getNotRefundStatus())); + } + } + + private static void handleTime(OrderSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 支付时间 + if (Objects.nonNull(param.getPayTime())) { + RangeQueryBuilder rangeQueryBuilder; + if (BooleanUtil.isTrue(param.isGtePayTime())) { + rangeQueryBuilder = QueryBuilders.rangeQuery("payTime").gte(param.getPayTime()); + } else { + rangeQueryBuilder = QueryBuilders.rangeQuery("payTime").lte(param.getPayTime()); + } + boolQueryBuilder.filter(rangeQueryBuilder); + } + + // 发货时间 + if (Objects.nonNull(param.getDeliveryTime())) { + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("deliveryTime").lte(param.getDeliveryTime()); + boolQueryBuilder.filter(rangeQueryBuilder); + } + + // 确认收货时间 + if (Objects.nonNull(param.getFinallyTime())) { + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("finallyTime").lte(param.getFinallyTime()); + boolQueryBuilder.filter(rangeQueryBuilder); + } + // 开始时间 - 结束时间 + if (Objects.nonNull(param.getStartTime()) || Objects.nonNull(param.getEndTime())) { + String createTime = "createTime"; + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(createTime); + if (Objects.nonNull(param.getStartTime())) { + rangeQueryBuilder.gte(param.getStartTime()); + } + if (Objects.nonNull(param.getEndTime())) { + rangeQueryBuilder.lte(param.getEndTime()); + } + boolQueryBuilder.filter(rangeQueryBuilder); + } + } + + private static void handleOrderStatus(OrderSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + //平台端会员详情不展示未付款的订单 + if (CollUtil.isNotEmpty(param.getMustNotStatusList())) { + boolQueryBuilder.mustNot(QueryBuilders.termsQuery("status", param.getMustNotStatusList())); + } + //平台端会员详情不展示未付款的订单 + if (Objects.equals(param.getShopId(), Constant.PLATFORM_SHOP_ID) && Objects.nonNull(param.getUserId())) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery("status", OrderStatus.UNPAY.value())); + } + if (Objects.equals(param.getStatus(), OrderStatus.UNPAY.value())) { + BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery(); + // or条件用should查询,必须配合must使用 + shouldQuery.should(QueryBuilders.matchQuery("status", OrderStatus.UNPAY.value())); + shouldQuery.should(QueryBuilders.matchQuery("status", OrderStatus.WAIT_BALANCE.value())); + boolQueryBuilder.must(shouldQuery); + } + // 订单状态 参考OrderStatus + if (Objects.nonNull(param.getStatus()) && !Objects.equals(param.getStatus(), 0) && !Objects.equals(param.getStatus(), OrderStatus.UNPAY.value())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("status", param.getStatus())); + } + // 订单状态 参考OrderStatus + if (CollUtil.isNotEmpty(param.getStatusList())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery("status", param.getStatusList())); + } + } + + private static void handleOrderIdAndOrderItemId(OrderSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 订单id + if (param.getOrderId() != null) { + boolQueryBuilder.filter(QueryBuilders.termsQuery("orderId", param.getOrderId().toString())); + } + + // 主订单id + if (Objects.nonNull(param.getMainOrderId())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery("mainOrderId", param.getMainOrderId().toString())); + } + + if (CollUtil.isNotEmpty(param.getOrderIds())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery("orderId", param.getOrderIds())); + } + + if (CollUtil.isNotEmpty(param.getOrderItemIds())) { + boolQueryBuilder.filter(EsSearchUtil.nestedQuery("orderItems", "orderItems.orderItemId", param.getOrderItemIds())); + } + } + + private static void handleComm(OrderSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + if (Objects.nonNull(param.getIsComm())) { + param.setStatus(OrderStatus.SUCCESS.value()); + } + if (Objects.nonNull(param.getIsComm())) { + if (Objects.equals(param.getIsComm(), 0)) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery("refundStatus", 1)); + boolQueryBuilder.mustNot(QueryBuilders.termQuery("orderType", OrderType.SCORE.value())); + } + // 退款状态为退款失败或者为空的 + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); + BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery(); + boolQuery.must(QueryBuilders.matchQuery("orderItems.isComm", param.getIsComm())); + // or条件用should查询,必须配合must使用 + shouldQuery.should(QueryBuilders.matchQuery("orderItems.refundStatus", 4)); + shouldQuery.should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("orderItems.refundStatus"))); + boolQuery.must(shouldQuery); + NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("orderItems", boolQuery, ScoreMode.None); + boolQueryBuilder.filter(nestedQueryBuilder); + } + } + + private static void handlePreSaleOrder(OrderSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 预售开始时间 + if (Objects.nonNull(param.getBalanceStartTime())) { + RangeQueryBuilder rangeStartQueryBuilder = QueryBuilders.rangeQuery("balanceStartTime").lte(param.getBalanceStartTime()); + RangeQueryBuilder rangeEndQueryBuilder = QueryBuilders.rangeQuery("balanceEndTime").gte(param.getBalanceStartTime()); + boolQueryBuilder.filter(rangeStartQueryBuilder); + boolQueryBuilder.filter(rangeEndQueryBuilder); + } + + // 预售结束时间 + if (Objects.nonNull(param.getBalanceEndTime())) { + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("balanceEndTime").lte(param.getBalanceEndTime()); + boolQueryBuilder.filter(rangeQueryBuilder); + } + List preSaleTypeList = new ArrayList<>(1); + // 预售类型 0.全款预售类型 1.定金预售 + if (Objects.nonNull(param.getPreSaleType())) { + preSaleTypeList.add(param.getPreSaleType()); + } + if (Objects.nonNull(param.getIsPreSale()) && Objects.equals(param.getIsPreSale(), 1)) { + // 预售类型 0.全款预售类型 1.定金预售 + preSaleTypeList.add(0); + preSaleTypeList.add(1); + } + if (CollUtil.isNotEmpty(preSaleTypeList)) { + boolQueryBuilder.filter(QueryBuilders.termsQuery("preSaleType", preSaleTypeList)); + } + // 是否预售订单 1.是 0.否 + if (Objects.equals(param.getIsPreSale(), 1)) { + boolQueryBuilder.mustNot(QueryBuilders.termQuery("preSaleType", PreSaleType.DISABLE.value())); + } + if (Objects.equals(param.getIsPreSale(), 0)) { + // 存在没有'preSaleType'字段的数据,用mustNot来进行查询非预售订单 + boolQueryBuilder.mustNot(QueryBuilders.termsQuery("preSaleType", Arrays.asList(PreSaleType.FULLPAY.value(), PreSaleType.DEPOSIT.value()))); + } + } + + private static void handleVritualAndStation(OrderSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 判断是否是虚拟订单或自提订单 + if (param.getStationId() != null || param.getOrderMold() != null) { + if (param.getStationId() == null) { + // 虚拟订单 + boolQueryBuilder.filter(QueryBuilders.termQuery("orderMold", param.getOrderMold())); + } else if (param.getOrderMold() == null) { + // 自提订单以及部分核销过的虚拟订单 + BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery(); + BoolQueryBuilder stationQuery = QueryBuilders.boolQuery(); + stationQuery.must(QueryBuilders.termsQuery("stationId", param.getStationId().toString())); + BoolQueryBuilder codeShouldQuery = QueryBuilders.boolQuery(); + codeShouldQuery.must(QueryBuilders.matchQuery("orderVirtualInfoList.stationId", param.getStationId())); + NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("orderVirtualInfoList", codeShouldQuery, ScoreMode.None); + shouldQuery.should(nestedQueryBuilder); + shouldQuery.should(stationQuery); + boolQueryBuilder.must(shouldQuery); + } else { + // 虚拟订单加自提订单 + BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery(); + // or条件用should查询,必须配合must使用 + BoolQueryBuilder virtualQuery = QueryBuilders.boolQuery(); + BoolQueryBuilder rangeQuery = QueryBuilders.boolQuery(); + rangeQuery.should(QueryBuilders.rangeQuery("writeOffEnd").gt(new Date())); + BoolQueryBuilder existsQuery = QueryBuilders.boolQuery(); + rangeQuery.should(existsQuery.mustNot(QueryBuilders.existsQuery("writeOffEnd"))); + virtualQuery.must(rangeQuery); + virtualQuery.filter(QueryBuilders.termQuery("orderMold", param.getOrderMold())); + virtualQuery.must(QueryBuilders.termsQuery("status", Arrays.asList( + OrderStatus.CONSIGNMENT.value(), + OrderStatus.SUCCESS.value()) + )); + virtualQuery.mustNot(QueryBuilders.termQuery("writeOffNum", 0)); + virtualQuery.must(QueryBuilders.termQuery("writeOffStatus", 0)); + + BoolQueryBuilder stationQuery = QueryBuilders.boolQuery(); + stationQuery.filter(QueryBuilders.termsQuery("stationId", param.getStationId().toString())); + stationQuery.must(QueryBuilders.termQuery("status", OrderStatus.PAYED.value())); + shouldQuery.should(virtualQuery); + shouldQuery.should(stationQuery); + boolQueryBuilder.must(shouldQuery); + } + } + + // 自提提货码 + if (StrUtil.isNotBlank(param.getStationCode())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery("stationCode", param.getStationCode())); + } + + // 核销码 + if (StrUtil.isNotBlank(param.getWriteOffCode())) { + BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery(); + // or条件用should查询,必须配合must使用 + BoolQueryBuilder idShouldQuery = QueryBuilders.boolQuery(); + idShouldQuery.must(QueryBuilders.termQuery("orderId", param.getWriteOffCode())); + BoolQueryBuilder codeShouldQuery = QueryBuilders.boolQuery(); + codeShouldQuery.must(QueryBuilders.matchQuery("orderVirtualInfoList.writeOffCode", param.getWriteOffCode())); + NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("orderVirtualInfoList", codeShouldQuery, ScoreMode.None); + shouldQuery.should(idShouldQuery); + shouldQuery.should(nestedQueryBuilder); + BoolQueryBuilder rangBuilder = QueryBuilders.boolQuery(); + rangBuilder.should(QueryBuilders.rangeQuery("writeOffEnd").gt(new Date())); + BoolQueryBuilder existsBuilder = QueryBuilders.boolQuery(); + rangBuilder.should(existsBuilder.mustNot(QueryBuilders.existsQuery("writeOffEnd"))); + boolQueryBuilder.must(shouldQuery); + boolQueryBuilder.must(rangBuilder); + } + + // 核销状态 + if (param.getWriteOffStatus() != null) { + boolQueryBuilder.must(QueryBuilders.termQuery("writeOffStatus", param.getWriteOffStatus())); + } + } + + /** + * 统计用户的订单相关信息 + * + * @param userIds 用户id集合 + * @return 用户的订单相关统计数据 + */ + public List countOrderByUserIds(List userIds) { + if (CollUtil.isEmpty(userIds)) { + return null; + } + List userOrderStatistics = new ArrayList<>(Constant.INITIAL_CAPACITY); + //1、准备检索请求 + + // 1统计:消费金额 优惠总金额 消费次数 + SearchRequest searchRequest1 = buildCountOrderSearchRequest(userIds, COUNT_TYPE_FIRST); + // 2统计:实付金额 + SearchRequest searchRequest2 = buildCountOrderSearchRequest(userIds, COUNT_TYPE_SECOND); + // 3统计:最近消费时间 + SearchRequest searchRequest3 = buildCountOrderSearchRequest(userIds, COUNT_TYPE_THIRD); + try { + //2、执行检索请求 + SearchResponse response1 = restHighLevelClient.search(searchRequest1, RequestOptions.DEFAULT); + SearchResponse response2 = restHighLevelClient.search(searchRequest2, RequestOptions.DEFAULT); + SearchResponse response3 = restHighLevelClient.search(searchRequest3, RequestOptions.DEFAULT); + + log.debug("消费金额 优惠总金额 消费次数,搜索返回结果:{}", response1.toString()); + log.debug("实付金额,搜索返回结果:{}", response2.toString()); + log.debug("最近消费时间,搜索返回结果:{}", response3.toString()); + + //3、分析响应数据,封装成我们需要的格式 + combinedEsOrderAggData(userOrderStatistics, userIds, response1, response2, response3); + } catch (IOException e) { + log.error(e.toString()); + throw new LuckException("搜索服务出了点小差,请稍后再试", e); + } + return userOrderStatistics; + } + + private void combinedEsOrderAggData(List userOrderStatistics, List userIds, SearchResponse response1, SearchResponse response2, SearchResponse response3) { + + ParsedLongTerms userIdTerms1 = response1.getAggregations().get("userIdTerms"); + ParsedLongTerms userIdTerms2 = response2.getAggregations().get("userIdTerms"); + ParsedLongTerms userIdTerms3 = response3.getAggregations().get("userIdTerms"); + + Map buckets1Map = userIdTerms1.getBuckets().stream().collect(Collectors.toMap(Terms.Bucket::getKeyAsNumber, (k) -> k)); + Map buckets2Map = userIdTerms2.getBuckets().stream().collect(Collectors.toMap(Terms.Bucket::getKeyAsNumber, (k) -> k)); + Map buckets3Map = userIdTerms3.getBuckets().stream().collect(Collectors.toMap(Terms.Bucket::getKeyAsNumber, (k) -> k)); + if (buckets1Map.size() == 0 && buckets2Map.size() == 0 && buckets3Map.size() == 0) { + return; + } + for (Long userId : userIds) { + UserOrderStatisticVO userOrderStatisticVO = new UserOrderStatisticVO(); + userOrderStatisticVO.setUserId(userId); + Terms.Bucket bucket1 = buckets1Map.get(userId); + if (Objects.nonNull(bucket1)) { + + // 消费金额 + Aggregations aggregations = bucket1.getAggregations(); + ParsedSum actualTotalAgg = aggregations.get("actualTotalAgg"); + double consAmount = actualTotalAgg.getValue(); + userOrderStatisticVO.setConsAmount(new BigDecimal(Double.valueOf(consAmount).toString())); + + // 优惠总金额 + ParsedSum reduceAmountAgg = aggregations.get("reduceAmountAgg"); + double reduceAmount = reduceAmountAgg.getValue(); + userOrderStatisticVO.setReduceAmount(new BigDecimal(Double.valueOf(reduceAmount).toString())); + + // 消费次数 + ParsedValueCount consTimesAgg = aggregations.get("consTimesAgg"); + long consTimes = consTimesAgg.getValue(); + userOrderStatisticVO.setConsTimes(Long.valueOf(consTimes).intValue()); + } else { + userOrderStatisticVO.setConsAmount(new BigDecimal("0.0")); + userOrderStatisticVO.setReduceAmount(new BigDecimal("0.0")); + userOrderStatisticVO.setConsTimes(0); + } + // 实付金额 + Terms.Bucket bucket2 = buckets2Map.get(userId); + if (Objects.nonNull(bucket2)) { + ParsedSum actualTotalAgg = bucket2.getAggregations().get("actualTotalAgg"); + double actualTotal = actualTotalAgg.getValue(); + userOrderStatisticVO.setActualAmount(new BigDecimal(Double.valueOf(actualTotal).toString())); + } else { + userOrderStatisticVO.setActualAmount(new BigDecimal("0.0")); + } + // 最新消费时间 + Terms.Bucket bucket3 = buckets3Map.get(userId); + if (Objects.nonNull(bucket3)) { + ParsedMax payTime = bucket3.getAggregations().get("maxPayTime"); + String payTimeStr = payTime.getValueAsString(); + userOrderStatisticVO.setReConsTime(DateUtil.parse(payTimeStr)); + } + userOrderStatistics.add(userOrderStatisticVO); + } + + } + + + /** + * @param countType 1、统计:消费金额 优惠总金额 消费次数 + * 2、统计:实付金额 + * 3、统计:最近消费时间 + * @return + */ + private SearchRequest buildCountOrderSearchRequest(List userIds, int countType) { + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + + // 构建bool-query + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + boolQueryBuilder.must(QueryBuilders.matchQuery("isPayed", 1)); + boolQueryBuilder.must(QueryBuilders.matchQuery("deleteStatus", 0)); + boolQueryBuilder.must(QueryBuilders.termsQuery("userId", userIds)); + if (countType == COUNT_TYPE_FIRST) { + boolQueryBuilder.mustNot(QueryBuilders.matchQuery("payType", PayType.SCOREPAY.value())); + } else if (countType == COUNT_TYPE_SECOND) { + List payTypes = new ArrayList<>(Constant.INITIAL_CAPACITY); + payTypes.add(PayType.SCOREPAY.value()); + payTypes.add(PayType.BALANCE.value()); + boolQueryBuilder.mustNot(QueryBuilders.termsQuery("payType", payTypes)); + } + + // 聚合条件 + // 1. 按照userId进行聚合(分组) + TermsAggregationBuilder userIdAgg = AggregationBuilders.terms("userIdTerms"); + userIdAgg.field("userId").size(userIds.size()); + if (countType == COUNT_TYPE_FIRST) { + // 消费金额 + userIdAgg.subAggregation(AggregationBuilders.sum("actualTotalAgg").field("actualTotal")); + // 优惠总金额 + userIdAgg.subAggregation(AggregationBuilders.sum("reduceAmountAgg").field("reduceAmount")); + // 消费次数 + userIdAgg.subAggregation(AggregationBuilders.count("consTimesAgg").field("orderId")); + } else if (countType == COUNT_TYPE_SECOND) { + // 实付金额 + userIdAgg.subAggregation(AggregationBuilders.sum("actualTotalAgg").field("actualTotal")); + } else if (countType == COUNT_TYPE_THIRD) { + // 最近消费时间 + userIdAgg.subAggregation(AggregationBuilders.max("maxPayTime").field("payTime")); + } + + searchSourceBuilder.aggregation(userIdAgg); + // 聚合数据,不需要获取命中的结果,只需要聚合的结果 + searchSourceBuilder.size(0); + searchSourceBuilder.query(boolQueryBuilder); + + log.info("构建的DSL语句 {}", searchSourceBuilder); + return new SearchRequest(new String[]{EsIndexEnum.ORDER.value()}, searchSourceBuilder); + } + + public SearchRequest buildScrollSearchRequest(OrderSearchDTO param, Scroll scroll) { + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + // 构建bool-query + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + + // 指定返回数组中的字段 + if (ArrayUtil.isNotEmpty(param.getFetchSource())) { + searchSourceBuilder.fetchSource(param.getFetchSource(), null); + } + // 过滤 + filterQueryIfNecessary(param, boolQueryBuilder); + // 关键词搜索 + keywordSearch(param, boolQueryBuilder); + searchSourceBuilder.query(boolQueryBuilder); + //设置最多一次能够取出100笔数据,从第101笔数据开始,将开启滚动查询 + //PS:滚动查询也属于这一次查询,只不过因为一次查不完,分多次查 + if (Objects.nonNull(param.getPageSize()) && param.getPageSize() > 0) { + searchSourceBuilder.size(param.getPageSize()); + } else { + searchSourceBuilder.size(EsConstant.MAX_PAGE_SIZE); + } + + log.info("构建滚动查询的DSL语句 {}", searchSourceBuilder); + + return new SearchRequest(new String[]{EsIndexEnum.ORDER.value()}, searchSourceBuilder).scroll(scroll); + } + + public List orderExcelScrollSearch(OrderSearchDTO orderSearchDTO) { + // 校验一下店铺名称和供应商名称 + ServerResponseEntity orderResponseEntity = orderFeignClient.checkOrderSearchInfo(orderSearchDTO); + if (!orderResponseEntity.isSuccess()) { + throw new LuckException(orderResponseEntity.getMsg()); + } + orderSearchDTO = orderResponseEntity.getData(); + // 补充支付方式 + this.addPayTypeList(orderSearchDTO); + List searchHits = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 设置查询超时时间 + Scroll scroll = new Scroll(TimeValue.timeValueMinutes(5L)); + SearchRequest searchRequest = this.buildScrollSearchRequest(orderSearchDTO, scroll); + // 进行第一次滚动查询 + SearchResponse searchResponse = EsSearchUtil.search(searchRequest); + String scrollId = searchResponse.getScrollId(); + + //记录要滚动的ID + //滚动查询部分,将从第1001笔数据开始取 + SearchHit[] hitsScroll = searchResponse.getHits().getHits(); + searchHits.addAll(Arrays.asList(hitsScroll)); + + while (hitsScroll.length > 0) { + //构造滚动查询条件 + SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId); + searchScrollRequest.scroll(scroll); + searchResponse = EsSearchUtil.scroll(searchScrollRequest); + scrollId = searchResponse.getScrollId(); + hitsScroll = searchResponse.getHits().getHits(); + searchHits.addAll(Arrays.asList(hitsScroll)); + } + // 将searchHit转成excelVO并返回 + SearchHit[] searchHitArr = new SearchHit[searchHits.size()]; + searchHits.toArray(searchHitArr); + return this.hitsToOrderExcelList(searchHitArr); + } + + private List hitsToOrderExcelList(SearchHit[] hitsScroll) { + List orderExcelList = new ArrayList<>(hitsScroll.length); + List orderList = getOrderListByResponse(hitsScroll); + int seq = 1; + for (EsOrderVO orderBO : orderList) { + for (EsOrderItemVO orderItem : orderBO.getOrderItems()) { + OrderExcelVO orderExcelVO = new OrderExcelVO(); + orderExcelVO.setSeq(String.valueOf(seq)); + // 订单数据 + orderExcelVO.setOrderId(String.valueOf(orderBO.getOrderId())); + orderExcelVO.setCreateTime(orderBO.getCreateTime()); + orderExcelVO.setDeliveryType(DeliveryType.getDescription(orderBO.getDeliveryType())); + orderExcelVO.setConsignee(orderBO.getConsignee()); + orderExcelVO.setMobile(orderBO.getMobile()); + orderExcelVO.setReceivingAddr(orderBO.getReceivingAddr()); + orderExcelVO.setTotal(PriceUtil.toDecimalPriceStr(orderBO.getTotal())); + orderExcelVO.setFreightAmount(PriceUtil.toDecimalPriceStr(orderBO.getFreightAmount())); + orderExcelVO.setReduceAmount(PriceUtil.toDecimalPriceStr(orderBO.getReduceAmount())); + orderExcelVO.setOrderScore(Objects.isNull(orderBO.getOrderScore()) ? "0" : String.valueOf(orderBO.getOrderScore())); + orderExcelVO.setActualTotal(PriceUtil.toDecimalPriceStr(orderBO.getActualTotal())); + String payType = Objects.isNull(orderBO.getPayType()) ? Constant.UNPAID : PayType.getPayTypeName(orderBO.getPayType()); + orderExcelVO.setPayType(payType); + if (Objects.equals(orderBO.getDeliveryType(), DeliveryType.STATION.value())) { + orderExcelVO.setStatus(OrderStatus.getStationName(orderBO.getStatus())); + } else { + orderExcelVO.setStatus(OrderStatus.getDeliveryName(orderBO.getStatus())); + } + String refundStatus = Objects.isNull(orderBO.getRefundStatus()) ? Constant.NO_AFTER_SALES : RefundStatusEnum.getRefundName(orderBO.getRefundStatus()); + orderExcelVO.setRefundStatus(refundStatus); + orderExcelVO.setOrderMold(Objects.equals(orderBO.getOrderMold(), 1) ? VIRTUAL_ORDER : PHYSICAL_ORDER); + // 订单项数据 + orderExcelVO.setSpuName(orderItem.getSpuName()); + orderExcelVO.setSkuName(orderItem.getSkuName()); + orderExcelVO.setPrice(PriceUtil.toDecimalPriceStr(orderItem.getPrice())); + orderExcelVO.setCount(orderItem.getCount()); + orderExcelVO.setSpuTotalAmount(PriceUtil.toDecimalPriceStr(orderItem.getSpuTotalAmount())); + orderExcelVO.setShareReduce(PriceUtil.toDecimalPriceStr(orderItem.getShareReduce())); + orderExcelVO.setActualTotalItem(PriceUtil.toDecimalPriceStr(orderItem.getActualTotal())); + orderExcelVO.setUseScore(orderItem.getUseScore()); + String refundStatusItem = Objects.isNull(orderItem.getRefundStatus()) ? Constant.NO_AFTER_SALES : RefundStatusEnum.getRefundName(orderItem.getRefundStatus()); + orderExcelVO.setRefundStatusItem(refundStatusItem); + orderExcelList.add(orderExcelVO); + } + seq ++; + } + return orderExcelList; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/ProductOperateManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/ProductOperateManager.java new file mode 100644 index 0000000..03f1c8a --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/ProductOperateManager.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.manager; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.elasticsearch.script.Script; +import org.elasticsearch.script.ScriptType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * @author YXF + * @date 2023/08/07 + */ +@Component +public class ProductOperateManager { + + private static final Logger log = LoggerFactory.getLogger(ProductOperateManager.class); + + public void batchUpdateSpuStockAndSale(List spuList) { + if (CollUtil.isEmpty(spuList)) { + return; + } + + Map map = new HashMap<>(spuList.size()); + for (SpuVO spuVO : spuList) { + String code = "= "; + // 组装商品的更新数据 + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("ctx._source.stock " + code + spuVO.getTotalStock() + ";"); + stringBuilder.append("ctx._source.actualSoldNum " + code + spuVO.getSaleNum() + ";"); + stringBuilder.append("ctx._source.saleNum = " + "ctx._source.waterSoldNum" + "+" + spuVO.getSaleNum() + ";"); + boolean hasStock = spuVO.getTotalStock() > 0; + stringBuilder.append("ctx._source.hasStock " + code + hasStock + ";"); + stringBuilder.append("ctx._source.stockWarning " + code + spuVO.getStockWarning() + ";"); + + Script script = new Script(ScriptType.INLINE, + "painless", + stringBuilder.toString(), + Collections.emptyMap()); + map.put(spuVO.getSpuId(), script); + } + // 批量更新 + EsSearchUtil.updateByPainless(map, EsIndexEnum.PRODUCT.value()); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/ProductSearchManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/ProductSearchManager.java new file mode 100644 index 0000000..02af9c4 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/ProductSearchManager.java @@ -0,0 +1,657 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.group.feign.GroupFeignClient; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuCommFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.SpuStatus; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.dto.ProductSearchLimitDTO; +import com.tmerclub.cloud.common.product.vo.GroupActivitySpuVO; +import com.tmerclub.cloud.common.product.vo.SekillActivitySpuVO; +import com.tmerclub.cloud.common.product.vo.SpuActivityAppVO; +import com.tmerclub.cloud.common.product.vo.search.*; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.search.builder.ProductSearchRequestBuilder; +import com.tmerclub.cloud.search.builder.ProductSearchResponseBuilder; +import com.tmerclub.cloud.search.constant.DataType; +import com.tmerclub.cloud.search.constant.EsConstant; +import com.tmerclub.cloud.search.constant.EsRenovationProductSortEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.elasticsearch.action.search.SearchResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + + +/** + * @author FrozenWatermelon + * @date 2020/11/16 + */ +@Component +public class ProductSearchManager { + + private static final Logger log = LoggerFactory.getLogger(ProductSearchManager.class); + + @Autowired + private ProductSearchResponseBuilder productSearchResponseBuilder; + + + @Autowired + private ProductSearchRequestBuilder productSearchRequestBuilder; + + @DubboReference + private SpuFeignClient spuFeignClient; + + @DubboReference + private GroupFeignClient groupFeignClient; + + @DubboReference + private SeckillFeignClient seckillFeignClient; + + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SpuCommFeignClient spuCommFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + + /** + * 通过搜索信息分页搜索es数据并聚合返回的信息 + * + * @param pageDTO 分页数据 + * @param productSearchDTO 商品搜索条件 + * @return 搜索结果 + */ + public EsPageVO page(EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + productSearchDTO.setAppDisplay(Boolean.TRUE); + SearchResponse response = productSearchRequestBuilder.pageSearchResult(pageDTO, productSearchDTO, Boolean.TRUE); + return buildSearchResult(pageDTO, response); + } + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param pageDTO 分页数据 + * @param productSearchDTO 商品搜索条件 + * @return 搜索结果 + */ + public EsPageVO spuPage(EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + productSearchDTO.setAppDisplay(Boolean.TRUE); + SearchResponse response = productSearchRequestBuilder.pageSearchResult(pageDTO, productSearchDTO, Boolean.FALSE); + return buildSearchResult(pageDTO, response); + } + + /** + * 获取搜索扩展信息 + * + * @param pageDTO 分页数据 + * @param productSearchDTO 商品搜索条件 + * @return 搜索结果 + */ + public ProductSearchVO searchExtension(EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + ProductSearchDTO newProductSearchDTO = new ProductSearchDTO(); + newProductSearchDTO.setKeyword(productSearchDTO.getKeyword()); + newProductSearchDTO.setPrimaryCategoryId(productSearchDTO.getPrimaryCategoryId()); + newProductSearchDTO.setSecondaryCategoryId(productSearchDTO.getSecondaryCategoryId()); + newProductSearchDTO.setShopPrimaryCategoryId(productSearchDTO.getShopPrimaryCategoryId()); + newProductSearchDTO.setAppDisplay(Boolean.TRUE); + pageDTO.setPageSize(0); + SearchResponse response = productSearchRequestBuilder.pageSearchResult(pageDTO, newProductSearchDTO, Boolean.TRUE); + return productSearchResponseBuilder.getProductSearchList(response).get(0); + } + + /** + * 商品管理分页搜索es数据的信息 + * + * @param pageDTO 分页数据 + * @param productSearchDTO 商品搜索条件 + * @return 搜索结果 + */ + public EsPageVO adminPage(EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + adminSearchHandle(productSearchDTO); + EsPageVO result = new EsPageVO<>(); + SearchResponse response = productSearchRequestBuilder.pageSearchResult(pageDTO, productSearchDTO, Boolean.FALSE); + // 商品信息 + result.setList(productSearchResponseBuilder.buildSpuAdminList(response)); + // 分页信息 + productSearchResponseBuilder.buildSearchPage(pageDTO, result, response); + return result; + } + + /** + * 根据spuId列表,获取spu信息 + * + * @param productSearchDTO 商品搜索条件 + * @return spu列表 + */ + public List listSpuBySpuIds(ProductSearchDTO productSearchDTO) { + EsPageDTO pageDTO = null; + if (Objects.nonNull(productSearchDTO.getSpuIds())) { + pageDTO = new EsPageDTO(); + pageDTO.setPageNum(1); + pageDTO.setPageSize(productSearchDTO.getSpuIds().size()); + } + productSearchDTO.setDataType(DataType.ALL_PROD.value()); + SearchResponse response = productSearchRequestBuilder.pageSearchResult(pageDTO, productSearchDTO, Boolean.FALSE); + return productSearchResponseBuilder.buildSpuSearchList(response.getHits()); + } + + /** + * 构建搜索结果数据 + * + * @param pageDTO + * @param response + * @return + */ + private EsPageVO buildSearchResult(EsPageDTO pageDTO, SearchResponse response) { + EsPageVO esPageVO = new EsPageVO<>(); + + // 1、返回的所有查询到的商品 + List productSearchs = productSearchResponseBuilder.getProductSearchList(response); + esPageVO.setList(productSearchs); + + // 2、分页信息 + productSearchResponseBuilder.buildSearchPage(pageDTO, esPageVO, response); + return esPageVO; + } + + /** + * 根据店铺id列表获取每个店铺的spu列表 + * + * @param productSearchLimitDTO 店铺id列表 + * @return + */ + public List limitSpuList(ProductSearchLimitDTO productSearchLimitDTO) { + SearchResponse response = productSearchRequestBuilder.getLimitSpuResponse(productSearchLimitDTO); + List spuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.isNull(response)) { + return spuList; + } + Map> spuMap = productSearchResponseBuilder.loadSpuMapByAggregations(response); + for (Long id : spuMap.keySet()) { + spuList.addAll(spuMap.get(id)); + } + return spuList; + } + + /** + * 查询商品信息,并对响应的数据进行分组 + * + * @param productSearchLimitDTO + * @return + */ + public Map> limitSpuMap(ProductSearchLimitDTO productSearchLimitDTO) { + SearchResponse response = productSearchRequestBuilder.getLimitSpuResponse(productSearchLimitDTO); + if (Objects.isNull(response)) { + return new HashMap<>(0); + } + return productSearchResponseBuilder.loadSpuMapByAggregations(response); + } + + /** + * 获取商品活动信息(满减、优惠券) + * + * @param shopId + * @param spuId + * @return + */ + @Cacheable(cacheNames = CacheNames.SPU_ACTIVITY_KEY, key = "#spuId", sync = true) + public SpuActivityAppVO spuActivityBySpuId(Long shopId, Long spuId) { + ServerResponseEntity spuResponse = spuFeignClient.spuActivityBySpuId(shopId, spuId); + return spuResponse.getData(); + } + + /** + * 获取商品团购活动信息 + * + * @param spuList + * @return + */ + public void getGroupActivity(List spuList) { + long currentTimeMillis = System.currentTimeMillis(); + // 获取团购商品id + List spuIds = spuList.stream() + .filter(spu -> + Objects.equals(spu.getSpuType(), SpuType.GROUP.value()) && + Objects.nonNull(spu.getActivityStartTime()) && + currentTimeMillis > spu.getActivityStartTime() + ) + .map(SpuSearchVO::getSpuId) + .collect(Collectors.toList() + ); + if (CollUtil.isEmpty(spuIds)) { + return; + } + ServerResponseEntity> activityList = groupFeignClient.groupSpuListBySpuIds(spuIds); + Map groupMap = activityList.getData().stream().collect(Collectors.toMap(GroupActivitySpuVO::getSpuId, g -> g)); + log.info("团购活动数据:{}", Json.toJsonString(groupMap)); + if (MapUtil.isEmpty(groupMap)) { + return; + } + for (SpuSearchVO spuSearchVO : spuList) { + if (!groupMap.containsKey(spuSearchVO.getSpuId())) { + continue; + } + if (Objects.isNull(spuSearchVO.getActivityStartTime()) || (currentTimeMillis < spuSearchVO.getActivityStartTime())){ + continue; + } + SpuActivityAppVO spuActivityAppVO = new SpuActivityAppVO(); + spuActivityAppVO.setGroupActivity(groupMap.get(spuSearchVO.getSpuId())); + spuSearchVO.setActivityStatus(spuActivityAppVO.getGroupActivity().getStatus()); + spuSearchVO.setSpuActivity(spuActivityAppVO); + } + } + + /** + * 获取商品秒杀活动信息 + * + * @param selectedLot + * @param spuList + */ + public void getSeckillActivity(Integer selectedLot, List spuList) { + List spuIds = spuList.stream() + .filter(spu -> + Objects.equals(spu.getSpuType(), SpuType.SECKILL.value()) + ) + .map(SpuSearchVO::getSpuId) + .collect(Collectors.toList() + ); + + if (CollUtil.isEmpty(spuIds)) { + return; + } + + ServerResponseEntity> activityList = seckillFeignClient.seckillSpuListBySpuIds(selectedLot, spuIds); + Map seckillMap = activityList.getData().stream().collect(Collectors.toMap(SekillActivitySpuVO::getSpuId, g -> g)); + for (SpuSearchVO spuSearchVO : spuList) { + if (!seckillMap.containsKey(spuSearchVO.getSpuId())) { + continue; + } + if (Objects.isNull(spuSearchVO.getActivityStartTime())) { + continue; + } + SpuActivityAppVO spuActivityAppVO = new SpuActivityAppVO(); + spuActivityAppVO.setSekillActivitySpuVO(seckillMap.get(spuSearchVO.getSpuId())); + spuSearchVO.setActivityStatus(spuActivityAppVO.getSekillActivitySpuVO().getStatus()); + spuSearchVO.setSpuActivity(spuActivityAppVO); + } + } + + /** + * 装修接口搜索商品 + */ + public EsPageVO renovationPage(EsPageDTO pageDTO, ProductSearchDTO productSearchDTO, Long size) { + if (Objects.isNull(pageDTO.getPageSize()) || pageDTO.getPageSize() == 0) { + return new EsPageVO<>(); + } + productSearchDTO.setFetchSource(EsConstant.RENOVATION_FETCH_SOURCE); + // 不需要积分商品 + if (Objects.isNull(productSearchDTO.getSpuType())) { + List types = new ArrayList<>(Constant.INITIAL_CAPACITY); + types.add(SpuType.SCORE.value()); + productSearchDTO.setMustNotProdTypes(types); + } + + // 如果不是搜索指定商品,就只查询可以在用户端显示的商品 + if (CollUtil.isEmpty(productSearchDTO.getSpuIds())) { + productSearchDTO.setAppDisplay(Boolean.TRUE); + } + SearchResponse response = productSearchRequestBuilder.pageSearchResult(pageDTO, productSearchDTO, Boolean.TRUE); + EsPageVO result = buildSearchResult(pageDTO, response); + loadData(productSearchDTO, result.getList()); + + // 处理下瀑布流商品排序 + handleProdSort(productSearchDTO, result, size); + return result; + } + + /** + * 处理下瀑布流商品排序 + * + * @param productSearchDTO + * @param searchPage + * @param size + */ + private void handleProdSort(ProductSearchDTO productSearchDTO, EsPageVO searchPage, Long size) { + if (!Objects.equals(productSearchDTO.getShowSpuType(), 1) || CollectionUtils.isEmpty(productSearchDTO.getSpuIds())) { + return; + } + searchPage.setTotal(Objects.isNull(size) ? searchPage.getTotal() : size); + searchPage.setPages(Objects.isNull(size) ? searchPage.getPages() : PageUtil.getPages(searchPage.getTotal(), productSearchDTO.getPageSize())); + List productSearchList = new ArrayList<>(Constant.INITIAL_CAPACITY); + ProductSearchVO productSearchVO = searchPage.getList().get(0); + Map prodMap = productSearchVO.getSpus().stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, spuSearchVO -> spuSearchVO)); + for (Object prodId : productSearchDTO.getSpuIds()) { + if (!prodMap.containsKey(Long.valueOf(String.valueOf(prodId)))) { + continue; + } + productSearchList.add(prodMap.get(Long.valueOf(String.valueOf(prodId)))); + } + productSearchVO.setSpus(productSearchList); + } + + /** + * 切割属性信息 + */ + public Map> splitAttr(String attrStr) { + Map> attrMap = null; + if (StrUtil.isNotBlank(attrStr)) { + String attrLink = "\\^"; + String[] attrArray = attrStr.split(attrLink); + attrMap = new HashMap<>(attrArray.length); + for (String s : attrArray) { + String[] ids = s.split(Constant.UNDERLINE); + String[] split = ids[1].split(Constant.COMMA); + List attrValueIds = Arrays.asList(split); + attrMap.put(ids[0], attrValueIds); + } + } + return attrMap; + } + + /** + * 处理搜索数据 + */ + public void loadData(ProductSearchDTO productSearchDTO, List list) { + if (CollUtil.isEmpty(list)) { + return; + } + ProductSearchVO productSearch = list.get(0); + for (ProductSearchVO productSearchVO : list) { + loadShopData(productSearchVO); + if (StrUtil.isNotBlank(productSearchDTO.getBrandIds())) { + loadSearchBrandData(productSearchVO); + } + + // 获取商品秒杀、团购活动信息 + getGroupActivity(productSearchVO.getSpus()); + getSeckillActivity(productSearchDTO.getSelectedLot(), productSearchVO.getSpus()); + + if (Objects.equals(productSearchDTO.getNeedActivity(), 1)) { + loadActivity(productSearchVO); + } + if (CollUtil.isNotEmpty(productSearch.getAttrs())) { + loadAttr(productSearchVO, productSearchDTO.getAttrMap()); + } + + for (SpuSearchVO spus : productSearchVO.getSpus()) { + spus.setActivityStartTime(null); + } + } + } + + /** + * 获取店铺数据 + */ + public void loadShopData(ProductSearchVO productSearchVO) { + if (Objects.isNull(productSearchVO.getShopInfo()) || Objects.isNull(productSearchVO.getShopInfo().getShopId())) { + return; + } + ServerResponseEntity shopDataResponse = shopDetailFeignClient.shopExtensionData(productSearchVO.getShopInfo().getShopId()); + if (Objects.isNull(shopDataResponse.getData())) { + productSearchVO.setShopInfo(null); + return; + } + if (Objects.equals(shopDataResponse.getCode(), ResponseEnum.OK.value())) { + EsShopDetailBO esShopDetailBO = shopDataResponse.getData(); + ShopInfoSearchVO shopInfo = productSearchVO.getShopInfo(); + shopInfo.setShopLogo(esShopDetailBO.getShopLogo()); + shopInfo.setShopName(esShopDetailBO.getShopName()); + shopInfo.setSaleNum(esShopDetailBO.getSaleNum()); + shopInfo.setType(esShopDetailBO.getType()); + shopInfo.setCollectionNum(esShopDetailBO.getCollectionNum()); + } + } + + /** + * 获取品牌项信息 + */ + public void loadSearchBrandData(ProductSearchVO productSearchVO) { + if (CollUtil.isEmpty(productSearchVO.getBrands())) { + return; + } + productSearchVO.setSearchItem(new SearchItemVO()); + productSearchVO.getSearchItem().setBrands(productSearchVO.getBrands()); + productSearchVO.setBrands(null); + } + + /** + * 获取商品活动信息(满减、优惠券) + */ + public void loadActivity(ProductSearchVO productSearchVO) { + for (SpuSearchVO spu : productSearchVO.getSpus()) { + SpuActivityAppVO spuActivityAppVO = spuActivityBySpuId(spu.getShopId(), spu.getSpuId()); + if (Objects.isNull(spuActivityAppVO)) { + continue; + } + if (Objects.nonNull(spu.getSpuActivity())) { + spuActivityAppVO.setGroupActivity(spu.getSpuActivity().getGroupActivity()); + spuActivityAppVO.setSekillActivitySpuVO(spu.getSpuActivity().getSekillActivitySpuVO()); + } + spu.setSpuActivity(spuActivityAppVO); + } + } + + + /** + * 获取属性信息 + */ + public void loadAttr(ProductSearchVO productSearchVO, Map> attrMap) { + + Iterator iterator = productSearchVO.getAttrs().iterator(); + int oneAttr = 1; + while (iterator.hasNext()) { + AttrSearchVO attr = iterator.next(); + // 属性值小于等于一个属性,不显示该属性 + if (!Objects.isNull(attr)) { + if (attr.getAttrValues().size() <= oneAttr) { + iterator.remove(); + continue; + } + // 属性值作为pc端搜索参数时,不显示该属性 + if (CollectionUtil.isNotEmpty(attrMap) && attrMap.containsKey(attr.getAttrId().toString())) { + iterator.remove(); + } + attr.getAttrValues().sort(Comparator.comparing(AttrValueSearchVO::getAttrValueName).reversed()); + } else { + iterator.remove(); + } + } + } + + + /** + * 商品管理查询处理(商家端、平台端) + * + * @param productSearchDTO + */ + private void adminSearchHandle(ProductSearchDTO productSearchDTO) { + if (Objects.isNull(productSearchDTO) || Objects.isNull(productSearchDTO.getDataType())) { + return; + } + Integer dataType = productSearchDTO.getDataType(); + // 销售中 + if (Objects.equals(DataType.SALE.value(), dataType)) { + productSearchDTO.setSpuStatus(StatusEnum.ENABLE.value()); + } + // 已售罄 + else if (Objects.equals(DataType.SOLD_OUT.value(), dataType)) { + if (Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.MULTISHOP.value())) { + productSearchDTO.setSupplierDeliveryType(SupplierDeliveryType.SHOP_DELIVERY.value()); + } + productSearchDTO.setHasStock(0); + } + } + + public void addRenovationSpuCache(String key, ProductSearchDTO productSearchDTO, Long shopId, Integer expireTime) { + //TODO 后续优化 + if (Objects.isNull(productSearchDTO.getEsTimeRange()) && Objects.isNull(productSearchDTO.getEsRenovationSpuSort())) { + return; + } + // 计算时间 + int dayNum = 0; + switch (productSearchDTO.getEsTimeRange()) { + case 1: + dayNum = 365; + break; + case 2: + dayNum = 90; + break; + case 3: + dayNum = 30; + break; + case 4: + dayNum = 7; + break; + default: + break; + } + ServerResponseEntity> spuIdsResp; + // 1.获取根据条件的商品ids + if (Objects.equals(productSearchDTO.getEsRenovationSpuSort(), EsRenovationProductSortEnum.COMMENT_NUM_DESC.value()) || Objects.equals(productSearchDTO.getEsRenovationSpuSort(), EsRenovationProductSortEnum.COMMENT_NUM_ASC.value())) { + // 获取时间范围内的评论数排序,放入redis + spuIdsResp = spuCommFeignClient.getCommNumRankSpuIdsByShopIdAndTime(key, shopId, dayNum, expireTime, productSearchDTO.getEsRenovationSpuSort(), productSearchDTO.getPrimaryCategoryId()); + } else { + // 获取时间范围内的销量排序,放入redis + spuIdsResp = orderFeignClient.getSoldNumRankByShopIdAndTime(key, shopId, dayNum, expireTime, productSearchDTO.getEsRenovationSpuSort(), productSearchDTO.getPrimaryCategoryId()); + } + // 2.判断数量是否为1000个,没有就按创建时间排序补充剩余 + if (!spuIdsResp.isSuccess()) { + throw new LuckException(spuIdsResp.getMsg()); + } + List spuIds = spuIdsResp.getData(); + if (Objects.isNull(spuIds) || CollUtil.isEmpty(spuIds) || Objects.isNull(spuIds.get(0))) { + spuIds = new ArrayList<>(); + } + log.info("spuIds:{}", spuIds); + // 过滤掉商品状态不是正常的商品 + List filterSpuIds = getFilterSpuIds(spuIds, productSearchDTO.getPrimaryCategoryId()); + log.info("filterSpuIds:{}", filterSpuIds); + if (filterSpuIds.size() >= EsConstant.RENOVATION_PRODUCT_IDS_LIMIT) { + return; + } + // 不破坏原来的排序 + if (CollUtil.isNotEmpty(filterSpuIds)) { + spuIds.removeIf(spuId -> !filterSpuIds.contains(spuId)); + } else { + spuIds = new ArrayList<>(100); + } + log.info("remove-spuIds:{}", spuIds); + int surplusNum = EsConstant.RENOVATION_PRODUCT_IDS_LIMIT - spuIds.size(); + EsPageDTO pageDTO = new EsPageDTO(); + pageDTO.setPageNum(1); + pageDTO.setPageSize(surplusNum); + ProductSearchDTO productSearch = BeanUtil.map(productSearchDTO, ProductSearchDTO.class); + productSearch.setSpuIdsExclude(spuIds); + productSearch.setShowSpuType(0); + productSearch.setAppDisplay(true); + EsPageVO searchPage = renovationPage(pageDTO, productSearch, null); + List spuList = searchPage.getList().get(0).getSpus(); + List esSpuIds = spuList.stream().map(SpuSearchVO::getSpuId).collect(Collectors.toList()); + log.info("esSpuIds:{}", esSpuIds); + // 判断是怎么排序的 降序的话添加到最后 正序的话添加到最前面 + if (Objects.equals(productSearchDTO.getEsRenovationSpuSort(), EsRenovationProductSortEnum.COMMENT_NUM_DESC.value()) + || Objects.equals(productSearchDTO.getEsRenovationSpuSort(), EsRenovationProductSortEnum.SALE_NUM_DESC.value())) { + spuIds.addAll(esSpuIds); + } else { + spuIds.addAll(0, esSpuIds); + } + log.info("redis-spuIds:{}", spuIds); + // 放入es缓存 + RedisUtil.setRightPushAll(key, spuIds, expireTime); + } + + private List getFilterSpuIds(List spuIds, Long primaryCategoryId) { + if (CollUtil.isEmpty(spuIds)) { + return new ArrayList<>(0); + } + EsPageDTO filterPage = new EsPageDTO(); + filterPage.setPageNum(1); + filterPage.setPageSize(spuIds.size()); + ProductSearchDTO filterSearch = new ProductSearchDTO(); + filterSearch.setSpuIds(spuIds); + filterSearch.setSpuStatus(SpuStatus.PUT_SHELF.value()); + filterSearch.setShowSpuType(0); + filterSearch.setAppDisplay(true); + if (Objects.nonNull(primaryCategoryId)) { + filterSearch.setPrimaryCategoryId(primaryCategoryId); + } + EsPageVO filterSearchPage = renovationPage(filterPage, filterSearch, null); + if (CollUtil.isEmpty(filterSearchPage.getList())) { + return new ArrayList<>(0); + } + List filterSpuList = filterSearchPage.getList().get(0).getSpus(); + return filterSpuList.stream().map(SpuSearchVO::getSpuId).collect(Collectors.toList()); + } + + public EsPageVO showSpuTypeRenovationPage(EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + Long size = null; + if (Objects.equals(productSearchDTO.getShowSpuType(), 1)) { + if (Objects.equals(productSearchDTO.getEsRenovationSpuSort(), EsRenovationProductSortEnum.CREATE_TIME_ASC.value()) || Objects.equals(productSearchDTO.getEsRenovationSpuSort(), EsRenovationProductSortEnum.CREATE_TIME_DESC.value())) { + productSearchDTO.setSort(productSearchDTO.getEsRenovationSpuSort()); + } else { + // 获取指定规则的商品ids + size = getSpuIds(pageDTO, productSearchDTO); + } + } + EsPageVO searchPage = renovationPage(pageDTO, productSearchDTO, size); + loadData(productSearchDTO, searchPage.getList()); + return searchPage; + } + + @SuppressWarnings("unchecked") + private Long getSpuIds(EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + Long shopId = Objects.isNull(productSearchDTO.getShopId()) ? 0L : productSearchDTO.getShopId(); + String key = EsConstant.RENOVATION_PRODUCT_IDS_CACHE + CacheNames.UNION + shopId + + CacheNames.UNION_KEY + productSearchDTO.getEsTimeRange() + CacheNames.UNION_KEY + productSearchDTO.getEsRenovationSpuSort() + + CacheNames.UNION_KEY + productSearchDTO.getPrimaryCategoryId(); + if (!RedisUtil.hasKey(key)) { + addRenovationSpuCache(key, productSearchDTO, shopId, EsConstant.RENOVATION_PRODUCT_IDS_CACHE_TIME); + } + Long size = RedisUtil.getListSize(key); + long startNum = (long) (pageDTO.getPageNum() - 1) * pageDTO.getPageSize(); + long endNum = (long) pageDTO.getPageNum() * pageDTO.getPageSize() - 1; + endNum = Math.min(endNum, size - 1); + List spuIds = RedisUtil.getListRange(key, startNum, endNum); + productSearchDTO.setSpuIds(spuIds); + return size; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/PurchaseOrderSearchManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/PurchaseOrderSearchManager.java new file mode 100644 index 0000000..382fa2c --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/PurchaseOrderSearchManager.java @@ -0,0 +1,366 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.product.dto.WarehouseSearchDTO; +import com.tmerclub.cloud.api.product.feign.WarehouseFeignClient; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.order.bo.EsPurchaseOrderBO; +import com.tmerclub.cloud.api.order.bo.EsPurchaseOrderItemBO; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.order.dto.PurchaseOrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsPurchaseOrderVO; +import com.tmerclub.cloud.common.product.constant.StockPointType; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.lucene.search.join.ScoreMode; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.NestedQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.RangeQueryBuilder; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/11/16 + */ +@Component +public class PurchaseOrderSearchManager { + + private static final Logger log = LoggerFactory.getLogger(PurchaseOrderSearchManager.class); + + + @Autowired + private RestHighLevelClient restHighLevelClient; + + + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @DubboReference + private WarehouseFeignClient warehouseFeignClient; + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param param 退款订单搜索条件 + * @return 搜索结果 + */ + public EsPageVO page(EsPageDTO pageDTO, PurchaseOrderSearchDTO param) { + param.setPageSize(pageDTO.getPageSize()); + param.setPageNum(pageDTO.getPageNum()); + EsPageVO purchaseOrderPage = pageSearchResult(param); + this.loadInfo(purchaseOrderPage.getList()); + return purchaseOrderPage; + } + + /** + * 补充信息 + * @param list 列表数据 + */ + private void loadInfo(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + Set supplierIds = new HashSet<>(Constant.INITIAL_CAPACITY); + Set warehouseIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (EsPurchaseOrderVO purchaseOrderVO : list) { + supplierIds.add(purchaseOrderVO.getSupplierId()); + warehouseIds.add(purchaseOrderVO.getWarehouseId()); + } + // 查询供应商信息 + ServerResponseEntity> supplierResp = supplierDetailFeignClient.listSupplierDetailBySupplierIds(new ArrayList<>(supplierIds)); + if (!supplierResp.isSuccess()) { + throw new LuckException(supplierResp.getMsg()); + } + Map supplierMap = supplierResp.getData().stream().collect(Collectors.toMap(SupplierApiDetailVO::getSupplierId, supplierApiDetailVO -> supplierApiDetailVO)); + // 查询仓库信息 + WarehouseSearchDTO searchDTO = new WarehouseSearchDTO(); + searchDTO.setWarehouseIds(new ArrayList<>(warehouseIds)); + List warehouses = warehouseFeignClient.listWarehouse(searchDTO); + Map warehouseMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(warehouses)) { + warehouseMap = warehouses.stream().collect(Collectors.toMap(WarehouseVO::getWarehouseId, WarehouseVO::getWarehouseName)); + } + // 补充信息 + for (EsPurchaseOrderVO purchaseOrderVO : list) { + SupplierApiDetailVO supplierApiDetailVO = supplierMap.get(purchaseOrderVO.getSupplierId()); + purchaseOrderVO.setSupplierName(supplierApiDetailVO.getSupplierName()); + purchaseOrderVO.setContactPhone(supplierApiDetailVO.getContactPhone()); + purchaseOrderVO.setWarehouseName(warehouseMap.get(purchaseOrderVO.getWarehouseId())); + purchaseOrderVO.setStockPointType(purchaseOrderVO.getStockPointType() == null ? StockPointType.WAREHOUSE.getValue() : purchaseOrderVO.getStockPointType()); + } + } + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param param 退款订单搜索条件 + * @return 搜索结果 + */ + public EsPageVO pageSearchResult(PurchaseOrderSearchDTO param) { + if (Objects.isNull(param.getPageSize())) { + param.setPageSize(10); + } + if (Objects.isNull(param.getPageNum())) { + param.setPageNum(1); + } + //1、查询订单数据 + SearchResponse response = searchResult(param); + //2.处理响应的数据 + return pageEsOrderBO(response, param.getPageSize()); + } + + private EsPageVO pageEsOrderBO(SearchResponse response, Integer pageSize) { + EsPageVO pageVO = new EsPageVO<>(); + List purchaseOrderList = getOrderRefundListByResponse(response.getHits().getHits()); + pageVO.setList(purchaseOrderList); + buildSearchPage(pageVO, response, pageSize); + return pageVO; + } + + /** + * 构建分页数据 + * + * @param esPageVO + * @param response + * @param pageSize + */ + private void buildSearchPage(EsPageVO esPageVO, SearchResponse response, Integer pageSize) { + //总记录数 + long total = response.getHits().getTotalHits().value; + esPageVO.setTotal(total); + // 总页码 + int totalPages = (int) total % pageSize == 0 ? + (int) total / pageSize : ((int) total / pageSize + 1); + esPageVO.setPages(totalPages); + } + + private SearchResponse searchResult(PurchaseOrderSearchDTO param) { + // 封装检索条件 + SearchRequest searchRequest = buildSearchRequest(param); + SearchResponse response; + try { + //2、执行检索请求 + response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + + log.info("搜索返回结果:{}", response.toString()); + + } catch (IOException e) { + log.error(e.toString()); + throw new LuckException("搜索服务出了点小差,请稍后再试", e); + } + return response; + } + + /** + * 从es返回的数据中获取spu列表 + * + * @param hits es返回的数据 + * @return + */ + private List getOrderRefundListByResponse(SearchHit[] hits) { + List purchaseOrderList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Integer lang = I18nMessage.getLang(); + for (SearchHit hit : hits) { + EsPurchaseOrderBO purchaseOrder = Json.parseObject(hit.getSourceAsString(), EsPurchaseOrderBO.class); + if (!CollectionUtils.isEmpty(purchaseOrder.getPurchaseOrderItems())) { + for (EsPurchaseOrderItemBO purchaseOrderItemBO : purchaseOrder.getPurchaseOrderItems()) { + if (Objects.equals(lang, LanguageEnum.LANGUAGE_EN.getLang())) { + purchaseOrderItemBO.setSpuName(purchaseOrderItemBO.getSpuNameEn()); + purchaseOrderItemBO.setSkuName(purchaseOrderItemBO.getSkuNameEn()); + } + if (StrUtil.isBlank(purchaseOrderItemBO.getSpuName())) { + purchaseOrderItemBO.setSpuName(purchaseOrderItemBO.getSpuNameZh()); + } + if (StrUtil.isBlank(purchaseOrderItemBO.getSkuName())) { + purchaseOrderItemBO.setSkuName(purchaseOrderItemBO.getSkuNameZh()); + } + } + } + if (Objects.equals(lang, LanguageEnum.LANGUAGE_EN.getLang())) { + purchaseOrder.setSpuName(purchaseOrder.getSpuNameEn()); + } + if (StrUtil.isBlank(purchaseOrder.getSpuName())) { + purchaseOrder.setSpuName(purchaseOrder.getSpuNameZh()); + } + purchaseOrderList.add(BeanUtil.map(purchaseOrder, EsPurchaseOrderVO.class)); + } + return purchaseOrderList; + } + + + /** + * 准备检索请求 + * + * @param param 搜索参数 + * @return + */ + private SearchRequest buildSearchRequest(PurchaseOrderSearchDTO param) { + + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + + // 构建bool-query + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + + // 过滤 + filterQueryIfNecessary(param, boolQueryBuilder); + + // 关键字搜索 + keywordSearch(param, boolQueryBuilder); + + // 排序 + sort(searchSourceBuilder, boolQueryBuilder); + + if (Objects.nonNull(param.getPageNum()) && Objects.nonNull(param.getPageSize())) { + //分页 + searchSourceBuilder.from((param.getPageNum() - 1) * param.getPageSize()); + searchSourceBuilder.size(param.getPageSize()); + } + + log.info("构建的DSL语句 {}", searchSourceBuilder); + + return new SearchRequest(new String[]{EsIndexEnum.PURCHASE_ORDER.value()}, searchSourceBuilder); + } + + + /** + * 关键字搜索 + */ + private void keywordSearch(PurchaseOrderSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + + // 创建查询语句 ES中must和should不能同时使用 同时使用should失效 嵌套多个must 将should条件拼接在一个must中即可 + + + BoolQueryBuilder keywordShouldQuery = QueryBuilders.boolQuery(); + + // 店铺名称 + if (StrUtil.isNotBlank(param.getShopName())) { + keywordShouldQuery.should(QueryBuilders.matchQuery("shopName", param.getShopName())); + } + + // 供应商名称 + if (StrUtil.isNotBlank(param.getSupplierName())) { + keywordShouldQuery.should(QueryBuilders.matchQuery("supplierName", param.getSupplierName())); + } + + // 商品名称 + if (StrUtil.isNotBlank(param.getSpuName())) { + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); + boolQuery.should(QueryBuilders.matchQuery("purchaseOrderItems.spuNameZh", param.getSpuName())); + boolQuery.should(QueryBuilders.matchQuery("purchaseOrderItems.spuNameEn", param.getSpuName())); + NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("purchaseOrderItems", boolQuery, ScoreMode.None); + boolQueryBuilder.must(nestedQueryBuilder); + } + + boolQueryBuilder.must(keywordShouldQuery); + } + + /** + * 进行排序 + */ + private void sort(SearchSourceBuilder searchSourceBuilder, BoolQueryBuilder boolQueryBuilder) { + searchSourceBuilder.sort("createTime", SortOrder.DESC); + searchSourceBuilder.query(boolQueryBuilder); + } + + /** + * 过滤查询条件,如果有必要的话 + * + * @param param 查询条件 + * @param boolQueryBuilder 组合进boolQueryBuilder + */ + private void filterQueryIfNecessary(PurchaseOrderSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 店铺id + if (Objects.nonNull(param.getShopId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("shopId", param.getShopId())); + } + // 店铺id列表 + if (CollUtil.isNotEmpty(param.getShopIds())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("shopId", param.getShopIds())); + } + // 供应商id + if (Objects.nonNull(param.getSupplierId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("supplierId", param.getSupplierId())); + } + // 供应商id列表 + if (CollUtil.isNotEmpty(param.getSupplierIds())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("supplierId", param.getSupplierId())); + } + // 供应商id列表 + if (Objects.nonNull(param.getPurchaseOrderId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("purchaseOrderId", param.getPurchaseOrderId())); + } + // 联系人 + if (StrUtil.isNotBlank(param.getConsignee())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("consignee", param.getConsignee())); + } + // 手机号 + if (StrUtil.isNotBlank(param.getMobile())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("mobile", param.getMobile())); + } + + // 创建时间: 开始时间 - 结束时间 + if (param.getStartTime() != null || param.getEndTime() != null) { + String createTime = "createTime"; + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(createTime); + if (param.getStartTime() != null) { + rangeQueryBuilder.gte(param.getStartTime()); + } + if (param.getEndTime() != null) { + rangeQueryBuilder.lte(param.getEndTime()); + } + boolQueryBuilder.filter(rangeQueryBuilder); + } + + // 状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成 + if (!CollectionUtils.isEmpty(param.getStatuses())) { + boolQueryBuilder.filter(QueryBuilders.termsQuery("status", param.getStatuses())); + } else if (Objects.nonNull(param.getStatus())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("status", param.getStatus())); + } + + // sku编码 + if (StrUtil.isNotBlank(param.getPartyCodes())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("partyCode", param.getPartyCodes())); + } + + // 商品编码 + if (StrUtil.isNotBlank(param.getSpuCodes())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("spuCode", param.getSpuCodes())); + } + } +} diff --git a/tmerclub-search/src/main/resources/bootstrap.yml b/tmerclub-search/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..424cb76 --- /dev/null +++ b/tmerclub-search/src/main/resources/bootstrap.yml @@ -0,0 +1,28 @@ +server: + port: ${MALL4CLOUD_PORT:9108} +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} +logging: + tracer: + pattern: '%5p [${spring.application.name:},%X{X-B3-Parent-SpanName},%X{X-B3-TraceId},%X{X-B3-SpanId}]' + +# dubbo端口:默认为服务端口+2000 +dubbo: + protocol: + port: ${MALL4CLOUD_DUBBO_PORT:9508} diff --git a/tmerclub-seckill/Dockerfile b/tmerclub-seckill/Dockerfile new file mode 100644 index 0000000..0b93728 --- /dev/null +++ b/tmerclub-seckill/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms512m", "-Xmx512m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/SeckillApplication.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/SeckillApplication.java new file mode 100644 index 0000000..971ecf2 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/SeckillApplication.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill; + +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.security.servlet.UserDetailsServiceAutoConfiguration; + +/** + * @author FrozenWatermelon + * @date 2020/11/19 + */ +@SpringBootApplication(scanBasePackages = "com.moyuer.cloud", exclude = UserDetailsServiceAutoConfiguration.class) +@EnableDubbo(scanBasePackages = "com.moyuer.cloud.**.feign") +public class SeckillApplication { + + public static void main(String[] args) { + SpringApplication.run(SeckillApplication.class, args); + } + +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/RedisConfig.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/RedisConfig.java new file mode 100644 index 0000000..8d5bcb0 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/RedisConfig.java @@ -0,0 +1,9 @@ +package com.tmerclub.cloud.seckill.config; + +import org.springframework.stereotype.Component; + +@Component +public class RedisConfig { + + +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/RocketMqConfig.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/RocketMqConfig.java new file mode 100644 index 0000000..7377ed7 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/RocketMqConfig.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.config; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqAdapter; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * @author FrozenWatermelon + * @date 2021/3/30 + */ +@RefreshScope +@Configuration +public class RocketMqConfig { + + @Autowired + private RocketMqAdapter rocketMqAdapter; + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate seckillOrderCreateTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SECKILL_ORDER_CREATE_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate seckillOrderTimeOutCancelTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SECKILL_ORDER_TIME_OUT_CANCEL_TOPIC); + } + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendActivityOfflineNotifyToShopTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SEND_ACTIVITY_OFFLINE_NOTIFY_TO_SHOP_TOPIC); + } + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendActivityAuditNotifyToShopTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SEND_ACTIVITY_AUDIT_NOTIFY_TO_SHOP_TOPIC); + } + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate outStockLogTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.OUT_STOCK_LOG_TOPIC); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/DistributedIdKey.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/DistributedIdKey.java new file mode 100644 index 0000000..b812476 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/DistributedIdKey.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.constant; + +import com.tmerclub.cloud.common.leaf.constant.GlobalDistributedIdKey; + +/** + * 分布式id key + * + * @author FrozenWatermelon + * @date 2021/4/9 + */ +public interface DistributedIdKey { + /** + * 订单id + */ + String MALL4CLOUD_ORDER = GlobalDistributedIdKey.MALL4CLOUD_ORDER.value(); +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/SeckillConstant.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/SeckillConstant.java new file mode 100644 index 0000000..2a8af6c --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/SeckillConstant.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.constant; + +/** + * 秒杀分类最大数量 + * + * @author lhd + * @date 2020-04-19 10:16:53 + */ +public class SeckillConstant { + /** + * 秒杀分类最大数量 + */ + public static final Integer SECKILL_CATEGORY_MAX_NUM = 16; + + /** + * 秒杀商品默认分片数量 + */ + public static final int ZONE_NUM = 10; + + /** + * 每个分片库存至少为1个库存,所以总库存必须大于等于10 + */ + public static final int ZONE_MIN_STOCK = 10; + +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/SuitableProdTypeEnum.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/SuitableProdTypeEnum.java new file mode 100644 index 0000000..f962637 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/SuitableProdTypeEnum.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.constant; + +/** + * 等级 + * + * @author yxf + * @date 2020/11/20 + */ +public enum SuitableProdTypeEnum { + + /** + * 全部商品参与 + */ + ALL_SPU(0), + + /** + * 指定商品参与 + */ + ASSIGN_SPU(1); + + private final Integer value; + + public Integer value() { + return value; + } + + SuitableProdTypeEnum(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/admin/SeckillController.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/admin/SeckillController.java new file mode 100644 index 0000000..abb65c2 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/admin/SeckillController.java @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.controller.admin; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.seckill.dto.SeckillDTO; +import com.tmerclub.cloud.seckill.dto.SeckillSkuDTO; +import com.tmerclub.cloud.seckill.service.SeckillService; +import com.tmerclub.cloud.seckill.service.SeckillSkuService; +import com.tmerclub.cloud.seckill.vo.*; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + + +/** + * 秒杀信息 + * + * @author FrozenWatermelon + * @date 2019-08-28 09:36:59 + */ +@RestController("adminSeckillController") +@RequestMapping("/mp/seckill") +@Tag(name = "秒杀管理") +public class SeckillController { + + @Autowired + private SeckillService seckillService; + @Autowired + private SeckillSkuService seckillSkuService; + @DubboReference + private SpuFeignClient spuFeignClient; + + @GetMapping("/list_seckill") + @Operation(summary = "显示最近的秒杀信息列表", description = "显示最近的秒杀信息列表,type字段,0:为即将开场,1:已经开场,specTime时间搜索") + public ServerResponseEntity> listSeckill(@Valid PageDTO pageDTO, @RequestParam("type") Integer type, + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam(value = "specTime", required = false) Long specTime) { + Long shopId = AuthUserContext.get().getTenantId(); + PageVO adminVOList = seckillService.listByShopId(pageDTO, shopId, type, specTime); + return ServerResponseEntity.success(adminVOList); + } + + @GetMapping("/list_end_seckill") + @Operation(summary = "显示已经结束的秒杀信息列表", description = "显示已经结束的秒杀信息列表,specTime时间搜索") + public ServerResponseEntity> listEndSeckill(@Valid PageDTO pageDTO, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam(value = "specTime", required = false) Long specTime) { + Long shopId = AuthUserContext.get().getTenantId(); + PageVO adminVOList = seckillService.listEndSeckillByShopId(pageDTO, shopId, specTime); + return ServerResponseEntity.success(adminVOList); + } + + @GetMapping("/list_seckill_spu_by_time") + @Operation(summary = "根据时间、商品名称返回秒杀商品信息列表", description = "显示最近一个月秒杀信息列表") + public ServerResponseEntity> listSeckillSpuByTime(@RequestParam("startTimestamp") Long startTimestamp, + PageDTO pageDTO, ProductSearchDTO productSearch) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + productSearch.setShopId(AuthUserContext.get().getTenantId()); + } + PageVO adminVOList = seckillService.listSeckillSpuByTime(pageDTO, startTimestamp, productSearch); + return ServerResponseEntity.success(adminVOList); + } + + /** + * 通过id查询秒杀信息 + * + * @param seckillId id + * @return 单个数据 + */ + @GetMapping + @Operation(summary = "通过id查询秒杀信息", description = "通过id查询秒杀信息") + public ServerResponseEntity getById(@RequestParam("seckillId") Long seckillId) { + SeckillVO seckillVO = seckillService.getBySeckillId(seckillId); + List seckillSkuList = seckillSkuService.listSeckillSkuBySeckillId(seckillId); + long now = System.currentTimeMillis(); + if (Objects.equals(seckillVO.getStatus(), StatusEnum.ENABLE.value()) && seckillVO.getStartTime().getTime() < now && seckillVO.getEndTime().getTime() > now) { + // 活动正在进行中的库存查询 + Integer totalStock = 0; + for (SeckillSkuVO seckillSkuVO : seckillSkuList) { + Integer skuStock = 0; + List stockPointIds = seckillSkuVO.getSeckillStockPointList().stream().map(SeckillStockPointSkuVO::getStockPointId).collect(Collectors.toList()); + Map stockMap = seckillSkuService.getPointStockBySeckillSkuId(seckillSkuVO.getSeckillId(),seckillSkuVO.getSkuId(), stockPointIds); + for (SeckillStockPointSkuVO pointSkuVO : seckillSkuVO.getSeckillStockPointList()) { + Integer stock = stockMap.get(pointSkuVO.getStockPointId()); + pointSkuVO.setStock(stock); + skuStock += stock; + } + seckillSkuVO.setSeckillStocks(skuStock); + totalStock += skuStock; + } + seckillVO.setSeckillTotalStocks(totalStock); + } + SpuVO spuVO = spuFeignClient.getSpuAndSkuBySpuId(seckillVO.getSpuId()).getData(); + seckillVO.setSpuVO(spuVO); + seckillVO.setSkuList(spuVO.getSkus()); + seckillVO.setSeckillSkuList(seckillSkuList); + return ServerResponseEntity.success(seckillVO); + } + + /** + * 新增秒杀信息 + * + * @return 是否新增成功 + */ + @PostMapping + @Operation(summary = "新增秒杀信息", description = "新增秒杀信息") + public ServerResponseEntity save(@RequestBody @Valid SeckillDTO seckillDTO) { + SeckillVO seckill = BeanUtil.map(seckillDTO, SeckillVO.class); + // 处理时间 + Date startTime = new Date(seckillDTO.getStartTimestamps()); + Date endTime = DateUtil.offsetHour(startTime, 2); + seckill.setStartTime(startTime); + seckill.setEndTime(endTime); + Long shopId = AuthUserContext.get().getTenantId(); + List spuList = spuFeignClient.listCanSeckillProd(seckillDTO.getSpuId(), shopId).getData(); + if (CollectionUtil.isEmpty(spuList)) { + // 商品无法参与秒杀活动 + throw new LuckException("商品无法参与秒杀活动"); + } + // 当前小时 + int nowHour = DateUtil.hour(new Date(), true); + if (DateUtil.isSameDay(new Date(), startTime) && seckillDTO.getSelectedLot() <= nowHour + 1) { + // 商品无法参与秒杀活动 + throw new LuckException("不能参与离开场不足一个小时的秒杀活动!"); + } + List seckillSkuList = seckillDTO.getSeckillSkuList(); + Integer seckillTotalStocks = 0; + long seckillPrice = Long.MAX_VALUE; + for (SeckillSkuDTO seckillSku : seckillSkuList) { + + seckillTotalStocks += seckillSku.getSeckillStocks(); + + seckillPrice = Math.min(seckillPrice, seckillSku.getSeckillPrice()); + } + // 库存 + seckill.setSeckillOriginStocks(seckillTotalStocks); + seckill.setSeckillTotalStocks(seckillTotalStocks); + // 配置店铺id + seckill.setShopId(AuthUserContext.get().getTenantId()); + seckill.setSpuId(seckillDTO.getSpuId()); + seckill.setSeckillPrice(seckillPrice); + seckillService.saveSeckillAndItems(seckill, seckillSkuList); + seckillSkuService.removeSeckillSkuCacheBySeckillId(seckill.getSeckillId()); + seckillService.removeSeckillCacheById(seckill.getSeckillId()); + return ServerResponseEntity.success(); + } + + /** + * 使秒杀商品失效 + * + * @param seckillId 秒杀信息 + * @return 是否失效成功 + */ + @PutMapping("/invalid/{seckillId}") + @Operation(summary = "使秒杀商品失效", description = "使秒杀商品失效") + public ServerResponseEntity invalidById(@PathVariable Long seckillId) { + SeckillVO seckill = seckillService.getBySeckillId(seckillId); + Long shopId = AuthUserContext.get().getTenantId(); + if (seckill == null) { + throw new LuckException("未找到此活动,请稍后重试"); + } + if (!Objects.equals(shopId, seckill.getShopId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (!Objects.equals(seckill.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + seckillService.invalidById(seckill.getSeckillId(), seckill.getSpuId()); + seckillSkuService.handSeckillPointSku(seckill); + seckillSkuService.removeSeckillSkuCacheBySeckillId(seckill.getSeckillId()); + seckillService.removeSeckillCacheById(seckill.getSeckillId()); + return ServerResponseEntity.success(); + } + + /** + * 通过id删除秒杀信息 + * + * @param seckillId id + * @return 是否删除成功 + */ + @DeleteMapping + @Operation(summary = "通过id删除秒杀信息", description = "通过id删除秒杀信息") + public ServerResponseEntity removeById(@RequestParam("seckillId") Long seckillId) { + SeckillVO seckill = seckillService.getBySeckillId(seckillId); + + if (!Objects.equals(StatusEnum.DISABLE.value(), seckill.getStatus())) { + // 秒杀活动未关闭,无法删除 + throw new LuckException("秒杀活动未关闭,无法删除"); + } + seckill.setIsDelete(1); + seckillService.updateById(seckill); + seckillSkuService.removeSeckillSkuCacheBySeckillId(seckill.getSeckillId()); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_offline_handle_event/{seckillId}") + @Operation(summary = "获取最新下线的事件", description = "获取最新下线的事件") + public ServerResponseEntity getOfflineHandleEvent(@PathVariable Long seckillId) { + return ServerResponseEntity.success(seckillService.getOfflineHandleEvent(seckillId)); + } + + @PostMapping("/offline") + @Operation(summary = "下线秒杀活动", description = "下线秒杀活动") + public ServerResponseEntity offline(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + SeckillVO seckillVO = seckillService.getBySeckillId(offlineHandleEventDto.getHandleId()); + if (Objects.isNull(seckillVO)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + seckillService.offline(offlineHandleEventDto, seckillVO.getSpuId()); + seckillService.removeSeckillCacheById(offlineHandleEventDto.getHandleId()); + seckillSkuService.removeSeckillSkuCacheBySeckillId(offlineHandleEventDto.getHandleId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/audit") + @Operation(summary = "审核活动", description = "审核活动") + public ServerResponseEntity audit(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + seckillService.audit(offlineHandleEventDto); + seckillService.removeSeckillCacheById(offlineHandleEventDto.getHandleId()); + seckillSkuService.removeSeckillSkuCacheBySeckillId(offlineHandleEventDto.getHandleId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/audit_apply") + @Operation(summary = "违规活动提交审核", description = "违规活动提交审核") + public ServerResponseEntity auditApply(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + seckillService.auditApply(offlineHandleEventDto); + seckillService.removeSeckillCacheById(offlineHandleEventDto.getHandleId()); + seckillSkuService.removeSeckillSkuCacheBySeckillId(offlineHandleEventDto.getHandleId()); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_join_seckill_merchant_num") + @Operation(summary = "获取正在参与秒杀活动的商家数量", description = "获取正在参与秒杀活动的商家数量") + public ServerResponseEntity getJoinSeckillMerchantNum() { + if (!Objects.equals(AuthUserContext.get().getTenantId(), Constant.PLATFORM_SHOP_ID)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + Integer num = seckillService.getJoinSeckillMerchantNum(); + return ServerResponseEntity.success(num); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/app/SeckillCategoryController.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/app/SeckillCategoryController.java new file mode 100644 index 0000000..0f49216 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/app/SeckillCategoryController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.controller.app; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.seckill.mapper.SeckillMapper; +import com.tmerclub.cloud.seckill.model.SeckillCategory; +import com.tmerclub.cloud.seckill.service.SeckillCategoryService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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.util.List; + +/** + * 秒杀分类信息 + * + * @author lhd + * @date 2021-04-19 11:26:35 + */ +@RestController("appSeckillCategoryController") +@RequestMapping("/ua/seckill_category") +@Tag(name = "app-秒杀分类信息") +public class SeckillCategoryController { + + @Autowired + private SeckillCategoryService seckillCategoryService; + + @Autowired + private SeckillMapper seckillMapper; + + + @GetMapping("/list") + @Operation(summary = "获取秒杀分类信息列表", description = "分页获取秒杀分类信息列表") + public ServerResponseEntity> list() { + List seckillCategory = seckillCategoryService.list(); + return ServerResponseEntity.success(seckillCategory); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/platform/SeckillTimeController.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/platform/SeckillTimeController.java new file mode 100644 index 0000000..3838729 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/platform/SeckillTimeController.java @@ -0,0 +1,60 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.controller.platform; + + +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysConfigApiVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.seckill.service.SeckillService; +import io.swagger.v3.oas.annotations.Operation; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + +/** + * 秒杀相关配置 + * + * @author lhd + */ +@RestController +@RequestMapping("/p/seckill_time") +public class SeckillTimeController { + + @DubboReference + private ConfigFeignClient configFeignClient; + + @Autowired + private SeckillService seckillService; + + /** + * 配置信息 + */ + @GetMapping("/info/{id}") + public ServerResponseEntity info(@PathVariable("id") String key) { + String value = configFeignClient.getConfig(key).getData(); + SysConfigApiVO sysConfigApiVO = new SysConfigApiVO(); + sysConfigApiVO.setParamKey(key); + sysConfigApiVO.setParamValue(value); + return ServerResponseEntity.success(sysConfigApiVO); + } + + /** + * 保存or修改配置 + */ + @PostMapping + @Operation(summary = "保存or修改配置", description = "显示已经结束的秒杀信息列表,specTime时间搜索") + public ServerResponseEntity saveOrUpdate(@RequestBody SysConfigApiVO config) { + seckillService.saveSeckillTime(config); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillCategoryDTO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillCategoryDTO.java new file mode 100644 index 0000000..597a3e7 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillCategoryDTO.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 秒杀分类信息DTO + * + * @author lhd + * @date 2021-04-19 11:26:35 + */ +public class SeckillCategoryDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "秒杀分类id") + private Long categoryId; + + @Schema(description = "分类名称") + private String name; + + @Schema(description = "排序") + private Integer seq; + + @Schema(description = "分类ids") + private List categoryIds; + + public List getCategoryIds() { + return categoryIds; + } + + public void setCategoryIds(List categoryIds) { + this.categoryIds = categoryIds; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "SeckillCategoryDTO{" + + "categoryId=" + categoryId + + ", name='" + name + '\'' + + ", seq=" + seq + + ", categoryIds=" + categoryIds + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/app/SeckillOrderDTO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/app/SeckillOrderDTO.java new file mode 100644 index 0000000..d7afbcb --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/app/SeckillOrderDTO.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.dto.app; + +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 秒杀订单 + * + * @author FrozenWatermelon + * @date 2021-04-12 10:39:32 + */ +public class SeckillOrderDTO extends OrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull(message = "活动商品规格Id不能为空") + @Schema(description = "拼团商品规格Id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long seckillSkuId; + + @NotNull + @Schema(description = "秒杀id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long seckillId; + + public Long getSeckillSkuId() { + return seckillSkuId; + } + + public void setSeckillSkuId(Long seckillSkuId) { + this.seckillSkuId = seckillSkuId; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + @Override + public String toString() { + return "SeckillOrderDTO{" + + "seckillSkuId=" + seckillSkuId + + ", seckillId=" + seckillId + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/feign/SeckillFeignController.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/feign/SeckillFeignController.java new file mode 100644 index 0000000..fddd37f --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/feign/SeckillFeignController.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.feign; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson2.JSONObject; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.api.seckill.vo.SeckillApiVO; +import com.tmerclub.cloud.common.cache.config.MultiRedisConfig; +import com.tmerclub.cloud.common.cache.enums.MultiStockEnum; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.SeckillOrderCacheConstant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.OrderCountVO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.product.vo.SekillActivitySpuVO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.seckill.service.SeckillService; +import com.tmerclub.cloud.seckill.vo.SeckillVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/12/8 + */ +@DubboService +public class SeckillFeignController implements SeckillFeignClient { + + @Autowired + private SeckillService seckillService; + + + @DubboReference + private SpuFeignClient spuFeignClient; + @Autowired + private MultiRedisConfig multiRedisConfig; + + + @Override + public ServerResponseEntity> seckillSpuListBySpuIds(Integer selectedLot, List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return ServerResponseEntity.success(new ArrayList<>(0)); + } + List groupActivitySpuList = seckillService.listBySelectLotAndSpuIds(selectedLot, spuIds); + // 获取sku原价 + List skuIds = groupActivitySpuList.stream().map(SekillActivitySpuVO::getSkuId).collect(Collectors.toList()); + ServerResponseEntity> skuResponse = spuFeignClient.listSkuPriceByIds(skuIds); + if (!skuResponse.isSuccess()) { + throw new LuckException(skuResponse.getMsg()); + } + if (CollUtil.isNotEmpty(skuResponse.getData())) { + Map skuMap = skuResponse.getData().stream().collect(Collectors.toMap(SkuVO::getSkuId, SkuVO::getPriceFee)); + for (SekillActivitySpuVO sekillActivitySpuVO : groupActivitySpuList) { + sekillActivitySpuVO.setPriceFee(skuMap.get(sekillActivitySpuVO.getSkuId())); + } + } + return ServerResponseEntity.success(groupActivitySpuList); + } + + @Override + public ServerResponseEntity getSeckillInfoById(Long activityId) { + SeckillVO seckillVO = seckillService.getBySeckillId(activityId); + + return ServerResponseEntity.success(BeanUtil.map(seckillVO, SeckillApiVO.class)); + } + + @Override + public ServerResponseEntity offlineSeckillBySpuIds(List spuIds, Boolean updateSpu) { + seckillService.offlineSeckillBySpuIds(spuIds); + if(updateSpu) { + // 将spu改为正常状态 + spuFeignClient.changeToNormalSpu(spuIds); + } + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity offlineSeckillByShopId(Long shopId) { + seckillService.offlineSeckillByShopId(shopId); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity getSeckillOrderByRedis(Long orderId, Long userId) { + // 查询一下redis有没有数据,因为秒杀订单还存在redis + ShopCartOrderMergerVO mergerOrder = null; + String key = MultiStockEnum.SECKILL.value() + "order:" + userId; + String orderKey = "info:" + orderId; + // 获取是哪台redis + int redisIndex = multiRedisConfig.getIndex(userId); + StringRedisTemplate stringRedisTemplate = multiRedisConfig.getRedisByIndex(redisIndex); + Object orderInfo = RedisUtil.hGet(stringRedisTemplate,key, orderKey); + if (Objects.nonNull(orderInfo)) { + mergerOrder = JSONObject.parseObject((String) orderInfo, ShopCartOrderMergerVO.class); + // 获取订单状态 + String statusKey = "status:" + orderId; + Object status = RedisUtil.hGet(stringRedisTemplate, key, statusKey); + Integer orderStatus = Integer.valueOf(status.toString()); + mergerOrder.setStatus(orderStatus); + } + return ServerResponseEntity.success(mergerOrder); + } + + @Override + public ServerResponseEntity> mapSeckillOrderByUserIdAndRedis(Long userId) { + int redisIndex = multiRedisConfig.getIndex(userId); + StringRedisTemplate stringRedisTemplate = multiRedisConfig.getRedisByIndex(redisIndex); + String key = MultiStockEnum.SECKILL.value() + "order:" + userId; + Long size = RedisUtil.hSize(stringRedisTemplate,key); + if(size <= 0) { + return ServerResponseEntity.success(); + } + // 获取redis中用户的所有订单 + return ServerResponseEntity.success(RedisUtil.entries(stringRedisTemplate,key)); + } + + @Override + public void updateRedisSeckillOrderStatus(Long orderId, Long userId, Integer status) { + // 查询一下redis有没有数据,因为秒杀订单还存在redis + String key = MultiStockEnum.SECKILL.value() + "order:" + userId; + String statusKey = "status:" + orderId; + // 获取是哪台redis + int redisIndex = multiRedisConfig.getIndex(userId); + StringRedisTemplate stringRedisTemplate = multiRedisConfig.getRedisByIndex(redisIndex); + RedisUtil.hSet(stringRedisTemplate,key, statusKey,status.toString()); + } + + @Override + public ServerResponseEntity countRedisSeckillOrder(Long userId) { + int redisIndex = multiRedisConfig.getIndex(userId); + StringRedisTemplate stringRedisTemplate = multiRedisConfig.getRedisByIndex(redisIndex); + String key = MultiStockEnum.SECKILL.value() + "order:" + userId; + Long size = RedisUtil.hSize(stringRedisTemplate,key); + if(size <= 0) { + return ServerResponseEntity.success(); + } + OrderCountVO orderCountVO = new OrderCountVO(); + Integer payed = 0; + Integer unPay = 0; + Map orderMap = RedisUtil.entries(stringRedisTemplate, key); + for (Object orderKey : orderMap.keySet()) { + String orderKeyStr = orderKey.toString(); + if(orderKeyStr.startsWith(SeckillOrderCacheConstant.STATUS)) { + Object statusObj = orderMap.get(orderKeyStr); + Integer orderStatus = Integer.valueOf(statusObj.toString()); + if(Objects.equals(orderStatus, OrderStatus.PAYED.value())) { + payed++; + } + if(Objects.equals(orderStatus, OrderStatus.UNPAY.value())) { + unPay++; + } + } + } + orderCountVO.setPayed(payed); + orderCountVO.setUnPay(unPay); + return ServerResponseEntity.success(orderCountVO); + } + + @Override + public ServerResponseEntity deleteRedisOrderByUserIdAndOrderId(Long userId, Long orderId) { + int redisIndex = multiRedisConfig.getIndex(userId); + StringRedisTemplate stringRedisTemplate = multiRedisConfig.getRedisByIndex(redisIndex); + RedisUtil.hDelete(stringRedisTemplate, MultiStockEnum.SECKILL.value() + "order:" + userId, + SeckillOrderCacheConstant.STATUS + orderId.toString(), + SeckillOrderCacheConstant.ORDER_INFO + orderId.toString()); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/listener/OrderNotifySeckillConsumer.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/listener/OrderNotifySeckillConsumer.java new file mode 100644 index 0000000..a6ac7dc --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/listener/OrderNotifySeckillConsumer.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.listener; + +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.seckill.service.SeckillOrderService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_NOTIFY_SERVICE_TOPIC, consumerGroup = RocketMqConstant.ORDER_NOTIFY_SECKILL_GROUP) +public class OrderNotifySeckillConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(OrderNotifySeckillConsumer.class); + + @Autowired + private SeckillOrderService seckillOrderService; + + /** + * 秒杀订单支付成功 + */ + @Override + public void onMessage(PayNotifyBO message) { + if (!Objects.equals(message.getOrderType(), OrderType.SECKILL.value())) { + return; + } + LOG.info("秒杀订单支付成功... 准备删除redis中的订单,message: {}", Json.toJsonString(message)); + seckillOrderService.paySuccessOrderByOrderId(message.getOrderIds().get(0)); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/manager/SeckillCacheManager.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/manager/SeckillCacheManager.java new file mode 100644 index 0000000..aef2ff5 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/manager/SeckillCacheManager.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.manager; + +import cn.hutool.core.util.IdUtil; +import com.tmerclub.cloud.common.cache.util.CacheManagerUtil; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.seckill.service.SeckillSkuService; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Objects; + + +/** + * @author FrozenWatermelon + */ +@Service +public class SeckillCacheManager { + + /** + * 秒杀限流前缀 + */ + private static final String SECKILL_LIMIT_PREFIX = "SECKILL_LIMIT_"; + + /** + * 秒杀路径前缀 + */ + private static final String SECKILL_PATH_PREFIX = "SECKILL_PATH_"; + + private static final String REDISSON_LOCK_PREFIX = "redisson_lock:"; + + private static final String SECKILL_SKU_STOCKS_PREFIX = "SECKILL_SKU_STOCKS_"; + + @Autowired + private SeckillSkuService seckillSkuService; + + @Autowired + private RedissonClient redissonClient; + + @Autowired + private CacheManagerUtil cacheManagerUtil; + + public String createOrderPath(Long userId) { + + String limitKey = SECKILL_LIMIT_PREFIX + userId; + int maxCount = 5; + + // 秒杀次数+1 + long seckillNum = RedisUtil.incr(limitKey, 1); + + // 5秒只能提交5次请求 + if (seckillNum == 1) { + // 5秒后失效 + RedisUtil.expire(limitKey, 5); + } + if (seckillNum >= maxCount) { + // 请求过频繁,请稍后再试 + throw new LuckException("请求过频繁,请稍后再试"); + } + String orderPath = IdUtil.simpleUUID(); + + // 保存秒杀路径,5分钟这个路径就失效 + RedisUtil.set(getPathKey(userId), orderPath, 300); + + return orderPath; + } + + public void checkOrderPath(Long userId, String orderPath) { + String cacheOrderPath = RedisUtil.get(getPathKey(userId)); + + if (!Objects.equals(cacheOrderPath, orderPath)) { + // 订单已过期,请重新选择商品进行秒杀 + throw new LuckException("订单已过期,请重新选择商品进行秒杀"); + } + } + + private String getPathKey(Long userId) { + return SECKILL_PATH_PREFIX + userId; + } + +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/mapper/SeckillMapper.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/mapper/SeckillMapper.java new file mode 100644 index 0000000..d491168 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/mapper/SeckillMapper.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.mapper; + +import cn.hutool.core.date.DateTime; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.SekillActivitySpuVO; +import com.tmerclub.cloud.seckill.dto.SeckillDTO; +import com.tmerclub.cloud.seckill.model.Seckill; +import com.tmerclub.cloud.seckill.vo.SeckillAdminVO; +import com.tmerclub.cloud.seckill.vo.SeckillSpuVO; +import com.tmerclub.cloud.seckill.vo.SeckillVO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 秒杀信息 + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public interface SeckillMapper { + + /** + * 获取秒杀信息列表 + * + * @param seckillDTO + * @return 秒杀信息列表 + */ + List list(@Param("seckill") SeckillDTO seckillDTO); + + /** + * 根据秒杀信息id获取秒杀信息 + * + * @param seckillId 秒杀信息id + * @return 秒杀信息 + */ + SeckillVO getBySeckillId(@Param("seckillId") Long seckillId); + + /** + * 保存秒杀信息 + * + * @param seckill 秒杀信息 + */ + void save(@Param("seckill") SeckillVO seckill); + + /** + * 更新秒杀信息 + * + * @param seckill 秒杀信息 + */ + void update(@Param("seckill") SeckillVO seckill); + + /** + * 根据秒杀信息id删除秒杀信息 + * + * @param seckillId + */ + void deleteById(@Param("seckillId") Long seckillId); + + /** + * 根据秒杀部分条件获取秒杀商品数量 + * + * @param seckillDTO + * @return + */ + Long countBySeckillConditions(@Param("seckill") SeckillDTO seckillDTO); + + /** + * 根据商品id获取秒杀活动信息 + * + * @param spuId + * @return + */ + SeckillVO getBySpuId(@Param("spuId") Long spuId); + + /** + * 更新秒杀活动剩余库存 + * + * @param seckillId + * @param prodCount + * @return 返回结果 + */ + int updateStocksById(@Param("seckillId") Long seckillId, @Param("prodCount") Integer prodCount); + + /** + * 根据商品id获取秒杀商品信息 + * + * @param selectedLot 所选批次 + * @param spuIds 商品ids + * @return 秒杀商品信息 + */ + List listBySelectLotAndSpuIds(@Param("selectedLot") Integer selectedLot, @Param("spuIds") List spuIds); + + /** + * 获取首页的秒杀信息 + * + * @param seckillDTO 筛选信息 + * @return 秒杀信息 + */ + List listBySelectLot(@Param("seckill") SeckillDTO seckillDTO); + + /** + * 根据店铺id获取所有的秒杀时段信息 + * + * @param shopId 店铺id + * @param specDate 筛选时间 + * @param type 筛选是否活动结束状态 0.未开始,1.正在进行中,2.已结束 + * @return 秒杀时段信息 + */ + List listByShopId(@Param("shopId") Long shopId, @Param("specDate") DateTime specDate, @Param("type") Integer type); + + /** + * 删除所有的秒杀活动(逻辑删除) + * + * @param seckillList 需要删除的列表 + */ + void updateListToDelete(@Param("seckillList") List seckillList); + + /** + * 查询根据时段的所有秒杀信息 + * + * @param selectedLots 时段信息 + * @return 秒杀信息 + */ + List listBySelectLotList(@Param("selectedLots") List selectedLots); + + /** + * 通过商品ids获取秒杀信息 + * + * @param productSearchDTO 时段 + * @param startTime 开始时间 + * @return 秒杀信息 + */ + List listByStartTimeAndSelectedLot(@Param("productSearchDTO") ProductSearchDTO productSearchDTO, @Param("startTime") DateTime startTime); + + /** + * 还原秒杀库存 + * + * @param seckillId 秒杀id + * @param count 库存数量 + */ + void returnStocksByOrderId(@Param("seckillId") Long seckillId, @Param("count") Integer count); + + /** + * 获取应该结束但是没有结束的秒杀列表 + * + * @return 应该结束但是没有结束的秒杀列表 + */ + List listUnEndButNeedEndActivity(); + + /** + * 更新秒杀活动状态 + * + * @param seckillList + */ + void changeSeckillActivityStatusBySeckillIdList(@Param("seckillList") List seckillList); + + /** + * 获取正在参与秒杀活动的商家数量 + * + * @return 数量 + */ + Integer getJoinSeckillMerchantNum(); + + /** + * 根据商品ids下线所有的秒杀活动 + * + * @param spuIds 商品ids + */ + void offlineSeckillBySpuIds(@Param("spuIds") List spuIds); + + /** + * listBySearchParam的统计总数 + * + * @param startTime 开始时间 + * @param prodSearch 搜索参数 + * @return + */ + int countListBySearchParam(@Param("startTime") Date startTime, @Param("prodSearch") ProductSearchDTO prodSearch); + + /** + * 根据店铺id,获取秒杀商品id + * + * @param shopId 店铺id + * @return 秒杀商品id列表 + */ + List listSpuIdIdByShopId(@Param("shopId") Long shopId); +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillCategory.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillCategory.java new file mode 100644 index 0000000..41d9c65 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillCategory.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 秒杀分类信息 + * + * @author lhd + * @date 2021-04-19 11:26:35 + */ +public class SeckillCategory extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 秒杀分类id + */ + private Long categoryId; + + /** + * 分类名称 + */ + private String name; + + + /** + * 排序 + */ + private Integer seq; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "SeckillCategory{" + + "categoryId=" + categoryId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",name=" + name + + ",seq=" + seq + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillSku.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillSku.java new file mode 100644 index 0000000..2d20483 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillSku.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 秒杀活动sku + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public class SeckillSku extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 秒杀活动单个skuid + */ + private Long seckillSkuId; + + /** + * skuId + */ + private Long skuId; + + /** + * 秒杀活动id + */ + private Long seckillId; + + /** + * 用于秒杀的库存 + */ + private Integer seckillStocks; + + /** + * 秒杀价格 + */ + private Long seckillPrice; + + @Schema(description = "秒杀的原始库存") + private Integer seckillOriginStocks; + + public Long getSeckillSkuId() { + return seckillSkuId; + } + + public void setSeckillSkuId(Long seckillSkuId) { + this.seckillSkuId = seckillSkuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + public Integer getSeckillStocks() { + return seckillStocks; + } + + public void setSeckillStocks(Integer seckillStocks) { + this.seckillStocks = seckillStocks; + } + + public Long getSeckillPrice() { + return seckillPrice; + } + + public void setSeckillPrice(Long seckillPrice) { + this.seckillPrice = seckillPrice; + } + + public Integer getSeckillOriginStocks() { + return seckillOriginStocks; + } + + public void setSeckillOriginStocks(Integer seckillOriginStocks) { + this.seckillOriginStocks = seckillOriginStocks; + } + + @Override + public String toString() { + return "SeckillSku{" + + "seckillSkuId=" + seckillSkuId + + ", skuId=" + skuId + + ", seckillId=" + seckillId + + ", seckillStocks=" + seckillStocks + + ", seckillPrice=" + seckillPrice + + ", seckillOriginStocks=" + seckillOriginStocks + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillCategoryService.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillCategoryService.java new file mode 100644 index 0000000..cf51273 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillCategoryService.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.service; + +import com.tmerclub.cloud.seckill.model.SeckillCategory; + +import java.util.List; + +/** + * 秒杀分类信息 + * + * @author lhd + * @date 2021-04-19 11:26:35 + */ +public interface SeckillCategoryService { + + /** + * 获取秒杀分类信息列表 + * @return 秒杀分类信息列表数据 + */ + List list(); + + /** + * 根据秒杀分类信息id获取秒杀分类信息 + * + * @param categoryId 秒杀分类信息id + * @return 秒杀分类信息 + */ + SeckillCategory getByCategoryId(Long categoryId); + + /** + * 保存秒杀分类信息 + * @param seckillCategory 秒杀分类信息 + */ + void save(SeckillCategory seckillCategory); + + /** + * 更新秒杀分类信息 + * @param seckillCategory 秒杀分类信息 + */ + void update(SeckillCategory seckillCategory); + + /** + * 根据秒杀分类信息id删除秒杀分类信息 + * @param categoryId 秒杀分类信息id + */ + void deleteById(Long categoryId); + + /** + * 根据名称获取分类总数 + * @return 分类总数 + * @param name + * @param categoryId + */ + Integer countByName(String name, Long categoryId); + + /** + * 批量更新秒杀分类排序 + * @param seckillCategoryList 秒杀分类排序 + */ + void updateBatch(List seckillCategoryList); +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillOrderService.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillOrderService.java new file mode 100644 index 0000000..1599f0d --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillOrderService.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.service; + +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.seckill.vo.SeckillVO; + +/** + * 秒杀订单 + * + * @author lhd + * @date 2021-03-30 14:59:28 + */ +public interface SeckillOrderService { + + /** + * 计算订单中的商品数量 + * @param seckill + * @param userId + * @param count + * @return 是否超过限制数量 + */ + boolean checkOrderSpuNum(SeckillVO seckill, Long userId, Integer count); + + /** + * 提交订单 + * + * @param mergerOrder + * @param seckillId + * @param maxNum + */ + void submit(ShopCartOrderMergerVO mergerOrder, Long seckillId, Integer maxNum); + + /** + * 秒杀订单支付成功 + * + * @param orderId 订单id + */ + void paySuccessOrderByOrderId(Long orderId); +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillService.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillService.java new file mode 100644 index 0000000..61a025b --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillService.java @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.service; + +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.platform.vo.SysConfigApiVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.SekillActivitySpuVO; +import com.tmerclub.cloud.seckill.constant.SeckillStatusEnum; +import com.tmerclub.cloud.seckill.dto.SeckillDTO; +import com.tmerclub.cloud.seckill.dto.SeckillSkuDTO; +import com.tmerclub.cloud.seckill.model.Seckill; +import com.tmerclub.cloud.seckill.vo.AppSeckillVO; +import com.tmerclub.cloud.seckill.vo.SeckillAdminVO; +import com.tmerclub.cloud.seckill.vo.SeckillSpuVO; +import com.tmerclub.cloud.seckill.vo.SeckillVO; + +import java.util.List; + +/** + * 秒杀信息 + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public interface SeckillService { + + /** + * 分页获取秒杀信息列表 + * + * @param pageDTO 分页参数 + * @param seckillDTO + * @return 秒杀信息列表分页数据 + */ + PageVO page(PageDTO pageDTO, SeckillDTO seckillDTO); + + /** + * 根据秒杀信息id获取秒杀信息 + * + * @param seckillId 秒杀信息id + * @return 秒杀信息 + */ + SeckillVO getBySeckillId(Long seckillId); + + /** + * 保存秒杀信息 + * + * @param seckill 秒杀信息 + * @param seckillSkuList + */ + void saveSeckillAndItems(SeckillVO seckill, List seckillSkuList); + + /** + * 根据秒杀信息id删除秒杀信息 + * + * @param seckillId + */ + void deleteById(Long seckillId); + + /** + * 清除秒杀信息缓存 + * + * @param seckillId 秒杀id + */ + void removeSeckillCacheById(Long seckillId); + + /** + * 更改活动的状态 + * + * @param groupActivityId + * @param status + */ + void updateStatus(Long groupActivityId, SeckillStatusEnum status); + + /** + * 失效活动 + * + * @param seckillId 秒杀id + * @param spuId 商品id + */ + void invalidById(Long seckillId, Long spuId); + + /** + * 修改秒杀信息 + * + * @param seckill 秒杀信息 + */ + void updateById(SeckillVO seckill); + + /** + * 获取下线的事件记录 + * + * @param seckillActivityId + * @return + */ + OfflineHandleEventVO getOfflineHandleEvent(Long seckillActivityId); + + /** + * 平台审核商家提交的申请 + * + * @param offlineHandleEventDto + */ + void audit(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 违规活动提交审核 + * + * @param offlineHandleEventDto + */ + void auditApply(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 返回时间段获取秒杀信息分页列表 + * + * @param seckillDTO 秒杀信息 + * @return 秒杀信息分页列表 + */ + AppSeckillVO pageBySelectLot(SeckillDTO seckillDTO); + + /** + * 根据商品id获取秒杀活动信息 + * + * @param spuId + * @return + */ + SeckillVO getBySpuId(Long spuId); + + /** + * 平台下架活动 + * + * @param offlineHandleEventDto + * @param spuId + */ + void offline(OfflineHandleEventDTO offlineHandleEventDto, Long spuId); + + /** + * 根据商品id获取秒杀商品信息 + * + * @param selectedLot 所选批次 + * @param spuIds 商品ids + * @return 秒杀商品信息 + */ + List listBySelectLotAndSpuIds(Integer selectedLot, List spuIds); + + /** + * 根据店铺id获取所有的秒杀时段信息 + * + * @param pageDTO + * @param shopId + * @param type + * @param specTime + * @return 秒杀时段信息 + */ + PageVO listByShopId(PageDTO pageDTO, Long shopId, Integer type, Long specTime); + + /** + * 保存秒杀时段信息 + * + * @param config 秒杀时段信息 + */ + void saveSeckillTime(SysConfigApiVO config); + + /** + * 根据时间返回秒杀商品信息列表 + * + * @param pageDTO + * @param startTime 活动时间 + * @param productSearch 商品搜索信息 + * @return + */ + PageVO listSeckillSpuByTime(PageDTO pageDTO, Long startTime, ProductSearchDTO productSearch); + + /** + * 获取应该结束但是没有结束的秒杀列表 + * + * @return 应该结束但是没有结束的秒杀列表 + */ + List listUnEndButNeedEndActivity(); + + /** + * 改变商品类型,结束正在进行的秒杀信息 + * + * @param seckillList 秒杀活动列表 + */ + void changeProdTypeBySeckillIdList(List seckillList); + + /** + * 显示已经结束的秒杀信息列表,specTime时间搜索 + * + * @param pageDTO + * @param shopId + * @param specTime + * @return + */ + PageVO listEndSeckillByShopId(PageDTO pageDTO, Long shopId, Long specTime); + + /** + * 获取正在参与秒杀活动的商家数量 + * + * @return 数量 + */ + Integer getJoinSeckillMerchantNum(); + + /** + * 根据商品ids下线所有的秒杀活动 + * + * @param spuIds 商品ids + */ + void offlineSeckillBySpuIds(List spuIds); + + /** + * 根据店铺id下线所有的秒杀活动 + * + * @param shopId 店铺id + */ + void offlineSeckillByShopId(Long shopId); +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillSkuService.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillSkuService.java new file mode 100644 index 0000000..828a974 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillSkuService.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.service; + +import com.tmerclub.cloud.seckill.dto.SeckillSkuDTO; +import com.tmerclub.cloud.seckill.vo.SeckillSkuVO; +import com.tmerclub.cloud.seckill.vo.SeckillVO; + +import java.util.List; +import java.util.Map; + +/** + * 秒杀活动sku + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public interface SeckillSkuService { + + /** + * 根据秒杀活动skuid获取秒杀活动sku + * + * @param seckillSkuId 秒杀活动skuid + * @return 秒杀活动sku + */ + SeckillSkuVO getBySeckillSkuId(Long seckillSkuId); + + /** + * 根据秒杀活动id获取秒杀商品规格信息 + * @param seckillId 秒杀活动id + * @return 秒杀商品规格信息 + */ + List listSeckillSkuBySeckillId(Long seckillId); + + /** + * 批量保存秒杀活动sku + * @param seckillSkuList 秒杀活动sku + */ + void saveBatch(List seckillSkuList); + + /** + * 清除秒杀sku信息 + * @param seckillId 秒杀id + */ + void removeSeckillSkuCacheBySeckillId(Long seckillId); + + /** + * 缓存分片信息 + * @param seckillSkuId + * @param totalStock + * @return availableZone + */ + Integer doZone(Long seckillSkuId, Integer totalStock); + + /** + * 根据秒杀skuId从redis获取库存 + * @param activityId + * @param skuId + * @return + */ + Integer getStockBySeckillSkuId(Long activityId,Long skuId); + + /** + * 根据秒杀skuId从redis获取库存 + * @param activityId + * @param skuId + * @param stockPointIds + * @return + */ + Map getPointStockBySeckillSkuId(Long activityId, Long skuId, List stockPointIds); + + /** + * 根据秒杀Id从redis获取库存 + * @param seckillId + * @return + */ + Integer getStockBySeckillId(Long seckillId); + + /** + * 获取可能需要落库的秒杀活动 + * @return 秒杀信息 + */ + List listMaybeNeedStockPlacementActivity(); + + /** + * 库存落库将缓存中的库存写入到数据库中 + * @param seckillSkuId + * @param seckillId + */ + void flushStockToDb(Long seckillSkuId, Long seckillId); + + /** + * 获取刚刚结束的秒杀活动 + * @return + */ + List listOverJustNow(); + + /** + * 回退秒杀库存 + * + * @param activityId + * @param skuId + * @param count + * @param orderId + * @param userId + * @param stockPointId + */ + void rollbackSecKillStock(Long activityId, + Long skuId, + Integer count, Long orderId, Long userId, Long stockPointId); + + /** + * 从redis补充库存 + * @param seckill + * @return + */ + void handSeckillPointSku(SeckillVO seckill); + + /** + * 初始化秒杀区域库存 + */ + void initPointSeckillStock(); + +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillOrderServiceImpl.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillOrderServiceImpl.java new file mode 100644 index 0000000..5c8184d --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillOrderServiceImpl.java @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.service.impl; + +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.cache.bo.MultiDecrementBO; +import com.tmerclub.cloud.common.cache.enums.MultiStockEnum; +import com.tmerclub.cloud.common.cache.manager.MultiRedisStockManager; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.RedisSeckillOrderBO; +import com.tmerclub.cloud.common.order.vo.OrderActivityVO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderVO; +import com.tmerclub.cloud.common.product.vo.GiveawaySpuVO; +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.seckill.service.SeckillOrderService; +import com.tmerclub.cloud.seckill.vo.SeckillVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 秒杀订单 + * + * @author lhd + * @date 2021-03-30 14:59:28 + */ +@Service +public class SeckillOrderServiceImpl implements SeckillOrderService { + private static final Logger logger = LoggerFactory.getLogger(SeckillOrderServiceImpl.class); + + @Autowired + private MultiRedisStockManager multiRedisStockManager; + @Autowired + private RocketMQTemplate seckillOrderCreateTemplate; + @Autowired + private RocketMQTemplate outStockLogTemplate; + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + + @Override + public boolean checkOrderSpuNum(SeckillVO seckill, Long userId, Integer count) { + // 判断之前秒杀的商品有没有超过限制,-1表示商品不限制秒杀数量 + if (!Objects.equals(seckill.getMaxNum(), -1)) { + // 获取当前库存所使用的redis + Integer buyNum = multiRedisStockManager.getSeckillProdBuyCount(new MultiDecrementBO(MultiStockEnum.SECKILL, + userId,null,seckill.getSeckillId(), null,null,null,null, null)); + // 本次秒杀商品限购 + return seckill.getMaxNum() >= count + buyNum; + } + return true; + } + + /** + * 锁定库存 + * 纯redis的操作,不需要事务 + * 具体步骤: + * 1.发送库存解锁mq + * 2.扣除库存,同时添加锁定记录 + * 4.添加出库记录 + * 正确流程,发送mq(秒杀库存解锁+订单超时+出库记录)后,扣除扣除库存及在redis生成订单 + * 存在问题及处理方案(解锁库存时处理): + * 1.发送mq(删除出库记录+订单超时+出库记录)任意失败 - 无需处理 + * 2.发送mq(删除出库记录+订单超时+出库记录)后,扣除库存及在redis生成订单失败 - 删除出库记录 + * 3.发送mq(删除出库记录+订单超时+出库记录)后,成功扣除扣除库存及在redis生成订单 - 不用处理 + * + */ + @Override + public void submit(ShopCartOrderMergerVO mergerOrder, Long seckillId, Integer maxNum) { + ShopCartOrderVO shopCartOrderVO = mergerOrder.getShopCartOrders().get(0); + ShopCartItemVO shopCartItemVO = shopCartOrderVO.getShopCartItemDiscounts().get(0).getShopCartItems().get(0); + + List stockBillLogItems = getStockBillLogItems(shopCartOrderVO, shopCartItemVO); + + RedisSeckillOrderBO redisSeckillOrderBO = new RedisSeckillOrderBO(); + redisSeckillOrderBO.setUserId(mergerOrder.getUserId()); + redisSeckillOrderBO.setOrderId(shopCartOrderVO.getOrderId()); + // 2.发送延时消息,订单超时mq + SendStatus sendOrderStatus = seckillOrderCreateTemplate.syncSend(RocketMqConstant.SECKILL_ORDER_TIME_OUT_CANCEL_TOPIC, new GenericMessage<>(redisSeckillOrderBO), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus(); + if (!Objects.equals(sendOrderStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION); + } + + // 3.添加出库记录,为了防止出库明细添加失败,导致订单创建,但是如果在用户提交订单时失败了会产生脏数据,所以先发送订单出库记录,在执行订单创建 + // 生成出库明细 + SendStatus sendStockStatus = outStockLogTemplate.syncSend(RocketMqConstant.OUT_STOCK_LOG_TOPIC, new GenericMessage<>(stockBillLogItems)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION); + } + logger.info("tryLockStock stockBillLogItems:{}", stockBillLogItems); + + // 4.更新秒杀sku库存,在redis中创建订单 + MultiDecrementBO multiDecrementBO = new MultiDecrementBO(MultiStockEnum.SECKILL, mergerOrder.getUserId(), shopCartOrderVO.getOrderId(), seckillId, shopCartItemVO.getSkuId(), shopCartItemVO.getCount(), maxNum, Json.toJsonString(mergerOrder), null); + multiDecrementBO.setStockPointId(shopCartItemVO.getStockPointId()); + multiRedisStockManager.decrStocks(multiDecrementBO); +// // dev 4.更新秒杀sku库存,在redis中创建订单 +// multiRedisStockManager.decrStocks(new MultiDecrementBO(MultiStockEnum.SECKILL, mergerOrder.getUserId(), shopCartOrderVO.getOrderId(), seckillId, shopCartItemVO.getSkuId(), shopCartItemVO.getCount(), maxNum, Json.toJsonString(mergerOrder))); + + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void paySuccessOrderByOrderId(Long orderId) { + ServerResponseEntity activityOrderPayInfo = orderFeignClient.getActivityOrderInfo(orderId); + if (!activityOrderPayInfo.isSuccess()) { + throw new LuckException(activityOrderPayInfo.getMsg()); + } + OrderActivityVO order = activityOrderPayInfo.getData(); + if (Objects.isNull(order)) { + return; + } + if (Objects.equals(order.getIsPayed(), 0)) { + return; + } + // 订单支付成功后,删除redis中的订单和订单锁定信息 + multiRedisStockManager.handlePaySuccessSecKillStock(order.getCount(),orderId,order.getUserId()); +// // 秒杀订单支付成功后,增加销量 +// spuFeignClient.updateSaleNumBySeckillOrder(order.getSpuId(), order.getCount()); + } + + private static List getStockBillLogItems(ShopCartOrderVO shopCartOrderVO, ShopCartItemVO shopCartItemVO) { + Map stockBillLogItemMap = new HashMap<>(Constant.INITIAL_CAPACITY); + StockBillLogItemDTO stockBillLogItem = stockBillLogItemMap.get(shopCartItemVO.getSkuId()); + if (Objects.isNull(stockBillLogItem)) { + stockBillLogItem = new StockBillLogItemDTO( + shopCartItemVO.getSpuId(), + shopCartItemVO.getSkuId(), + shopCartItemVO.getShopId(), + shopCartOrderVO.getOrderId(), + shopCartItemVO.getSpuName(), + shopCartItemVO.getSkuName(), + 0, + shopCartItemVO.getSkuPriceFee(), + shopCartItemVO.getPartyCode(), + shopCartItemVO.getImgUrl() + ); + stockBillLogItemMap.put(stockBillLogItem.getSkuId(), stockBillLogItem); + } + stockBillLogItem.setStockCount(stockBillLogItem.getStockCount() + shopCartItemVO.getCount()); + + // 如果是供应商商品且发货方式为供应商发货,则将spuId和skuId替换成供应商商品的 + // 只替换id,商品名称图片等信息则保留商家的商品信息,库存记录是商家的库存记录 + if (!Objects.equals(shopCartItemVO.getSupplierId(), 0L) && Objects.equals(shopCartItemVO.getSupplierDeliveryType(), 1)) { + stockBillLogItem.setSpuId(shopCartItemVO.getSupplierSpuId()); + stockBillLogItem.setSkuId(shopCartItemVO.getSupplierSkuId()); + } + + //处理赠品订单项 + GiveawayVO giveaway = shopCartItemVO.getGiveaway(); + if(Objects.isNull(giveaway)){ + return new ArrayList<>(stockBillLogItemMap.values()); + } + // 赠品库存计算 + for (GiveawaySpuVO giveawaySpuVO : giveaway.getGiveawaySpus()) { + StockBillLogItemDTO giveawayStockBillLogItem = stockBillLogItemMap.get(giveawaySpuVO.getSkuId()); + if (Objects.isNull(giveawayStockBillLogItem)) { + giveawayStockBillLogItem = new StockBillLogItemDTO( + giveawaySpuVO.getSpuId(), + giveawaySpuVO.getSkuId(), + giveawaySpuVO.getShopId(), + shopCartOrderVO.getOrderId(), + giveawaySpuVO.getSpuName(), + giveawaySpuVO.getSkuName(), + 0, + giveawaySpuVO.getPriceFee(), + giveawaySpuVO.getPartyCode(), + giveawaySpuVO.getMainImgUrl() + ); + stockBillLogItemMap.put(giveawaySpuVO.getSkuId(), giveawayStockBillLogItem); + } + giveawayStockBillLogItem.setStockCount(giveawayStockBillLogItem.getStockCount() + giveawaySpuVO.getGiveawayNum()); + } + // 库存日志列表 + return new ArrayList<>(stockBillLogItemMap.values()); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillServiceImpl.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillServiceImpl.java new file mode 100644 index 0000000..e703c5b --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillServiceImpl.java @@ -0,0 +1,676 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.platform.vo.SysConfigApiVO; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.cache.constant.SeckillCacheNames; +import com.tmerclub.cloud.common.constant.ConfigNameConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.SekillActivitySpuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.seckill.constant.SeckillStatusEnum; +import com.tmerclub.cloud.seckill.dto.SeckillDTO; +import com.tmerclub.cloud.seckill.dto.SeckillSkuDTO; +import com.tmerclub.cloud.seckill.mapper.SeckillMapper; +import com.tmerclub.cloud.seckill.model.Seckill; +import com.tmerclub.cloud.seckill.service.SeckillService; +import com.tmerclub.cloud.seckill.service.SeckillSkuService; +import com.tmerclub.cloud.seckill.vo.*; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 秒杀信息 + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +@Service +public class SeckillServiceImpl implements SeckillService { + + @Autowired + private SeckillMapper seckillMapper; + + + @DubboReference + private OfflineHandleEventFeignClient offlineHandleEventFeignClient; + + @Autowired + private SeckillSkuService seckillSkuService; + + @DubboReference + private SpuFeignClient spuFeignClient; + + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + + @DubboReference + private ConfigFeignClient configFeignClient; + @Autowired + private RocketMQTemplate sendActivityOfflineNotifyToShopTemplate; + @Autowired + private RocketMQTemplate sendActivityAuditNotifyToShopTemplate; + + @Override + public PageVO page(PageDTO pageDTO, SeckillDTO seckillDTO) { + return PageUtil.doPage(pageDTO, () -> seckillMapper.list(seckillDTO)); + } + + @Override + @Cacheable(cacheNames = SeckillCacheNames.SECKILL_BY_SECKILL_ID, key = "#seckillId") + public SeckillVO getBySeckillId(Long seckillId) { + return seckillMapper.getBySeckillId(seckillId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void saveSeckillAndItems(SeckillVO seckill, List seckillSkuList) { + seckill.setStatus(StatusEnum.ENABLE.value()); + seckill.setIsDelete(StatusEnum.DISABLE.value()); + seckill.setReplenish(seckill.getReplenish() == null ? 0 : seckill.getReplenish()); + // 保存秒杀信息 + seckillMapper.save(seckill); + seckillSkuList.forEach(seckillSku -> seckillSku.setSeckillId(seckill.getSeckillId())); + // 首先对于秒杀我们要确定几点 + // 1. 秒杀是独立库存 + // 2. 秒杀并发量需求很高 + + // 秒杀的库存放在redis当中,还有一个问题我们的库存是有进行分片的,redis在执行命令的时候是单线程的,所以分片就没有意义了,那怎么提高性能呢? + // 一个redis是单线程,几个redis却不是,所以要根据redis的机器数量来进行分片 + // 我们根据专门的redis服务进行分片。 + // @see com.tmerclub.cloud.common.cache.bo.MultiRedisBO + // @see com.tmerclub.cloud.common.cache.bo.MultiRedisConfig + + // 保存秒杀活动的时候,就开始分片了,因为秒杀活动就认为他是绝对热门的活动。 + // 保存秒杀sku信息 + seckillSkuService.saveBatch(seckillSkuList); + changeSpuType(seckill.getSeckillId(), seckill.getSpuId(), SpuType.SECKILL, null); + } + + /** + * 更改商品类型 + * + * @param seckillId 秒杀id + * @param spuId 商品id + * @param spuType 商品类型 + * @param status 商品状态 + */ + private void changeSpuType(Long seckillId, Long spuId, SpuType spuType, StatusEnum status) { + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setSpuId(spuId); + spuDTO.setActivityId(seckillId); + if (Objects.nonNull(spuType)) { + spuDTO.setSpuType(spuType.value()); + } + if (Objects.nonNull(status)) { + spuDTO.setStatus(status.value()); + } + ServerResponseEntity spuResponse = spuFeignClient.changeSpuType(spuDTO); + if (!Objects.equals(spuResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(spuResponse.getMsg()); + } + } + + @Override + public void deleteById(Long seckillId) { + seckillMapper.deleteById(seckillId); + } + + @Override + @CacheEvict(cacheNames = SeckillCacheNames.SECKILL_BY_SECKILL_ID, key = "#seckillId") + public void removeSeckillCacheById(Long seckillId) { + + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void invalidById(Long seckillId, Long spuId) { + SeckillVO seckillVO = new SeckillVO(); + // 失效 + seckillVO.setStatus(SeckillStatusEnum.DISABLE.value()); + seckillVO.setSeckillId(seckillId); + seckillMapper.update(seckillVO); + changeSpuType(0L, spuId, SpuType.NORMAL, null); + } + + @Override + public void updateById(SeckillVO seckill) { + seckillMapper.update(seckill); + } + + @Override + public void updateStatus(Long seckillId, SeckillStatusEnum status) { + SeckillVO seckillVO = new SeckillVO(); + seckillVO.setStatus(status.value()); + seckillVO.setSeckillId(seckillId); + seckillMapper.update(seckillVO); + } + + @Override + public OfflineHandleEventVO getOfflineHandleEvent(Long seckillId) { + ServerResponseEntity offlineHandleEventResponse = + offlineHandleEventFeignClient.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.SECKILL.getValue(), seckillId, null); + return offlineHandleEventResponse.getData(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void audit(OfflineHandleEventDTO offlineHandleEventDto) { + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.auditOfflineEvent(offlineHandleEventDto); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 审核通过 + if (Objects.equals(offlineHandleEventDto.getStatus(), OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue())) { + SeckillVO seckillVO = getBySeckillId(offlineHandleEventDto.getHandleId()); + updateStatus(seckillVO.getSeckillId(), SeckillStatusEnum.ENABLE); + changeSpuType(seckillVO.getSeckillId(), seckillVO.getSpuId(), null, StatusEnum.ENABLE); + } + // 审核不通过 + else if (Objects.equals(offlineHandleEventDto.getStatus(), OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue())) { + updateStatus(offlineHandleEventDto.getHandleId(), SeckillStatusEnum.OFFLINE); + } + //发送活动审核结果消息给店铺 + SeckillVO seckillVO = getBySeckillId(offlineHandleEventDto.getHandleId()); + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setSendType(SendTypeEnum.ACTIVITY_AUDIT.getValue()); + sendNotifyBO.setShopId(seckillVO.getShopId()); + sendNotifyBO.setActivityName(seckillVO.getSeckillName()); + sendNotifyBO.setActivityId(seckillVO.getSeckillId()); + SendStatus sendStockStatus = sendActivityAuditNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_ACTIVITY_AUDIT_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(sendNotifyBO)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void auditApply(OfflineHandleEventDTO offlineHandleEventDto) { + // 更新事件状态 + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.updateToApply(offlineHandleEventDto); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 更新秒杀活动为待审核状态 + updateStatus(offlineHandleEventDto.getHandleId(), SeckillStatusEnum.WAIT_AUDIT); + } + + @Override + public AppSeckillVO pageBySelectLot(SeckillDTO seckillDTO) { + AppSeckillVO appSeckillVO = new AppSeckillVO(); + List seckillList = seckillMapper.listBySelectLot(seckillDTO); + if (CollectionUtil.isEmpty(seckillList)) { + return appSeckillVO; + } + List seckillSpuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + + List idList = seckillList.stream().map(SeckillVO::getSpuId).collect(Collectors.toList()); + List spuSearchVOList = searchSpuFeignClient.listSpuBySpuIds(idList).getData(); + // 转成map方便操作 + Map spuMap = spuSearchVOList.stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, spuSearchVO -> spuSearchVO)); + for (SeckillVO seckillVO : seckillList) { + if (!spuMap.containsKey(seckillVO.getSpuId())) { + continue; + } + SpuSearchVO spuSearchVO = spuMap.get(seckillVO.getSpuId()); + // 如果为空则把最近的开始时间返回给前端 + if (Objects.isNull(appSeckillVO.getNextTime())) { + long startTime = seckillVO.getStartTime().getTime(); + long now = System.currentTimeMillis(); + // 如果小于当前时间则表示已经开始了,就表示已经开始了 + if (startTime > System.currentTimeMillis()) { + appSeckillVO.setNextTime((startTime - now) / 1000); + } else { + appSeckillVO.setNextTime((seckillVO.getEndTime().getTime() - now) / 1000); + } + appSeckillVO.setSelectedLot(seckillVO.getSelectedLot()); + } + SeckillSpuVO seckillSpuVO = new SeckillSpuVO(); + seckillSpuVO.setSeckillId(seckillVO.getSeckillId()); + seckillSpuVO.setMainImgUrl(spuSearchVO.getMainImgUrl()); + seckillSpuVO.setName(spuSearchVO.getSpuName()); + seckillSpuVO.setPriceFee(spuSearchVO.getPriceFee()); + seckillSpuVO.setReducePrice(spuSearchVO.getPriceFee() - seckillVO.getSeckillPrice()); + // 目前不需要库存展示 +// seckillSpuVO.setSeckillOriginStocks(seckillVO.getSeckillOriginStocks()); +// seckillSpuVO.setSeckillTotalStocks(seckillVO.getSeckillTotalStocks()); + seckillSpuVO.setSpuId(seckillVO.getSpuId()); + seckillSpuVO.setSeckillPrice(seckillVO.getSeckillPrice()); + seckillSpuList.add(seckillSpuVO); + } + appSeckillVO.setSeckillSpuList(seckillSpuList); + return appSeckillVO; + } + + @Override + @Cacheable(cacheNames = SeckillCacheNames.SECKILL_BY_SPU_ID, key = "#spuId", sync = true) + public SeckillVO getBySpuId(Long spuId) { + return seckillMapper.getBySpuId(spuId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void offline(OfflineHandleEventDTO offlineHandleEventDto, Long spuId) { + OfflineHandleEventDTO offlineHandleEvent = new OfflineHandleEventDTO(); + offlineHandleEvent.setOfflineReason(offlineHandleEventDto.getOfflineReason()); + offlineHandleEvent.setHandleType(OfflineHandleEventType.SECKILL.getValue()); + offlineHandleEvent.setHandleId(offlineHandleEventDto.getHandleId()); + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.save(offlineHandleEvent); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 更新活动状态为违规下架状态 + updateStatus(offlineHandleEventDto.getHandleId(), SeckillStatusEnum.OFFLINE); + changeSpuType(offlineHandleEventDto.getHandleId(), spuId, SpuType.SECKILL, null); + + //发送活动下线消息给店铺 + SeckillVO seckillVO = getBySeckillId(offlineHandleEventDto.getHandleId()); + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setSendType(SendTypeEnum.ACTIVITY_OFFLINE.getValue()); + sendNotifyBO.setShopId(seckillVO.getShopId()); + sendNotifyBO.setActivityName(seckillVO.getSeckillName()); + sendNotifyBO.setActivityId(seckillVO.getSeckillId()); + SendStatus sendStockStatus = sendActivityOfflineNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_ACTIVITY_OFFLINE_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(sendNotifyBO)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public List listBySelectLotAndSpuIds(Integer selectedLot, List spuIds) { + List sekillActivitySpuVOS = seckillMapper.listBySelectLotAndSpuIds(selectedLot, spuIds); + if (CollectionUtils.isEmpty(sekillActivitySpuVOS)) { + return new ArrayList<>(); + } + // 获取秒杀商品真实库存(从redis中取) + for (SekillActivitySpuVO spuVO : sekillActivitySpuVOS) { + spuVO.setSeckillTotalStocks(seckillSkuService.getStockBySeckillId(spuVO.getSeckillId())); + } + return sekillActivitySpuVOS; + } + + @Override + public PageVO listByShopId(PageDTO pageDTO, Long shopId, Integer type, Long specTime) { + String config = configFeignClient.getConfig(ConfigNameConstant.SECKILL_TIME_CONFIG).getData(); + if (Objects.isNull(config)) { + throw new LuckException("请先完善秒杀时段配置"); + } + SeckillConfigVO seckillConfigVO = Json.parseObject(config, SeckillConfigVO.class); + List seckillTimeList = seckillConfigVO.getSeckillTimeList(); + if (CollectionUtil.isEmpty(seckillTimeList)) { + PageVO pageVO = new PageVO<>(); + pageVO.setPages(0); + pageVO.setTotal(0L); + return pageVO; + } + // 获取未开场时间,如果当前的秒杀场次已经结束,则为第二天的开始场次 + List seckillList = new ArrayList<>(Constant.INITIAL_CAPACITY); + + DateTime specDate = null; + if (specTime != null && !specTime.equals(0L)) { + specDate = new DateTime(specTime); + } + + List adminListDb = seckillMapper.listByShopId(shopId, specDate, type); + // 如果没有秒杀活动则统一设置为0 + Map seckillDbMap = adminListDb.stream().collect(Collectors.toMap(SeckillAdminVO::getDateTime, seckillAdminVO -> seckillAdminVO)); + // 0未开始,1已经开始 + if (type == 0) { + seckillList = getUnStartSeckillList(seckillConfigVO, seckillDbMap, specTime); + } else if (type == 1) { + seckillList = getStartSeckillList(seckillConfigVO, seckillDbMap); + } + PageVO pageVO = new PageVO<>(); + int startNum = (pageDTO.getPageNum() - 1) * pageDTO.getPageSize(); + int endNum = pageDTO.getPageNum() * pageDTO.getPageSize(); + List seckillAdminList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 进行分页 + for (int i = startNum; i < endNum; i++) { + if (i + 1 > seckillList.size()) { + break; + } + SeckillAdminVO seckillAdminVO = seckillList.get(i); + seckillAdminList.add(seckillAdminVO); + } + pageVO.setList(seckillAdminList); + pageVO.setTotal((long) seckillList.size()); + pageVO.setPages(PageUtil.getPages(pageVO.getTotal(), pageDTO.getPageSize())); + return pageVO; + } + + /** + * 获取已经开始的秒杀信息 + * + * @param seckillConfigVO + * @param seckillDbMap + * @return + */ + private List getStartSeckillList(SeckillConfigVO seckillConfigVO, Map seckillDbMap) { + List seckillAdminList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Date date = new Date(); + // 秒杀活动只持续2个小时所以找当前这个小时,及前一个开始的即可 + int hour = DateUtil.hour(date, true); + + // 当前天的起始时间 + DateTime beginTime = DateUtil.beginOfDay(new Date()); + for (Integer time : seckillConfigVO.getSeckillTimeList()) { + // 判断一下时间 + if (hour != time && hour != time + 1) { + continue; + } + // 处理时间 + DateTime dateTime = DateUtil.offsetHour(beginTime, time); + DateTime endTime = DateUtil.offsetHour(beginTime, time + 2); + SeckillAdminVO seckillAdminVO = new SeckillAdminVO(); + seckillAdminVO.setJoinShopNum(0); + seckillAdminVO.setProdNum(0); + if (CollectionUtil.isNotEmpty(seckillDbMap) && seckillDbMap.containsKey(dateTime)) { + SeckillAdminVO seckillDb = seckillDbMap.get(dateTime); + seckillAdminVO = BeanUtil.map(seckillDb, SeckillAdminVO.class); + } + seckillAdminVO.setSelectedLot(time); + seckillAdminVO.setStartTime(dateTime); + seckillAdminVO.setEndTime(endTime); + seckillAdminVO.setCanJoin(0); + seckillAdminList.add(seckillAdminVO); + } + return seckillAdminList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void saveSeckillTime(SysConfigApiVO config) { + // 获取配置信息 + String timeValueDb = configFeignClient.getConfig(config.getParamKey()).getData(); + SeckillConfigVO seckillConfigDb = Json.parseObject(timeValueDb, SeckillConfigVO.class); + SeckillConfigVO seckillConfig = Json.parseObject(config.getParamValue(), SeckillConfigVO.class); + // 如果没有配置信息或者配置时段的数据,则只需要保存即可,无需回退所有的秒杀商品状态 + if (Objects.isNull(seckillConfigDb) || CollectionUtil.isEmpty(seckillConfigDb.getSeckillTimeList())) { + // 保存配置信息 + configFeignClient.saveOrUpdateSysConfig(config); + return; + } + // 修改配置信息 + configFeignClient.saveOrUpdateSysConfig(config); + List spuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List seckillList = null; + // 如果改变后为空,则移除所有的秒杀商品信息 + if (Objects.isNull(seckillConfig) || CollectionUtil.isEmpty(seckillConfig.getSeckillTimeList())) { + // 查询所有需要删除掉秒杀信息 + seckillList = seckillMapper.list(null); + } else { + // 对比移除了那些时段,将时段上的秒杀全部删除,并恢复商品为普通商品状态 + // 先获取所有移除的时段 + List selectedLots = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Integer timeDb : seckillConfigDb.getSeckillTimeList()) { + boolean alreadly = false; + for (Integer time : seckillConfig.getSeckillTimeList()) { + if (Objects.equals(timeDb, time)) { + alreadly = true; + break; + } + } + if (!alreadly) { + selectedLots.add(timeDb); + } + } + // 查询所有需要删除掉秒杀信息 + if (CollectionUtil.isNotEmpty(selectedLots)) { + seckillList = seckillMapper.listBySelectLotList(selectedLots); + } + } + if (CollectionUtil.isEmpty(seckillList)) { + return; + } + for (SeckillVO seckillVO : seckillList) { + spuIds.add(seckillVO.getSpuId()); + seckillVO.setIsDelete(1); + } + // 删除所有的秒杀活动(逻辑删除) + seckillMapper.updateListToDelete(seckillList); + // 移除商品的秒杀信息,失效? + for (Long spuId : spuIds) { + changeSpuType(0L, spuId, SpuType.NORMAL, null); + } + } + + @Override + public PageVO listSeckillSpuByTime(PageDTO pageDTO, Long startTime, ProductSearchDTO productSearch) { + // 获取秒杀批次及起始时间 + DateTime dateTime = new DateTime(startTime); + int hour = dateTime.hour(true); + productSearch.setSelectedLot(hour); + productSearch.setSpuType(SpuType.SECKILL.value()); + productSearch.setActivityTime(DateUtil.beginOfDay(dateTime).getTime()); + productSearch.setPageSize(pageDTO.getPageSize()); + productSearch.setPageNum(pageDTO.getPageNum()); + // 秒杀详情,重新设计,秒杀中失效的商品也要显示,所以,不用从es中查询 + long total = seckillMapper.countListBySearchParam(dateTime, productSearch); + if (total < 1) { + PageVO pageVO = new PageVO<>(); + pageVO.setPages(0); + pageVO.setTotal(total); + return pageVO; + } + // 获取秒杀信息 + PageVO seckillSpuListPage = PageUtil.doPage(pageDTO, () -> seckillMapper.listByStartTimeAndSelectedLot(productSearch, dateTime)); + List seckillSpuList = seckillSpuListPage.getList(); + // 获取秒杀关联商品ids + List spuIds = seckillSpuList.stream().map(SeckillSpuVO::getSpuId).collect(Collectors.toList()); + // 获取商品的数据 + ServerResponseEntity> spuResponse = spuFeignClient.listSpuBySpuIds(spuIds); + if (!spuResponse.isSuccess()) { + throw new LuckException(spuResponse.getMsg()); + } + List spuList = spuResponse.getData(); + Map spuDbMap = spuList.stream().collect(Collectors.toMap(SpuVO::getSpuId, spuVO -> spuVO)); + if (Objects.nonNull(productSearch.getKeyword()) && !Objects.equals(productSearch.getKeyword(), "")) { + seckillSpuList = seckillSpuList.stream().filter(seckillSpuVO -> spuDbMap.get(seckillSpuVO.getSpuId()).getName().contains(productSearch.getKeyword())).collect(Collectors.toList()); + } + long now = System.currentTimeMillis(); + for (SeckillSpuVO seckillSpuVO : seckillSpuList) { + if (Objects.equals(seckillSpuVO.getStatus(), StatusEnum.ENABLE.value()) && startTime < now) { + // 进行中的活动库存查询 + seckillSpuVO.setSeckillTotalStocks(seckillSkuService.getStockBySeckillId(seckillSpuVO.getSeckillId())); + } + SpuVO spuVO = spuDbMap.get(seckillSpuVO.getSpuId()); + if (Objects.isNull(spuVO)) { + seckillSpuVO.setName("商品已删除"); + seckillSpuVO.setPriceFee(0L); + } else { + seckillSpuVO.setName(spuVO.getName()); + seckillSpuVO.setShopName(spuVO.getShopName()); + seckillSpuVO.setPriceFee(spuVO.getPriceFee()); + seckillSpuVO.setMainImgUrl(spuVO.getMainImgUrl()); + } + } + + seckillSpuListPage.setTotal(((Integer) seckillSpuList.size()).longValue()); + seckillSpuListPage.setPages((Integer) (seckillSpuList.size() + pageDTO.getPageSize() - 1) / pageDTO.getPageSize()); + seckillSpuListPage.setList(seckillSpuList); + return seckillSpuListPage; + } + + /** + * 根据店铺id获取数据库中存在的秒杀活动信息并转成map + * + * @param seckillConfigVO 配置信息 + * @param seckillDbMap 秒杀数据库的信息map + * @param specTime 当前选择时间 + * @return 秒杀活动list + */ + private List getUnStartSeckillList(SeckillConfigVO seckillConfigVO, Map seckillDbMap, Long specTime) { + Date nowTime = new Date(); + int nowHour = DateUtil.hour(nowTime, true); + int startHour = nowHour; + List seckillTimeList = seckillConfigVO.getSeckillTimeList(); + boolean conditions = Objects.nonNull(specTime) && specTime != 0; + + // 当前天的起始时间 + DateTime beginTime = conditions ? new DateTime(specTime) : DateUtil.beginOfDay(nowTime); + List adminList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 如果当前条件选择的时间小于当前日期,就直接返回了 + if (conditions && DateUtil.compare(beginTime, DateUtil.beginOfDay(nowTime)) < 0) { + return adminList; + } + // 是否为当天 + boolean isToday = Objects.equals(DateUtil.beginOfDay(nowTime), beginTime); + // 获取未开场时间,如果当前的秒杀场次已经结束,则为第二天的开始场次 + boolean nextDay = true; + for (Integer time : seckillTimeList) { + if (startHour < time) { + startHour = time; + nextDay = false; + break; + } + } + // 如果没有秒杀活动则统一设置为0 + for (int i = 0; i < Constant.MONTH_DAY; i++) { + if (conditions && i > 0) { + break; + } + if (nextDay && i == 0) { + continue; + } + for (Integer time : seckillTimeList) { + int canJoin = 1; + // 如果是第一天或者最后一天的数据,需要判断一下时间 + if (i == 0) { + // 如果是当天并且秒杀开始时间已经过去则直接跳过 + if (isToday && startHour > time) { + continue; + } + // 如果是当天并且为(当前小时+1)则返回不能添加 + if (isToday && nowHour + 1 == time) { + canJoin = 0; + } + } + // 处理时间 + DateTime dateTime = DateUtil.offsetHour(DateUtil.offsetDay(beginTime, i), time); + DateTime endTime = DateUtil.offsetHour(DateUtil.offsetDay(beginTime, i), time + 2); + SeckillAdminVO seckillAdminVO = new SeckillAdminVO(); + seckillAdminVO.setProdNum(0); + seckillAdminVO.setJoinShopNum(0); + if (CollectionUtil.isNotEmpty(seckillDbMap) && seckillDbMap.containsKey(dateTime)) { + SeckillAdminVO seckillDb = seckillDbMap.get(dateTime); + seckillAdminVO = BeanUtil.map(seckillDb, SeckillAdminVO.class); + } + seckillAdminVO.setStartTime(dateTime); + seckillAdminVO.setSelectedLot(time); + seckillAdminVO.setEndTime(endTime); + seckillAdminVO.setCanJoin(canJoin); + adminList.add(seckillAdminVO); + } + } + return adminList; + } + + @Override + public List listUnEndButNeedEndActivity() { + return seckillMapper.listUnEndButNeedEndActivity(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void changeProdTypeBySeckillIdList(List seckillList) { + seckillMapper.changeSeckillActivityStatusBySeckillIdList(seckillList); + List spuIds = seckillList.stream().map(Seckill::getSpuId).collect(Collectors.toList()); + for (Seckill seckill : seckillList) { + seckillSkuService.handSeckillPointSku(BeanUtil.map(seckill, SeckillVO.class)); + } + spuFeignClient.changeToNormalSpu(spuIds); +// changeSpuType(offlineHandleEventDto.getHandleId(),spuId, SpuType.SECKILL, StatusEnum.DISABLE); + } + + + @Override + public PageVO listEndSeckillByShopId(PageDTO pageDTO, Long shopId, Long specTime) { + DateTime specDate = Objects.nonNull(specTime) && specTime != 0 ? new DateTime(specTime) : null; + PageVO page = PageUtil.doPage(pageDTO, () -> seckillMapper.listByShopId(shopId, specDate, 2)); + for (SeckillAdminVO seckillAdminVO : page.getList()) { + seckillAdminVO.setCanJoin(0); + } + return page; + } + + @Override + public Integer getJoinSeckillMerchantNum() { + return seckillMapper.getJoinSeckillMerchantNum(); + } + + @Override + public void offlineSeckillBySpuIds(List spuIds) { + for (Long spuId : spuIds) { + SeckillVO seckillVO = seckillMapper.getBySpuId(spuId); + seckillSkuService.handSeckillPointSku(seckillVO); + } + seckillMapper.offlineSeckillBySpuIds(spuIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void offlineSeckillByShopId(Long shopId) { + List spuIds = seckillMapper.listSpuIdIdByShopId(shopId); + if (CollUtil.isEmpty(spuIds)) { + return; + } + // 失效秒杀活动 + offlineSeckillBySpuIds(spuIds); + //活动失效后商品类型改变为普通商品 + spuFeignClient.changeToNormalSpu(spuIds); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/AppSeckillSpuVO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/AppSeckillSpuVO.java new file mode 100644 index 0000000..4ad6b05 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/AppSeckillSpuVO.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.vo; + +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 秒杀商品信息VO + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public class AppSeckillSpuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "spu id") + private Long spuId; + + @Schema(description = "spu信息") + private SpuVO spuVO; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "限购数量") + private Integer maxNum; + + @Schema(description = "活动状态(活动状态:1:未开始、2:进行中、3:已结束)") + private Integer activityStatus; + + @Schema(description = "秒杀活动最低价") + private Long seckillPrice; + + @Schema(description = "秒杀活动剩余总库存") + private Integer seckillTotalStocks; + + @Schema(description = "秒杀活动原始库存") + private Integer seckillOriginStocks; + + @Schema(description = "秒杀活动关联sku信息") + private List seckillSkuList; + + @Schema(description = "在多少秒后过期") + private Long expiresIn; + + @Schema(description = "在多少秒后开始") + private Long startIn; + + public Integer getActivityStatus() { + return activityStatus; + } + + public void setActivityStatus(Integer activityStatus) { + this.activityStatus = activityStatus; + } + + public Integer getMaxNum() { + return maxNum; + } + + public void setMaxNum(Integer maxNum) { + this.maxNum = maxNum; + } + + public SpuVO getSpuVO() { + return spuVO; + } + + public void setSpuVO(SpuVO spuVO) { + this.spuVO = spuVO; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSeckillPrice() { + return seckillPrice; + } + + public void setSeckillPrice(Long seckillPrice) { + this.seckillPrice = seckillPrice; + } + + public Integer getSeckillTotalStocks() { + return seckillTotalStocks; + } + + public void setSeckillTotalStocks(Integer seckillTotalStocks) { + this.seckillTotalStocks = seckillTotalStocks; + } + + public Integer getSeckillOriginStocks() { + return seckillOriginStocks; + } + + public void setSeckillOriginStocks(Integer seckillOriginStocks) { + this.seckillOriginStocks = seckillOriginStocks; + } + + public List getSeckillSkuList() { + return seckillSkuList; + } + + public void setSeckillSkuList(List seckillSkuList) { + this.seckillSkuList = seckillSkuList; + } + + public Long getExpiresIn() { + return expiresIn; + } + + public void setExpiresIn(Long expiresIn) { + this.expiresIn = expiresIn; + } + + public Long getStartIn() { + return startIn; + } + + public void setStartIn(Long startIn) { + this.startIn = startIn; + } + + @Override + public String toString() { + return "AppSeckillSpuVO{" + + "spuId=" + spuId + + ", spuVO=" + spuVO + + ", shopId=" + shopId + + ", maxNum=" + maxNum + + ", activityStatus=" + activityStatus + + ", seckillPrice=" + seckillPrice + + ", seckillTotalStocks=" + seckillTotalStocks + + ", seckillOriginStocks=" + seckillOriginStocks + + ", seckillSkuList=" + seckillSkuList + + ", expiresIn=" + expiresIn + + ", startIn=" + startIn + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/AppSeckillVO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/AppSeckillVO.java new file mode 100644 index 0000000..82a9cde --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/AppSeckillVO.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 秒杀信息VO + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public class AppSeckillVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "最近一场秒杀活动时间,负数表示当前的秒杀活动还有多久结束") + private Long nextTime; + + @Schema(description = "最近一场秒杀活动时段") + private Integer selectedLot; + + @Schema(description = "秒杀活动列表") + private List seckillSpuList; + + public Integer getSelectedLot() { + return selectedLot; + } + + public void setSelectedLot(Integer selectedLot) { + this.selectedLot = selectedLot; + } + + public Long getNextTime() { + return nextTime; + } + + public void setNextTime(Long nextTime) { + this.nextTime = nextTime; + } + + public List getSeckillSpuList() { + return seckillSpuList; + } + + public void setSeckillSpuList(List seckillSpuList) { + this.seckillSpuList = seckillSpuList; + } + + @Override + public String toString() { + return "AppSeckillVO{" + + "nextTime=" + nextTime + + ", selectedLot=" + selectedLot + + ", seckillSpuList=" + seckillSpuList + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillAdminVO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillAdminVO.java new file mode 100644 index 0000000..1f760ca --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillAdminVO.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 秒杀信息VO + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public class SeckillAdminVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "开始日期") + private Date startTime; + + @Schema(description = "具体开始时间") + private Date dateTime; + + @Schema(description = "结束时间") + private Date endTime; + + @Schema(description = "所选批次") + private Integer selectedLot; + + @Schema(description = "参与商家数") + private Integer joinShopNum; + + @Schema(description = "抢购商品数量") + private Integer prodNum; + + @Schema(description = "数量") + private Integer num; + + @Schema(description = "能否参与活动1.能 0.不能") + private Integer canJoin; + + public Integer getCanJoin() { + return canJoin; + } + + public void setCanJoin(Integer canJoin) { + this.canJoin = canJoin; + } + + public Date getDateTime() { + return dateTime; + } + + public void setDateTime(Date dateTime) { + this.dateTime = dateTime; + } + + public Integer getNum() { + return num; + } + + public void setNum(Integer num) { + this.num = num; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getSelectedLot() { + return selectedLot; + } + + public void setSelectedLot(Integer selectedLot) { + this.selectedLot = selectedLot; + } + + public Integer getJoinShopNum() { + return joinShopNum; + } + + public void setJoinShopNum(Integer joinShopNum) { + this.joinShopNum = joinShopNum; + } + + public Integer getProdNum() { + return prodNum; + } + + public void setProdNum(Integer prodNum) { + this.prodNum = prodNum; + } + + @Override + public String toString() { + return "SeckillAdminVO{" + + "startTime=" + startTime + + ", dateTime=" + dateTime + + ", endTime=" + endTime + + ", selectedLot=" + selectedLot + + ", joinShopNum=" + joinShopNum + + ", prodNum=" + prodNum + + ", num=" + num + + ", canJoin=" + canJoin + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillConfigVO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillConfigVO.java new file mode 100644 index 0000000..80a7292 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillConfigVO.java @@ -0,0 +1,58 @@ + + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 秒杀配置信息 + * @author lhd + */ +public class SeckillConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 秒杀时段 + */ + private List seckillTimeList; + /** + * 秒杀轮播图 + */ + private String imgUrls; + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public List getSeckillTimeList() { + return seckillTimeList; + } + + public void setSeckillTimeList(List seckillTimeList) { + this.seckillTimeList = seckillTimeList; + } + + @Override + public String toString() { + return "SeckillConfigVO{" + + "seckillTimeList=" + seckillTimeList + + ", imgUrls='" + imgUrls + '\'' + + '}'; + } +} + diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillVO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillVO.java new file mode 100644 index 0000000..be30e9f --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillVO.java @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.vo; + +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 秒杀信息VO + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public class SeckillVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "秒杀活动id") + private Long seckillId; + + @Schema(description = "活动名称") + private String seckillName; + + @Schema(description = "开始日期") + private Date startTime; + + @Schema(description = "结束日期") + private Date endTime; + + @Schema(description = "所选批次") + private Integer selectedLot; + + @Schema(description = "所选秒杀分类") + private Long categoryId; + + @Schema(description = "活动标签") + private String seckillTag; + + @Schema(description = "限购数量") + private Integer maxNum; + + @Schema(description = "取消订单时间") + private Integer maxCancelTime; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "0 未删除 1已删除") + private Integer isDelete; + + @Schema(description = "状态(0:失效、1:正常、2:违规下架、3:等待审核)") + private Integer status; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品信息") + private SpuVO spuVO; + + @Schema(description = "秒杀活动剩余总库存") + private Integer seckillTotalStocks; + + @Schema(description = "秒杀活动原始库存") + private Integer seckillOriginStocks; + + @Schema(description = "秒杀活动最低价") + private Long seckillPrice; + + @Schema(description = "秒杀活动关联sku信息") + private List seckillSkuList; + + @Schema(description = "sku列表") + private List skuList; + + @Schema(description = "0不补充 1补充库存") + private Integer replenish; + + public Integer getReplenish() { + return replenish; + } + + public void setReplenish(Integer replenish) { + this.replenish = replenish; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public SpuVO getSpuVO() { + return spuVO; + } + + public void setSpuVO(SpuVO spuVO) { + this.spuVO = spuVO; + } + + public List getSkuList() { + return skuList; + } + + public void setSkuList(List skuList) { + this.skuList = skuList; + } + + public List getSeckillSkuList() { + return seckillSkuList; + } + + public void setSeckillSkuList(List seckillSkuList) { + this.seckillSkuList = seckillSkuList; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + public String getSeckillName() { + return seckillName; + } + + public void setSeckillName(String seckillName) { + this.seckillName = seckillName; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Integer getSelectedLot() { + return selectedLot; + } + + public void setSelectedLot(Integer selectedLot) { + this.selectedLot = selectedLot; + } + + public String getSeckillTag() { + return seckillTag; + } + + public void setSeckillTag(String seckillTag) { + this.seckillTag = seckillTag; + } + + public Integer getMaxNum() { + return maxNum; + } + + public void setMaxNum(Integer maxNum) { + this.maxNum = maxNum; + } + + public Integer getMaxCancelTime() { + return maxCancelTime; + } + + public void setMaxCancelTime(Integer maxCancelTime) { + this.maxCancelTime = maxCancelTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getIsDelete() { + return isDelete; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getSeckillTotalStocks() { + return seckillTotalStocks; + } + + public void setSeckillTotalStocks(Integer seckillTotalStocks) { + this.seckillTotalStocks = seckillTotalStocks; + } + + public Integer getSeckillOriginStocks() { + return seckillOriginStocks; + } + + public void setSeckillOriginStocks(Integer seckillOriginStocks) { + this.seckillOriginStocks = seckillOriginStocks; + } + + public Long getSeckillPrice() { + return seckillPrice; + } + + public void setSeckillPrice(Long seckillPrice) { + this.seckillPrice = seckillPrice; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + @Override + public String toString() { + return "SeckillVO{" + + "seckillId=" + seckillId + + ", seckillName='" + seckillName + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", selectedLot=" + selectedLot + + ", categoryId=" + categoryId + + ", seckillTag='" + seckillTag + '\'' + + ", maxNum=" + maxNum + + ", maxCancelTime=" + maxCancelTime + + ", shopId=" + shopId + + ", isDelete=" + isDelete + + ", status=" + status + + ", spuId=" + spuId + + ", spuVO=" + spuVO + + ", seckillTotalStocks=" + seckillTotalStocks + + ", seckillOriginStocks=" + seckillOriginStocks + + ", seckillPrice=" + seckillPrice + + ", seckillSkuList=" + seckillSkuList + + ", skuList=" + skuList + + ", replenish=" + replenish + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/resources/bootstrap.yml b/tmerclub-seckill/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..9eebea6 --- /dev/null +++ b/tmerclub-seckill/src/main/resources/bootstrap.yml @@ -0,0 +1,28 @@ +server: + port: ${MALL4CLOUD_PORT:9115} +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} +logging: + tracer: + pattern: '%5p [${spring.application.name:},%X{X-B3-Parent-SpanName},%X{X-B3-TraceId},%X{X-B3-SpanId}]' + +# dubbo端口:默认为服务端口+2000 +dubbo: + protocol: + port: ${MALL4CLOUD_DUBBO_PORT:9515} diff --git a/tmerclub-seckill/src/main/resources/mapper/SeckillCategoryMapper.xml b/tmerclub-seckill/src/main/resources/mapper/SeckillCategoryMapper.xml new file mode 100644 index 0000000..65ebaa9 --- /dev/null +++ b/tmerclub-seckill/src/main/resources/mapper/SeckillCategoryMapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + `category_id`,`create_time`,`update_time`,`name`,`seq` + + + + + + + + insert into seckill_category (`name`,`seq`) + values (#{seckillCategory.name},#{seckillCategory.seq}); + + + + update seckill_category + + + `name` = #{seckillCategory.name}, + + + `seq` = #{seckillCategory.seq}, + + update_time = now() + + where category_id = #{seckillCategory.categoryId} + + + + + update seckill_category + + + `name` = #{seckillCategory.name}, + + + `seq` = #{seckillCategory.seq}, + + update_time = now() + + where category_id = #{seckillCategory.categoryId} + + + + + delete from seckill_category where category_id = #{categoryId} + + + diff --git a/tmerclub-seckill/src/main/resources/mapper/SeckillSkuMapper.xml b/tmerclub-seckill/src/main/resources/mapper/SeckillSkuMapper.xml new file mode 100644 index 0000000..b2f2a11 --- /dev/null +++ b/tmerclub-seckill/src/main/resources/mapper/SeckillSkuMapper.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + `seckill_sku_id`, + `sku_id`, + `seckill_id`, + `seckill_stocks`, + `seckill_origin_stocks`, + `seckill_price` + + + + + + + insert into seckill_sku (`sku_id`, `seckill_id`, `seckill_stocks`,`seckill_origin_stocks`, `seckill_price`) values + + (#{seckillSku.skuId}, #{seckillSku.seckillId}, #{seckillSku.seckillStocks},#{seckillSku.seckillStocks}, #{seckillSku.seckillPrice}) + + + + + update seckill_sku + set seckill_stocks = seckill_stocks - #{count} + where seckill_sku_id = #{seckillSkuId} + and seckill_stocks >= #{count} + + + + UPDATE seckill_sku + SET seckill_stocks = seckill_stocks + #{count} + WHERE seckill_sku_id = #{seckillSkuId} + + + + + + + + diff --git a/tmerclub-user/Dockerfile b/tmerclub-user/Dockerfile new file mode 100644 index 0000000..0b93728 --- /dev/null +++ b/tmerclub-user/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms512m", "-Xmx512m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/CategoryLinkBO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/CategoryLinkBO.java new file mode 100644 index 0000000..e36d723 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/CategoryLinkBO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 跳转链接为分类时候的link + * @author TRACK + */ +public class CategoryLinkBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "分类名") + private String label; + + @Schema(description = "分类id") + private Long value; + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public Long getValue() { + return value; + } + + public void setValue(Long value) { + this.value = value; + } + + @Override + public String toString() { + return "CategoryLinkBO{" + + "label='" + label + '\'' + + ", value='" + value + '\'' + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/mongo/MongoUserBalanceLogBO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/mongo/MongoUserBalanceLogBO.java new file mode 100644 index 0000000..b81ff27 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/mongo/MongoUserBalanceLogBO.java @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.bo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 余额记录mongodb + * @author TRACK + */ +@Document("user_balance_log") +@CompoundIndexes({ + @CompoundIndex(name = "idx_refund_id_number", def = "{'refundId':1, 'refundNumber':1}"), + @CompoundIndex(name = "idx_user_id", def = "{'userId':1}"), + @CompoundIndex(name = "idx_recharge_id", def = "{'rechargeId':1}"), + @CompoundIndex(name = "idx_pay_id", def = "{'payId':1}") +}) +public class MongoUserBalanceLogBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Id + @Schema(description = "用户余额记录id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long balanceLogId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long userId; + + @Schema(description = "充值id") + private Long rechargeId; + + @Schema(description = "改变金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long changeBalance; + + @Schema(description = "收支类型 0支出 1收入", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer ioType; + + @Schema(description = "支付编号(用于余额充值)") + private Long payId; + + @Schema(description = "支付类型") + private Integer payType; + + @Schema(description = "RechargeTypeEnum 1:充值 2:赠送 3:支付 4:退款 5:平台手动修改 6:购买会员 7.提现", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer type; + + @Schema(description = "1:已支付 0:未支付(用于余额充值)") + private Integer isPayed; + + @Schema(description = "退款单号(用于余额支付进行退款)") + private Long refundId; + + @Schema(description = "退款序号") + private Integer refundNumber; + + @Schema(description = "支付系统类型(0:默认支付, 1:通联支付)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer paySysType; + + public Integer getRefundNumber() { + return refundNumber; + } + + public void setRefundNumber(Integer refundNumber) { + this.refundNumber = refundNumber; + } + + public Long getBalanceLogId() { + return balanceLogId; + } + + public void setBalanceLogId(Long balanceLogId) { + this.balanceLogId = balanceLogId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getChangeBalance() { + return changeBalance; + } + + public void setChangeBalance(Long changeBalance) { + this.changeBalance = changeBalance; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Long getRechargeId() { + return rechargeId; + } + + public void setRechargeId(Long rechargeId) { + this.rechargeId = rechargeId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "MongoUserBalanceLogBO{" + + "balanceLogId=" + balanceLogId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", userId=" + userId + + ", rechargeId=" + rechargeId + + ", changeBalance=" + changeBalance + + ", ioType=" + ioType + + ", payId=" + payId + + ", payType=" + payType + + ", type=" + type + + ", isPayed=" + isPayed + + ", refundId=" + refundId + + ", refundNumber=" + refundNumber + + ", paySysType=" + paySysType + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/mongo/MongoUserScoreLogBO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/mongo/MongoUserScoreLogBO.java new file mode 100644 index 0000000..75fe6ee --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/mongo/MongoUserScoreLogBO.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.bo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户积分记录mongodb + * @author TRACK + */ +@Document("user_score_log") +@CompoundIndexes({ + @CompoundIndex(name = "idx_user_id", def = "{'userId':1}"), + @CompoundIndex(name = "idx_biz_id", def = "{'bizId':1}") +}) +public class MongoUserScoreLogBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Id + @Schema(description = "用户积分记录id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long logId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long userId; + + @Schema(description = "1.购物 2.会员等级提升加积分 3.签到加积分 4.购物抵扣使用积分 5.积分过期", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer source; + + @Schema(description = "变动积分数额") + private Long score; + + @Schema(description = "业务id") + private Long bizId; + + @Schema(description = "出入类型 0=支出 1=收入", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer ioType; + + public Long getLogId() { + return logId; + } + + public void setLogId(Long logId) { + this.logId = logId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "MongoUserScoreLogBO{" + + "logId=" + logId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", userId=" + userId + + ", source=" + source + + ", score=" + score + + ", bizId=" + bizId + + ", ioType=" + ioType + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/RocketMqConfig.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/RocketMqConfig.java new file mode 100644 index 0000000..0d3707e --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/RocketMqConfig.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.config; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqAdapter; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * @author FrozenWatermelon + * @date 2021/3/30 + */ +@RefreshScope +@Configuration +public class RocketMqConfig { + + @Autowired + private RocketMqAdapter rocketMqAdapter; + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate couponGiveTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.COUPON_GIVE_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate balancePayTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.BALANCE_PAY_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate userNotifyRegisterTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.BATCH_USER_REGISTER_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate levelUpCouponGiveTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.LEVEL_UP_COUPON_GIVE_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate levelDownCouponExpireTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.LEVEL_DOWN_COUPON_EXPIRE_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendNotifyToUserTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate userScoreTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SCORE_UNLOCK_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate userNotifyDistributionUserTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.USER_NOTIFY_DISTRIBUTION_USER_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate addUserScoreLogTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.ADD_USER_SCORE_LOG_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate addUserBalanceLogTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.ADD_USER_BALANCE_LOG_TOPIC); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/ThreadPoolConfigProperties.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/ThreadPoolConfigProperties.java new file mode 100644 index 0000000..4993703 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/ThreadPoolConfigProperties.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; + + +/** + * 用户线程配置 + * @author cl + * @date 2021-05-11 15:46:52 + */ +@ConfigurationProperties(prefix = "mall4cloud.user.thread") +public class ThreadPoolConfigProperties { + + private Integer coreSize; + + private Integer maxSize; + + private Integer keepAliveTime; + + public Integer getCoreSize() { + return coreSize; + } + + public void setCoreSize(Integer coreSize) { + this.coreSize = coreSize; + } + + public Integer getMaxSize() { + return maxSize; + } + + public void setMaxSize(Integer maxSize) { + this.maxSize = maxSize; + } + + public Integer getKeepAliveTime() { + return keepAliveTime; + } + + public void setKeepAliveTime(Integer keepAliveTime) { + this.keepAliveTime = keepAliveTime; + } + + @Override + public String toString() { + return "ThreadPoolConfigProperties{" + + "coreSize=" + coreSize + + ", maxSize=" + maxSize + + ", keepAliveTime=" + keepAliveTime + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/XxlJobConfig.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/XxlJobConfig.java new file mode 100644 index 0000000..008def5 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/XxlJobConfig.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.config; + +import com.tmerclub.cloud.common.constant.Constant; +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * + * @author FrozenWatermelon + * @date 2021/1/18 + */ +@Configuration +public class XxlJobConfig { + private static final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${mall4cloud.job.admin.addresses}") + private String adminAddresses; + + @Value("${mall4cloud.job.accessToken}") + private String accessToken; + + @Value("${mall4cloud.job.logPath}") + private String logPath; + + @Value("${spring.application.name}") + private String appname; + + @Value("${server.port}") + private int port; + + @Autowired + private InetUtils inetUtils; + + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appname + Constant.DASHED_ENV); + // 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP + xxlJobSpringExecutor.setIp(inetUtils.findFirstNonLoopbackAddress().getHostAddress()); + xxlJobSpringExecutor.setPort(port + 1000); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(3); + return xxlJobSpringExecutor; + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/DistributedIdKey.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/DistributedIdKey.java new file mode 100644 index 0000000..5b250b7 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/DistributedIdKey.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 分布式id key + * + * @author FrozenWatermelon + * @date 2021/4/9 + */ +public interface DistributedIdKey { + /** + * 用户id + */ + String MALL4CLOUD_USER = "mall4cloud-user"; + /** + * mall4cloud余额日志 + */ + String MALL4CLOUD_USER_BALANCE_LOG = "mall4cloud-user-balance-log"; + /** + * mall4cloud积分日志 + */ + String MALL4CLOUD_USER_SCORE_LOG = "mall4cloud-user-score-log"; +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/FreeFeeTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/FreeFeeTypeEnum.java new file mode 100644 index 0000000..5fc15af --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/FreeFeeTypeEnum.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 包邮类型[1.全平台包邮 2.自营店包邮] + * + * @author Pineapple + * @date 2021/5/10 14:50 + */ +public enum FreeFeeTypeEnum { + /** + * 全平台包邮 + */ + ALL_PLATFORMS_FREE(1), + + /** + * 自营店包邮 + */ + SELF_OPERATED_STORE_FREE(2); + + private final Integer value; + + public Integer value() { + return value; + } + + FreeFeeTypeEnum(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/GrowthLogSourceEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/GrowthLogSourceEnum.java new file mode 100644 index 0000000..cd06561 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/GrowthLogSourceEnum.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + + +/** + * 成长值来源 + * + * @author cl + * @date 2021-04-25 10:16:53 + */ +public enum GrowthLogSourceEnum { + /** + * 系统修改用户成长值 + */ + SYSTEM(0), + /** + * 订单 + */ + ORDER(1), + /** + * 余额 + */ + BALANCE(2); + private final Integer num; + + public Integer value() { + return num; + } + + GrowthLogSourceEnum(Integer num) { + this.num = num; + } + + public static GrowthLogSourceEnum instance(Integer value) { + GrowthLogSourceEnum[] enums = values(); + for (GrowthLogSourceEnum sourceEnum : enums) { + if (sourceEnum.value().equals(value)) { + return sourceEnum; + } + } + return null; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/OrderSortEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/OrderSortEnum.java new file mode 100644 index 0000000..306a7b6 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/OrderSortEnum.java @@ -0,0 +1,128 @@ +package com.tmerclub.cloud.user.constant; + +import org.springframework.data.domain.Sort; + +/** + * 客户列表的订单排序 + * + * @author: zsm + * @date: 2023/2/22 9:42 + */ +public enum OrderSortEnum { + + /** + * 消费金额正序 + */ + CONS_AMOUNT_ASC(1, "consAmount", Sort.Direction.ASC), + + /** + * 消费金额倒序 + */ + CONS_AMOUNT_DESC(2, "consAmount", Sort.Direction.DESC), + + /** + * 实付金额正序 + */ + ACTUAL_AMOUNT_ASC(3, "actualAmount", Sort.Direction.ASC), + + /** + * 实付金额倒序 + */ + ACTUAL_AMOUNT_DESC(4, "actualAmount", Sort.Direction.DESC), + /** + * 消费次数正序 + */ + CONS_TIMES_ASC(5, "consTimes", Sort.Direction.ASC), + + /** + * 消费次数倒序 + */ + CONS_TIMES_DESC(6, "consTimes", Sort.Direction.DESC), + + /** + * 下单次数正序 + */ + ALL_COUNT_ASC(7, "allCount", Sort.Direction.ASC), + + /** + * 消下单次数倒序 + */ + ALL_COUNTC_DESC(8, "allCount", Sort.Direction.DESC), + + /** + * 平均折扣正序 + */ + AVER_DISCOUNT_ASC(9, "averDiscount", Sort.Direction.ASC), + + /** + * 平均折扣倒序 + */ + AVER_DISCOUNT_DESC(10, "averDiscount", Sort.Direction.DESC), + + /** + * 退款次数正序 + */ + AFTER_SALE_TIMES_ASC(11, "afterSaleTimes", Sort.Direction.ASC), + + /** + * 退款次数倒序 + */ + AFTER_SALE_TIMES_DESC(12, "afterSaleTimes", Sort.Direction.DESC), + + /** + * 退款金额正序 + */ + AFTER_SALE_AMOUNT_ASC(13, "afterSaleAmount", Sort.Direction.ASC), + + /** + * 退款金额倒序 + */ + AFTER_SALE_AMOUNT_DESC(14, "afterSaleAmount", Sort.Direction.DESC); + + private final Integer value; + + private final String srotName; + + private final Sort.Direction order; + + public Integer value() { + return value; + } + + public String param() { + return srotName; + } + + public Sort.Direction order() { + return order; + } + + OrderSortEnum(Integer value, String srotName, Sort.Direction order) { + this.value = value; + this.srotName = srotName; + this.order = order; + + } + + public static String getSortName(Integer value) { + OrderSortEnum[] enums = values(); + for (OrderSortEnum orderSortEnum : enums) { + if (!orderSortEnum.value().equals(value)) { + return orderSortEnum.srotName; + } + } + return null; + } + + + public static OrderSortEnum instance(Integer value) { + OrderSortEnum[] enums = values(); + for (OrderSortEnum orderSortEnum : enums) { + if (orderSortEnum.value().equals(value)) { + return orderSortEnum; + } + } + return null; + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PopupPageTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PopupPageTypeEnum.java new file mode 100644 index 0000000..89d371a --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PopupPageTypeEnum.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +import java.util.Objects; + +/** + * 触发页面类型 1.平台首页 2.会员中心 3.支付成功 4.店铺首页 5.商品详情 + * @author TRACK + */ +public enum PopupPageTypeEnum { + + /** + * 平台首页 + */ + SYS_HOME(1), + + /** + * 会员中心 + */ + MEMBER_CENTER(2), + + /** + * 支付成功 + */ + PAY_SUCCESS(3), + + /** + * 店铺首页 + */ + SHOP_HOME(4), + + /** + * 商品详情 + */ + SPU_DETAIL(5); + + private final Integer value; + + public Integer value() { + return value; + } + + PopupPageTypeEnum(Integer value) { + this.value = value; + } + + public static Boolean isSys(Integer value) { + return Objects.equals(value, SYS_HOME.value) || Objects.equals(value, MEMBER_CENTER.value) || Objects.equals(value, PAY_SUCCESS.value); + } + + public static Boolean isShop(Integer value) { + return Objects.equals(value, SHOP_HOME.value) || Objects.equals(value, SPU_DETAIL.value); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PopupUserTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PopupUserTypeEnum.java new file mode 100644 index 0000000..71d478b --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PopupUserTypeEnum.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +import java.util.Objects; + +/** + * 推送用户类型 0.所有用户 1.免费会员 2.付费会员 3.店铺客户 + * @author TRACK + */ +public enum PopupUserTypeEnum { + + /** + * 所有用户 + */ + ALL_USER(0), + + /** + * 免费会员 + */ + FREE_USER(1), + + /** + * 付费会员 + */ + PAY_USER(2), + + /** + * 店铺客户 + */ + SHOP_USER(3); + + private final Integer value; + + public Integer value() { + return value; + } + + PopupUserTypeEnum(Integer value) { + this.value = value; + } + + public static Boolean isSys(Integer value) { + return Objects.equals(value, ALL_USER.value) || Objects.equals(value, FREE_USER.value) || Objects.equals(value, PAY_USER.value); + } + + public static Boolean isShop(Integer value) { + return Objects.equals(value, ALL_USER.value) || Objects.equals(value, SHOP_USER.value); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RecruitStatusEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RecruitStatusEnum.java new file mode 100644 index 0000000..1b3c30c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RecruitStatusEnum.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 付费会员,是否可以招募会员;1可以招募,0停止招募 + * + * @author cl + * @date 2021-07-26 17:21:04 + */ +public enum RecruitStatusEnum { + + /** + * 停止招募 + */ + STOP_RECRUIT(0), + + /** + * 可以招募 + */ + ALLOW_RECRUIT(1); + + private final Integer value; + + public Integer value() { + return value; + } + + RecruitStatusEnum(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RightsTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RightsTypeEnum.java new file mode 100644 index 0000000..6673b29 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RightsTypeEnum.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 权益类型[0.自定义 1.积分回馈倍率 2.优惠券 3.积分赠送(数量) 4.会员折扣 5.包邮类型] + * + * @author Pineapple + * @date 2021/5/10 14:11 + */ +public enum RightsTypeEnum { + /** + * 自定义 + */ + CUSTOMIZATION(0), + + /** + * 积分回馈倍率 + */ + SCORE_REWARD_MULTIPLIER(1), + + /** + * 优惠券 + */ + COUPON(2), + + /** + * 积分赠送(数量) + */ + SCORE_PRESENTING(3), + + /** + * 会员折扣 + */ + MEMBER_DISCOUNT(4), + + /** + * 包邮类型 + */ + FREE_FEE_TYPE(5); + + private final Integer value; + + public Integer value() { + return value; + } + + RightsTypeEnum(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/ScoreIoTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/ScoreIoTypeEnum.java new file mode 100644 index 0000000..d639226 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/ScoreIoTypeEnum.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 积分类型 + * + * @author lhd + */ +public enum ScoreIoTypeEnum { + + /** + * 0.支出 + */ + EXPENDITURE(0), + /** + * 1. 收入 + */ + INCOME(1), + ; + + + private final Integer num; + + public Integer value() { + return num; + } + + ScoreIoTypeEnum(Integer num) { + this.num = num; + } + + public static ScoreIoTypeEnum instance(Integer value) { + ScoreIoTypeEnum[] enums = values(); + for (ScoreIoTypeEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/ScoreLogTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/ScoreLogTypeEnum.java new file mode 100644 index 0000000..dcadfcb --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/ScoreLogTypeEnum.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + + +/** + * @author lhd + * @date 2020/12/30 + */ +public enum ScoreLogTypeEnum { + + /** + * 0.注册送积分 + */ + REGISTER(0), + /** + * 1. 购物 2.会员等级提升加积分 3.签到加积分 4购物抵扣使用积分 + */ + SHOP(1), + + /** + * 等级提升 + */ + LEVEL_UP(2), + + /** + * 签到 + */ + SIGN_IN(3), + /** + * 购物抵扣积分 + */ + SCORE_CASH(4), + /** + * 积分过期 + */ + EXPIRE(5), + /** + * 余额充值 + */ + BALANCE(6), + /** + * 系统更改积分 + */ + SYSTEM(7), + /** + * 购物抵扣积分退还 + */ + SCORE_CASH_BACK(8), + /** + * 订单退款积分退还 + */ + COMPLETE_ORDER_BACK(9), + /** + * 积分商品兑换 + */ + SCORE_PRODUCT_EXCHANGE(10), + /** + * 兑换积分退还 + */ + SCORE_PRODUCT_EXCHANGE_BACK(11), + /** + * 积分失效 + */ + SCORE_VALID(12), + ; + + + private final Integer num; + + public Integer value() { + return num; + } + + ScoreLogTypeEnum(Integer num) { + this.num = num; + } + + public static ScoreLogTypeEnum instance(Integer value) { + ScoreLogTypeEnum[] enums = values(); + for (ScoreLogTypeEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/SexTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/SexTypeEnum.java new file mode 100644 index 0000000..2aa934c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/SexTypeEnum.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * @author cl + * @date 2021-05-12 17:26:37 + */ +public enum SexTypeEnum { + + /** + * 女 + */ + FEMALE(0, "0"), + + /** + * 男 + */ + MALE(1, "1"); + + private final Integer value; + + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + SexTypeEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static SexTypeEnum instance(Integer value) { + SexTypeEnum[] enums = values(); + for (SexTypeEnum typeEnum : enums) { + if (typeEnum.value().equals(value)) { + return typeEnum; + } + } + return null; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/TagTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/TagTypeEnum.java new file mode 100644 index 0000000..4d601e8 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/TagTypeEnum.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 标签类型 0手动 1条件 2系统 + * + * @author cl + * @date 2021-05-18 14:02:42 + */ +public enum TagTypeEnum { + + /** + * 手动标签 + */ + MANUAL(0), + + /** + * 条件标签 + */ + CONDITION(1), + /** + * 系统标签 + */ + SYSTEM(2); + + private final Integer value; + + public Integer value() { + return value; + } + + TagTypeEnum(Integer value) { + this.value = value; + } + + public static TagTypeEnum instance(Integer value) { + TagTypeEnum[] enums = values(); + for (TagTypeEnum typeEnum : enums) { + if (typeEnum.value().equals(value)) { + return typeEnum; + } + } + return null; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/UserStatusEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/UserStatusEnum.java new file mode 100644 index 0000000..d5aea30 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/UserStatusEnum.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 用户状态 + * + * @author cl + * @date 2021-05-11 13:13:00 + */ +public enum UserStatusEnum { + /** + * 普通会员 + */ + DISABLE(0, "禁用"), + + /** + * 付费会员 + */ + ENABLE(1, "正常"); + + private final Integer value; + + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + UserStatusEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static UserStatusEnum instance(Integer value) { + UserStatusEnum[] enums = values(); + for (UserStatusEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/ThirdApiAbutmentController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/ThirdApiAbutmentController.java new file mode 100644 index 0000000..6a374e6 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/ThirdApiAbutmentController.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.ThirdApiAbutmentUserDto; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.service.ThirdApiAbutmenService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @author xxw + * @version 1.0 + * @description: 用户端第三方接口对接 + * @since 2023/12/15 15:10 + */ +@RestController() +@RequestMapping("/ua/server/user") +@Tag(name = "第三方接口对接(用户端)") +public class ThirdApiAbutmentController { + + @Autowired + private ThirdApiAbutmenService thirdApiAbutmenService; + @DubboReference + private TokenFeignClient tokenStore; + @Autowired + private AccountFeignClient accountFeignClient; + /** + * 注册用户 + */ + @PostMapping("/register") + @Operation(summary = "注册用户") + public ServerResponseEntity regiserUser(@RequestBody ThirdApiAbutmentUserDto thirdApiAbutmentUserDto) { + thirdApiAbutmenService.regiserUser(thirdApiAbutmentUserDto); + return ServerResponseEntity.success(); + } + + /** + * 更新用户名称 + */ + @PutMapping("/update") + @Operation(summary = "更新用户名称") + public ServerResponseEntity updateUser(@RequestBody ThirdApiAbutmentUserDto thirdApiAbutmentUserDto) { + thirdApiAbutmenService.updateUser(thirdApiAbutmentUserDto); + return ServerResponseEntity.success(); + } + + /** + * 将用户token以及过期时间同步到商城 + */ + @PostMapping("/token") + @Operation(summary = "将用户token以及过期时间同步到商城") + public ServerResponseEntity userTokenSync(@RequestBody ThirdApiAbutmentUserDto thirdApiAbutmentUserDto) { + // 获取用户在商城的uid + ServerResponseEntity userIdAndSysType = accountFeignClient.getByUserIdAndSysType(thirdApiAbutmentUserDto.getUserId(), SysTypeEnum.ORDINARY.value()); + thirdApiAbutmentUserDto.setUid(userIdAndSysType.getData().getUid()); + tokenStore.userTokenSync(thirdApiAbutmentUserDto); + return ServerResponseEntity.success(); + } + + + /** + * 禁用用户 + */ + @PutMapping("/disable") + @Operation(summary = "禁用用户") + public ServerResponseEntity disableUser(@RequestBody ThirdApiAbutmentUserDto thirdApiAbutmentUserDto) { + thirdApiAbutmenService.disableUser(thirdApiAbutmentUserDto.getUserId()); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserBalancePayController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserBalancePayController.java new file mode 100644 index 0000000..c4feb47 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserBalancePayController.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.service.UserBalanceLogService; +import com.tmerclub.cloud.user.service.UserExtensionService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.client.producer.TransactionSendResult; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2021/5/11 + */ +@RestController +@RequestMapping("/user_balance") +@Tag(name = "app-余额支付") +public class UserBalancePayController { + + @Autowired + private UserExtensionService userExtensionService; + + @Autowired + private RocketMQTemplate balancePayTemplate; + + @Autowired + private UserBalanceLogService userBalanceLogService; + + @PostMapping("/balance_pay") + @Operation(summary = "支付", description = "余额支付") + public ServerResponseEntity pay(@RequestBody Long payId) { + Long userId = AuthUserContext.get().getUserId(); + + UserExtension userExtension = userExtensionService.getByUserId(userId); + + // 获取用户可用余额 + Long balance = userExtension.getActualBalance(); + + // 需要支付的金额 + MongoUserBalanceLogBO userBalanceLog = userBalanceLogService.getByPayId(payId); + if (userBalanceLog.getChangeBalance() > balance) { + return ServerResponseEntity.showFailMsg("余额不足"); + } + + TransactionSendResult transactionSendResult = balancePayTemplate.sendMessageInTransaction(RocketMqConstant.BALANCE_PAY_TOPIC, new GenericMessage<>(payId), userBalanceLog); + + + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserController.java new file mode 100644 index 0000000..b8a37ab --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserController.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.coupon.feign.CouponFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.OrderCountVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.user.constant.LevelTypeEnum; +import com.tmerclub.cloud.user.dto.CheckSmsDTO; +import com.tmerclub.cloud.user.dto.UserDTO; +import com.tmerclub.cloud.user.model.User; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.service.UserExtensionService; +import com.tmerclub.cloud.user.service.UserLevelService; +import com.tmerclub.cloud.user.service.UserService; +import com.tmerclub.cloud.user.vo.UserInfoVO; +import com.tmerclub.cloud.user.vo.UserLevelVO; +import com.tmerclub.cloud.user.vo.UserSimpleInfoVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.text.DecimalFormat; +import java.util.Objects; + +/** + * 用户地址 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:50:02 + */ +@RestController("appUserController") +@RequestMapping("/user") +@Tag(name = "app-用户信息") +public class UserController { + + @Autowired + private UserService userService; + + @Autowired + private UserExtensionService userExtensionService; + + + @DubboReference + private CouponFeignClient couponFeignClient; + + @Autowired + private UserLevelService userLevelService; + + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + + @DubboReference + private NotifyFeignClient notifyFeignClient; + + public static final String UPDATE_PWD_SMS_FLAG = "updatePwdSmsFlag"; + + @GetMapping("/simple_info") + @Operation(summary = "用户头像昵称", description = "用户头像昵称") + public ServerResponseEntity getByAddrId() { + Long userId = AuthUserContext.get().getUserId(); + + UserApiVO userApiVO = userService.getByUserId(userId); + UserSimpleInfoVO userSimpleInfoVO = new UserSimpleInfoVO(); + userSimpleInfoVO.setNickName(userApiVO.getNickName()); + userSimpleInfoVO.setPic(userApiVO.getPic()); + + return ServerResponseEntity.success(userSimpleInfoVO); + } + + @GetMapping("/user_info") + @Operation(summary = "获取用户信息", description = "返回用户的信息") + public ServerResponseEntity getUserInfo() { + Long userId = AuthUserContext.get().getUserId(); + UserExtension userExtension = userExtensionService.getByUserId(userId); + UserInfoVO userInfo = new UserInfoVO(); + userInfo.setScore(userExtension.getScore()); + userInfo.setActualBalance(userExtension.getActualBalance()); + userInfo.setBalance(userExtension.getBalance()); + userInfo.setAllinpayBalance(userExtension.getAllinpayBalance()); + userInfo.setAllinpayActualBalance(userExtension.getAllinpayActualBalance()); + ServerResponseEntity countCanUseCouponResponse = couponFeignClient.countCanUseCoupon(); + userInfo.setCouponNum(countCanUseCouponResponse.getData().intValue()); + Integer collections = spuFeignClient.countByUserId(userId).getData(); + userInfo.setCollections(collections == null ? 0 : collections); + Integer num = notifyFeignClient.getUnreadMsg(userId).getData(); + userInfo.setNotifyNum(num == null ? 0 : num); + return ServerResponseEntity.success(userInfo); + } + + @GetMapping("/ma/user_detail_info") + @Operation(summary = "获取用户详细信息", description = "返回用户详细信息") + public ServerResponseEntity getUserDetailInfo() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + if (uidInfoBO == null) { + return ServerResponseEntity.fail(ResponseEnum.CLEAN_TOKEN); + } + Long userId = uidInfoBO.getUserId(); + UserApiVO userApiVO = userService.getByUserId(userId); + // 会员信息 + UserLevelVO ordinaryLevel = userLevelService.getOneByTypeAndLevel(LevelTypeEnum.ORDINARY_USER.value(), userApiVO.getLevel()); + if (Objects.nonNull(userApiVO.getVipLevel())) { + UserLevelVO payLevel = userLevelService.getOneByTypeAndLevel(LevelTypeEnum.PAY_USER.value(), userApiVO.getVipLevel()); + userApiVO.setVipUserLevelId(payLevel.getUserLevelId()); + userApiVO.setVipLevelName(payLevel.getLevelName()); + } + if (Objects.nonNull(ordinaryLevel)) { + userApiVO.setUserLevelId(ordinaryLevel.getUserLevelId()); + userApiVO.setLevelName(ordinaryLevel.getLevelName()); + } + userApiVO.setUserMobile(userApiVO.getPhone()); + return ServerResponseEntity.success(userApiVO); + } + + @PutMapping("/set_user_info") + @Operation(summary = "设置用户信息", description = "设置用户信息") + public ServerResponseEntity setUserInfo(@RequestBody UserDTO userDTO) { + Long userId = AuthUserContext.get().getUserId(); + userDTO.setUserId(userId); + User user = BeanUtil.map(userDTO, User.class); + userService.update(user); + return ServerResponseEntity.success(); + } + + + @PutMapping("/update_mobile") + @Operation(summary = "修改用户手机号", description = "修改用户手机号") + public ServerResponseEntity checkPhoneIsBind(@RequestBody CheckSmsDTO checkSmsDTO) { + //修改手机号码前后不能相同 + Long userId = AuthUserContext.get().getUserId(); + UserApiVO user = userService.getByUserId(userId); + if (user.getPhone().equals(checkSmsDTO.getMobile())) { + throw new LuckException("修改手机号码不能与原先相同"); + } + String checkRegisterSmsFlag = UPDATE_PWD_SMS_FLAG + checkSmsDTO.getCheckUpdatePhoneSmsFlag(); + // 看看有没有校验验证码成功的标识 + if (StrUtil.isBlank(checkSmsDTO.getCheckUpdatePhoneSmsFlag())) { + // 验证码已过期,请重新发送验证码校验 + throw new LuckException("验证码已过期,请重新发送验证码校验"); + } else { + String checkRegisterSmsFlagMobile = RedisUtil.get(checkRegisterSmsFlag); + if (!Objects.equals(checkRegisterSmsFlagMobile, checkSmsDTO.getMobile())) { + // 验证码已过期,请重新发送验证码校验 + throw new LuckException("验证码已过期,请重新发送验证码校验"); + } + } + // 修改用户的手机号 + userService.updateUserMobile(AuthUserContext.get().getUserId(), checkSmsDTO.getMobile()); + return ServerResponseEntity.success(); + } + + @GetMapping("/destroy_user") + @Operation(summary = "注销账户", description = "注销账户") + public ServerResponseEntity destroy(@RequestParam(value = "forceDestroy", required = false, defaultValue = "false") Boolean forceDestroy) { + Long userId = AuthUserContext.get().getUserId(); + // 检查此账户是否有未完成的订单 + ServerResponseEntity orderCountResponseEntity = orderFeignClient.countOrderByUserId(userId); + if (!orderCountResponseEntity.isSuccess()) { + throw new LuckException(orderCountResponseEntity.getMsg()); + } + OrderCountVO orderCountVO = orderCountResponseEntity.getData(); + if (orderCountVO.getConsignment() + orderCountVO.getPayed() + orderCountVO.getRefund() + orderCountVO.getGrouping() + orderCountVO.getPreSale() > 0) { + return ServerResponseEntity.fail(ResponseEnum.DESTROY_USER_FAIL); + } + if (!forceDestroy) { + // 检查余额 + UserExtension userExtension = userExtensionService.getByUserId(userId); + double balance = Arith.div(Double.valueOf(userExtension.getActualBalance()), 100L); + if (balance > 0) { + String actualBalance = DecimalFormat.getInstance().format(balance).replaceAll(",", ""); + return ServerResponseEntity.showFailMsg("您的账户当前仍有余额" + actualBalance + "元,注销账户后余额将清零,请考虑清楚后再注销"); + } + } + userService.destroyUser(userId); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserExtensionController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserExtensionController.java new file mode 100644 index 0000000..682f54f --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserExtensionController.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.service.UserExtensionService; +import com.tmerclub.cloud.user.vo.UserExtensionVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.BeanUtils; +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; + +/** + * 用户扩展信息 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@RestController("appUserExtensionController") +@RequestMapping("/user_extension") +@Tag(name = "app-用户扩展信息") +public class UserExtensionController { + + @Autowired + private UserExtensionService userExtensionService; + + + @GetMapping("/page") + @Operation(summary = "获取用户扩展信息列表", description = "分页获取用户扩展信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO userExtensionPage = userExtensionService.page(pageDTO); + return ServerResponseEntity.success(userExtensionPage); + } + + @GetMapping("/get_info") + @Operation(summary = "获取用户扩展信息", description = "获取用户扩展信息") + public ServerResponseEntity getInfo() { + Long userId = AuthUserContext.get().getUserId(); + UserExtension userExtension = userExtensionService.getByUserId(userId); + UserExtensionVO userExtensionVO = new UserExtensionVO(); + BeanUtils.copyProperties(userExtension, userExtensionVO); + return ServerResponseEntity.success(userExtensionVO); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserRechargeController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserRechargeController.java new file mode 100644 index 0000000..54018e5 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserRechargeController.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + +import com.tmerclub.cloud.api.payment.vo.PaySettlementConfigVO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO; +import com.tmerclub.cloud.user.constant.DistributedIdKey; +import com.tmerclub.cloud.user.constant.RechargeIoTypeEnum; +import com.tmerclub.cloud.user.constant.RechargeTypeEnum; +import com.tmerclub.cloud.user.dto.UserBalanceRechargeOrderDTO; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.service.UserBalanceLogService; +import com.tmerclub.cloud.user.service.UserExtensionService; +import com.tmerclub.cloud.user.service.UserRechargeService; +import com.tmerclub.cloud.user.vo.UserRechargeVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 余额充值级别表 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +@RestController("appUserRechargeController") +@RequestMapping("/user_recharge") +@Tag(name = "app-余额充值") +public class UserRechargeController { + + @Autowired + private UserRechargeService userRechargeService; + + @Autowired + private UserExtensionService userExtensionService; + @Autowired + private UserBalanceLogService userBalanceLogService; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private ConfigFeignClient configFeignClient; + + @GetMapping("/list") + @Operation(summary = "获取余额充值级别表列表", description = "分页获取余额充值级别表列表") + public ServerResponseEntity> list() { + return ServerResponseEntity.success(userRechargeService.list()); + } + + @PostMapping("/recharge") + @Operation(summary = "充值订单", description = "生成余额充值订单,保存充值记录") + public ServerResponseEntity save(@Valid @RequestBody UserBalanceRechargeOrderDTO userBalanceRechargeOrderDTO) { + Long amount = PriceUtil.toLongCent(userBalanceRechargeOrderDTO.getAmount()); + Long rechargeId = userBalanceRechargeOrderDTO.getRechargeId(); + if (rechargeId != null) { + UserRechargeVO userRecharge = userRechargeService.getRechargeInfo(rechargeId); + amount = userRecharge.getRechargeAmount(); + } + if (amount == null || amount < 1) { + throw new LuckException("充值金额有误"); + } + UserExtension userExtension = userExtensionService.getByUserId(AuthUserContext.get().getUserId()); + long userBalance = userExtension.getActualBalance() + amount; + if (userBalance > Constant.MAX_USER_BALANCE) { + throw new LuckException("此次充值会导致余额超出最大限制,故无法进行此操作,请减少充值金额后重试"); + } + MongoUserBalanceLogBO userBalanceLog = new MongoUserBalanceLogBO(); + userBalanceLog.setBalanceLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_BALANCE_LOG)); + userBalanceLog.setUserId(AuthUserContext.get().getUserId()); + userBalanceLog.setChangeBalance(amount); + userBalanceLog.setIoType(RechargeIoTypeEnum.INCOME.value()); + userBalanceLog.setIsPayed(0); + userBalanceLog.setRechargeId(userBalanceRechargeOrderDTO.getRechargeId()); + userBalanceLog.setType(RechargeTypeEnum.RECHARGE.value()); + // 补充支付类型(默认支付/通联支付) + ServerResponseEntity configResponse = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG); + if (!configResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + PaySettlementConfigVO paySettlementConfigVO = Json.parseObject(configResponse.getData(), PaySettlementConfigVO.class); + Integer paySysType = paySettlementConfigVO.getPaySettlementType(); + userBalanceLog.setPaySysType(paySysType); + userBalanceLogService.saveToMongdb(userBalanceLog); + return ServerResponseEntity.success(userBalanceLog.getBalanceLogId()); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserRegisterController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserRegisterController.java new file mode 100644 index 0000000..b9d8b8d --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserRegisterController.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.TokenInfoVO; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.user.bo.UidAndUserIdBO; +import com.tmerclub.cloud.api.user.dto.UserRegisterDTO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.service.UserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 用户信息 + * + * @author FrozenWatermelon + */ +@RestController +@RequestMapping("/ua/user/register") +@Tag(name = "app-用户注册接口") +public class UserRegisterController { + + @Autowired + private UserService userService; + @DubboReference + private AccountFeignClient accountFeignClient; + @DubboReference + private NotifyFeignClient notifyFeignClient; + + /** + * 注册的头像昵称有几个值得注意的地方: + * 1. 如果是微信公众号 or 小程序注册,在注册之前,也就是在进入页面之前,需要调用SocialLoginController 这里面的尝试登录的接口,如果可以登录就直接登录了。 + * 2. 关于发送验证码 + * 1) 如果用邮箱进行注册就发送邮箱验证码 + * 2) 手机号注册,要发送验证码 + * 3. 当注册成功的时候,已经返回token,相对来说,已经登录了 + */ + @Operation(summary = "注册") + @PostMapping + public ServerResponseEntity register(@Valid @RequestBody UserRegisterDTO param) { + // 手机号校验 + ServerResponseEntity validCodeResponse = notifyFeignClient.checkValidCodeByFlag(param.getMobile(), param.getCheckRegisterSmsFlag()); + if (!validCodeResponse.isSuccess() || !validCodeResponse.getData()) { + return ServerResponseEntity.fail(ResponseEnum.VERIFICATION_CODE_ERROR); + } + // 1. 保存账户信息 + UidAndUserIdBO uidAndUserIdBO = userService.save(param.getMobile(), param.getPassword(), null); + + + UidInfoBO uidInfoBO = new UidInfoBO(); + uidInfoBO.setAccountUid(uidAndUserIdBO.getUid()); + uidInfoBO.setUserId(uidAndUserIdBO.getUserId()); + uidInfoBO.setSysType(SysTypeEnum.ORDINARY.value()); + uidInfoBO.setIsAdmin(0); + // 2. 登录 + return accountFeignClient.storeTokenAndGetVo(uidInfoBO); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserScoreController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserScoreController.java new file mode 100644 index 0000000..a0cc597 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserScoreController.java @@ -0,0 +1,213 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.vo.ScoreExpireConfigVO; +import com.tmerclub.cloud.common.constant.ConfigNameConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.bo.mongo.MongoUserScoreLogBO; +import com.tmerclub.cloud.user.constant.DistributedIdKey; +import com.tmerclub.cloud.user.constant.ScoreIoTypeEnum; +import com.tmerclub.cloud.user.constant.ScoreLogTypeEnum; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.model.UserScoreGetLog; +import com.tmerclub.cloud.user.model.UserScoreLog; +import com.tmerclub.cloud.user.service.UserExtensionService; +import com.tmerclub.cloud.user.service.UserLevelService; +import com.tmerclub.cloud.user.service.UserScoreGetLogService; +import com.tmerclub.cloud.user.service.UserScoreLogService; +import com.tmerclub.cloud.user.vo.ScoreCompleteConfigVO; +import com.tmerclub.cloud.user.vo.ScoreDataVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 积分中心接口 + * + * @author LHD + * @date 2019-3-18 10:27:46 + */ +@RestController +@RequestMapping("/score") +@Tag(name = "app-积分中心接口") +public class UserScoreController { + + @Autowired + private UserScoreLogService scoreLogService; + @Autowired + private UserScoreGetLogService userScoreGetLogService; + @Autowired + private UserExtensionService userExtensionService; + @Autowired + private UserLevelService userLevelService; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private ConfigFeignClient configFeignClient; + + @GetMapping("/update_user_score") + @Operation(summary = "积分签到", description = "积分签到") + public ServerResponseEntity updateUserScore() { + Long userId = AuthUserContext.get().getUserId(); + UserExtension extension = userExtensionService.getByUserId(userId); + String scoreConfigValue = configFeignClient.getConfig(ConfigNameConstant.SCORE_CONFIG).getData(); + ScoreCompleteConfigVO scoreParam = Json.parseObject(scoreConfigValue, ScoreCompleteConfigVO.class); + //签到,计算连续签到日期 + if (isSignIn(userId, DateUtil.date())) { + // 今天已经签到过了,请明天再试! + return ServerResponseEntity.success("今天已经签到过了,请明天再试!"); + } + //根据逗号分隔 + String[] signInScore = scoreParam.getSignInScoreString().split(StrUtil.COMMA); + int count = Math.min(extension.getSignDay(), signInScore.length - 1); + long score = Long.parseLong(signInScore[count]); + // 查询昨天有没有签到,没有则初始化为1 + if (isSignIn(userId, DateUtil.offsetDay(DateUtil.date(), -1))) { + extension.setSignDay(extension.getSignDay() + 1); + } else { + extension.setSignDay(1); + } +// String remarks = "签到第" + count + "天获取的积分"; + updateUserScoreBySign(score, ScoreIoTypeEnum.INCOME.value(), extension); + // 领取积分成功 + return ServerResponseEntity.success("领取积分成功"); + } + + @GetMapping("/score_info") + @Operation(summary = "查看积分中心信息", description = "查看积分中心信息") + public ServerResponseEntity scoreInfo() { + ScoreDataVO scoreDataVO = new ScoreDataVO(); + Long userId = AuthUserContext.get().getUserId(); + String scoreParam = configFeignClient.getConfig(ConfigNameConstant.SCORE_CONFIG).getData(); + ScoreCompleteConfigVO scoreParamConfigVO = Json.parseObject(scoreParam, ScoreCompleteConfigVO.class); + String scoreExpireParam = configFeignClient.getConfig(ConfigNameConstant.SCORE_EXPIRE).getData(); + //计算过期时间 + ScoreExpireConfigVO scoreExpireParamConfigVO = Json.parseObject(scoreExpireParam, ScoreExpireConfigVO.class); + Integer expireYear = Objects.isNull(scoreExpireParamConfigVO) ? 0 : scoreExpireParamConfigVO.getExpireYear(); + List signInScores = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (String s : scoreParamConfigVO.getSignInScoreString().trim().split(StrUtil.COMMA)) { + Integer signInScore = Integer.valueOf(s); + signInScores.add(signInScore); + } + UserExtension extension = userExtensionService.getByUserId(userId); + // 查询连续签到天数大于0并且没有连续签到初始化为0 + boolean isContinuousSign = !isSignIn(userId, DateUtil.offsetDay(DateUtil.date(), -1)) && !isSignIn(userId, DateUtil.date()); + if (isContinuousSign && extension.getSignDay() != 0) { + extension.setSignDay(0); + userExtensionService.update(extension); + } + UserScoreLog scoreLog = scoreLogService.getExpireScoreLogByUserId(userId); + scoreDataVO.setExpireScore(Objects.nonNull(scoreLog) ? scoreLog.getScore() : 0); + scoreDataVO.setExpireYear(expireYear); + scoreDataVO.setScoreExpireSwitch(scoreExpireParamConfigVO.getScoreExpireSwitch()); + scoreDataVO.setIsRegister(1); + scoreDataVO.setScoreList(signInScores); + scoreDataVO.setRegisterScore(scoreParamConfigVO.getRegisterScore()); + scoreDataVO.setShoppingScoreSwitch(scoreParamConfigVO.getShoppingScoreSwitch()); + scoreDataVO.setShoppingGetScore(scoreParamConfigVO.getShoppingGetScore()); + scoreDataVO.setIsSignIn(isSignIn(userId, DateUtil.date()) ? 1 : 0); + scoreDataVO.setLevelType(extension.getLevelType()); + Long score = extension.getScore(); + scoreDataVO.setScore(score); + scoreDataVO.setLevelName(userLevelService.getOneByTypeAndLevel(extension.getLevelType(), extension.getLevel()).getLevelName()); + int count = extension.getSignDay() <= 0 ? 1 : extension.getSignDay(); + // 如果不为第一天签到或者大于等于第七天的签到,+1 + if (extension.getSignDay() != 0 && !isSignIn(userId, DateUtil.date())) { + count++; + } + // 连续签到天数 + scoreDataVO.setSignInCount(count); + //根据逗号分隔 + String[] signInScore = scoreParamConfigVO.getSignInScoreString().split(StrUtil.COMMA); + // 当天签到可领的积分 + int curScore; + if (scoreDataVO.getIsSignIn() == 1) { + count = Math.min(count, signInScore.length - 1); + curScore = Integer.parseInt(signInScore[count]); + } else { + count = Math.min(count, signInScore.length); + curScore = Integer.parseInt(signInScore[count - 1]); + } + scoreDataVO.setCurScore(curScore); + return ServerResponseEntity.success(scoreDataVO); + } + + private void updateUserScoreBySign(Long score, Integer ioType, UserExtension extension) { + if (score == null) { + return; + } + if (ioType == 1) { + extension.setScore(extension.getScore() + score); + // 添加积分明细 + UserScoreGetLog addDetail = new UserScoreGetLog(); + addDetail.setCreateTime(new Date()); + addDetail.setStatus(1); + addDetail.setUserId(extension.getUserId()); + addDetail.setUsableScore(score); + userScoreGetLogService.save(addDetail); + } else { + extension.setScore(extension.getScore() - score); + } + userExtensionService.update(extension); + MongoUserScoreLogBO scoreLog = new MongoUserScoreLogBO(); + scoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + scoreLog.setSource(ScoreLogTypeEnum.SIGN_IN.value()); + scoreLog.setIoType(ScoreIoTypeEnum.INCOME.value()); + //添加一条日志和修改用户积分 + scoreLog.setUserId(extension.getUserId()); + scoreLog.setScore(score); + scoreLog.setBizId(1L); + scoreLogService.saveToMongdb(scoreLog); + } + + /** + * 是否已经签到 + * + * @param userId + * @return + */ + private boolean isSignIn(Long userId, Date date) { + Long count = scoreLogService.countByUserIdAndDateTimeAndType( + ScoreLogTypeEnum.SIGN_IN.value(), userId, DateUtil.beginOfDay(date), DateUtil.endOfDay(date)); + return Objects.nonNull(count) && count > 0; + } + + /** + * 配置信息 + */ + @GetMapping("/score_config_info/{id}") + @Operation(summary = "查看积分成长值配置信息", description = "常见问题:SCORE_QUESTION;等级页展示:LEVEL_SHOW;成长值说明:MEMBER_GROWTH_DESCRIPTION") + public ServerResponseEntity info(@PathVariable("id") String key) { + String config = configFeignClient.getConfig(key).getData(); + if (Objects.isNull(config)) { + return ServerResponseEntity.success(null); + } + return ServerResponseEntity.success(config); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/CostPerPopupController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/CostPerPopupController.java new file mode 100644 index 0000000..cff0388 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/CostPerPopupController.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.platform; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.user.constant.PopupPageTypeEnum; +import com.tmerclub.cloud.user.constant.PopupStatusEnum; +import com.tmerclub.cloud.user.constant.PopupUserTypeEnum; +import com.tmerclub.cloud.user.constant.PushFrequencyEnum; +import com.tmerclub.cloud.user.dto.CostPerPopupDTO; +import com.tmerclub.cloud.user.model.CostPerPopup; +import com.tmerclub.cloud.user.service.CostPerPopupService; +import com.tmerclub.cloud.user.vo.CostPerPopupVO; +import com.tmerclub.cloud.user.vo.PopupRelateVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 弹窗广告 + * @author TRACK + */ +@RestController("platformCostPerPopupController") +@RequestMapping("/p/cost_per_popup") +@Tag(name = "platform-弹窗广告") +public class CostPerPopupController { + + @Autowired + private CostPerPopupService costPerPopupService; + + @GetMapping("/page") + @Operation(summary = "获取弹窗广告列表", description = "分页获取弹窗广告列表") + public ServerResponseEntity> page(PageDTO pageDTO, CostPerPopupDTO costPerPopupDTO) { + costPerPopupDTO.setShopId(Constant.PLATFORM_SHOP_ID); + PageVO costPerPopupPage = costPerPopupService.page(pageDTO, costPerPopupDTO); + return ServerResponseEntity.success(costPerPopupPage); + } + + @GetMapping + @Operation(summary = "获取弹窗广告", description = "根据popupId获取弹窗广告") + public ServerResponseEntity getByPopupId(@RequestParam Long popupId) { + CostPerPopupVO popup = costPerPopupService.getByPopupId(popupId); + costPerPopupService.handleInfo(popup); + return ServerResponseEntity.success(popup); + } + + @PostMapping + @Operation(summary = "保存弹窗广告", description = "保存弹窗广告") + public ServerResponseEntity save(@Valid @RequestBody CostPerPopupDTO costPerPopupDTO) { + CostPerPopup costPerPopup = BeanUtil.map(costPerPopupDTO, CostPerPopup.class); + costPerPopup.setPopupId(null); + costPerPopup.setShopId(Constant.PLATFORM_SHOP_ID); + costPerPopup.setStatus(PopupStatusEnum.NOT_START.value()); + checkInfo(costPerPopup); + costPerPopupService.save(costPerPopup); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新弹窗广告", description = "更新弹窗广告") + public ServerResponseEntity update(@Valid @RequestBody CostPerPopupDTO costPerPopupDTO) { + CostPerPopup costPerPopup = BeanUtil.map(costPerPopupDTO, CostPerPopup.class); + checkInfo(costPerPopup); + costPerPopupService.update(costPerPopup); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除弹窗广告", description = "根据弹窗广告id删除弹窗广告") + public ServerResponseEntity delete(@RequestParam Long popupId) { + costPerPopupService.deleteById(popupId); + return ServerResponseEntity.success(); + } + + @PutMapping("/invalid") + @Operation(summary = "失效弹窗广告", description = "根据弹窗广告id失效弹窗广告") + public ServerResponseEntity invalid(@RequestParam Long popupId) { + costPerPopupService.invalid(popupId); + return ServerResponseEntity.success(); + } + + private void checkInfo(CostPerPopup costPerPopup) { + costPerPopup.setSpuIds(null); + if (!PopupPageTypeEnum.isSys(costPerPopup.getPageType())) { + throw new LuckException("触发页面类型错误"); + } + if (!PopupUserTypeEnum.isSys(costPerPopup.getUserType())) { + throw new LuckException("推送用户类型错误"); + } + if (!Objects.equals(costPerPopup.getUserType(), PopupUserTypeEnum.ALL_USER.value()) && CollUtil.isEmpty(costPerPopup.getUserLevelIds())) { + throw new LuckException("关联等级不能为空"); + } + if (Objects.equals(costPerPopup.getPushFrequency(), PushFrequencyEnum.CUSTOM.value())) { + if (Objects.isNull(costPerPopup.getDayFrequency()) && StrUtil.isBlank(costPerPopup.getWeekFrequency())) { + throw new LuckException("推送天数/周不能为空"); + } + if (Objects.nonNull(costPerPopup.getDayFrequency()) && StrUtil.isNotBlank(costPerPopup.getWeekFrequency())) { + throw new LuckException("推送天数/周不能同时存在"); + } + } + // 校验重复 + List dbList = costPerPopupService.listByParam(costPerPopup); + if (CollUtil.isEmpty(dbList)) { + return; + } + boolean checkFrequency = Objects.equals(costPerPopup.getPushFrequency(), PushFrequencyEnum.CUSTOM.value()) && StrUtil.isNotBlank(costPerPopup.getWeekFrequency()); + if (!checkFrequency) { + checkLevel(costPerPopup, dbList); + return; + } + // 只有按周推送需要再校验一下周数重复 + for (CostPerPopupVO costPerPopupVO : dbList) { + if (!Objects.equals(costPerPopupVO.getPushFrequency(), PushFrequencyEnum.CUSTOM.value()) || StrUtil.isBlank(costPerPopupVO.getWeekFrequency())) { + checkLevel(costPerPopup, dbList); + } else { + // 按周推送的检查是否有重复周 + List duplicateList = costPerPopupService.getDuplicateList(costPerPopup, costPerPopupVO); + if (CollUtil.isNotEmpty(duplicateList)) { + checkLevel(costPerPopup, dbList); + } + } + } + } + + private static void checkLevel(CostPerPopup costPerPopup, List dbList) { + boolean duplicate = false; + for (CostPerPopupVO costPerPopupVO : dbList) { + if (!Objects.equals(costPerPopupVO.getUserType(), costPerPopup.getUserType())) { + duplicate = true; + break; + } + if (Objects.equals(costPerPopup.getUserType(), costPerPopupVO.getUserType()) && Objects.equals(costPerPopupVO.getUserType(), PopupUserTypeEnum.ALL_USER.value())) { + duplicate = true; + break; + } + List dbUserLevelIds = costPerPopupVO.getPopupRelateList().stream().map(PopupRelateVO::getUserLevelId).toList(); + List duplicateList = dbUserLevelIds.stream().filter(costPerPopup.getUserLevelIds()::contains).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(duplicateList)) { + duplicate = true; + break; + } + } + if (duplicate) { + throw new LuckException("已有重复弹窗广告"); + } + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserRechargeController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserRechargeController.java new file mode 100644 index 0000000..c5f81dd --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserRechargeController.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.platform; + +import com.tmerclub.cloud.api.coupon.constant.PutOnStatus; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.dto.UserAdminDTO; +import com.tmerclub.cloud.user.dto.UserRechargeDTO; +import com.tmerclub.cloud.user.model.UserRecharge; +import com.tmerclub.cloud.user.service.UserBalanceLogService; +import com.tmerclub.cloud.user.service.UserRechargeService; +import com.tmerclub.cloud.user.vo.UserBalanceLogVO; +import com.tmerclub.cloud.user.vo.UserRechargeVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 余额充值级别表 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +@RestController("platformUserRechargeController") +@RequestMapping("/p/user_recharge") +@Tag(name = "platform-余额充值级别表") +public class UserRechargeController { + + @Autowired + private UserRechargeService userRechargeService; + + @Autowired + private UserBalanceLogService userBalanceLogService; + + + @GetMapping("/list") + @Operation(summary = "余额充值列表数据", description = "余额充值列表数据") + public ServerResponseEntity> getUserBalancePage() { + List list = userRechargeService.list(); + return ServerResponseEntity.success(userRechargeService.list()); + } + + @GetMapping("/page") + @Operation(summary = "获取余额充值级别表列表", description = "分页获取余额充值级别表列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO userRechargePage = userRechargeService.page(pageDTO); + return ServerResponseEntity.success(userRechargePage); + } + + @GetMapping("/info") + @Operation(summary = "获取余额充值级别表", description = "根据rechargeId获取余额充值级别表") + public ServerResponseEntity getByRechargeId(@RequestParam Long rechargeId) { + UserRechargeVO userRechargeVO = userRechargeService.getRechargeByRechargeId(rechargeId, PutOnStatus.PUT_ON.value()); + return ServerResponseEntity.success(userRechargeVO); + } + + @PostMapping + @Operation(summary = "保存余额充值级别表", description = "保存余额充值级别表") + public ServerResponseEntity save(@Valid @RequestBody UserRechargeDTO userRechargeDTO) { + userRechargeService.saveRecharge(userRechargeDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新余额充值级别表", description = "更新余额充值级别表") + public ServerResponseEntity update(@Valid @RequestBody UserRechargeDTO userRechargeDTO) { + userRechargeService.updateByRechargeId(userRechargeDTO); + userRechargeService.removeCacheByRechargeId(userRechargeDTO.getRechargeId()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除余额充值级别表", description = "根据余额充值级别表id删除余额充值级别表") + public ServerResponseEntity delete(@RequestParam Long rechargeId) { + userRechargeService.deleteById(rechargeId); + userRechargeService.removeCacheByRechargeId(rechargeId); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_user_balance") + @Operation(summary = "平台批量修改会员余额", description = "平台批量修改会员余额") + public ServerResponseEntity batchUpdateUserBalance(@RequestBody @Valid UserAdminDTO userAdminDTO) { + return ServerResponseEntity.success(userRechargeService.batchUpdateUserBalance(userAdminDTO)); + } + + @GetMapping("/page_user_log") + @Operation(summary = "分页查询某个用户的余额明细", description = "分页查询某个用户的余额明细") + public ServerResponseEntity> getPageByUserId(@Valid PageDTO pageDTO, Long userId) { + PageVO res = userBalanceLogService.getPageByUserId(pageDTO, userId); + return ServerResponseEntity.success(res); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserRightsController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserRightsController.java new file mode 100644 index 0000000..698b913 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserRightsController.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.platform; + +import com.tmerclub.cloud.api.coupon.feign.CouponFeignClient; +import com.tmerclub.cloud.api.coupon.vo.CouponDataVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.constant.LevelTypeEnum; +import com.tmerclub.cloud.user.dto.UserRightsDTO; +import com.tmerclub.cloud.user.service.UserLevelService; +import com.tmerclub.cloud.user.service.UserRightsService; +import com.tmerclub.cloud.user.vo.UserRightsVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 用户权益信息 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@RestController("platformUserRightsController") +@RequestMapping("/p/user_rights") +@Tag(name = "店铺-用户权益信息") +public class UserRightsController { + + @Autowired + private UserRightsService userRightsService; + @DubboReference + private CouponFeignClient couponFeignClient; + @Autowired + private UserLevelService userLevelService; + + @GetMapping("/page") + @Operation(summary = "获取用户权益信息列表", description = "分页获取用户权益信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, UserRightsDTO userRightsDTO) { + PageVO userRightsPage = userRightsService.page(pageDTO, userRightsDTO); + return ServerResponseEntity.success(userRightsPage); + } + + + @GetMapping + @Operation(summary = "获取用户权益信息", description = "根据rightsId获取用户权益信息") + public ServerResponseEntity getByRightsId(@RequestParam Long rightsId) { + UserRightsVO userRightsVO = userRightsService.getByRightsId(rightsId); + ServerResponseEntity> couponListResponse = couponFeignClient.getCouponListByCouponIds(userRightsVO.getCouponIds()); + userRightsVO.setCouponList(couponListResponse.getData()); + return ServerResponseEntity.success(userRightsVO); + } + + @PostMapping + @Operation(summary = "保存用户权益信息", description = "保存用户权益信息") + public ServerResponseEntity save(@Valid @RequestBody UserRightsDTO userRightsDTO) { + userRightsService.save(userRightsDTO); + return ServerResponseEntity.success(userRightsDTO.getRightsId()); + } + + @PutMapping + @Operation(summary = "更新用户权益信息", description = "更新用户权益信息") + public ServerResponseEntity update(@Valid @RequestBody UserRightsDTO userRightsDTO) { + userRightsService.update(userRightsDTO); + userRightsService.removeRightsCache(userRightsDTO.getRightsId()); + userRightsService.removeRightsByLevelTypeCache(LevelTypeEnum.ORDINARY_USER.value()); + userRightsService.removeRightsByLevelTypeCache(LevelTypeEnum.PAY_USER.value()); + // 清楚会员等级缓存 + userLevelService.removeLevelListCache(0); + userLevelService.removeLevelListCache(1); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除用户权益信息", description = "根据用户权益信息id删除用户权益信息") + public ServerResponseEntity delete(@RequestParam Long rightsId) { + userRightsService.deleteById(rightsId); + userRightsService.removeRightsCache(rightsId); + userRightsService.removeRightsByLevelTypeCache(LevelTypeEnum.ORDINARY_USER.value()); + userRightsService.removeRightsByLevelTypeCache(LevelTypeEnum.PAY_USER.value()); + // 清楚会员等级缓存 + userLevelService.removeLevelListCache(0); + userLevelService.removeLevelListCache(1); + return ServerResponseEntity.success(); + } + + /** + * 获取权益列表 + */ + @GetMapping("/list") + public ServerResponseEntity> list() { + UserRightsDTO userRights = new UserRightsDTO(); + return ServerResponseEntity.success(userRightsService.list(userRights)); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserTagController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserTagController.java new file mode 100644 index 0000000..88c2e76 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserTagController.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.platform; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.user.constant.TagTypeEnum; +import com.tmerclub.cloud.user.dto.UserTagDTO; +import com.tmerclub.cloud.user.model.UserTag; +import com.tmerclub.cloud.user.service.UserTagService; +import com.tmerclub.cloud.user.vo.UserTagVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 客户标签 + * + * @author cl + * @date 2020-05-17 16:16:53 + */ +@RestController("platformUserTagController") +@RequestMapping("/p/user_tag") +@Tag(name = "platform-客户标签") +public class UserTagController { + + @Autowired + private UserTagService userTagService; + + + @GetMapping("/page") + @Operation(summary = "获取客户标签列表", description = "分页获取客户标签列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO userTagPage = userTagService.page(pageDTO); + return ServerResponseEntity.success(userTagPage); + } + + @GetMapping + @Operation(summary = "获取客户标签", description = "根据userTagId获取客户标签") + public ServerResponseEntity getByUserTagId(@RequestParam Long userTagId) { + UserTagVO userTagVO = BeanUtil.map(userTagService.getByUserTagId(userTagId), UserTagVO.class); + return ServerResponseEntity.success(userTagVO); + } + + @PostMapping + @Operation(summary = "保存客户标签", description = "保存客户标签") + public ServerResponseEntity save(@RequestBody @Validated(UserTagDTO.AddUserTag.class) UserTagDTO userTagDTO) { + UserTag query = new UserTag(); + // 条件标签和手动标签的标签名称都不可以相同 + query.setTagType(TagTypeEnum.CONDITION.value()); + int count = userTagService.count(query); + if (Objects.equals(userTagDTO.getTagType(), TagTypeEnum.CONDITION.value()) && count + 1 > Constant.TAG_LIMIT_NUM) { + // 数量超过上限 + throw new LuckException("数量超过上限"); + } + query.setTagName(userTagDTO.getTagName()); + query.setTagType(null); + int nameCount = userTagService.count(query); + if (nameCount > 0) { + // 标签名称已存在! + throw new LuckException("标签名称已存在!"); + } + userTagService.addUserTag(userTagDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新客户标签", description = "更新客户标签") + public ServerResponseEntity update(@RequestBody @Validated(UserTagDTO.UpdateUserTag.class) UserTagDTO userTagDTO) { + + UserTag query = new UserTag(); +// query.setTagType(TagTypeEnum.CONDITION.value()) + query.setTagName(userTagDTO.getTagName()); + query.setUserTagId(userTagDTO.getUserTagId()); + int nameCount = userTagService.count(query); + if (nameCount > 0) { + // 标签名称已存在! + throw new LuckException("标签名称已存在!"); + } + userTagService.updateUserTag(userTagDTO); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除客户标签", description = "根据客户标签id删除客户标签") + public ServerResponseEntity delete(@RequestParam Long userTagId) { + userTagService.deleteById(userTagId); + return ServerResponseEntity.success(); + } + + @GetMapping("/refresh") + @Operation(summary = "刷新客户标签统计数据", description = "通过id刷新客户标签统计数据") + public ServerResponseEntity refreshUserTag(@RequestParam Long userTagId) { + return ServerResponseEntity.success(userTagService.refreshConditionTag(userTagId)); + } + + @Operation(summary = "批量刷新客户标签") + @Parameter(name = "tagIds", description = "标签id集合(不传默认刷新全部)") + @GetMapping("/batch_refresh") + public ServerResponseEntity batchRefreshTag(@RequestParam(required = false) List tagIds) { + // 查询所有条件标签 + if (CollectionUtils.isEmpty(tagIds)) { + UserTag userTag = new UserTag(); + userTag.setTagType(TagTypeEnum.CONDITION.value()); + List userTags = userTagService.list(userTag); + if (CollectionUtils.isEmpty(userTags)) { + return ServerResponseEntity.success(); + } + tagIds = userTags.stream().map(UserTagVO::getUserTagId).collect(Collectors.toList()); + } + userTagService.batchRefreshConditionTag(tagIds); + return ServerResponseEntity.success(); + } + + @GetMapping("/tag_list") + @Operation(summary = "可以添加的标签列表", description = "可以添加的标签列表") + public ServerResponseEntity> getTagList() { + return ServerResponseEntity.success(userTagService.list(new UserTag())); + } + + + @GetMapping("/tag_page") + @Operation(summary = "获取客户标签列表", description = "分页获取客户标签列表") + public ServerResponseEntity> getTagPage(@Valid PageDTO pageDTO, UserTagDTO userTagDTO) { + PageVO resPage = userTagService.getPage(pageDTO, userTagDTO); + return ServerResponseEntity.success(resPage); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserTagUserController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserTagUserController.java new file mode 100644 index 0000000..04418b7 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserTagUserController.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.platform; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.dto.UserAdminDTO; +import com.tmerclub.cloud.user.dto.UserTagUserDTO; +import com.tmerclub.cloud.user.service.UserTagUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 用户和标签关联表 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@RestController("platformUserTagUserController") +@RequestMapping("/p/user_tag_user") +@Tag(name = "platform-用户和标签关联表") +public class UserTagUserController { + + @Autowired + private UserTagUserService userTagUserService; + + @PutMapping("/update_user_Tag") + @Operation(summary = "平台批量修改会员标签", description = "平台批量修改会员标签") + public ServerResponseEntity batchUpdateUserTag(@RequestBody UserAdminDTO userAdminDTO) { + return ServerResponseEntity.success(userTagUserService.batchUpdateUserTag(userAdminDTO)); + } + + @DeleteMapping("/delete_user_tag") + @Operation(summary = "删除会员的某个标签", description = "删除会员的某个标签") + public ServerResponseEntity deleteUserTag(@RequestBody UserTagUserDTO userTagUserDTO) { + return ServerResponseEntity.success(userTagUserService.removeByUserIdAndTagId(userTagUserDTO.getUserId(), userTagUserDTO.getUserTagId())); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/converter/UserStatusConverter.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/converter/UserStatusConverter.java new file mode 100644 index 0000000..416a3d7 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/converter/UserStatusConverter.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.converter; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.tmerclub.cloud.user.constant.UserStatusEnum; + +import java.util.Objects; + +/** + * Excel导出转换器,会员状态转换器,将数值转为String + * @author cl + * @date 2021-05-11 13:18:39 + */ +@SuppressWarnings("rawtypes") +public class UserStatusConverter implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Integer.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public Integer convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + return UserStatusEnum.valueOf(cellData.getStringValue()).value(); + } + + @Override + public WriteCellData convertToExcelData(Integer value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) { + return new WriteCellData(Objects.requireNonNull(UserStatusEnum.instance(value)).desc()); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/CostPerPopupDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/CostPerPopupDTO.java new file mode 100644 index 0000000..d36a0f8 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/CostPerPopupDTO.java @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.util.Date; +import java.util.List; + +/** + * 弹窗广告DTO + * @author TRACK + */ +public class CostPerPopupDTO { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "弹窗广告id") + private Long popupId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "弹窗名称") + @NotBlank(message = "弹窗名称不能为空") + private String popupName; + + @Schema(description = "状态 1.未开始 2.投放中 3.已结束") + private Integer status; + + @Schema(description = "触发页面类型 1.平台首页 2.会员中心 3.支付成功 4.店铺首页 5.商品详情") + @NotNull(message = "触发页面类型不能为空") + private Integer pageType; + + @Schema(description = "弹窗图片") + @NotBlank(message = "弹窗图片不能为空") + private String popupPic; + + @Schema(description = "跳转页面") + @NotBlank(message = "跳转页面不能为空") + private String jumpUrl; + + @Schema(description = "推送用户类型 0.所有用户 1.免费会员 2.付费会员 3.店铺客户") + @NotNull(message = "推送用户类型不能为空") + private Integer userType; + + @Schema(description = "推送开始时间") + @NotNull(message = "推送开始时间不能为空") + private Date startTime; + + @Schema(description = "推送结束时间") + @NotNull(message = "推送结束时间不能为空") + private Date endTime; + + @Schema(description = "推送频次 0.永久一次 1.每次进入 2.自定义频次") + @NotNull(message = "推送频次不能为空") + private Integer pushFrequency; + + @Schema(description = "按x天推送 最小为1 最大为31") + private Integer dayFrequency; + + @Schema(description = "按周推送 eg. 1,2 周日起始为1") + private String weekFrequency; + + @Schema(description = "关联商品id列表") + private List spuIds; + + @Schema(description = "关联会员等级id列表") + private List userLevelIds; + + public CostPerPopupDTO() { + } + + public CostPerPopupDTO(Long shopId) { + this.shopId = shopId; + } + + public Long getPopupId() { + return popupId; + } + + public void setPopupId(Long popupId) { + this.popupId = popupId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getPopupName() { + return popupName; + } + + public void setPopupName(String popupName) { + this.popupName = popupName; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPageType() { + return pageType; + } + + public void setPageType(Integer pageType) { + this.pageType = pageType; + } + + public String getPopupPic() { + return popupPic; + } + + public void setPopupPic(String popupPic) { + this.popupPic = popupPic; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getPushFrequency() { + return pushFrequency; + } + + public void setPushFrequency(Integer pushFrequency) { + this.pushFrequency = pushFrequency; + } + + public Integer getDayFrequency() { + return dayFrequency; + } + + public void setDayFrequency(Integer dayFrequency) { + this.dayFrequency = dayFrequency; + } + + public String getWeekFrequency() { + return weekFrequency; + } + + public void setWeekFrequency(String weekFrequency) { + this.weekFrequency = weekFrequency; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public List getUserLevelIds() { + return userLevelIds; + } + + public void setUserLevelIds(List userLevelIds) { + this.userLevelIds = userLevelIds; + } + + @Override + public String toString() { + return "CostPerPopupDTO{" + + "popupId=" + popupId + + ", shopId=" + shopId + + ", popupName='" + popupName + '\'' + + ", status=" + status + + ", pageType=" + pageType + + ", popupPic='" + popupPic + '\'' + + ", jumpUrl='" + jumpUrl + '\'' + + ", userType=" + userType + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", pushFrequency=" + pushFrequency + + ", dayFrequency=" + dayFrequency + + ", weekFrequency='" + weekFrequency + '\'' + + ", spuIds=" + spuIds + + ", userLevelIds=" + userLevelIds + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/RechargeCouponDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/RechargeCouponDTO.java new file mode 100644 index 0000000..5b4143b --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/RechargeCouponDTO.java @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 充值关联优惠券 + * + * @author: cl + * @date: 2021-04-29 17:39:49 + */ +public class RechargeCouponDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "优惠券ID") + private Long couponId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "优惠券名称") + private String couponName; + + @Schema(description = "副标题") + private String subTitle; + + @Schema(description = "优惠类型 1:代金券 2:折扣券 3:兑换券") + private Integer couponType; + + @Schema(description = "适用商品类型 0全部商品参与 1指定商品参与") + private Integer suitableProdType; + + @Schema(description = "获取方式 0=用户领取 1=店铺发放") + private Integer getWay; + + @Schema(description = "生效类型 1:固定时间 2:领取后生效") + private Integer validTimeType; + + @Schema(description = "使用条件") + private Long cashCondition; + + @Schema(description = "减免金额") + private Long reduceAmount; + + @Schema(description = "折扣额度") + private Double couponDiscount; + + @Schema(description = "开始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; + + @Schema(description = "领券后X天起生效") + private Integer afterReceiveDays; + + @Schema(description = "有效天数") + private Integer validDays; + + @Schema(description = "总库存") + private Integer totalStock; + + @Schema(description = "库存") + private Integer stocks; + + @Schema(description = "每个用户领券上限,如不填则默认为1") + private Integer limitNum; + + @Schema(description = "优惠券状态 0:过期 1:未过期") + private Integer status; + + @Schema(description = "优惠券投放状态(-1:取消投放 0:自动投放 1:投放 2:违规下架 3:等待审核 4:暂不投放)") + private Integer putonStatus; + + @Schema(description = "商品Id列表") + private List spuIds; + + @Schema(description = "优惠券数量") + private Integer couponNum; + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getCouponName() { + return couponName; + } + + public void setCouponName(String couponName) { + this.couponName = couponName; + } + + public String getSubTitle() { + return subTitle; + } + + public void setSubTitle(String subTitle) { + this.subTitle = subTitle; + } + + public Integer getCouponType() { + return couponType; + } + + public void setCouponType(Integer couponType) { + this.couponType = couponType; + } + + public Integer getSuitableProdType() { + return suitableProdType; + } + + public void setSuitableProdType(Integer suitableProdType) { + this.suitableProdType = suitableProdType; + } + + public Integer getGetWay() { + return getWay; + } + + public void setGetWay(Integer getWay) { + this.getWay = getWay; + } + + public Integer getValidTimeType() { + return validTimeType; + } + + public void setValidTimeType(Integer validTimeType) { + this.validTimeType = validTimeType; + } + + public Long getCashCondition() { + return cashCondition; + } + + public void setCashCondition(Long cashCondition) { + this.cashCondition = cashCondition; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Double getCouponDiscount() { + return couponDiscount; + } + + public void setCouponDiscount(Double couponDiscount) { + this.couponDiscount = couponDiscount; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getAfterReceiveDays() { + return afterReceiveDays; + } + + public void setAfterReceiveDays(Integer afterReceiveDays) { + this.afterReceiveDays = afterReceiveDays; + } + + public Integer getValidDays() { + return validDays; + } + + public void setValidDays(Integer validDays) { + this.validDays = validDays; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getStocks() { + return stocks; + } + + public void setStocks(Integer stocks) { + this.stocks = stocks; + } + + public Integer getLimitNum() { + return limitNum; + } + + public void setLimitNum(Integer limitNum) { + this.limitNum = limitNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPutonStatus() { + return putonStatus; + } + + public void setPutonStatus(Integer putonStatus) { + this.putonStatus = putonStatus; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public Integer getCouponNum() { + return couponNum; + } + + public void setCouponNum(Integer couponNum) { + this.couponNum = couponNum; + } + + @Override + public String toString() { + return "RechargeCouponDTO{" + + "couponId=" + couponId + + ", shopId=" + shopId + + ", couponName='" + couponName + '\'' + + ", subTitle='" + subTitle + '\'' + + ", couponType=" + couponType + + ", suitableProdType=" + suitableProdType + + ", getWay=" + getWay + + ", validTimeType=" + validTimeType + + ", cashCondition=" + cashCondition + + ", reduceAmount=" + reduceAmount + + ", couponDiscount=" + couponDiscount + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", afterReceiveDays=" + afterReceiveDays + + ", validDays=" + validDays + + ", totalStock=" + totalStock + + ", stocks=" + stocks + + ", limitNum=" + limitNum + + ", status=" + status + + ", putonStatus=" + putonStatus + + ", spuIds=" + spuIds + + ", couponNum=" + couponNum + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/ScoreDataDto.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/ScoreDataDto.java new file mode 100644 index 0000000..2485930 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/ScoreDataDto.java @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * @author CDT + * @date 2021/4/12 + */ + +public class ScoreDataDto implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 签到积分列表 + */ + @Schema(description = "签到积分列表") + private List scoreList; + /** + * 用户积分 + */ + @Schema(description = "用户积分") + private Long score; + + /** + * 当天签到可领积分 + */ + @Schema(description = "当天签到可领积分") + private Integer curScore; + + /** + * 上次结算过期的积分 + */ + @Schema(description = "上次结算过期的积分") + private Integer expireScore; + /** + * 过期时间(年) + */ + @Schema(description = "过期时间(年)") + private Integer expireYear; + /** + * 等级名称 + */ + @Schema(description = "等级名称") + private String levelName; + /** + * 等级类型 0 普通会员 1 付费会员 + */ + @Schema(description = "等级类型 0 普通会员 1 付费会员") + private Integer levelType; + /** + * 用户当前成长值 + */ + @Schema(description = "用户当前成长值") + private Integer growth; + /** + * 注册可获取积分 + */ + @Schema(description = "注册可获取积分") + private Integer registerScore; + /** + * 购物可获取积分 + */ + @Schema(description = "购物可获取积分") + private Double shopScore; + + /** + * 是否已经签到 1是 0否 + */ + @Schema(description = "是否已经签到 1是 0否") + private Integer isSignIn; + + /** + * 是否已经注册 1是 0否 + */ + @Schema(description = "是否已经注册 1是 0否") + private Integer isRegister; + + /** + * 签到第几天 + */ + @Schema(description = "签到第几天") + private Integer signInCount; + + public Integer getCurScore() { + return curScore; + } + + public void setCurScore(Integer curScore) { + this.curScore = curScore; + } + + public List getScoreList() { + return scoreList; + } + + public void setScoreList(List scoreList) { + this.scoreList = scoreList; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Integer getExpireScore() { + return expireScore; + } + + public void setExpireScore(Integer expireScore) { + this.expireScore = expireScore; + } + + public Integer getExpireYear() { + return expireYear; + } + + public void setExpireYear(Integer expireYear) { + this.expireYear = expireYear; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Integer getGrowth() { + return growth; + } + + public void setGrowth(Integer growth) { + this.growth = growth; + } + + public Integer getRegisterScore() { + return registerScore; + } + + public void setRegisterScore(Integer registerScore) { + this.registerScore = registerScore; + } + + public Double getShopScore() { + return shopScore; + } + + public void setShopScore(Double shopScore) { + this.shopScore = shopScore; + } + + public Integer getIsSignIn() { + return isSignIn; + } + + public void setIsSignIn(Integer isSignIn) { + this.isSignIn = isSignIn; + } + + public Integer getIsRegister() { + return isRegister; + } + + public void setIsRegister(Integer isRegister) { + this.isRegister = isRegister; + } + + public Integer getSignInCount() { + return signInCount; + } + + public void setSignInCount(Integer signInCount) { + this.signInCount = signInCount; + } + + @Override + public String toString() { + return "ScoreDataDto{" + + "scoreList=" + scoreList + + ", score=" + score + + ", curScore=" + curScore + + ", expireScore=" + expireScore + + ", expireYear=" + expireYear + + ", levelName='" + levelName + '\'' + + ", levelType=" + levelType + + ", growth=" + growth + + ", registerScore=" + registerScore + + ", shopScore=" + shopScore + + ", isSignIn=" + isSignIn + + ", isRegister=" + isRegister + + ", signInCount=" + signInCount + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/ShopCustomerDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/ShopCustomerDTO.java new file mode 100644 index 0000000..4adcb92 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/ShopCustomerDTO.java @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * DTO + * + * @author FrozenWatermelon + * @date 2023-01-15 15:53:16 + */ +public class ShopCustomerDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺客户id") + private Long shopCustomerId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "手机号码") + private String phone; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "会员类型(-1:客户,0:免费会员,1:付费会员)") + private Integer levelType; + + @Schema(description = "会员等级Id") + private Long levelId; + + @Schema(description = "会员等级") + private Integer level; + + @Schema(description = "成长值") + private Integer growth; + + @Schema(description = "会员注册时间") + private Date registTime; + + @Schema(description = "付费会员到期时间") + private Date vipEndTime; + + private List userIds; + + private List shopIds; + + @Schema(description = "排序:1消费金额正序,2消费倒序,3实付金额正序,4实付金额倒序,5消费次数正序,6消费次数倒序,7下单次数正序, 8下单次数倒序, 9平均折扣正序, 10平均折扣倒序 11退款次数正序 12退款次数正序 13退款金额正序 14退款金额倒序") + private Integer sort; + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public Long getShopCustomerId() { + return shopCustomerId; + } + + public void setShopCustomerId(Long shopCustomerId) { + this.shopCustomerId = shopCustomerId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Long getLevelId() { + return levelId; + } + + public void setLevelId(Long levelId) { + this.levelId = levelId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getGrowth() { + return growth; + } + + public void setGrowth(Integer growth) { + this.growth = growth; + } + + public Date getRegistTime() { + return registTime; + } + + public void setRegistTime(Date registTime) { + this.registTime = registTime; + } + + public Date getVipEndTime() { + return vipEndTime; + } + + public void setVipEndTime(Date vipEndTime) { + this.vipEndTime = vipEndTime; + } + + @Override + public String toString() { + return "ShopCustomerDTO{" + + "shopCustomerId=" + shopCustomerId + + ", userId=" + userId + + ", nickName='" + nickName + '\'' + + ", phone='" + phone + '\'' + + ", shopId=" + shopId + + ", levelType=" + levelType + + ", levelId=" + levelId + + ", level=" + level + + ", growth=" + growth + + ", registTime=" + registTime + + ", vipEndTime=" + vipEndTime + + ", userIds=" + userIds + + ", shopIds=" + shopIds + + ", sort=" + sort + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/ShopCustomerExcelDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/ShopCustomerExcelDTO.java new file mode 100644 index 0000000..3e2e6e8 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/ShopCustomerExcelDTO.java @@ -0,0 +1,87 @@ +package com.tmerclub.cloud.user.dto; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.tmerclub.cloud.common.model.ExcelModel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 客户导入信息 + * @author: zsm + * @date: 2023/1/16 10:31 + */ +public class ShopCustomerExcelDTO extends ExcelModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "导入客户信息模板"; + public static final String SHEET_NAME = "sheet"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 1; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty(value = "序号", index = 0) + private String seq; + + @ExcelProperty(value = "手机号(必填)", index = 1) + @ColumnWidth(20) + private String phone; + + @ExcelIgnore + private Long shopId; + + @ExcelIgnore + private Long userId; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + @Override + public String toString() { + return "ShopCustomerExcelDTO{" + + "seq='" + seq + '\'' + + ", phone='" + phone + '\'' + + ", shopId=" + shopId + + ", userId=" + userId + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserAddrDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserAddrDTO.java new file mode 100644 index 0000000..5f9ea5c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserAddrDTO.java @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户地址DTO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:50:02 + */ +public class UserAddrDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "ID") + private Long addrId; + + @Schema(description = "手机") + private String mobile; + + @Schema(description = "是否默认地址 1是") + private Integer isDefault; + + @Schema(description = "收货人") + private String consignee; + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Schema(description = "邮编") + private String postCode; + + @Schema(description = "地址") + private String addr; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + public Long getAddrId() { + return addrId; + } + + public void setAddrId(Long addrId) { + this.addrId = addrId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "UserAddrDTO{" + + "addrId=" + addrId + + ",mobile=" + mobile + + ",isDefault=" + isDefault + + ",consignee=" + consignee + + ",provinceId=" + provinceId + + ",province=" + province + + ",cityId=" + cityId + + ",city=" + city + + ",areaId=" + areaId + + ",area=" + area + + ",postCode=" + postCode + + ",addr=" + addr + + ",lng=" + lng + + ",lat=" + lat + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserAdminDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserAdminDTO.java new file mode 100644 index 0000000..3f0e1f8 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserAdminDTO.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import com.tmerclub.cloud.common.util.PriceUtil; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 商品信息 + * + * @author YXF + * @date 2020-12-23 15:27:24 + */ +public class UserAdminDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户id列表 + */ + private List userIds; + /** + * 正数代表增加,负数代表减少,只能输入整数, + * 根据修改后的成长值重新计算会员等级 + */ + @Max(value = Integer.MAX_VALUE, message = "最大值不能超过" + Integer.MAX_VALUE) + @Min(value = Integer.MIN_VALUE, message = "最小值不能小于" + Integer.MIN_VALUE) + private Integer growth; + /** + * 修改成长值,是否赠送礼物 + * 0不赠送,1赠送 + */ + private Integer isSendReward; + /** + * 正数代表增加,负数代表减少,只能输入整数, + * 修改会员积分 + */ + @Max(value = Long.MAX_VALUE, message = "最大值不能超过" + Long.MAX_VALUE) + @Min(value = Long.MIN_VALUE, message = "最小值不能小于" + Long.MIN_VALUE) + private Long score; + + /** + * 标签id + */ + private List tagList; + + /** + * 修改余额 + * 正数代表增加,负数代表减少,只能输入数字,最多两位小数 + */ + @Max(value = PriceUtil.MAX_AMOUNT, message = "最大值不能超过" + PriceUtil.MAX_AMOUNT) + @Min(value = Long.MIN_VALUE, message = "最小值不能小于" + Long.MIN_VALUE) + private BigDecimal balanceValue; + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + + public Integer getGrowth() { + return growth; + } + + public void setGrowth(Integer growth) { + this.growth = growth; + } + + public Integer getIsSendReward() { + return isSendReward; + } + + public void setIsSendReward(Integer isSendReward) { + this.isSendReward = isSendReward; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public List getTagList() { + return tagList; + } + + public void setTagList(List tagList) { + this.tagList = tagList; + } + + public BigDecimal getBalanceValue() { + return balanceValue; + } + + public void setBalanceValue(BigDecimal balanceValue) { + this.balanceValue = balanceValue; + } + + @Override + public String toString() { + return "UserAdminDTO{" + + "userIds=" + userIds + + ", growthValue=" + growth + + ", isSendReward=" + isSendReward + + ", scoreValue=" + score + + ", tagList=" + tagList + + ", balanceValue=" + balanceValue + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserBalanceRechargeOrderDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserBalanceRechargeOrderDTO.java new file mode 100644 index 0000000..e93f766 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserBalanceRechargeOrderDTO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 用户余额充值记录 + * + * @author FrozenWatermelon + */ +public class UserBalanceRechargeOrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "充值金额id") + private Long rechargeId; + @Schema(description = "充值金额") + private BigDecimal amount; + + public Long getRechargeId() { + return rechargeId; + } + + public void setRechargeId(Long rechargeId) { + this.rechargeId = rechargeId; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + @Override + public String toString() { + return "userBalanceLogDTO{" + + "rechargeId=" + rechargeId + + ", amount=" + amount + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserDTO.java new file mode 100644 index 0000000..8222e04 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserDTO.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户表DTO + * + * @author YXF + * @date 2020-12-08 11:18:04 + */ +public class UserDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "ID") + private Long userId; + + @Schema(description = "用户昵称") + @Length(min = 2, max = 12) + private String nickName; + + @Schema(description = "M(男) or F(女)") + @Max(value = 1, message = "性别只能为男,女") + @Max(value = 0, message = "性别只能为男,女") + private String sex; + + @Schema(description = "例如:2009-11-27") + private String birthDate; + + @Schema(description = "头像图片路径") + private String pic; + + @Schema(description = "状态 1:正常 0:禁用 -1:已注销") + private Integer status; + + @Schema(description = "会员等级(冗余字段)") + private Long level; + + @Schema(description = "vip结束时间") + private Date vipEndTime; + + @Schema(description = "等级条件 0 普通会员 1 付费会员") + private Integer levelType; + + @Schema(description = "用户付费会员等级 商品个性化推荐 1:开启 0:关闭") + private Integer prodRecommendation; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getBirthDate() { + return birthDate; + } + + public void setBirthDate(String birthDate) { + this.birthDate = birthDate; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getLevel() { + return level; + } + + public void setLevel(Long level) { + this.level = level; + } + + public Date getVipEndTime() { + return vipEndTime; + } + + public void setVipEndTime(Date vipEndTime) { + this.vipEndTime = vipEndTime; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Integer getProdRecommendation() { + return prodRecommendation; + } + + public void setProdRecommendation(Integer prodRecommendation) { + this.prodRecommendation = prodRecommendation; + } + + @Override + public String toString() { + return "UserDTO{" + + "userId=" + userId + + ", nickName='" + nickName + '\'' + + ", sex='" + sex + '\'' + + ", birthDate='" + birthDate + '\'' + + ", pic='" + pic + '\'' + + ", status=" + status + + ", level=" + level + + ", vipEndTime=" + vipEndTime + + ", levelType=" + levelType + + ", prodRecommendation=" + prodRecommendation + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserExcelDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserExcelDTO.java new file mode 100644 index 0000000..083cdd9 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserExcelDTO.java @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.tmerclub.cloud.common.model.ExcelModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户导入信息 + * + * @author cl + * @date 2021-05-12 10:13:29 + */ +public class UserExcelDTO extends ExcelModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "导入用户信息模板"; + public static final String SHEET_NAME = "sheet"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 1; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + /** + * 需要批注的列 + */ + public static final int[] COMMENT_INDEX = {2}; + + public static final String[] COMMENTS = { + "由字母、数字和特殊符号三种字符组成8-20位半角字符,区分大小写" + }; + + @ExcelProperty(value = "序号", index = 0) + private String seq; + + @ExcelProperty(value = "手机号(必填)", index = 1) + @ColumnWidth(20) + private String phone; + + @ExcelProperty(value = "密码(必填)", index = 2) + @ColumnWidth(16) + private String password; + + @ExcelProperty(value = "用户昵称(最多15个字符)", index = 3) + @ColumnWidth(30) + private String nickName; + + @ExcelProperty(value = "会员类型(0普通会员/1付费会员(不填默认为普通会员)", index = 4) + @ColumnWidth(15) + private Integer levelType; + + @ExcelProperty(value = "付费会员等级(付费会员必填,普通会员以成长值为准)", index = 5) + @ColumnWidth(15) + private String level; + + /** + * 注解@ContentStyle(dataFormat = 49) 设置单元格格式为文本格式 + * 只会将对象属性所在单元格设置为文本格式,所在列的其他单元格还是为自定义格式 + */ + @DateTimeFormat("yyyy-MM-dd") + @ExcelProperty(value = "vip结束时间(格式:2021-08-08,会员类型是1则必填)", index = 6) + @ColumnWidth(25) + private Date vipEndTime; + + + @ExcelProperty(value = "性别(0男/1女)", index = 8) + private String sex; + + @ExcelProperty(value = "生日(格式:2009-11-27)", index = 9) + @ColumnWidth(20) + private String birthDate; + + @ExcelProperty(value = "积分(限整数)", index = 10) + private String score; + + @ExcelProperty(value = "余额(限整数)", index = 11) + private String balance; + + @ExcelProperty(value = "成长值(限整数)", index = 12) + private String growth; + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public String getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public Date getVipEndTime() { + return vipEndTime; + } + + public void setVipEndTime(Date vipEndTime) { + this.vipEndTime = vipEndTime; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getBirthDate() { + return birthDate; + } + + public void setBirthDate(String birthDate) { + this.birthDate = birthDate; + } + + public String getScore() { + return score; + } + + public void setScore(String score) { + this.score = score; + } + + public String getBalance() { + return balance; + } + + public void setBalance(String balance) { + this.balance = balance; + } + + public String getGrowth() { + return growth; + } + + public void setGrowth(String growth) { + this.growth = growth; + } + + @Override + public String toString() { + return "UserExcelDTO{" + + "seq='" + seq + '\'' + + ", phone='" + phone + '\'' + + ", password='" + password + '\'' + + ", levelType=" + levelType + + ", level=" + level + + ", vipEndTime=" + vipEndTime + + ", nickName='" + nickName + '\'' + + ", sex='" + sex + '\'' + + ", birthDate='" + birthDate + '\'' + + ", score='" + score + '\'' + + ", balance='" + balance + '\'' + + ", growth='" + growth + '\'' + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserExtensionDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserExtensionDTO.java new file mode 100644 index 0000000..d3d00d3 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserExtensionDTO.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户扩展信息DTO + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserExtensionDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long userExtensionId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "用户等级") + private Integer level; + + @Schema(description = "等级条件 0 普通会员 1 付费会员") + private Integer levelType; + + @Schema(description = "用户当前成长值") + private Integer growth; + + @Schema(description = "用户积分") + private Long score; + + @Schema(description = "用户总余额") + private Long balance; + + @Schema(description = "用户实际余额") + private Long actualBalance; + + @Schema(description = "乐观锁") + private Integer version; + + @Schema(description = "连续签到天数") + private Integer signDay; + + @Schema(description = "改变余额数值") + private Long changeBalance; + + @Schema(description = "更新时间") + protected Date updateTime; + + + public Integer getSignDay() { + return signDay; + } + + public void setSignDay(Integer signDay) { + this.signDay = signDay; + } + + public Long getUserExtensionId() { + return userExtensionId; + } + + public void setUserExtensionId(Long userExtensionId) { + this.userExtensionId = userExtensionId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Integer getGrowth() { + return growth; + } + + public void setGrowth(Integer growth) { + this.growth = growth; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + + public Long getActualBalance() { + return actualBalance; + } + + public void setActualBalance(Long actualBalance) { + this.actualBalance = actualBalance; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public Long getChangeBalance() { + return changeBalance; + } + + public void setChangeBalance(Long changeBalance) { + this.changeBalance = changeBalance; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "UserExtensionDTO{" + + "userExtensionId=" + userExtensionId + + ", userId=" + userId + + ", level=" + level + + ", levelType=" + levelType + + ", growth=" + growth + + ", score=" + score + + ", balance=" + balance + + ", actualBalance=" + actualBalance + + ", version=" + version + + ", signDay=" + signDay + + ", changeBalance=" + changeBalance + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserGrowthLogDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserGrowthLogDTO.java new file mode 100644 index 0000000..994cd3a --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserGrowthLogDTO.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户成长值记录DTO + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserGrowthLogDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "成长值获取记录表") + private Long logId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "来源 1 订单") + private Integer source; + + @Schema(description = "关联业务id") + private Long bizId; + + @Schema(description = "变更成长值") + private Integer changeGrowth; + + @Schema(description = "备注") + private String remarks; + + public Long getLogId() { + return logId; + } + + public void setLogId(Long logId) { + this.logId = logId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getChangeGrowth() { + return changeGrowth; + } + + public void setChangeGrowth(Integer changeGrowth) { + this.changeGrowth = changeGrowth; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "UserGrowthLogDTO{" + + "logId=" + logId + + ",userId=" + userId + + ",source=" + source + + ",bizId=" + bizId + + ",changeGrowth=" + changeGrowth + + ",remarks=" + remarks + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelDTO.java new file mode 100644 index 0000000..17bebd4 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelDTO.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 会员等级表DTO + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserLevelDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键") + private Long userLevelId; + + @NotNull(message = "等级不能为空") + @Schema(description = "等级") + private Integer level; + + @NotNull(message = "等级名称不能为空") + @Schema(description = "等级名称") + private String levelName; + + @NotNull(message = "等级类型不能为空") + @Schema(description = "等级类型 0:普通会员 1:付费会员") + private Integer levelType; + + @Schema(description = "所需成长值") + private Integer needGrowth; + + @Schema(description = "1:已更新 0:等待更新(等级修改后,用户等级的更新)") + private Integer updateStatus; + + @Schema(description = "付费会员,是否可以招募会员;1可以招募,0停止招募") + private Integer recruitStatus; + + @Schema(description = "权益id数组") + private List userRightsIds; + + @Schema(description = "等级期数列表") + private List userLevelTerms; + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Integer getNeedGrowth() { + return needGrowth; + } + + public void setNeedGrowth(Integer needGrowth) { + this.needGrowth = needGrowth; + } + + public Integer getUpdateStatus() { + return updateStatus; + } + + public void setUpdateStatus(Integer updateStatus) { + this.updateStatus = updateStatus; + } + + public List getUserRightsIds() { + return userRightsIds; + } + + public void setUserRightsIds(List userRightsIds) { + this.userRightsIds = userRightsIds; + } + + public List getUserLevelTerms() { + return userLevelTerms; + } + + public void setUserLevelTerms(List userLevelTerms) { + this.userLevelTerms = userLevelTerms; + } + + public Integer getRecruitStatus() { + return recruitStatus; + } + + public void setRecruitStatus(Integer recruitStatus) { + this.recruitStatus = recruitStatus; + } + + @Override + public String toString() { + return "UserLevelDTO{" + + "userLevelId=" + userLevelId + + ", level=" + level + + ", levelName='" + levelName + '\'' + + ", levelType=" + levelType + + ", needGrowth=" + needGrowth + + ", updateStatus=" + updateStatus + + ", recruitStatus=" + recruitStatus + + ", userRightsIds=" + userRightsIds + + ", userLevelTerms=" + userLevelTerms + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelLogDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelLogDTO.java new file mode 100644 index 0000000..7b1ab6d --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelLogDTO.java @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户等级记录DTO + * + * @author FrozenWatermelon + * @date 2021-05-14 11:04:52 + */ +public class UserLevelLogDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "等级记录表") + private Long levelLogId; + + @Schema(description = "用户id") + private String userId; + + @Schema(description = "用户名称") + private String nickName; + + @Schema(description = "手机号码") + private String phone; + + @Schema(description = "变更类型 -1降级 0不变 1升级") + private Integer levelIoType; + + @Schema(description = "等级变更原因1.成长值不足 2.成长值足够 3.购买会员 4.续费会员 5.会员到期") + private Integer levelChangeReason; + + @Schema(description = "变更之前等级") + private Integer beforeLevel; + + @Schema(description = "变更之前的等级类型 0:普通会员 1:付费会员") + private Integer beforeLevelType; + + @Schema(description = "变更之后的等级") + private Integer afterLevel; + + @Schema(description = "变更之后的等级类型 0:普通会员 1:付费会员") + private Integer afterLevelType; + + @Schema(description = "支付单号") + private Long payId; + + @Schema(description = "是否支付1已支付0未支付") + private Integer payType; + + @Schema(description = "是否支付1已支付0未支付") + private Integer isPayed; + + @Schema(description = "支付金额") + private Long payAmount; + + @Schema(description = "升级时间") + private Date createTime; + + @Schema(description = "起始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createStartTime; + + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createEndTime; + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public Date getCreateStartTime() { + return createStartTime; + } + + public void setCreateStartTime(Date createStartTime) { + this.createStartTime = createStartTime; + } + + public Date getCreateEndTime() { + return createEndTime; + } + + public void setCreateEndTime(Date createEndTime) { + this.createEndTime = createEndTime; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getLevelLogId() { + return levelLogId; + } + + public void setLevelLogId(Long levelLogId) { + this.levelLogId = levelLogId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Integer getLevelIoType() { + return levelIoType; + } + + public void setLevelIoType(Integer levelIoType) { + this.levelIoType = levelIoType; + } + + public Integer getLevelChangeReason() { + return levelChangeReason; + } + + public void setLevelChangeReason(Integer levelChangeReason) { + this.levelChangeReason = levelChangeReason; + } + + public Integer getBeforeLevel() { + return beforeLevel; + } + + public void setBeforeLevel(Integer beforeLevel) { + this.beforeLevel = beforeLevel; + } + + public Integer getBeforeLevelType() { + return beforeLevelType; + } + + public void setBeforeLevelType(Integer beforeLevelType) { + this.beforeLevelType = beforeLevelType; + } + + public Integer getAfterLevel() { + return afterLevel; + } + + public void setAfterLevel(Integer afterLevel) { + this.afterLevel = afterLevel; + } + + public Integer getAfterLevelType() { + return afterLevelType; + } + + public void setAfterLevelType(Integer afterLevelType) { + this.afterLevelType = afterLevelType; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + @Override + public String toString() { + return "UserLevelLogDTO{" + + "levelLogId=" + levelLogId + + ", userId='" + userId + '\'' + + ", nickName='" + nickName + '\'' + + ", phone='" + phone + '\'' + + ", levelIoType=" + levelIoType + + ", levelChangeReason=" + levelChangeReason + + ", beforeLevel=" + beforeLevel + + ", beforeLevelType=" + beforeLevelType + + ", afterLevel=" + afterLevel + + ", afterLevelType=" + afterLevelType + + ", payId=" + payId + + ", payType=" + payType + + ", isPayed=" + isPayed + + ", payAmount=" + payAmount + + ", createTime=" + createTime + + ", createStartTime=" + createStartTime + + ", createEndTime=" + createEndTime + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelRechargeOrderDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelRechargeOrderDTO.java new file mode 100644 index 0000000..315fe28 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelRechargeOrderDTO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户会员购买 + * + * @author FrozenWatermelon + */ +public class UserLevelRechargeOrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "会员等级id") + private Long userLevelId; + + @Schema(description = "期数id(月/季/年对应的付费金额id)") + private Long levelTermId; + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + public Long getLevelTermId() { + return levelTermId; + } + + public void setLevelTermId(Long levelTermId) { + this.levelTermId = levelTermId; + } + + @Override + public String toString() { + return "UserLevelRechargeOrderDTO{" + + "userLevelId=" + userLevelId + + ", levelTermId=" + levelTermId + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelRightsDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelRightsDTO.java new file mode 100644 index 0000000..fa773e8 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelRightsDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 等级-权益关联信息DTO + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserLevelRightsDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "等级-权益关联id") + private Long levelRightsId; + + @Schema(description = "等级id") + private Long userLevelId; + + @Schema(description = "权益id") + private Long rightsId; + + public Long getLevelRightsId() { + return levelRightsId; + } + + public void setLevelRightsId(Long levelRightsId) { + this.levelRightsId = levelRightsId; + } + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + public Long getRightsId() { + return rightsId; + } + + public void setRightsId(Long rightsId) { + this.rightsId = rightsId; + } + + @Override + public String toString() { + return "UserLevelRightsDTO{" + + "levelRightsId=" + levelRightsId + + ",userLevelId=" + userLevelId + + ",rightsId=" + rightsId + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRechargeCouponDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRechargeCouponDTO.java new file mode 100644 index 0000000..bfa35c0 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRechargeCouponDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 余额优惠券关联表DTO + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public class UserRechargeCouponDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "充值id") + private Long rechargeId; + + @Schema(description = "优惠券id") + private Long couponId; + + @Schema(description = "优惠券数量") + private Integer couponNum; + + public Long getRechargeId() { + return rechargeId; + } + + public void setRechargeId(Long rechargeId) { + this.rechargeId = rechargeId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Integer getCouponNum() { + return couponNum; + } + + public void setCouponNum(Integer couponNum) { + this.couponNum = couponNum; + } + + @Override + public String toString() { + return "UserRechargeCouponDTO{" + + "rechargeId=" + rechargeId + + ",couponId=" + couponId + + ",couponNum=" + couponNum + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRechargeDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRechargeDTO.java new file mode 100644 index 0000000..d64cb1b --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRechargeDTO.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 余额充值级别表DTO + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public class UserRechargeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "充值id") + private Long rechargeId; + + @Schema(description = "充值余额标题") + private String rechargeTitle; + + @Schema(description = "充值金额") + private Long rechargeAmount; + + @Schema(description = "背景图片") + private String img; + + @Schema(description = "赠送金额") + private Long presAmount; + + @Schema(description = "赠送积分") + private Long presScore; + + @Schema(description = "赠送成长值") + private Integer presGrowth; + + @Schema(description = "顺序") + private Integer seq; + + @Schema(description = "优惠券信息") + private List couponList; + + public Long getRechargeId() { + return rechargeId; + } + + public void setRechargeId(Long rechargeId) { + this.rechargeId = rechargeId; + } + + public String getRechargeTitle() { + return rechargeTitle; + } + + public void setRechargeTitle(String rechargeTitle) { + this.rechargeTitle = rechargeTitle; + } + + public Long getRechargeAmount() { + return rechargeAmount; + } + + public void setRechargeAmount(Long rechargeAmount) { + this.rechargeAmount = rechargeAmount; + } + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public Long getPresAmount() { + return presAmount; + } + + public void setPresAmount(Long presAmount) { + this.presAmount = presAmount; + } + + public Long getPresScore() { + return presScore; + } + + public void setPresScore(Long presScore) { + this.presScore = presScore; + } + + public Integer getPresGrowth() { + return presGrowth; + } + + public void setPresGrowth(Integer presGrowth) { + this.presGrowth = presGrowth; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public List getCouponList() { + return couponList; + } + + public void setCouponList(List couponList) { + this.couponList = couponList; + } + + @Override + public String toString() { + return "UserRechargeDTO{" + + "rechargeId=" + rechargeId + + ",rechargeTitle=" + rechargeTitle + + ",rechargeAmount=" + rechargeAmount + + ",img=" + img + + ",presAmount=" + presAmount + + ",presScore=" + presScore + + ",presGrowth=" + presGrowth + + ",seq=" + seq + + ",couponList=" + couponList + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRightsCouponDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRightsCouponDTO.java new file mode 100644 index 0000000..86fb694 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRightsCouponDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * DTO + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserRightsCouponDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "权益优惠券关联id") + private Long rightsCouponId; + + @Schema(description = "权益id") + private Long rightsId; + + @Schema(description = "优惠券id") + private Long couponId; + + public Long getRightsCouponId() { + return rightsCouponId; + } + + public void setRightsCouponId(Long rightsCouponId) { + this.rightsCouponId = rightsCouponId; + } + + public Long getRightsId() { + return rightsId; + } + + public void setRightsId(Long rightsId) { + this.rightsId = rightsId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + @Override + public String toString() { + return "UserRightsCouponDTO{" + + "rightsCouponId=" + rightsCouponId + + ",rightsId=" + rightsId + + ",couponId=" + couponId + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRightsDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRightsDTO.java new file mode 100644 index 0000000..d464afa --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserRightsDTO.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 用户权益信息DTO + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserRightsDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "权益id") + private Long rightsId; + + @Schema(description = "权益名称") + private String rightsName; + + @Schema(description = "权益图标") + private String icon; + + @Schema(description = "权益简介") + private String description; + + @Schema(description = "权益详情") + private String details; + + @Schema(description = "状态:-1: 删除 0:禁用 1:正常(仅用于系统核销)") + private Integer status; + + @Schema(description = "排序 从小到大") + private Integer seq; + + @Schema(description = "权益类型[0.自定义 1.积分回馈倍率 2.优惠券 3.积分赠送(数量) 4.会员折扣 5.包邮类型]") + private Integer rightsType; + + @Schema(description = "积分回馈倍率") + private Integer rateScore; + + @Schema(description = "赠送积分") + private Long presScore; + + @Schema(description = "会员折扣") + private Integer discount; + + @Schema(description = "折扣范围[0.全平台 1.自营店]") + private Integer discountRange; + + @Schema(description = "包邮类型[1.全平台包邮 2.自营店包邮]") + private Integer freeFeeType; + + @Schema(description = "优惠券id列表") + private List couponIds; + + public Long getRightsId() { + return rightsId; + } + + public void setRightsId(Long rightsId) { + this.rightsId = rightsId; + } + + public String getRightsName() { + return rightsName; + } + + public void setRightsName(String rightsName) { + this.rightsName = rightsName; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getDetails() { + return details; + } + + public void setDetails(String details) { + this.details = details; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getRightsType() { + return rightsType; + } + + public void setRightsType(Integer rightsType) { + this.rightsType = rightsType; + } + + public Integer getRateScore() { + return rateScore; + } + + public void setRateScore(Integer rateScore) { + this.rateScore = rateScore; + } + + public Long getPresScore() { + return presScore; + } + + public void setPresScore(Long presScore) { + this.presScore = presScore; + } + + public Integer getDiscount() { + return discount; + } + + public void setDiscount(Integer discount) { + this.discount = discount; + } + + public Integer getDiscountRange() { + return discountRange; + } + + public void setDiscountRange(Integer discountRange) { + this.discountRange = discountRange; + } + + public Integer getFreeFeeType() { + return freeFeeType; + } + + public void setFreeFeeType(Integer freeFeeType) { + this.freeFeeType = freeFeeType; + } + + public List getCouponIds() { + return couponIds; + } + + public void setCouponIds(List couponIds) { + this.couponIds = couponIds; + } + + @Override + public String toString() { + return "UserRightsDTO{" + + "rightsId=" + rightsId + + ",rightsName=" + rightsName + + ",icon=" + icon + + ",description=" + description + + ",details=" + details + + ",status=" + status + + ",seq=" + seq + + ",rightsType=" + rightsType + + ",rateScore=" + rateScore + + ",presScore=" + presScore + + ",discount=" + discount + + ",discountRange=" + discountRange + + ",freeFeeType=" + freeFeeType + + ",couponIds=" + couponIds + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserTagDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserTagDTO.java new file mode 100644 index 0000000..7e81d9c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserTagDTO.java @@ -0,0 +1,536 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.*; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 客户标签DTO + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserTagDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 新增标签校验 + */ + public interface AddUserTag { + } + + /** + * 修改标签校验 + */ + public interface UpdateUserTag { + } + + @Schema(description = "自增id") + @NotNull(message = "自增id不能为空", groups = UpdateUserTag.class) + private Long userTagId; + + @Schema(description = "标签名字") + @NotBlank(message = "标签名字不能为空", groups = {AddUserTag.class, UpdateUserTag.class}) + private String tagName; + + @Schema(description = "标签类型0手动1条件") + @Max(value = 1, message = "只能为0或1", groups = AddUserTag.class) + @Min(value = 0, message = "只能为0或1", groups = AddUserTag.class) + @NotNull(message = "标签类型不能为空。", groups = AddUserTag.class) + private Integer tagType; + + @Schema(description = "系统标签是否开启") + @Max(value = 1, message = "只能为0或1", groups = UpdateUserTag.class) + @Min(value = 0, message = "只能为0或1", groups = UpdateUserTag.class) + private Integer isSysTurnOn; + + @Schema(description = "成为客户开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date registerMinTime; + + @Schema(description = "成为客户结束时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date registerMaxTime; + + @Schema(description = "清空成为客户时间标记") + private Boolean clearRegisterTime; + + @Schema(description = "关注开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date subscribeMinTime; + + @Schema(description = "关注结束时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date subscribeMaxTime; + + @Schema(description = "清空关注时间标记") + private Boolean clearSubscribeTime; + + @Schema(description = "成为会员开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date toBeMemberMinTime; + + @Schema(description = "成为会员结束时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date toBeMemberMaxTime; + + @Schema(description = "清空成为会员时间标记") + private Boolean clearToBeMemberTime; + + @Schema(description = "最近消费时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天)") + @Max(value = 8, message = "最大值为8", groups = {AddUserTag.class, UpdateUserTag.class}) + @Min(value = 0, message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private Integer recentPurchaseTime; + + @Schema(description = "清空成为会员时间标记") + private Boolean clearRecentPurchaseTime; + + @Schema(description = "消费次数时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天)") + @Max(value = 8, message = "最大值为8", groups = {AddUserTag.class, UpdateUserTag.class}) + @Min(value = 0, message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private Integer purchaseNumTime; + + @Schema(description = "消费次数最小次数") + @Max(value = 100000, message = "最大值为100000", groups = {AddUserTag.class, UpdateUserTag.class}) + @Min(value = 0, message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private Long purchaseNumMinNum; + + @Schema(description = "消费次数最大次数") + @Max(value = 100000, message = "最大值为100000", groups = {AddUserTag.class, UpdateUserTag.class}) + @Min(value = 0, message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private Long purchaseNumMaxNum; + + @Schema(description = "清空消费次数标记") + private Boolean clearPurchaseNum; + + @Schema(description = "消费金额时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天)") + @Max(value = 8, message = "最大值为8", groups = {AddUserTag.class, UpdateUserTag.class}) + @Min(value = 0, message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private Integer purchaseAmountTime; + + @Schema(description = "消费金额最小金额") + @DecimalMax(value = "100000000", message = "最大值为100000000", groups = {AddUserTag.class, UpdateUserTag.class}) + @DecimalMin(value = "0", message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private BigDecimal purchaseAmountMinAmount; + + @Schema(description = "消费金额最大金额") + @DecimalMax(value = "100000000", message = "最大值为100000000", groups = {AddUserTag.class, UpdateUserTag.class}) + @DecimalMin(value = "0", message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private BigDecimal purchaseAmountMaxAmount; + + @Schema(description = "清空消费次数标记") + private Boolean clearPurchaseAmount; + + @Schema(description = "订单均价时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天)") + @Max(value = 8, message = "最大值为8", groups = {AddUserTag.class, UpdateUserTag.class}) + @Min(value = 0, message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private Integer orderAveragePriceTime; + + @Schema(description = "订单均价最小金额") + @DecimalMax(value = "100000000", message = "最大值为100000000", groups = {AddUserTag.class, UpdateUserTag.class}) + @DecimalMin(value = "0", message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private BigDecimal orderAveragePriceMinAmount; + + @Schema(description = "订单均价最大金额") + @DecimalMax(value = "100000000", message = "最大值为100000000", groups = {AddUserTag.class, UpdateUserTag.class}) + @DecimalMin(value = "0", message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private BigDecimal orderAveragePriceMaxAmount; + + @Schema(description = "清空订单均价标记") + private Boolean clearOrderAveragePrice; + + @Schema(description = "充值金额时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天)") + @Max(value = 8, message = "最大值为8", groups = {AddUserTag.class, UpdateUserTag.class}) + @Min(value = 0, message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private Integer rechargeAmountTime; + + @Schema(description = "充值金额最小金额") + @DecimalMax(value = "100000000", message = "最大值为100000000", groups = {AddUserTag.class, UpdateUserTag.class}) + @DecimalMin(value = "0", message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private Long rechargeAmountMinAmount; + + @Schema(description = "充值金额最大金额") + @DecimalMax(value = "100000000", message = "最大值为100000000", groups = {AddUserTag.class, UpdateUserTag.class}) + @DecimalMin(value = "0", message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private Long rechargeAmountMaxAmount; + + @Schema(description = "清空充值金额标记") + private Boolean clearRechargeAmount; + + @Schema(description = "充值次数时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天)") + @Max(value = 8, message = "最大值为8", groups = {AddUserTag.class, UpdateUserTag.class}) + @Min(value = 0, message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private Integer rechargeNumTime; + + @Schema(description = "充值次数最小次数") + @Max(value = 100000, message = "最大值为100000", groups = {AddUserTag.class, UpdateUserTag.class}) + @Min(value = 0, message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private Long rechargeNumMinNum; + + @Schema(description = "充值次数最大次数") + @Max(value = 100000, message = "最大值为100000", groups = {AddUserTag.class, UpdateUserTag.class}) + @Min(value = 0, message = "最小值为0", groups = {AddUserTag.class, UpdateUserTag.class}) + private Long rechargeNumMaxNum; + + @Schema(description = "清空充值次数标记") + private Boolean clearRechargeNum; + + @Schema(description = "符合标签的人数") + private Long userNum; + + @Schema(description = "统计更新时间") + private Date statisticUpdateTime; + + public Long getUserTagId() { + return userTagId; + } + + public void setUserTagId(Long userTagId) { + this.userTagId = userTagId; + } + + public String getTagName() { + return tagName; + } + + public void setTagName(String tagName) { + this.tagName = tagName; + } + + public Integer getTagType() { + return tagType; + } + + public void setTagType(Integer tagType) { + this.tagType = tagType; + } + + public Integer getIsSysTurnOn() { + return isSysTurnOn; + } + + public void setIsSysTurnOn(Integer isSysTurnOn) { + this.isSysTurnOn = isSysTurnOn; + } + + public Date getRegisterMinTime() { + return registerMinTime; + } + + public void setRegisterMinTime(Date registerMinTime) { + this.registerMinTime = registerMinTime; + } + + public Date getRegisterMaxTime() { + return registerMaxTime; + } + + public void setRegisterMaxTime(Date registerMaxTime) { + this.registerMaxTime = registerMaxTime; + } + + public Date getSubscribeMinTime() { + return subscribeMinTime; + } + + public void setSubscribeMinTime(Date subscribeMinTime) { + this.subscribeMinTime = subscribeMinTime; + } + + public Date getSubscribeMaxTime() { + return subscribeMaxTime; + } + + public void setSubscribeMaxTime(Date subscribeMaxTime) { + this.subscribeMaxTime = subscribeMaxTime; + } + + public Date getToBeMemberMinTime() { + return toBeMemberMinTime; + } + + public void setToBeMemberMinTime(Date toBeMemberMinTime) { + this.toBeMemberMinTime = toBeMemberMinTime; + } + + public Date getToBeMemberMaxTime() { + return toBeMemberMaxTime; + } + + public void setToBeMemberMaxTime(Date toBeMemberMaxTime) { + this.toBeMemberMaxTime = toBeMemberMaxTime; + } + + public Integer getRecentPurchaseTime() { + return recentPurchaseTime; + } + + public void setRecentPurchaseTime(Integer recentPurchaseTime) { + this.recentPurchaseTime = recentPurchaseTime; + } + + public Integer getPurchaseNumTime() { + return purchaseNumTime; + } + + public void setPurchaseNumTime(Integer purchaseNumTime) { + this.purchaseNumTime = purchaseNumTime; + } + + public Long getPurchaseNumMinNum() { + return purchaseNumMinNum; + } + + public void setPurchaseNumMinNum(Long purchaseNumMinNum) { + this.purchaseNumMinNum = purchaseNumMinNum; + } + + public Long getPurchaseNumMaxNum() { + return purchaseNumMaxNum; + } + + public void setPurchaseNumMaxNum(Long purchaseNumMaxNum) { + this.purchaseNumMaxNum = purchaseNumMaxNum; + } + + public Integer getPurchaseAmountTime() { + return purchaseAmountTime; + } + + public void setPurchaseAmountTime(Integer purchaseAmountTime) { + this.purchaseAmountTime = purchaseAmountTime; + } + + public BigDecimal getPurchaseAmountMinAmount() { + return purchaseAmountMinAmount; + } + + public void setPurchaseAmountMinAmount(BigDecimal purchaseAmountMinAmount) { + this.purchaseAmountMinAmount = purchaseAmountMinAmount; + } + + public BigDecimal getPurchaseAmountMaxAmount() { + return purchaseAmountMaxAmount; + } + + public void setPurchaseAmountMaxAmount(BigDecimal purchaseAmountMaxAmount) { + this.purchaseAmountMaxAmount = purchaseAmountMaxAmount; + } + + public Integer getOrderAveragePriceTime() { + return orderAveragePriceTime; + } + + public void setOrderAveragePriceTime(Integer orderAveragePriceTime) { + this.orderAveragePriceTime = orderAveragePriceTime; + } + + public BigDecimal getOrderAveragePriceMinAmount() { + return orderAveragePriceMinAmount; + } + + public void setOrderAveragePriceMinAmount(BigDecimal orderAveragePriceMinAmount) { + this.orderAveragePriceMinAmount = orderAveragePriceMinAmount; + } + + public BigDecimal getOrderAveragePriceMaxAmount() { + return orderAveragePriceMaxAmount; + } + + public void setOrderAveragePriceMaxAmount(BigDecimal orderAveragePriceMaxAmount) { + this.orderAveragePriceMaxAmount = orderAveragePriceMaxAmount; + } + + public Integer getRechargeAmountTime() { + return rechargeAmountTime; + } + + public void setRechargeAmountTime(Integer rechargeAmountTime) { + this.rechargeAmountTime = rechargeAmountTime; + } + + public Long getRechargeAmountMinAmount() { + return rechargeAmountMinAmount; + } + + public void setRechargeAmountMinAmount(Long rechargeAmountMinAmount) { + this.rechargeAmountMinAmount = rechargeAmountMinAmount; + } + + public Long getRechargeAmountMaxAmount() { + return rechargeAmountMaxAmount; + } + + public void setRechargeAmountMaxAmount(Long rechargeAmountMaxAmount) { + this.rechargeAmountMaxAmount = rechargeAmountMaxAmount; + } + + public Integer getRechargeNumTime() { + return rechargeNumTime; + } + + public void setRechargeNumTime(Integer rechargeNumTime) { + this.rechargeNumTime = rechargeNumTime; + } + + public Long getRechargeNumMinNum() { + return rechargeNumMinNum; + } + + public void setRechargeNumMinNum(Long rechargeNumMinNum) { + this.rechargeNumMinNum = rechargeNumMinNum; + } + + public Long getRechargeNumMaxNum() { + return rechargeNumMaxNum; + } + + public void setRechargeNumMaxNum(Long rechargeNumMaxNum) { + this.rechargeNumMaxNum = rechargeNumMaxNum; + } + + public Long getUserNum() { + return userNum; + } + + public void setUserNum(Long userNum) { + this.userNum = userNum; + } + + public Date getStatisticUpdateTime() { + return statisticUpdateTime; + } + + public void setStatisticUpdateTime(Date statisticUpdateTime) { + this.statisticUpdateTime = statisticUpdateTime; + } + + public Boolean getClearRegisterTime() { + return clearRegisterTime; + } + + public void setClearRegisterTime(Boolean clearRegisterTime) { + this.clearRegisterTime = clearRegisterTime; + } + + public Boolean getClearSubscribeTime() { + return clearSubscribeTime; + } + + public void setClearSubscribeTime(Boolean clearSubscribeTime) { + this.clearSubscribeTime = clearSubscribeTime; + } + + public Boolean getClearToBeMemberTime() { + return clearToBeMemberTime; + } + + public void setClearToBeMemberTime(Boolean clearToBeMemberTime) { + this.clearToBeMemberTime = clearToBeMemberTime; + } + + public Boolean getClearRecentPurchaseTime() { + return clearRecentPurchaseTime; + } + + public void setClearRecentPurchaseTime(Boolean clearRecentPurchaseTime) { + this.clearRecentPurchaseTime = clearRecentPurchaseTime; + } + + public Boolean getClearPurchaseNum() { + return clearPurchaseNum; + } + + public void setClearPurchaseNum(Boolean clearPurchaseNum) { + this.clearPurchaseNum = clearPurchaseNum; + } + + public Boolean getClearPurchaseAmount() { + return clearPurchaseAmount; + } + + public void setClearPurchaseAmount(Boolean clearPurchaseAmount) { + this.clearPurchaseAmount = clearPurchaseAmount; + } + + public Boolean getClearOrderAveragePrice() { + return clearOrderAveragePrice; + } + + public void setClearOrderAveragePrice(Boolean clearOrderAveragePrice) { + this.clearOrderAveragePrice = clearOrderAveragePrice; + } + + public Boolean getClearRechargeAmount() { + return clearRechargeAmount; + } + + public void setClearRechargeAmount(Boolean clearRechargeAmount) { + this.clearRechargeAmount = clearRechargeAmount; + } + + public Boolean getClearRechargeNum() { + return clearRechargeNum; + } + + public void setClearRechargeNum(Boolean clearRechargeNum) { + this.clearRechargeNum = clearRechargeNum; + } + + @Override + public String toString() { + return "UserTagDTO{" + + "userTagId=" + userTagId + + ", tagName='" + tagName + '\'' + + ", tagType=" + tagType + + ", isSysTurnOn=" + isSysTurnOn + + ", registerMinTime=" + registerMinTime + + ", registerMaxTime=" + registerMaxTime + + ", clearRegisterTime=" + clearRegisterTime + + ", subscribeMinTime=" + subscribeMinTime + + ", subscribeMaxTime=" + subscribeMaxTime + + ", clearSubscribeTime=" + clearSubscribeTime + + ", toBeMemberMinTime=" + toBeMemberMinTime + + ", toBeMemberMaxTime=" + toBeMemberMaxTime + + ", clearToBeMemberTime=" + clearToBeMemberTime + + ", recentPurchaseTime=" + recentPurchaseTime + + ", clearRecentPurchaseTime=" + clearRecentPurchaseTime + + ", purchaseNumTime=" + purchaseNumTime + + ", purchaseNumMinNum=" + purchaseNumMinNum + + ", purchaseNumMaxNum=" + purchaseNumMaxNum + + ", clearPurchaseNum=" + clearPurchaseNum + + ", purchaseAmountTime=" + purchaseAmountTime + + ", purchaseAmountMinAmount=" + purchaseAmountMinAmount + + ", purchaseAmountMaxAmount=" + purchaseAmountMaxAmount + + ", clearPurchaseAmount=" + clearPurchaseAmount + + ", orderAveragePriceTime=" + orderAveragePriceTime + + ", orderAveragePriceMinAmount=" + orderAveragePriceMinAmount + + ", orderAveragePriceMaxAmount=" + orderAveragePriceMaxAmount + + ", clearOrderAveragePrice=" + clearOrderAveragePrice + + ", rechargeAmountTime=" + rechargeAmountTime + + ", rechargeAmountMinAmount=" + rechargeAmountMinAmount + + ", rechargeAmountMaxAmount=" + rechargeAmountMaxAmount + + ", clearRechargeAmount=" + clearRechargeAmount + + ", rechargeNumTime=" + rechargeNumTime + + ", rechargeNumMinNum=" + rechargeNumMinNum + + ", rechargeNumMaxNum=" + rechargeNumMaxNum + + ", clearRechargeNum=" + clearRechargeNum + + ", userNum=" + userNum + + ", statisticUpdateTime=" + statisticUpdateTime + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserTagUserDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserTagUserDTO.java new file mode 100644 index 0000000..12345a2 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserTagUserDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户和标签关联表DTO + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserTagUserDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "自增id") + private Long userTagUserId; + + @Schema(description = "标签id") + private Long userTagId; + + @Schema(description = "用户id") + private Long userId; + + public Long getUserTagUserId() { + return userTagUserId; + } + + public void setUserTagUserId(Long userTagUserId) { + this.userTagUserId = userTagUserId; + } + + public Long getUserTagId() { + return userTagId; + } + + public void setUserTagId(Long userTagId) { + this.userTagId = userTagId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "UserTagUserDTO{" + + "userTagUserId=" + userTagUserId + + ",userTagId=" + userTagId + + ",userId=" + userId + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserWithDrawDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserWithDrawDTO.java new file mode 100644 index 0000000..cb9cf3c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserWithDrawDTO.java @@ -0,0 +1,82 @@ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-04-24 + */ +public class UserWithDrawDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Hidden + @Schema(description = "用户id(非必填)") + private Long userId; + + @Schema(description = "提现金额") + private Double amount; + + @Schema(description = "银行卡号") + private String bankCardNo; + + @Schema(description = "订单号") + private String bizOrderNo; + + @Schema(description = "短信验证码") + private String verificationCode; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Double getAmount() { + return amount; + } + + public void setAmount(Double amount) { + this.amount = amount; + } + + public String getBankCardNo() { + return bankCardNo; + } + + public void setBankCardNo(String bankCardNo) { + this.bankCardNo = bankCardNo; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + @Override + public String toString() { + return "UserWithDrawDTO{" + + "userId=" + userId + + ", amount=" + amount + + ", bankCardNo='" + bankCardNo + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", verificationCode='" + verificationCode + '\'' + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/PopupFeignController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/PopupFeignController.java new file mode 100644 index 0000000..d86434c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/PopupFeignController.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.feign; + +import com.tmerclub.cloud.api.coupon.vo.CouponDataVO; +import com.tmerclub.cloud.api.user.feign.PopupFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.JumpType; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.service.CostPerPopupService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Collections; +import java.util.List; + +/** + * @author TRACK + */ +@DubboService +public class PopupFeignController implements PopupFeignClient { + + @Autowired + private CostPerPopupService costPerPopupService; + + @Override + public ServerResponseEntity deletePopupProd(Long spuId, Long shopId) { + costPerPopupService.deletePopupByRelate(spuId, shopId); + costPerPopupService.deleteLink(spuId, shopId, JumpType.SPU.value(), null); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity deleteLink(Long linkId, Long shopId, String type, List categoryIds) { + costPerPopupService.deleteLink(linkId, shopId, type, categoryIds); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity deleteLinkBatch(List couponList) { + costPerPopupService.deleteLinkBatch(couponList); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity deleteShopLinkBatch(List shopIds) { + costPerPopupService.offlineShop(shopIds); + for (Long shopId : shopIds) { + costPerPopupService.deleteLink(shopId, Constant.PLATFORM_SHOP_ID, JumpType.SHOP.value(), null); + } + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity offlineShop(Long shopId) { + costPerPopupService.offlineShop(Collections.singletonList(shopId)); + costPerPopupService.deleteLink(shopId, Constant.PLATFORM_SHOP_ID, JumpType.SHOP.value(), null); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserAddrFeignController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserAddrFeignController.java new file mode 100644 index 0000000..51d7088 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserAddrFeignController.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.feign; + +import com.tmerclub.cloud.api.user.feign.UserAddrFeignClient; +import com.tmerclub.cloud.common.handler.ExcelMergeHandler; +import com.tmerclub.cloud.common.order.vo.UserAddrVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.user.service.UserAddrService; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 用户地址feign连接 + * + * @author FrozenWatermelon + * @date 2020/12/07 + */ +@DubboService +public class UserAddrFeignController implements UserAddrFeignClient { + private static final Logger log = LoggerFactory.getLogger(ExcelMergeHandler.class); + + @Autowired + private UserAddrService userAddrService; + + @Override + public ServerResponseEntity getUserAddrByAddrId(Long addrId) { + log.info("UserAddrFeignController.getUserAddrByAddrId -- 用户id: {}", AuthUserContext.get().getUserId()); + UserAddrVO userAddrByUserId = userAddrService.getUserAddrByUserId(addrId, AuthUserContext.get().getUserId()); + log.info("UserAddrFeignController.getUserAddrByAddrId -- 用户地址信息: {}", userAddrByUserId); + return ServerResponseEntity.success(userAddrByUserId); + } + + @Override + public ServerResponseEntity getUserAddrByUserId(Long userId) { + return ServerResponseEntity.success(userAddrService.getUserAddrByUserId(0L, userId)); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserConsigneeFeignController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserConsigneeFeignController.java new file mode 100644 index 0000000..0c15a0b --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserConsigneeFeignController.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.feign; + +import com.tmerclub.cloud.api.user.feign.UserConsigneeFeignClient; +import com.tmerclub.cloud.common.handler.ExcelMergeHandler; +import com.tmerclub.cloud.common.order.vo.UserConsigneeVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.user.model.UserConsignee; +import com.tmerclub.cloud.user.service.UserConsigneeService; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 用户地址feign连接 + * + * @author FrozenWatermelon + * @date 2020/12/07 + */ +@DubboService +public class UserConsigneeFeignController implements UserConsigneeFeignClient { + private static final Logger log = LoggerFactory.getLogger(ExcelMergeHandler.class); + + @Autowired + private UserConsigneeService userConsigneeService; + + + @Override + public ServerResponseEntity getUseConsignee() { + log.info("UserConsigneeFeignController.getUseConsignee -- 用户id: {}", AuthUserContext.get().getUserId()); + UserConsignee userConsignee = userConsigneeService.getByUserId(AuthUserContext.get().getUserId()); + return ServerResponseEntity.success(BeanUtil.map(userConsignee, UserConsigneeVO.class)); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserExtensionFeignController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserExtensionFeignController.java new file mode 100644 index 0000000..974d29a --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserExtensionFeignController.java @@ -0,0 +1,41 @@ +package com.tmerclub.cloud.user.feign; + +import com.tmerclub.cloud.api.user.dto.UserExtensionDTO; +import com.tmerclub.cloud.api.user.feign.UserExtensionFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.service.UserExtensionService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author gaozijie + * @date 2023-05-23 + */ +@DubboService +public class UserExtensionFeignController implements UserExtensionFeignClient { + + @Autowired + private UserExtensionService userExtensionService; + + @Override + public void updateExtension(UserExtensionDTO userExtensionDTO) { + UserExtension userExtension = userExtensionService.getByUserId(userExtensionDTO.getUserId()); + if (userExtension == null) { + ServerResponseEntity.showFailMsg("用户拓展信息不存在"); + return; + } + Integer version = userExtension.getVersion(); + BeanUtils.copyProperties(userExtensionDTO, userExtension); + userExtension.setVersion(version); + userExtensionService.update(userExtension); + } + + @Override + public void updateBatchStatus(UserExtensionDTO userExtensionDTO, List userIds) { + userExtensionService.updateBatchStatus(userExtensionDTO, userIds); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserFeignController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserFeignController.java new file mode 100644 index 0000000..3ebdf2c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserFeignController.java @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.feign; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.user.bo.UidAndUserIdBO; +import com.tmerclub.cloud.api.user.dto.CustomerReqDTO; +import com.tmerclub.cloud.api.user.dto.MemberReqDTO; +import com.tmerclub.cloud.api.user.dto.UserRegisterDTO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.*; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.user.dto.UserManagerDTO; +import com.tmerclub.cloud.user.mapper.UserExtensionMapper; +import com.tmerclub.cloud.user.mapper.UserMapper; +import com.tmerclub.cloud.user.model.User; +import com.tmerclub.cloud.user.service.UserBalanceLogService; +import com.tmerclub.cloud.user.service.UserRechargeCouponService; +import com.tmerclub.cloud.user.service.UserRightsService; +import com.tmerclub.cloud.user.service.UserService; +import com.tmerclub.cloud.user.vo.UserExtensionVO; +import com.tmerclub.cloud.user.vo.UserVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用户地址feign连接 + * + * @author FrozenWatermelon + * @date 2020/12/07 + */ +@DubboService +public class UserFeignController implements UserFeignClient { + + @Autowired + private UserMapper userMapper; + @Autowired + private UserService userService; + @Autowired + private UserExtensionMapper userExtensionMapper; + @Autowired + private UserBalanceLogService userBalanceLogService; + @Autowired + private UserRightsService userRightsService; + @Autowired + private UserRechargeCouponService userRechargeCouponService; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + + @Override + public ServerResponseEntity> getUserByUserIds(List userIds) { + List userList = userService.getUserByUserIds(userIds); + return ServerResponseEntity.success(userList); + } + + @Override + public ServerResponseEntity> getUserByParam(UserApiVO userApiVO) { + return ServerResponseEntity.success(userService.getUserByParam(userApiVO)); + } + + @Override + public ServerResponseEntity getUserData(Long userId) { + UserApiVO user = userService.getByUserId(userId); + return ServerResponseEntity.success(user); + } + + @Override + public ServerResponseEntity getInsiderUserData(Long userId) { + UserApiVO user = userService.getByUserId(userId); + return ServerResponseEntity.success(user); + } + + @Override + public ServerResponseEntity> getMeetConditionsUserIds(MemberReqDTO param) { + if (CollectionUtil.isEmpty(param.getUserIds())) { + return ServerResponseEntity.success(null); + } + // 根据用户id,获取用户的信息 + List userIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userExtensionList = userExtensionMapper.countByMemberTypeConditions(param); + // 根据用户等级进行分类 + Map> userInfoMap = userExtensionList.stream().collect(Collectors.groupingBy(UserExtensionVO::getLevelType)); + // 查找指定等级的用户时,过滤多余的数据 + if (!Objects.equals(param.getMemberType(), 0) && userInfoMap.containsKey(param.getMemberType() - 1)) { + userExtensionList = userInfoMap.get(param.getMemberType() - 1); + } else if (param.getMemberType() != 0) { + //查询类型不为全部全员,上面过滤不执行则清空全部 + userExtensionList = null; + } + + if (Objects.nonNull(userExtensionList) && CollUtil.isNotEmpty(userExtensionList)) { + userExtensionList.forEach(userExtensionVO -> userIds.add(userExtensionVO.getUserId())); + } + return ServerResponseEntity.success(userIds); + } + + @Override + public ServerResponseEntity getMemberContributeByParam(MemberReqDTO param) { + Date endTime = param.getEndTime(); + param.setDateTime(endTime); + // 先获取当前符合条件的所有会员数(只是查询一天的应该数据量不会很大?) + List userExtensionList = userExtensionMapper.countByMemberTypeConditions(param); + List userIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map> userInfoMap = userExtensionList.stream().collect(Collectors.groupingBy(UserExtensionVO::getLevelType)); + + MemberContributeRespVO respParam = new MemberContributeRespVO(); + // 普通会员 + MemberContributeValueVO publicMember = new MemberContributeValueVO(); + // 付费会员 + MemberContributeValueVO paidMember = new MemberContributeValueVO(); + + // 普通会员 + param.setMemberType(1); + publicMember.setTotalMember(userExtensionMapper.countMemberByParam(param)); + // 普通会员ids + List memberList = userInfoMap.get(0); + for (UserExtensionVO extensionVO : memberList) { + userIds.add(extensionVO.getUserId()); + } + respParam.setUserIds(userIds); + // 付费会员 + param.setMemberType(2); + param.setDateTime(endTime); + paidMember.setTotalMember(userExtensionMapper.countMemberByParam(param)); + respParam.setPublicMember(publicMember); + respParam.setPaidMember(paidMember); + // 付费会员ids + userIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + memberList = userInfoMap.get(1); + if (Objects.nonNull(memberList) && memberList.size() > 0) { + for (UserExtensionVO userExtensionVO : memberList) { + userIds.add(userExtensionVO.getUserId()); + } + } + respParam.setPaidUserIds(userIds); + return ServerResponseEntity.success(respParam); + } + + @Override + public ServerResponseEntity getMemberTrend(MemberReqDTO param) { + return ServerResponseEntity.success(userExtensionMapper.countMemberByParam(param)); + } + + @Override + public ServerResponseEntity> countUserByMobile(String mobile) { + return ServerResponseEntity.success(userService.listUserByMobile(mobile)); + } + + @Override + public ServerResponseEntity cancelBindingCoupons(List couponIds) { + if (CollUtil.isNotEmpty(couponIds)) { + userRechargeCouponService.cancelBindingCoupons(couponIds); + userRightsService.cancelBindingCoupons(couponIds); + } + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity getUserAndOpenIdsByUserId(Long userId) { + return ServerResponseEntity.success(userService.getUserAndOpenIdsByUserId(userId)); + } + + @Override + public ServerResponseEntity save(UserRegisterDTO userRegisterDTO) { + return ServerResponseEntity.success(userService.save(userRegisterDTO.getMobile(), null, userRegisterDTO.getTempUid())); + } + + @Override + public ServerResponseEntity countNewUserByTime(CustomerReqDTO customerReqDTO) { + return ServerResponseEntity.success(userService.countNewUserByTime(customerReqDTO.getStartTime(), customerReqDTO.getEndTime())); + } + + + @Override + public List listNewUserIdByTime(CustomerReqDTO customerReqDTO) { + return userService.listNewUserIdByTime(customerReqDTO.getStartTime(), customerReqDTO.getEndTime()); + } + + @Override + public List listUserByUserIds(List userIds) { + List userList = userService.listUserByUserIds(userIds); + return BeanUtil.mapAsList(userList, UserApiVO.class); + } + @Override + public ServerResponseEntity createAllinpayMember() { + // 查询未注销的所有会员信息 + UserManagerDTO userManagerDTO = new UserManagerDTO(); + List users = userService.listUser(userManagerDTO); + if (CollectionUtils.isEmpty(users)) { + return ServerResponseEntity.success(); + } + // userId转成bizUserId,并调用通联接口创建会员 + List bizUserIds = new ArrayList<>(users.size()); + for (User user : users) { + bizUserIds.add(user.getUserId().toString()); + } + allinpayFeignClient.batchCreatePersonalMember(bizUserIds); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity countUserNumByType(CustomerReqDTO customerReqDTO) { + MemberTrendRespVO memberTrendRespVO = userMapper.countUserNumByType(customerReqDTO.getStartTime()); + return ServerResponseEntity.success(memberTrendRespVO); + } + + @Override + public MemberCountVO statisticsUserNum(MemberReqDTO memberReqDTO) { + return userMapper.statisticsUserNum(memberReqDTO.getStartTime(), memberReqDTO.getEndTime()); + } + + @Override + public ServerResponseEntity getInitialRegistrationTime() { + Date beginTime = userMapper.getInitialRegistrationTime(); + return ServerResponseEntity.success(beginTime); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserLevelLogFeignController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserLevelLogFeignController.java new file mode 100644 index 0000000..58dbbfd --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserLevelLogFeignController.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.feign; + +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.dto.UserTypeDTO; +import com.tmerclub.cloud.api.user.feign.UserLevelLogFeignClient; +import com.tmerclub.cloud.api.user.vo.FinanceDetailExcelVO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.model.UserLevelLog; +import com.tmerclub.cloud.user.service.UserLevelLogService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * 会员等级日志 + * @author FrozenWatermelon + */ +@DubboService +public class UserLevelLogFeignController implements UserLevelLogFeignClient { + + @Autowired + private UserLevelLogService userLevelLogService; + + @Override + public ServerResponseEntity getPayAmount(Long userLevelLogId) { + UserLevelLog userLevelLog = userLevelLogService.getByLevelLogId(userLevelLogId); + return ServerResponseEntity.success(userLevelLog.getPayAmount()); + } + + @Override + public ServerResponseEntity getIsPay(Long userLevelLogId) { + UserLevelLog userLevelLog = userLevelLogService.getByLevelLogId(userLevelLogId); + return ServerResponseEntity.success(userLevelLog.getIsPayed()); + } + + @Override + public UserApiVO getUserTypeAndUserNameAtTime(UserTypeDTO userTypeDTO) { + return userLevelLogService.getUserTypeAndUserNameAtTime(userTypeDTO.getUserId(), userTypeDTO.getCreateTime()); + } + + @Override + public ServerResponseEntity> pageFinanceDetail(FinanceDetailDTO financeDetailDTO) { + PageDTO pageDTO = new PageDTO(); + pageDTO.setPageSize(financeDetailDTO.getPageSize()); + pageDTO.setPageNum(financeDetailDTO.getPageNum()); + PageVO result = userLevelLogService.pageFinanceDetail(pageDTO, financeDetailDTO); + return ServerResponseEntity.success(result); + } + + @Override + public ServerResponseEntity> listFinanceDetail(FinanceDetailDTO financeDetailDTO) { + List listFinanceDetail = userLevelLogService.listFinanceDetail(financeDetailDTO); + return ServerResponseEntity.success(listFinanceDetail); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserScoreLockFeignController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserScoreLockFeignController.java new file mode 100644 index 0000000..5b7bc05 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserScoreLockFeignController.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.feign; + +import com.tmerclub.cloud.api.user.dto.UserScoreLockDTO; +import com.tmerclub.cloud.api.user.feign.UserScoreLockFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.service.UserScoreLockService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021/5/19 + */ +@DubboService +public class UserScoreLockFeignController implements UserScoreLockFeignClient { + + @Autowired + private UserScoreLockService userScoreLockService; + + @Override + public ServerResponseEntity lock(List userScoreLocks) { + userScoreLockService.lock(userScoreLocks); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserTagFeignController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserTagFeignController.java new file mode 100644 index 0000000..68f1d8d --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserTagFeignController.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.feign; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.user.feign.UserTagFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.user.vo.UserTagApiVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.service.UserTagService; +import com.tmerclub.cloud.user.service.UserTagUserService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Collections; +import java.util.List; + +/** + * @author cl + * @date 2021-05-20 14:14:36 + */ +@DubboService +public class UserTagFeignController implements UserTagFeignClient { + + @Autowired + private UserTagService userTagService; + + @Autowired + private UserTagUserService userTagUserService; + + @Override + public ServerResponseEntity> getUserTagList(List tagIds) { + if (CollUtil.isEmpty(tagIds)) { + return ServerResponseEntity.success(Collections.emptyList()); + } + List list = userTagService.getUserTagList(tagIds); + return ServerResponseEntity.success(list); + } + + @Override + public ServerResponseEntity> getUserByTagIds(List userTagIds) { + return ServerResponseEntity.success(userTagUserService.getUserByTagIds(userTagIds)); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/AddUserBalanceLogConsumer.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/AddUserBalanceLogConsumer.java new file mode 100644 index 0000000..be7d9ab --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/AddUserBalanceLogConsumer.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO; +import com.tmerclub.cloud.user.service.UserBalanceLogService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author TRACK + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ADD_USER_BALANCE_LOG_TOPIC, consumerGroup = RocketMqConstant.ADD_USER_BALANCE_LOG_TOPIC) +public class AddUserBalanceLogConsumer implements RocketMQListener> { + + @Autowired + private UserBalanceLogService userBalanceLogService; + @Override + public void onMessage(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + userBalanceLogService.saveBatchToMongodb(list); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/AddUserScoreLogConsumer.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/AddUserScoreLogConsumer.java new file mode 100644 index 0000000..6d45b62 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/AddUserScoreLogConsumer.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.user.bo.mongo.MongoUserScoreLogBO; +import com.tmerclub.cloud.user.service.UserScoreLogService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author TRACK + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ADD_USER_SCORE_LOG_TOPIC, consumerGroup = RocketMqConstant.ADD_USER_SCORE_LOG_TOPIC) +public class AddUserScoreLogConsumer implements RocketMQListener> { + + @Autowired + private UserScoreLogService userScoreLogService; + + @Override + public void onMessage(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + userScoreLogService.saveBatchToMongodb(list); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/AllinpayBalancePaySuccessConsumer.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/AllinpayBalancePaySuccessConsumer.java new file mode 100644 index 0000000..d4d9d3a --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/AllinpayBalancePaySuccessConsumer.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.listener; + +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO; +import com.tmerclub.cloud.user.constant.RechargeTypeEnum; +import com.tmerclub.cloud.user.service.UserBalanceLogService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ALLINPAY_BALANCE_ORDER_SUCCESS_TOPIC, consumerGroup = RocketMqConstant.ALLINPAY_BALANCE_ORDER_SUCCESS_TOPIC) +public class AllinpayBalancePaySuccessConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(AllinpayBalancePaySuccessConsumer.class); + + + @Autowired + private UserBalanceLogService userBalanceLogService; + + + /** + * 订单支付成功 + */ + @Override + public void onMessage(PayNotifyBO message) { + // 订单支付成功,如果是默认的or不是余额支付的,就直接退出就好 + if (!Objects.equals(message.getPayType(), PayType.BALANCE.value()) || Objects.equals(message.getPaySysType(), PaySysType.DEFAULT.value())) { + return; + } + Long payId = message.getPayId(); + MongoUserBalanceLogBO userBalanceLog = userBalanceLogService.getByPayIdAndType(payId, RechargeTypeEnum.PAY.value()); + if (Objects.isNull(userBalanceLog)) { + return; + } + // 扣减余额,并将余额记录的支付状态变为已支付 + userBalanceLogService.updateToOrderPaySuccess(payId, userBalanceLog); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/OrderRefundSuccessGrowthConsumer.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/OrderRefundSuccessGrowthConsumer.java new file mode 100644 index 0000000..a6e8b1e --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/OrderRefundSuccessGrowthConsumer.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.listener; + +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.common.order.bo.RefundNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.service.UserLevelService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author cl + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_REFUND_SUCCESS_SERVICE_TOPIC, consumerGroup = RocketMqConstant.ORDER_REFUND_SUCCESS_GROWTH_GROUP) +public class OrderRefundSuccessGrowthConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(OrderRefundSuccessGrowthConsumer.class); + + @Autowired + private UserLevelService userLevelService; + + + /** + * 订单退货退款,还原用户的成长值 + * + * @param message + */ + @Override + public void onMessage(RefundNotifyBO message) { + // 订单的成长值是再确认收货时才发给用户的,所以成长值的退还,必须是已收货状态的订单 + // 并且订单退款状态将修改成已关闭的订单 + if (Objects.equals(message.getDbOrderStatus(), OrderStatus.SUCCESS.value()) || Objects.equals(message.getOrderStatus(), OrderStatus.CLOSE.value())) { + LOG.info("订单退款成功,还原用户成长值... message: {}", Json.toJsonString(message)); + userLevelService.refundGrowth(message.getOrderId()); + } + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserExcelListener.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserExcelListener.java new file mode 100644 index 0000000..ca7be46 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserExcelListener.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.listener; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.user.dto.UserExcelDTO; +import com.tmerclub.cloud.user.manager.UserExcelManager; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 商品excel导入监听 + * 有个很重要的点 SpuExcelListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去 + * + * @author cl + * @date 2021/5/14 + */ + +public class UserExcelListener extends AnalysisEventListener { + + private UserExcelManager userExcelManager; + private Map> errorMap; + private List list; + public static final String OTHER = "other"; + public static final String ERROR_ROWS = "error_rows"; + public static final String IMPORT_ROWS = "import_rows"; + + /** + * 每隔1000条数据存储数据库,然后清理map ,方便内存回收 + */ + private static final int BATCH_COUNT = 3000; + private static String seq; + + public UserExcelListener() { + } + + public UserExcelListener(UserExcelManager userExcelManager, Map> errorMap) { + this.userExcelManager = userExcelManager; + errorMap.put(OTHER, new ArrayList<>(Constant.INITIAL_CAPACITY)); + errorMap.put(ERROR_ROWS, new ArrayList<>(Constant.INITIAL_CAPACITY)); + errorMap.put(IMPORT_ROWS, new ArrayList<>(Constant.INITIAL_CAPACITY)); + this.errorMap = errorMap; + this.list = new ArrayList<>(Constant.INITIAL_CAPACITY); + } + + /** + * 这个每一条数据解析都会来调用 + */ + + @Override + public void invoke(UserExcelDTO userExcelDTO, AnalysisContext analysisContext) { + boolean isSave = Objects.nonNull(seq) && !Objects.equals(seq, userExcelDTO.getSeq()) && list.size() > BATCH_COUNT; + if (isSave) { + saveData(); + } + seq = userExcelDTO.getSeq(); + if (StrUtil.isBlank(userExcelDTO.getBalance())) { + userExcelDTO.setBalance("0"); + } + if (StrUtil.isBlank(userExcelDTO.getScore())) { + userExcelDTO.setScore("0"); + } + if (StrUtil.isBlank(userExcelDTO.getGrowth())) { + userExcelDTO.setGrowth("0"); + } + list.add(userExcelDTO); + } + + /** + * 所有数据解析完成了 都会来调用 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + //确保所有数据都能入库 + saveData(); + } + + /** + * 加上存储数据库 + */ + private void saveData() { + if (CollUtil.isEmpty(list)) { + return; + } + userExcelManager.importExcel(list, errorMap); + list.clear(); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserGrowthConsumer.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserGrowthConsumer.java new file mode 100644 index 0000000..53a7430 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserGrowthConsumer.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.user.service.UserExtensionService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SEND_NOTIFY_TO_USER_EXTENSION_TOPIC, consumerGroup = RocketMqConstant.SEND_NOTIFY_TO_USER_EXTENSION_TOPIC) +public class UserGrowthConsumer implements RocketMQListener { + + @Autowired + private UserExtensionService userExtensionService; + + @Override + public void onMessage(Long orderId) { + userExtensionService.updateScoreAndGrowth(orderId); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserRegisterConsumer.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserRegisterConsumer.java new file mode 100644 index 0000000..25c5dbb --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserRegisterConsumer.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.listener; + +import com.tmerclub.cloud.api.auth.bo.UserRegisterNotifyBO; +import com.tmerclub.cloud.api.auth.dto.UserRegisterDTO; +import com.tmerclub.cloud.api.auth.dto.UserRegisterExtensionDTO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.model.User; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.service.UserService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 账户注册成功监听 + * @author cl + * @date 2021-05-14 14:49:32 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.BATCH_USER_REGISTER_TOPIC, consumerGroup = RocketMqConstant.BATCH_USER_REGISTER_TOPIC) +public class UserRegisterConsumer implements RocketMQListener { + + @Autowired + private UserService userService; + + + private static final Logger LOG = LoggerFactory.getLogger(UserRegisterConsumer.class); + + /** + * 开始批量保存用户信息 + * @param message 批量注册消息 + */ + @Override + public void onMessage(UserRegisterNotifyBO message) { + LOG.info("批量注册用户信息开始... message: {}", Json.toJsonString(message)); + List userRegisterList = message.getUserRegisterList(); + List registerExtensionDTOList = message.getUserRegisterExtensionDTOList(); + List userList = BeanUtil.mapAsList(userRegisterList, User.class); + List userExtensionList = BeanUtil.mapAsList(registerExtensionDTOList, UserExtension.class); + // 批量保存用户 + userService.batchUser(userList, userExtensionList); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/CostPerPopupMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/CostPerPopupMapper.java new file mode 100644 index 0000000..582155c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/CostPerPopupMapper.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.dto.CostPerPopupDTO; +import com.tmerclub.cloud.user.model.CostPerPopup; +import com.tmerclub.cloud.user.vo.CostPerPopupVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 弹窗广告 + * @author TRACK + */ +public interface CostPerPopupMapper { + + /** + * 获取弹窗广告列表 + * @param costPerPopupDTO 查询参数 + * @return 弹窗广告列表 + */ + List list(@Param("costPerPopup")CostPerPopupDTO costPerPopupDTO); + + /** + * 获取当前可以推送的商家弹窗 + * @param isShopCustomer + * @param pageType + * @param spuId + * @param shopId + * @return + */ + List getShopPopupByCondition(@Param("isShopCustomer")Integer isShopCustomer, @Param("pageType")Integer pageType, + @Param("spuId")Long spuId, @Param("shopId")Long shopId); + + /** + * 获取当前可以推送的平台弹窗 + * @param userLevelIds + * @param pageType + * @return + */ + List getSysPopupByCondition(@Param("userLevelIds")List userLevelIds, @Param("pageType")Integer pageType); + + /** + * 根据弹窗广告id获取弹窗广告 + * @param popupId 弹窗广告id + * @return 弹窗广告 + */ + CostPerPopup getByPopupId(@Param("popupId") Long popupId); + + /** + * 保存弹窗广告 + * @param costPerPopup 弹窗广告 + */ + void save(@Param("costPerPopup") CostPerPopup costPerPopup); + + /** + * 更新弹窗广告 + * @param costPerPopup 弹窗广告 + */ + void update(@Param("costPerPopup") CostPerPopup costPerPopup); + + /** + * 根据弹窗广告id删除弹窗广告 + * @param popupId id + */ + void deleteById(@Param("popupId") Long popupId); + + /** + * 根据弹窗广告id失效弹窗广告 + * @param popupId id + */ + void invalid(@Param("popupId") Long popupId); + + /** + * 根据参数获取对应列表 + * @param costPerPopup 参数 + * @return 列表 + */ + List listByParam(@Param("costPerPopup") CostPerPopup costPerPopup); + + /** + * 根据状态获取需要改变成这个状态的广告 + * @param status + * @return + */ + List listPopUpByStatus(@Param("status") Integer status); + + /** + * 更新状态 + * @param status + */ + void updateStatus(@Param("status") Integer status); + + /** + * 根据店铺获取未结束的商品详情页的弹窗广告列表 + * @param shopId + * @return + */ + List listNotEndByShopId(@Param("shopId") Long shopId); + + /** + * 根据店铺获取未结束的弹窗广告列表 + * @param shopIds + * @return + */ + List listNotEndLinkByShopId(@Param("shopIds") List shopIds); + + /** + * 批量更新弹窗广告为结束 + * @param popupIds + */ + void updateStatusBatch(@Param("popupIds") List popupIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/ShopCustomerMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/ShopCustomerMapper.java new file mode 100644 index 0000000..1549bb1 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/ShopCustomerMapper.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.api.user.vo.UserManagerVO; +import com.tmerclub.cloud.user.dto.ShopCustomerDTO; +import com.tmerclub.cloud.user.model.ShopCustomer; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2023-01-15 15:53:16 + */ +public interface ShopCustomerMapper { + + /** + * 搜索条件获取列表 + * + * @param shopCustomerDTO + * @return + */ + List listByParam(@Param("shopCustomerDTO") ShopCustomerDTO shopCustomerDTO); + + /** + * 批量添加客户 + * + * @param shopCustomers + */ + void saveBatch(@Param("shopCustomers") List shopCustomers); + + /** + * 查询未成为店铺会员的用户 + * @param shopId + * @param userIds + * @return + */ + List listNotExistByShopIdAndUserIds(@Param("shopId") Long shopId, @Param("userIds") List userIds); + + /** + * 获取用户是否为店铺会员 + * @param shopId + * @param userId + * @return + */ + Integer getIsShopCustomer(@Param("shopId") Long shopId, @Param("userId") Long userId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserBalanceLogMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserBalanceLogMapper.java new file mode 100644 index 0000000..f04a153 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserBalanceLogMapper.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.model.UserBalanceLog; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 余额记录 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public interface UserBalanceLogMapper { + + /** + * 获取保存到mongodb的余额记录 + * @param start + * @param size + * @return + */ + List listToMongodb(@Param("start") int start, @Param("size") int size); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserConsigneeMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserConsigneeMapper.java new file mode 100644 index 0000000..5aa153e --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserConsigneeMapper.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.model.UserConsignee; +import org.apache.ibatis.annotations.Param; + +/** + * 用户提货人信息 + * + * @author FrozenWatermelon + * @date 2020-12-15 17:18:56 + */ +public interface UserConsigneeMapper { + + /** + * 根据用户提货人信息id获取用户提货人信息 + * + * @param userId 用户id + * @return 用户提货人信息 + */ + UserConsignee getByUserId(@Param("userId") Long userId); + + /** + * 删除用户提货人信息 + * + * @param userId 用户id + * @return + */ + void deleteByUserId(@Param("userId") Long userId); + + /** + * 保存用户提货人信息 + * + * @param userConsignee 用户提货人信息 + */ + void save(@Param("userConsignee") UserConsignee userConsignee); + + /** + * 更新用户提货人信息 + * + * @param userConsignee 用户提货人信息 + */ + void update(@Param("userConsignee") UserConsignee userConsignee); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserExtensionMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserExtensionMapper.java new file mode 100644 index 0000000..fe29c02 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserExtensionMapper.java @@ -0,0 +1,258 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import cn.hutool.core.date.DateTime; +import com.tmerclub.cloud.api.user.dto.MemberReqDTO; +import com.tmerclub.cloud.api.user.dto.UserExtensionDTO; +import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.vo.UserExtensionVO; +import com.tmerclub.cloud.user.vo.UserRechargeVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户扩展信息 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserExtensionMapper { + + /** + * 获取用户扩展信息列表 + * + * @return 用户扩展信息列表 + */ + List list(); + + /** + * 获取用户扩展信息列表 + * @param userExtensionDTO 用户扩展信息dto + * @return 用户拓展信息列表 + */ + List listUserExtensions(@Param("userExtensionDTO") UserExtensionDTO userExtensionDTO); + + /** + * 根据用户扩展信息id获取用户扩展信息 + * + * @param userExtensionId 用户扩展信息id + * @return 用户扩展信息 + */ + UserExtension getByUserExtensionId(@Param("userExtensionId") Long userExtensionId); + + /** + * 保存用户扩展信息 + * + * @param userExtension 用户扩展信息 + */ + void save(@Param("userExtension") UserExtension userExtension); + + /** + * 更新用户扩展信息 + * + * @param userExtension 用户扩展信息 + */ + void update(@Param("userExtension") UserExtension userExtension); + + /** + * 根据用户扩展信息id删除用户扩展信息 + * + * @param userExtensionId + */ + void deleteById(@Param("userExtensionId") Long userExtensionId); + + /** + * 根据成长值范围,更新普通用户的等级 + * + * @param level 更新至该等级 + * @param minGrowth 最小成长值 + * @param maxGrowth 最大成长值 + */ + void updateUserLevel(@Param("level") Integer level, @Param("minGrowth") int minGrowth, @Param("maxGrowth") Integer maxGrowth); + + /** + * 更新用户的积分 + * + * @param userIds + * @param score + * @param growth + */ + void updateUserScoreOrGrowth(@Param("userIds") List userIds, @Param("score") Long score, @Param("growth") Integer growth); + + /** + * 根据用户Id列表, 获取用户列表信息 + * + * @param userIds + * @return + */ + List getByUserIdsAndLevelType(@Param("userIds") List userIds); + + /** + * 获取用户扩展信息 + * + * @param userId + * @return + */ + UserExtension getByUserId(@Param("userId") Long userId); + + /** + * 批量修改用户等级 + * + * @param userIds + * @param levelType 会员类型 必填 + * @return + */ + int batchUpdateLevelByUserIds(@Param("userIds") List userIds, @Param("levelType") Integer levelType); + + /** + * 后台批量修改用户余额 + * + * @param userIds + * @param balance 改变余额 + * @param now + * @return + */ + int updateBatchUserBalanceByUserIds(@Param("userIds") List userIds, @Param("balance") Long balance, @Param("now") DateTime now); + + /** + * 通过充值列表进行充值,会送积分成长值之类的 + * + * @param userRechargeVO 充值内容 + * @param userBalanceLog 充值记录 + */ + void updateByUserRecharge(@Param("userRechargeVO") UserRechargeVO userRechargeVO, @Param("userBalanceLog") MongoUserBalanceLogBO userBalanceLog); + + /** + * 通过直接输入金额进行充值 + * + * @param userBalanceLog 充值记录 + */ + void addByUserBalanceLog(@Param("userBalanceLog") MongoUserBalanceLogBO userBalanceLog); + + /** + * 扣减用户余额 + * + * @param changeBalance 余额 + * @param userId 用户id + * @return 更新状态 + */ + boolean deductionUserBalance(@Param("changeBalance") Long changeBalance, @Param("userId") Long userId); + + /** + * 更新用户等级,通过购买会员 + * + * @param userId 用户id + * @param afterLevel 购买后的等级 + */ + void updateUserLevelByBuyVip(@Param("userId") Long userId, @Param("afterLevel") Integer afterLevel); + + /** + * 过滤已存在的用户拓展信息 + * @param userExtensions + * @return + */ + List filterExistExtensions(@Param("userExtensions") List userExtensions); + + /** + * 批量保存用户扩展表信息 + * + * @param userExtensions 扩展表参数 + * @return 影响行数 + */ + int saveBatch(@Param("userExtensions") List userExtensions); + + /** + * 批量修改用户扩展表积分 + * + * @param userExtensions 每个用户修改不通的积分 + * @return 影响行数 + */ + int batchUpdateScore(@Param("userExtensions") List userExtensions); + + /** + * 通过订单锁定用户积分 + * + * @param userId 用户id + * @param useScore 积分 + * @return 是否更新成功 + */ + int lockScoreBySubmitOrder(@Param("userId") Long userId, @Param("useScore") Long useScore); + + /** + * 更新积分信息 + * @param userId 用户id + * @param useScore 用户积分 + * @return 是否更新成功 + */ + int updateScoreByUserId(@Param("userId") Long userId, @Param("useScore") Long useScore); + + /** + * --------------数据分析相关sql-------------- + * 根据条件参数,统计会员数量 + * @param param 参数 + * @return 数量 + */ + Integer countMemberByParam(@Param("param") MemberReqDTO param); + + /** + * 先获取当前符合条件的会员ids + * @param param 筛选条件 + * @return 会员信息集合 + */ + List countByMemberTypeConditions(@Param("param") MemberReqDTO param); + + /** + * 修改用户余额 + * @param userExtension 用户扩展表信息 + */ + void updateBalanceByVersion(@Param("userExtension") UserExtension userExtension); + + /** + * 获取等级与普通会员成长值不匹配的用户 + * @param levelType 会员类型 + * @return userIds集合 + */ + List getGrowthLevelMismatchUserByLevelType(@Param("levelType") Integer levelType); + + /** + * 获取对应等级,会员类型的会员 + * @param level 会员等级 + * @param levelType 会员类型 + * @return + */ + List getLevelAndLevelType(@Param("level") Integer level, @Param("levelType") Integer levelType); + + /** + * 批量增加/减少用户level个等级 + * @param userIds 更新用户的userid集合 + * @param level 增加/减少的等级数值,level为正数:增加等级,负数:减少等级 + * @return 修改行数 + */ + int batchChangeLevelByUserIdsAndLevel(@Param("userIds") List userIds, @Param("level") Integer level); + + /** + * 将付费会员修改成普通会员,并且将会员等级改为普通会员等级的成长值相匹配的等级 + * @param userExtensionList 用户id集合 + * @param currentLevelType 当前会员类型 + * @param afterLevelType 改变后的会员类型 + */ + void batchUpdateTypeAndLevelByUserIds(@Param("userExtensionList") List userExtensionList, @Param("currentLevelType") Integer currentLevelType, @Param("afterLevelType") Integer afterLevelType); + + /** + * 批量更新拓展信息状态 + * @param userExtensionDTO 用户拓展信息 + * @param userIds 用户id集合 + */ + void updateBatchStatus(@Param("userExtensionDTO") UserExtensionDTO userExtensionDTO, + @Param("userIds") List userIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserMapper.java new file mode 100644 index 0000000..26e42cb --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserMapper.java @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import cn.hutool.core.date.DateTime; +import com.tmerclub.cloud.api.user.vo.*; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.user.dto.UserManagerDTO; +import com.tmerclub.cloud.user.model.User; +import com.tmerclub.cloud.user.vo.UserVO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 用户表 + * + * @author YXF + * @date 2020-12-08 11:18:04 + */ +public interface UserMapper { + + /** + * 获取用户表列表 + * @param userManagerDTO + * @return 用户表列表 + */ + List list(@Param("userManagerDTO") UserManagerDTO userManagerDTO); + + /** + * 根据用户表id获取用户表 + * + * @param userId 用户表id + * @return 用户表 + */ + UserApiVO getByUserId(@Param("userId") Long userId); + + /** + * 保存用户表 + * + * @param user 用户表 + */ + void save(@Param("user") User user); + + /** + * 更新用户表 + * + * @param user 用户表 + */ + void update(@Param("user") User user); + + /** + * 删除用户 + * + * @param userId 用户Id + */ + void deleteById(@Param("userId") Long userId); + + + /** + * 根据成长值范围,更新普通用户的等级 + * + * @param level 更新至该等级 + * @param minGrowth 最小成长值 + * @param maxGrowth 最大成长值 + */ + void updateUserLevel(@Param("level") Integer level, @Param("minGrowth") int minGrowth, @Param("maxGrowth") Integer maxGrowth); + + /** + * 根据用户id列表,获取用户信息 + * + * @param userIds + * @return + */ + List getUserByUserIds(@Param("userIds") List userIds); + + + /** + * 根据查询用户的条件,查询用户数量 + * + * @param userManagerDTO 用户查询条件 + * @return 数量 + */ + Long countUserPageByParam(@Param("userManagerDTO") UserManagerDTO userManagerDTO); + + /** + * 根据查询条件,获取会员信息 + * + * @param userManagerDTO 用户查询条件 + * @param pageAdapter + * @return 会员管理的会员信息列表 + */ + List listUserByParam(@Param("userManagerDTO") UserManagerDTO userManagerDTO, @Param("pageAdapter") PageAdapter pageAdapter); + + /** + * 将用户等级从用户扩展表同步到用户表里面 + * + * @param userIds + */ + void updateUserLevelByUserExtensionAndUserIds(@Param("userIds") List userIds); + + /** + * 更新用户等级,通过购买会员 + * + * @param userId 用户id + * @param afterLevel 购买后的等级 + * @param date 会员过期时间 + */ + void updateUserLevelByBuyVip(@Param("userId") Long userId, @Param("afterLevel") Integer afterLevel, @Param("date") Date date); + + /** + * 通过用户手机号查询多个用户信息 + * + * @param phones 手机号列表 + * @return 用户信息列表 + */ + List getUserListByPhones(@Param("phones") List phones); + + /** + * 过滤已存在的客户 + * @param users + * @return + */ + List filterExistUsers(@Param("users") List users); + + /** + * 批量保存用户 + * + * @param users 用户列表 + * @return 影响行数 + */ + int saveBatch(@Param("users") List users); + + /** + * 获取时间端类注册的用户 + * + * @param status 用户状态 + * @param startDate 开始时间 + * @param endDate 结束时间 + * @return 用户列表 + */ + List getUserByCreateTimeRange(@Param("status") Integer status, @Param("startDate") Date startDate, @Param("endDate") Date endDate); + + /** + * 根据时间范围获取会员人数统计信息 + * + * @param startTime + * @param endTime + * @return + */ + MemberOverviewVO getUserCountInfo(@Param("startTime") Date startTime, @Param("endTime") Date endTime); + + + /** + * 根据等级查询属于该等级的用户数 + * + * @param level 等级 + * @param levelType 类型 + * @return 用户数 + */ + int countUserByLevel(@Param("level") Integer level, @Param("levelType") Integer levelType); + + /** + * 获取截至日期之前的所有付费会员信息 + * + * @param endOfDay 截至日期 + * @return + */ + List selectMemberByEndTime(@Param("endOfDay") DateTime endOfDay); + + /** + * 将会员的类型以及等级,重用户扩展表同步掉user表 + * + * @param userIds 用ids + * @return + */ + int updateUserTypeLevelByUserExtensionAndUserIds(@Param("userIds") List userIds); + + /** + * 获取指定等级类型的用户id + * + * @param levelType + * @return + */ + List getUserIdListByLevel(@Param("levelType") Integer levelType); + + /** + * 根据搜索条件获取用户列表 + * + * @param userApiVO + * @return + */ + List getUserByParam(@Param("userApiVO") UserApiVO userApiVO); + + /** + * 统计时间段内的新增用户数量 + * + * @param startTime + * @param endTime + * @return + */ + Integer countNewUserByTime(@Param("startTime") Date startTime, @Param("endTime") Date endTime); + + + /** + * 获取时间段内的新增用户id列表 + * + * @param startTime + * @param endTime + * @return + */ + List listNewUserIdByTime(@Param("startTime") Date startTime, @Param("endTime") Date endTime); + + /** + * 获取指定用户列表 + * + * @param userIds + * @return + */ + List listUserByUserIds(@Param("userIds") List userIds); + + /** + * 获取用户信息列表 + * @param userManagerDTO + * @return + */ + List listUser(@Param("userManagerDTO") UserManagerDTO userManagerDTO); + + /** + * 统计会员数量(普通会员、付费会员) + * @param startTime + * @return + */ + MemberTrendRespVO countUserNumByType(@Param("startTime") Date startTime); + + /** + * 统计累计用户数、新增用户数、付费会员数 + * @param startTime + * @param endTime + * @return + */ + MemberCountVO statisticsUserNum(@Param("startTime") Date startTime, @Param("endTime") Date endTime); + + /** + * 获取第一个用户的注册时间 + * @return + */ + Date getInitialRegistrationTime(); + + /** + * 根据手机号获取用户列表 + * @param mobile + * @return + */ + List listUserByMobile(@Param("mobile") String mobile); + + /** + * 统计手机号对应的用户数量 + * + * @param phone 手机号 + * @return + */ + int countUserByPhone(@Param("phone") String phone); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRechargeMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRechargeMapper.java new file mode 100644 index 0000000..df519d4 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRechargeMapper.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.model.UserRecharge; +import com.tmerclub.cloud.user.vo.UserRechargeVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Set; + +/** + * 余额充值级别表 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public interface UserRechargeMapper { + + /** + * 获取余额充值级别表列表 + * @return 余额充值级别表列表 + */ + List list(); + + /** + * 根据余额充值级别表id获取余额充值级别表 + * + * @param rechargeId 余额充值级别表id + * @return 余额充值级别表 + */ + UserRecharge getByRechargeId(@Param("rechargeId") Long rechargeId); + + /** + * 保存余额充值级别表 + * @param userRecharge 余额充值级别表 + */ + void save(@Param("userRecharge") UserRecharge userRecharge); + + /** + * 更新余额充值级别表 + * @param userRecharge 余额充值级别表 + */ + void update(@Param("userRecharge") UserRecharge userRecharge); + + /** + * 根据余额充值级别表id删除余额充值级别表 + * @param rechargeId + */ + void deleteById(@Param("rechargeId") Long rechargeId); + + /** + * 获取充值信息 + * @param rechargeId + * @return + */ + UserRechargeVO getRechargeInfo(@Param("rechargeId") Long rechargeId); + + /** + * 获取余额充值名称 + * @param rechargeIds + * @return + */ + List listByRechargeIds(@Param("rechargeIds") Set rechargeIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRightsCouponMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRightsCouponMapper.java new file mode 100644 index 0000000..e6aa0fb --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRightsCouponMapper.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.model.UserRightsCoupon; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public interface UserRightsCouponMapper { + + /** + * 获取列表 + * + * @return 列表 + */ + List list(); + + /** + * 根据id获取 + * + * @param rightsCouponId id + * @return + */ + UserRightsCoupon getByRightsCouponId(@Param("rightsCouponId") Long rightsCouponId); + + /** + * 保存 + * + * @param userRightsCoupon + */ + void save(@Param("userRightsCoupon") UserRightsCoupon userRightsCoupon); + + /** + * 更新 + * + * @param userRightsCoupon + */ + void update(@Param("userRightsCoupon") UserRightsCoupon userRightsCoupon); + + /** + * 根据id删除 + * + * @param rightsCouponId + */ + void deleteById(@Param("rightsCouponId") Long rightsCouponId); + + /** + * 根据权益id删除 + * + * @param rightsId 权益id + */ + void deleteByRightsId(@Param("rightsId") Long rightsId); + + /** + * 根据优惠券id列表,获取权益id列表 + * + * @param couponIds 优惠券id列表 + * @return 权益id列表 + */ + List listRightsIdByCouponIds(@Param("couponIds") List couponIds); + + /** + * 根据优惠券id列表删除 + * + * @param couponIds 优惠券id列表 + */ + void deleteByCouponIds(@Param("couponIds") List couponIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserScoreLockMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserScoreLockMapper.java new file mode 100644 index 0000000..3a3460c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserScoreLockMapper.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.model.UserScoreLock; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 积分锁定信息 + * + * @author FrozenWatermelon + * @date 2021-05-19 19:54:55 + */ +public interface UserScoreLockMapper { + + /** + * 获取积分锁定信息列表 + * + * @return 积分锁定信息列表 + */ + List list(); + + /** + * 根据积分锁定信息id获取积分锁定信息 + * + * @param id 积分锁定信息id + * @return 积分锁定信息 + */ + UserScoreLock getById(@Param("id") Long id); + + /** + * 保存积分锁定信息 + * + * @param userScoreLock 积分锁定信息 + */ + void save(@Param("userScoreLock") UserScoreLock userScoreLock); + + /** + * 更新积分锁定信息 + * + * @param userScoreLock 积分锁定信息 + */ + void update(@Param("userScoreLock") UserScoreLock userScoreLock); + + /** + * 根据积分锁定信息id删除积分锁定信息 + * + * @param id + */ + void deleteById(@Param("id") Long id); + + /** + * 批量保存锁定积分 + * + * @param userScoreLocks 锁定积分记录 + */ + void saveBatch(@Param("userScoreLocks") List userScoreLocks); + + /** + * 获取需要解锁的用户积分id列表 + * + * @param orderId 订单id + * @return 用户的积分id列表 + */ + List listUserScoreLocksByOrderId(Long orderId); + + /** + * 将锁定状态标记为已解锁 + * + * @param status + * @param userScoreLockIds 用户锁定的ids + * @return + */ + int unLockByIds(@Param("status") Integer status, @Param("userScoreLockIds") List userScoreLockIds); + + /** + * 删除用户积分记录 + * @param userId 用户id + * @return + */ + void deleteByUserId(@Param("userId") Long userId); + + /** + * 根据业务id获取锁定记录 + * @param bizIds + * @return + */ + List listByBizIds(@Param("bizIds") List bizIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserTagMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserTagMapper.java new file mode 100644 index 0000000..1542c33 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserTagMapper.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.api.user.vo.UserTagApiVO; +import com.tmerclub.cloud.user.model.UserTag; +import com.tmerclub.cloud.user.vo.UserTagVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 客户标签 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserTagMapper { + + /** + * 获取客户标签列表 + * @param userTag 条件参数 + * @return 客户标签列表 + */ + List list(@Param("userTag") UserTag userTag); + + /** + * 根据客户标签id获取客户标签 + * + * @param userTagId 客户标签id + * @return 客户标签 + */ + UserTag getByUserTagId(@Param("userTagId") Long userTagId); + + /** + * 保存客户标签 + * @param userTag 客户标签 + */ + void save(@Param("userTag") UserTag userTag); + + /** + * 更新客户标签 + * @param userTag 客户标签 + */ + void update(@Param("userTag") UserTag userTag); + + /** + * 根据客户标签id删除客户标签 + * @param userTagId 客户标签id + */ + void deleteById(@Param("userTagId") Long userTagId); + + /** + * 统计已存在的数量 + * @param userTag 条件参数 + * @return 数量 + */ + int count(@Param("userTag") UserTag userTag); + + /** + * 批量修改标签人数 + * @param tagUser 标签人数map + * @return 修改行数 + */ + int updateBatchTagUserNum(@Param("tagUser") Map tagUser); + + /** + * 通过标签id集合获取标签集合 + * @param tagIds 标签id + * @return 标签列表 + */ + List getByUserTagIds(@Param("tagIds") List tagIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserTagUserMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserTagUserMapper.java new file mode 100644 index 0000000..6518d97 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserTagUserMapper.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.user.vo.UserTagApiVO; +import com.tmerclub.cloud.user.model.UserTagUser; +import com.tmerclub.cloud.user.vo.UserTagUserVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户和标签关联表 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserTagUserMapper { + + /** + * 获取用户和标签关联表列表 + * @return 用户和标签关联表列表 + */ + List list(); + + /** + * 根据用户和标签关联表id获取用户和标签关联表 + * + * @param userTagUserId 用户和标签关联表id + * @return 用户和标签关联表 + */ + UserTagUser getByUserTagUserId(@Param("userTagUserId") Long userTagUserId); + + /** + * 保存用户和标签关联表 + * @param userTagUser 用户和标签关联表 + */ + void save(@Param("userTagUser") UserTagUser userTagUser); + + /** + * 更新用户和标签关联表 + * @param userTagUser 用户和标签关联表 + */ + void update(@Param("userTagUser") UserTagUser userTagUser); + + /** + * 根据用户和标签关联表id删除用户和标签关联表 + * @param userTagUserId + */ + void deleteById(@Param("userTagUserId") Long userTagUserId); + + /** + * 获取用户的标签 + * @param userId 用户id + * @return 用户标签列表 + */ + List getUserTagsByUserId(@Param("userId") Long userId); + + /** + * 删除标签和用户的关联关系 + * @param userTagId 标签id + * @return 影响行数 + */ + int removeByUserTagId(@Param("userTagId") Long userTagId); + + /** + * 批量保存用户关联表信息 + * @param userTagUsers 用户关联标签集合 + * @return 影响行数 + */ + int saveBatch(@Param("userTagUsers") List userTagUsers); + + /** + * 查询多个用户的标签 + * @param userIds 用户id集合 + * @return 管理标签集合 + */ + List listByUserIds(@Param("userIds") List userIds); + + /** + * 移除标签通过用户id和标签关联id + * @param userId 用户id + * @param userTagId 用户标签关联id + * @return 结果 + */ + int removeByUserIdAndTagId(@Param("userId") Long userId, @Param("userTagId") Long userTagId); + + /** + * 通过标签获取标签下的用户信息 + * @param userTagIds 标签id集合 + * @return 用户列表 + */ + List getUserByTagIds(@Param("userTagIds") List userTagIds); + + /** + * 根据标签id删除用户与标签关联关系 + * @param tagId + * @return + */ + int deleteByTagId(@Param("tagId") Long tagId); + + /** + * 根据用户id删除用户标签信息 + * @param userId 用户id + * @return + */ + void deleteByUserId(@Param("userId") Long userId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/ShopCustomer.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/ShopCustomer.java new file mode 100644 index 0000000..c2eb67c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/ShopCustomer.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author FrozenWatermelon + * @date 2023-01-15 15:53:16 + */ +public class ShopCustomer extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺客户id + */ + private Long shopCustomerId; + + /** + * 用户id + */ + private Long userId; + + /** + * 会员名称 + */ + private String memberName; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 会员类型(-1:客户,0:免费会员,1:付费会员) + */ + private Integer levelType; + + /** + * 会员等级Id + */ + private Long levelId; + + /** + * 会员等级 + */ + private Integer level; + + /** + * 成长值 + */ + private Integer growth; + + /** + * 会员注册时间 + */ + private Date registTime; + + /** + * 付费会员到期时间 + */ + private Date vipEndTime; + + public Long getShopCustomerId() { + return shopCustomerId; + } + + public void setShopCustomerId(Long shopCustomerId) { + this.shopCustomerId = shopCustomerId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Long getLevelId() { + return levelId; + } + + public void setLevelId(Long levelId) { + this.levelId = levelId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getGrowth() { + return growth; + } + + public void setGrowth(Integer growth) { + this.growth = growth; + } + + public Date getRegistTime() { + return registTime; + } + + public void setRegistTime(Date registTime) { + this.registTime = registTime; + } + + public Date getVipEndTime() { + return vipEndTime; + } + + public void setVipEndTime(Date vipEndTime) { + this.vipEndTime = vipEndTime; + } + + @Override + public String toString() { + return "ShopCustomer{" + + "shopCustomerId=" + shopCustomerId + + ",userId=" + userId + + ",memberName=" + memberName + + ",shopId=" + shopId + + ",levelType=" + levelType + + ",levelId=" + levelId + + ",level=" + level + + ",growth=" + growth + + ",registTime=" + registTime + + ",vipEndTime=" + vipEndTime + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/User.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/User.java new file mode 100644 index 0000000..9b69693 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/User.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户表 + * + * @author YXF + * @date 2020-12-08 11:18:04 + */ +public class User extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * ID + */ + private Long userId; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * M(男) or F(女) + */ + private String sex; + + /** + * 例如:2009-11-27 + */ + private String birthDate; + + /** + * 头像图片路径 + */ + private String pic; + + /** + * 状态 1 正常 0 无效 + */ + private Integer status; + + /** + * 会员等级(冗余字段) + */ + private Integer level; + + /** + * vip结束时间 + */ + private Date vipEndTime; + + /** + * 等级条件 0 普通会员 1 付费会员 + */ + private Integer levelType; + + /** + * 手机号 (冗余字段) + */ + private String phone; + + /** + * 付费会员等级 + */ + private Integer vipLevel; + + /** + * 用户付费会员等级 商品个性化推荐 1:开启 0:关闭 + */ + private Integer prodRecommendation; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getBirthDate() { + return birthDate; + } + + public void setBirthDate(String birthDate) { + this.birthDate = birthDate; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Date getVipEndTime() { + return vipEndTime; + } + + public void setVipEndTime(Date vipEndTime) { + this.vipEndTime = vipEndTime; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getVipLevel() { + return vipLevel; + } + + public void setVipLevel(Integer vipLevel) { + this.vipLevel = vipLevel; + } + + public Integer getProdRecommendation() { + return prodRecommendation; + } + + public void setProdRecommendation(Integer prodRecommendation) { + this.prodRecommendation = prodRecommendation; + } + + @Override + public String toString() { + return "User{" + + "userId=" + userId + + ", nickName='" + nickName + '\'' + + ", sex='" + sex + '\'' + + ", birthDate='" + birthDate + '\'' + + ", pic='" + pic + '\'' + + ", status=" + status + + ", level=" + level + + ", vipEndTime=" + vipEndTime + + ", levelType=" + levelType + + ", phone='" + phone + '\'' + + ", vipLevel=" + vipLevel + + ", prodRecommendation=" + prodRecommendation + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserBalanceLog.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserBalanceLog.java new file mode 100644 index 0000000..5607214 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserBalanceLog.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 余额记录 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public class UserBalanceLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long balanceLogId; + + /** + * 用户id + */ + private Long userId; + + /** + * 充值id + */ + private Long rechargeId; + + /** + * 改变金额 + */ + private Long changeBalance; + + /** + * 收支类型 0支出 1收入 + */ + private Integer ioType; + + /** + * 支付编号(用于余额充值) + */ + private Long payId; + + /** + * 支付类型 + */ + private Integer payType; + + /** + * 1:充值 2:赠送 3:支付 4:退款 5:平台手动修改 6:购买会员 7.提现 + * RechargeTypeEnum + */ + private Integer type; + + /** + * 1:已支付 0:未支付(用于余额充值) + */ + private Integer isPayed; + + /** + * 退款单号(用于余额支付进行退款) + */ + private Long refundId; + /** + * 退款序号 + */ + private Integer refundNumber; + + /** + * 支付系统类型(0:默认支付, 1:通联支付) + */ + private Integer paySysType; + + public Integer getRefundNumber() { + return refundNumber; + } + + public void setRefundNumber(Integer refundNumber) { + this.refundNumber = refundNumber; + } + + public Long getBalanceLogId() { + return balanceLogId; + } + + public void setBalanceLogId(Long balanceLogId) { + this.balanceLogId = balanceLogId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getChangeBalance() { + return changeBalance; + } + + public void setChangeBalance(Long changeBalance) { + this.changeBalance = changeBalance; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Long getRechargeId() { + return rechargeId; + } + + public void setRechargeId(Long rechargeId) { + this.rechargeId = rechargeId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "UserBalanceLog{" + + "balanceLogId=" + balanceLogId + + ", userId=" + userId + + ", rechargeId=" + rechargeId + + ", changeBalance=" + changeBalance + + ", ioType=" + ioType + + ", payId=" + payId + + ", payType=" + payType + + ", type=" + type + + ", isPayed=" + isPayed + + ", refundId=" + refundId + + ", refundNumber=" + refundNumber + + ", paySysType=" + paySysType + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserConsignee.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserConsignee.java new file mode 100644 index 0000000..3a3281c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserConsignee.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户提货人信息 + * + * @author FrozenWatermelon + * @date 2020-12-15 17:18:56 + */ +public class UserConsignee extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long userConsigneeId; + + /** + * id + */ + private Long userId; + /** + * 提货人姓名 + */ + private String name; + + /** + * 提货人联系方式 + */ + private String mobile; + + public Long getUserConsigneeId() { + return userConsigneeId; + } + + public void setUserConsigneeId(Long userConsigneeId) { + this.userConsigneeId = userConsigneeId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "UserConsignee{" + + "userConsigneeId=" + userConsigneeId + + ", userId=" + userId + + ", name='" + name + '\'' + + ", mobile='" + mobile + '\'' + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserGrowthLog.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserGrowthLog.java new file mode 100644 index 0000000..0e6431f --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserGrowthLog.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户成长值记录 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserGrowthLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 成长值获取记录表 + */ + private Long logId; + + /** + * 用户id + */ + private Long userId; + + /** + * 来源 0系统修改 1 订单 + */ + private Integer source; + + /** + * 关联业务id + */ + private Long bizId; + + /** + * 变更成长值 + */ + private Integer changeGrowth; + + /** + * 备注 + */ + private String remarks; + + public Long getLogId() { + return logId; + } + + public void setLogId(Long logId) { + this.logId = logId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getChangeGrowth() { + return changeGrowth; + } + + public void setChangeGrowth(Integer changeGrowth) { + this.changeGrowth = changeGrowth; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "UserGrowthLog{" + + "logId=" + logId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",userId=" + userId + + ",source=" + source + + ",bizId=" + bizId + + ",changeGrowth=" + changeGrowth + + ",remarks=" + remarks + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserLevelLog.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserLevelLog.java new file mode 100644 index 0000000..e0e8c11 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserLevelLog.java @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户等级记录 + * + * @author FrozenWatermelon + * @date 2021-05-14 11:04:52 + */ +public class UserLevelLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 等级记录表 + */ + private Long levelLogId; + + /** + * 用户id + */ + private Long userId; + + /** + * 变更类型 -1降级 0不变 1升级 + */ + private Integer levelIoType; + + /** + * 等级变更原因1.成长值不足 2.成长值足够 3.购买会员 4.续费会员 5.会员到期 + */ + private Integer levelChangeReason; + + /** + * 变更之前等级 + */ + private Integer beforeLevel; + + /** + * 变更之前的等级类型 0:普通会员 1:付费会员 + */ + private Integer beforeLevelType; + + /** + * 变更之后的等级 + */ + private Integer afterLevel; + + /** + * 变更之后的等级类型 0:普通会员 1:付费会员 + */ + private Integer afterLevelType; + + private String levelName; + + /** + * 支付单号 + */ + private Long payId; + + /** + * 是否支付1已支付0未支付 + */ + private Integer isPayed; + + /** + * 支付类型 + */ + private Integer payType; + + /** + * 支付系统类型(0:默认支付, 1:通联支付) + */ + private Integer paySysType; + + /** + * 支付金额 + */ + private Long payAmount; + + /** + * 期数类型(0:月,1:季,2:年) + */ + private Integer termType; + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public Integer getTermType() { + return termType; + } + + public void setTermType(Integer termType) { + this.termType = termType; + } + + public Long getLevelLogId() { + return levelLogId; + } + + public void setLevelLogId(Long levelLogId) { + this.levelLogId = levelLogId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getLevelIoType() { + return levelIoType; + } + + public void setLevelIoType(Integer levelIoType) { + this.levelIoType = levelIoType; + } + + public Integer getLevelChangeReason() { + return levelChangeReason; + } + + public void setLevelChangeReason(Integer levelChangeReason) { + this.levelChangeReason = levelChangeReason; + } + + public Integer getBeforeLevel() { + return beforeLevel; + } + + public void setBeforeLevel(Integer beforeLevel) { + this.beforeLevel = beforeLevel; + } + + public Integer getBeforeLevelType() { + return beforeLevelType; + } + + public void setBeforeLevelType(Integer beforeLevelType) { + this.beforeLevelType = beforeLevelType; + } + + public Integer getAfterLevel() { + return afterLevel; + } + + public void setAfterLevel(Integer afterLevel) { + this.afterLevel = afterLevel; + } + + public Integer getAfterLevelType() { + return afterLevelType; + } + + public void setAfterLevelType(Integer afterLevelType) { + this.afterLevelType = afterLevelType; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "UserLevelLog{" + + "levelLogId=" + levelLogId + + ", userId=" + userId + + ", levelIoType=" + levelIoType + + ", levelChangeReason=" + levelChangeReason + + ", beforeLevel=" + beforeLevel + + ", beforeLevelType=" + beforeLevelType + + ", afterLevel=" + afterLevel + + ", afterLevelType=" + afterLevelType + + ", levelName='" + levelName + '\'' + + ", payId=" + payId + + ", isPayed=" + isPayed + + ", payType=" + payType + + ", paySysType=" + paySysType + + ", payAmount=" + payAmount + + ", termType=" + termType + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRecharge.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRecharge.java new file mode 100644 index 0000000..4fc11cb --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRecharge.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 余额充值级别表 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public class UserRecharge extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 充值id + */ + private Long rechargeId; + + /** + * 充值余额标题 + */ + private String rechargeTitle; + + /** + * 充值金额 + */ + private Long rechargeAmount; + + /** + * 背景图片 + */ + private String img; + + /** + * 赠送金额 + */ + private Long presAmount; + + /** + * 赠送积分 + */ + private Long presScore; + + /** + * 赠送成长值 + */ + private Integer presGrowth; + + /** + * 顺序 + */ + private Integer seq; + + public Long getRechargeId() { + return rechargeId; + } + + public void setRechargeId(Long rechargeId) { + this.rechargeId = rechargeId; + } + + public String getRechargeTitle() { + return rechargeTitle; + } + + public void setRechargeTitle(String rechargeTitle) { + this.rechargeTitle = rechargeTitle; + } + + public Long getRechargeAmount() { + return rechargeAmount; + } + + public void setRechargeAmount(Long rechargeAmount) { + this.rechargeAmount = rechargeAmount; + } + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public Long getPresAmount() { + return presAmount; + } + + public void setPresAmount(Long presAmount) { + this.presAmount = presAmount; + } + + public Long getPresScore() { + return presScore; + } + + public void setPresScore(Long presScore) { + this.presScore = presScore; + } + + public Integer getPresGrowth() { + return presGrowth; + } + + public void setPresGrowth(Integer presGrowth) { + this.presGrowth = presGrowth; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "UserRecharge{" + + "rechargeId=" + rechargeId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",rechargeTitle=" + rechargeTitle + + ",rechargeAmount=" + rechargeAmount + + ",img=" + img + + ",presAmount=" + presAmount + + ",presScore=" + presScore + + ",presGrowth=" + presGrowth + + ",seq=" + seq + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRights.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRights.java new file mode 100644 index 0000000..6d6cbf2 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRights.java @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户权益信息 + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserRights extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 权益id + */ + private Long rightsId; + + /** + * 权益名称 + */ + private String rightsName; + + /** + * 权益图标 + */ + private String icon; + + /** + * 权益简介 + */ + private String description; + + /** + * 权益详情 + */ + private String details; + + /** + * 状态:-1: 删除 0:禁用 1:正常(仅用于系统核销) + */ + private Integer status; + + /** + * 排序 从小到大 + */ + private Integer seq; + + /** + * 权益类型[0.自定义 1.积分回馈倍率 2.优惠券 3.积分赠送(数量) 4.会员折扣 5.包邮类型] + */ + private Integer rightsType; + + /** + * 积分回馈倍率 + */ + private Integer rateScore; + + /** + * 赠送积分 + */ + private Long presScore; + + /** + * 会员折扣 + */ + private Integer discount; + + /** + * 折扣范围[0.全平台 1.自营店] + */ + private Integer discountRange; + + /** + * 包邮类型[1.全平台包邮 2.自营店包邮] + */ + private Integer freeFeeType; + + public Long getRightsId() { + return rightsId; + } + + public void setRightsId(Long rightsId) { + this.rightsId = rightsId; + } + + public String getRightsName() { + return rightsName; + } + + public void setRightsName(String rightsName) { + this.rightsName = rightsName; + } + + public String getIcon() { + return icon; + } + + public String getDetails() { + return details; + } + + public void setDetails(String details) { + this.details = details; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getRightsType() { + return rightsType; + } + + public void setRightsType(Integer rightsType) { + this.rightsType = rightsType; + } + + public Integer getRateScore() { + return rateScore; + } + + public void setRateScore(Integer rateScore) { + this.rateScore = rateScore; + } + + public Long getPresScore() { + return presScore; + } + + public void setPresScore(Long presScore) { + this.presScore = presScore; + } + + public Integer getDiscount() { + return discount; + } + + public void setDiscount(Integer discount) { + this.discount = discount; + } + + public Integer getDiscountRange() { + return discountRange; + } + + public void setDiscountRange(Integer discountRange) { + this.discountRange = discountRange; + } + + public Integer getFreeFeeType() { + return freeFeeType; + } + + public void setFreeFeeType(Integer freeFeeType) { + this.freeFeeType = freeFeeType; + } + + @Override + public String toString() { + return "UserRights{" + + "rightsId=" + rightsId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",rightsName=" + rightsName + + ",icon=" + icon + + ",description=" + description + + ",details=" + details + + ",status=" + status + + ",seq=" + seq + + ",rightsType=" + rightsType + + ",rateScore=" + rateScore + + ",presScore=" + presScore + + ",discount=" + discount + + ",discountRange=" + discountRange + + ",freeFeeType=" + freeFeeType + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserScoreLock.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserScoreLock.java new file mode 100644 index 0000000..5e7370e --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserScoreLock.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 积分锁定信息 + * + * @author FrozenWatermelon + * @date 2021-05-19 19:54:55 + */ +public class UserScoreLock extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 状态-1已解锁 0待确定 1已锁定 + */ + private Integer status; + + /** + * 锁定积分数量 + */ + private Long score; + + /** + * 变动的积分id集合 + */ + private String scoreGetLogIds; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public String getScoreGetLogIds() { + return scoreGetLogIds; + } + + public void setScoreGetLogIds(String scoreGetLogIds) { + this.scoreGetLogIds = scoreGetLogIds; + } + + @Override + public String toString() { + return "UserScoreLock{" + + "id=" + id + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",userId=" + userId + + ",orderId=" + orderId + + ",status=" + status + + ",score=" + score + + ",scoreGetLogIds=" + scoreGetLogIds + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserScoreLog.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserScoreLog.java new file mode 100644 index 0000000..5ce9486 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserScoreLog.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户积分记录 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserScoreLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 日志id + */ + private Long logId; + + /** + * 用户id + */ + private Long userId; + + /** + * 1.购物 2.会员等级提升加积分 3.签到加积分 4.购物抵扣使用积分 5.积分过期 + */ + private Integer source; + + /** + * 变动积分数额 + */ + private Long score; + + /** + * 业务id + */ + private Long bizId; + + /** + * 出入类型 0=支出 1=收入 + */ + private Integer ioType; + + public Long getLogId() { + return logId; + } + + public void setLogId(Long logId) { + this.logId = logId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + @Override + public String toString() { + return "UserScoreLog{" + + "logId=" + logId + + ", userId=" + userId + + ", source=" + source + + ", score=" + score + + ", bizId=" + bizId + + ", ioType=" + ioType + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserWithdrawCash.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserWithdrawCash.java new file mode 100644 index 0000000..6f269ea --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserWithdrawCash.java @@ -0,0 +1,148 @@ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author gaozijie + * @date 2023-04-24 + */ +public class UserWithdrawCash extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 提现id + */ + private Long cashId; + + /** + * 用户id + */ + private Long userId; + + /** + * 支付系统类型 + */ + private Integer paySysType; + + /** + * 提现订单号 + */ + private String orderNo; + + /** + * 第三方提现订单号(通联) + */ + private String bizOrderNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现银行卡号 + */ + private String bankCardNo; + + /** + * 通联提现状态(0:待支付 1:申请成功 2:提现成功 3:提现失败) + */ + private Integer status; + + /** + * 提现失败原因 + */ + private String payFailMessage; + + public Long getCashId() { + return cashId; + } + + public void setCashId(Long cashId) { + this.cashId = cashId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public String getBankCardNo() { + return bankCardNo; + } + + public void setBankCardNo(String bankCardNo) { + this.bankCardNo = bankCardNo; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getPayFailMessage() { + return payFailMessage; + } + + public void setPayFailMessage(String payFailMessage) { + this.payFailMessage = payFailMessage; + } + + @Override + public String toString() { + return "UserWithdrawCash{" + + "cashId=" + cashId + + ", userId=" + userId + + ", paySysType=" + paySysType + + ", orderNo='" + orderNo + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", amount=" + amount + + ", bankCardNo='" + bankCardNo + '\'' + + ", status=" + status + + ", payFailMessage='" + payFailMessage + '\'' + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/CostPerPopupService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/CostPerPopupService.java new file mode 100644 index 0000000..bed0af4 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/CostPerPopupService.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.api.coupon.vo.CouponDataVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.dto.CostPerPopupDTO; +import com.tmerclub.cloud.user.model.CostPerPopup; +import com.tmerclub.cloud.user.vo.CostPerPopupVO; + +import java.util.List; + +/** + * 弹窗广告 + * @author TRACK + */ +public interface CostPerPopupService { + + /** + * 分页获取弹窗广告列表 + * @param pageDTO 分页参数 + * @param costPerPopupDTO 查询参数 + * @return 弹窗广告列表分页数据 + */ + PageVO page(PageDTO pageDTO, CostPerPopupDTO costPerPopupDTO); + + /** + * 获取当前可以推送的商家弹窗 + * @param isShopCustomer + * @param pageType + * @param spuId + * @param shopId + * @param userId + * @param uuid + * @return + */ + CostPerPopup getShopPopupByCondition(Integer isShopCustomer, Integer pageType, Long spuId, Long shopId, Long userId, Long uuid); + + /** + * 获取当前可以推送的平台弹窗 + * @param user + * @param pageType + * @param uuid + * @return + */ + CostPerPopup getSysPopupByCondition(UserApiVO user, Integer pageType, Long uuid); + + /** + * 根据弹窗广告id获取弹窗广告 + * @param popupId 弹窗广告id + * @return 弹窗广告 + */ + CostPerPopupVO getByPopupId(Long popupId); + + /** + * 组装数据 + * @param costPerPopupVO + */ + void handleInfo(CostPerPopupVO costPerPopupVO); + + /** + * 保存弹窗广告 + * @param costPerPopup 弹窗广告 + */ + void save(CostPerPopup costPerPopup); + + /** + * 更新弹窗广告 + * @param costPerPopup 弹窗广告 + */ + void update(CostPerPopup costPerPopup); + + /** + * 根据弹窗广告id删除弹窗广告 + * @param popupId 弹窗广告id + */ + void deleteById(Long popupId); + + /** + * 根据弹窗广告id失效弹窗广告 + * @param popupId 弹窗广告id + */ + void invalid(Long popupId); + + /** + * 根据参数获取对应列表 + * @param costPerPopup 参数 + * @return 列表 + */ + List listByParam( CostPerPopup costPerPopup); + + /** + * 投放弹窗广告 + * @return + */ + List putOnAdvertise(); + + /** + * 结束弹窗广告 + * @return + */ + List endAdvertise(); + + /** + * 删除弹窗广告商品关联 + * @param relateId 商品id或者等级id + * @param shopId + */ + void deletePopupByRelate(Long relateId, Long shopId); + + /** + * 批量删除缓存 + * @param popupIds + */ + void removeCacheBatch(List popupIds); + + /** + * 获取重复周数 + * @param costPerPopup + * @param dbCostPerPopup + * @return + */ + List getDuplicateList(CostPerPopup costPerPopup, CostPerPopupVO dbCostPerPopup); + + /** + * 删除关联页面 + * @param linkId + * @param shopId + * @param type + * @param categoryIds + */ + void deleteLink(Long linkId, Long shopId, String type, List categoryIds); + + /** + * 下架商家 + * @param shopIds + */ + void offlineShop(List shopIds); + + /** + * 批量下架优惠券 + * @param couponList + */ + void deleteLinkBatch(List couponList); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/PopupUserLogService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/PopupUserLogService.java new file mode 100644 index 0000000..53dbb3e --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/PopupUserLogService.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.user.bo.mongo.MongoPopupUserLogBO; +import com.tmerclub.cloud.user.model.CostPerPopup; + +import java.util.List; + +/** + * 弹窗广告用户日志 + * @author TRACK + */ +public interface PopupUserLogService { + + /** + * 删除弹窗广告记录 + * @param popupId + */ + void removeByPopupId(Long popupId); + + /** + * 保存弹窗日志 + * @param log + */ + void save(MongoPopupUserLogBO log); + + /** + * 根据条件获取 + * @param userId + * @param uuid + * @param costPerPopup + * @return + */ + List getByCondition(Long userId, Long uuid, CostPerPopup costPerPopup); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserConsigneeService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserConsigneeService.java new file mode 100644 index 0000000..120b166 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserConsigneeService.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.user.model.UserConsignee; +import org.apache.ibatis.annotations.Param; + +/** + * 用户提货人信息 + * + * @author FrozenWatermelon + * @date 2020-12-15 17:18:56 + */ +public interface UserConsigneeService { + + /** + * 根据用户id获取用户提货人信息 + * @param userId 用户id + * @return 用户提货人信息 + */ + UserConsignee getByUserId(Long userId); + + /** + * 保存用户提货人信息 + * @param userConsignee 用户提货人信息 + */ + void save(UserConsignee userConsignee); + + /** + * 更新用户提货人信息 + * @param userConsignee 用户提货人信息 + */ + void update(UserConsignee userConsignee); + + /** + * 删除用户提货人信息 + * + * @param userId 用户id + * @return + */ + void deleteByUserId(@Param("userId") Long userId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserGrowthLogService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserGrowthLogService.java new file mode 100644 index 0000000..8ae75fb --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserGrowthLogService.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.model.UserGrowthLog; +import com.tmerclub.cloud.user.vo.UserGrowthLogVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户成长值记录 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserGrowthLogService { + + /** + * 分页获取用户成长值记录列表 + * @param pageDTO 分页参数 + * @return 用户成长值记录列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据用户成长值记录id获取用户成长值记录 + * + * @param logId 用户成长值记录id + * @return 用户成长值记录 + */ + UserGrowthLog getByLogId(Long logId); + + /** + * 保存用户成长值记录 + * @param userGrowthLog 用户成长值记录 + */ + void save(UserGrowthLog userGrowthLog); + + /** + * 更新用户成长值记录 + * @param userGrowthLog 用户成长值记录 + */ + void update(UserGrowthLog userGrowthLog); + + /** + * 根据用户成长值记录id删除用户成长值记录 + * @param logId + */ + void deleteById(Long logId); + + /** + * 批量保存成长值记录 + * + * @param userGrowthLogs + */ + void saveBatch(List userGrowthLogs); + + /** + * 分页获取用户成长值记录列表 + * @param pageDTO 分页参数 + * @param userId 用户id + * @return 成长值记录列表 + */ + PageVO getPageByUserId(PageDTO pageDTO, Long userId); + + /** + * 根据业务id获取成长值日志 + * @param bizId 业务id + * @param ioType 0减少 1收入 + * @return 成长值变更日志 + */ + UserGrowthLog getByBizId(Long bizId, Integer ioType); + + /** + * 删除用户成长值记录列表 + * @param userId 用户id + * @return + */ + void deleteByUserId(@Param("userId") Long userId); + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserLevelTermService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserLevelTermService.java new file mode 100644 index 0000000..493b04f --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserLevelTermService.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.dto.UserLevelTermDTO; +import com.tmerclub.cloud.user.model.UserLevelTerm; +import com.tmerclub.cloud.user.vo.UserLevelTermVO; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public interface UserLevelTermService { + + /** + * 分页获取列表 + * + * @param pageDTO 分页参数 + * @return 列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据id获取 + * + * @param levelTermId id + * @return 等级期数 + */ + UserLevelTerm getByLevelTermId(Long levelTermId); + + /** + * 批量更新会员等级-期数关联信息 + * + * @param userLevelId 等级id + * @param userLevelTermDTO 等级期数 + */ + void updateBatch(Long userLevelId, List userLevelTermDTO); + + /** + * 批量保存会员等级-期数关联信息 + * + * @param userLevelId 等级id + * @param userLevelTerms 等级期数列表 + */ + void saveBatch(Long userLevelId, List userLevelTerms); + + /** + * 保存 + * + * @param userLevelTerm 等级期数 + */ + void save(UserLevelTerm userLevelTerm); + + /** + * 更新 + * + * @param userLevelTerm 等级期数 + */ + void update(UserLevelTerm userLevelTerm); + + /** + * 根据id删除 + * + * @param levelTermId id + */ + void deleteById(Long levelTermId); + + /** + * 根据用户等级id批量删除 + * + * @param userLevelId 用户等级id + */ + void deleteBatch(Long userLevelId); + + /** + * 根据等级id获取等级期数表 + * + * @param userLevelId 等级id + * @return 等级期数表 + */ + List getListByUserLevelId(Long userLevelId); + + /** + * 根据用户等级id查价格表 + * + * @param userLevelId 用户等级id + * @return 价格表 + */ + List getAmountAndTypeByUserLevelId(Long userLevelId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRightsCouponService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRightsCouponService.java new file mode 100644 index 0000000..9473aa1 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRightsCouponService.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.model.UserRightsCoupon; + +/** + * + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public interface UserRightsCouponService { + + /** + * 分页获取列表 + * @param pageDTO 分页参数 + * @return 列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据id获取 + * + * @param rightsCouponId id + * @return + */ + UserRightsCoupon getByRightsCouponId(Long rightsCouponId); + + /** + * 保存 + * @param userRightsCoupon + */ + void save(UserRightsCoupon userRightsCoupon); + + /** + * 更新 + * @param userRightsCoupon + */ + void update(UserRightsCoupon userRightsCoupon); + + /** + * 根据id删除 + * @param rightsCouponId id + */ + void deleteById(Long rightsCouponId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRightsService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRightsService.java new file mode 100644 index 0000000..2674b4f --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRightsService.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.dto.UserRightsDTO; +import com.tmerclub.cloud.user.vo.UserRightsVO; + +import java.util.List; + +/** + * 用户权益信息 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserRightsService { + + /** + * 分页获取用户权益信息列表 + * @param pageDTO 分页参数 + * @param userRightsDTO + * @return 用户权益信息列表分页数据 + */ + PageVO page(PageDTO pageDTO, UserRightsDTO userRightsDTO); + + + /** + * 根据用户权益信息id获取用户权益信息 + * + * @param rightsId 用户权益信息id + * @return 用户权益信息 + */ + UserRightsVO getByRightsId(Long rightsId); + + /** + * 保存用户权益信息 + * @param userRights 用户权益信息 + */ + void save(UserRightsDTO userRights); + + /** + * 更新用户权益信息 + * @param userRights 用户权益信息 + */ + void update(UserRightsDTO userRights); + + /** + * 根据用户权益信息id删除用户权益信息 + * @param rightsId + */ + void deleteById(Long rightsId); + + /** + * 获取权益列表 + * @param userRights + * @return + */ + List list(UserRightsDTO userRights); + + /** + * 删除权益缓存 + * @param rightsId 权益id + */ + void removeRightsCache(Long rightsId); + + /** + * 删除去重后的权益列表缓存 + * @param levelType + */ + void removeRightsByLevelTypeCache(Integer levelType); + + /** + * 根据会员类型获取去重后的权益列表 + * @param levelType + * @param level + * @return + */ + List listRightsByLevelType(Integer levelType, Integer level); + + /** + * 取消过期优惠券的绑定 + * @param couponIds + */ + void cancelBindingCoupons(List couponIds); + + /** + * 根据等级信息获取对应的等级权益 + * @param level + * @param levelType + * @return + */ + List listRightByLevel(Integer level, Integer levelType); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserScoreLogService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserScoreLogService.java new file mode 100644 index 0000000..a38a3c5 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserScoreLogService.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import cn.hutool.core.date.DateTime; +import com.tmerclub.cloud.api.user.vo.UserManagerVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.bo.mongo.MongoUserScoreLogBO; +import com.tmerclub.cloud.user.model.UserScoreLog; +import com.tmerclub.cloud.user.vo.UserScoreLogVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户积分记录 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserScoreLogService { + + /** + * 保存到mongodb + * @param mongoUserScoreLogBO + */ + void saveToMongdb(MongoUserScoreLogBO mongoUserScoreLogBO); + + /** + * 批量保存到mongodb + * @param list + */ + void saveBatchToMongodb(List list); + + /** + * 根据出入类型和积分状态分页获取用户积分记录列表 + * + * @param pageDTO 分页参数 + * @param ioType 出入类型 + * @param source 积分状态 + * @return 用户积分记录列表分页数据 + */ + PageVO pageByIoTypeAndSource(PageDTO pageDTO, Integer ioType, Integer source); + + /** + * 通过用户id,分页获取用户积分日志 + * + * @param pageDTO + * @param userId + * @return + */ + PageVO pageByUserId(PageDTO pageDTO, Long userId); + + /** + * 根据用户id删除用户积分记录 + * + * @param userId 用户id + */ + void deleteByUserId(@Param("userId") Long userId); + + /** + * 根据日志类型,用户id,开始时间和结束时间获取日志数量 + * + * @param type 日志类型 + * @param userId 用户id + * @param beginOfDay 开始时间 + * @param endOfDay 结束时间 + * @return 数量 + */ + Long countByUserIdAndDateTimeAndType(Integer type, Long userId, DateTime beginOfDay, DateTime endOfDay); + + /** + * 获取业务有关积分记录 + * + * @param userId 用户id + * @param bizId 业务id + * @param source 业务类型 + * @param ioType 收入/支出 + * @return + */ + UserScoreLog getOrderScoreLog(Long userId, Long bizId, Integer source, Integer ioType); + + /** + * 获取用户积分商品兑换记录列表 + * + * @param pageDTO + * @return + */ + PageVO scoreProdPage(PageDTO pageDTO); + + /** + * 根据退款id列表获取退款积分总数 + * + * @param refundIds + * @return + */ + Long getScoreCountByRefundIds(List refundIds); + + /** + * 根据用户id查询最近一条积分过期日志 + * + * @param userId + * @return + */ + UserScoreLog getExpireScoreLogByUserId(Long userId); + + /** + * 初始化积分记录到mongodb + */ + void initUserScoreLogToMongodb(); + + /** + * 补充用户列表积分数据 + * @param userList + * @return + */ + List setUserInfo(List userList); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserService.java new file mode 100644 index 0000000..1189101 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserService.java @@ -0,0 +1,281 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import cn.hutool.core.date.DateTime; +import com.tmerclub.cloud.api.user.bo.UidAndUserIdBO; +import com.tmerclub.cloud.api.user.vo.MemberOverviewVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.user.vo.UserManagerVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.dto.ShopCustomerDTO; +import com.tmerclub.cloud.user.dto.UserDTO; +import com.tmerclub.cloud.user.dto.UserManagerDTO; +import com.tmerclub.cloud.user.model.User; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.vo.UserVO; + +import java.util.Date; +import java.util.List; + +/** + * 用户表 + * + * @author YXF + * @date 2020-12-08 11:18:04 + */ +public interface UserService { + + /** + * 分页获取用户表列表 + * + * @param pageDTO 分页参数 + * @param userManagerDTO + * @return 用户表列表分页数据 + */ + PageVO page(PageDTO pageDTO, UserManagerDTO userManagerDTO); + + /** + * 根据用户表id获取用户表 + * + * @param userId 用户表id + * @return 用户表 + */ + UserApiVO getByUserId(Long userId); + + /** + * 更新用户表 + * + * @param user 用户表 + */ + void update(User user); + + /** + * 移除用户信息缓存 + * + * @param userId 用户id + */ + void removeUserCacheByUserId(Long userId); + + /** + * 根据成长值范围,更新普通用户的等级 + * + * @param level 更新至该等级 + * @param minGrowth 最小成长值 + * @param maxGrowth 最大成长值 + */ + void updateUserLevel(Integer level, int minGrowth, Integer maxGrowth); + + /** + * 根据用户id列表,获取用户信息 + * + * @param userIds + * @return + */ + List getUserByUserIds(List userIds); + + /** + * 根据用户id获取用户详细信息 + * + * @param userId 用户id + * @return 用户详细信息 + */ + UserApiVO getUserAndOpenIdsByUserId(Long userId); + + /** + * 用户注册并绑定第三方账号 + * + * @param mobile 手机号 + * @param password 密码 + * @param tempUid 用来找到openid进行关联 + * @return + */ + UidAndUserIdBO save(String mobile, String password, String tempUid); + + /** + * 修改用户手机号 + * + * @param userId 用户id + * @param mobile 手机号 + */ + void updateUserMobile(Long userId, String mobile); + + /** + * 获取会员信息 + * + * @param pageDTO 分页参数 + * @param userManagerDTO 会员信息 + * @return + */ + PageVO getUserInfoPage(PageDTO pageDTO, UserManagerDTO userManagerDTO); + + /** + * 获取会员信息列表 + * + * @param pageDTO 分页参数 + * @param userManagerDTO 会员信息 + * @return 用户信息列表 + */ + List getUserInfoList(PageDTO pageDTO, UserManagerDTO userManagerDTO); + + + /** + * 获用户信息 + * + * @param userId 用户id + * @param shopId + * @return + */ + UserManagerVO getUserInfo(Long userId, Long shopId); + + + /** + * 将用户等级从用户扩展表同步到用户表里面 + * + * @param userIds + */ + void updateUserLevelByUserExtensionAndUserIds(List userIds); + + /** + * 修改用户昵称、状态 + * + * @param userDTO + */ + void updateUserInfo(UserDTO userDTO); + + /** + * 通过用户手机号查询多个用户信息 + * + * @param phones 手机号列表 + * @return 用户信息列表 + */ + List getUserListByPhones(List phones); + + /** + * 批量保存用户 + * + * @param userList 用户信息集合 + * @param userExtensionList 用户扩展信息列表 + */ + void batchUser(List userList, List userExtensionList); + + /** + * 获取时间端类注册的用户 + * + * @param status 用户状态 + * @param startDate 开始时间 + * @param endDate 结束时间 + * @return 用户列表 + */ + List getUserByCreateTimeRange(Integer status, Date startDate, Date endDate); + + /** + * 根据结束时间获取客户人数概况 + * + * @param endTime + * @return + */ + MemberOverviewVO getUserCountInfo(Date endTime); + + /** + * 根据手机号查询用户信息 + * + * @param mobile 手机号 + * @return 用户信息 + */ + List listUserByMobile(String mobile); + + /** + * 根据等级查询属于该等级的用户数 + * + * @param level 等级 + * @param levelType 类型 + * @return 用户数 + */ + Integer countUserByLevel(Integer level, Integer levelType); + + /** + * 获取截至日期之前的所有付费会员信息 + * + * @param endOfDay 截至日期 + * @return + */ + List selectMemberByEndTime(DateTime endOfDay); + + /** + * 将会员的类型以及等级,重用户扩展表同步掉user表 + * + * @param userIds 用ids + */ + void updateUserTypeLevelByUserExtensionAndUserIds(List userIds); + + /** + * 注销账户 + * + * @param userId + */ + void destroyUser(Long userId); + + /** + * 根据参数获取用户列表 + * + * @param userApiVO + * @return + */ + List getUserByParam(UserApiVO userApiVO); + + /** + * 根据参数获取客户列表 + * + * @param pageDTO + * @param shopCustomerDTO + * @return + */ + PageVO pageShopCustomerByParam(PageDTO pageDTO, ShopCustomerDTO shopCustomerDTO); + + /** + * 获取用户信息列表 + * + * @param userManagerDTO + * @return + */ + List listUser(UserManagerDTO userManagerDTO); + + /** + * 更新用户保存的通联信息 + * + * @return + */ + void updateUserInfoByAllinpay(); + + /** + * 统计时间段内的新增用户数量 + * @param startTime + * @param endTime + * @return + */ + Integer countNewUserByTime(Date startTime, Date endTime); + + /** + * 获取时间段内的新增用户id列表 + * @param startTime + * @param endTime + * @return + */ + List listNewUserIdByTime(Date startTime, Date endTime); + + /** + * 获取指定用户列表 + * @param userIds + * @return + */ + List listUserByUserIds(List userIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserTagUserService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserTagUserService.java new file mode 100644 index 0000000..817d86d --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserTagUserService.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.user.vo.UserTagApiVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.dto.UserAdminDTO; +import com.tmerclub.cloud.user.model.UserTagUser; +import com.tmerclub.cloud.user.vo.UserTagUserVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户和标签关联表 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserTagUserService { + + /** + * 分页获取用户和标签关联表列表 + * @param pageDTO 分页参数 + * @return 用户和标签关联表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据用户和标签关联表id获取用户和标签关联表 + * + * @param userTagUserId 用户和标签关联表id + * @return 用户和标签关联表 + */ + UserTagUser getByUserTagUserId(Long userTagUserId); + + /** + * 保存用户和标签关联表 + * @param userTagUser 用户和标签关联表 + */ + void save(UserTagUser userTagUser); + + /** + * 更新用户和标签关联表 + * @param userTagUser 用户和标签关联表 + */ + void update(UserTagUser userTagUser); + + /** + * 根据用户和标签关联表id删除用户和标签关联表 + * @param userTagUserId 用户标签关联自增id + */ + void deleteById(Long userTagUserId); + + /** + * 通过用户id获取到用户的标签 + * @param userId 用户id + * @return 标签列表 + */ + List getUserTagsByUserId(Long userId); + + /** + * 删除标签和用户的关联关系 + * @param userTagId 标签id + */ + void removeByUserTagId(Long userTagId); + + /** + * 批量保存用户关联表信息 + * + * @param userTagUsers 用户关联标签集合 + */ + void saveBatch(List userTagUsers); + + /** + * 批量修改会员标签 + * @param userAdminDTO 用户以及标签参数 + * @return 是否修改成功 true是 false否 + */ + boolean batchUpdateUserTag(UserAdminDTO userAdminDTO); + + /** + * 移除标签通过用户id和标签关联id + * @param userId 用户id + * @param userTagId 用户标签关联id + * @return 结果 + */ + boolean removeByUserIdAndTagId(Long userId, Long userTagId); + + /** + * 通过标签获取标签下的用户信息 + * @param userTagIds 标签id集合 + * @return 用户列表 + */ + List getUserByTagIds(List userTagIds); + + /** + * 根据用户标签id删除用户与标签关联关系 + * @param tagId + */ + void deleteByTagId(Long tagId); + + /** + * 根据用户id删除用户标签信息 + * @param userId 用户id + * @return + */ + void deleteByUserId(@Param("userId") Long userId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserWithdrawCashService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserWithdrawCashService.java new file mode 100644 index 0000000..3ebcc52 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserWithdrawCashService.java @@ -0,0 +1,69 @@ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.WithdrawApplyResp; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.dto.UserWithDrawDTO; +import com.tmerclub.cloud.user.model.UserWithdrawCash; +import com.tmerclub.cloud.user.vo.DateUserWithdrawCashVO; +import com.tmerclub.cloud.user.vo.UserWithdrawCashVO; + +import java.math.BigDecimal; + +/** + * @author gaozijie + * @date 2023-04-24 + */ +public interface UserWithdrawCashService { + + /** + * 提现申请 + * @param withDrawDTO + * @return + */ + WithdrawApplyResp withdrawApply(UserWithDrawDTO withDrawDTO); + + /** + * 提现确认支付 + * @param userWithDrawDTO + * @return + */ + PayByBackSmsResp payConfirm(UserWithDrawDTO userWithDrawDTO); + + /** + * 通过bizOrderNo获取提现记录 + * @param bizOrderNo 第三方订单号(通联) + * @return + */ + UserWithdrawCash getByBizOrderNo(String bizOrderNo); + + /** + * 更新提现记录 + * @param userWithdrawCash + */ + void update(UserWithdrawCash userWithdrawCash); + + /** + * 获取用户提现总金额 + * @param userId + * @return + */ + BigDecimal getTotalWithdrawAmount(Long userId); + + /** + * 分页获取用户提现记录 + * @param userId + * @param pageDTO + * @return + */ + PageVO pageUserWithdrawCashVOList(Long userId, PageDTO pageDTO); + + /** + * 分页获取按年月分组的用户提现记录 + * @param userId + * @param pageDTO + * @return + */ + PageVO pageDateUserWithdrawCashVOList(Long userId, PageDTO pageDTO); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/CostPerPopupServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/CostPerPopupServiceImpl.java new file mode 100644 index 0000000..45b88b6 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/CostPerPopupServiceImpl.java @@ -0,0 +1,589 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.tmerclub.cloud.api.coupon.constant.PutOnStatus; +import com.tmerclub.cloud.api.coupon.feign.CouponFeignClient; +import com.tmerclub.cloud.api.coupon.vo.CouponDataVO; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopRenovationFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.multishop.vo.ShopRenovationVO; +import com.tmerclub.cloud.api.product.feign.CategoryFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.UserCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.JumpType; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.SpuStatus; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.user.bo.CategoryLinkBO; +import com.tmerclub.cloud.user.bo.JumpUrlBO; +import com.tmerclub.cloud.user.bo.mongo.MongoPopupUserLogBO; +import com.tmerclub.cloud.user.constant.*; +import com.tmerclub.cloud.user.dto.CostPerPopupDTO; +import com.tmerclub.cloud.user.mapper.CostPerPopupMapper; +import com.tmerclub.cloud.user.mapper.UserLevelMapper; +import com.tmerclub.cloud.user.model.CostPerPopup; +import com.tmerclub.cloud.user.model.PopupRelate; +import com.tmerclub.cloud.user.model.UserLevel; +import com.tmerclub.cloud.user.service.CostPerPopupService; +import com.tmerclub.cloud.user.service.PopupRelateService; +import com.tmerclub.cloud.user.service.PopupUserLogService; +import com.tmerclub.cloud.user.vo.CostPerPopupVO; +import com.tmerclub.cloud.user.vo.PopupRelateVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 弹窗广告 + * @author TRACK + */ +@Service +public class CostPerPopupServiceImpl implements CostPerPopupService { + + @Autowired + private CostPerPopupMapper costPerPopupMapper; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @Autowired + private UserLevelMapper userLevelMapper; + @Autowired + private PopupRelateService popupRelateService; + @Autowired + private PopupUserLogService popupUserLogService; + @Autowired + private MongoTemplate mongoTemplate; + @DubboReference + private CouponFeignClient couponFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private CategoryFeignClient categoryFeignClient; + @DubboReference + private ShopRenovationFeignClient shopRenovationFeignClient; + + @Override + public PageVO page(PageDTO pageDTO, CostPerPopupDTO costPerPopupDTO) { + return PageUtil.doPage(pageDTO, () -> costPerPopupMapper.list(costPerPopupDTO)); + } + + @Override + public CostPerPopup getShopPopupByCondition(Integer isShopCustomer, Integer pageType, Long spuId, Long shopId, Long userId, Long uuid) { + // 当商家选了多件商品,频次一天一次,则进入这些商品详情页也只会弹一次,不会每个商品都弹 + List costPerPopupList = costPerPopupMapper.getShopPopupByCondition(isShopCustomer, pageType, spuId, shopId); + if (CollUtil.isEmpty(costPerPopupList)) { + return null; + } + // 校验时间 + Iterator iterator = costPerPopupList.iterator(); + while (iterator.hasNext()) { + CostPerPopup costPerPopup = iterator.next(); + // 校验是否为跳转优惠券并且用户领取过并且有库存 + if (checkCoupon(userId, iterator, costPerPopup)) { + continue; + } + if (Objects.equals(costPerPopup.getPushFrequency(), PushFrequencyEnum.EVERY_TIME.value())) { + // 每次进入直接返回 + return costPerPopup; + } + if (Objects.equals(costPerPopup.getPushFrequency(), PushFrequencyEnum.ONCE.value())) { + // 永久一次的校验是否曾推送过 + List list = popupUserLogService.getByCondition(userId, uuid, costPerPopup); + if (CollUtil.isEmpty(list)) { + return costPerPopup; + } + // 推送过了 + iterator.remove(); + continue; + } + checkWeek(iterator, costPerPopup); + } + if (CollUtil.isEmpty(costPerPopupList)) { + return null; + } + // 校验弹窗日志 + for (CostPerPopup costPerPopup : costPerPopupList) { + List list = popupUserLogService.getByCondition(userId, uuid, costPerPopup); + if (CollUtil.isEmpty(list)) { + return costPerPopup; + } + } + return null; + } + + private boolean checkCoupon(Long userId, Iterator iterator, CostPerPopup costPerPopup) { + // 如果是提示领取同一张优惠券的,则用户领取完之后不再推送 + JumpUrlBO jumpUrlBO = JSON.parseObject(costPerPopup.getJumpUrl(), JumpUrlBO.class); + if (!Objects.equals(jumpUrlBO.getType(), JumpType.COUPON.value())) { + return false; + } + Long couponId = Long.parseLong(jumpUrlBO.getLink()); + if (Objects.nonNull(userId)) { + Query query = new Query(Criteria.where("couponId").is(couponId).and("userId").is(userId)); + long receiveCount = mongoTemplate.count(query, "coupon_user"); + if (receiveCount > 0) { + // 优惠券领取过 + iterator.remove(); + return true; + } + } + // 校验库存 + Integer stock = couponFeignClient.getStockByCouponId(couponId).getData(); + return stock < 1; + } + + @Override + public CostPerPopup getSysPopupByCondition(UserApiVO user, Integer pageType, Long uuid) { + List levelIds = new ArrayList<>(Collections.singletonList(user.getUserLevelId())); + if (Objects.equals(user.getLevelType(), LevelTypeEnum.PAY_USER.value())) { + levelIds.add(user.getVipUserLevelId()); + } + List costPerPopupList = costPerPopupMapper.getSysPopupByCondition(levelIds, pageType); + if (CollUtil.isEmpty(costPerPopupList)) { + return null; + } + // 校验时间 + Iterator iterator = costPerPopupList.iterator(); + while (iterator.hasNext()) { + CostPerPopup costPerPopup = iterator.next(); + // 校验是否为跳转优惠券并且用户领取过 + if (checkCoupon(user.getUserId(), iterator, costPerPopup)) { + continue; + } + if (Objects.equals(costPerPopup.getPushFrequency(), PushFrequencyEnum.EVERY_TIME.value())) { + // 每次进入直接返回 + return costPerPopup; + } + if (Objects.equals(costPerPopup.getPushFrequency(), PushFrequencyEnum.ONCE.value())) { + // 永久一次的校验是否曾推送过 + List list = popupUserLogService.getByCondition(user.getUserId(), uuid, costPerPopup); + if (CollUtil.isEmpty(list)) { + return costPerPopup; + } + // 推送过了 + iterator.remove(); + } + checkWeek(iterator, costPerPopup); + } + if (CollUtil.isEmpty(costPerPopupList)) { + return null; + } + // 校验弹窗日志 + for (CostPerPopup costPerPopup : costPerPopupList) { + List list = popupUserLogService.getByCondition(user.getUserId(), uuid, costPerPopup); + if (CollUtil.isEmpty(list)) { + return costPerPopup; + } + } + return null; + } + + private static void checkWeek(Iterator iterator, CostPerPopup costPerPopup) { + if (Objects.equals(costPerPopup.getPushFrequency(), PushFrequencyEnum.CUSTOM.value()) && StrUtil.isNotBlank(costPerPopup.getWeekFrequency())) { + List weeks = Arrays.stream(costPerPopup.getWeekFrequency().split(StrUtil.COMMA)).toList(); + int week = DateUtil.dayOfWeek(new Date()); + if (!weeks.contains(String.valueOf(week))) { + iterator.remove(); + } + } + } + + @Override + @Cacheable(value = UserCacheNames.POPUP_KEY, key = "#popupId") + public CostPerPopupVO getByPopupId(Long popupId) { + CostPerPopup popup = costPerPopupMapper.getByPopupId(popupId); + CostPerPopupVO popupVO = BeanUtil.map(popup, CostPerPopupVO.class); + List relateList = popupRelateService.getByPopupId(popupId); + if (CollUtil.isNotEmpty(relateList)) { + List popupRelateVOList = BeanUtil.mapAsList(relateList, PopupRelateVO.class); + popupVO.setPopupRelateList(popupRelateVOList); + } + return popupVO; + } + + @Override + public void handleInfo(CostPerPopupVO popup) { + if (CollUtil.isEmpty(popup.getPopupRelateList())) { + return; + } + List popupRelateVOList = popup.getPopupRelateList(); + // 组装商品/会员等级数据 + if (Objects.equals(popup.getPageType(), PopupPageTypeEnum.SPU_DETAIL.value())) { + List spuIds = popupRelateVOList.stream().map(PopupRelateVO::getSpuId).collect(Collectors.toList()); + List spuList = searchSpuFeignClient.listNotDeleteSpu(spuIds).getData(); + Map spuMap = spuList.stream().filter(spu -> Objects.equals(spu.getSpuStatus(), SpuStatus.PUT_SHELF.value())).collect(Collectors.toMap(SpuSearchVO::getSpuId, s -> s)); + Iterator iterator = popupRelateVOList.iterator(); + while (iterator.hasNext()) { + PopupRelateVO popupRelateVO = iterator.next(); + SpuSearchVO spuSearchVO = spuMap.get(popupRelateVO.getSpuId()); + if (Objects.isNull(spuSearchVO)) { + iterator.remove(); + continue; + } + popupRelateVO.setSpuName(spuSearchVO.getSpuName()); + popupRelateVO.setMainImgUrl(spuSearchVO.getMainImgUrl()); + } + } + boolean isLevel = Objects.equals(popup.getShopId(), Constant.PLATFORM_SHOP_ID) + && (Objects.equals(popup.getUserType(), PopupUserTypeEnum.FREE_USER.value()) + || Objects.equals(popup.getUserType(), PopupUserTypeEnum.PAY_USER.value())); + if (isLevel) { + List userLevelIds = popupRelateVOList.stream().map(PopupRelateVO::getUserLevelId).collect(Collectors.toList()); + List userLevels = userLevelMapper.listUserLevelIds(userLevelIds); + Map levelMap = userLevels.stream().collect(Collectors.toMap(UserLevel::getUserLevelId, UserLevel::getLevelName)); + Iterator iterator = popupRelateVOList.iterator(); + while (iterator.hasNext()) { + PopupRelateVO popupRelateVO = iterator.next(); + String levelName = levelMap.get(popupRelateVO.getUserLevelId()); + if (StrUtil.isBlank(levelName)) { + iterator.remove(); + continue; + } + popupRelateVO.setLevelName(levelName); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(CostPerPopup costPerPopup) { + setTime(costPerPopup); + checkJumpUrl(costPerPopup); + List spuIds = checkAndGetSpuIds(costPerPopup); + List userLevelIds = checkAndGetUserLevelIds(costPerPopup); + costPerPopupMapper.save(costPerPopup); + List popupRelates = getPopupRelates(costPerPopup, spuIds, userLevelIds); + if (CollUtil.isNotEmpty(popupRelates)) { + popupRelateService.saveBatch(popupRelates); + } + } + + private void checkJumpUrl(CostPerPopup costPerPopup) { + JumpUrlBO jumpUrlBO = JSON.parseObject(costPerPopup.getJumpUrl(), JumpUrlBO.class); + String type = jumpUrlBO.getType(); + if (Objects.equals(type, JumpType.SPU.value())) { + List data = searchSpuFeignClient.listNotDeleteSpu(Collections.singletonList(Long.valueOf(jumpUrlBO.getLink()))).getData(); + if (!Objects.equals(data.get(0).getSpuStatus(), SpuStatus.PUT_SHELF.value())) { + throw new LuckException("跳转商品状态异常,请重新选择"); + } + return; + } + if (Objects.equals(type, JumpType.CATEGORY.value())) { + List linkList = JSON.parseArray(jumpUrlBO.getLink(), CategoryLinkBO.class); + CategoryLinkBO categoryLinkBO = linkList.get(linkList.size() - 1); + CategoryVO categoryVO = categoryFeignClient.getByCategoryId(categoryLinkBO.getValue()).getData(); + if (!Objects.equals(categoryVO.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException("跳转分类状态异常,请重新选择"); + } + return; + } + if (Objects.equals(type, JumpType.SHOP.value())) { + ShopDetailVO shopDetailVO = shopDetailFeignClient.getShopDetailByShopId(Long.valueOf(jumpUrlBO.getLink())).getData(); + if (!Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.OPEN.value())) { + throw new LuckException("跳转店铺状态异常,请重新选择"); + } + return; + } + if (Objects.equals(type, JumpType.MINI_PAGE.value())) { + ShopRenovationVO shopRenovationVO = shopRenovationFeignClient.getbyRenovationId(Long.valueOf(jumpUrlBO.getLink())).getData(); + if (Objects.isNull(shopRenovationVO)) { + throw new LuckException("跳转微页面状态异常,请重新选择"); + } + return; + } + if (Objects.equals(type, JumpType.COUPON.value())) { + List couponDataVOList = couponFeignClient.getCouponListByCouponIds(Collections.singletonList(Long.valueOf(jumpUrlBO.getLink()))).getData(); + if (CollUtil.isEmpty(couponDataVOList) || !Objects.equals(couponDataVOList.get(0).getPutonStatus(), PutOnStatus.PUT_ON.value())) { + throw new LuckException("跳转优惠券状态异常,请重新选择"); + } + } + } + + private static void setTime(CostPerPopup costPerPopup) { + if (!Objects.equals(costPerPopup.getPushFrequency(), PushFrequencyEnum.CUSTOM.value())) { + costPerPopup.setWeekFrequency(null); + costPerPopup.setDayFrequency(null); + } + if (costPerPopup.getStartTime().getTime() > System.currentTimeMillis()) { + costPerPopup.setStatus(PopupStatusEnum.NOT_START.value()); + } else if (costPerPopup.getEndTime().getTime() < System.currentTimeMillis()) { + costPerPopup.setStatus(PopupStatusEnum.FINISH.value()); + } else { + costPerPopup.setStatus(PopupStatusEnum.PUT_ON.value()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = UserCacheNames.POPUP_KEY, key = "#costPerPopup.popupId") + public void update(CostPerPopup costPerPopup) { + CostPerPopup dbPopup = costPerPopupMapper.getByPopupId(costPerPopup.getPopupId()); + if (Objects.isNull(dbPopup)) { + throw new LuckException("活动不存在"); + } + if (Objects.equals(dbPopup.getStatus(), PopupStatusEnum.FINISH.value())) { + throw new LuckException("当前活动已结束,无法更新信息"); + } + checkJumpUrl(costPerPopup); + setTime(costPerPopup); + List spuIds = checkAndGetSpuIds(costPerPopup); + List userLevelIds = checkAndGetUserLevelIds(costPerPopup); + costPerPopupMapper.update(costPerPopup); + List popupRelates = getPopupRelates(costPerPopup, spuIds, userLevelIds); + popupRelateService.updateBatch(costPerPopup.getPopupId(), popupRelates); + } + + private static List getPopupRelates(CostPerPopup costPerPopup, List spuIds, List userLevelIds) { + List popupRelates = new ArrayList<>(); + if (CollUtil.isNotEmpty(spuIds)) { + for (Long spuId : spuIds) { + PopupRelate popupRelate = new PopupRelate(costPerPopup.getPopupId(), spuId, null); + popupRelates.add(popupRelate); + } + } + if (CollUtil.isNotEmpty(userLevelIds)) { + for (Long userLevelId : userLevelIds) { + PopupRelate popupRelate = new PopupRelate(costPerPopup.getPopupId(), null, userLevelId); + popupRelates.add(popupRelate); + } + } + return popupRelates; + } + + private List checkAndGetUserLevelIds(CostPerPopup costPerPopup) { + List userLevelIds = new ArrayList<>(); + if (CollUtil.isNotEmpty(costPerPopup.getUserLevelIds())) { + List userLevels = userLevelMapper.listUserLevelIds(costPerPopup.getUserLevelIds()); + if (CollUtil.isEmpty(userLevels)) { + throw new LuckException("会员等级均不存在,请重新选择"); + } + userLevelIds = userLevels.stream().map(UserLevel::getUserLevelId).collect(Collectors.toList()); + } + return userLevelIds; + } + + private List checkAndGetSpuIds(CostPerPopup costPerPopup) { + List spuIds = new ArrayList<>(); + if (CollUtil.isNotEmpty(costPerPopup.getSpuIds())) { + List data = searchSpuFeignClient.listNotDeleteSpu(costPerPopup.getSpuIds()).getData(); + spuIds = data.stream().filter(spu -> Objects.equals(spu.getSpuStatus(), SpuStatus.PUT_SHELF.value())) + .map(SpuSearchVO::getSpuId).collect(Collectors.toList()); + if (CollUtil.isEmpty(spuIds)) { + throw new LuckException("商品状态均异常,请重新选择"); + } + } + return spuIds; + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = UserCacheNames.POPUP_KEY, key = "#popupId") + public void deleteById(Long popupId) { + costPerPopupMapper.deleteById(popupId); + // 弹窗广告关联商品/会员等级删除 + popupRelateService.deleteById(popupId); + // 弹窗广告记录删除 + popupUserLogService.removeByPopupId(popupId); + } + + @Override + @CacheEvict(value = UserCacheNames.POPUP_KEY, key = "#popupId") + @Transactional(rollbackFor = Exception.class) + public void invalid(Long popupId) { + costPerPopupMapper.invalid(popupId); + // 弹窗广告记录删除 + popupUserLogService.removeByPopupId(popupId); + } + + @Override + public List listByParam(CostPerPopup costPerPopup) { + return costPerPopupMapper.listByParam(costPerPopup); + } + + @Override + public List putOnAdvertise() { + List putOnIds = costPerPopupMapper.listPopUpByStatus(PopupStatusEnum.PUT_ON.value()); + if (CollUtil.isEmpty(putOnIds)) { + return new ArrayList<>(); + } + costPerPopupMapper.updateStatus(PopupStatusEnum.PUT_ON.value()); + return putOnIds; + } + + @Override + public List endAdvertise() { + List endIds = costPerPopupMapper.listPopUpByStatus(PopupStatusEnum.FINISH.value()); + if (CollUtil.isEmpty(endIds)) { + return new ArrayList<>(); + } + costPerPopupMapper.updateStatus(PopupStatusEnum.FINISH.value()); + return endIds; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deletePopupByRelate(Long relateThingId, Long shopId) { + List costPerPopupList = costPerPopupMapper.listNotEndByShopId(shopId); + if (CollUtil.isEmpty(costPerPopupList)) { + return; + } + // 批量删除关联 + List deleteIds = new ArrayList<>(); + // 批量更新没有关联商品/等级的弹窗广告为关闭状态 + List updateIds = new ArrayList<>(); + for (CostPerPopup costPerPopup : costPerPopupList) { + List relateList = popupRelateService.getByPopupId(costPerPopup.getPopupId()); + Map relateMap; + if (Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + relateMap = relateList.stream().collect(Collectors.toMap(PopupRelate::getUserLevelId, PopupRelate::getRelateId)); + } else { + relateMap = relateList.stream().collect(Collectors.toMap(PopupRelate::getSpuId, PopupRelate::getRelateId));; + } + Long relateId = relateMap.get(relateThingId); + if (Objects.isNull(relateId)) { + // 没有关联商品 + continue; + } + if (relateMap.keySet().size() == 1) { + // 只剩下这件商品/等级了,将弹窗广告关闭 + updateIds.add(costPerPopup.getPopupId()); + } + deleteIds.add(relateId); + } + if (CollUtil.isNotEmpty(deleteIds)) { + popupRelateService.deleteByRelateIds(deleteIds); + removeCacheBatch(deleteIds); + } + if (CollUtil.isNotEmpty(updateIds)) { + costPerPopupMapper.updateStatusBatch(updateIds); + } + } + + @Override + public void removeCacheBatch(List popupIds) { + List keys = new ArrayList<>(popupIds.size()); + for (Long popupId : popupIds) { + keys.add(UserCacheNames.POPUP_KEY + CacheNames.UNION + popupId); + } + RedisUtil.deleteBatch(keys); + } + + @Override + public List getDuplicateList(CostPerPopup costPerPopup, CostPerPopupVO dbCostPerPopup) { + List weeks = Arrays.stream(costPerPopup.getWeekFrequency().split(StrUtil.COMMA)).toList(); + List dbWeeks = Arrays.stream(dbCostPerPopup.getWeekFrequency().split(StrUtil.COMMA)).toList(); + return dbWeeks.stream().filter(weeks::contains).collect(Collectors.toList()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteLink(Long linkId, Long shopId, String type, List categoryIds) { + List shopIds = new ArrayList<>(); + shopIds.add(shopId); + shopIds.add(Constant.PLATFORM_SHOP_ID); + List costPerPopupList = costPerPopupMapper.listNotEndLinkByShopId(shopIds); + if (CollUtil.isEmpty(costPerPopupList)) { + return; + } + List updateIds = new ArrayList<>(); + for (CostPerPopup costPerPopup : costPerPopupList) { + JumpUrlBO jumpUrlBO = JSON.parseObject(costPerPopup.getJumpUrl(), JumpUrlBO.class); + if (!Objects.equals(jumpUrlBO.getType(), type)) { + continue; + } + if (Objects.nonNull(linkId) && !Objects.equals(jumpUrlBO.getLink(), String.valueOf(linkId))) { + continue; + } + if (Objects.nonNull(categoryIds) && Objects.equals(type, JumpType.CATEGORY.value())) { + // [{"label":"2024","value":3887},{"label":"1","value":3888},{"label":"8","value":3899}] + String categoryStr = jumpUrlBO.getLink(); + List linkList = JSON.parseArray(categoryStr, CategoryLinkBO.class); + CategoryLinkBO categoryLinkBO = linkList.get(linkList.size() - 1); + if (!categoryIds.contains(categoryLinkBO.getValue())) { + continue; + } + } + updateIds.add(costPerPopup.getPopupId()); + } + if (CollUtil.isNotEmpty(updateIds)) { + costPerPopupMapper.updateStatusBatch(updateIds); + removeCacheBatch(updateIds); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void offlineShop(List shopIds) { + List costPerPopupList = costPerPopupMapper.listNotEndLinkByShopId(shopIds); + if (CollUtil.isEmpty(costPerPopupList)) { + return; + } + List updateIds = costPerPopupList.stream().map(CostPerPopup::getPopupId).collect(Collectors.toList()); + costPerPopupMapper.updateStatusBatch(updateIds); + removeCacheBatch(updateIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteLinkBatch(List couponList) { + Map> couponMap = couponList.stream().collect(Collectors.groupingBy(CouponDataVO::getShopId)); + List updateIds = new ArrayList<>(); + for (Long shopId : couponMap.keySet()) { + List couponDataList = couponMap.get(shopId); + List couponIds = couponDataList.stream().map(CouponDataVO::getCouponId).toList(); + List shopIds = new ArrayList<>(); + shopIds.add(shopId); + shopIds.add(Constant.PLATFORM_SHOP_ID); + List costPerPopupList = costPerPopupMapper.listNotEndLinkByShopId(shopIds); + if (CollUtil.isEmpty(costPerPopupList)) { + continue; + } + for (CostPerPopup costPerPopup : costPerPopupList) { + JumpUrlBO jumpUrlBO = JSON.parseObject(costPerPopup.getJumpUrl(), JumpUrlBO.class); + if (!Objects.equals(jumpUrlBO.getType(), JumpType.COUPON.value())) { + continue; + } + if (!couponIds.contains(Long.valueOf(jumpUrlBO.getLink()))) { + continue; + } + updateIds.add(costPerPopup.getPopupId()); + } + } + if (CollUtil.isNotEmpty(updateIds)) { + costPerPopupMapper.updateStatusBatch(updateIds); + removeCacheBatch(updateIds); + } + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/ThirdApiAbutmentServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/ThirdApiAbutmentServiceImpl.java new file mode 100644 index 0000000..c8c4a2d --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/ThirdApiAbutmentServiceImpl.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.dto.AuthAccountWithSocialDTO; +import com.tmerclub.cloud.api.auth.dto.ThirdApiAbutmentUserDto; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.bean.PaySettlementConfig; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.user.bo.mongo.MongoUserScoreLogBO; +import com.tmerclub.cloud.user.constant.LevelTypeEnum; +import com.tmerclub.cloud.user.mapper.UserMapper; +import com.tmerclub.cloud.user.model.User; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.service.*; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; + +import java.util.Collections; +import java.util.Objects; + +/** + * @author xxw + * @version 1.0 + * @description: 第三方接口对接 + * @since 2023/12/18 15:03 + */ +@Service +public class ThirdApiAbutmentServiceImpl implements ThirdApiAbutmenService { + @Autowired + private UserService userService; + @Autowired + private UserMapper userMapper; + @DubboReference + private AccountFeignClient accountFeignClient; + @Autowired + private UserExtensionService userExtensionService; + @Autowired + private UserLevelService userLevelService; + @DubboReference + private ConfigFeignClient configFeignClient; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @Autowired + private UserScoreLogService userScoreLogService; + + @Override + public void regiserUser(ThirdApiAbutmentUserDto thirdApiAbutmentUserDto) { + + AuthAccountDTO authAccountDTO = getAuthAccountDTO(null, null, thirdApiAbutmentUserDto.getUserId()); + AuthAccountWithSocialDTO authAccountWithSocialDTO = new AuthAccountWithSocialDTO(); + authAccountWithSocialDTO.setAuthAccount(authAccountDTO); + User user = new User(); + user.setUserId(thirdApiAbutmentUserDto.getUserId()); + user.setLevel(Constant.USER_LEVEL_INIT); + user.setLevelType(LevelTypeEnum.ORDINARY_USER.value()); + user.setStatus(1); + user.setPhone(authAccountDTO.getPhone()); + user.setNickName(thirdApiAbutmentUserDto.getNickName()); + // 默认开启商品个性化推荐 + user.setProdRecommendation(1); + // 这里保存之后才有用户id + userMapper.save(user); + + // 保存统一账户信息 + ServerResponseEntity serverResponse = accountFeignClient.saveAccountWithSocial(authAccountWithSocialDTO); + // 抛异常回滚 + if (!serverResponse.isSuccess()) { + throw new LuckException(serverResponse.getMsg()); + } + + UserExtension userExtension = new UserExtension(); + userExtension.setBalance(0L); + userExtension.setActualBalance(0L); + userExtension.setAllinpayBalance(0L); + userExtension.setAllinpayActualBalance(0L); + userExtension.setAllinpayRealNameSet(0); + userExtension.setAllinpayPhoneBind(0); + userExtension.setAllinpayPayPwdSet(0); + userExtension.setAllinpayProtocolSign(0); + userExtension.setAllinpayPayAcctBind(0); + userExtension.setGrowth(0); + userExtension.setLevel(1); + userExtension.setLevelType(0); + userExtension.setScore(0L); + userExtension.setVersion(0); + userExtension.setSignDay(0); + // 上面保存这边才能拿到userId + userExtension.setUserId(user.getUserId()); + + userExtensionService.save(userExtension); + //用户注册成功后初始化用户数据 + MongoUserScoreLogBO mongoUserScoreLogBO = userLevelService.initUserInfoAndLevelInfo(userExtension, Constant.USER_LEVEL_INIT, LevelTypeEnum.ORDINARY_USER.value(), authAccountDTO.getPhone()); + + // 判断是否开启通联支付 + boolean isAllinpay = false; + String data = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG).getData(); + if (!ObjectUtils.isEmpty(data)) { + PaySettlementConfig config = JSON.parseObject(data, PaySettlementConfig.class); + isAllinpay = config.getPaySettlementType() != null + && Objects.equals(config.getPaySettlementType(), PaySysType.ALLINPAY.value()); + } + if (isAllinpay) { + // 若开通则同步创建通联个人会员 + allinpayFeignClient.batchCreatePersonalMember(Collections.singletonList(user.getUserId().toString())); + } + if (Objects.nonNull(mongoUserScoreLogBO)) { + userScoreLogService.saveToMongdb(mongoUserScoreLogBO); + } + } + + private static AuthAccountDTO getAuthAccountDTO(String mobile, String password, Long userId) { + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setPassword(password); + authAccountDTO.setPhone(mobile); + authAccountDTO.setIsAdmin(0); + authAccountDTO.setSysType(SysTypeEnum.ORDINARY.value()); + authAccountDTO.setStatus(1); + authAccountDTO.setUserId(userId); + return authAccountDTO; + } + + @Override + public void updateUser(ThirdApiAbutmentUserDto thirdApiAbutmentUserDto) { + User user = new User(); + user.setUserId(thirdApiAbutmentUserDto.getUserId()); + user.setNickName(thirdApiAbutmentUserDto.getNickName()); + userService.update(user); + } + + @Override + public void disableUser(Long userId) { + User user = new User(); + user.setUserId(userId); + user.setStatus(StatusEnum.DISABLE.value()); + userService.update(user); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserExtensionServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserExtensionServiceImpl.java new file mode 100644 index 0000000..3e3fabf --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserExtensionServiceImpl.java @@ -0,0 +1,501 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderRefundFeignClient; +import com.tmerclub.cloud.api.order.vo.OrderRefundVO; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.bo.UserOrderScoreBo; +import com.tmerclub.cloud.api.user.dto.UserExtensionDTO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.bo.EsOrderItemBO; +import com.tmerclub.cloud.common.order.constant.OrderCloseType; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.constant.ReturnProcessStatusEnum; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO; +import com.tmerclub.cloud.user.bo.mongo.MongoUserScoreLogBO; +import com.tmerclub.cloud.user.constant.*; +import com.tmerclub.cloud.user.mapper.UserExtensionMapper; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.model.UserGrowthLog; +import com.tmerclub.cloud.user.model.UserScoreGetLog; +import com.tmerclub.cloud.user.model.UserScoreLog; +import com.tmerclub.cloud.user.service.*; +import com.tmerclub.cloud.user.vo.*; +import org.apache.commons.collections.CollectionUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 用户扩展信息 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@Service +public class UserExtensionServiceImpl implements UserExtensionService { + + private static final Logger log = LoggerFactory.getLogger(UserExtensionServiceImpl.class); + + @Autowired + private UserExtensionMapper userExtensionMapper; + @Autowired + private UserLevelService userLevelService; + @Autowired + private UserRightsService userRightsService; + @Autowired + private UserScoreLogService userScoreLogService; + @Autowired + private UserScoreGetLogService userScoreGetLogService; + @Autowired + private UserGrowthLogService userGrowthLogService; + @Autowired + private SegmentManager segmentManager; + @Autowired + private RocketMQTemplate addUserScoreLogTemplate; + @Autowired + private RocketMQTemplate addUserBalanceLogTemplate; + @DubboReference + private ConfigFeignClient configFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + @DubboReference + private OrderRefundFeignClient orderRefundFeignClient; + + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> userExtensionMapper.list()); + } + + @Override + public UserExtension getByUserExtensionId(Long userExtensionId) { + return userExtensionMapper.getByUserExtensionId(userExtensionId); + } + + @Override + public void save(UserExtension userExtension) { + userExtensionMapper.save(userExtension); + } + + @Override + public void update(UserExtension userExtension) { + userExtensionMapper.update(userExtension); + } + + @Override + public void deleteById(Long userExtensionId) { + userExtensionMapper.deleteById(userExtensionId); + } + + @Override + public void updateUserLevel(Integer level, int minGrowth, Integer maxGrowth) { + userExtensionMapper.updateUserLevel(level, minGrowth, maxGrowth); + } + + @Override + public void updateUserScoreOrGrowth(List userIds, Long score, Integer growth) { + if (Objects.isNull(score) && Objects.isNull(growth)) { + return; + } + //增加/减少积分或者成长值 , sql中处理积分和成长值不能为负数,最小为0 + userExtensionMapper.updateUserScoreOrGrowth(userIds, score, growth); + } + + @Override + public List getByUserIdsAndLevelType(List userIds) { + return userExtensionMapper.getByUserIdsAndLevelType(userIds); + } + + @Override + public UserExtension getByUserId(Long userId) { + return userExtensionMapper.getByUserId(userId); + } + + + @Override + public void updateBatchUserBalanceByUserIds(List userIds, Long balance, DateTime now) { + userExtensionMapper.updateBatchUserBalanceByUserIds(userIds, balance, now); + } + + @Override + public List filterExistExtensions(List userExtensions) { + return userExtensionMapper.filterExistExtensions(userExtensions); + } + + @Override + public void saveBatch(List userExtensionList) { + userExtensionMapper.saveBatch(userExtensionList); + } + + @Override + public void updateScoreAndGrowth(Long orderId) { + ServerResponseEntity esOrderBoServerResponseEntity = orderFeignClient.getEsOrder(orderId); + if (!esOrderBoServerResponseEntity.isSuccess()) { + throw new LuckException(esOrderBoServerResponseEntity.getMsg()); + } + EsOrderBO esOrderBO = esOrderBoServerResponseEntity.getData(); + // 如果订单已经关闭(整单都已经退款了)不需要进行积分、成长值结算 + if (Objects.equals(esOrderBO.getStatus(), OrderStatus.CLOSE.value()) && Objects.equals(esOrderBO.getCloseType(), OrderCloseType.REFUND.value())) { + return; + } + // 如果是积分订单不能获取成长值和积分 + if (Objects.equals(esOrderBO.getOrderType(), OrderType.SCORE.value())) { + return; + } + // 判断订单是否有订单项退款成功,如果有减少用户可以获取的部分积分 + ServerResponseEntity> orderRefundListServerResponseEntity = orderRefundFeignClient.getOrderRefundByOrderIdAndRefundStatus(esOrderBO.getOrderId(), ReturnProcessStatusEnum.SUCCESS.value()); + if (!orderRefundListServerResponseEntity.isSuccess()) { + throw new LuckException(orderRefundListServerResponseEntity.getMsg()); + } + List orderRefunds = orderRefundListServerResponseEntity.getData(); + List orderItemIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollectionUtils.isNotEmpty(orderRefunds)) { + orderRefunds.forEach(refund -> orderItemIds.add(refund.getOrderItemId())); + } + // 这里保证了其幂等性 + UserScoreLog orderScoreLog = userScoreLogService.getOrderScoreLog(esOrderBO.getUserId(), esOrderBO.getOrderId(), ScoreLogTypeEnum.SHOP.value(), 1); + if (Objects.nonNull(orderScoreLog)) { + return; + } + // 根据比例取可以获取的积分上限 + List products = esOrderBO.getOrderItems(); + // 筛选用户可以获得的订单项积分 + products = products.stream().filter(prodOrderParam -> orderItemIds.stream().noneMatch( + orderItemId -> Objects.equals(orderItemId, prodOrderParam.getOrderItemId()))).collect(Collectors.toList()); + // 获取积分和成长值获取比例 + ServerResponseEntity scoreConfigServerResponseEntity = configFeignClient.getConfig(Constant.SCORE_CONFIG); + if (!scoreConfigServerResponseEntity.isSuccess()) { + throw new LuckException(scoreConfigServerResponseEntity.getMsg()); + } + ScoreCompleteConfigVO scoreParam = Json.parseObject(scoreConfigServerResponseEntity.getData(), ScoreCompleteConfigVO.class); + ServerResponseEntity growthConfigServerResponseEntity = configFeignClient.getConfig(Constant.GROWTH_CONFIG); + if (!growthConfigServerResponseEntity.isSuccess()) { + throw new LuckException(growthConfigServerResponseEntity.getMsg()); + } + GrowthCompleteConfigVO growthCompleteConfigVO = Json.parseObject(growthConfigServerResponseEntity.getData(), GrowthCompleteConfigVO.class); + if (Objects.isNull(scoreParam) && Objects.isNull(growthCompleteConfigVO)) { + return; + } + UserExtension userExtension = this.getByUserId(esOrderBO.getUserId()); + //初始每笔订单可以获取的成长值 + double growthPrice = Objects.requireNonNull(growthCompleteConfigVO).getBuyOrder(); + double getRatioLimit = Objects.isNull(scoreParam) || Objects.isNull(scoreParam.getGetRatioLimit()) ? 0.0 : scoreParam.getGetRatioLimit(); + long totalScore = 0; + //需要批量修改的orderItem + List orderItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (EsOrderItemBO product : products) { + double scoreLimit; + double score = Arith.div(product.getActualTotal(), Objects.requireNonNull(scoreParam).getShoppingGetScore()); + //计算出成长值 + growthPrice += Arith.div(PriceUtil.toDecimalPrice(product.getActualTotal()).doubleValue(), growthCompleteConfigVO.getBuyPrice()); + //判断积分购物获取是全平台还是根据分类上限 + scoreLimit = Arith.div(Arith.mul(esOrderBO.getActualTotal(), getRatioLimit), 100); + //上限取最小值 + score = Math.min(score, scoreLimit); + //根据用户等级获取积分倍数 + List userRights = userRightsService.listRightByLevel(userExtension.getLevel(), userExtension.getLevelType()); + for (UserRightsVO userRightsVO : userRights) { + if (userRightsVO.getRateScore() != null && userRightsVO.getRateScore() > 1) { + score = Arith.div(Arith.mul(score, userRightsVO.getRateScore()), 10); + } + } + long gainScore = (long) score; + if (gainScore <= 0) { + continue; + } + com.tmerclub.cloud.common.order.vo.OrderItemVO orderItem = new com.tmerclub.cloud.common.order.vo.OrderItemVO(); + orderItem.setOrderItemId(product.getOrderItemId()); + orderItem.setGainScore(gainScore); + orderItems.add(orderItem); + totalScore += gainScore; + } + checkScoreAndGrowth(esOrderBO, Objects.requireNonNull(scoreParam), growthCompleteConfigVO, userExtension, growthPrice, totalScore, orderItems); + } + + private void checkScoreAndGrowth(EsOrderBO esOrderBO, ScoreCompleteConfigVO scoreParam, GrowthCompleteConfigVO growthCompleteConfigVO, UserExtension userExtension, double growthPrice, long totalScore, List orderItems) { + // 如果成长值获取开关关闭了,则无法获取成长值 + if (Objects.isNull(growthCompleteConfigVO.getShopGrowthSwitch()) || !growthCompleteConfigVO.getShopGrowthSwitch()) { + growthPrice = 0; + } + if (CollectionUtils.isNotEmpty(orderItems) && totalScore > 0) { + orderFeignClient.updateOrderItemBatchById(orderItems); + } + // 成长值和积分大于0 增加用户成长值和积分 + if (growthPrice > 0 || totalScore > 0) { + userLevelService.addGrowthAndScore(growthPrice, totalScore, esOrderBO.getUserId(), esOrderBO.getOrderId(), userExtension, 1); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void refundScore(UserOrderScoreBo userOrderScoreBo) { + Long orderId = userOrderScoreBo.getOrderId(); + List saveUserScoreLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + UserScoreGetLog userScoreGetLog = userScoreGetLogService.getLogByBizId(orderId); + if (Objects.nonNull(userScoreGetLog)) { + Long completeOrderBack = userScoreGetLog.getUsableScore(); + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(userOrderScoreBo.getUserId()); + userScoreLog.setSource(ScoreLogTypeEnum.COMPLETE_ORDER_BACK.value()); + userScoreLog.setScore(completeOrderBack); + userScoreLog.setBizId(userOrderScoreBo.getRefundId()); + userScoreLog.setIoType(ScoreIoTypeEnum.EXPENDITURE.value()); + saveUserScoreLogList.add(userScoreLog); + userScoreGetLog.setStatus(-1); + userScoreGetLogService.update(userScoreGetLog); + userExtensionMapper.updateUserScoreOrGrowth(Collections.singletonList(userOrderScoreBo.getUserId()), -completeOrderBack, null); + } + + // 如果没有使用积分抵扣就不需要退回积分给用户 + if (Objects.isNull(userOrderScoreBo.getOrderScore()) || Objects.equals(0L, userOrderScoreBo.getOrderScore())) { + saveUserScoreLog(saveUserScoreLogList); + return; + } + + ServerResponseEntity esOrder = orderFeignClient.getEsOrder(orderId); + if (!esOrder.isSuccess()) { + throw new LuckException(esOrder.getMsg()); + } + Long refundId = userOrderScoreBo.getRefundId(); + ServerResponseEntity orderRefundResponse = orderRefundFeignClient.getOrderRefundByRefundId(refundId); + if (!orderRefundResponse.isSuccess()) { + throw new LuckException(esOrder.getMsg()); + } + EsOrderBO orderBO = esOrder.getData(); + // 获取退款项 + OrderRefundVO orderRefundVO = orderRefundResponse.getData(); + // 获取退还积分 + Long orderScore; + if (Objects.equals(1, orderRefundVO.getRefundType())) { + // 整单退款,退款的积分是整个订单的抵扣积分数值 + orderScore = orderBO.getOrderScore(); + } else { + // 单个退款,退款积分是该订单项下单优惠的积分抵扣数值 + // 单个退款,一定是有orderItemId的 + Long orderItemId = orderRefundVO.getOrderItemId(); + List orderItems = orderBO.getOrderItems(); + EsOrderItemBO orderItemVO = orderItems.stream().filter(item -> Objects.equals(item.getOrderItemId(), orderItemId)).findAny().orElse(null); + orderScore = Objects.isNull(orderItemVO) ? 0L : orderItemVO.getUseScore(); + } + // 退款退积分比例逻辑:下单选择了积分抵扣,如果订单退款,只退了支付的部分金额,抵扣的积分是退款订单项的抵扣使用积分全部都退回 + if (Objects.isNull(orderScore) || orderScore <= 0L) { + saveUserScoreLog(saveUserScoreLogList); + return; + } + Long userId = orderBO.getUserId(); + // 查看是否已有退还记录,如果已经退过积分了,就不用再次退积分了 + // 这里保证了其幂等性 + UserScoreLog orderScoreLog = userScoreLogService.getOrderScoreLog(userId, refundId, ScoreLogTypeEnum.SCORE_CASH_BACK.value(), 1); + if (Objects.nonNull(orderScoreLog)) { + saveUserScoreLog(saveUserScoreLogList); + return; + } + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(orderBO.getUserId()); + userScoreLog.setSource(ScoreLogTypeEnum.SCORE_CASH_BACK.value()); + userScoreLog.setScore(orderScore); + userScoreLog.setBizId(refundId); + userScoreLog.setIoType(ScoreIoTypeEnum.INCOME.value()); + + UserScoreGetLog addDetail = new UserScoreGetLog(); + addDetail.setStatus(ScoreGetLogStatusEnum.NORMAL.value()); + addDetail.setUserId(userId); + addDetail.setUsableScore(orderScore); + + saveUserScoreLogList.add(userScoreLog); + userScoreGetLogService.save(addDetail); + userExtensionMapper.updateUserScoreOrGrowth(Collections.singletonList(userId), orderScore, null); + saveUserScoreLog(saveUserScoreLogList); + } + + private void saveUserScoreLog(List saveUserScoreLogList) { + SendStatus sendStatus = addUserScoreLogTemplate.syncSend(RocketMqConstant.ADD_USER_SCORE_LOG_TOPIC, new GenericMessage<>(saveUserScoreLogList)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void registerUserScoreGrowthBalanceLog(List userExtensionList) { + // 积分、成长值、余额日志 + if (CollUtil.isEmpty(userExtensionList)) { + return; + } + List userScoreLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userScoreDetails = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userGrowthLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userBalanceLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + + List userBalanceLogIds = segmentManager.listSegmentId(DistributedIdKey.MALL4CLOUD_USER_BALANCE_LOG, userExtensionList.size()); + List userScoreLogIds = segmentManager.listSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG, userExtensionList.size()); + + int index = 0; + for (UserExtension userExtension : userExtensionList) { + Long userId = userExtension.getUserId(); + Integer growth = userExtension.getGrowth(); + Long score = userExtension.getScore(); + Long balance = userExtension.getBalance(); + // 积分日志 + if (score > 0) { + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(userScoreLogIds.get(index)); + userScoreLog.setUserId(userId); + userScoreLog.setSource(ScoreLogTypeEnum.SYSTEM.value()); + userScoreLog.setScore(score); + userScoreLog.setIoType(ScoreIoTypeEnum.INCOME.value()); + userScoreLogs.add(userScoreLog); + // 积分明细 + UserScoreGetLog userScoreGetLog = new UserScoreGetLog(); + userScoreGetLog.setUserId(userId); + userScoreGetLog.setUsableScore(score); + userScoreGetLog.setStatus(ScoreGetLogStatusEnum.NORMAL.value()); + userScoreDetails.add(userScoreGetLog); + } + if (growth > 0) { + // 成长值 + UserGrowthLog userGrowthLog = new UserGrowthLog(); + userGrowthLog.setUserId(userId); + userGrowthLog.setSource(GrowthLogSourceEnum.SYSTEM.value()); + userGrowthLog.setChangeGrowth(growth); + userGrowthLog.setRemarks("导入初始化设置成长值"); + userGrowthLogs.add(userGrowthLog); + } + if (balance > 0) { + // 余额日志 + MongoUserBalanceLogBO userBalanceLog = new MongoUserBalanceLogBO(); + userBalanceLog.setBalanceLogId(userBalanceLogIds.get(index)); + userBalanceLog.setUserId(userId); + userBalanceLog.setChangeBalance(balance); + userBalanceLog.setIoType(RechargeIoTypeEnum.INCOME.value()); + userBalanceLog.setType(RechargeTypeEnum.SYSTEM.value()); + userBalanceLog.setPaySysType(PaySysType.DEFAULT.value()); + userBalanceLogs.add(userBalanceLog); + } + index++; + } + if (CollUtil.isNotEmpty(userGrowthLogs)) { + userGrowthLogService.saveBatch(userGrowthLogs); + } + if (CollUtil.isNotEmpty(userScoreLogs)) { + userScoreGetLogService.saveBatch(userScoreDetails); + saveUserScoreLog(userScoreLogs); + } + if (CollUtil.isNotEmpty(userBalanceLogs)) { + saveUserBalanceLog(userBalanceLogs); + } + } + + private void saveUserBalanceLog(List userBalanceLogs) { + SendStatus sendStatus = addUserBalanceLogTemplate.syncSend(RocketMqConstant.ADD_USER_BALANCE_LOG_TOPIC, new GenericMessage<>(userBalanceLogs)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public void updateByUserRecharge(UserRechargeVO userRechargeVO, MongoUserBalanceLogBO userBalanceLog) { + userExtensionMapper.updateByUserRecharge(userRechargeVO, userBalanceLog); + } + + @Override + public void addByUserBalanceLog(MongoUserBalanceLogBO userBalanceLog) { + UserExtension userExtension = userExtensionMapper.getByUserId(userBalanceLog.getUserId()); + if (Objects.equals(userBalanceLog.getPaySysType(), PaySysType.DEFAULT.value())) { + // 修改默认余额(退款增加的余额不加到总余额中) + if (!Objects.equals(userBalanceLog.getType(), RechargeTypeEnum.REFUND.value())) { + userExtension.setBalance(userExtension.getBalance() + userBalanceLog.getChangeBalance()); + } + userExtension.setActualBalance(userExtension.getActualBalance() + userBalanceLog.getChangeBalance()); + } else if (Objects.equals(userBalanceLog.getPaySysType(), PaySysType.ALLINPAY.value())) { + // 修改通联余额(退款增加的余额不加到总余额中) + if (!Objects.equals(userBalanceLog.getType(), RechargeTypeEnum.REFUND.value())) { + userExtension.setAllinpayBalance(userExtension.getAllinpayBalance() + userBalanceLog.getChangeBalance()); + } + userExtension.setAllinpayActualBalance(userExtension.getAllinpayActualBalance() + userBalanceLog.getChangeBalance()); + } else { + return; + } + // 更新数据 + userExtensionMapper.update(userExtension); +// userExtensionMapper.addByUserBalanceLog(userBalanceLog); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void changeAllinpayBalance(Long userId, Long balance, Integer type) { + // 修改通联余额(余额增加,累计余额也进行计算) + UserExtension userExtension = userExtensionMapper.getByUserId(userId); + if (balance > 0 + && !Objects.equals(type, RechargeTypeEnum.REFUND.value())) { + userExtension.setAllinpayBalance(userExtension.getAllinpayBalance() + balance); + } + userExtension.setAllinpayActualBalance(userExtension.getAllinpayActualBalance() + balance); + userExtensionMapper.update(userExtension); + // 插入用户余额日志 + MongoUserBalanceLogBO userBalanceLog = new MongoUserBalanceLogBO(); + userBalanceLog.setBalanceLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_BALANCE_LOG)); + userBalanceLog.setUserId(userId); + userBalanceLog.setChangeBalance(Math.abs(balance)); + userBalanceLog.setIoType(balance >= 0L ? 1 : 0); + userBalanceLog.setType(type); + userBalanceLog.setIsPayed(1); + userBalanceLog.setPaySysType(PaySysType.ALLINPAY.value()); + saveUserBalanceLog(Collections.singletonList(userBalanceLog)); + } + + @Override + public List listUserExtensions(UserExtensionDTO userExtensionDTO) { + return userExtensionMapper.listUserExtensions(userExtensionDTO); + } + + @Override + public void updateBatchStatus(UserExtensionDTO userExtensionDTO, List userIds) { + if (CollectionUtils.isEmpty(userIds)) { + return; + } + userExtensionMapper.updateBatchStatus(userExtensionDTO, userIds); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserLevelServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserLevelServiceImpl.java new file mode 100644 index 0000000..1838b8a --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserLevelServiceImpl.java @@ -0,0 +1,1617 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.coupon.dto.BindCouponDTO; +import com.tmerclub.cloud.api.coupon.feign.CouponFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.vo.ScoreConfigApiVO; +import com.tmerclub.cloud.api.user.bo.BuyVipNotifyBO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.UserCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.bo.UserScoreChangeLogBO; +import com.tmerclub.cloud.user.bo.mongo.MongoUserScoreLogBO; +import com.tmerclub.cloud.user.constant.*; +import com.tmerclub.cloud.user.dto.UserAdminDTO; +import com.tmerclub.cloud.user.dto.UserLevelDTO; +import com.tmerclub.cloud.user.mapper.UserExtensionMapper; +import com.tmerclub.cloud.user.mapper.UserLevelMapper; +import com.tmerclub.cloud.user.mapper.UserMapper; +import com.tmerclub.cloud.user.model.*; +import com.tmerclub.cloud.user.service.*; +import com.tmerclub.cloud.user.vo.UserLevelVO; +import com.tmerclub.cloud.user.vo.UserRightsVO; +import com.tmerclub.cloud.user.vo.UserVO; +import org.apache.commons.collections.CollectionUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 会员等级表 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@Service +public class UserLevelServiceImpl implements UserLevelService { + + @Autowired + private UserLevelMapper userLevelMapper; + @Autowired + private UserScoreGetLogService userScoreGetLogService; + @Autowired + private UserScoreLogService userScoreLogService; + @Autowired + private UserLevelRightsService userLevelRightsService; + @Autowired + private UserMapper userMapper; + @Autowired + private UserLevelLogService userLevelLogService; + @Autowired + private UserLevelTermService userLevelTermService; + @Autowired + private RocketMQTemplate sendNotifyToUserTemplate; + @Autowired + private UserGrowthLogService userGrowthLogService; + @Autowired + private RocketMQTemplate levelUpCouponGiveTemplate; + @Autowired + private RocketMQTemplate levelDownCouponExpireTemplate; + @Autowired + private UserExtensionMapper userExtensionMapper; + @Autowired + private UserRightsService userRightsService; + @Autowired + private SegmentManager segmentManager; + @Autowired + private RocketMQTemplate addUserScoreLogTemplate; + @DubboReference + private ConfigFeignClient configFeignClient; + @DubboReference + private CouponFeignClient couponFeignClient; + @Autowired + private CostPerPopupService costPerPopupService; + + @Override + @Cacheable(cacheNames = UserCacheNames.LEVEL_LIST_KEY, key = "#levelType") + public List list(Integer levelType) { + List list = userLevelMapper.list(levelType, null); + for (UserLevelVO userLevelVO : list) { + userLevelVO.setCouponsNum(userLevelMapper.countCouponsNumByUserLevelId(userLevelVO.getUserLevelId())); + } + return list; + } + + @Override + @Cacheable(cacheNames = UserCacheNames.LEVEL_GET_KEY, key = "#userLevelId") + public UserLevelVO getByUserLevelId(Long userLevelId) { + return userLevelMapper.getByUserLevelId(userLevelId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(UserLevelDTO userLevelDTO) { + Integer count = userLevelMapper.getUserMaxLevelByLevelType(userLevelDTO.getLevelType()); + if (Objects.isNull(count)) { + count = 0; + } + count++; + if (Objects.equals(userLevelDTO.getLevel(), count)) { + userLevelDTO.setLevel(count); + } + userLevelDTO.setUpdateStatus(UpdateStatusEnum.UPDATE.value()); + userLevelMapper.save(userLevelDTO); + if (CollUtil.isNotEmpty(userLevelDTO.getUserRightsIds())) { + userLevelRightsService.save(userLevelDTO.getUserLevelId(), userLevelDTO.getUserRightsIds()); + } + if (userLevelDTO.getLevelType() == 1) { + userLevelTermService.updateBatch(userLevelDTO.getUserLevelId(), userLevelDTO.getUserLevelTerms()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(UserLevelDTO userLevelDTO) { + UserLevelService userLevelService = (UserLevelService) AopContext.currentProxy(); + UserLevelVO dbUserLevel = userLevelService.getByUserLevelId(userLevelDTO.getUserLevelId()); + // 普通会员,修改时成长值有变化,更新状态设置为未更新 + if (Objects.equals(userLevelDTO.getLevelType(), LevelTypeEnum.ORDINARY_USER.value()) + && !Objects.equals(dbUserLevel.getNeedGrowth(), userLevelDTO.getNeedGrowth())) { + userLevelDTO.setUpdateStatus(UpdateStatusEnum.WAIT_UPDATE.value()); + } + userLevelMapper.update(userLevelDTO); + if (userLevelDTO.getLevelType() == 1) { + userLevelTermService.updateBatch(userLevelDTO.getUserLevelId(), userLevelDTO.getUserLevelTerms()); + } + userLevelRightsService.update(userLevelDTO.getUserLevelId(), userLevelDTO.getUserRightsIds()); + if (Objects.equals(dbUserLevel.getLevelType(), LevelTypeEnum.ORDINARY_USER.value())) { + this.updateUserLevel(userLevelDTO.getLevel(), userLevelDTO.getNeedGrowth() - 1, null); + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByUserLevelId(Long userLevelId) { + UserLevelVO userLevelVO = userLevelMapper.getByUserLevelId(userLevelId); + if (Objects.equals(userLevelVO.getLevelType(), LevelTypeEnum.PAY_USER.value())) { + userLevelTermService.deleteBatch(userLevelId); + } + userLevelMapper.deleteByUserLevelId(userLevelId); + userLevelRightsService.deleteByUserLevelId(userLevelId); + if (Objects.equals(userLevelVO.getLevelType(), LevelTypeEnum.ORDINARY_USER.value())) { + // 批量将普通会员的等级与成长值不匹配的筛选出来,更新等级 + batchUpdateUserLevel(LevelTypeEnum.ORDINARY_USER.value()); + } + // 付费会员,在付费会员等级降低一级 + if (Objects.equals(userLevelVO.getLevelType(), LevelTypeEnum.PAY_USER.value())) { + batchChangePayUserLevel(userLevelVO); + } + // 删除弹窗广告等级关联 + costPerPopupService.deletePopupByRelate(userLevelId, Constant.PLATFORM_SHOP_ID); + userRightsService.removeRightsByLevelTypeCache(userLevelVO.getLevelType()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateUserLevel() { + List dbUserLevels = list(LevelTypeEnum.ORDINARY_USER.value()); + List updateList = new ArrayList<>(Constant.INITIAL_CAPACITY); + boolean isUpdate = false; + Integer level = 0; + Integer minNeedGrowth = 0; + Integer maxLevel = dbUserLevels.size(); + for (UserLevelVO userLevelVO : dbUserLevels) { + // 成长值处于会员等级变化的区间,更新用户等级 + if (isUpdate) { + this.updateUserLevel(level, minNeedGrowth - 1, userLevelVO.getNeedGrowth()); + isUpdate = false; + } + // 最后一个等级--把大于所需积分的普通用户都设为该等级 + if (Objects.equals(userLevelVO.getUpdateStatus(), UpdateStatusEnum.WAIT_UPDATE.value()) + && Objects.equals(userLevelVO.getLevel(), maxLevel)) { + this.updateUserLevel(userLevelVO.getLevel(), userLevelVO.getNeedGrowth() - 1, null); + updateList.add(userLevelVO.getUserLevelId()); + } else if (Objects.equals(userLevelVO.getUpdateStatus(), UpdateStatusEnum.WAIT_UPDATE.value())) { + isUpdate = true; + updateList.add(userLevelVO.getUserLevelId()); + } + level = userLevelVO.getLevel(); + minNeedGrowth = userLevelVO.getNeedGrowth(); + } + userLevelMapper.updateStatusByUserLevelIds(updateList); + // 批量将普通会员的等级与成长值不匹配的筛选出来,更新等级 + batchUpdateUserLevel(LevelTypeEnum.ORDINARY_USER.value()); + removeLevelListCache(LevelTypeEnum.ORDINARY_USER.value()); + } + + /** + * 修改会员等级, 该方法会根据成长值更新用户等级 + * 所以该方法只适合更新普通会员的等级 + * + * @param levelType 会员类型 + */ + private void batchUpdateUserLevel(Integer levelType) { + // 获取等级与普通会员成长值不匹配的用户 + List userIds = userExtensionMapper.getGrowthLevelMismatchUserByLevelType(levelType); + if (CollUtil.isEmpty(userIds)) { + return; + } + // 获取未修改用户等级 + List dbUserExtensions = userExtensionMapper.getByUserIdsAndLevelType(userIds); + // 批量修改用户等级 + userExtensionMapper.batchUpdateLevelByUserIds(userIds, levelType); + // 将用户等级从用户扩展表同步到用户表里面 + userMapper.updateUserLevelByUserExtensionAndUserIds(userIds); + // 获取修改后用户等级 + List userLevelLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userExtensions = userExtensionMapper.getByUserIdsAndLevelType(userIds); + Map extensionMap = userExtensions.stream().collect(Collectors.toMap(UserExtension::getUserId, (k) -> k)); + for (UserExtension dbUserExtension : dbUserExtensions) { + Long userId = dbUserExtension.getUserId(); + Integer beforeLevel = dbUserExtension.getLevel(); + UserExtension userExtension = extensionMap.get(userId); + Integer afterLevel = userExtension.getLevel(); + int changeLevel = afterLevel - beforeLevel; + if (changeLevel == 0) { + continue; + } + UserLevelLog userLevelLog = new UserLevelLog(); + userLevelLog.setUserId(userId); + userLevelLog.setLevelIoType(afterLevel.compareTo(beforeLevel)); + userLevelLog.setLevelChangeReason(LevelChangeReasonEnum.USER_LEVEL_CHANGE.value()); + userLevelLog.setBeforeLevel(beforeLevel); + userLevelLog.setBeforeLevelType(dbUserExtension.getLevelType()); + userLevelLog.setAfterLevel(afterLevel); + userLevelLog.setAfterLevelType(userExtension.getLevelType()); + userLevelLogs.add(userLevelLog); + // 清除缓存 + this.removeUserCacheByUserId(userId); + } + // 保存等级变化日志 + userLevelLogService.batchSaveUserLevelLogs(userLevelLogs); + + } + + /** + * 批量删除付费会员的等级 + * 当会员等级配置表删除一个付费会员等级配置,付费会员等级降低一级 + * + * @param userLevelVO 将要删除的等级配置信息 + */ + private void batchChangePayUserLevel(UserLevelVO userLevelVO) { + Integer level = userLevelVO.getLevel(); + if (level <= 1) { + return; + } + // 获取等级对应的付费会员 + List userExtensions = userExtensionMapper.getLevelAndLevelType(level, LevelTypeEnum.PAY_USER.value()); + if (CollUtil.isEmpty(userExtensions)) { + return; + } + List userIds = userExtensions.stream().map(UserExtension::getUserId).collect(Collectors.toList()); + List userLevelLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (UserExtension userExtension : userExtensions) { + Long userId = userExtension.getUserId(); + UserLevelLog userLevelLog = new UserLevelLog(); + userLevelLog.setUserId(userId); + userLevelLog.setLevelIoType(-1); + userLevelLog.setLevelChangeReason(LevelChangeReasonEnum.USER_LEVEL_CHANGE.value()); + userLevelLog.setBeforeLevel(userExtension.getLevel()); + userLevelLog.setBeforeLevelType(userExtension.getLevelType()); + userLevelLog.setAfterLevel(level - 1); + userLevelLog.setAfterLevelType(userExtension.getLevelType()); + userLevelLogs.add(userLevelLog); + } + // 批量将等级降低一级 + userExtensionMapper.batchChangeLevelByUserIdsAndLevel(userIds, -1); + // 将用户等级从用户扩展表同步到用户表里面 + userMapper.updateUserLevelByUserExtensionAndUserIds(userIds); + // 保存等级变化日志 + userLevelLogService.batchSaveUserLevelLogs(userLevelLogs); + // 清除缓存 + this.removeUserCacheByUserIds(userIds); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void batchUpdateGrowth(UserAdminDTO userAdminDTO) { + Integer growth = userAdminDTO.getGrowth(); + List userIds = userAdminDTO.getUserIds(); + boolean isUpdate = Objects.isNull(growth) || CollUtil.isEmpty(userIds) || Objects.equals(0, growth); + if (isUpdate) { + return; + } + // 修改前数据 + List dbUserExtensions = userExtensionMapper.getByUserIdsAndLevelType(userIds); + userIds = dbUserExtensions.stream().map(UserExtension::getUserId).collect(Collectors.toList()); + if (CollUtil.isEmpty(userIds)) { + return; + } + for (UserExtension extension : dbUserExtensions) { + int compare = Integer.compare(Integer.MAX_VALUE - extension.getGrowth(), growth); + // 成长值的最大值为Integer.MAX_VALUE,当用户成长值 + 新增成长值达到Integer.MAX_VALUE这个值的时候,用户将不能在继续增加成长值了 + if (compare < 0) { + UserApiVO userVO = userMapper.getByUserId(extension.getUserId()); + throw new LuckException(userVO.getNickName() + " 新增成长值+用户成长值大于阈值,剩余可增加成长值为:" + (Integer.MAX_VALUE - extension.getGrowth())); + } + } + // 系统直接修改成长值 + this.updateUserScoreOrGrowth(userIds, null, growth); + // 成长值和积分日志 + batchAddScoreOrGrowthLogs(dbUserExtensions, null, growth); + // 根据成长值提升/降低用户等级 + List userLevelLogs = batchLevelUpByGrowthAndUserIds(userIds, LevelTypeEnum.ORDINARY_USER.value()); + // 等级减少的,回退奖励 + if (growth.compareTo(0) < 0) { + // 根据用户变更成长值日志回退奖励 + // 需要发送奖励, 等级降低一次就回退一次奖励 + // 回退奖励 + batchRollbackLevelDownRewards(userLevelLogs, LevelTypeEnum.ORDINARY_USER.value()); + return; + } + // 根据用户变更成长值日志发放奖励 + // 需要发送奖励, 等级提升一次就发放一次奖励 + // 发送奖励 + batchIssuanceLevelUpRewards(userLevelLogs, LevelTypeEnum.ORDINARY_USER.value()); + } + + /** + * 回退升级的奖励 + * 用户等级批量降低,回退奖励 + * 等级奖励降低的取消发送的奖励。如果等级4 降低到 等级1,等级2,3,4 的奖励回退。 + * 如果是付费会员和普通会员的相互转变,引起的等级变化,不要用此方法 + * + * @param userLevelLogs 等级变更日志 + * @param levelType 会员类型 + */ + private void batchRollbackLevelDownRewards(List userLevelLogs, Integer levelType) { + // 筛选出用户等级是降低了的用户回退奖励 + userLevelLogs = userLevelLogs.stream().filter(item -> item.getLevelIoType() == -1).collect(Collectors.toList()); + if (CollUtil.isEmpty(userLevelLogs)) { + return; + } + // 获取每个等级相关优惠券列表 + List levelCouponIdList = userLevelMapper.listLevelCouponByLevelType(levelType, null); + // 获取普通会员等级列表 + List levelList = userLevelMapper.list(levelType, null); + Map levelMap = levelCouponIdList.stream().collect(Collectors.toMap(UserLevelVO::getLevel, (k) -> k)); + List userScoreLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userScoreGetLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List bindCouponDTOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userExtensions = new ArrayList<>(Constant.INITIAL_CAPACITY); + DateTime now = DateUtil.date(); + for (UserLevelLog userLevelLog : userLevelLogs) { + Long userId = userLevelLog.getUserId(); + // 降低后等级 + Integer afterLevel = userLevelLog.getAfterLevel(); + // 变更前的等级 + Integer beforeLevel = userLevelLog.getBeforeLevel(); + // 每个用户降低等级的列表 + List userChangeLevelList = levelList.stream() + .filter(item -> item.getLevel() > afterLevel && item.getLevel() <= beforeLevel) + .collect(Collectors.toList()); + for (UserLevelVO levelVO : userChangeLevelList) { + List userRightsList = levelVO.getUserRightsList(); + if (CollUtil.isEmpty(userRightsList)) { + continue; + } + for (UserRightsVO userRightsVO : userRightsList) { + Integer rightsType = userRightsVO.getRightsType(); + // 用户需要扣除的优惠券 + if (Objects.equals(rightsType, RightsTypeEnum.COUPON.value())) { + List couponIds = levelMap.get(levelVO.getLevel()).getCouponIds(); + if (CollUtil.isNotEmpty(couponIds)) { + BindCouponDTO bindCouponDTO = new BindCouponDTO(); + bindCouponDTO.setCouponIds(couponIds); + bindCouponDTO.setUserId(userId); + bindCouponDTOList.add(bindCouponDTO); + } + } + // 用户扣减积分 + if (Objects.equals(rightsType, RightsTypeEnum.SCORE_PRESENTING.value())) { + // 如果积分不够扣除应该记录一下实际扣除数量 + UserExtension extension = userExtensionMapper.getByUserId(userId); + Long presScore = Math.min(extension.getScore(), userRightsVO.getPresScore()); + UserScoreGetLog scoreDetail = getInitReduceUserScoreGetLog(now, userId, presScore); + userScoreGetLogs.add(scoreDetail); + MongoUserScoreLogBO userScoreLog = getInitReduceUserScoreLog(userId, presScore); + userScoreLogs.add(userScoreLog); + UserExtension userExtension = new UserExtension(); + userExtension.setUserId(userId); + userExtension.setScore(-presScore); + userExtensions.add(userExtension); + } + } + } + if (CollUtil.isNotEmpty(userExtensions)) { + userExtensionMapper.batchUpdateScore(userExtensions); + userScoreGetLogService.saveBatch(userScoreGetLogs); + } + } + // 扣除优惠券 + if (CollUtil.isNotEmpty(bindCouponDTOList)) { + // 发送消息,扣除优惠券 + SendStatus sendStatus = levelDownCouponExpireTemplate.syncSend(RocketMqConstant.LEVEL_DOWN_COUPON_EXPIRE_TOPIC, new GenericMessage<>(bindCouponDTOList)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + if (CollUtil.isNotEmpty(userScoreLogs)) { + saveUserScoreLog(userScoreLogs); + } + } + + private void saveUserScoreLog(List userScoreLogs) { + SendStatus sendStatus = addUserScoreLogTemplate.syncSend(RocketMqConstant.ADD_USER_SCORE_LOG_TOPIC, new GenericMessage<>(userScoreLogs)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + private MongoUserScoreLogBO getInitReduceUserScoreLog(Long userId, Long presScore) { + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(userId); + userScoreLog.setSource(ScoreLogTypeEnum.SCORE_VALID.value()); + userScoreLog.setScore(presScore); + userScoreLog.setIoType(ScoreIoTypeEnum.EXPENDITURE.value()); + return userScoreLog; + } + + private UserScoreGetLog getInitReduceUserScoreGetLog(DateTime now, Long userId, Long presScore) { + UserScoreGetLog scoreDetail = new UserScoreGetLog(); + scoreDetail.setUserId(userId); + scoreDetail.setUsableScore(presScore); + scoreDetail.setStatus(ScoreGetLogStatusEnum.EXPIRED.value()); + scoreDetail.setExpireTime(now); + return scoreDetail; + } + + /** + * 批量等级提升后,批量发放等级提升奖励. + * 等级奖励降低的取消发送的奖励。如果等级1 提升到 等级 4,等级2,3,4 的奖励都发。 + * + * @param userLevelLogs 等级变更日志 + * @param levelType 会员类型 + */ + private void batchIssuanceLevelUpRewards(List userLevelLogs, Integer levelType) { + // 筛选出用户等级是提升了的用户发放奖励 + userLevelLogs = userLevelLogs.stream().filter(item -> item.getLevelIoType() == 1).collect(Collectors.toList()); + if (CollUtil.isEmpty(userLevelLogs)) { + return; + } + // 获取普通会员等级列表 + List levelList = userLevelMapper.list(levelType, null); + // 获取每个等级相关优惠券列表 + List levelCouponIdList = userLevelMapper.listLevelCouponByLevelType(levelType, null); + Map levelMap = levelCouponIdList.stream().collect(Collectors.toMap(UserLevelVO::getLevel, (k) -> k)); + List userExtensions = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userScoreLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userScoreGetLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List bindCouponDTOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (UserLevelLog userLevelLog : userLevelLogs) { + Long userId = userLevelLog.getUserId(); + // 变更前的等级 + Integer beforeLevel = userLevelLog.getBeforeLevel(); + // 提升后等级 + Integer afterLevel = userLevelLog.getAfterLevel(); + // 每个用户提升等级的列表 + List userChangeLevelList = levelList.stream().filter(item -> item.getLevel() > beforeLevel && item.getLevel() <= afterLevel).collect(Collectors.toList()); + for (UserLevelVO levelVO : userChangeLevelList) { + List userRightsList = levelVO.getUserRightsList(); + if (CollUtil.isEmpty(userRightsList)) { + continue; + } + for (UserRightsVO userRightsVO : userRightsList) { + Integer rightsType = userRightsVO.getRightsType(); + // 用户增加积分 + if (Objects.equals(rightsType, RightsTypeEnum.SCORE_PRESENTING.value())) { + Long presScore = userRightsVO.getPresScore(); + UserScoreGetLog scoreDetail = new UserScoreGetLog(); + scoreDetail.setUserId(userId); + scoreDetail.setUsableScore(presScore); + scoreDetail.setStatus(ScoreGetLogStatusEnum.NORMAL.value()); + userScoreGetLogs.add(scoreDetail); + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(userId); + userScoreLog.setSource(ScoreLogTypeEnum.LEVEL_UP.value()); + userScoreLog.setScore(presScore); + userScoreLog.setIoType(ScoreIoTypeEnum.INCOME.value()); + userScoreLogs.add(userScoreLog); + UserExtension userExtension = new UserExtension(); + userExtension.setUserId(userId); + userExtension.setScore(presScore); + userExtensions.add(userExtension); + } + // 给用户发优惠券 + if (Objects.equals(rightsType, RightsTypeEnum.COUPON.value())) { + List couponIds = levelMap.get(levelVO.getLevel()).getCouponIds(); + if (CollUtil.isNotEmpty(couponIds)) { + BindCouponDTO bindCouponDTO = new BindCouponDTO(); + bindCouponDTO.setUserId(userId); + bindCouponDTO.setCouponIds(couponIds); + bindCouponDTOList.add(bindCouponDTO); + } + } + } + } + } + if (CollUtil.isNotEmpty(userExtensions)) { + userExtensionMapper.batchUpdateScore(userExtensions); + userScoreGetLogService.saveBatch(userScoreGetLogs); + } + // 发优惠券 + if (CollUtil.isNotEmpty(bindCouponDTOList)) { + // 发送消息,赠送优惠券 + SendStatus sendStatus = levelUpCouponGiveTemplate.syncSend(RocketMqConstant.LEVEL_UP_COUPON_GIVE_TOPIC, new GenericMessage<>(bindCouponDTOList)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + if (CollUtil.isNotEmpty(userScoreLogs)) { + saveUserScoreLog(userScoreLogs); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public List batchLevelUpByGrowthAndUserIds(List userIds, Integer levelType) { + // 获取普通会员等级列表 + List levelList = userLevelMapper.list(levelType, null); + // 会员等级列表为空,无法升到下一级,直接结束 + if (CollUtil.isEmpty(levelList)) { + return Collections.emptyList(); + } + // 用户扩展表信息 + List userExtensions = userExtensionMapper.getByUserIdsAndLevelType(userIds); + if (CollUtil.isEmpty(userExtensions)) { + return Collections.emptyList(); + } + List userLevelLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 需要更新等级的用户 + List updateUserIds = userExtensions.stream() + .filter(item -> { + // 成长值对应的等级是否和会员等级匹配,不匹配就需要更新用户等级 + Integer level = getUserLevelByGrowth(levelList, item.getGrowth()); + if (item.getLevel().compareTo(level) != 0) { + UserLevelLog userLevelLog = new UserLevelLog(); + userLevelLog.setUserId(item.getUserId()); + userLevelLog.setLevelIoType(level.compareTo(item.getLevel())); + int levelChangeReason = userLevelLog.getLevelIoType() > 0 ? LevelChangeReasonEnum.GROWTH_ENOUGH.value() : LevelChangeReasonEnum.GROWTH_NOT_ENOUGH.value(); + userLevelLog.setLevelChangeReason(levelChangeReason); + userLevelLog.setBeforeLevel(item.getLevel()); + userLevelLog.setBeforeLevelType(item.getLevelType()); + userLevelLog.setAfterLevel(level); + userLevelLog.setAfterLevelType(item.getLevelType()); + userLevelLogs.add(userLevelLog); + return true; + } + return false; + }) + .map(UserExtension::getUserId) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(updateUserIds)) { + return Collections.emptyList(); + } + userExtensionMapper.batchUpdateLevelByUserIds(updateUserIds, levelType); + // 将用户等级从用户扩展表同步到用户表里面 + userMapper.updateUserLevelByUserExtensionAndUserIds(updateUserIds); + // 批量保存会员等级变化日志 + userLevelLogService.batchSaveUserLevelLogs(userLevelLogs); + // 清除用户缓存 + this.removeUserCacheByUserIds(updateUserIds); + return userLevelLogs; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void refundGrowth(Long orderId) { + UserGrowthLog growthLog = userGrowthLogService.getByBizId(orderId, 1); + // 如果没有找到这条增加成长值的记录,就不用退成长值了 + if (Objects.isNull(growthLog)) { + return; + } + // 需要减少成长值数值 + Integer growth = -growthLog.getChangeGrowth(); + Long userId = growthLog.getUserId(); + List userIds = Collections.singletonList(userId); + if (Objects.equals(0, growth)) { + return; + } + // 系统直接修改成长值 + this.updateUserScoreOrGrowth(userIds, null, growth); + // 成长值日志 + UserGrowthLog userGrowthLog = new UserGrowthLog(); + userGrowthLog.setUserId(userId); + userGrowthLog.setSource(GrowthLogSourceEnum.ORDER.value()); + userGrowthLog.setBizId(orderId); + userGrowthLog.setChangeGrowth(growth); + userGrowthLog.setRemarks("订单退还成长值"); + userGrowthLogService.save(userGrowthLog); + // 根据成长值提升/降低用户等级 + List userLevelLogs = batchLevelUpByGrowthAndUserIds(userIds, LevelTypeEnum.ORDINARY_USER.value()); + // 回退奖励 + batchRollbackLevelDownRewards(userLevelLogs, LevelTypeEnum.ORDINARY_USER.value()); + } + + @Override + public int getMaxLevel(Integer levelType) { + return userLevelMapper.getMaxLevel(levelType); + } + + @Override + public int getUserNormalLevel(Integer growth) { + return userLevelMapper.getUserNormalLevel(growth); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void expireVipUsers(List users) { + if (CollUtil.isEmpty(users)) { + return; + } + List userIds = users.stream().map(UserVO::getUserId).collect(Collectors.toList()); + // 将付费会员变成普通会员,会员等级直接变成普通会员的成长值对应的等级 + // 获取修改之前的等级和会员类型 + List dbUserExtensions = userExtensionMapper.getByUserIdsAndLevelType(userIds); + + // 获取修改前用户等级信息 + List userExtensionList = userExtensionMapper.getByUserIdsAndLevelType(userIds); + for (UserExtension userExtension : userExtensionList) { + int level = userLevelMapper.getUserNormalLevel(userExtension.getGrowth()); + userExtension.setLevel(level); + } + // 批量修改用户等级和用户类型 + userExtensionMapper.batchUpdateTypeAndLevelByUserIds(userExtensionList, LevelTypeEnum.PAY_USER.value(), LevelTypeEnum.ORDINARY_USER.value()); + + // 将用户会员类型和等级从用户扩展表同步到用户表里面 + userMapper.updateUserTypeLevelByUserExtensionAndUserIds(userIds); + + // 获取修改后用户等级 + List userExtensions = userExtensionMapper.getByUserIdsAndLevelType(userIds); + + Map extensionMap = userExtensions.stream().collect(Collectors.toMap(UserExtension::getUserId, (k) -> k)); + List userLevelLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (UserExtension dbUserExtension : dbUserExtensions) { + Long userId = dbUserExtension.getUserId(); + Integer beforeLevel = dbUserExtension.getVipLevel(); + UserExtension userExtension = extensionMap.get(userId); + Integer afterLevel = userExtension.getLevel(); + // 等级变化记录,会员类型一定是改变了的 + UserLevelLog userLevelLog = new UserLevelLog(); + userLevelLog.setUserId(userId); + userLevelLog.setLevelIoType(afterLevel.compareTo(beforeLevel)); + userLevelLog.setLevelChangeReason(LevelChangeReasonEnum.VIP_EXPIRE.value()); + userLevelLog.setBeforeLevel(beforeLevel); + userLevelLog.setBeforeLevelType(dbUserExtension.getLevelType()); + userLevelLog.setAfterLevel(afterLevel); + userLevelLog.setAfterLevelType(userExtension.getLevelType()); + userLevelLogs.add(userLevelLog); + } + // 清除缓存 + this.removeUserCacheByUserIds(userIds); + // 保存等级变化日志 + userLevelLogService.batchSaveUserLevelLogs(userLevelLogs); + } + + @Override + public void updateRecruitStatus(UserLevelDTO userLevelDTO) { + UserLevelDTO userLevel = new UserLevelDTO(); + userLevel.setUserLevelId(userLevelDTO.getUserLevelId()); + Integer recruitStatus = userLevelDTO.getRecruitStatus(); + userLevel.setRecruitStatus(recruitStatus); + userLevelMapper.update(userLevel); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void registerUserScore(List userExtensionList) { + Long registerScore = 0L; + String scoreConfig = configFeignClient.getConfig(Constant.SCORE_CONFIG).getData(); + if (Objects.nonNull(scoreConfig)) { + ScoreConfigApiVO userScoreDetailVO = Json.parseObject(scoreConfig, ScoreConfigApiVO.class); + registerScore = userScoreDetailVO.getRegisterScore(); + } + List userIds = userExtensionList.stream().map(UserExtension::getUserId).collect(Collectors.toList()); + if (CollUtil.isEmpty(userIds) || registerScore <= 0L) { + return; + } + // 系统直接修改积分 + this.updateUserScoreOrGrowth(userIds, registerScore, null); + List userScoreLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userScoreDetails = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (UserExtension userExtension : userExtensionList) { + Long userId = userExtension.getUserId(); + // 积分日志 + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(userId); + userScoreLog.setScore(registerScore); + userScoreLog.setIoType(ScoreIoTypeEnum.INCOME.value()); + userScoreLog.setSource(ScoreLogTypeEnum.REGISTER.value()); + userScoreLogs.add(userScoreLog); + // 积分明细 + UserScoreGetLog userScoreGetLog = new UserScoreGetLog(); + userScoreGetLog.setUserId(userId); + userScoreGetLog.setUsableScore(registerScore); + userScoreGetLog.setStatus(ScoreGetLogStatusEnum.NORMAL.value()); + userScoreDetails.add(userScoreGetLog); + } + if (CollUtil.isNotEmpty(userScoreLogs)) { + userScoreGetLogService.saveBatch(userScoreDetails); + saveUserScoreLog(userScoreLogs); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void registerUserSendRights(List userExtensionList) { + if (CollUtil.isEmpty(userExtensionList)) { + return; + } + // 付费会员等级设置,如果是存在在的,就发放对应等级的权益;如果不存在,就不给付费会员发放权益 + List userIds = userExtensionList.stream().map(UserExtension::getUserId).collect(Collectors.toList()); + + List updateUserExtensions = new ArrayList<>(Constant.INITIAL_CAPACITY); + List bindCouponDTOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userScoreLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userScoreGetLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + + // 发放付费会员等级对应权益 + justIssuanceLevelRights(updateUserExtensions, userScoreLogs, userScoreGetLogs, bindCouponDTOList, userExtensionList, LevelTypeEnum.PAY_USER.value()); + // 发放普通会员等级对应权益 + justIssuanceLevelRights(updateUserExtensions, userScoreLogs, userScoreGetLogs, bindCouponDTOList, userExtensionList, LevelTypeEnum.ORDINARY_USER.value()); + if (CollUtil.isNotEmpty(updateUserExtensions)) { + userExtensionMapper.batchUpdateScore(updateUserExtensions); + } + if (CollUtil.isNotEmpty(userScoreGetLogs)) { + userScoreGetLogService.saveBatch(userScoreGetLogs); + } + // 发优惠券 + if (CollUtil.isNotEmpty(bindCouponDTOList)) { + // 发送消息,赠送优惠券 + SendStatus sendStatus = levelUpCouponGiveTemplate.syncSend(RocketMqConstant.LEVEL_UP_COUPON_GIVE_TOPIC, new GenericMessage<>(bindCouponDTOList)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + if (CollUtil.isNotEmpty(userScoreLogs)) { + saveUserScoreLog(userScoreLogs); + } + } + + @Override + public List listRightsByLevelType(Integer levelType, Long userId) { + if (Objects.isNull(userId)) { + userId = AuthUserContext.get().getUserId(); + } + UserApiVO user = userMapper.getByUserId(userId); + int nowLevel; + if (Objects.equals(LevelTypeEnum.PAY_USER.value(), user.getLevelType()) && Objects.equals(LevelTypeEnum.ORDINARY_USER.value(), levelType)) { + //如果用户是付费会员,要查看普通会员的权益 + UserExtension extension = userExtensionMapper.getByUserId(userId); + nowLevel = getUserNormalLevel(extension.getGrowth()); + } else if (Objects.equals(LevelTypeEnum.ORDINARY_USER.value(), user.getLevelType()) && Objects.equals(LevelTypeEnum.PAY_USER.value(), levelType)) { + //如果用户是普通会员,要查看付费会员的权益,查看最高等级的 + List levelList = list(LevelTypeEnum.PAY_USER.value()); + if (levelList.size() >= 1) { + nowLevel = levelList.size(); + } else { + throw new LuckException("未配置付费会员"); + } + } else { + nowLevel = Objects.equals(LevelTypeEnum.ORDINARY_USER.value(), user.getLevelType()) ? user.getLevel() : user.getVipLevel(); + } + return userRightsService.listRightsByLevelType(levelType, nowLevel); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void paySuccess(UserLevelLog userLevelLog, BuyVipNotifyBO message) { + UserApiVO userInfo = userMapper.getByUserId(userLevelLog.getUserId()); + // 计算会员过期时间 + DateTime endTime = Objects.isNull(userInfo.getVipEndTime()) || Objects.equals(userInfo.getLevelType(), LevelTypeEnum.ORDINARY_USER.value()) + ? DateUtil.beginOfDay(new Date()) + : DateUtil.beginOfDay(userInfo.getVipEndTime()); + switch (userLevelLog.getTermType()) { + case 0: + endTime = DateUtil.offsetMonth(endTime, 1); + break; + case 1: + endTime = DateUtil.offsetMonth(endTime, 3); + break; + case 2: + endTime = DateUtil.offsetMonth(endTime, 12); + break; + default: + } + // 通过购买会员更新用户等级 + userMapper.updateUserLevelByBuyVip(userLevelLog.getUserId(), userLevelLog.getAfterLevel(), endTime); + userExtensionMapper.updateUserLevelByBuyVip(userLevelLog.getUserId(), userLevelLog.getAfterLevel()); + // 发放奖励 + List userLevelVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + UserLevelVO userLevelVO = new UserLevelVO(); + userLevelVO.setLevel(userLevelLog.getAfterLevel()); + userLevelVO.setVipLevel(userLevelLog.getAfterLevel()); + userLevelVO.setLevelType(userLevelLog.getAfterLevelType()); + userLevelVOList.add(userLevelVO); + UserExtension userExtension = userExtensionMapper.getByUserId(userLevelLog.getUserId()); + this.levelUp(userLevelVOList, userLevelLog, userExtension, userInfo.getPhone()); + // 将日志变更为已支付 + int updateStatus = userLevelLogService.updateToSuccess(userLevelLog.getLevelLogId(), message.getPayId(), message.getPayType()); + if (updateStatus < 1) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + /** + * 只发放等级对应的权益 + * + * @param updateUserExtensions 修改用户扩展信息数据 + * @param userScoreLogs 积分日志集合 + * @param userScoreGetLogs 积分明细集合 + * @param bindCouponDTOList 用户优惠券集合 + * @param userExtensionList 用户扩展信息数据 + * @param levelType 会员类型 + */ + private void justIssuanceLevelRights(List updateUserExtensions, List userScoreLogs, List userScoreGetLogs, List bindCouponDTOList, List userExtensionList, Integer levelType) { + // 会员类型筛选 + List userExtensions = userExtensionList.stream().filter(item -> Objects.equals(levelType, item.getLevelType())).collect(Collectors.toList()); + if (CollUtil.isEmpty(userExtensions)) { + return; + } + // 会员等级 + List levelList = userLevelMapper.list(levelType, null); + // 付费会员等级设置,如果是存在在的,就发放对应等级的权益;如果不存在,就不给付费会员发放权益 + // 普通会员等级必然是存在一个最低等级 + if (CollUtil.isEmpty(levelList)) { + return; + } + Map userLevelMap = levelList.stream().collect(Collectors.toMap(UserLevelVO::getLevel, (k) -> k)); + // 获取会员每个等级相关优惠券列表 + List levelCouponIds = userLevelMapper.listLevelCouponByLevelType(levelType, null); + Map levelMap = levelCouponIds.stream().collect(Collectors.toMap(UserLevelVO::getLevel, (k) -> k)); + for (UserExtension userExtension : userExtensions) { + Long userId = userExtension.getUserId(); + Integer level = userExtension.getLevel(); + UserLevelVO userLevelVO = userLevelMap.get(level); + if (Objects.isNull(userLevelVO)) { + continue; + } + // 等级对应的权益 + List userRights = userLevelVO.getUserRightsList(); + if (CollUtil.isEmpty(userRights)) { + continue; + } + for (UserRightsVO userRightsVO : userRights) { + Integer rightsType = userRightsVO.getRightsType(); + // 用户增加积分 + if (Objects.equals(rightsType, RightsTypeEnum.SCORE_PRESENTING.value())) { + // 赠送积分 + Long presScore = userRightsVO.getPresScore(); + // 扩展信息表,加积分 + UserExtension updateUserExtension = new UserExtension(); + updateUserExtension.setUserId(userId); + updateUserExtension.setScore(presScore); + updateUserExtensions.add(updateUserExtension); + // 积分日志 + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(userId); + userScoreLog.setScore(presScore); + userScoreLog.setIoType(ScoreIoTypeEnum.INCOME.value()); + userScoreLog.setSource(ScoreLogTypeEnum.LEVEL_UP.value()); + userScoreLogs.add(userScoreLog); + // 积分明细 + UserScoreGetLog scoreDetail = new UserScoreGetLog(); + scoreDetail.setUserId(userId); + scoreDetail.setUsableScore(presScore); + scoreDetail.setStatus(ScoreGetLogStatusEnum.NORMAL.value()); + userScoreGetLogs.add(scoreDetail); + } + // 给用户发优惠券 + if (Objects.equals(rightsType, RightsTypeEnum.COUPON.value())) { + List couponIds = levelMap.get(level).getCouponIds(); + if (CollUtil.isNotEmpty(couponIds)) { + BindCouponDTO bindCouponDTO = new BindCouponDTO(); + bindCouponDTO.setUserId(userId); + bindCouponDTO.setCouponIds(couponIds); + bindCouponDTOList.add(bindCouponDTO); + } + } + } + } + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void addGrowthAndScore(double growthPrice, Long score, Long userId, Long bizId, UserExtension userExtension, Integer type) { + UserApiVO userApiVO = userMapper.getByUserId(userId); + User user = BeanUtil.map(userApiVO, User.class); + if (user.getLevel() == null) { + user.setLevel(Constant.USER_LEVEL_INIT); + } + Integer growth = (int) growthPrice; + + MongoUserScoreLogBO mongoUserScoreLogBO = addScoreAndGrowth(bizId, userId, growth, score, type); + // 判断是否升级 + // 修改用户信息 + // 用户+增加成长值 + Integer nowGrowth = userExtension.getGrowth() == null ? growth : userExtension.getGrowth() + growth; + userExtension.setScore(userExtension.getScore() == null ? score : userExtension.getScore() + score); + userExtension.setGrowth(nowGrowth); + userExtension.setUpdateTime(new Date()); + // 判断用户是否提升过等级,如果是修改用户等级并添加用户等级提升日志 + List userLevels = userLevelMapper.selectList(nowGrowth, userExtension.getLevel()); + if (CollectionUtils.isEmpty(userLevels)) { + userExtensionMapper.updateBalanceByVersion(userExtension); + } else { + Integer level = userLevels.get(0).getLevel(); + //修改用户等级 + user.setLevel(level); + userMapper.update(user); + //判断用户是否提升过等级 + //确认收货 + levelUp(userLevels, null, userExtension, user.getPhone()); + } + if (Objects.nonNull(mongoUserScoreLogBO)) { + userScoreLogService.saveToMongdb(mongoUserScoreLogBO); + } + } + + /** + * 添加积分明细、积分日志、成长值日志 + * + * @param bizId type = 1:订单号 type = 2:充值id + * @param userId 用户id + * @param growth 成长值 + * @param score 积分 + * @param type type = 1:订单 type = 2:余额 + */ + private MongoUserScoreLogBO addScoreAndGrowth(Long bizId, Long userId, Integer growth, Long score, Integer type) { + if (growth > 0) { + //添加成长值日志 + UserGrowthLog userGrowthLog = new UserGrowthLog(); + userGrowthLog.setChangeGrowth(growth); + userGrowthLog.setSource(1); + userGrowthLog.setUserId(userId); + userGrowthLog.setBizId(bizId); + if (type.equals(1)) { + userGrowthLog.setRemarks("订单确认收货获取的成长值"); + } else { + userGrowthLog.setRemarks("用户充值余额获取的成长值"); + } + userGrowthLogService.save(userGrowthLog); + } + if (score == 0) { + return null; + } + if (score < 0) { + score = Math.abs(score); + //查询积分详细表数据 + List scoreDetailList = userScoreGetLogService.listByCreateTime(userId, 1); + List updateScoreDetails = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 如果是负的则表示为减少积分 + // 修改积分明细,如果当前明细不够扣除在进行下一条 + // 如果够添加一条积分明细记录 + for (UserScoreGetLog scoreDetail : scoreDetailList) { + if (scoreDetail.getUsableScore() <= score) { + scoreDetail.setStatus(0); + updateScoreDetails.add(scoreDetail); + score -= scoreDetail.getUsableScore(); + } else { + UserScoreGetLog addDetail = new UserScoreGetLog(); + addDetail.setCreateTime(scoreDetail.getCreateTime()); + addDetail.setStatus(0); + addDetail.setUserId(scoreDetail.getUserId()); + addDetail.setUsableScore(score); + userScoreGetLogService.save(addDetail); + + scoreDetail.setUsableScore(scoreDetail.getUsableScore() - score); + updateScoreDetails.add(scoreDetail); + break; + } + if (score <= 0) { + break; + } + } + userScoreGetLogService.updateBatchById(updateScoreDetails); + } else { + //添加积分明细 + UserScoreGetLog addDetail = new UserScoreGetLog(); + addDetail.setCreateTime(new Date()); + addDetail.setStatus(1); + addDetail.setUserId(userId); + addDetail.setBizId(String.valueOf(bizId)); + addDetail.setUsableScore(score); + userScoreGetLogService.save(addDetail); + } + //添加积分日志 + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(userId); + userScoreLog.setScore(score); + userScoreLog.setBizId(bizId); + if (type.equals(1)) { + userScoreLog.setSource(ScoreLogTypeEnum.SHOP.value()); + } else { + userScoreLog.setSource(ScoreLogTypeEnum.BALANCE.value()); + } + userScoreLog.setIoType(ScoreIoTypeEnum.INCOME.value()); + return userScoreLog; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void batchUserScore(UserAdminDTO userAdminDTO) { + List userIds = userAdminDTO.getUserIds(); + Long score = userAdminDTO.getScore(); + if (CollUtil.isEmpty(userIds) || Objects.isNull(score) || Objects.equals(0L, score)) { + return; + } + // 修改前数据 + List dbUserExtensions = userExtensionMapper.getByUserIdsAndLevelType(userIds); + userIds = dbUserExtensions.stream().map(UserExtension::getUserId).collect(Collectors.toList()); + if (CollUtil.isEmpty(userIds)) { + return; + } + for (UserExtension extension : dbUserExtensions) { + int compare = Long.compare(Long.MAX_VALUE - extension.getScore(), score); + // 用积分的最大值为Long.MAX_VALUE,当用户积分 + 新增积分达到Long.MAX_VALUE这个值的时候,用户将不能在继续增加积分了 + if (compare < 0) { + UserApiVO userVO = userMapper.getByUserId(extension.getUserId()); + throw new LuckException(userVO.getNickName() + " 新增积分+用户积分大于阈值,剩余可增加积分为:" + (Long.MAX_VALUE - extension.getScore())); + } + } + // 系统直接修改积分 + this.updateUserScoreOrGrowth(userIds, score, null); + // 积分日志 + batchAddScoreOrGrowthLogs(dbUserExtensions, score, null); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public MongoUserScoreLogBO initUserInfoAndLevelInfo(UserExtension userExtension, Integer level, Integer levelType, String phone) { + UserLevelVO userLevel = userLevelMapper.getOneByTypeAndLevel(0, Constant.USER_LEVEL_INIT); + List userLevels = new ArrayList<>(Constant.INITIAL_CAPACITY); + String scoreConfig = configFeignClient.getConfig(Constant.SCORE_CONFIG).getData(); + Long registerScore = 0L; + if (Objects.nonNull(scoreConfig)) { + ScoreConfigApiVO userScoreDetailVO = Json.parseObject(scoreConfig, ScoreConfigApiVO.class); + registerScore = userScoreDetailVO.getRegisterScore(); + } + + userLevels.add(userLevel); + userExtension.setScore(registerScore); + userExtensionMapper.update(userExtension); + levelUp(userLevels, null, userExtension, phone); + if (registerScore > 0) { + // 添加积分明细 + UserScoreGetLog addDetail = new UserScoreGetLog(); + addDetail.setCreateTime(new Date()); + addDetail.setStatus(1); + addDetail.setUserId(userExtension.getUserId()); + addDetail.setUsableScore(registerScore); + userScoreGetLogService.save(addDetail); + //添加积分日志 + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(userExtension.getUserId()); + userScoreLog.setScore(registerScore); + userScoreLog.setSource(ScoreLogTypeEnum.REGISTER.value()); + userScoreLog.setCreateTime(new Date()); + userScoreLog.setIoType(1); + return userScoreLog; + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdate(UserLevelDTO userLevelDTO) { + UserLevelVO dbUserLevel = new UserLevelVO(); + UserLevelVO userLevelVO = userLevelMapper.getByLevelTypeAndLevelName(userLevelDTO.getLevelType(), userLevelDTO.getLevelName()); + if (userLevelVO != null && !Objects.equals(userLevelVO.getUserLevelId(), userLevelDTO.getUserLevelId())) { + throw new LuckException("相同会员类型的等级名称不能重复"); + } + //根据成长值,更新已有用户的等级 + if (Objects.nonNull(userLevelDTO.getUserLevelId())) { + dbUserLevel = userLevelMapper.getByUserLevelId(userLevelDTO.getUserLevelId()); + } else { + int count = userLevelMapper.countByLevelType(userLevelDTO.getLevelType()); + userLevelDTO.setLevel(++count); + } + // 如果是普通会员,新增的等级必须是递增的 + Integer level = userLevelDTO.getLevel(); + if (Objects.equals(userLevelDTO.getLevelType(), 0) && level != 1) { + List list = userLevelMapper.list(0, level - 1); + if (CollUtil.isNotEmpty(list)) { + UserLevelVO levelVO = list.stream().max(Comparator.comparing(UserLevelVO::getNeedGrowth)).get(); + if (userLevelDTO.getNeedGrowth() <= levelVO.getNeedGrowth()) { + throw new LuckException("等级需要的成长值必须大于上一级需要的成长值"); + } + } + } + // 若是普通会员,新增或修改时成长值有变化,状态设置为未更新用户等级 + if (Objects.equals(userLevelDTO.getLevelType(), 0) && !Objects.equals(dbUserLevel.getNeedGrowth(), userLevelDTO.getNeedGrowth())) { + userLevelDTO.setUpdateStatus(0); + } else { + userLevelDTO.setUpdateStatus(1); + } + if (Objects.nonNull(userLevelDTO.getUserLevelId())) { + update(userLevelDTO); + } else { + // 初始化允许招募会员 + userLevelDTO.setRecruitStatus(RecruitStatusEnum.ALLOW_RECRUIT.value()); + save(userLevelDTO); + // 新增等级的时候自动更新用户等级 + if (Objects.equals(userLevelDTO.getLevelType(), LevelTypeEnum.ORDINARY_USER.value())) { + // 批量将普通会员的等级与成长值不匹配的筛选出来,更新等级 + batchUpdateUserLevel(LevelTypeEnum.ORDINARY_USER.value()); + } + } + userRightsService.removeRightsByLevelTypeCache(userLevelDTO.getLevelType()); + + } + + @Override + @Cacheable(cacheNames = UserCacheNames.LEVEL_GET_LIST_KEY, key = "#levelType + '-' + #level") + public UserLevelVO getOneByTypeAndLevel(Integer levelType, Integer level) { + return userLevelMapper.getOneByTypeAndLevel(levelType, level); + } + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = UserCacheNames.LEVEL_LIST_KEY, key = "#levelType"), + @CacheEvict(cacheNames = UserCacheNames.LEVEL_GET_KEY, key = "#userLevelId"), + @CacheEvict(cacheNames = UserCacheNames.LEVEL_GET_LIST_KEY, key = "#levelType + '-' + #level") + }) + public void removeLevelCache(Long userLevelId, Integer levelType, Integer level) { + + } + + @Override + @CacheEvict(cacheNames = UserCacheNames.LEVEL_LIST_KEY, key = "#levelType") + public void removeLevelListCache(Integer levelType) { + + } + + @Override + @CacheEvict(cacheNames = UserCacheNames.LEVEL_GET_KEY, key = "#userLevelId") + public void removeLevelById(Long userLevelId) { + + } + + /** + * 等级提升 + * + * @param userLevels 多个等级,奖励发放时 + * @param userLevelLog 等级日志,在购买付费会员时存在 + * @param user 用户详细信息 + * @param phone 用户手机号码 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void levelUp(List userLevels, UserLevelLog userLevelLog, UserExtension user, String phone) { + List userScoreLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userScoreGetLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + //用户可能升多级,批量插入升级日志 + List levelLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List couponIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + Integer beforeLevel = user.getLevel(); + Integer levelType = user.getLevelType(); + for (int i = userLevels.size() - 1; i >= 0; i--) { + UserLevelVO userLevel = userLevels.get(i); + //修改用户扩展表等级 + user.setLevel(userLevel.getLevel()); + if (Objects.equals(user.getLevelType(), LevelTypeEnum.ORDINARY_USER.value())) { + // 这里的userLevels查出来都是普通会员的,如果是付费会员会被替换掉会员类型 + user.setLevelType(userLevel.getLevelType()); + } + if (Objects.nonNull(userLevel.getVipLevel())) { + user.setVipLevel(userLevel.getVipLevel()); + } + //升级奖励计算(积分,优惠券,商品) + boolean isVip = levelUpRewards(userLevelLog, user, userScoreLogs, userScoreGetLogs, levelLogs, couponIds, beforeLevel, levelType, userLevel); + // 原本就是会员则退出循环 + if (isVip) { + break; + } + } + //修改扩展表信息 + UserExtension extension = userExtensionMapper.getByUserExtensionId(user.getUserExtensionId()); + user.setVersion(extension.getVersion()); + userExtensionMapper.update(user); + // 清除用户等级信息 + this.removeUserCacheByUserId(user.getUserId()); + if (CollUtil.isNotEmpty(couponIds)) { + BindCouponDTO bindCouponDTO = new BindCouponDTO(); + bindCouponDTO.setUserId(user.getUserId()); + bindCouponDTO.setCouponIds(couponIds); + couponFeignClient.batchBindCouponByCouponIds(bindCouponDTO); + } + //保存积分明细日志 + if (CollUtil.isNotEmpty(userScoreGetLogs)) { + userScoreGetLogService.saveBatch(userScoreGetLogs); + } + // 批量保存等级日志 + if (CollUtil.isNotEmpty(levelLogs)) { + userLevelLogService.batchSaveUserLevelLogs(levelLogs); + } + // 消息推送-升级提醒,只有升级时进行提醒 + if (user.getLevel() > beforeLevel) { + UserLevelVO userLevelVO = userLevels.get(userLevels.size() - 1); + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setShopId(Constant.PLATFORM_SHOP_ID); + sendNotifyBO.setLevelName(userLevelVO.getLevelName()); + sendNotifyBO.setSendType(SendTypeEnum.MEMBER_LEVEL.getValue()); + sendNotifyBO.setMobile(phone); + sendNotifyBO.setBizId(Long.parseLong(userLevelVO.getLevel().toString())); + sendNotifyBO.setUserId(user.getUserId()); + List sendNotifyList = Collections.singletonList(sendNotifyBO); + SendStatus sendBizStatus = sendNotifyToUserTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC, new GenericMessage<>(sendNotifyList)).getSendStatus(); + + } + // 保存积分日志 + if (CollUtil.isNotEmpty(userScoreLogs)) { + saveUserScoreLog(userScoreLogs); + } + } + + /** + * 根据成长值范围,更新普通用户的等级 + * + * @param level 更新至该等级 + * @param minGrowth 最小成长值 + * @param maxGrowth 最大成长值 + */ + private void updateUserLevel(Integer level, int minGrowth, Integer maxGrowth) { + userMapper.updateUserLevel(level, minGrowth, maxGrowth); + userExtensionMapper.updateUserLevel(level, minGrowth, maxGrowth); + } + + /** + * 移除用户信息缓存 + * + * @param userId + */ + public void removeUserCacheByUserId(Long userId) { + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + keys.add(UserCacheNames.USER_INFO + CacheNames.UNION + userId); + RedisUtil.del(keys); + } + + /** + * 批量移除用户信息缓存 + * + * @param userIds + */ + public void removeUserCacheByUserIds(List userIds) { + if (CollUtil.isEmpty(userIds)) { + return; + } + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long userId : userIds) { + keys.add(UserCacheNames.USER_INFO + CacheNames.UNION + userId); + } + RedisUtil.del(keys); + } + + /** + * 等级提升奖励 + * + * @param userLevelLog 用户等级记录 + * @param user 用户信息 + * @param userScoreLogs 用户积分记录记录 + * @param userScoreGetLogs 用户积分获取记录 + * @param levelLogs 等级记录 + * @param couponIds 优惠券id列表 + * @param beforeLevel 原本的等级 + * @param levelType 等级类型 + * @param userLevel 用户等级 + * @return 该用户原本是否为会员 + */ + private boolean levelUpRewards(UserLevelLog userLevelLog, UserExtension user, List userScoreLogs, List userScoreGetLogs, List levelLogs, List couponIds, Integer beforeLevel, Integer levelType, UserLevelVO userLevel) { + //1.积分 + UserLevelVO level = userLevelMapper.getOneByTypeAndLevel(user.getLevelType(), user.getLevel()); + UserLevelVO userLevelVO = userLevelMapper.getByUserLevelId(level.getUserLevelId()); + List userRights = userLevelVO.getUserRightsList(); + for (UserRightsVO userRight : userRights) { + if (userRight.getRightsType() == 3 && userRight.getPresScore() != null && userRight.getPresScore() > 0) { + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + Long score = userRight.getPresScore(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(user.getUserId()); + userScoreLog.setScore(score); + userScoreLog.setSource(ScoreLogTypeEnum.LEVEL_UP.value()); + userScoreLog.setCreateTime(DateUtil.date()); + userScoreLog.setIoType(1); + userScoreLogs.add(userScoreLog); + //添加积分明细 + UserScoreGetLog addDetail = new UserScoreGetLog(); + addDetail.setCreateTime(new Date()); + addDetail.setStatus(1); + addDetail.setUserId(user.getUserId()); + addDetail.setUsableScore(score); + userScoreGetLogs.add(addDetail); + user.setScore(user.getScore() == null ? score : user.getScore() + score); + } + } + //2.优惠券 + if (CollUtil.isNotEmpty(userLevelVO.getCouponIds())) { + couponIds.addAll(userLevelVO.getCouponIds()); + } + //3.等级日志,如果不为空则为会员购买提升的等级就直接退出,修改一行 + if (userLevelLog != null) { + if (!Objects.equals(LevelChangeReasonEnum.RENEW_VIP.value(), userLevelLog.getLevelChangeReason()) && !Objects.equals(LevelChangeReasonEnum.BUY_VIP.value(), userLevelLog.getLevelChangeReason())) { + // 等级提升日志 + userLevelLog.setIsPayed(1); + userLevelLog.setLevelIoType(1); + userLevelLog.setLevelChangeReason(LevelChangeReasonEnum.GROWTH_ENOUGH.value()); + userLevelLog.setBeforeLevel(beforeLevel); + userLevelLog.setBeforeLevelType(levelType); + userLevelLog.setAfterLevel(userLevel.getLevel()); + userLevelLog.setAfterLevelType(levelType); + userLevelLogService.update(userLevelLog); + } + return true; + } + UserLevelLog levelLog = new UserLevelLog(); + levelLog.setUserId(user.getUserId()); + // 等级提升日志 + levelLog.setLevelIoType(1); + levelLog.setLevelChangeReason(LevelChangeReasonEnum.GROWTH_ENOUGH.value()); + levelLog.setBeforeLevel(beforeLevel); + levelLog.setBeforeLevelType(levelType); + levelLog.setAfterLevel(userLevel.getLevel()); + levelLog.setAfterLevelType(levelType); + levelLog.setIsPayed(1); + levelLogs.add(levelLog); + return false; + } + + /** + * 根据成长值获取所在等级 + * + * @param levelList 等级列表 + * @param growth 成长值 + * @return 等级 + */ + private Integer getUserLevelByGrowth(List levelList, Integer growth) { + // 最低等级为 1级 + int level = 1; + if (Objects.isNull(growth)) { + return level; + } + for (UserLevelVO levelParam : levelList) { + if (Objects.isNull(levelParam.getNeedGrowth())) { + continue; + } + if (growth >= levelParam.getNeedGrowth()) { + level = levelParam.getLevel(); + } + } + return level; + } + + + /** + * 批量新增积分或者成长值日志 + * + * @param dbUserExtensions 修改积分或者成长值前的数据 + * @param score 积分 + * @param growth 成长值 + */ + private void batchAddScoreOrGrowthLogs(List dbUserExtensions, Long score, Integer growth) { + // 积分日志 + List scoreLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 积分明细 + List userScoreGetLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List updateUserScoreGetLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 成长值 + List growthLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 可以被扣减的用户积分明细,存储的是以userId为key的map集合 + Map> scoreGetLogMap = new HashMap<>(16); + if (Objects.nonNull(score) && score < 0L) { + List userIds = dbUserExtensions.stream().map(UserExtension::getUserId).collect(Collectors.toList()); + List userUsableScoreGetLogs = userScoreGetLogService.batchListByCreateTime(userIds, ScoreGetLogStatusEnum.NORMAL.value()); + scoreGetLogMap = userUsableScoreGetLogs.stream().collect(Collectors.groupingBy(UserScoreGetLog::getUserId)); + } + DateTime now = DateUtil.date(); + for (UserExtension userExtension : dbUserExtensions) { + Long userId = userExtension.getUserId(); + Long userScore = userExtension.getScore(); + Integer userGrowth = userExtension.getGrowth(); + // 成长值 + if (Objects.nonNull(growth) && growth.compareTo(0) != 0) { + UserGrowthLog userGrowthLog = initGrowthLogByParam(growth, now, userId, userGrowth); + if (Objects.nonNull(userGrowthLog)) { + growthLogs.add(userGrowthLog); + } + } + // 积分 + if (Objects.nonNull(score) && score.compareTo(0L) != 0) { + // 日志 + MongoUserScoreLogBO scoreLog = initScoreByParam(score, userId, userScore); + scoreLogs.add(scoreLog); + // 明细 + UserScoreChangeLogBO userScoreChangeLogBO = handleScoreGetLogs(score, userScore, userId, scoreGetLogMap.get(userId), now); + List saveUserScoreGetLogs = userScoreChangeLogBO.getSaveUserScoreGetLogs(); + List updateUserScoreDetailLogs = userScoreChangeLogBO.getUpdateUserScoreGetLogs(); + if (Objects.nonNull(saveUserScoreGetLogs)) { + userScoreGetLogs.addAll(saveUserScoreGetLogs); + } + if (Objects.nonNull(updateUserScoreDetailLogs)) { + updateUserScoreGetLogs.addAll(updateUserScoreDetailLogs); + } + } + } + if (CollUtil.isNotEmpty(userScoreGetLogs)) { + userScoreGetLogService.saveBatch(userScoreGetLogs); + } + if (CollUtil.isNotEmpty(updateUserScoreGetLogs)) { + userScoreGetLogService.updateBatchById(updateUserScoreGetLogs); + } + if (CollUtil.isNotEmpty(growthLogs)) { + userGrowthLogService.saveBatch(growthLogs); + } + if (CollUtil.isNotEmpty(scoreLogs)) { + saveUserScoreLog(scoreLogs); + } + } + + /** + * @param score 扣减的积分 + * @param userScore 用户已有积分 + * @param userId 用户id + * @param userScoreGetLogs 用户可以扣减的积分明细 + * @param now 当前时间 + * @return 新增的积分明细 + */ + private UserScoreChangeLogBO handleScoreGetLogs(Long score, Long userScore, Long userId, List userScoreGetLogs, DateTime now) { + UserScoreChangeLogBO userScoreChangeLogBO = new UserScoreChangeLogBO(); + if (score == 0L) { + return userScoreChangeLogBO; + } + // 如果用户本身的积分是0 ,再减少用户积分,是不会减少用户积分的,积分日志也是没有的 + if (Objects.nonNull(userScore) && score < 0L && userScore <= 0L) { + return userScoreChangeLogBO; + } + List saveUserScoreGetLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List updateUserScoreGetLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (score < 0L) { + // 实际减少的积分 + if (Objects.nonNull(userScore)) { + score = userScore + score < 0 ? userScore : Math.abs(score); + } + // 如果是负的则表示为减少积分 + // 修改积分明细,如果当前明细不够扣除在进行下一条 + // 如果够添加一条积分明细记录 + for (UserScoreGetLog scoreDetail : userScoreGetLogs) { + if (scoreDetail.getUsableScore() <= score) { + scoreDetail.setStatus(ScoreGetLogStatusEnum.OFFSET_CASH.value()); + scoreDetail.setUpdateTime(now); + updateUserScoreGetLogs.add(scoreDetail); + score -= scoreDetail.getUsableScore(); + } else { + UserScoreGetLog addDetail = new UserScoreGetLog(); + addDetail.setCreateTime(scoreDetail.getCreateTime()); + addDetail.setStatus(ScoreGetLogStatusEnum.OFFSET_CASH.value()); + addDetail.setUserId(scoreDetail.getUserId()); + addDetail.setUsableScore(score); + saveUserScoreGetLogs.add(addDetail); + // + scoreDetail.setUsableScore(scoreDetail.getUsableScore() - score); + scoreDetail.setUpdateTime(now); + updateUserScoreGetLogs.add(scoreDetail); + break; + } + if (score <= 0) { + break; + } + } + } else { + //添加积分明细 + UserScoreGetLog addDetail = new UserScoreGetLog(); + addDetail.setStatus(ScoreGetLogStatusEnum.NORMAL.value()); + addDetail.setUserId(userId); + addDetail.setUsableScore(score); + saveUserScoreGetLogs.add(addDetail); + } + userScoreChangeLogBO.setSaveUserScoreGetLogs(saveUserScoreGetLogs); + userScoreChangeLogBO.setUpdateUserScoreGetLogs(updateUserScoreGetLogs); + return userScoreChangeLogBO; + } + + /** + * 根据参数初始化一个积分明细对象 + * + * @param score 积分 + * @param now 时间 + * @param userId 用户id + * @param userScore 用户积分 + * @return 积分明细 + */ + private UserScoreGetLog initScoreGetLogs(Long score, DateTime now, Long userId, Long userScore) { + UserScoreGetLog scoreGetLog = new UserScoreGetLog(); + scoreGetLog.setUserId(userId); + if (score.compareTo(0L) < 0) { + BigDecimal add = new BigDecimal(userScore).add(new BigDecimal(score)); + scoreGetLog.setUsableScore(add.compareTo(new BigDecimal("0")) < 0 ? userScore : Math.abs(score)); + scoreGetLog.setStatus(ScoreGetLogStatusEnum.EXPIRED.value()); + scoreGetLog.setExpireTime(now); + } else { + scoreGetLog.setUsableScore(score); + scoreGetLog.setStatus(ScoreGetLogStatusEnum.NORMAL.value()); + } + return scoreGetLog; + } + + /** + * 根据参数初始化用户积分日志对象 + * + * @param score 积分 + * @param userId 用户id + * @param userScore 用户积分 + * @return 积分日志 + */ + private MongoUserScoreLogBO initScoreByParam(Long score, Long userId, Long userScore) { + MongoUserScoreLogBO scoreLog = new MongoUserScoreLogBO(); + scoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + scoreLog.setUserId(userId); + scoreLog.setSource(ScoreLogTypeEnum.SYSTEM.value()); + long changeScore; + if (userScore + score < 0) { + changeScore = userScore; + } else { + changeScore = Math.abs(score); + } + scoreLog.setScore(changeScore); + scoreLog.setIoType(score.compareTo(0L) < 0 ? ScoreIoTypeEnum.EXPENDITURE.value() : ScoreIoTypeEnum.INCOME.value()); + return scoreLog; + } + + /** + * 根据参数初始化一个成长值交易 对象 + * + * @param growth 成长值 + * @param now 时间 + * @param userId 用户id + * @param userGrowth 用户成长值 + * @return 成长值日志 + */ + private UserGrowthLog initGrowthLogByParam(Integer growth, DateTime now, Long userId, Integer userGrowth) { + // 如果成长值是0,再去减少用户成长值是不可以的,应该没有成长值日志 + if (growth < 0 && userGrowth <= 0) { + return null; + } + UserGrowthLog userGrowthLog = new UserGrowthLog(); + userGrowthLog.setUserId(userId); + userGrowthLog.setSource(GrowthLogSourceEnum.SYSTEM.value()); + int changeGrowth; + if (userGrowth + growth < 0) { + // 有io类型字段 + // changeGrowth = userGrowth + changeGrowth = -userGrowth; + } else { + // 有io类型字段 + // changeGrowth = Math.abs(growth) + changeGrowth = growth; + } + userGrowthLog.setChangeGrowth(changeGrowth); + userGrowthLog.setRemarks("系统修改用户成长值"); + userGrowthLog.setCreateTime(now); + userGrowthLog.setUpdateTime(now); + return userGrowthLog; + } + + private void updateUserScoreOrGrowth(List userIds, Long score, Integer growth) { + if (Objects.isNull(score) && Objects.isNull(growth)) { + return; + } + //增加/减少积分或者成长值 , sql中处理积分和成长值不能为负数,最小为0 + userExtensionMapper.updateUserScoreOrGrowth(userIds, score, growth); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserScoreLockServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserScoreLockServiceImpl.java new file mode 100644 index 0000000..5796423 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserScoreLockServiceImpl.java @@ -0,0 +1,355 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.BooleanUtil; +import com.google.common.collect.Lists; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.user.bo.UserScoreBO; +import com.tmerclub.cloud.api.user.dto.UserScoreLockDTO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.bo.mongo.MongoUserScoreLogBO; +import com.tmerclub.cloud.user.constant.DistributedIdKey; +import com.tmerclub.cloud.user.constant.ScoreGetLogStatusEnum; +import com.tmerclub.cloud.user.constant.ScoreLogTypeEnum; +import com.tmerclub.cloud.user.mapper.UserExtensionMapper; +import com.tmerclub.cloud.user.mapper.UserScoreGetLogMapper; +import com.tmerclub.cloud.user.mapper.UserScoreLockMapper; +import com.tmerclub.cloud.user.model.UserScoreGetLog; +import com.tmerclub.cloud.user.model.UserScoreLock; +import com.tmerclub.cloud.user.service.UserExtensionService; +import com.tmerclub.cloud.user.service.UserScoreGetLogService; +import com.tmerclub.cloud.user.service.UserScoreLockService; +import com.tmerclub.cloud.user.service.UserScoreLogService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 积分锁定信息 + * + * @author FrozenWatermelon + * @date 2021-05-19 19:54:55 + */ +@Service +public class UserScoreLockServiceImpl implements UserScoreLockService { + private static final Logger LOGGER = LoggerFactory.getLogger(UserScoreLockServiceImpl.class); + + @Autowired + private UserScoreLockMapper userScoreLockMapper; + @Autowired + private UserExtensionMapper userExtensionMapper; + @Autowired + private UserScoreGetLogMapper userScoreGetLogMapper; + @Autowired + private UserScoreLogService userScoreLogService; + @Autowired + private UserScoreGetLogService userScoreGetLogService; + @Autowired + private UserExtensionService userExtensionService; + @Autowired + private RocketMQTemplate userScoreTemplate; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private OrderFeignClient orderFeignClient; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> userScoreLockMapper.list()); + } + + @Override + public UserScoreLock getById(Long id) { + return userScoreLockMapper.getById(id); + } + + @Override + public void save(UserScoreLock userScoreLock) { + userScoreLockMapper.save(userScoreLock); + } + + @Override + public void update(UserScoreLock userScoreLock) { + userScoreLockMapper.update(userScoreLock); + } + + @Override + public void deleteById(Long id) { + userScoreLockMapper.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void lock(List userScoreLocks) { + Long userId = AuthUserContext.get().getUserId(); + Integer orderType = userScoreLocks.get(0).getOrderType(); + List saveUserScoreLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 1.先把已经过期但还没标记的积分全部查出来,标记成已过期,更新数据 + List expireUserScoreGetLogList = userScoreGetLogService.listByUserIdAndExpireTimeAndStatus(userId, new Date(), 1); + if (!CollUtil.isEmpty(expireUserScoreGetLogList)) { + Date date = new Date(); + for (UserScoreGetLog userScoreGetLog : expireUserScoreGetLogList) { + userScoreGetLog.setUpdateTime(date); + userScoreGetLog.setStatus(-1); + } + userScoreGetLogService.updateBatchById(expireUserScoreGetLogList); + // 计算过期的积分总和 + long expireScore = expireUserScoreGetLogList.stream().mapToLong(UserScoreGetLog::getUsableScore).sum(); + // 将过期积分写入积分变动日志记录表 + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(userId); + userScoreLog.setSource(ScoreLogTypeEnum.EXPIRE.value()); + userScoreLog.setScore(expireScore); + userScoreLog.setBizId(null); + userScoreLog.setIoType(0); + saveUserScoreLogList.add(userScoreLog); + // 修改 user_extension 表里的积分 + List longList = new ArrayList<>(Constant.INITIAL_CAPACITY); + longList.add(userId); + userExtensionService.updateUserScoreOrGrowth(longList, -expireScore, null); + } + + // 2.开始锁定积分 + List userScoreLockLogs = Lists.newArrayList(); + Set orderIdSet = new HashSet<>(Constant.INITIAL_CAPACITY); + Long useScore = 0L; + useScore = addUserScoreLockLog(userScoreLocks, userId, userScoreLockLogs, orderIdSet, useScore); + if (!userScoreLockLogs.isEmpty()) { + // 批量保存锁定记录 + userScoreLockMapper.saveBatch(userScoreLockLogs); + // 扣减用户积分 + int updateStatus = userExtensionMapper.lockScoreBySubmitOrder(userId, useScore); + if (updateStatus < 1) { + throw new LuckException("积分不足"); + } + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(userId); + if (Objects.equals(orderType, OrderType.SCORE.value())) { + userScoreLog.setSource(ScoreLogTypeEnum.SCORE_PRODUCT_EXCHANGE.value()); + userScoreLog.setBizId(userScoreLocks.get(0).getOrderId()); + } else { + userScoreLog.setSource(ScoreLogTypeEnum.SCORE_CASH.value()); + userScoreLog.setBizId(null); + } + userScoreLog.setScore(useScore); + userScoreLog.setIoType(0); + saveUserScoreLogList.add(userScoreLog); + + // 发送消息一个小时后解锁积分(包括哪些订单) + List orderIds = new ArrayList<>(orderIdSet); + UserScoreBO userScoreBo = new UserScoreBO(); + userScoreBo.setUserId(userId); + userScoreBo.setOrderIds(orderIds); + SendStatus sendStatus = userScoreTemplate.syncSend(RocketMqConstant.SCORE_UNLOCK_TOPIC, new GenericMessage<>(userScoreBo), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL + 1).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + userScoreLogService.saveBatchToMongodb(saveUserScoreLogList); + + } + + /** + * 添加用户积分锁定日志 + * + * @param userScoreLocks 锁定积分日志 + * @param userId 用户id + * @param userScoreLockLogs 用户积分锁定日志 + * @param orderIds 订单id列表 + * @param useScore 用户积分 + * @return 用户积分 + */ + private Long addUserScoreLockLog(List userScoreLocks, Long userId, List userScoreLockLogs, Set orderIds, Long useScore) { + for (UserScoreLockDTO userScoreLockParam : userScoreLocks) { + if (Objects.nonNull(userScoreLockParam.getScore())) { + List temp = userScoreGetLogService.listByCreateTime(userId, 1); + long sumTotalUsableScore = temp.stream().mapToLong(UserScoreGetLog::getUsableScore).sum(); + if (sumTotalUsableScore < userScoreLockParam.getScore()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + if (!temp.isEmpty()) { + Date date = new Date(); + // 按积分创建时间优先扣减 + Long usableScore = userScoreLockParam.getScore(); + List userScoreGetLogList; + long sumUsableScore; + int i = 1; + List scoreGetLogIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + do { + userScoreGetLogList = userScoreGetLogService.listByCreateTimeAndPage(userId, 1, 0, i * 10); + sumUsableScore = userScoreGetLogList.stream().mapToLong(UserScoreGetLog::getUsableScore).sum(); + if (usableScore > sumUsableScore) { + i = i + 1; + } + } while (usableScore > sumUsableScore); + + for (UserScoreGetLog userScoreGetLog : userScoreGetLogList) { + if (usableScore > 0) { + if (usableScore >= userScoreGetLog.getUsableScore()) { + userScoreGetLog.setUpdateTime(date); + userScoreGetLog.setStatus(0); + userScoreGetLogService.update(userScoreGetLog); + + usableScore = usableScore - userScoreGetLog.getUsableScore(); + scoreGetLogIds.add(userScoreGetLog.getUserScoreGetLogId()); + } else { + UserScoreGetLog userScoreGetLog2 = new UserScoreGetLog(); + userScoreGetLog2.setCreateTime(userScoreGetLog.getCreateTime()); + userScoreGetLog2.setUpdateTime(date); + userScoreGetLog2.setUserId(userScoreGetLog.getUserId()); + userScoreGetLog2.setUsableScore(userScoreGetLog.getUsableScore() - usableScore); + userScoreGetLog2.setBizId(userScoreGetLog.getBizId()); + userScoreGetLog2.setExpireTime(userScoreGetLog.getExpireTime()); + userScoreGetLog2.setStatus(userScoreGetLog.getStatus()); + userScoreGetLogService.save(userScoreGetLog2); + scoreGetLogIds.add(userScoreGetLog2.getUserScoreGetLogId()); + + userScoreGetLog.setUpdateTime(date); + userScoreGetLog.setUsableScore(usableScore); + userScoreGetLog.setStatus(0); + userScoreGetLogService.update(userScoreGetLog); + scoreGetLogIds.add(userScoreGetLog.getUserScoreGetLogId()); + usableScore = 0L; + } + } + } + + if (!scoreGetLogIds.isEmpty()) { + UserScoreLock userScoreLock = new UserScoreLock(); + userScoreLock.setUserId(userId); + userScoreLock.setScore(userScoreLockParam.getScore()); + userScoreLock.setOrderId(userScoreLockParam.getOrderId()); + userScoreLock.setScoreGetLogIds(Json.toJsonString(scoreGetLogIds)); + useScore += userScoreLock.getScore(); + userScoreLock.setStatus(0); + userScoreLockLogs.add(userScoreLock); + orderIds.add(userScoreLockParam.getOrderId()); + } + } + } + } + return useScore; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void unlock(UserScoreBO userScoreBo) { + ServerResponseEntity> ordersStatusResponse = orderFeignClient.getOrdersStatus(userScoreBo.getOrderIds()); + if (!ordersStatusResponse.isSuccess()) { + throw new LuckException(ordersStatusResponse.getMsg()); + } + List saveUserScoreLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List orderStatusList = ordersStatusResponse.getData(); + LOGGER.info("积分解锁-订单状态返回{}", orderStatusList); + for (OrderStatusBO orderStatusBO : orderStatusList) { + // 该订单没有下单成功,或订单已取消以及取消支付,赶紧解锁积分 + if (orderStatusBO.getStatus() == null || Objects.equals(orderStatusBO.getStatus(), OrderStatus.CLOSE.value()) || BooleanUtil.isTrue(userScoreBo.getFlag())) { + LOGGER.info("订单下单失败或取消订单,解锁积分{}", orderStatusBO); + List userScoreLockIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + Long useScore = 0L; + List userScoreLocks = userScoreLockMapper.listUserScoreLocksByOrderId(orderStatusBO.getOrderId()); + List userScoreGetIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (UserScoreLock userScoreLock : userScoreLocks) { + if (Objects.equals(userScoreLock.getStatus(), -1)) { + continue; + } + List tempUserScoreGetIds = Json.parseArray(userScoreLock.getScoreGetLogIds(), Long[].class); + userScoreGetIds.addAll(tempUserScoreGetIds); + userScoreLockIds.add(userScoreLock.getId()); + useScore = useScore + userScoreLock.getScore(); + } + List needUserScoreGetIds = new ArrayList<>(userScoreGetIds); + if (CollectionUtil.isEmpty(needUserScoreGetIds)) { + return; + } + // todo 批量将用户的积分变成未使用状态,是否要把已经拆开的积分合并? + userScoreGetLogMapper.batchUpdateUserScoreGetStatus(ScoreGetLogStatusEnum.NORMAL.value(), needUserScoreGetIds); + userExtensionMapper.updateScoreByUserId(userScoreBo.getUserId(), useScore); + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(userScoreBo.getUserId()); + if (Objects.equals(orderStatusBO.getOrderType(), OrderType.SCORE.value())) { + userScoreLog.setSource(ScoreLogTypeEnum.SCORE_PRODUCT_EXCHANGE_BACK.value()); + userScoreLog.setBizId(orderStatusBO.getOrderId()); + } else { + userScoreLog.setSource(ScoreLogTypeEnum.SCORE_CASH_BACK.value()); + userScoreLog.setBizId(null); + } + userScoreLog.setScore(useScore); + userScoreLog.setIoType(1); + saveUserScoreLogList.add(userScoreLog); + // 将锁定状态标记为已解锁 + if (CollUtil.isNotEmpty(userScoreLockIds)) { + int updateStatus = userScoreLockMapper.unLockByIds(-1, userScoreLockIds); + if (updateStatus == 0) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + } + if (Objects.equals(orderStatusBO.getStatus(), OrderStatus.PAYED.value()) + || BooleanUtil.isTrue(userScoreBo.getUnLock())) { + LOGGER.info("订单支付成功,解锁积分{}", orderStatusBO); + List userScoreLockIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userScoreLocks = userScoreLockMapper.listUserScoreLocksByOrderId(orderStatusBO.getOrderId()); + List userScoreGetIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (UserScoreLock userScoreLock : userScoreLocks) { + if (Objects.equals(userScoreLock.getStatus(), 1)) { + continue; + } + List tempUserScoreGetIds = Json.parseArray(userScoreLock.getScoreGetLogIds(), Long[].class); + userScoreGetIds.addAll(tempUserScoreGetIds); + userScoreLockIds.add(userScoreLock.getId()); + } + if (CollectionUtil.isEmpty(userScoreGetIds)) { + return; + } + if (CollUtil.isNotEmpty(userScoreLockIds)) { + int updateStatus = userScoreLockMapper.unLockByIds(1, userScoreLockIds); + if (updateStatus == 0) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + } + } + userScoreLogService.saveBatchToMongodb(saveUserScoreLogList); + } + + @Override + public void deleteByUserId(Long userId) { + userScoreLockMapper.deleteByUserId(userId); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..f2d56bf --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserServiceImpl.java @@ -0,0 +1,732 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.dto.AuthAccountWithSocialDTO; +import com.tmerclub.cloud.api.auth.dto.AuthSocialDTO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.coupon.feign.CouponFeignClient; +import com.tmerclub.cloud.api.coupon.vo.CouponUserCountDataVO; +import com.tmerclub.cloud.api.distribution.bo.DistributionUserUpdateBO; +import com.tmerclub.cloud.api.distribution.feign.DistributionFeignClient; +import com.tmerclub.cloud.api.order.dto.QueryOrderDTO; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.PersonalMemberInfo; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.payment.vo.PaySettlementConfigVO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.bo.UidAndUserIdBO; +import com.tmerclub.cloud.api.user.vo.MemberOverviewVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.user.vo.UserManagerVO; +import com.tmerclub.cloud.common.bean.PaySettlementConfig; +import com.tmerclub.cloud.common.cache.constant.UserCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.vo.UserOrderStatisticVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.user.bo.mongo.MongoUserScoreLogBO; +import com.tmerclub.cloud.user.constant.DistributedIdKey; +import com.tmerclub.cloud.user.constant.LevelTypeEnum; +import com.tmerclub.cloud.user.constant.OrderSortEnum; +import com.tmerclub.cloud.user.dto.ShopCustomerDTO; +import com.tmerclub.cloud.user.dto.UserDTO; +import com.tmerclub.cloud.user.dto.UserManagerDTO; +import com.tmerclub.cloud.user.mapper.UserMapper; +import com.tmerclub.cloud.user.model.User; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.service.*; +import com.tmerclub.cloud.user.vo.UserVO; +import io.seata.common.util.CollectionUtils; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用户表 + * + * @author YXF + * @date 2020-12-08 11:18:04 + */ +@Service +public class UserServiceImpl implements UserService { + + @Autowired + private UserMapper userMapper; + @Autowired + private UserExtensionService userExtensionService; + @Autowired + private UserLevelService userLevelService; + @Autowired + private UserAddrService userAddrService; + @Autowired + private UserConsigneeService userConsigneeService; + @Autowired + private UserGrowthLogService userGrowthLogService; + @Autowired + private UserScoreGetLogService userScoreGetLogService; + @Autowired + private UserScoreLockService userScoreLockService; + @Autowired + private UserScoreLogService userScoreLogService; + @Autowired + private UserTagUserService userTagUserService; + @Autowired + private SegmentManager segmentManager; + @Autowired + private RocketMQTemplate userNotifyDistributionUserTemplate; + @Autowired + private ShopCustomerService shopCustomerService; + @DubboReference + private AccountFeignClient accountFeignClient; + @DubboReference + private TokenFeignClient tokenFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + @DubboReference + private CouponFeignClient couponFeignClient; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @DubboReference + private ConfigFeignClient configFeignClient; + @DubboReference + private DistributionFeignClient distributionFeignClient; + @Autowired + private UserBalanceLogService userBalanceLogService; + + @Override + public PageVO page(PageDTO pageDTO, UserManagerDTO userManagerDTO) { + return PageUtil.doPage(pageDTO, () -> userMapper.list(userManagerDTO)); + } + + @Override + @Cacheable(cacheNames = UserCacheNames.USER_INFO, key = "#userId") + public UserApiVO getByUserId(Long userId) { + UserApiVO userApiVO = userMapper.getByUserId(userId); + if (Objects.isNull(userApiVO)) { + return null; + } + ServerResponseEntity accountResponse = accountFeignClient.getInsiderDataByUserIdAndSysType(userId, SysTypeEnum.ORDINARY.value()); + if (!accountResponse.isSuccess()) { + throw new LuckException(accountResponse.getMsg()); + } + if (Objects.nonNull(accountResponse.getData())) { + userApiVO.setUserName(accountResponse.getData().getUsername()); + } + + return userApiVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = UserCacheNames.USER_INFO, key = "#user.userId") + public void update(User user) { + userMapper.update(user); + // USER_NOTIFY_DISTRIBUTION_USER_TOPIC + // 如果有一项不为空,修改分销员信息(如果是分销员) + if (StrUtil.isNotBlank(user.getPic()) || StrUtil.isNotBlank(user.getNickName())) { + DistributionUserUpdateBO distributionUserUpdateBO = new DistributionUserUpdateBO(); + distributionUserUpdateBO.setUserId(user.getUserId()); + distributionUserUpdateBO.setNickName(user.getNickName()); + distributionUserUpdateBO.setPic(user.getPic()); + //通知分销服务, 修改分销员的昵称和分销员的头像 + SendStatus sendStockStatus = userNotifyDistributionUserTemplate.syncSend(RocketMqConstant.USER_NOTIFY_DISTRIBUTION_USER_TOPIC, new GenericMessage<>(distributionUserUpdateBO)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + } + + @Override + @CacheEvict(cacheNames = UserCacheNames.USER_INFO, key = "#userId") + public void removeUserCacheByUserId(Long userId) { + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateUserLevel(Integer level, int minGrowth, Integer maxGrowth) { + userMapper.updateUserLevel(level, minGrowth, maxGrowth); + userExtensionService.updateUserLevel(level, minGrowth, maxGrowth); + } + + @Override + public List getUserByUserIds(List userIds) { + if (CollUtil.isEmpty(userIds)) { + return new ArrayList<>(0); + } + return userMapper.getUserByUserIds(userIds); + } + + @Override + public UserApiVO getUserAndOpenIdsByUserId(Long userId) { + UserApiVO userApiVO = userMapper.getByUserId(userId); + List ids = accountFeignClient.getBizUserIdListByUserId(userId).getData(); + if(CollUtil.isNotEmpty(ids)){ + userApiVO.setBizUserIdList(ids); + } + return userApiVO; + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public UidAndUserIdBO save(String mobile, String password, String tempUid) { + Long userId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER); + AuthAccountDTO authAccountDTO = getAuthAccountDTO(mobile, password, userId); + AuthAccountWithSocialDTO authAccountWithSocialDTO = new AuthAccountWithSocialDTO(); + authAccountWithSocialDTO.setAuthAccount(authAccountDTO); + authAccountWithSocialDTO.setTempUid(tempUid); + User user = new User(); + user.setUserId(userId); + user.setLevel(Constant.USER_LEVEL_INIT); + user.setLevelType(LevelTypeEnum.ORDINARY_USER.value()); + user.setStatus(1); + user.setPhone(authAccountDTO.getPhone()); + // 昵称默认位u + 手机尾号后4位 + user.setNickName("u" + mobile.substring(7)); + // 默认开启商品个性化推荐 + user.setProdRecommendation(1); + // 这里保存之后才有用户id + userMapper.save(user); + // 有多个用户使用同一个手机号注册-证明当前添加的用户是重复注册,抛出异常回滚当前注册的用户 + int count = userMapper.countUserByPhone(mobile); + if (count > 1) { + throw new LuckException("手机号已存在,请更换手机号再次尝试"); + } + + // 保存统一账户信息 + ServerResponseEntity serverResponse = accountFeignClient.saveAccountWithSocial(authAccountWithSocialDTO); + // 抛异常回滚 + if (!serverResponse.isSuccess()) { + throw new LuckException(serverResponse.getMsg()); + } + + UserExtension userExtension = new UserExtension(); + userExtension.setBalance(0L); + userExtension.setActualBalance(0L); + userExtension.setAllinpayBalance(0L); + userExtension.setAllinpayActualBalance(0L); + userExtension.setAllinpayRealNameSet(0); + userExtension.setAllinpayPhoneBind(0); + userExtension.setAllinpayPayPwdSet(0); + userExtension.setAllinpayProtocolSign(0); + userExtension.setAllinpayPayAcctBind(0); + userExtension.setGrowth(0); + userExtension.setLevel(1); + userExtension.setLevelType(0); + userExtension.setScore(0L); + userExtension.setVersion(0); + userExtension.setSignDay(0); + // 上面保存这边才能拿到userId + userExtension.setUserId(user.getUserId()); + + userExtensionService.save(userExtension); + //用户注册成功后初始化用户数据 + MongoUserScoreLogBO mongoUserScoreLogBO = userLevelService.initUserInfoAndLevelInfo(userExtension, Constant.USER_LEVEL_INIT, LevelTypeEnum.ORDINARY_USER.value(), authAccountDTO.getPhone()); + + // 判断是否开启通联支付 + boolean isAllinpay = false; + String data = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG).getData(); + if (!ObjectUtils.isEmpty(data)) { + PaySettlementConfig config = JSON.parseObject(data, PaySettlementConfig.class); + isAllinpay = config.getPaySettlementType() != null + && Objects.equals(config.getPaySettlementType(), PaySysType.ALLINPAY.value()); + } + if (isAllinpay) { + // 若开通则同步创建通联个人会员 + allinpayFeignClient.batchCreatePersonalMember(Collections.singletonList(user.getUserId().toString())); + // 是否第三方注册登录,是则绑定对应的支付标识 + if (!ObjectUtils.isEmpty(tempUid)) { + AuthSocialDTO authSocial = accountFeignClient.getBizUserIdByTempUid(tempUid).getData(); + if (!ObjectUtils.isEmpty(authSocial)) { + allinpayFeignClient.bindPayAcct(userId, authSocial.getBizUserId(), authSocial.getSocialType()); + } + // 并更新用户扩展信息 + userExtension = userExtensionService.getByUserId(userId); + userExtension.setAllinpayPayAcctBind(1); + userExtensionService.update(userExtension); + } + } + if (Objects.nonNull(mongoUserScoreLogBO)) { + userScoreLogService.saveToMongdb(mongoUserScoreLogBO); + } + return new UidAndUserIdBO(serverResponse.getData(), userId); + } + + private static AuthAccountDTO getAuthAccountDTO(String mobile, String password, Long userId) { + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setPassword(password); + authAccountDTO.setPhone(mobile); + authAccountDTO.setIsAdmin(0); + authAccountDTO.setSysType(SysTypeEnum.ORDINARY.value()); + authAccountDTO.setStatus(1); + authAccountDTO.setUserId(userId); + return authAccountDTO; + } + + @Override + @CacheEvict(cacheNames = UserCacheNames.USER_INFO, key = "#userId") + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public void updateUserMobile(Long userId, String mobile) { + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setUserId(userId); + authAccountDTO.setPhone(mobile); + authAccountDTO.setSysType(SysTypeEnum.ORDINARY.value()); + ServerResponseEntity voidServerResponseEntity = accountFeignClient.updateUserMobile(authAccountDTO); + if (!voidServerResponseEntity.isSuccess()) { + throw new LuckException(voidServerResponseEntity.getMsg()); + } + // 更新user表手机号 + User user = new User(); + user.setUserId(userId); + user.setPhone(mobile); + userMapper.update(user); + // 同步修改分销员手机号 + DistributionUserUpdateBO distributionUserUpdateBO = new DistributionUserUpdateBO(); + distributionUserUpdateBO.setUserId(user.getUserId()); + distributionUserUpdateBO.setUserMobile((user.getPhone())); + SendStatus sendStockStatus = userNotifyDistributionUserTemplate.syncSend(RocketMqConstant.USER_NOTIFY_DISTRIBUTION_USER_TOPIC, new GenericMessage<>(distributionUserUpdateBO)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public PageVO getUserInfoPage(PageDTO pageDTO, UserManagerDTO userManagerDTO) { + PageVO pageVO = new PageVO<>(); + // 用户信息 + Long userTotal = userMapper.countUserPageByParam(userManagerDTO); + pageVO.setTotal(userTotal); + pageVO.setPages(PageUtil.getPages(pageVO.getTotal(), pageDTO.getPageSize())); + if (Objects.equals(0L, userTotal)) { + pageVO.setList(Collections.emptyList()); + return pageVO; + } + List userList = getUserInfoList(pageDTO, userManagerDTO); + pageVO.setList(userList); + return pageVO; + } + + @Override + public List getUserInfoList(PageDTO pageDTO, UserManagerDTO userManagerDTO) { + // 补充系统支付类型 + userManagerDTO.setPaySysType(configFeignClient.getPaySysType().getData()); + // 从用户表中查询数据,并且初始化一些相关订单变量的数据,就不用在后面再次设置相关相关初始值了 + List userList = userMapper.listUserByParam(userManagerDTO, new PageAdapter(pageDTO)); + // 补充余额记录数据 + userList = userBalanceLogService.setUserInfo(userList); + // 补充积分记录数据 + userList = userScoreLogService.setUserInfo(userList); + for (UserManagerVO userManagerVO : userList) { + // 将余额由分转为元 + BigDecimal currentBalance = userManagerVO.getCurrentBalance(); + BigDecimal sumBalance = userManagerVO.getSumBalance(); + userManagerVO.setCurrentBalance(PriceUtil.toDecimalPrice(currentBalance.longValue())); + userManagerVO.setSumBalance(PriceUtil.toDecimalPrice(sumBalance.longValue())); + userManagerVO.setPhone(PhoneUtil.hideBetween(userManagerVO.getPhone()).toString()); + } + List userIds = userList.stream().map(UserManagerVO::getUserId).collect(Collectors.toList()); + + // 统计用户的订单相关信息 + // eg说明:查询10个用户的订单,但是只有3个用户有下单记录,所以这里只会返回3条数据, + // 另外的7条记录保持默认值即可,应该在查询用户的时候已经设置了默认值了,所以不需要设置默认值 + QueryOrderDTO queryOrderDTO = new QueryOrderDTO(); + queryOrderDTO.setUserIds(new ArrayList<>(userIds)); + queryOrderDTO.setShopId(AuthUserContext.get().getTenantId()); + ServerResponseEntity> orderResponse = orderFeignClient.countOrderByUserIds(queryOrderDTO); + if (!Objects.equals(orderResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(orderResponse.getMsg()); + } + List data = orderResponse.getData(); + // 组装订单统计数据 + if (CollectionUtils.isNotEmpty(data)) { + Map userOrderMap = data.stream().collect(Collectors.toMap(UserOrderStatisticVO::getUserId, (k) -> k)); + assemblyUserData(userList, userOrderMap); + } + return userList; + } + + @Override + public UserManagerVO getUserInfo(Long userId, Long shopId) { + PageDTO pageDTO = new PageDTO(); + pageDTO.setPageNum(0); + pageDTO.setPageSize(1); + UserManagerDTO userManagerDTO = new UserManagerDTO(); + userManagerDTO.setUserIds(Collections.singletonList(userId)); + PageVO infoPage = getUserInfoPage(pageDTO, userManagerDTO); + if (infoPage.getTotal() < 1) { + throw new LuckException("该用户不存在"); + } + UserManagerVO userManagerVO = infoPage.getList().get(0); + // 统计用户优惠券相关信息 + ServerResponseEntity couponUserResponse = couponFeignClient.countCouponUserByUserId(userId, shopId); + if (!Objects.equals(couponUserResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(couponUserResponse.getMsg()); + } + userManagerVO.setCouponUserCountDataVO(couponUserResponse.getData()); + return userManagerVO; + } + + @Override + public void updateUserLevelByUserExtensionAndUserIds(List userIds) { + userMapper.updateUserLevelByUserExtensionAndUserIds(userIds); + } + + + @Override + @CacheEvict(cacheNames = UserCacheNames.USER_INFO, key = "#userDTO.userId") + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public void updateUserInfo(UserDTO userDTO) { + Long userId = userDTO.getUserId(); + Integer status = userDTO.getStatus(); + UserApiVO userApiVO = userMapper.getByUserId(userId); + boolean isUpdateStatus = Objects.equals(userApiVO.getStatus(), status); + User user = new User(); + user.setUserId(userDTO.getUserId()); + user.setNickName(userDTO.getNickName()); + if (!isUpdateStatus) { + user.setStatus(status); + } + user.setUpdateTime(DateUtil.date()); + // 更新用户表信息 + this.update(user); + // 如果用户状态未发生改变,就不需要修改账户表中用户的状态 + if (isUpdateStatus) { + return; + } + // 修改用户状态时需要修改auth_account表的状态,同时需要将用户下线 + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setUserId(user.getUserId()); + authAccountDTO.setSysType(SysTypeEnum.ORDINARY.value()); + authAccountDTO.setStatus(user.getStatus()); + ServerResponseEntity updateResponse = accountFeignClient.updateAuthAccountStatusAndDeleteUserToken(authAccountDTO); + if (!Objects.equals(updateResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(updateResponse.getMsg()); + } + // 是否开启通联支付,若开启,同步禁用/解禁通联平台的会员 + ServerResponseEntity configResponse = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG); + if (!configResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + PaySettlementConfigVO paySettlementConfigVO = Json.parseObject(configResponse.getData(), PaySettlementConfigVO.class); + if (Objects.equals(PaySysType.ALLINPAY.value(), paySettlementConfigVO.getPaySettlementType())) { + allinpayFeignClient.updateAllinpayMemberStatus(user.getUserId(), user.getStatus()); + } + } + + @Override + public List getUserListByPhones(List phones) { + if (CollUtil.isEmpty(phones)) { + return Collections.emptyList(); + } + return userMapper.getUserListByPhones(phones); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public void batchUser(List userList, List userExtensionList) { + if (CollUtil.isEmpty(userList)) { + return; + } + // seata不支持insert into select语句,将语句拆成两步 + // 过滤已存在的用户 + userList = userMapper.filterExistUsers(userList); + if (CollUtil.isEmpty(userList)) { + return; + } + // 新增用户 + int row = userMapper.saveBatch(userList); + if (row == 0) { + return; + } + // userList 的大小 不等于 插入row的行数,所以我们要查询插入的用户是那些 + // 如果是已经存在的userId在 userExtensionList中也不要紧,在保存sql的时候会排除掉数据库中已经存在的userId + List userIds = userList.stream().map(User::getUserId).collect(Collectors.toList()); + List userApiVOList = userMapper.getUserByUserIds(userIds); + List dbUserIds = userApiVOList.stream().map(UserApiVO::getUserId).collect(Collectors.toList()); + userExtensionList = userExtensionList.stream().filter(item -> dbUserIds.contains(item.getUserId())).collect(Collectors.toList()); + // 过滤已存在的userExtension + userExtensionList = userExtensionService.filterExistExtensions(userExtensionList); + if (CollUtil.isNotEmpty(userExtensionList)) { + userExtensionService.saveBatch(userExtensionList); + // 积分、成长值、余额日志 + userExtensionService.registerUserScoreGrowthBalanceLog(userExtensionList); + // 赠送注册积分 + userLevelService.registerUserScore(userExtensionList); + // 导入后赠送等级相关的积分和权益 + userLevelService.registerUserSendRights(userExtensionList); + } + // 是否开启通联支付,若开启则注册通联平台的个人会员 + String data = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG).getData(); + if (!ObjectUtils.isEmpty(data)) { + PaySettlementConfig config = JSON.parseObject(data, PaySettlementConfig.class); + if (config.getPaySettlementType() != null && config.getPaySettlementType() == 1) { + List bizUserIds = userIds.stream().map(Object::toString).collect(Collectors.toList()); + allinpayFeignClient.batchCreatePersonalMember(bizUserIds); + } + } + } + + @Override + public List getUserByCreateTimeRange(Integer status, Date startDate, Date endDate) { + return userMapper.getUserByCreateTimeRange(status, startDate, endDate); + } + + @Override + public MemberOverviewVO getUserCountInfo(Date endTime) { + Date startTime = DateUtil.beginOfDay(endTime); + return userMapper.getUserCountInfo(startTime, endTime); + } + + @Override + public List listUserByMobile(String mobile) { + return userMapper.listUserByMobile(mobile); + } + + @Override + public Integer countUserByLevel(Integer level, Integer levelType) { + return userMapper.countUserByLevel(level, levelType); + } + + @Override + public List selectMemberByEndTime(DateTime endOfDay) { + return userMapper.selectMemberByEndTime(endOfDay); + } + + @Override + public void updateUserTypeLevelByUserExtensionAndUserIds(List userIds) { + userMapper.updateUserTypeLevelByUserExtensionAndUserIds(userIds); + } + + + private void assemblyUserData(List userList, Map userOrderMap) { + for (UserManagerVO userManagerVO : userList) { + UserOrderStatisticVO orderStatisticVO = userOrderMap.get(userManagerVO.getUserId()); + if (Objects.isNull(orderStatisticVO)) { + userManagerVO.setActualAmount(new BigDecimal(0)); + userManagerVO.setConsAmount(new BigDecimal(0)); + userManagerVO.setConsTimes(0); + userManagerVO.setAfterSaleAmount(new BigDecimal(0)); + userManagerVO.setAfterSaleTimes(0); + userManagerVO.setAllCount(0); + continue; + } + BigDecimal rechargeAmount = Objects.nonNull(userManagerVO.getRechargeAmount()) ? userManagerVO.getRechargeAmount() : new BigDecimal(0); + // 实付金额 累计支付的金额: 除了余额支付/积分支付的订单累计金额 + 余额充值金额 + userManagerVO.setActualAmount(PriceUtil.toDecimalPrice(orderStatisticVO.getActualAmount().longValue()).add(rechargeAmount)); + // 最近支付下单时间 + Date reConsTime1 = orderStatisticVO.getReConsTime(); + // 最近余额充值时间 + Date reConsTime2 = userManagerVO.getReConsTime(); + // 最近消费时间 reConsTime1 reConsTime2 比较 + if (Objects.isNull(reConsTime2)) { + userManagerVO.setReConsTime(reConsTime1); + } else if (Objects.nonNull(reConsTime1)) { + userManagerVO.setReConsTime(DateUtil.compare(reConsTime1, reConsTime2) >= 0 ? reConsTime1 : reConsTime2); + } + userManagerVO.setConsAmount(PriceUtil.toDecimalPrice(orderStatisticVO.getConsAmount().longValue())); + userManagerVO.setConsTimes(orderStatisticVO.getConsTimes()); + userManagerVO.setAverDiscount(orderStatisticVO.getAverDiscount()); + userManagerVO.setAfterSaleAmount(PriceUtil.toDecimalPrice(orderStatisticVO.getAfterSaleAmount().longValue())); + userManagerVO.setAfterSaleTimes(orderStatisticVO.getAfterSaleTimes()); + userManagerVO.setAllCount(orderStatisticVO.getAllCount()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void destroyUser(Long userId) { + + userMapper.deleteById(userId); + userAddrService.deleteUserAddrByUserId(null, userId); + UserExtension userExtension = userExtensionService.getByUserId(userId); + userExtensionService.deleteById(userExtension.getUserExtensionId()); + userConsigneeService.deleteByUserId(userId); + userGrowthLogService.deleteByUserId(userId); + userScoreGetLogService.deleteByUserId(userId); + userScoreLockService.deleteByUserId(userId); + userScoreLogService.deleteByUserId(userId); + userTagUserService.deleteByUserId(userId); + accountFeignClient.deleteByUserIdAndSysType(userId); + tokenFeignClient.clearToken(); + RedisUtil.del(UserCacheNames.USER_INFO + UserCacheNames.UNION + userId); + } + + @Override + public List getUserByParam(UserApiVO userApiVO) { + return userMapper.getUserByParam(userApiVO); + } + + @Override + public PageVO pageShopCustomerByParam(PageDTO pageDTO, ShopCustomerDTO shopCustomerDTO) { + List users = shopCustomerService.listByParam(shopCustomerDTO); + if (CollUtil.isEmpty(users)) { + return new PageVO<>(); + } + List userIdList = users.stream().map(UserManagerVO::getUserId).collect(Collectors.toList()); + QueryOrderDTO queryOrderDTO = new QueryOrderDTO(); + queryOrderDTO.setUserIds(userIdList); + queryOrderDTO.setShopId(shopCustomerDTO.getShopId()); + ServerResponseEntity> orderResponse = orderFeignClient.countOrderByUserIds(queryOrderDTO); + if (!Objects.equals(orderResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(orderResponse.getMsg()); + } + List orderData = orderResponse.getData(); + + Map orderDataMap = orderData.stream().collect(Collectors.toMap(UserOrderStatisticVO::getUserId, (u) -> u)); + for (UserManagerVO userManagerVO : users) { + UserOrderStatisticVO userOrderData = orderDataMap.get(userManagerVO.getUserId()); + userManagerVO.setReConsTime(Objects.nonNull(userOrderData) ? userOrderData.getReConsTime() : null); + userManagerVO.setConsTimes(Objects.nonNull(userOrderData) ? userOrderData.getConsTimes() : 0); + userManagerVO.setAllCount(Objects.nonNull(userOrderData) ? userOrderData.getAllCount() : 0); + userManagerVO.setAverDiscount(Objects.nonNull(userOrderData) ? userOrderData.getAverDiscount() : new BigDecimal(0)); + userManagerVO.setConsAmount(Objects.nonNull(userOrderData) ? PriceUtil.toDecimalPrice(userOrderData.getConsAmount().longValue()) : new BigDecimal(0)); + userManagerVO.setAfterSaleAmount(Objects.nonNull(userOrderData) ? PriceUtil.toDecimalPrice(userOrderData.getAfterSaleAmount().longValue()) : new BigDecimal(0)); + userManagerVO.setActualAmount(Objects.nonNull(userOrderData) ? PriceUtil.toDecimalPrice(userOrderData.getActualAmount().longValue()) : new BigDecimal(0)); + userManagerVO.setAfterSaleTimes(Objects.nonNull(userOrderData) ? userOrderData.getAfterSaleTimes() : 0); + userManagerVO.setPhone(PhoneUtil.hideBetween(userManagerVO.getPhone()).toString()); + + } + Integer sort = shopCustomerDTO.getSort(); + if (Objects.equals(shopCustomerDTO.getSort(), OrderSortEnum.ALL_COUNT_ASC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getAllCount)); + } else if (Objects.equals(sort, OrderSortEnum.ALL_COUNTC_DESC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getAllCount).reversed()); + } else if (Objects.equals(sort, OrderSortEnum.AVER_DISCOUNT_ASC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getAverDiscount)); + } else if (Objects.equals(sort, OrderSortEnum.AVER_DISCOUNT_DESC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getAverDiscount).reversed()); + } else if (Objects.equals(sort, OrderSortEnum.AFTER_SALE_TIMES_ASC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getAfterSaleTimes)); + } else if (Objects.equals(sort, OrderSortEnum.AFTER_SALE_TIMES_DESC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getAfterSaleTimes).reversed()); + } else if (Objects.equals(sort, OrderSortEnum.AFTER_SALE_AMOUNT_ASC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getAfterSaleAmount)); + } else if (Objects.equals(sort, OrderSortEnum.AFTER_SALE_AMOUNT_DESC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getAfterSaleAmount).reversed()); + } else if (Objects.equals(sort, OrderSortEnum.CONS_AMOUNT_ASC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getConsAmount)); + } else if (Objects.equals(sort, OrderSortEnum.CONS_AMOUNT_DESC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getConsAmount).reversed()); + } else if (Objects.equals(sort, OrderSortEnum.ACTUAL_AMOUNT_ASC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getActualAmount)); + } else if (Objects.equals(sort, OrderSortEnum.ACTUAL_AMOUNT_DESC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getActualAmount).reversed()); + } else if (Objects.equals(sort, OrderSortEnum.CONS_TIMES_ASC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getConsTimes)); + } else if (Objects.equals(sort, OrderSortEnum.CONS_TIMES_DESC.value())) { + users.sort(Comparator.comparing(UserManagerVO::getConsTimes).reversed()); + } + PageVO pageVO = new PageVO<>(); + List result = users.stream().skip((long) (pageDTO.getPageNum() - 1) * pageDTO.getPageSize()).limit(pageDTO.getPageSize()).collect(Collectors.toList()); + pageVO.setTotal((long) users.size()); + pageVO.setPages((users.size() - 1) / pageDTO.getPageSize() + 1); + pageVO.setList(result); + return pageVO; + } + + @Override + public List listUser(UserManagerDTO userManagerDTO) { + return userMapper.listUser(userManagerDTO); + } + + @Override + public void updateUserInfoByAllinpay() { + List users = userMapper.listUser(null); + if (CollUtil.isEmpty(users)) { + return; + } + List userIds = users.stream().map(User::getUserId).collect(Collectors.toList()); + // 循环更新用户通联信息 + UserExtension userExtension; + PersonalMemberInfo memberInfo; + Boolean isBindPayAcct; + for (Long userId : userIds) { + userExtension = userExtensionService.getByUserId(userId); + // 查询个人会员信息 + memberInfo = allinpayFeignClient.getPersonalMemberInfo(userId.toString()).getData(); + if (memberInfo != null) { + userExtension.setAllinpayRealNameSet(memberInfo.getIdentityChecked() ? 1 : 0); + userExtension.setAllinpayPhoneBind(memberInfo.getPhoneChecked() ? 1 : 0); + userExtension.setAllinpayPayPwdSet(memberInfo.getSetPayPwd() ? 1 : 0); + userExtension.setAllinpayProtocolSign(memberInfo.getSignAcctProtocolTime() != null ? 1 : 0); + } + isBindPayAcct = allinpayFeignClient.isBindPayAcct(userId).getData(); + userExtension.setAllinpayPayAcctBind(isBindPayAcct ? 1 : 0); + // 更新用户通联信息 + userExtensionService.update(userExtension); + } + } + + @Override + public Integer countNewUserByTime(Date startTime, Date endTime) { + if (Objects.isNull(startTime) && Objects.isNull(endTime)) { + return 0; + } + return userMapper.countNewUserByTime(startTime, endTime); + } + + @Override + public List listNewUserIdByTime(Date startTime, Date endTime) { + if (Objects.isNull(startTime) && Objects.isNull(endTime)) { + return new ArrayList<>(0); + } + return userMapper.listNewUserIdByTime(startTime, endTime); + } + + @Override + public List listUserByUserIds(List userIds) { + if (CollUtil.isEmpty(userIds)) { + return Collections.emptyList(); + } + return userMapper.listUserByUserIds(userIds); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserTagUserServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserTagUserServiceImpl.java new file mode 100644 index 0000000..98b22a7 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserTagUserServiceImpl.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.user.vo.UserTagApiVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.dto.UserAdminDTO; +import com.tmerclub.cloud.user.mapper.UserTagMapper; +import com.tmerclub.cloud.user.mapper.UserTagUserMapper; +import com.tmerclub.cloud.user.model.UserTagUser; +import com.tmerclub.cloud.user.service.UserTagUserService; +import com.tmerclub.cloud.user.vo.UserTagUserVO; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用户和标签关联表 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@Service +public class UserTagUserServiceImpl implements UserTagUserService { + + @Autowired + private UserTagUserMapper userTagUserMapper; + + @Autowired + private UserTagMapper userTagMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> userTagUserMapper.list()); + } + + @Override + public UserTagUser getByUserTagUserId(Long userTagUserId) { + return userTagUserMapper.getByUserTagUserId(userTagUserId); + } + + @Override + public void save(UserTagUser userTagUser) { + userTagUserMapper.save(userTagUser); + } + + @Override + public void update(UserTagUser userTagUser) { + userTagUserMapper.update(userTagUser); + } + + @Override + public void deleteById(Long userTagUserId) { + userTagUserMapper.deleteById(userTagUserId); + } + + @Override + public List getUserTagsByUserId(Long userId) { + return userTagUserMapper.getUserTagsByUserId(userId); + } + + @Override + public void removeByUserTagId(Long userTagId) { + userTagUserMapper.removeByUserTagId(userTagId); + } + + @Override + public void saveBatch(List userTagUsers) { + userTagUserMapper.saveBatch(userTagUsers); + } + + @Override + public boolean batchUpdateUserTag(UserAdminDTO userAdminDTO) { + List userIds = userAdminDTO.getUserIds(); + List tagList = userAdminDTO.getTagList(); + Collection longs = new HashSet<>(tagList); + tagList.clear(); + tagList.addAll(longs); + if (CollectionUtils.isEmpty(tagList) || CollectionUtils.isEmpty(userIds)) { + return false; + } + // 用户已有的标签 + List list = userTagUserMapper.listByUserIds(userIds); + Map> map = new HashMap<>(16); + if (CollUtil.isNotEmpty(list)) { + map = list.stream().collect(Collectors.groupingBy(UserTagUserVO::getUserId)); + } + boolean empty = map.isEmpty(); + // 将用户的标签全部查询处理 + List tagUsers = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long userId : userIds) { + List userTagIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userTagUserVOList = map.get(userId); + if (!empty && CollUtil.isNotEmpty(userTagUserVOList)) { + userTagIds = userTagUserVOList.stream().map(UserTagUserVO::getUserTagId).collect(Collectors.toList()); + } + for (Long tagId : tagList) { + // 给用户打标签 tagList + if (userTagIds.contains(tagId)) { + // 已经存在标签的就不用给用户打标签了 + continue; + } + UserTagUser userTagUser = new UserTagUser(); + userTagUser.setUserTagId(tagId); + userTagUser.setUserId(userId); + tagUsers.add(userTagUser); + } + } + if (CollectionUtils.isEmpty(tagUsers)) { + return false; + } + // 给用户打上标签 + int saveRows = userTagUserMapper.saveBatch(tagUsers); + // 统计某个标签有多少个人,然后更新标签人数 + Map tagUser = new HashMap<>(16); + Map> collect = tagUsers.stream().collect(Collectors.groupingBy(UserTagUser::getUserTagId)); + collect.forEach((tagId, lists) -> { + int size = lists.size(); + tagUser.put(tagId, size); + }); + userTagMapper.updateBatchTagUserNum(tagUser); + return saveRows > 0; + } + + @Override + public boolean removeByUserIdAndTagId(Long userId, Long userTagId) { + boolean a = userTagUserMapper.removeByUserIdAndTagId(userId, userTagId) > 0; + Map tagUser = new HashMap<>(16); + tagUser.put(userTagId, -1); + userTagMapper.updateBatchTagUserNum(tagUser); + return a; + } + + @Override + public List getUserByTagIds(List userTagIds) { + if (CollUtil.isEmpty(userTagIds)) { + return Collections.emptyList(); + } + List userApiVOList = userTagUserMapper.getUserByTagIds(userTagIds); + return userApiVOList.stream().collect( + Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(UserApiVO::getUserId))), ArrayList::new) + ); + } + + @Override + public void deleteByTagId(Long tagId) { + userTagUserMapper.deleteByTagId(tagId); + } + + @Override + public void deleteByUserId(Long userId) { + userTagUserMapper.deleteByUserId(userId); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserWithdrawCashServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserWithdrawCashServiceImpl.java new file mode 100644 index 0000000..98ab0f1 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserWithdrawCashServiceImpl.java @@ -0,0 +1,215 @@ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.WithdrawApplyResp; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.platform.constant.WithdrawFrequency; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.vo.DistributionConfigApiVO; +import com.tmerclub.cloud.common.constant.AllinpayPayStatus; +import com.tmerclub.cloud.common.constant.AllinpayWithdrawCashStatusType; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.dto.UserWithDrawDTO; +import com.tmerclub.cloud.user.mapper.UserWithdrawCashMapper; +import com.tmerclub.cloud.user.model.UserWithdrawCash; +import com.tmerclub.cloud.user.service.UserWithdrawCashService; +import com.tmerclub.cloud.user.vo.DateUserWithdrawCashVO; +import com.tmerclub.cloud.user.vo.UserWithdrawCashVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.*; + +/** + * @author gaozijie + * @date 2023-04-24 + */ +@Service +public class UserWithdrawCashServiceImpl implements UserWithdrawCashService { + + @Autowired + private UserWithdrawCashMapper userWithdrawCashMapper; + + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + + @DubboReference + private ConfigFeignClient configFeignClient; + + @Override + public WithdrawApplyResp withdrawApply(UserWithDrawDTO withDrawDTO) { + // 提现参数校验 + this.checkWithdrawParam(withDrawDTO); + withDrawDTO.setAmount(Arith.mul(withDrawDTO.getAmount(), 100)); + // 调用通联接口进行余额提现申请 + String bizUserId = String.valueOf(withDrawDTO.getUserId()); + ServerResponseEntity resp = allinpayFeignClient.withdrawApply( + bizUserId, + withDrawDTO.getAmount().longValue(), + withDrawDTO.getBankCardNo(), + SysTypeEnum.ORDINARY.value() + ); + if (!resp.isSuccess()) { + throw new LuckException(resp.getMsg()); + } + WithdrawApplyResp withdrawApplyResp = resp.getData(); + // 保存用户提现记录 + UserWithdrawCash withdrawCash = new UserWithdrawCash(); + withdrawCash.setUserId(AuthUserContext.get().getUserId()); + withdrawCash.setPaySysType(PaySysType.ALLINPAY.value()); + withdrawCash.setAmount(withDrawDTO.getAmount().longValue()); + withdrawCash.setBankCardNo(withDrawDTO.getBankCardNo()); + withdrawCash.setStatus(AllinpayWithdrawCashStatusType.APPLY_SUCCESS.value()); + withdrawCash.setOrderNo(withdrawApplyResp.getBizOrderNo()); + withdrawCash.setBizOrderNo(withdrawApplyResp.getOrderNo()); + userWithdrawCashMapper.save(withdrawCash); + // 数据返回 + return withdrawApplyResp; + } + + @Override + public PayByBackSmsResp payConfirm(UserWithDrawDTO userWithDrawDTO) { + // 数据校验 + UserWithdrawCash userWithdrawCash = userWithdrawCashMapper.getByOrderNo(userWithDrawDTO.getBizOrderNo()); + if (Objects.isNull(userWithdrawCash)) { + throw new LuckException("提现记录不存在"); + } + if (!Objects.equals(userWithdrawCash.getUserId(), userWithDrawDTO.getUserId())) { + throw new LuckException("当前提现订单号不属于该用户"); + } + if (!Objects.equals(userWithdrawCash.getStatus(), AllinpayWithdrawCashStatusType.APPLY_SUCCESS.value()) + && !Objects.equals(userWithdrawCash.getStatus(), AllinpayWithdrawCashStatusType.WAIT_PAY.value())) { + throw new LuckException("申请状态异常,请刷新重试"); + } + // 调用通联接口进行余额提现确认支付 + ServerResponseEntity payResponse = allinpayFeignClient.payByBackSms(String.valueOf(userWithdrawCash.getUserId()), userWithDrawDTO.getBizOrderNo(), userWithDrawDTO.getVerificationCode()); + if (!payResponse.isSuccess()) { + throw new LuckException(payResponse.getMsg()); + } + PayByBackSmsResp payByBackSmsResp = payResponse.getData(); + String payStatus = payByBackSmsResp.getPayStatus(); + String payFailMessage = payByBackSmsResp.getPayFailMessage(); + if (Objects.equals(payStatus, AllinpayPayStatus.UNPAY.value())) { + // 收银宝快捷短信验证码输入错误场景,允许商户继续调用确认支付 + userWithdrawCash.setStatus(AllinpayWithdrawCashStatusType.WAIT_PAY.value()); + userWithdrawCash.setPayFailMessage(payFailMessage); + userWithdrawCashMapper.update(userWithdrawCash); + } + return payByBackSmsResp; + } + + @Override + public UserWithdrawCash getByBizOrderNo(String bizOrderNo) { + return userWithdrawCashMapper.getByOrderNo(bizOrderNo); + } + + @Override + public void update(UserWithdrawCash userWithdrawCash) { + userWithdrawCashMapper.update(userWithdrawCash); + } + + @Override + public BigDecimal getTotalWithdrawAmount(Long userId) { + return userWithdrawCashMapper.getTotalWithdrawAmount(userId); + } + + @Override + public PageVO pageUserWithdrawCashVOList(Long userId, PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> userWithdrawCashMapper.listUserWithdrawCashVOList(userId)); + } + + @Override + public PageVO pageDateUserWithdrawCashVOList(Long userId, PageDTO pageDTO) { + // 分页查询用户提现记录 + PageVO withdrawCashPage = this.pageUserWithdrawCashVOList(userId, pageDTO); + PageVO dateWithdrawCashPage = new PageVO<>(); + dateWithdrawCashPage.setTotal(withdrawCashPage.getTotal()); + dateWithdrawCashPage.setPages(withdrawCashPage.getPages()); + if (CollectionUtils.isEmpty(withdrawCashPage.getList())) { + dateWithdrawCashPage.setList(new ArrayList<>(Constant.INITIAL_CAPACITY)); + return dateWithdrawCashPage; + } + // 取出数据,对里面的数据按createTime的年月进行分组 + Map> dateUserWithdrawCashMap = new HashMap<>(16); + DateTime beginOfMonth; + List userWithdrawCashVOList; + for (UserWithdrawCashVO userWithdrawCashVO : withdrawCashPage.getList()) { + beginOfMonth = DateUtil.beginOfMonth(userWithdrawCashVO.getCreateTime()); + userWithdrawCashVOList = dateUserWithdrawCashMap.getOrDefault(beginOfMonth, new ArrayList<>(Constant.INITIAL_CAPACITY)); + userWithdrawCashVOList.add(userWithdrawCashVO); + dateUserWithdrawCashMap.put(beginOfMonth, userWithdrawCashVOList); + } + // 数据封装为DateUserWithdrawCashVO + List dateUserWithdrawCashVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + DateUserWithdrawCashVO dateUserWithdrawCashVO; + for (Map.Entry> entry : dateUserWithdrawCashMap.entrySet()) { + dateUserWithdrawCashVO = new DateUserWithdrawCashVO(); + dateUserWithdrawCashVO.setDate(entry.getKey()); + dateUserWithdrawCashVO.setWithdrawCashVOs(entry.getValue()); + dateUserWithdrawCashVOList.add(dateUserWithdrawCashVO); + } + // 封装到新pageVO,并进行返回 + dateWithdrawCashPage.setList(dateUserWithdrawCashVOList); + return dateWithdrawCashPage; + } + + private void checkWithdrawParam(UserWithDrawDTO userWithDrawDTO) { + // 获取提现配置(分销配置) + ServerResponseEntity config = configFeignClient.getConfig(Constant.DISTRIBUTION_CONFIG); + if (!config.isSuccess() || Objects.isNull(config.getData())) { + throw new LuckException(config.getMsg()); + } + DistributionConfigApiVO distributionConfig = Json.parseObject(config.getData(), DistributionConfigApiVO.class); + // 校验提现金额是否超出限制 + BigDecimal amount = BigDecimal.valueOf(userWithDrawDTO.getAmount()); + if (amount.compareTo(distributionConfig.getAmountMax()) > 0) { + throw new LuckException("提现金额大于最大提现金额"); + } + if (amount.compareTo(distributionConfig.getAmountMin()) < 0) { + throw new LuckException("提现金额小于最小提现金额"); + } + // 校验提现时间频率 + Integer frequency = distributionConfig.getFrequency(); + if (!Objects.equals(frequency, WithdrawFrequency.NOT_LIMIT.getValue())) { + LocalDateTime startTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN); + WithdrawFrequency withdrawFrequency; + if (Objects.equals(frequency, WithdrawFrequency.EVERY_DAY.getValue())) { + // 每日 + withdrawFrequency = WithdrawFrequency.EVERY_DAY; + } else if (Objects.equals(frequency, WithdrawFrequency.EVERY_WEEK.getValue())) { + // 每周 + startTime = startTime.plusDays(-startTime.getDayOfWeek().getValue() + 1); + withdrawFrequency = WithdrawFrequency.EVERY_WEEK; + } else if (Objects.equals(frequency, WithdrawFrequency.EVERY_MONTH.getValue())) { + // 每月 + startTime = startTime.plusDays(-startTime.getDayOfMonth() + 1); + withdrawFrequency = WithdrawFrequency.EVERY_MONTH; + } else { + throw new LuckException("提现频率配置错误"); + } + // 校验次数 + Integer times = userWithdrawCashMapper.countWithdrawTimes(userWithDrawDTO.getUserId(), startTime); + if (times >= distributionConfig.getNumber()) { + throw new LuckException("提现次数为" + withdrawFrequency.getDesc() + "只能提现" + distributionConfig.getNumber() + "次"); + } + } + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/task/AllinpayTask.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/task/AllinpayTask.java new file mode 100644 index 0000000..74ad04c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/task/AllinpayTask.java @@ -0,0 +1,61 @@ +package com.tmerclub.cloud.user.task; + +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.dto.UserExtensionDTO; +import com.tmerclub.cloud.user.service.UserExtensionService; +import com.tmerclub.cloud.user.vo.UserExtensionVO; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Objects; + +/** + * 通联定时任务 + * @author gaozijie + * @date 2023-11-10 + */ +@Component +public class AllinpayTask { + + private static final Logger log = LoggerFactory.getLogger(AllinpayTask.class); + + @Autowired + private UserExtensionService userExtensionService; + + @DubboReference + private ConfigFeignClient configFeignClient; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + + /** + * 创建通联会员 + */ + @XxlJob("createAllinpayMember") + public void createAllinpayMember() { + log.info("(定时)用户创建通联会员..."); + // 查询是否开启通联支付 + Integer paySysType = configFeignClient.getPaySysType().getData(); + if (!Objects.equals(paySysType, PaySysType.ALLINPAY.value())) { + return; + } + // 查询未创建会员用户信息 + UserExtensionDTO userExtensionDTO = new UserExtensionDTO(); + userExtensionDTO.setAllinpayCreate(0); + List userExtensions = userExtensionService.listUserExtensions(userExtensionDTO); + if (CollectionUtils.isEmpty(userExtensions)) { + return; + } + // 向通联创建会员 + List bizUserIds = userExtensions.stream().map(x -> x.getUserId().toString()).toList(); + Integer successCount = allinpayFeignClient.batchCreatePersonalMember(bizUserIds).getData(); + log.info("(定时)用户创建通联会员 - 成功:{},失败:{}", successCount, bizUserIds.size()-successCount); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/task/PopupTask.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/task/PopupTask.java new file mode 100644 index 0000000..3e3ab22 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/task/PopupTask.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.task; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.user.service.CostPerPopupService; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 弹窗广告定时任务 + * @author TRACK + */ +@Component +public class PopupTask { + + private static final Logger log = LoggerFactory.getLogger(PopupTask.class); + + @Autowired + private CostPerPopupService costPerPopupService; + + /** + * 改变弹窗广告状态 + * 半小时执行一次 + */ + @XxlJob("changePopup") + public void changePopup() { + log.info("改变弹窗广告状态"); + // 需要投放的弹窗广告 + List putOnIds = costPerPopupService.putOnAdvertise(); + // 需要结束的弹窗广告 + List endIds = costPerPopupService.endAdvertise(); + putOnIds.addAll(endIds); + if (CollUtil.isNotEmpty(putOnIds)) { + costPerPopupService.removeCacheBatch(putOnIds); + } + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/task/ScoreTask.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/task/ScoreTask.java new file mode 100644 index 0000000..103dd02 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/task/ScoreTask.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.task; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.vo.ScoreExpireConfigVO; +import com.tmerclub.cloud.common.constant.ConfigNameConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.service.*; +import com.tmerclub.cloud.user.vo.UserVO; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @author cl + * @date 2021-07-22 16:38:42 + */ +@Component +public class ScoreTask { + + private static final Logger log = LoggerFactory.getLogger(ScoreTask.class); + + @Autowired + private UserExtensionService userExtensionService; + @Autowired + private UserService userService; + @Autowired + private UserLevelService userLevelService; + @Autowired + private UserScoreGetLogService userScoreGetLogService; + @DubboReference + private ConfigFeignClient configFeignClient; + @Autowired + private UserScoreLogService userScoreLogService; + @Autowired + private UserBalanceLogService userBalanceLogService; + + /** + * 将会员设为已过期状态 + * 付费会员过期处理规则: + * 将付费会员的等级和类型变成 + */ + @XxlJob("vipUserClear") + public void vipUserClear() { + log.info("将会员设为已过期状态》》》》》》》》》》》》》》》》》》》》》"); + // 获取截至日期之前的所有付费会员信息 + List users = userService.selectMemberByEndTime(DateUtil.endOfDay(DateUtil.yesterday())); + if (CollectionUtil.isEmpty(users)) { + log.info("将会员设为已过期状态》》》》》》》》》》》》》》》》》》》》》"); + return; + } + // 会员过期变更规则:将付费会员变成普通会员,会员等级直接变成普通会员的成长值对应的等级 + userLevelService.expireVipUsers(users); + + log.info("将会员设为已过期状态》》》》》》》》》》》》》》》》》》》》》"); + } + + /** + * 积分过期定时任务 + */ + @XxlJob("scoreExpireTask") + public void scoreExpireTask() { + // 0.计算过期时间 + String scoreExpireParam = configFeignClient.getConfig(ConfigNameConstant.SCORE_EXPIRE).getData(); + //计算过期时间 + ScoreExpireConfigVO scoreExpireParamConfigVO = Json.parseObject(scoreExpireParam, ScoreExpireConfigVO.class); + if (Objects.isNull(scoreExpireParamConfigVO) || !scoreExpireParamConfigVO.getScoreExpireSwitch()) { + return; + } + int year = scoreExpireParamConfigVO.getExpireYear() - 1; + DateTime dateTime = DateUtil.offset(DateUtil.beginOfDay(new Date()), DateField.YEAR, -year); + // 1.修改用户过期积分 + userScoreGetLogService.updateExpireScoreDetail(dateTime); + } + + /** + * 初始化原有数据库记录至mongodb + * 该定时任务成功执行一次即可!!!!!,成功执行完后将任务置为STOP状态或删除 + */ + @XxlJob("initScoreAndBalanceLogToMongodb") + public void initScoreAndBalanceLogToMongodb() { + // ===================== 初始化积分记录 ===================== + log.info("初始化积分记录"); + userScoreLogService.initUserScoreLogToMongodb(); + + // ===================== 初始化余额记录 ===================== + log.info("初始化余额记录"); + userBalanceLogService.initUserBalanceLogToMongodb(); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/CostPerPopupVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/CostPerPopupVO.java new file mode 100644 index 0000000..b7c5eec --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/CostPerPopupVO.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.util.Date; +import java.util.List; + +/** + * 弹窗广告VO + * @author TRACK + */ +public class CostPerPopupVO extends BaseVO { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "弹窗广告id") + private Long popupId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "弹窗名称") + private String popupName; + + @Schema(description = "状态 1.未开始 2.投放中 3.已结束") + private Integer status; + + @Schema(description = "触发页面类型 1.平台首页 2.会员中心 3.支付成功 4.店铺首页 5.商品详情") + private Integer pageType; + + @Schema(description = "弹窗图片") + private String popupPic; + + @Schema(description = "跳转页面") + private String jumpUrl; + + @Schema(description = "推送用户类型 0.所有用户 1.免费会员 2.付费会员 3.店铺客户") + private Integer userType; + + @Schema(description = "推送开始时间") + private Date startTime; + + @Schema(description = "推送结束时间") + private Date endTime; + + @Schema(description = "推送频次 0.永久一次 1.每次进入 2.自定义频次") + private Integer pushFrequency; + + @Schema(description = "按x天推送") + private Integer dayFrequency; + + @Schema(description = "按周推送 eg. 1,2 代表周日,周一") + private String weekFrequency; + + @Schema(description = "关联列表") + private List popupRelateList; + + public Long getPopupId() { + return popupId; + } + + public void setPopupId(Long popupId) { + this.popupId = popupId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getPopupName() { + return popupName; + } + + public void setPopupName(String popupName) { + this.popupName = popupName; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPageType() { + return pageType; + } + + public void setPageType(Integer pageType) { + this.pageType = pageType; + } + + public String getPopupPic() { + return popupPic; + } + + public void setPopupPic(String popupPic) { + this.popupPic = popupPic; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getPushFrequency() { + return pushFrequency; + } + + public void setPushFrequency(Integer pushFrequency) { + this.pushFrequency = pushFrequency; + } + + public Integer getDayFrequency() { + return dayFrequency; + } + + public void setDayFrequency(Integer dayFrequency) { + this.dayFrequency = dayFrequency; + } + + public String getWeekFrequency() { + return weekFrequency; + } + + public void setWeekFrequency(String weekFrequency) { + this.weekFrequency = weekFrequency; + } + + public List getPopupRelateList() { + return popupRelateList; + } + + public void setPopupRelateList(List popupRelateList) { + this.popupRelateList = popupRelateList; + } + + @Override + public String toString() { + return "CostPerPopupVO{" + + "popupId=" + popupId + + ", shopId=" + shopId + + ", popupName='" + popupName + '\'' + + ", status=" + status + + ", pageType=" + pageType + + ", popupPic='" + popupPic + '\'' + + ", jumpUrl='" + jumpUrl + '\'' + + ", userType=" + userType + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", pushFrequency=" + pushFrequency + + ", dayFrequency=" + dayFrequency + + ", weekFrequency='" + weekFrequency + '\'' + + ", popupRelateList=" + popupRelateList + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/PopupRelateVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/PopupRelateVO.java new file mode 100644 index 0000000..2db9fcf --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/PopupRelateVO.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; + +/** + * 弹窗广告关联VO + * @author TRACK + */ +public class PopupRelateVO extends BaseVO { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "关联id") + private Long relateId; + + @Schema(description = "弹窗广告id") + private Long popupId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品介绍主图") + private String mainImgUrl; + + @Schema(description = "会员等级id") + private Long userLevelId; + + @Schema(description = "等级名称") + private String levelName; + + public Long getRelateId() { + return relateId; + } + + public void setRelateId(Long relateId) { + this.relateId = relateId; + } + + public Long getPopupId() { + return popupId; + } + + public void setPopupId(Long popupId) { + this.popupId = popupId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + @Override + public String toString() { + return "PopupRelateVO{" + + "relateId=" + relateId + + ", popupId=" + popupId + + ", spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", userLevelId=" + userLevelId + + ", levelName='" + levelName + '\'' + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ScoreCompleteConfigVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ScoreCompleteConfigVO.java new file mode 100644 index 0000000..2f8c19d --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ScoreCompleteConfigVO.java @@ -0,0 +1,143 @@ + + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 积分配置信息 + * @author lhd + */ +public class ScoreCompleteConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 签到获取积分 + */ + private String signInScoreString; + + /** + * 签到获取积分 + */ + private List signInScore; + + /** + * 注册获取积分 + */ + private Long registerScore; + + /** + * 购物开关 + */ + private Boolean shoppingScoreSwitch; + + /** + * 购物获取积分(x元获取1积分) + */ + private Long shoppingGetScore; + + /** + * 购物使用积分抵现比例(x积分抵扣1元) + */ + private Long shoppingUseScoreRatio; + + /** + * 购物积分分类获取比例上限 + */ + private Double getRatioLimit; + + /** + * 平台使用积分分类比例上限 + */ + private Double useRatioLimit; + + public Double getUseRatioLimit() { + return useRatioLimit; + } + + public void setUseRatioLimit(Double useRatioLimit) { + this.useRatioLimit = useRatioLimit; + } + + public Double getGetRatioLimit() { + return getRatioLimit; + } + + public void setGetRatioLimit(Double getRatioLimit) { + this.getRatioLimit = getRatioLimit; + } + + public String getSignInScoreString() { + return signInScoreString; + } + + public void setSignInScoreString(String signInScoreString) { + this.signInScoreString = signInScoreString; + } + + public List getSignInScore() { + return signInScore; + } + + public void setSignInScore(List signInScore) { + this.signInScore = signInScore; + } + + public Long getRegisterScore() { + return registerScore; + } + + public void setRegisterScore(Long registerScore) { + this.registerScore = registerScore; + } + + public Boolean getShoppingScoreSwitch() { + return shoppingScoreSwitch; + } + + public void setShoppingScoreSwitch(Boolean shoppingScoreSwitch) { + this.shoppingScoreSwitch = shoppingScoreSwitch; + } + + public Long getShoppingGetScore() { + return shoppingGetScore; + } + + public void setShoppingGetScore(Long shoppingGetScore) { + this.shoppingGetScore = shoppingGetScore; + } + + public Long getShoppingUseScoreRatio() { + return shoppingUseScoreRatio; + } + + public void setShoppingUseScoreRatio(Long shoppingUseScoreRatio) { + this.shoppingUseScoreRatio = shoppingUseScoreRatio; + } + + @Override + public String toString() { + return "ScoreConfigVO{" + + ", signInScoreString='" + signInScoreString + '\'' + + ", signInScore=" + signInScore + + ", registerScore=" + registerScore + + ", shoppingScoreSwitch=" + shoppingScoreSwitch + + ", shoppingGetScore=" + shoppingGetScore + + ", shoppingUseScoreRatio=" + shoppingUseScoreRatio + + ", useRatioLimit=" + useRatioLimit + + ", getRatioLimit=" + getRatioLimit + + '}'; + } +} + diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ScoreDataVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ScoreDataVO.java new file mode 100644 index 0000000..ac6aede --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ScoreDataVO.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author CDT + * @date 2021/4/15 + */ +public class ScoreDataVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 签到积分列表 + */ + @Schema(description = "签到积分列表") + private List scoreList; + /** + * 用户积分 + */ + @Schema(description = "用户积分") + private Long score; + + /** + * 当天签到可领积分 + */ + @Schema(description = "当天签到可领积分") + private Integer curScore; + + /** + * 上次结算过期的积分 + */ + @Schema(description = "上次结算过期的积分") + private Long expireScore; + /** + * 过期时间(年) + */ + @Schema(description = "过期时间(年)") + private Integer expireYear; + /** + * 积分过期开关 + */ + @Schema(description = "积分过期开关") + private Boolean scoreExpireSwitch; + /** + * 等级名称 + */ + @Schema(description = "等级名称") + private String levelName; + /** + * 等级类型 0 普通会员 1 付费会员 + */ + @Schema(description = "等级类型 0 普通会员 1 付费会员") + private Integer levelType; + /** + * 用户当前成长值 + */ + @Schema(description = "用户当前成长值") + private Integer growth; + /** + * 注册可获取积分 + */ + @Schema(description = "注册可获取积分") + private Long registerScore; + /** + * 购物可获取积分 + */ + @Schema(description = "购物可获取积分") + private Long shoppingGetScore; + + /** + * 是否已经签到 1是 0否 + */ + @Schema(description = "是否已经签到 1是 0否") + private Integer isSignIn; + + /** + * 是否已经注册 1是 0否 + */ + @Schema(description = "是否已经注册 1是 0否") + private Integer isRegister; + + /** + * 签到第几天 + */ + @Schema(description = "签到第几天") + private Integer signInCount; + + /** + * 购物使用积分开关是否开启 true:开启 false:关闭 + */ + @Schema(description = "购物使用积分开关是否开启 true:开启 false:关闭") + private Boolean shoppingScoreSwitch; + + public Boolean getScoreExpireSwitch() { + return scoreExpireSwitch; + } + + public void setScoreExpireSwitch(Boolean scoreExpireSwitch) { + this.scoreExpireSwitch = scoreExpireSwitch; + } + + public Boolean getShoppingScoreSwitch() { + return shoppingScoreSwitch; + } + + public void setShoppingScoreSwitch(Boolean shoppingScoreSwitch) { + this.shoppingScoreSwitch = shoppingScoreSwitch; + } + + public Integer getCurScore() { + return curScore; + } + + public void setCurScore(Integer curScore) { + this.curScore = curScore; + } + + public List getScoreList() { + return scoreList; + } + + public void setScoreList(List scoreList) { + this.scoreList = scoreList; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Long getExpireScore() { + return expireScore; + } + + public void setExpireScore(Long expireScore) { + this.expireScore = expireScore; + } + + public Integer getExpireYear() { + return expireYear; + } + + public void setExpireYear(Integer expireYear) { + this.expireYear = expireYear; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Integer getGrowth() { + return growth; + } + + public void setGrowth(Integer growth) { + this.growth = growth; + } + + public Long getRegisterScore() { + return registerScore; + } + + public void setRegisterScore(Long registerScore) { + this.registerScore = registerScore; + } + + public Long getShoppingGetScore() { + return shoppingGetScore; + } + + public void setShoppingGetScore(Long shoppingGetScore) { + this.shoppingGetScore = shoppingGetScore; + } + + public Integer getIsSignIn() { + return isSignIn; + } + + public void setIsSignIn(Integer isSignIn) { + this.isSignIn = isSignIn; + } + + public Integer getIsRegister() { + return isRegister; + } + + public void setIsRegister(Integer isRegister) { + this.isRegister = isRegister; + } + + public Integer getSignInCount() { + return signInCount; + } + + public void setSignInCount(Integer signInCount) { + this.signInCount = signInCount; + } + + @Override + public String toString() { + return "ScoreDataVO{" + + "scoreList=" + scoreList + + ", score=" + score + + ", curScore=" + curScore + + ", expireScore=" + expireScore + + ", expireYear=" + expireYear + + ", scoreExpireSwitch=" + scoreExpireSwitch + + ", levelName='" + levelName + '\'' + + ", levelType=" + levelType + + ", growth=" + growth + + ", registerScore=" + registerScore + + ", shoppingGetScore=" + shoppingGetScore + + ", isSignIn=" + isSignIn + + ", isRegister=" + isRegister + + ", signInCount=" + signInCount + + ", shoppingScoreSwitch=" + shoppingScoreSwitch + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ShopCustomerExcelVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ShopCustomerExcelVO.java new file mode 100644 index 0000000..4e44e2e --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ShopCustomerExcelVO.java @@ -0,0 +1,119 @@ +package com.tmerclub.cloud.user.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.tmerclub.cloud.common.model.ExcelModel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 客户信息导出 + * @author: zsm + * @date: 2023/1/16 11:44 + */ +public class ShopCustomerExcelVO extends ExcelModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "客户信息"; + public static final String SHEET_NAME = "sheet"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty(value = {"客户信息", "序号"}, index = 0) + private String seq; + + @ExcelProperty(value = {"客户信息", "客户昵称"}, index = 1) + private String nickName; + + @ExcelProperty(value = {"客户信息", "手机号码"}, index = 2) + private String phone; + @ExcelProperty({"客户信息", "消费金额"}) + private Double consAmount; + + @ExcelProperty({"客户信息", "消费次数"}) + private Integer consTimes; + + @ExcelProperty({"客户信息", "退款金额"}) + private Double afterSaleAmount; + + @ExcelProperty({"客户信息", "退款次数"}) + private Integer afterSaleTimes; + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Double getConsAmount() { + return consAmount; + } + + public void setConsAmount(Double consAmount) { + this.consAmount = consAmount; + } + + public Integer getConsTimes() { + return consTimes; + } + + public void setConsTimes(Integer consTimes) { + this.consTimes = consTimes; + } + + public Double getAfterSaleAmount() { + return afterSaleAmount; + } + + public void setAfterSaleAmount(Double afterSaleAmount) { + this.afterSaleAmount = afterSaleAmount; + } + + public Integer getAfterSaleTimes() { + return afterSaleTimes; + } + + public void setAfterSaleTimes(Integer afterSaleTimes) { + this.afterSaleTimes = afterSaleTimes; + } + + @Override + public String toString() { + return "ShopCustomerExcelVO{" + + "seq='" + seq + '\'' + + ", nickName='" + nickName + '\'' + + ", phone='" + phone + '\'' + + ", consAmount=" + consAmount + + ", consTimes=" + consTimes + + ", afterSaleAmount=" + afterSaleAmount + + ", afterSaleTimes=" + afterSaleTimes + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ShopCustomerVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ShopCustomerVO.java new file mode 100644 index 0000000..42f6eb6 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ShopCustomerVO.java @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author lanhai + */ +public class ShopCustomerVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺客户id") + private Long shopCustomerId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "会员名称") + private String memberName; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "会员类型(-1:客户,0:免费会员,1:付费会员)") + private Integer levelType; + + @Schema(description = "会员等级Id") + private Long levelId; + + @Schema(description = "会员等级") + private Integer level; + + @Schema(description = "成长值") + private Integer growth; + + @Schema(description = "会员注册时间") + private Date registTime; + + @Schema(description = "付费会员到期时间") + private Date vipEndTime; + + @Schema(description = "消费次数") + private Integer consTimes; + + @Schema(description = "退款次数") + private Integer afterSaleTimes; + + public Long getShopCustomerId() { + return shopCustomerId; + } + + public void setShopCustomerId(Long shopCustomerId) { + this.shopCustomerId = shopCustomerId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getConsTimes() { + return consTimes; + } + + public void setConsTimes(Integer consTimes) { + this.consTimes = consTimes; + } + + public Integer getAfterSaleTimes() { + return afterSaleTimes; + } + + public void setAfterSaleTimes(Integer afterSaleTimes) { + this.afterSaleTimes = afterSaleTimes; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Long getLevelId() { + return levelId; + } + + public void setLevelId(Long levelId) { + this.levelId = levelId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getGrowth() { + return growth; + } + + public void setGrowth(Integer growth) { + this.growth = growth; + } + + public Date getRegistTime() { + return registTime; + } + + public void setRegistTime(Date registTime) { + this.registTime = registTime; + } + + public Date getVipEndTime() { + return vipEndTime; + } + + public void setVipEndTime(Date vipEndTime) { + this.vipEndTime = vipEndTime; + } + + @Override + public String toString() { + return "ShopCustomerVO{" + + "shopCustomerId=" + shopCustomerId + + ", userId=" + userId + + ", memberName='" + memberName + '\'' + + ", shopId=" + shopId + + ", levelType=" + levelType + + ", levelId=" + levelId + + ", level=" + level + + ", growth=" + growth + + ", registTime=" + registTime + + ", vipEndTime=" + vipEndTime + + ", consTimes=" + consTimes + + ", afterSaleTimes=" + afterSaleTimes + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/SysConfigVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/SysConfigVO.java new file mode 100644 index 0000000..2cf1e73 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/SysConfigVO.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 系统配置信息表VO + * + * @author lth + * @date 2020-12-23 16:27:57 + */ +public class SysConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long id; + + @Schema(description = "key") + private String paramKey; + + @Schema(description = "value") + private String paramValue; + + @Schema(description = "备注") + private String remark; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getParamKey() { + return paramKey; + } + + public void setParamKey(String paramKey) { + this.paramKey = paramKey; + } + + public String getParamValue() { + return paramValue; + } + + public void setParamValue(String paramValue) { + this.paramValue = paramValue; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "SysConfigVO{" + + "id=" + id + + ",paramKey=" + paramKey + + ",paramValue=" + paramValue + + ",remark=" + remark + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserExtensionVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserExtensionVO.java new file mode 100644 index 0000000..fa29b3f --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserExtensionVO.java @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户扩展信息VO + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserExtensionVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long userExtensionId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "用户等级") + private Integer level; + + @Schema(description = "等级条件 0 普通会员 1 付费会员") + private Integer levelType; + + @Schema(description = "用户当前成长值") + private Integer growth; + + @Schema(description = "用户积分") + private Long score; + + @Schema(description = "用户总余额") + private Long balance; + + @Schema(description = "用户实际余额") + private Long actualBalance; + + @Schema(description = "用户通联累计余额") + private Long allinpayBalance; + + @Schema(description = "用户通联实际余额") + private Long allinpayActualBalance; + + @Schema(description = "通联会员创建(0:否 1:是)") + private Integer allinpayCreate; + + @Schema(description = "通联是否实名认证(0:否 1:是)") + private Integer allinpayRealNameSet; + + @Schema(description = "通联是否绑定手机号(0:否 1:是)") + private Integer allinpayPhoneBind; + + @Schema(description = "通联是否设置支付密码(0:否 1:是)") + private Integer allinpayPayPwdSet; + + @Schema(description = "通联是否签订提现协议(0:否 1:是)") + private Integer allinpayProtocolSign; + + @Schema(description = "通联是否绑定支付标识(0:否 1:是)") + private Integer allinpayPayAcctBind; + + @Schema(description = "乐观锁") + private Integer version; + + @Schema(description = "连续签到天数") + private Integer signDay; + + public Integer getSignDay() { + return signDay; + } + + public void setSignDay(Integer signDay) { + this.signDay = signDay; + } + + public Long getUserExtensionId() { + return userExtensionId; + } + + public void setUserExtensionId(Long userExtensionId) { + this.userExtensionId = userExtensionId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Integer getGrowth() { + return growth; + } + + public void setGrowth(Integer growth) { + this.growth = growth; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + + public Long getActualBalance() { + return actualBalance; + } + + public void setActualBalance(Long actualBalance) { + this.actualBalance = actualBalance; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public Integer getAllinpayCreate() { + return allinpayCreate; + } + + public void setAllinpayCreate(Integer allinpayCreate) { + this.allinpayCreate = allinpayCreate; + } + + public Long getAllinpayBalance() { + return allinpayBalance; + } + + public void setAllinpayBalance(Long allinpayBalance) { + this.allinpayBalance = allinpayBalance; + } + + public Long getAllinpayActualBalance() { + return allinpayActualBalance; + } + + public void setAllinpayActualBalance(Long allinpayActualBalance) { + this.allinpayActualBalance = allinpayActualBalance; + } + + public Integer getAllinpayRealNameSet() { + return allinpayRealNameSet; + } + + public void setAllinpayRealNameSet(Integer allinpayRealNameSet) { + this.allinpayRealNameSet = allinpayRealNameSet; + } + + public Integer getAllinpayPhoneBind() { + return allinpayPhoneBind; + } + + public void setAllinpayPhoneBind(Integer allinpayPhoneBind) { + this.allinpayPhoneBind = allinpayPhoneBind; + } + + public Integer getAllinpayPayPwdSet() { + return allinpayPayPwdSet; + } + + public void setAllinpayPayPwdSet(Integer allinpayPayPwdSet) { + this.allinpayPayPwdSet = allinpayPayPwdSet; + } + + public Integer getAllinpayProtocolSign() { + return allinpayProtocolSign; + } + + public void setAllinpayProtocolSign(Integer allinpayProtocolSign) { + this.allinpayProtocolSign = allinpayProtocolSign; + } + + public Integer getAllinpayPayAcctBind() { + return allinpayPayAcctBind; + } + + public void setAllinpayPayAcctBind(Integer allinpayPayAcctBind) { + this.allinpayPayAcctBind = allinpayPayAcctBind; + } + + @Override + public String toString() { + return "UserExtensionVO{" + + "userExtensionId=" + userExtensionId + + ", userId=" + userId + + ", level=" + level + + ", levelType=" + levelType + + ", growth=" + growth + + ", score=" + score + + ", balance=" + balance + + ", actualBalance=" + actualBalance + + ", allinpayBalance=" + allinpayBalance + + ", allinpayActualBalance=" + allinpayActualBalance + + ", allinpayRealNameSet=" + allinpayRealNameSet + + ", allinpayPhoneBind=" + allinpayPhoneBind + + ", allinpayPayPwdSet=" + allinpayPayPwdSet + + ", allinpayProtocolSign=" + allinpayProtocolSign + + ", allinpayPayAcctBind=" + allinpayPayAcctBind + + ", version=" + version + + ", signDay=" + signDay + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelLogVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelLogVO.java new file mode 100644 index 0000000..711f541 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelLogVO.java @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户等级记录VO + * + * @author FrozenWatermelon + * @date 2021-05-14 11:04:52 + */ +public class UserLevelLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "等级记录表") + private Long levelLogId; + + @Schema(description = "用户id") + private String userId; + + @Schema(description = "用户头像") + private String nickName; + + @Schema(description = "用户头像") + private String pic; + + @Schema(description = "变更类型 -1降级 0不变 1升级") + private Integer levelIoType; + + @Schema(description = "等级变更原因1.成长值不足 2.成长值足够 3.购买会员 4.续费会员 5.会员到期") + private Integer levelChangeReason; + + @Schema(description = "变更之前等级") + private Integer beforeLevel; + + @Schema(description = "变更之前的等级类型 0:普通会员 1:付费会员") + private Integer beforeLevelType; + + @Schema(description = "变更之后的等级") + private Integer afterLevel; + + @Schema(description = "变更之后的等级类型 0:普通会员 1:付费会员") + private Integer afterLevelType; + + @Schema(description = "付费会员等级名称") + private String levelName; + + @Schema(description = "期数类型(0:月,1:季,2:年)") + private Integer termType; + + @Schema(description = "支付单号") + private Long payId; + + @Schema(description = "支付类型") + private Integer isPayed; + + @Schema(description = "是否支付1已支付0未支付") + private Integer payType; + + + @Schema(description = "支付金额") + private Long payAmount; + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public Integer getTermType() { + return termType; + } + + public void setTermType(Integer termType) { + this.termType = termType; + } + + public Long getLevelLogId() { + return levelLogId; + } + + public void setLevelLogId(Long levelLogId) { + this.levelLogId = levelLogId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Integer getLevelIoType() { + return levelIoType; + } + + public void setLevelIoType(Integer levelIoType) { + this.levelIoType = levelIoType; + } + + public Integer getLevelChangeReason() { + return levelChangeReason; + } + + public void setLevelChangeReason(Integer levelChangeReason) { + this.levelChangeReason = levelChangeReason; + } + + public Integer getBeforeLevel() { + return beforeLevel; + } + + public void setBeforeLevel(Integer beforeLevel) { + this.beforeLevel = beforeLevel; + } + + public Integer getBeforeLevelType() { + return beforeLevelType; + } + + public void setBeforeLevelType(Integer beforeLevelType) { + this.beforeLevelType = beforeLevelType; + } + + public Integer getAfterLevel() { + return afterLevel; + } + + public void setAfterLevel(Integer afterLevel) { + this.afterLevel = afterLevel; + } + + public Integer getAfterLevelType() { + return afterLevelType; + } + + public void setAfterLevelType(Integer afterLevelType) { + this.afterLevelType = afterLevelType; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + @Override + public String toString() { + return "UserLevelLogVO{" + + "levelLogId=" + levelLogId + + ", userId='" + userId + '\'' + + ", nickName='" + nickName + '\'' + + ", pic='" + pic + '\'' + + ", levelIoType=" + levelIoType + + ", levelChangeReason=" + levelChangeReason + + ", beforeLevel=" + beforeLevel + + ", beforeLevelType=" + beforeLevelType + + ", afterLevel=" + afterLevel + + ", afterLevelType=" + afterLevelType + + ", levelName='" + levelName + '\'' + + ", termType=" + termType + + ", payId=" + payId + + ", isPayed=" + isPayed + + ", payType=" + payType + + ", payAmount=" + payAmount + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelTermVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelTermVO.java new file mode 100644 index 0000000..9945f68 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelTermVO.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * VO + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserLevelTermVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键") + private Long levelTermId; + + @Schema(description = "等级id") + private Long userLevelId; + + @Schema(description = "期数类型(0:月,1:季,2:年)") + private Integer termType; + + @Schema(description = "价格") + private Long needAmount; + + @Schema(description = "状态(0: 禁用1: 启用)") + private Integer status; + + @Schema(description = "原价(按月份算),分") + private Integer originalPrice; + + @Schema(description = "折扣") + private Double discount; + + public Long getLevelTermId() { + return levelTermId; + } + + public void setLevelTermId(Long levelTermId) { + this.levelTermId = levelTermId; + } + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + public Integer getTermType() { + return termType; + } + + public void setTermType(Integer termType) { + this.termType = termType; + } + + public Long getNeedAmount() { + return needAmount; + } + + public void setNeedAmount(Long needAmount) { + this.needAmount = needAmount; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getOriginalPrice() { + return originalPrice; + } + + public void setOriginalPrice(Integer originalPrice) { + this.originalPrice = originalPrice; + } + + public Double getDiscount() { + return discount; + } + + public void setDiscount(Double discount) { + this.discount = discount; + } + + @Override + public String toString() { + return "UserLevelTermVO{" + + "levelTermId=" + levelTermId + + ",createTime=" + createTime + + ",userLevelId=" + userLevelId + + ",termType=" + termType + + ",needAmount=" + needAmount + + ",status=" + status + + ",originalPrice=" + originalPrice + + ",discount=" + discount + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelVO.java new file mode 100644 index 0000000..9ab0d36 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelVO.java @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 会员等级表VO + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserLevelVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键") + private Long userLevelId; + + @Schema(description = "等级") + private Integer level; + + @Schema(description = "等级名称") + private String levelName; + + @Schema(description = "vip等级") + private Integer vipLevel; + + @Schema(description = "等级类型 0:普通会员 1:付费会员") + private Integer levelType; + + @Schema(description = "所需成长值") + private Integer needGrowth; + + @Schema(description = "下一等级名称") + private String nextLevelName; + + @Schema(description = "下一等级所需成长值") + private Integer nextGrowth; + + @Schema(description = "1:已更新 0:等待更新(等级修改后,用户等级的更新)") + private Integer updateStatus; + + @Schema(description = "付费会员,是否可以招募会员;1可以招募,0停止招募") + private Integer recruitStatus; + + @Schema(description = "用户权益Ids") + private List userRightsIds; + + @Schema(description = "用户权益列表") + private List userRightsList; + + @Schema(description = "优惠券id列表") + private List couponIds; + + @Schema(description = "优惠券张数") + private Integer couponsNum; + + @Schema(description = "等级期数id列表") + private List levelTermIds; + + @Schema(description = "等级期数列表") + private List userLevelTerms; + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Integer getNeedGrowth() { + return needGrowth; + } + + public void setNeedGrowth(Integer needGrowth) { + this.needGrowth = needGrowth; + } + + public Integer getUpdateStatus() { + return updateStatus; + } + + public void setUpdateStatus(Integer updateStatus) { + this.updateStatus = updateStatus; + } + + public List getUserRightsIds() { + return userRightsIds; + } + + public void setUserRightsIds(List userRightsIds) { + this.userRightsIds = userRightsIds; + } + + public List getUserRightsList() { + return userRightsList; + } + + public void setUserRightsList(List userRightsList) { + this.userRightsList = userRightsList; + } + + public Integer getCouponsNum() { + return couponsNum; + } + + public void setCouponsNum(Integer couponsNum) { + this.couponsNum = couponsNum; + } + + public String getNextLevelName() { + return nextLevelName; + } + + public void setNextLevelName(String nextLevelName) { + this.nextLevelName = nextLevelName; + } + + public Integer getNextGrowth() { + return nextGrowth; + } + + public void setNextGrowth(Integer nextGrowth) { + this.nextGrowth = nextGrowth; + } + + public List getCouponIds() { + return couponIds; + } + + public void setCouponIds(List couponIds) { + this.couponIds = couponIds; + } + + public List getUserLevelTerms() { + return userLevelTerms; + } + + public void setUserLevelTerms(List userLevelTerms) { + this.userLevelTerms = userLevelTerms; + } + + public List getUserLevelTermIds() { + return levelTermIds; + } + + public void setUserLevelTermIds(List levelTermIds) { + this.levelTermIds = levelTermIds; + } + + public Integer getRecruitStatus() { + return recruitStatus; + } + + public void setRecruitStatus(Integer recruitStatus) { + this.recruitStatus = recruitStatus; + } + + public Integer getVipLevel() { + return vipLevel; + } + + public void setVipLevel(Integer vipLevel) { + this.vipLevel = vipLevel; + } + + @Override + public String toString() { + return "UserLevelVO{" + + "userLevelId=" + userLevelId + + ", level=" + level + + ", levelName='" + levelName + '\'' + + ", vipLevel=" + vipLevel + + ", levelType=" + levelType + + ", needGrowth=" + needGrowth + + ", nextLevelName='" + nextLevelName + '\'' + + ", nextGrowth=" + nextGrowth + + ", updateStatus=" + updateStatus + + ", recruitStatus=" + recruitStatus + + ", userRightsIds=" + userRightsIds + + ", userRightsList=" + userRightsList + + ", couponIds=" + couponIds + + ", couponsNum=" + couponsNum + + ", levelTermIds=" + levelTermIds + + ", userLevelTerms=" + userLevelTerms + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserMemberInfoVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserMemberInfoVO.java new file mode 100644 index 0000000..7f5f4e3 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserMemberInfoVO.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 用户会员中心信息VO + * + * @author LTH + */ +public class UserMemberInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "头像图片路径") + private String pic; + + @Schema(description = "用户积分") + private Long score; + + @Schema(description = "过期时间") + private Date expireTime; + + @Schema(description = "用户普通会员等级信息") + private UserLevelVO userOrdinaryLevel; + + @Schema(description = "用户付费会员等级信息") + private UserLevelVO userPayedLevel; + + @Schema(description = "用户当前成长值") + private Integer growth; + + @Schema(description = "购物可获取成长值") + private Double shopScore; + + @Schema(description = "签到第几天") + private Integer signInCount; + + @Schema(description = "会员等级说明列表") + private List userLevelList; + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Date getExpireTime() { + return expireTime; + } + + public void setExpireTime(Date expireTime) { + this.expireTime = expireTime; + } + + public Integer getGrowth() { + return growth; + } + + public void setGrowth(Integer growth) { + this.growth = growth; + } + + public Double getShopScore() { + return shopScore; + } + + public void setShopScore(Double shopScore) { + this.shopScore = shopScore; + } + + public Integer getSignInCount() { + return signInCount; + } + + public void setSignInCount(Integer signInCount) { + this.signInCount = signInCount; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public List getUserLevelList() { + return userLevelList; + } + + public void setUserLevelList(List userLevelList) { + this.userLevelList = userLevelList; + } + + public UserLevelVO getUserOrdinaryLevel() { + return userOrdinaryLevel; + } + + public void setUserOrdinaryLevel(UserLevelVO userOrdinaryLevel) { + this.userOrdinaryLevel = userOrdinaryLevel; + } + + public UserLevelVO getUserPayedLevel() { + return userPayedLevel; + } + + public void setUserPayedLevel(UserLevelVO userPayedLevel) { + this.userPayedLevel = userPayedLevel; + } + + @Override + public String toString() { + return "UserMemberInfoVO{" + + "nickName='" + nickName + '\'' + + ", pic='" + pic + '\'' + + ", score=" + score + + ", expireTime=" + expireTime + + ", userOrdinaryLevel=" + userOrdinaryLevel + + ", userPayedLevel=" + userPayedLevel + + ", growth=" + growth + + ", shopScore=" + shopScore + + ", signInCount=" + signInCount + + ", userLevelList=" + userLevelList + + '}'; + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRightsCouponVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRightsCouponVO.java new file mode 100644 index 0000000..c905438 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRightsCouponVO.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * VO + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserRightsCouponVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "权益优惠券关联id") + private Long rightsCouponId; + + @Schema(description = "权益id") + private Long rightsId; + + @Schema(description = "优惠券id") + private Long couponId; + + public Long getRightsCouponId() { + return rightsCouponId; + } + + public void setRightsCouponId(Long rightsCouponId) { + this.rightsCouponId = rightsCouponId; + } + + public Long getRightsId() { + return rightsId; + } + + public void setRightsId(Long rightsId) { + this.rightsId = rightsId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + @Override + public String toString() { + return "UserRightsCouponVO{" + + "rightsCouponId=" + rightsCouponId + + ",createTime=" + createTime + + ",rightsId=" + rightsId + + ",couponId=" + couponId + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRightsVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRightsVO.java new file mode 100644 index 0000000..e7aa895 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRightsVO.java @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.api.coupon.vo.CouponDataVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 用户权益信息VO + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserRightsVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "权益id") + private Long rightsId; + + @Schema(description = "权益名称") + private String rightsName; + + @Schema(description = "权益图标") + private String icon; + + @Schema(description = "权益简介") + private String description; + + @Schema(description = "权益详情") + private String details; + + @Schema(description = "状态:-1: 删除 0:禁用 1:正常(仅用于系统核销)") + private Integer status; + + @Schema(description = "排序 从小到大") + private Integer seq; + + @Schema(description = "权益类型[0.自定义 1.积分回馈倍率 2.优惠券 3.积分赠送(数量) 4.会员折扣 5.包邮类型]") + private Integer rightsType; + + @Schema(description = "积分回馈倍率") + private Integer rateScore; + + @Schema(description = "赠送积分") + private Long presScore; + + @Schema(description = "会员折扣") + private Integer discount; + + @Schema(description = "折扣范围[0.全平台 1.自营店]") + private Integer discountRange; + + @Schema(description = "包邮类型[1.全平台包邮 2.自营店包邮]") + private Integer freeFeeType; + + @Schema(description = "优惠券id列表") + private List couponIds; + + @Schema(description = "优惠券列表") + private List couponList; + + @Schema(description = "用户等级") + private Integer level; + + @Schema(description = "等级名称") + private String levelName; + + public Long getRightsId() { + return rightsId; + } + + public void setRightsId(Long rightsId) { + this.rightsId = rightsId; + } + + public String getRightsName() { + return rightsName; + } + + public void setRightsName(String rightsName) { + this.rightsName = rightsName; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDetails() { + return details; + } + + public void setDetails(String details) { + this.details = details; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getRightsType() { + return rightsType; + } + + public void setRightsType(Integer rightsType) { + this.rightsType = rightsType; + } + + public Integer getRateScore() { + return rateScore; + } + + public void setRateScore(Integer rateScore) { + this.rateScore = rateScore; + } + + public Long getPresScore() { + return presScore; + } + + public void setPresScore(Long presScore) { + this.presScore = presScore; + } + + public Integer getDiscount() { + return discount; + } + + public void setDiscount(Integer discount) { + this.discount = discount; + } + + public Integer getDiscountRange() { + return discountRange; + } + + public void setDiscountRange(Integer discountRange) { + this.discountRange = discountRange; + } + + public Integer getFreeFeeType() { + return freeFeeType; + } + + public void setFreeFeeType(Integer freeFeeType) { + this.freeFeeType = freeFeeType; + } + + public List getCouponIds() { + return couponIds; + } + + public void setCouponIds(List couponIds) { + this.couponIds = couponIds; + } + + public List getCouponList() { + return couponList; + } + + public void setCouponList(List couponList) { + this.couponList = couponList; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + @Override + public String toString() { + return "UserRightsVO{" + + "rightsId=" + rightsId + + ", rightsName='" + rightsName + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", icon='" + icon + + ", description='" + description + + ", details=" + details + + ", status=" + status + + ", seq=" + seq + + ", rightsType=" + rightsType + + ", rateScore=" + rateScore + + ", presScore=" + presScore + + ", discount=" + discount + + ", discountRange=" + discountRange + + ", freeFeeType=" + freeFeeType + + ", couponIds=" + couponIds + + ", couponList=" + couponList + + ", level=" + level + + ", levelName" + levelName + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserScoreLogVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserScoreLogVO.java new file mode 100644 index 0000000..6f8509e --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserScoreLogVO.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户积分记录VO + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserScoreLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "日志id") + private Long logId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "积分类型 0.注册送积分1.购物 2.会员等级提升加积分 3.签到加积分 4.购物抵扣使用积分 5.积分过期 6.余额充值 7.系统更改积分 8.购物抵扣使用积分退还") + private Integer source; + + @Schema(description = "变动积分数额") + private Long score; + + @Schema(description = "业务id") + private Long bizId; + + @Schema(description = "出入类型 0=支出 1=收入") + private Integer ioType; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品主图") + private String mainImgUrl; + + @Schema(description = "积分订单总价") + private Long actualTotal; + + @Schema(description = "积分商品单价") + private Long scoreFee; + + @Schema(description = "积分商品数量") + private Integer allCount; + + @Schema(description = "积分商品单价积分") + private Long singleScoreFee; + + @Schema(description = "积分是否锁定 1是 0否") + private Integer isLock; + + public Long getLogId() { + return logId; + } + + public void setLogId(Long logId) { + this.logId = logId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Long getSingleScoreFee() { + return singleScoreFee; + } + + public void setSingleScoreFee(Long singleScoreFee) { + this.singleScoreFee = singleScoreFee; + } + + public Integer getIsLock() { + return isLock; + } + + public void setIsLock(Integer isLock) { + this.isLock = isLock; + } + + @Override + public String toString() { + return "UserScoreLogVO{" + + "logId=" + logId + + ", userId=" + userId + + ", source=" + source + + ", score=" + score + + ", bizId=" + bizId + + ", ioType=" + ioType + + ", spuName='" + spuName + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", actualTotal=" + actualTotal + + ", scoreFee=" + scoreFee + + ", allCount=" + allCount + + ", singleScoreFee=" + singleScoreFee + + ", isLock=" + isLock + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserSimpleInfoVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserSimpleInfoVO.java new file mode 100644 index 0000000..a261b6d --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserSimpleInfoVO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2021/2/25 + */ +public class UserSimpleInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED) + private String nickName; + + @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED) + private String pic; + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + @Override + public String toString() { + return "UserCenterInfoVO{" + + "nickName='" + nickName + '\'' + + ", pic='" + pic + '\'' + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserTagUserVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserTagUserVO.java new file mode 100644 index 0000000..47ab873 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserTagUserVO.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户和标签关联表VO + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserTagUserVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "自增id") + private Long userTagUserId; + + @Schema(description = "标签id") + private Long userTagId; + + @Schema(description = "用户id") + private Long userId; + + public Long getUserTagUserId() { + return userTagUserId; + } + + public void setUserTagUserId(Long userTagUserId) { + this.userTagUserId = userTagUserId; + } + + public Long getUserTagId() { + return userTagId; + } + + public void setUserTagId(Long userTagId) { + this.userTagId = userTagId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "UserTagUserVO{" + + "userTagUserId=" + userTagUserId + + ",createTime=" + createTime + + ",userTagId=" + userTagId + + ",userId=" + userId + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserTagVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserTagVO.java new file mode 100644 index 0000000..caf20f8 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserTagVO.java @@ -0,0 +1,371 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 客户标签VO + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserTagVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "自增id") + private Long userTagId; + + @Schema(description = "标签名字") + private String tagName; + + @Schema(description = "标签类型0手动1条件2系统") + private Integer tagType; + + @Schema(description = "系统标签是否开启") + private Integer isSysTurnOn; + + @Schema(description = "成为客户开始时间") + private Date registerMinTime; + + @Schema(description = "成为客户结束时间") + private Date registerMaxTime; + + @Schema(description = "关注开始时间") + private Date subscribeMinTime; + + @Schema(description = "关注结束时间") + private Date subscribeMaxTime; + + @Schema(description = "成为会员开始时间") + private Date toBeMemberMinTime; + + @Schema(description = "成为会员结束时间") + private Date toBeMemberMaxTime; + + @Schema(description = "最近消费时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天)") + private Integer recentPurchaseTime; + + @Schema(description = "消费次数时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天)") + private Integer purchaseNumTime; + + @Schema(description = "消费次数最小次数") + private Long purchaseNumMinNum; + + @Schema(description = "消费次数最大次数") + private Long purchaseNumMaxNum; + + @Schema(description = "消费金额时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天)") + private Integer purchaseAmountTime; + + @Schema(description = "消费金额最小金额") + private Long purchaseAmountMinAmount; + + @Schema(description = "消费金额最大金额") + private Long purchaseAmountMaxAmount; + + @Schema(description = "订单均价时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天)") + private Integer orderAveragePriceTime; + + @Schema(description = "订单均价最小金额") + private Long orderAveragePriceMinAmount; + + @Schema(description = "订单均价最大金额") + private Long orderAveragePriceMaxAmount; + + @Schema(description = "充值金额时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天)") + private Integer rechargeAmountTime; + + @Schema(description = "充值金额最小金额") + private Long rechargeAmountMinAmount; + + @Schema(description = "充值金额最大金额") + private Long rechargeAmountMaxAmount; + + @Schema(description = "充值次数时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天)") + private Integer rechargeNumTime; + + @Schema(description = "充值次数最小次数") + private Long rechargeNumMinNum; + + @Schema(description = "充值次数最大次数") + private Long rechargeNumMaxNum; + + @Schema(description = "符合标签的人数") + private Long userNum; + + @Schema(description = "统计更新时间") + private Date statisticUpdateTime; + + public Long getUserTagId() { + return userTagId; + } + + public void setUserTagId(Long userTagId) { + this.userTagId = userTagId; + } + + public String getTagName() { + return tagName; + } + + public void setTagName(String tagName) { + this.tagName = tagName; + } + + public Integer getTagType() { + return tagType; + } + + public void setTagType(Integer tagType) { + this.tagType = tagType; + } + + public Integer getIsSysTurnOn() { + return isSysTurnOn; + } + + public void setIsSysTurnOn(Integer isSysTurnOn) { + this.isSysTurnOn = isSysTurnOn; + } + + public Date getRegisterMinTime() { + return registerMinTime; + } + + public void setRegisterMinTime(Date registerMinTime) { + this.registerMinTime = registerMinTime; + } + + public Date getRegisterMaxTime() { + return registerMaxTime; + } + + public void setRegisterMaxTime(Date registerMaxTime) { + this.registerMaxTime = registerMaxTime; + } + + public Date getSubscribeMinTime() { + return subscribeMinTime; + } + + public void setSubscribeMinTime(Date subscribeMinTime) { + this.subscribeMinTime = subscribeMinTime; + } + + public Date getSubscribeMaxTime() { + return subscribeMaxTime; + } + + public void setSubscribeMaxTime(Date subscribeMaxTime) { + this.subscribeMaxTime = subscribeMaxTime; + } + + public Date getToBeMemberMinTime() { + return toBeMemberMinTime; + } + + public void setToBeMemberMinTime(Date toBeMemberMinTime) { + this.toBeMemberMinTime = toBeMemberMinTime; + } + + public Date getToBeMemberMaxTime() { + return toBeMemberMaxTime; + } + + public void setToBeMemberMaxTime(Date toBeMemberMaxTime) { + this.toBeMemberMaxTime = toBeMemberMaxTime; + } + + public Integer getRecentPurchaseTime() { + return recentPurchaseTime; + } + + public void setRecentPurchaseTime(Integer recentPurchaseTime) { + this.recentPurchaseTime = recentPurchaseTime; + } + + public Integer getPurchaseNumTime() { + return purchaseNumTime; + } + + public void setPurchaseNumTime(Integer purchaseNumTime) { + this.purchaseNumTime = purchaseNumTime; + } + + public Long getPurchaseNumMinNum() { + return purchaseNumMinNum; + } + + public void setPurchaseNumMinNum(Long purchaseNumMinNum) { + this.purchaseNumMinNum = purchaseNumMinNum; + } + + public Long getPurchaseNumMaxNum() { + return purchaseNumMaxNum; + } + + public void setPurchaseNumMaxNum(Long purchaseNumMaxNum) { + this.purchaseNumMaxNum = purchaseNumMaxNum; + } + + public Integer getPurchaseAmountTime() { + return purchaseAmountTime; + } + + public void setPurchaseAmountTime(Integer purchaseAmountTime) { + this.purchaseAmountTime = purchaseAmountTime; + } + + public Long getPurchaseAmountMinAmount() { + return purchaseAmountMinAmount; + } + + public void setPurchaseAmountMinAmount(Long purchaseAmountMinAmount) { + this.purchaseAmountMinAmount = purchaseAmountMinAmount; + } + + public Long getPurchaseAmountMaxAmount() { + return purchaseAmountMaxAmount; + } + + public void setPurchaseAmountMaxAmount(Long purchaseAmountMaxAmount) { + this.purchaseAmountMaxAmount = purchaseAmountMaxAmount; + } + + public Integer getOrderAveragePriceTime() { + return orderAveragePriceTime; + } + + public void setOrderAveragePriceTime(Integer orderAveragePriceTime) { + this.orderAveragePriceTime = orderAveragePriceTime; + } + + public Long getOrderAveragePriceMinAmount() { + return orderAveragePriceMinAmount; + } + + public void setOrderAveragePriceMinAmount(Long orderAveragePriceMinAmount) { + this.orderAveragePriceMinAmount = orderAveragePriceMinAmount; + } + + public Long getOrderAveragePriceMaxAmount() { + return orderAveragePriceMaxAmount; + } + + public void setOrderAveragePriceMaxAmount(Long orderAveragePriceMaxAmount) { + this.orderAveragePriceMaxAmount = orderAveragePriceMaxAmount; + } + + public Integer getRechargeAmountTime() { + return rechargeAmountTime; + } + + public void setRechargeAmountTime(Integer rechargeAmountTime) { + this.rechargeAmountTime = rechargeAmountTime; + } + + public Long getRechargeAmountMinAmount() { + return rechargeAmountMinAmount; + } + + public void setRechargeAmountMinAmount(Long rechargeAmountMinAmount) { + this.rechargeAmountMinAmount = rechargeAmountMinAmount; + } + + public Long getRechargeAmountMaxAmount() { + return rechargeAmountMaxAmount; + } + + public void setRechargeAmountMaxAmount(Long rechargeAmountMaxAmount) { + this.rechargeAmountMaxAmount = rechargeAmountMaxAmount; + } + + public Integer getRechargeNumTime() { + return rechargeNumTime; + } + + public void setRechargeNumTime(Integer rechargeNumTime) { + this.rechargeNumTime = rechargeNumTime; + } + + public Long getRechargeNumMinNum() { + return rechargeNumMinNum; + } + + public void setRechargeNumMinNum(Long rechargeNumMinNum) { + this.rechargeNumMinNum = rechargeNumMinNum; + } + + public Long getRechargeNumMaxNum() { + return rechargeNumMaxNum; + } + + public void setRechargeNumMaxNum(Long rechargeNumMaxNum) { + this.rechargeNumMaxNum = rechargeNumMaxNum; + } + + public Long getUserNum() { + return userNum; + } + + public void setUserNum(Long userNum) { + this.userNum = userNum; + } + + public Date getStatisticUpdateTime() { + return statisticUpdateTime; + } + + public void setStatisticUpdateTime(Date statisticUpdateTime) { + this.statisticUpdateTime = statisticUpdateTime; + } + + @Override + public String toString() { + return "UserTagVO{" + + "userTagId=" + userTagId + + ", tagName='" + tagName + '\'' + + ", tagType=" + tagType + + ", isSysTurnOn=" + isSysTurnOn + + ", registerMinTime=" + registerMinTime + + ", registerMaxTime=" + registerMaxTime + + ", subscribeMinTime=" + subscribeMinTime + + ", subscribeMaxTime=" + subscribeMaxTime + + ", toBeMemberMinTime=" + toBeMemberMinTime + + ", toBeMemberMaxTime=" + toBeMemberMaxTime + + ", recentPurchaseTime=" + recentPurchaseTime + + ", purchaseNumTime=" + purchaseNumTime + + ", purchaseNumMinNum=" + purchaseNumMinNum + + ", purchaseNumMaxNum=" + purchaseNumMaxNum + + ", purchaseAmountTime=" + purchaseAmountTime + + ", purchaseAmountMinAmount=" + purchaseAmountMinAmount + + ", purchaseAmountMaxAmount=" + purchaseAmountMaxAmount + + ", orderAveragePriceTime=" + orderAveragePriceTime + + ", orderAveragePriceMinAmount=" + orderAveragePriceMinAmount + + ", orderAveragePriceMaxAmount=" + orderAveragePriceMaxAmount + + ", rechargeAmountTime=" + rechargeAmountTime + + ", rechargeAmountMinAmount=" + rechargeAmountMinAmount + + ", rechargeAmountMaxAmount=" + rechargeAmountMaxAmount + + ", rechargeNumTime=" + rechargeNumTime + + ", rechargeNumMinNum=" + rechargeNumMinNum + + ", rechargeNumMaxNum=" + rechargeNumMaxNum + + ", userNum=" + userNum + + ", statisticUpdateTime=" + statisticUpdateTime + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserWithdrawCashVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserWithdrawCashVO.java new file mode 100644 index 0000000..87f5b40 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserWithdrawCashVO.java @@ -0,0 +1,93 @@ +package com.tmerclub.cloud.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author gaozijie + * @date 2023-05-09 + */ +public class UserWithdrawCashVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "提现记录id") + private Long cashId; + + @Schema(description = "提现订单号") + private String orderNo; + + @Schema(description = "提现金额") + private Long amount; + + @Schema(description = "提现状态(0:待支付, 1:申请成功, 2:提现成功, 3:提现失败)") + private Integer status; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + public Long getCashId() { + return cashId; + } + + public void setCashId(Long cashId) { + this.cashId = cashId; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "UserWithdrawCashVO{" + + "cashId=" + cashId + + ", orderNo='" + orderNo + '\'' + + ", amount=" + amount + + ", status=" + status + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoBalanceUserPayInfoVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoBalanceUserPayInfoVO.java new file mode 100644 index 0000000..860e3a9 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoBalanceUserPayInfoVO.java @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author TRACK + */ +@Document("user_balance_log") +public class MongoBalanceUserPayInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "支付时间") + private Date payTime; + + @Schema(description = "支付入口[0订单 1充值 2开通会员]") + private Integer payEntry; + + @Schema(description = "关联订单号") + private String orderIds; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "支付单号") + private Long payId; + + @Schema(description = "支付积分") + private Long scoreCount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "合计") + private Long payAmount; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Integer getPayEntry() { + return payEntry; + } + + public void setPayEntry(Integer payEntry) { + this.payEntry = payEntry; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + @Override + public String toString() { + return "MongoBalanceUserPayInfoVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", payTime=" + payTime + + ", payEntry=" + payEntry + + ", orderIds='" + orderIds + '\'' + + ", payType=" + payType + + ", payId=" + payId + + ", scoreCount=" + scoreCount + + ", alipayAmount=" + alipayAmount + + ", wechatAmount=" + wechatAmount + + ", balanceAmount=" + balanceAmount + + ", payAmount=" + payAmount + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoScoreUserManagerVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoScoreUserManagerVO.java new file mode 100644 index 0000000..25ac53e --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoScoreUserManagerVO.java @@ -0,0 +1,45 @@ +package com.tmerclub.cloud.user.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +/** + * @author TRACK + */ +@Document("user_score_log") +public class MongoScoreUserManagerVO { + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "累积积分") + private Long sumScore; + + public MongoScoreUserManagerVO() { + this.sumScore = 0L; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getSumScore() { + return sumScore; + } + + public void setSumScore(Long sumScore) { + this.sumScore = sumScore; + } + + @Override + public String toString() { + return "MongoScoreUserManagerVO{" + + "userId=" + userId + + ", sumScore=" + sumScore + + '}'; + } +} diff --git a/tmerclub-user/src/main/resources/logback.xml b/tmerclub-user/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-user/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-user/src/main/resources/mapper/CostPerPopupMapper.xml b/tmerclub-user/src/main/resources/mapper/CostPerPopupMapper.xml new file mode 100644 index 0000000..9c48f5a --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/CostPerPopupMapper.xml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `popup_id`,`shop_id`,`popup_name`,`status`,`page_type`,`popup_pic`,`jump_url`,`user_type`,`start_time`,`end_time`,`push_frequency`,`day_frequency`,`week_frequency`,`create_time`,`update_time` + + + + + + + insert into cost_per_popup (`shop_id`,`popup_name`,`status`,`page_type`,`popup_pic`,`jump_url`,`user_type`,`start_time`,`end_time`,`push_frequency`,`day_frequency`,`week_frequency`) + values (#{costPerPopup.shopId},#{costPerPopup.popupName},#{costPerPopup.status},#{costPerPopup.pageType},#{costPerPopup.popupPic},#{costPerPopup.jumpUrl},#{costPerPopup.userType},#{costPerPopup.startTime},#{costPerPopup.endTime},#{costPerPopup.pushFrequency},#{costPerPopup.dayFrequency},#{costPerPopup.weekFrequency}); + + + update cost_per_popup + + + `shop_id` = #{costPerPopup.shopId}, + + + `popup_name` = #{costPerPopup.popupName}, + + + `status` = #{costPerPopup.status}, + + + `page_type` = #{costPerPopup.pageType}, + + + `popup_pic` = #{costPerPopup.popupPic}, + + + `jump_url` = #{costPerPopup.jumpUrl}, + + + `user_type` = #{costPerPopup.userType}, + + + `start_time` = #{costPerPopup.startTime}, + + + `end_time` = #{costPerPopup.endTime}, + + + `push_frequency` = #{costPerPopup.pushFrequency}, + + `day_frequency` = #{costPerPopup.dayFrequency}, + `week_frequency` = #{costPerPopup.weekFrequency} + + where popup_id = #{costPerPopup.popupId} + + + delete from cost_per_popup where popup_id = #{popupId} + + + update cost_per_popup set `status` = 3 where popup_id = #{popupId} + + + + + update `cost_per_popup` set `status` = #{status} + WHERE `status` != 3 + + and `status` = 1 and `start_time` <= NOW() + + + and `status` = 2 and `end_time` <= NOW() + + + + + + + update cost_per_popup set `status` = 3 + where popup_id IN + + #{popupId} + + + diff --git a/tmerclub-user/src/main/resources/mapper/PopupRelateMapper.xml b/tmerclub-user/src/main/resources/mapper/PopupRelateMapper.xml new file mode 100644 index 0000000..0fb5e78 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/PopupRelateMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + `relate_id`,`popup_id`,`spu_id`,`user_level_id`,`create_time`,`update_time` + + + + insert into popup_relate (`popup_id`,`spu_id`,`user_level_id`) + values + + (#{popupRelate.popupId},#{popupRelate.spuId},#{popupRelate.userLevelId}) + + + + delete from popup_relate where popup_id = #{popupId} + + + delete from popup_relate + where relate_id IN + + #{relateId} + + + diff --git a/tmerclub-user/src/main/resources/mapper/ShopCustomerMapper.xml b/tmerclub-user/src/main/resources/mapper/ShopCustomerMapper.xml new file mode 100644 index 0000000..e9e3ba5 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/ShopCustomerMapper.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + insert into shop_customer (`user_id`,`member_name`,`shop_id`,`level_type`,`level_id`,`level`,`growth`,`regist_time`,`vip_end_time`) values + + (#{shopCustomer.userId},#{shopCustomer.memberName},#{shopCustomer.shopId},#{shopCustomer.levelType},#{shopCustomer.levelId},#{shopCustomer.level},#{shopCustomer.growth},#{shopCustomer.registTime},#{shopCustomer.vipEndTime}) + + + + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserBalanceLogMapper.xml b/tmerclub-user/src/main/resources/mapper/UserBalanceLogMapper.xml new file mode 100644 index 0000000..cb92309 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserBalanceLogMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + `balance_log_id`,`create_time`,`update_time`,`user_id`,`change_balance`,`io_type`,`pay_id`,`type`,`is_payed`,`recharge_id`,`refund_id`, `pay_sys_type` + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserExtensionMapper.xml b/tmerclub-user/src/main/resources/mapper/UserExtensionMapper.xml new file mode 100644 index 0000000..21b823f --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserExtensionMapper.xml @@ -0,0 +1,453 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + `user_extension_id`, + `create_time`, + `update_time`, + `user_id`, + `level`, + `level_type`, + `growth`, + `score`, + `balance`, + `actual_balance`, + `allinpay_balance`, + `allinpay_actual_balance`, + `allinpay_real_name_set`, + `allinpay_phone_bind`, + `allinpay_pay_pwd_set`, + `allinpay_protocol_sign`, + `allinpay_pay_acct_bind`, + `version`, + `sign_day` + + + + + insert into user_extension ( + `user_id`, `level`, `level_type`, `growth`, `score`, `balance`, `actual_balance`, + `allinpay_balance`, `allinpay_actual_balance`, `allinpay_real_name_set`, + `allinpay_phone_bind`, `allinpay_pay_pwd_set`, `allinpay_protocol_sign`, + `allinpay_pay_acct_bind`, `version`, `sign_day` ) + values ( + #{userExtension.userId}, #{userExtension.level}, #{userExtension.levelType}, #{userExtension.growth}, + #{userExtension.score}, #{userExtension.balance}, #{userExtension.actualBalance}, #{userExtension.allinpayBalance}, + #{userExtension.allinpayActualBalance}, #{userExtension.allinpayRealNameSet}, #{userExtension.allinpayPhoneBind}, + #{userExtension.allinpayPayPwdSet}, #{userExtension.allinpayProtocolSign}, #{userExtension.allinpayPayAcctBind}, + #{userExtension.version}, #{userExtension.signDay}); + + + + + + insert into user_extension ( + `user_id`, `level`, `level_type`, `growth`, `score`, `balance`, `actual_balance`, + `version`, `sign_day`,`vip_level`, `allinpay_balance`, `allinpay_actual_balance`, `allinpay_real_name_set`, `allinpay_phone_bind`, + `allinpay_pay_pwd_set`, `allinpay_protocol_sign`, `allinpay_pay_acct_bind` ) + values + + ( #{userExtension.userId}, #{userExtension.level}, #{userExtension.levelType}, #{userExtension.growth}, + #{userExtension.score}, #{userExtension.balance}, #{userExtension.actualBalance}, #{userExtension.version}, + #{userExtension.signDay}, #{userExtension.vipLevel}, #{userExtension.allinpayBalance}, #{userExtension.allinpayActualBalance}, + #{userExtension.allinpayRealNameSet}, #{userExtension.allinpayPhoneBind}, #{userExtension.allinpayPayPwdSet}, + #{userExtension.allinpayProtocolSign}, #{userExtension.allinpayPayAcctBind} ) + + + + + update user_extension + + + `level` = #{userExtension.level}, + + + `level_type` = #{userExtension.levelType}, + + + `growth` = #{userExtension.growth}, + + + `score` = #{userExtension.score}, + + + `balance` = #{userExtension.balance}, + + + `actual_balance` = #{userExtension.actualBalance}, + + + `allinpay_balance` = #{userExtension.allinpayBalance}, + + + `allinpay_actual_balance` = #{userExtension.allinpayActualBalance}, + + + `allinpay_create` = #{userExtension.allinpayCreate}, + + + `allinpay_real_name_set` = #{userExtension.allinpayRealNameSet}, + + + `allinpay_phone_bind` = #{userExtension.allinpayPhoneBind}, + + + `allinpay_pay_pwd_set` = #{userExtension.allinpayPayPwdSet}, + + + `allinpay_protocol_sign` = #{userExtension.allinpayProtocolSign}, + + + `allinpay_pay_acct_bind` = #{userExtension.allinpayPayAcctBind}, + + + `version` = #{userExtension.version} + 1, + + + `sign_day` = #{userExtension.signDay}, + + + where user_extension_id = #{userExtension.userExtensionId} + and `version` = #{userExtension.version} + + + delete + from user_extension + where user_extension_id = #{userExtensionId} + + + + UPDATE + user_extension + SET `level` = #{level} + WHERE level_type = 1 + AND growth > #{minGrowth} + + AND growth < #{maxGrowth} + + + + + UPDATE user_extension SET `version` = `version` + 1 + , update_time = NOW() + + , score = case when score + #{score} < 0 then 0 ELSE score + #{score} end + + + , growth = case when growth + #{growth} < 0 then 0 ELSE growth + #{growth} end + + WHERE user_id IN + + #{userId} + + + + UPDATE `user_extension` ue + SET ue.level = ( + SELECT IFNULL( (SELECT `level` FROM `user_level` WHERE level_type = #{levelType} AND need_growth <= ue.growth ORDER BY `level` DESC LIMIT 1), + (SELECT MIN(`level`) FROM `user_level` WHERE level_type = 0) + ) AS `level`) + WHERE ue.user_id IN + + #{userId} + + + + + UPDATE user_extension SET `version` = `version` + 1 + , actual_balance = case + when actual_balance + #{balance} < 0 then 0 + ELSE actual_balance + #{balance} end + + , balance = balance + #{balance} + + + , update_time = #{now} + + WHERE user_id IN + + #{userId} + + + + + + + + + update user_extension + set growth = #{userRechargeVO.presGrowth} + growth, + score = #{userRechargeVO.presScore} + score, + balance = #{userRechargeVO.presAmount} + balance + #{userBalanceLog.changeBalance}, + actual_balance = #{userRechargeVO.presAmount} + actual_balance + #{userBalanceLog.changeBalance} + where user_id = #{userBalanceLog.userId} + + + + update user_extension + set + + + balance = balance + #{userBalanceLog.changeBalance}, + + actual_balance = actual_balance + #{userBalanceLog.changeBalance} + where user_id = #{userBalanceLog.userId} + + + + update user_extension set actual_balance = actual_balance - #{changeBalance} + where user_id = #{userId} and actual_balance >= #{changeBalance} + + + + update user_extension set vip_level = #{afterLevel},level_type = 1 where user_id = #{userId} + + + UPDATE user_extension SET `version` = `version` + 1 + ,update_time = NOW(), + + + when user_id = #{userExtension.userId} and #{userExtension.score} is not null + then (case when `score` + #{userExtension.score} < 0 then 0 ELSE `score` + #{userExtension.score} end) + + + WHERE user_id IN + + #{userExtension.userId} + + + + + UPDATE user_extension set score = score - #{useScore} where user_id = #{userId} and score >= #{useScore} + + + + UPDATE user_extension + set score = score + #{useScore} + where user_id = #{userId} + + + + update user_extension + set `level` = #{userExtension.level}, + level_type = #{userExtension.levelType}, + growth = #{userExtension.growth}, + score = #{userExtension.score}, + balance = #{userExtension.balance}, + actual_balance = #{userExtension.actualBalance}, + update_time = #{userExtension.updateTime}, + version = version + 1 + where user_id = #{userExtension.userId} + AND version = #{userExtension.version} + + + UPDATE user_extension + SET `version` = `version` + 1, update_time = NOW() + , `level` = `level` + #{level} + WHERE user_id IN + + #{userId} + + + + + + UPDATE `user_extension` ue + SET ue.level_type = #{afterLevelType},ue.vip_level = NULL,level = #{userExtension.level} + WHERE ue.level_type = #{currentLevelType} + AND ue.user_id = #{userExtension.userId} + + + + + UPDATE + `user_extension` + + + allinpay_create = #{userExtensionDTO.allinpayCreate}, + + + allinpay_real_name_set = #{userExtensionDTO.allinpayRealNameSet}, + + + allinpay_phone_bind = #{userExtensionDTO.allinpayPhoneBind}, + + + allinpay_pay_pwd_set = #{userExtensionDTO.allinpayPayPwdSet}, + + + allinpay_protocol_sign = #{userExtensionDTO.allinpayProtocolSign}, + + + allinpay_pay_acct_bind = #{userExtensionDTO.allinpayPayAcctBind} + + + WHERE + user_id IN + + #{userId} + + + + + + + + + + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserGrowthLogMapper.xml b/tmerclub-user/src/main/resources/mapper/UserGrowthLogMapper.xml new file mode 100644 index 0000000..8dd6ebb --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserGrowthLogMapper.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + `log_id`,`create_time`,`update_time`,`user_id`,`source`,`biz_id`,`change_growth`,`remarks` + + + + + + + insert into user_growth_log (`user_id`,`source`,`biz_id`,`change_growth`,`remarks`) + values (#{userGrowthLog.userId},#{userGrowthLog.source},#{userGrowthLog.bizId},#{userGrowthLog.changeGrowth},#{userGrowthLog.remarks}); + + + insert into user_growth_log (`user_id`,`source`,`biz_id`,`change_growth`,`remarks`) + values + + (#{userGrowthLog.userId},#{userGrowthLog.source},#{userGrowthLog.bizId},#{userGrowthLog.changeGrowth},#{userGrowthLog.remarks}) + + + + update user_growth_log + + + `user_id` = #{userGrowthLog.userId}, + + + `source` = #{userGrowthLog.source}, + + + `biz_id` = #{userGrowthLog.bizId}, + + + `change_growth` = #{userGrowthLog.changeGrowth}, + + + `remarks` = #{userGrowthLog.remarks}, + + + where log_id = #{userGrowthLog.logId} + + + delete from user_growth_log where log_id = #{logId} + + + + + + delete from `user_growth_log` WHERE user_id = #{userId} + + diff --git a/tmerclub-user/src/main/resources/mapper/UserLevelMapper.xml b/tmerclub-user/src/main/resources/mapper/UserLevelMapper.xml new file mode 100644 index 0000000..d348b63 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserLevelMapper.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `user_level_id`,`create_time`,`update_time`,`level`,`level_name`,`level_type`,`need_growth`,`update_status`,`recruit_status` + + + + + + insert into user_level (`level`,`level_name`,`level_type`,`need_growth`,`update_status`,`recruit_status`) + values (#{userLevel.level},#{userLevel.levelName},#{userLevel.levelType},#{userLevel.needGrowth},#{userLevel.updateStatus},#{userLevel.recruitStatus}); + + + update user_level + + + `level` = #{userLevel.level}, + + + `level_name` = #{userLevel.levelName}, + + + `level_type` = #{userLevel.levelType}, + + + `need_growth` = #{userLevel.needGrowth}, + + + `update_status` = #{userLevel.updateStatus}, + + + `recruit_status` = #{userLevel.recruitStatus}, + + + where user_level_id = #{userLevel.userLevelId} + + + delete from user_level where user_level_id = #{id} + + + + + + + + + + + UPDATE user_level SET update_status = 1 WHERE user_level_id IN + + #{userLevelId} + + + + + + + + + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserRechargeCouponMapper.xml b/tmerclub-user/src/main/resources/mapper/UserRechargeCouponMapper.xml new file mode 100644 index 0000000..5e0ce27 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserRechargeCouponMapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + `recharge_id`,`coupon_id`,`create_time`,`coupon_num` + + + + + insert into user_recharge_coupon (`recharge_id`,`coupon_id`,`coupon_num`) + values (#{userRechargeCoupon.rechargeId},#{userRechargeCoupon.couponId},#{userRechargeCoupon.couponNum}); + + + insert into user_recharge_coupon (`recharge_id`,`coupon_id`,`coupon_num`) + values + + (#{userRechargeCoupon.rechargeId},#{userRechargeCoupon.couponId},#{userRechargeCoupon.couponNum}) + + + + update user_recharge_coupon + + + `coupon_id` = #{userRechargeCoupon.couponId}, + + + `coupon_num` = #{userRechargeCoupon.couponNum}, + + + where recharge_id = #{userRechargeCoupon.rechargeId} + + + + UPDATE user_recharge_coupon SET coupon_num = #{coupon.couponNum} + WHERE recharge_id = #{rechargeId} AND coupon_id = #{coupon.couponId}; + + + + delete from user_recharge_coupon where recharge_id = #{rechargeId} + + + DELETE FROM user_recharge_coupon + WHERE recharge_id = #{rechargeId} AND coupon_id IN + + #{couponId} + + + + + + + DELETE FROM user_recharge_coupon + WHERE coupon_id IN + + #{couponId} + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserRechargeMapper.xml b/tmerclub-user/src/main/resources/mapper/UserRechargeMapper.xml new file mode 100644 index 0000000..adcf79f --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserRechargeMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + `recharge_id`,`create_time`,`update_time`,`recharge_title`,`recharge_amount`,`img`,`pres_amount`,`pres_score`,`pres_growth`,`seq` + + + + + + + insert into user_recharge (`recharge_title`,`recharge_amount`,`img`,`pres_amount`,`pres_score`,`pres_growth`,`seq`) + values (#{userRecharge.rechargeTitle},#{userRecharge.rechargeAmount},#{userRecharge.img},#{userRecharge.presAmount},#{userRecharge.presScore},#{userRecharge.presGrowth},#{userRecharge.seq}); + + + update user_recharge + + + `recharge_title` = #{userRecharge.rechargeTitle}, + + + `recharge_amount` = #{userRecharge.rechargeAmount}, + + + `img` = #{userRecharge.img}, + + + `pres_amount` = #{userRecharge.presAmount}, + + + `pres_score` = #{userRecharge.presScore}, + + + `pres_growth` = #{userRecharge.presGrowth}, + + + `seq` = #{userRecharge.seq}, + + + where recharge_id = #{userRecharge.rechargeId} + + + delete from user_recharge where recharge_id = #{rechargeId} + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserRightsCouponMapper.xml b/tmerclub-user/src/main/resources/mapper/UserRightsCouponMapper.xml new file mode 100644 index 0000000..515d360 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserRightsCouponMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + `rights_coupon_id`,`create_time`,`rights_id`,`coupon_id` + + + + + insert into user_rights_coupon (`rights_id`,`coupon_id`) + values (#{userRightsCoupon.rightsId},#{userRightsCoupon.couponId}); + + + update user_rights_coupon + + + `rights_id` = #{userRightsCoupon.rightsId}, + + + `coupon_id` = #{userRightsCoupon.couponId}, + + + where rights_coupon_id = #{userRightsCoupon.rightsCouponId} + + + delete from user_rights_coupon where rights_coupon_id = #{rightsCouponId} + + + delete from user_rights_coupon where rights_id = #{rightsId} + + + + + + DELETE FROM user_rights_coupon + WHERE coupon_id IN + + #{couponId} + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserRightsMapper.xml b/tmerclub-user/src/main/resources/mapper/UserRightsMapper.xml new file mode 100644 index 0000000..b0eefd7 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserRightsMapper.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `rights_id`,`create_time`,`update_time`,`rights_name`,`icon`,`description`,`details`,`status`,`seq`,`rights_type`,`rate_score`,`pres_score`,`discount`,`discount_range`,`free_fee_type` + + + + + + + insert into user_rights (`rights_name`,`icon`,`description`,`details`,`status`,`seq`,`rights_type`,`rate_score`,`pres_score`,`discount`,`discount_range`,`free_fee_type`) + values (#{userRights.rightsName},#{userRights.icon},#{userRights.description},#{userRights.details},#{userRights.status},#{userRights.seq},#{userRights.rightsType},#{userRights.rateScore},#{userRights.presScore},#{userRights.discount},#{userRights.discountRange},#{userRights.freeFeeType}); + + + update user_rights + + + `rights_name` = #{userRights.rightsName}, + + + `icon` = #{userRights.icon}, + + + `description` = #{userRights.description}, + + + `details` = #{userRights.details}, + + + `status` = #{userRights.status}, + + + `seq` = #{userRights.seq}, + + + `rights_type` = #{userRights.rightsType}, + + + `rate_score` = #{userRights.rateScore}, + + + `pres_score` = #{userRights.presScore}, + + + `discount` = #{userRights.discount}, + + + `discount_range` = #{userRights.discountRange}, + + + `free_fee_type` = #{userRights.freeFeeType}, + + + where rights_id = #{userRights.rightsId} + + + delete from user_rights where rights_id = #{rightsId} + + + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserScoreGetLogMapper.xml b/tmerclub-user/src/main/resources/mapper/UserScoreGetLogMapper.xml new file mode 100644 index 0000000..6125c8a --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserScoreGetLogMapper.xml @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + `user_score_get_log_id`, + `create_time`, + `update_time`, + `user_id`, + `usable_score`, + `biz_id`, + `expire_time`, + `status` + + + + + insert into user_score_get_log (`user_id`, `usable_score`, `biz_id`, `expire_time`, `status`) + values (#{userScoreGetLog.userId}, #{userScoreGetLog.usableScore}, #{userScoreGetLog.bizId}, + #{userScoreGetLog.expireTime}, #{userScoreGetLog.status}); + + + update user_score_get_log + + + `user_id` = #{userScoreGetLog.userId}, + + + `usable_score` = #{userScoreGetLog.usableScore}, + + + `biz_id` = #{userScoreGetLog.bizId}, + + + `expire_time` = #{userScoreGetLog.expireTime}, + + + `status` = #{userScoreGetLog.status}, + + + where user_score_get_log_id = #{userScoreGetLog.userScoreGetLogId} + + + + update user_score_get_log + + + `user_id` = #{userScoreGetLog.userId}, + + + `usable_score` = #{userScoreGetLog.usableScore}, + + + `biz_id` = #{userScoreGetLog.bizId}, + + + `expire_time` = #{userScoreGetLog.expireTime}, + + + `status` = #{userScoreGetLog.status}, + + + where user_score_get_log_id = #{userScoreGetLog.userScoreGetLogId}; + + + + delete + from user_score_get_log + where user_score_get_log_id = #{userScoreGetLogId} + + + + insert into user_score_get_log (`user_id`,`usable_score`,`biz_id`,`expire_time`,`status`) + values + + (#{userScoreGetLog.userId},#{userScoreGetLog.usableScore},#{userScoreGetLog.bizId},#{userScoreGetLog.expireTime},#{userScoreGetLog.status}) + + + + + + + + + + + + + + UPDATE user_score_get_log + SET `status` = #{status} + WHERE user_score_get_log_id IN + + #{userScoreGetId} + + + + + update user_score_get_log set `status` = -1 + WHERE create_time < #{expireTime} AND `status` = 0 + + + + + + + + delete from `user_score_get_log` WHERE user_id = #{userId} + + diff --git a/tmerclub-user/src/main/resources/mapper/UserScoreLogMapper.xml b/tmerclub-user/src/main/resources/mapper/UserScoreLogMapper.xml new file mode 100644 index 0000000..6c77116 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserScoreLogMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + `log_id`,`create_time`,`update_time`,`user_id`,`source`,`score`,`biz_id`,`io_type` + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserTagUserMapper.xml b/tmerclub-user/src/main/resources/mapper/UserTagUserMapper.xml new file mode 100644 index 0000000..ca60f59 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserTagUserMapper.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + `user_tag_user_id`,`create_time`,`user_tag_id`,`user_id` + + + + + + + + insert into user_tag_user (`user_tag_id`,`user_id`) + values (#{userTagUser.userTagId},#{userTagUser.userId}); + + + insert into user_tag_user (`user_tag_id`,`user_id`) + values + + (#{userTagUser.userTagId},#{userTagUser.userId}) + + + + update user_tag_user + + + `user_tag_id` = #{userTagUser.userTagId}, + + + `user_id` = #{userTagUser.userId}, + + + where user_tag_user_id = #{userTagUser.userTagUserId} + + + delete from user_tag_user where user_tag_user_id = #{userTagUserId} + + + delete from user_tag_user where user_tag_id = #{userTagId} + + + DELETE FROM `user_tag_user` WHERE user_id = #{userId} AND user_tag_id = #{userTagId} + + + DELETE FROM `user_tag_user` WHERE user_tag_id = #{tagId} + + + + delete from `user_tag_user` WHERE user_id = #{userId} + +